@likec4/language-server 1.55.0 → 1.56.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.
@@ -1,34 +1,34 @@
1
- import{isNotLikeC4Builtin as e}from"../likec4lib.mjs";import{$ as t,$n as n,$r as r,$t as i,A as a,An as o,Ar as s,At as c,B as l,Bn as u,Br as d,Bt as f,C as p,Cn as m,Cr as ee,Ct as te,D as ne,Dn as re,Dr as ie,Dt as ae,E as oe,En as se,Er as ce,Et as le,F as ue,Fn as de,Fr as fe,Ft as pe,G as me,Gn as he,Gr as ge,Gt as _e,H as ve,Hn as ye,Hr as be,Ht as xe,I as Se,In as h,Ir as Ce,It as we,J as Te,Jn as Ee,Jr as De,Jt as Oe,K as ke,Kn as Ae,Kr as je,Kt as Me,L as Ne,Ln as Pe,Lr as Fe,Lt as Ie,M as Le,Mn as Re,Mr as ze,Mt as Be,N as Ve,Nn as He,Nr as Ue,Nt as We,O as Ge,On as Ke,Or as qe,Ot as Je,P as Ye,Pn as Xe,Pr as Ze,Pt as Qe,Q as $e,Qn as et,Qr as tt,Qt as nt,R as rt,Rn as it,Rr as at,Rt as ot,S as st,Sn as g,Sr as ct,St as lt,T as ut,Tn as dt,Tr as ft,Tt as pt,U as mt,Un as ht,Ur as gt,Ut as _t,V as vt,Vn as yt,Vr as bt,Vt as xt,W as St,Wn as Ct,Wr as wt,Wt as Tt,X as Et,Xn as Dt,Xr as Ot,Xt as kt,Y as At,Yn as jt,Yr as Mt,Yt as Nt,Z as Pt,Zn as Ft,Zr as It,Zt as Lt,_ as Rt,_n as zt,_r as Bt,_t as Vt,a as Ht,ai as _,an as Ut,ar as Wt,at as Gt,b as Kt,bn as qt,br as Jt,bt as Yt,cn as Xt,cr as Zt,ct as Qt,d as $t,dn as en,dr as tn,dt as nn,ei as rn,en as an,er as on,et as sn,f as cn,fn as ln,fr as un,ft as dn,g as fn,gn as pn,gr as mn,gt as hn,h as gn,hn as _n,hr as vn,ht as v,i as y,in as yn,ir as bn,it as xn,j as Sn,jn as Cn,jr as wn,jt as Tn,k as En,kn as Dn,kr as On,kt as kn,l as An,li as jn,ln as Mn,lr as Nn,lt as Pn,m as Fn,mn as In,mr as Ln,mt as Rn,n as zn,ni as Bn,nn as Vn,nr as Hn,nt as Un,oi as b,on as Wn,or as Gn,ot as Kn,p as qn,pn as Jn,pr as Yn,pt as Xn,q as Zn,qn as Qn,qr as $n,qt as er,r as tr,ri as nr,rn as rr,rr as ir,rt as ar,si as or,sn as sr,sr as cr,st as lr,t as ur,ti as dr,tn as fr,tr as pr,tt as mr,u as hr,un as gr,ur as _r,ut as vr,v as yr,vn as br,vr as xr,vt as x,w as Sr,wn as Cr,wr,wt as Tr,x as Er,xn as Dr,xr as Or,xt as kr,y as Ar,yn as jr,yr as Mr,yt as Nr,z as Pr,zn as Fr,zr as Ir,zt as S}from"./utils.mjs";import{BuildDocuments as Lr,ChangeView as Rr,DidChangeModelNotification as zr,DidChangeProjectsNotification as Br,DidChangeSnapshotNotification as Vr,DidRequestOpenViewNotification as Hr,FetchComputedModel as Ur,FetchLayoutedModel as Wr,FetchProjects as Gr,FetchProjectsOverview as Kr,FetchTelemetryMetrics as qr,FetchViewsFromAllProjects as Jr,GetDocumentTags as Yr,LayoutView as Xr,Locate as Zr,RegisterProject as Qr,ReloadProjects as $r,ValidateLayout as ei}from"../protocol.mjs";import{AstUtils as C,ContextCache as ti,CstUtils as ni,DefaultDocumentValidator as ri,DefaultNameProvider as ii,DefaultScopeComputation as ai,DefaultScopeProvider as oi,DefaultValueConverter as si,Disposable as ci,DocumentState as w,EMPTY_SCOPE as li,EMPTY_STREAM as ui,GrammarAST as di,GrammarUtils as T,JSDocDocumentationProvider as fi,MapScope as pi,MultiMap as mi,StreamScope as hi,TextDocument as gi,URI as _i,UriUtils as vi,ValueConverter as yi,WorkspaceCache as bi,inject as xi,interruptAndCheck as Si,isAstNode as Ci,isNamed as wi,stream as E}from"langium";import{DefaultWeakMap as Ti,MultiMap as D,ancestorsFqn as Ei,compareNatural as Di,ifilter as Oi,invariant as ki,isNonEmptyArray as Ai,nameFromFqn as ji,nonNullable as Mi,nonexhaustive as Ni,onNextTick as Pi,parentFqn as Fi,sortNaturalByFqn as Ii,sortParentsFirst as Li,toArray as Ri}from"@likec4/core/utils";import{loggable as O,wrapError as zi}from"@likec4/log";import*as Bi from"@likec4/core";import{DefaultMap as Vi,Fqn as Hi,FqnExpr as Ui,FqnRef as k,GlobalFqn as Wi,LinkedList as Gi,RelationExpr as Ki,_layout as qi,_stage as Ji,_type as Yi,ancestorsFqn as Xi,applyCachedLayout as Zi,applyManualLayout as Qi,calcDriftsFromSnapshot as $i,exact as ea,invariant as A,isAncestor as ta,isAndOperator as na,isAnyOf as ra,isDeploymentNode as ia,isElementView as aa,isGlobalFqn as oa,isNonEmptyArray as j,isOrOperator as sa,isSameHierarchy as ca,nameFromFqn as la,nonNullable as M,nonexhaustive as N,preferSummary as ua,splitGlobalFqn as da}from"@likec4/core";import{anyPass as fa,entries as pa,filter as P,find as ma,findLast as ha,first as ga,flatMap as F,forEach as _a,forEachObj as va,funnel as ya,groupBy as ba,hasAtLeast as I,identity as xa,indexBy as Sa,isArray as Ca,isBoolean as wa,isDefined as L,isEmpty as R,isEmptyish as Ta,isNonNullish as Ea,isNullish as z,isNumber as Da,isPromise as Oa,isString as ka,isTruthy as B,keys as V,last as Aa,map as H,mapToObj as U,mapValues as ja,omitBy as Ma,once as Na,only as Pa,pipe as W,piped as Fa,prop as Ia,reduce as La,sort as Ra,unique as za,values as Ba}from"remeda";import{CompletionItemKind as G,DiagnosticSeverity as Va,InsertTextFormat as K,SemanticTokenModifiers as Ha,SemanticTokenTypes as Ua,SymbolKind as Wa,TextEdit as Ga}from"vscode-languageserver-types";import{hasLeadingSlash as Ka,hasProtocol as qa,isRelative as Ja,joinRelativeURL as Ya,joinURL as Xa,withoutBase as Za,withoutLeadingSlash as Qa}from"ufo";import"vscode-uri";import{AbstractFormatter as $a,AbstractSemanticTokenProvider as eo,AstNodeHoverProvider as to,DefaultCompletionProvider as no,DefaultDocumentHighlightProvider as ro,DefaultWorkspaceSymbolProvider as io,Formatting as q,createDefaultModule as ao,createDefaultSharedModule as oo}from"langium/lsp";import{GraphvizWasmAdapter as so,QueueGraphvizLayoter as co}from"@likec4/layouts";import{computeAdhocView as lo,computeProjectsView as uo,computeView as fo,resolveRulesExtendedViews as po}from"@likec4/core/compute-view";import{LikeC4Model as J}from"@likec4/core/model";import{LikeC4Styles as mo,ThemeColors as ho,assignTagColors as go,computeColorValues as _o}from"@likec4/core/styles";import{DocumentHighlight as vo,DocumentHighlightKind as yo}from"vscode-languageserver";import{DiagnosticSeverity as bo}from"vscode-languageserver-protocol";import{Fqn as xo,FqnExpr as Y,FqnRef as X,_stage as So,_type as Co,exact as wo,isAnyOf as Z,isExtendsElementView as To}from"@likec4/core/types";import{dedent as Eo}from"strip-indent";import{createStorage as Do,prefixStorage as Oo}from"unstorage";var LikeC4DocumentationProvider=class extends fi{parser;locator;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getDocumentation(e){if(!x(e)&&!v(e)&&!S(e))return super.getDocumentation(e);try{let t=C.getDocument(e);if(t.state<w.Linked)return super.getDocumentation(e);let n=this.parser.forDocument(t);switch(!0){case x(e):{let t=n.parseDeploymentNode(e);return t?`**${t.title}**`:void 0}case v(e):{let r=n.parseDeployedInstance(e);if(!r)return;let[i,a]=k.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(`
1
+ import{isNotLikeC4Builtin as e}from"../likec4lib.mjs";import{$ as t,$n as n,$r as r,$t as i,A as a,An as o,Ar as s,At as c,B as l,Bn as u,Br as d,Bt as f,C as p,Cn as m,Cr as ee,Ct as te,D as ne,Dn as re,Dr as ie,Dt as ae,E as oe,En as se,Er as ce,Et as le,F as ue,Fn as de,Fr as fe,Ft as pe,G as me,Gn as he,Gr as ge,Gt as _e,H as ve,Hn as ye,Hr as be,Ht as xe,I as Se,In as h,Ir as Ce,It as we,Jn as Te,Jr as Ee,Jt as De,K as Oe,Kn as ke,Kr as Ae,Kt as je,L as Me,Ln as Ne,Lr as Pe,Lt as Fe,M as Ie,Mn as Le,Mr as Re,Mt as ze,N as Be,Nn as Ve,Nr as He,Nt as Ue,O as We,On as Ge,Or as Ke,Ot as qe,P as Je,Pn as Ye,Pr as Xe,Pt as Ze,Q as Qe,Qn as $e,Qr as et,Qt as tt,R as nt,Rn as rt,Rr as it,Rt as at,S as ot,Sn as st,Sr as ct,St as lt,T as ut,Tn as dt,Tr as ft,Tt as pt,U as mt,Un as ht,Ur as gt,Ut as _t,V as vt,Vn as yt,Vr as bt,Vt as xt,W as St,Wn as Ct,Wr as wt,Wt as Tt,X as Et,Xn as Dt,Xr as Ot,Xt as kt,Y as At,Yn as jt,Yr as Mt,Yt as Nt,Z as Pt,Zn as Ft,Zr as It,Zt as Lt,_ as Rt,_n as zt,_r as Bt,_t as Vt,a as Ht,ai as g,an as Ut,ar as Wt,at as Gt,b as Kt,bn as qt,br as Jt,bt as Yt,cn as Xt,cr as Zt,ct as Qt,d as $t,dn as en,dr as tn,dt as nn,ei as rn,en as an,er as on,et as sn,f as cn,fn as ln,fr as un,ft as dn,g as fn,gn as pn,gr as mn,gt as hn,h as gn,hn as _n,hr as vn,ht as _,i as v,in as yn,ir as bn,it as xn,j as y,jn as Sn,jr as Cn,jt as wn,k as Tn,kn as En,kr as Dn,kt as On,li as kn,ln as An,lr as jn,lt as Mn,m as Nn,mn as Pn,mr as Fn,mt as In,n as Ln,ni as Rn,nn as zn,nr as Bn,nt as Vn,oi as b,on as Hn,or as Un,ot as Wn,p as Gn,pn as Kn,pr as qn,pt as Jn,q as Yn,qn as Xn,qr as Zn,qt as Qn,r as $n,ri as er,rn as tr,rr as nr,rt as rr,si as ir,sn as ar,sr as or,st as sr,t as cr,ti as lr,tn as ur,tr as dr,tt as fr,u as pr,un as mr,ur as hr,ut as gr,v as _r,vn as vr,vr as yr,vt as x,w as br,wn as xr,wr as Sr,wt as Cr,x as wr,xn as Tr,xr as Er,xt as Dr,y as Or,yn as kr,yr as Ar,yt as jr,z as Mr,zn as Nr,zr as Pr,zt as S}from"./utils.mjs";import{BuildDocuments as Fr,ChangeView as Ir,DidChangeModelNotification as Lr,DidChangeProjectsNotification as Rr,DidChangeSnapshotNotification as zr,DidRequestOpenViewNotification as Br,FetchComputedModel as Vr,FetchLayoutedModel as Hr,FetchProjects as Ur,FetchProjectsOverview as Wr,FetchTelemetryMetrics as Gr,FetchViewsFromAllProjects as Kr,GetDocumentTags as qr,LayoutView as Jr,Locate as Yr,RegisterProject as Xr,ReloadProjects as Zr,ValidateLayout as Qr}from"../protocol.mjs";import{DefaultWeakMap as $r,MultiMap as C,ancestorsFqn as ei,compareNatural as ti,ifilter as ni,invariant as ri,isNonEmptyArray as ii,nameFromFqn as ai,nonNullable as oi,nonexhaustive as si,onNextTick as ci,parentFqn as li,sortNaturalByFqn as ui,sortParentsFirst as di,toArray as fi}from"@likec4/core/utils";import{AstUtils as w,ContextCache as pi,CstUtils as mi,DefaultDocumentValidator as hi,DefaultNameProvider as gi,DefaultScopeComputation as _i,DefaultScopeProvider as vi,DefaultValueConverter as yi,Disposable as bi,DocumentState as T,EMPTY_SCOPE as xi,EMPTY_STREAM as Si,GrammarAST as Ci,GrammarUtils as E,JSDocDocumentationProvider as wi,MapScope as Ti,MultiMap as Ei,StreamScope as Di,TextDocument as Oi,URI as ki,UriUtils as D,ValueConverter as Ai,WorkspaceCache as ji,inject as Mi,interruptAndCheck as Ni,isAstNode as Pi,isNamed as Fi,stream as O}from"langium";import{loggable as k,wrapError as Ii}from"@likec4/log";import*as Li from"@likec4/core";import{DefaultMap as Ri,Fqn as zi,FqnExpr as Bi,FqnRef as A,GlobalFqn as Vi,LinkedList as Hi,RelationExpr as Ui,_layout as Wi,_stage as Gi,_type as Ki,ancestorsFqn as qi,applyCachedLayout as Ji,applyManualLayout as Yi,calcDriftsFromSnapshot as Xi,exact as Zi,invariant as j,isAncestor as Qi,isAndOperator as $i,isAnyOf as ea,isDeploymentNode as ta,isElementView as na,isGlobalFqn as ra,isNonEmptyArray as M,isOrOperator as ia,isSameHierarchy as aa,nameFromFqn as oa,nonNullable as N,nonexhaustive as P,preferSummary as sa,splitGlobalFqn as ca}from"@likec4/core";import{anyPass as la,entries as ua,filter as F,find as da,findLast as fa,first as pa,flatMap as I,forEach as ma,forEachObj as ha,funnel as ga,groupBy as _a,hasAtLeast as L,identity as va,indexBy as ya,isArray as ba,isBoolean as xa,isDefined as R,isEmpty as z,isEmptyish as Sa,isNonNullish as Ca,isNullish as B,isNumber as wa,isPromise as Ta,isString as Ea,isTruthy as V,keys as H,last as Da,map as U,mapToObj as W,mapValues as Oa,omitBy as ka,once as Aa,only as ja,pipe as G,piped as Ma,prop as Na,reduce as Pa,sort as Fa,unique as Ia,values as La}from"remeda";import{CompletionItemKind as K,DiagnosticSeverity as Ra,InsertTextFormat as q,SemanticTokenModifiers as za,SemanticTokenTypes as Ba,SymbolKind as Va,TextEdit as Ha}from"vscode-languageserver-types";import{hasLeadingSlash as Ua,hasProtocol as Wa,isRelative as Ga,joinRelativeURL as Ka,joinURL as qa,withoutBase as Ja,withoutLeadingSlash as Ya}from"ufo";import"vscode-uri";import{AbstractFormatter as Xa,AbstractSemanticTokenProvider as Za,AstNodeHoverProvider as Qa,DefaultCompletionProvider as $a,DefaultDocumentHighlightProvider as eo,DefaultWorkspaceSymbolProvider as to,Formatting as no,createDefaultModule as ro,createDefaultSharedModule as io}from"langium/lsp";import{GraphvizWasmAdapter as ao,QueueGraphvizLayoter as oo}from"@likec4/layouts";import{computeAdhocView as so,computeProjectsView as co,computeView as lo,resolveRulesExtendedViews as uo}from"@likec4/core/compute-view";import{LikeC4Model as fo}from"@likec4/core/model";import{LikeC4Styles as po,ThemeColors as mo,assignTagColors as ho,computeColorValues as go}from"@likec4/core/styles";import{DocumentHighlight as _o,DocumentHighlightKind as vo}from"vscode-languageserver";import{DiagnosticSeverity as yo}from"vscode-languageserver-protocol";import{Fqn as bo,FqnExpr as J,FqnRef as Y,_stage as xo,_type as So,exact as Co,isAnyOf as X,isExtendsElementView as wo}from"@likec4/core/types";import{dedent as To}from"strip-indent";import{createStorage as Eo,prefixStorage as Do}from"unstorage";var LikeC4DocumentationProvider=class extends wi{parser;locator;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getDocumentation(e){if(!x(e)&&!_(e)&&!S(e))return super.getDocumentation(e);try{let t=w.getDocument(e);if(t.state<T.Linked)return super.getDocumentation(e);let n=this.parser.forDocument(t);switch(!0){case x(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]=A.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 S(e):{let t=n.parseElement(e);return t?[`**${t.title}**`,`<small>kind: \`${t.kind}\`</small>`].join(`
3
- `):void 0}default:return e}}catch(e){_(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:q.newLine({allowMore:!0}),oneSpace:q.oneSpace(),noSpace:q.noSpace(),indent:q.indent({allowMore:!0}),noIndent:q.noIndent()};var LikeC4Formatter=class extends $a{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,wr,(e,t)=>{let n=T.findNodesForProperty(e.$cstNode,`values`).filter(B).slice(1);t.cst(n).prepend(Q.oneSpace),t.keywords(`,`).prepend(Q.noSpace).append(Q.oneSpace)})}formatDeploymentRelation(e){this.on(e,kr,(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(...P([e.target,e.tags],B)).prepend(Q.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Q.oneSpace)})}formatExtendDeployment(e){this.on(e,nt,(e,t)=>{t.keywords(`extend`).append(Q.oneSpace)})}formatRelation(e){this.on(e,e=>Ee(e)||kr(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(...P([e.target,e.tags],B)).prepend(Q.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Q.oneSpace)}),this.on(e,ot,(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),(kn(e)&&isMultiline(e.$cstNode)||c(e)&&kn(e.$container)&&isMultiline(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(q.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(q.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){re(e.$container)&&this.getNodeFormatter(e).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(Q.noIndent)}indentContentInBraces(e){if(Ke(e)||mn(e)||un(e)||Ln(e)||tn(e)||pn(e)||In(e)||_n(e)||Jn(e)||ln(e)||_n(e)||Pe(e)||f(e)||fr(e)||jt(e)||bn(e)||de(e)||Fr(e)||Nt(e)||Be(e)||Tr(e)||Ze(e)||wn(e)||Xn(e)||Rn(e)||Me(e)||we(e)||it(e)||Nr(e)||lt(e)||hn(e)||i(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(q.newLine({allowMore:!0})).prepend(Q.indent),o=e}r?i.prepend(Q.noIndent).prepend(q.newLine({allowMore:!0})):i.prepend(q.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,xt)?.keywords(`element`).append(Q.oneSpace)}formatView(e){this.on(e,Oe,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(Q.oneSpace),t.keywords(`of`,`extends`).surround(Q.oneSpace)}),this.on(e,Tn)?.keywords(`dynamic`,`view`).append(Q.oneSpace),this.on(e,te)?.keywords(`deployment`,`view`).append(Q.oneSpace)}formatLeafProperty(e){if(_e(e)||ir(e)||Ce(e)||ye(e)||ht(e)||Yn(e)||vn(e)||dn(e)||o(e)||Pn(e)||qt(e)||cr(e)||vr(e)||Ct(e)||u(e)||br(e)||Dr(e)||jr(e)||Zt(e)||Ae(e)||ft(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,Cn,(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,yt)?.property(`key`).append(Q.oneSpace)}formatAutolayoutProperty(e){this.on(e,qe,(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,Xe,(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,S,(e,t)=>{let n=T.findNodeForProperty(e.$cstNode,`kind`),r=T.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,an,(e,t)=>{t.keywords(`extend`).append(Q.oneSpace)})}formatGlobals(e){this.on(e,In,(e,t)=>{t.keyword(`style`).append(Q.oneSpace),t.property(`id`).append(Q.oneSpace)}),this.on(e,_n,(e,t)=>{t.keyword(`styleGroup`).append(Q.oneSpace)}),this.on(e,Jn,(e,t)=>{t.keyword(`predicateGroup`).append(Q.oneSpace)}),this.on(e,ln,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(Q.oneSpace)})}formatImports(e){this.on(e,m,(e,t)=>{t.keyword(`import`).append(Q.oneSpace),t.keywords(`{`,`}`,`from`).surround(Q.oneSpace)}),this.on(e,g,(e,t)=>{t.keywords(`,`).prepend(Q.noSpace).append(Q.oneSpace)})}formatSpecificationRule(e){if((un(e)||Ln(e)||Bt(e)||tn(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(Q.oneSpace),_r(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(Q.oneSpace),t.property(`name`).append(Q.oneSpace)}}formatWithPredicate(e){(Xt(e)||on(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(Q.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,x,(e,t)=>{let n=T.findNodeForProperty(e.$cstNode,`kind`),r=T.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,v,(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,s,(e,t)=>{t.keywords(`global`,`style`).append(Q.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(On(e)||Qe(e))&&t.keywords(`global`,`predicate`).append(Q.oneSpace)}formatViewRuleGroup(e){this.on(e,wn,(e,t)=>{t.keyword(`group`).append(Q.oneSpace)})}formatViewRuleStyle(e){this.on(e,Ze)?.keyword(`style`).append(Q.oneSpace),this.on(e,ae)?.keyword(`style`).append(Q.oneSpace),this.on(e,Lt)?.keyword(`,`).prepend(Q.noSpace).append(Q.oneSpace),this.on(e,Mn)?.keyword(`,`).prepend(Q.noSpace).append(Q.oneSpace)}formatWhereExpression(e){(n(e)||sr(e))&&this.getNodeFormatter(e).keyword(`where`).append(Q.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,$n,(e,t)=>{t.property(`operator`).surround(Q.oneSpace)}),this.on(e,Ot,(e,t)=>{t.keyword(`not`).append(Q.oneSpace)}),je(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Q.oneSpace),t.property(`not`).surround(Q.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,Ir,(e,t)=>{t.property(`operator`).surround(Q.oneSpace)}),this.on(e,be,(e,t)=>{t.keyword(`not`).append(Q.oneSpace)}),at(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Q.oneSpace),t.property(`not`).surround(Q.oneSpace)}}formatIncludeExcludeExpressions(e){if(Ie(e)||ze(e)||le(e)){let t=this.getNodeFormatter(e);(!e.$cstNode||!isMultiline(e.$cstNode))&&t.keywords(`include`,`exclude`).append(Q.oneSpace)}if(Lt(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,dt,(e,t)=>{t.keyword(`->`).append(Q.oneSpace)}),this.on(e,Cr,(e,t)=>{t.keyword(`->`).prepend(Q.oneSpace)}),this.on(e,he,(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,Je,(e,t)=>{t.property(`target`).prepend(Q.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||Ie(t)||ze(t)||le(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:N(n.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;t??=this.on(e,Jt)?.property(`value`),t??=this.on(e,S)?.properties(`props`),t??=this.on(e,m)?.properties(`project`),t??=this.on(e,Ee)?.properties(`title`,`technology`),t??=this.on(e,wn)?.properties(`title`),t??=this.on(e,ot)?.properties(`title`),t??=this.on(e,x)?.properties(`title`),t??=this.on(e,v)?.properties(`title`),t??=this.on(e,kr)?.properties(`title`,`technology`),t??=this.on(e,Cn)?.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 ko=b.getChild(`LanguageServices`),isErrorDiagnostic=e=>e.severity===Va.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 views(){return this.services.likec4.Views}get workspaceUri(){return this.services.shared.workspace.WorkspaceManager.workspaceUri}projects(){let e=this.services.shared.workspace.ProjectsManager,t=W(this.services.shared.workspace.LangiumDocuments.groupedByProject(),pa(),H(([t,n])=>{let r=t,{folderUri:i,config:a}=e.getProject(r);return{id:r,folder:i,title:a.title??a.name,documents:H(n,Ia(`uri`)),config:a}}));if(I(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(I(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=H(this.services.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),Ia(`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 J.create({...r.$data,_stage:`layouted`,views:W(i,H(Ia(`diagram`)),Sa(Ia(`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===J.EMPTY){ko.debug(`Project ${r} is empty, skipping`);continue}n.push(t)}if(!I(n,1))throw Error(`No models found`);let r=uo(n);return await this.views.layouter.layoutProjectsView(r)}getErrors(){return W(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),F(e=>W(e.diagnostics??[],P(isErrorDiagnostic),H(({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:N(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():gi.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(_i.parse(t))}catch{ko.warn(`format: skipping unknown document ${t}`);continue}if(!Sr(n)){ko.warn(`format: skipping unknown document ${t}`);continue}i.set(t,n)}return[...i.values()]}async dispose(){try{ko.debug(`disposing LikeC4LanguageServices`),await this.services.shared.workspace.FileSystemWatcher.dispose(),this.services.Rpc.dispose(),this.services.likec4.ModelBuilder.dispose()}catch(e){ko.error(O(e))}finally{ko.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(Sr(e))return e.state<w.Linked&&(b.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(w.Linked,e.uri,n),b.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=Ar.readId(e),n=e.$cstNode?.range;if(!n||!t)return[];let r=y(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 Ao=[`color`,`shape`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`border`,`opacity`,`multiple`,`size`,`textSize`].join(`,`);function isCompletionForPojectName(e,t){return di.isRuleCall(t.feature)&&t.property===`project`&&m(e.node)}var LikeC4CompletionProvider=class extends no{constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,n){switch(!0){case di.isKeyword(t.feature):return this.completionForKeyword(e,t.feature,n);case di.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:G.Snippet,insertTextFormat:K.Snippet,insertText:`${t.value} { $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&C.hasContainerOfType(e.node,Fr):n(e,{label:t.value,detail:`Insert deployment view`,kind:G.Class,insertTextFormat:K.Snippet,insertText:["deployment view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` include $0`,`}`].join(`
4
- `)});break;case[`title`,`description`,`technology`,`link`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} property`,kind:G.Property,insertTextFormat:K.Snippet,insertText:`${t.value} '\${0}'`});break;case t.value===`color`:n(e,{label:t.value,kind:G.Property,insertTextFormat:K.Snippet,insertText:`${t.value} \${1|${ho.join(`,`)}|}$0`});break;case t.value===`opacity`:n(e,{label:t.value,kind:G.Property,insertTextFormat:K.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:G.Module,insertTextFormat:K.Snippet,insertText:`${t.value} {\n\t$0\n}`});break;case t.value===`group`:n(e,{label:t.value,detail:`Insert group block`,kind:G.Module,insertTextFormat:K.Snippet,insertText:["group '${1:Title}' {",` $0`,`}`].join(`
5
- `)});break;case[`par`,`parallel`].includes(t.value):n(e,{label:t.value,detail:`Insert block of parallel steps`,kind:G.Module,insertTextFormat:K.Snippet,insertText:[`${t.value} {`,` $0`,`}`].join(`
6
- `)});break;case t.value===`dynamic`&&C.hasContainerOfType(e.node,Fr):n(e,{label:t.value,detail:`Insert dynamic view`,kind:G.Class,insertTextFormat:K.Snippet,insertText:["dynamic view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` $0`,`}`].join(`
7
- `)});break;case t.value===`style`&&e.node&&C.hasContainerOfType(e.node,In):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:G.Module,insertTextFormat:K.Snippet,insertText:`${t.value} \${1:name} \${2:*} {\n\t\${3|${Ao}|} $0\n}`});break;case t.value===`style`&&e.node&&C.hasContainerOfType(e.node,fa([Fr,_n])):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:G.Module,insertTextFormat:K.Snippet,insertText:`${t.value} \${1:*} {\n\t\${2|${Ao}|} $0\n}`});break;case t.value===`style`:n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:G.Module,insertTextFormat:K.Snippet,insertText:`${t.value} {\n\t\${1|${Ao}|} $0\n}`});break;case t.value===`extend`:n(e,{label:t.value,detail:`Extend another view`,kind:G.Class,insertTextFormat:K.Snippet,insertText:`extend $1 {
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 Z={newLine:no.newLine({allowMore:!0}),oneSpace:no.oneSpace(),noSpace:no.noSpace(),indent:no.indent({allowMore:!0}),noIndent:no.noIndent()};var LikeC4Formatter=class extends Xa{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,Sr,(e,t)=>{let n=E.findNodesForProperty(e.$cstNode,`values`).filter(V).slice(1);t.cst(n).prepend(Z.oneSpace),t.keywords(`,`).prepend(Z.noSpace).append(Z.oneSpace)})}formatDeploymentRelation(e){this.on(e,Dr,(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(Z.oneSpace),t.keywords(`]->`).prepend(Z.noSpace),t.keywords(`-[`).append(Z.noSpace),t.nodes(...F([e.target,e.tags],V)).prepend(Z.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Z.oneSpace)})}formatExtendDeployment(e){this.on(e,tt,(e,t)=>{t.keywords(`extend`).append(Z.oneSpace)})}formatRelation(e){this.on(e,e=>Te(e)||Dr(e),(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(Z.oneSpace),t.keywords(`]->`).prepend(Z.noSpace),t.keywords(`-[`).append(Z.noSpace),t.nodes(...F([e.target,e.tags],V)).prepend(Z.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Z.oneSpace)}),this.on(e,at,(e,t)=>{t.keywords(`->`,`<-`).surround(Z.oneSpace),t.property(`dotKind`).prepend(Z.oneSpace).append(Z.oneSpace),t.keywords(`]->`).prepend(Z.noSpace).append(Z.oneSpace),t.keywords(`-[`).prepend(Z.oneSpace).append(Z.noSpace),t.properties(`title`).prepend(Z.oneSpace),(On(e)&&isMultiline(e.$cstNode)||c(e)&&On(e.$container)&&isMultiline(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(no.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(no.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){re(e.$container)&&this.getNodeFormatter(e).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(Z.noIndent)}indentContentInBraces(e){if(Ge(e)||mn(e)||un(e)||Fn(e)||tn(e)||pn(e)||Pn(e)||_n(e)||Kn(e)||ln(e)||_n(e)||Ne(e)||f(e)||ur(e)||jt(e)||bn(e)||de(e)||Nr(e)||Nt(e)||ze(e)||Cr(e)||Xe(e)||Cn(e)||Jn(e)||In(e)||je(e)||we(e)||rt(e)||jr(e)||lt(e)||hn(e)||i(e)){let t=this.getNodeFormatter(e),n=t.keywords(`{`);n.prepend(Z.noIndent).prepend(Z.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(Z.oneSpace);continue}(!o||!areOverlap(o,e))&&t.cst([e]).prepend(no.newLine({allowMore:!0})).prepend(Z.indent),o=e}r?i.prepend(Z.noIndent).prepend(no.newLine({allowMore:!0})):i.prepend(no.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,xt)?.keywords(`element`).append(Z.oneSpace)}formatView(e){this.on(e,De,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(Z.oneSpace),t.keywords(`of`,`extends`).surround(Z.oneSpace)}),this.on(e,wn)?.keywords(`dynamic`,`view`).append(Z.oneSpace),this.on(e,te)?.keywords(`deployment`,`view`).append(Z.oneSpace)}formatLeafProperty(e){if(_e(e)||nr(e)||Ce(e)||ye(e)||ht(e)||qn(e)||vn(e)||dn(e)||o(e)||Mn(e)||qt(e)||or(e)||gr(e)||Ct(e)||u(e)||vr(e)||Tr(e)||kr(e)||Zt(e)||ke(e)||ft(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(Z.oneSpace):n.prepend(Z.noSpace).append(Z.oneSpace),t.keyword(`;`).prepend(Z.noSpace).append(Z.newLine)}}formatLinkProperty(e){this.on(e,Sn,(e,t)=>{t.keyword(`link`).append(Z.oneSpace),t.property(`value`).append(Z.oneSpace),t.keyword(`:`).prepend(Z.noSpace).append(Z.oneSpace),t.keyword(`;`).prepend(Z.noSpace).append(Z.newLine)})}formatNavigateToProperty(e){this.on(e,yt)?.property(`key`).append(Z.oneSpace)}formatAutolayoutProperty(e){this.on(e,Ke,(e,t)=>{t.keyword(`autoLayout`).append(Z.oneSpace),t.property(`rankSep`).prepend(Z.oneSpace),t.property(`nodeSep`).prepend(Z.oneSpace)})}formatMetadataProperty(e){this.on(e,Ye,(e,t)=>{t.property(`key`).append(Z.oneSpace),t.keyword(`:`).prepend(Z.noSpace).append(Z.oneSpace),t.keyword(`;`).prepend(Z.noSpace).append(Z.newLine)})}formatElementDeclaration(e){this.on(e,S,(e,t)=>{let n=E.findNodeForProperty(e.$cstNode,`kind`),r=E.findNodeForProperty(e.$cstNode,`name`);r&&n&&(compareRanges(r,n)>0?t.cst([n]).append(Z.oneSpace):(t.cst([r]).append(Z.oneSpace),t.cst([n]).prepend(Z.oneSpace))),t.properties(`props`).prepend(Z.oneSpace)})}formatExtendElement(e){this.on(e,an,(e,t)=>{t.keywords(`extend`).append(Z.oneSpace)})}formatGlobals(e){this.on(e,Pn,(e,t)=>{t.keyword(`style`).append(Z.oneSpace),t.property(`id`).append(Z.oneSpace)}),this.on(e,_n,(e,t)=>{t.keyword(`styleGroup`).append(Z.oneSpace)}),this.on(e,Kn,(e,t)=>{t.keyword(`predicateGroup`).append(Z.oneSpace)}),this.on(e,ln,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(Z.oneSpace)})}formatImports(e){this.on(e,m,(e,t)=>{t.keyword(`import`).append(Z.oneSpace),t.keywords(`{`,`}`,`from`).surround(Z.oneSpace)}),this.on(e,st,(e,t)=>{t.keywords(`,`).prepend(Z.noSpace).append(Z.oneSpace)})}formatSpecificationRule(e){if((un(e)||Fn(e)||Bt(e)||tn(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(Z.oneSpace),hr(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(Z.oneSpace),t.property(`name`).append(Z.oneSpace)}}formatWithPredicate(e){(Xt(e)||on(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(Z.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,x,(e,t)=>{let n=E.findNodeForProperty(e.$cstNode,`kind`),r=E.findNodeForProperty(e.$cstNode,`name`);r&&n&&(compareRanges(r,n)>0?t.cst([n]).append(Z.oneSpace):(t.cst([r]).append(Z.oneSpace),t.cst([n]).prepend(Z.oneSpace))),t.properties(`title`).prepend(Z.oneSpace)})}formatDeployedInstance(e){this.on(e,_,(e,t)=>{let n=e.$cstNode?.content.find(e=>e.text===`=`);n&&t.cst([n]).surround(Z.oneSpace),t.keyword(`instanceOf`).append(Z.oneSpace),t.property(`title`).prepend(Z.oneSpace)})}formatViewRuleGlobalStyle(e){this.on(e,s,(e,t)=>{t.keywords(`global`,`style`).append(Z.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(Dn(e)||Ze(e))&&t.keywords(`global`,`predicate`).append(Z.oneSpace)}formatViewRuleGroup(e){this.on(e,Cn,(e,t)=>{t.keyword(`group`).append(Z.oneSpace)})}formatViewRuleStyle(e){this.on(e,Xe)?.keyword(`style`).append(Z.oneSpace),this.on(e,ae)?.keyword(`style`).append(Z.oneSpace),this.on(e,Lt)?.keyword(`,`).prepend(Z.noSpace).append(Z.oneSpace),this.on(e,An)?.keyword(`,`).prepend(Z.noSpace).append(Z.oneSpace)}formatWhereExpression(e){(n(e)||ar(e))&&this.getNodeFormatter(e).keyword(`where`).append(Z.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,Zn,(e,t)=>{t.property(`operator`).surround(Z.oneSpace)}),this.on(e,Ot,(e,t)=>{t.keyword(`not`).append(Z.oneSpace)}),Ae(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Z.oneSpace),t.property(`not`).surround(Z.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,Pr,(e,t)=>{t.property(`operator`).surround(Z.oneSpace)}),this.on(e,be,(e,t)=>{t.keyword(`not`).append(Z.oneSpace)}),it(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Z.oneSpace),t.property(`not`).surround(Z.oneSpace)}}formatIncludeExcludeExpressions(e){if(Fe(e)||Re(e)||le(e)){let t=this.getNodeFormatter(e);(!e.$cstNode||!isMultiline(e.$cstNode))&&t.keywords(`include`,`exclude`).append(Z.oneSpace)}if(Lt(e)){let t=this.getNodeFormatter(e),n=this.findPredicateExpressionRoot(e),r=n?.$cstNode&&isMultiline(n?.$cstNode);r&&t.property(`value`).prepend(Z.indent),t.keyword(`,`).prepend(Z.noSpace).append(r?Z.newLine:Z.oneSpace)}}formatRelationExpression(e){this.on(e,dt,(e,t)=>{t.keyword(`->`).append(Z.oneSpace)}),this.on(e,xr,(e,t)=>{t.keyword(`->`).prepend(Z.oneSpace)}),this.on(e,he,(e,t)=>{t.keywords(`->`,`<->`).prepend(Z.oneSpace),t.keywords(`-[`).prepend(Z.oneSpace).append(Z.noSpace),t.keywords(`]->`).prepend(Z.noSpace).append(Z.oneSpace),t.property(`dotKind`).prepend(Z.oneSpace).append(Z.oneSpace)}),this.on(e,qe,(e,t)=>{t.property(`target`).prepend(Z.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||Fe(t)||Re(t)||le(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:P(n.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;t??=this.on(e,Jt)?.property(`value`),t??=this.on(e,S)?.properties(`props`),t??=this.on(e,m)?.properties(`project`),t??=this.on(e,Te)?.properties(`title`,`technology`),t??=this.on(e,Cn)?.properties(`title`),t??=this.on(e,at)?.properties(`title`),t??=this.on(e,x)?.properties(`title`),t??=this.on(e,_)?.properties(`title`),t??=this.on(e,Dr)?.properties(`title`,`technology`),t??=this.on(e,Sn)?.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 Oo=b.getChild(`LanguageServices`),isErrorDiagnostic=e=>e.severity===Ra.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 views(){return this.services.likec4.Views}get workspaceUri(){return this.services.shared.workspace.WorkspaceManager.workspaceUri}get workspacePath(){return this.workspaceUri.fsPath}projects(){let e=this.services.shared.workspace.ProjectsManager,t=G(this.services.shared.workspace.LangiumDocuments.groupedByProject(),ua(),U(([t,n])=>{let r=t,{folderUri:i,config:a}=e.getProject(r);return{id:r,folder:i,title:a.title??a.name,documents:U(n,Na(`uri`)),config:a}}));if(L(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(L(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=U(this.services.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),Na(`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 fo.create({...r.$data,_stage:`layouted`,views:G(i,U(Na(`diagram`)),ya(Na(`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===fo.EMPTY){Oo.debug(`Project ${r} is empty, skipping`);continue}n.push(t)}if(!L(n,1))throw Error(`No models found`);let r=co(n);return await this.views.layouter.layoutProjectsView(r)}getErrors(){return G(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),I(e=>G(e.diagnostics??[],F(isErrorDiagnostic),U(({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:P(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():Oi.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(ki.parse(t))}catch{Oo.warn(`format: skipping unknown document ${t}`);continue}if(!ut(n)){Oo.warn(`format: skipping unknown document ${t}`);continue}i.set(t,n)}return[...i.values()]}async dispose(){try{Oo.debug(`disposing LikeC4LanguageServices`),this.services.likec4.ModelBuilder.dispose(),this.services.Rpc.dispose(),await this.services.shared.workspace.FileSystemWatcher.dispose()}catch(e){Oo.error(k(e))}finally{Oo.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(ut(e))return e.state<T.Linked&&(b.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(T.Linked,e.uri,n),b.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=Kt.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 ko=[`color`,`shape`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`border`,`opacity`,`multiple`,`size`,`textSize`].join(`,`);function isCompletionForPojectName(e,t){return Ci.isRuleCall(t.feature)&&t.property===`project`&&m(e.node)}var LikeC4CompletionProvider=class extends $a{constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,n){switch(!0){case Ci.isKeyword(t.feature):return this.completionForKeyword(e,t.feature,n);case Ci.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:K.Snippet,insertTextFormat:q.Snippet,insertText:`${t.value} { $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&w.hasContainerOfType(e.node,Nr):n(e,{label:t.value,detail:`Insert deployment view`,kind:K.Class,insertTextFormat:q.Snippet,insertText:["deployment view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` include $0`,`}`].join(`
4
+ `)});break;case[`title`,`description`,`technology`,`link`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} property`,kind:K.Property,insertTextFormat:q.Snippet,insertText:`${t.value} '\${0}'`});break;case t.value===`color`:n(e,{label:t.value,kind:K.Property,insertTextFormat:q.Snippet,insertText:`${t.value} \${1|${mo.join(`,`)}|}$0`});break;case t.value===`opacity`:n(e,{label:t.value,kind:K.Property,insertTextFormat:q.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:K.Module,insertTextFormat:q.Snippet,insertText:`${t.value} {\n\t$0\n}`});break;case t.value===`group`:n(e,{label:t.value,detail:`Insert group block`,kind:K.Module,insertTextFormat:q.Snippet,insertText:["group '${1:Title}' {",` $0`,`}`].join(`
5
+ `)});break;case[`par`,`parallel`].includes(t.value):n(e,{label:t.value,detail:`Insert block of parallel steps`,kind:K.Module,insertTextFormat:q.Snippet,insertText:[`${t.value} {`,` $0`,`}`].join(`
6
+ `)});break;case t.value===`dynamic`&&w.hasContainerOfType(e.node,Nr):n(e,{label:t.value,detail:`Insert dynamic view`,kind:K.Class,insertTextFormat:q.Snippet,insertText:["dynamic view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` $0`,`}`].join(`
7
+ `)});break;case t.value===`style`&&e.node&&w.hasContainerOfType(e.node,Pn):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:K.Module,insertTextFormat:q.Snippet,insertText:`${t.value} \${1:name} \${2:*} {\n\t\${3|${ko}|} $0\n}`});break;case t.value===`style`&&e.node&&w.hasContainerOfType(e.node,la([Nr,_n])):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:K.Module,insertTextFormat:q.Snippet,insertText:`${t.value} \${1:*} {\n\t\${2|${ko}|} $0\n}`});break;case t.value===`style`:n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:K.Module,insertTextFormat:q.Snippet,insertText:`${t.value} {\n\t\${1|${ko}|} $0\n}`});break;case t.value===`extend`:n(e,{label:t.value,detail:`Extend another view`,kind:K.Class,insertTextFormat:q.Snippet,insertText:`extend $1 {
8
8
  $0
9
- }`});break;case t.value===`autoLayout`:n(e,{label:t.value,kind:G.Property,insertTextFormat:K.Snippet,insertText:"autoLayout ${1|TopBottom,BottomTop,LeftRight,RightLeft|}$0"});break;case t.value===`mode`:n(e,{label:t.value,kind:G.Property,insertTextFormat:K.Snippet,insertText:"mode ${1|sequence,diagram|}$0"});break;case[`include`,`exclude`].includes(t.value):n(e,{label:t.value,kind:G.Operator,detail:`Insert ${t.value} predicate`,insertTextFormat:K.PlainText,insertText:`${t.value} `});break;default:n(e,{label:t.value,kind:this.getKeywordCompletionItemKind(t),detail:`Keyword`,sortText:`1`})}}completionForImportedProject(e,t){let n=this.services.shared.workspace.ProjectsManager,r=e.document.textDocument,i={start:r.positionAt(e.tokenOffset),end:r.positionAt(e.tokenEndOffset)},a=r.getText(i),o=R(a)?`'`:a.substring(0,1);for(let r of n.all){let n=o+r+o;t(e,{label:r,kind:G.Folder,insertText:n,filterText:n,textEdit:Ga.replace(i,n),detail:`Project`,sortText:`0_`+r})}}},LikeC4DocumentHighlightProvider=class extends ro{createDocumentHighlight(e){return vo.create(e.segment.range,yo.Read)}},LikeC4DocumentLinkProvider=class{constructor(e){this.services=e}async getDocumentLinks(e,t,n){return!Sr(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:C.streamAllContents(e.parseResult.value).filter(Cn).map(t=>{try{let n=T.findNodeForProperty(t.$cstNode,`value`)?.range,r=n&&this.resolveLink(e,t.value);if(r&&qa(r))return{range:n,target:r}}catch(e){_(e)}return null}).nonNullable().toArray()}resolveLink(e,t){if(qa(t)||Ka(t))return t;if(Ja(t))return Ya(e.uri.toString(),`../`,t);let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri;return Ya(n.toString(),t)}relativeLink(e,t){if(Ka(t))return Qa(t);if(Ja(t)){let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri.toString(),r=new URL(e.uri.toString());return Qa(Za(new URL(t,r).toString(),n))}return null}};const jo=b.getChild(`DocumentSymbolProvider`);var LikeC4DocumentSymbolProvider=class{nodeKindProvider;nameProvider;parser;locator;constructor(e){this.services=e,this.nodeKindProvider=e.shared.lsp.NodeKindProvider,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator,this.nameProvider=e.references.NameProvider}async getSymbols(e,t,n){if(!Sr(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e))return[];e.state<w.Linked&&(jo.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(w.Linked,e.uri,n),jo.debug(`document is Linked`));let{parseResult:{value:{specifications:r,models:i,deployments:a,views:o,likec4lib:s}}}=e;return[...s.map(e=>()=>this.getLikec4LibSymbol(e)),...r.map(e=>()=>this.getSpecSymbol(e)),...i.map(e=>()=>this.getModelSymbol(e)),...a.map(e=>()=>this.getDeploymentModelSymbol(e)),...o.map(e=>()=>this.getModelViewsSymbol(e))].flatMap(e=>{try{return e()??[]}catch(e){return _(e),[]}})}getLikec4LibSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=e.icons.map(e=>this.getLibIconSymbol(e)).filter(B);return n.length===0?[]:[{kind:Wa.Namespace,name:`icons`,range:t.range,selectionRange:T.findNodeForKeyword(t,`icons`)?.range??t.range,children:n}]}getSpecSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=T.findNodeForProperty(t,`name`);if(!n)return[];let r=W([...e.elements,...e.tags,...e.relationships],H(e=>{try{if(un(e)||Ln(e)||tn(e))return this.getKindSymbol(e);if(Bt(e))return this.getTagSymbol(e)}catch(e){return _(e),null}N(e)}),P(B));return r.length===0?[]:[{kind:Wa.Namespace,name:e.name,range:t.range,selectionRange:n.range,children:r}]}getModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=T.findNodeForProperty(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>Vn(e)?[]:this.getElementsSymbol(e))}]:[]}getDeploymentModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=T.findNodeForProperty(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>this.getDeploymentElementSymbol(e))}]:[]}getElementsSymbol(e){try{if(an(e))return this.getExtendElementSymbol(e);if(S(e))return this.getElementSymbol(e)}catch(e){_(e)}return[]}getExtendElementSymbol(e){let t=e.$cstNode,n=e.element.$cstNode,r=e.body;return!t||!n?[]:[{kind:this.symbolKind(e),name:Rt(e.element),range:t.range,selectionRange:n.range,children:r.elements.flatMap(e=>this.getElementsSymbol(e))}]}getElementSymbol(e){let t=e.$cstNode,n=T.findNodeForProperty(t,`name`);if(!n||!t)return[];let r=e.name,i=e.kind.$refText;return[{kind:this.symbolKind(e),name:r,range:t.range,selectionRange:n.range,detail:i,children:e.body?.elements.flatMap(e=>this.getElementsSymbol(e))??[]}]}getModelViewsSymbol(e){let t=e.$cstNode,n=T.findNodeForProperty(t,`name`);return!n||!t?[]:[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.views.flatMap(e=>this.getViewSymbol(e))}]}getKindSymbol(e){return!e.$cstNode||!e.kind.$cstNode||R(e.kind.name)?null:{kind:this.symbolKind(e),name:e.kind.name,range:e.$cstNode.range,selectionRange:e.kind.$cstNode.range}}getTagSymbol(e){return!e.$cstNode||!e.tag.$cstNode||R(e.tag.name)?null:{kind:this.symbolKind(e),name:`#`+e.tag.name,range:e.$cstNode.range,selectionRange:e.tag.$cstNode.range}}getLibIconSymbol(e){return!e.$cstNode||R(e.name)?null:{kind:this.symbolKind(e),name:e.name,range:e.$cstNode.range,selectionRange:e.$cstNode.range}}getViewSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=e.name?T.findNodeForProperty(t,`name`):null;return n?[{kind:this.symbolKind(e),name:n.text,range:t.range,selectionRange:n.range,children:[]}]:[]}getDeploymentElementSymbol(e){try{if(x(e))return this.getDeploymentNodeSymbol(e);if(v(e))return this.getDeployedInstanceSymbol(e);if(nt(e))return[]}catch(e){_(e)}return[]}getDeploymentNodeSymbol(e){let t=e.$cstNode,n=this.nameProvider.getNameNode(e);if(!n||!t)return[];let r=this.nameProvider.getNameStrict(e),i=e.kind.$refText;return[{kind:this.symbolKind(e),name:r,range:t.range,selectionRange:n.range,detail:i,children:e.body?.elements.flatMap(e=>this.getDeploymentElementSymbol(e))??[]}]}getDeployedInstanceSymbol(e){let t=e.$cstNode,n=this.nameProvider.getNameNode(e);if(!n||!t)return[];let r=C.getDocument(e),i=this.parser.forDocument(r).parseDeployedInstance(e),a=this.nameProvider.getNameStrict(e),o=`instance of `+i.element.model;return[{kind:this.symbolKind(e),name:a,range:t.range,selectionRange:n.range,detail:o,children:[]}]}symbolKind(e){return this.nodeKindProvider.getSymbolKind(e)}};const Mo=`
9
+ }`});break;case t.value===`autoLayout`:n(e,{label:t.value,kind:K.Property,insertTextFormat:q.Snippet,insertText:"autoLayout ${1|TopBottom,BottomTop,LeftRight,RightLeft|}$0"});break;case t.value===`mode`:n(e,{label:t.value,kind:K.Property,insertTextFormat:q.Snippet,insertText:"mode ${1|sequence,diagram|}$0"});break;case[`include`,`exclude`].includes(t.value):n(e,{label:t.value,kind:K.Operator,detail:`Insert ${t.value} predicate`,insertTextFormat:q.PlainText,insertText:`${t.value} `});break;default:n(e,{label:t.value,kind:this.getKeywordCompletionItemKind(t),detail:`Keyword`,sortText:`1`})}}completionForImportedProject(e,t){let n=this.services.shared.workspace.ProjectsManager,r=e.document.textDocument,i={start:r.positionAt(e.tokenOffset),end:r.positionAt(e.tokenEndOffset)},a=r.getText(i),o=z(a)?`'`:a.substring(0,1);for(let r of n.all){let n=o+r+o;t(e,{label:r,kind:K.Folder,insertText:n,filterText:n,textEdit:Ha.replace(i,n),detail:`Project`,sortText:`0_`+r})}}},LikeC4DocumentHighlightProvider=class extends eo{createDocumentHighlight(e){return _o.create(e.segment.range,vo.Read)}},LikeC4DocumentLinkProvider=class{constructor(e){this.services=e}async getDocumentLinks(e,t,n){return!ut(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:w.streamAllContents(e.parseResult.value).filter(Sn).map(t=>{try{let n=E.findNodeForProperty(t.$cstNode,`value`)?.range,r=n&&this.resolveLink(e,t.value);if(r&&Wa(r))return{range:n,target:r}}catch(e){g(e)}return null}).nonNullable().toArray()}resolveLink(e,t){if(Wa(t)||Ua(t))return t;if(Ga(t))return Ka(e.uri.toString(),`../`,t);let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri;return Ka(n.toString(),t)}relativeLink(e,t){if(Ua(t))return Ya(t);if(Ga(t)){let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri.toString(),r=new URL(e.uri.toString());return Ya(Ja(new URL(t,r).toString(),n))}return null}};const Ao=b.getChild(`DocumentSymbolProvider`);var LikeC4DocumentSymbolProvider=class{nodeKindProvider;nameProvider;parser;locator;constructor(e){this.services=e,this.nodeKindProvider=e.shared.lsp.NodeKindProvider,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator,this.nameProvider=e.references.NameProvider}async getSymbols(e,t,n){if(!ut(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e))return[];e.state<T.Linked&&(Ao.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(T.Linked,e.uri,n),Ao.debug(`document is Linked`));let{parseResult:{value:{specifications:r,models:i,deployments:a,views:o,likec4lib:s}}}=e;return[...s.map(e=>()=>this.getLikec4LibSymbol(e)),...r.map(e=>()=>this.getSpecSymbol(e)),...i.map(e=>()=>this.getModelSymbol(e)),...a.map(e=>()=>this.getDeploymentModelSymbol(e)),...o.map(e=>()=>this.getModelViewsSymbol(e))].flatMap(e=>{try{return e()??[]}catch(e){return g(e),[]}})}getLikec4LibSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=e.icons.map(e=>this.getLibIconSymbol(e)).filter(V);return n.length===0?[]:[{kind:Va.Namespace,name:`icons`,range:t.range,selectionRange:E.findNodeForKeyword(t,`icons`)?.range??t.range,children:n}]}getSpecSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=E.findNodeForProperty(t,`name`);if(!n)return[];let r=G([...e.elements,...e.tags,...e.relationships],U(e=>{try{if(un(e)||Fn(e)||tn(e))return this.getKindSymbol(e);if(Bt(e))return this.getTagSymbol(e)}catch(e){return g(e),null}P(e)}),F(V));return r.length===0?[]:[{kind:Va.Namespace,name:e.name,range:t.range,selectionRange:n.range,children:r}]}getModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=E.findNodeForProperty(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>zn(e)?[]:this.getElementsSymbol(e))}]:[]}getDeploymentModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=E.findNodeForProperty(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>this.getDeploymentElementSymbol(e))}]:[]}getElementsSymbol(e){try{if(an(e))return this.getExtendElementSymbol(e);if(S(e))return this.getElementSymbol(e)}catch(e){g(e)}return[]}getExtendElementSymbol(e){let t=e.$cstNode,n=e.element.$cstNode,r=e.body;return!t||!n?[]:[{kind:this.symbolKind(e),name:_r(e.element),range:t.range,selectionRange:n.range,children:r.elements.flatMap(e=>this.getElementsSymbol(e))}]}getElementSymbol(e){let t=e.$cstNode,n=E.findNodeForProperty(t,`name`);if(!n||!t)return[];let r=e.name,i=e.kind.$refText;return[{kind:this.symbolKind(e),name:r,range:t.range,selectionRange:n.range,detail:i,children:e.body?.elements.flatMap(e=>this.getElementsSymbol(e))??[]}]}getModelViewsSymbol(e){let t=e.$cstNode,n=E.findNodeForProperty(t,`name`);return!n||!t?[]:[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.views.flatMap(e=>this.getViewSymbol(e))}]}getKindSymbol(e){return!e.$cstNode||!e.kind.$cstNode||z(e.kind.name)?null:{kind:this.symbolKind(e),name:e.kind.name,range:e.$cstNode.range,selectionRange:e.kind.$cstNode.range}}getTagSymbol(e){return!e.$cstNode||!e.tag.$cstNode||z(e.tag.name)?null:{kind:this.symbolKind(e),name:`#`+e.tag.name,range:e.$cstNode.range,selectionRange:e.tag.$cstNode.range}}getLibIconSymbol(e){return!e.$cstNode||z(e.name)?null:{kind:this.symbolKind(e),name:e.name,range:e.$cstNode.range,selectionRange:e.$cstNode.range}}getViewSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=e.name?E.findNodeForProperty(t,`name`):null;return n?[{kind:this.symbolKind(e),name:n.text,range:t.range,selectionRange:n.range,children:[]}]:[]}getDeploymentElementSymbol(e){try{if(x(e))return this.getDeploymentNodeSymbol(e);if(_(e))return this.getDeployedInstanceSymbol(e);if(tt(e))return[]}catch(e){g(e)}return[]}getDeploymentNodeSymbol(e){let t=e.$cstNode,n=this.nameProvider.getNameNode(e);if(!n||!t)return[];let r=this.nameProvider.getNameStrict(e),i=e.kind.$refText;return[{kind:this.symbolKind(e),name:r,range:t.range,selectionRange:n.range,detail:i,children:e.body?.elements.flatMap(e=>this.getDeploymentElementSymbol(e))??[]}]}getDeployedInstanceSymbol(e){let t=e.$cstNode,n=this.nameProvider.getNameNode(e);if(!n||!t)return[];let r=w.getDocument(e),i=this.parser.forDocument(r).parseDeployedInstance(e),a=this.nameProvider.getNameStrict(e),o=`instance of `+i.element.model;return[{kind:this.symbolKind(e),name:a,range:t.range,selectionRange:n.range,detail:o,children:[]}]}symbolKind(e){return this.nodeKindProvider.getSymbolKind(e)}};const jo=`
10
10
  ---
11
- `;var LikeC4HoverProvider=class extends to{parser;locator;constructor(e){super(e),this.services=e,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getAstNodeHoverContent(e){if(ct(e))return{contents:{kind:`markdown`,value:"tag `"+e.name+"`"}};if(xt(e))return{contents:{kind:`markdown`,value:"element kind `"+e.name+"`"}};if(Yt(e))return{contents:{kind:`markdown`,value:"deployment node `"+e.name+"`"}};if(Wt(e))return{contents:{kind:`markdown`,value:"relationship kind `"+e.name+"`"}};try{if(S(e))return this.getElementHover(e);if(x(e))return this.getDeploymentNodeHover(e);if(v(e))return this.getDeployedInstanceHover(e)}catch(e){b.debug(O(e))}}getElementHover(e){let t=this.locator.getParsedElement(e);if(!t)return;let n=t.element,r=[`<sup>\`${n.id}\`</sup> `,`### ${n.title} `],i=ua(n);i&&r.push(``,(i.md??i.txt).split(`
11
+ `;var LikeC4HoverProvider=class extends Qa{parser;locator;constructor(e){super(e),this.services=e,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getAstNodeHoverContent(e){if(ct(e))return{contents:{kind:`markdown`,value:"tag `"+e.name+"`"}};if(xt(e))return{contents:{kind:`markdown`,value:"element kind `"+e.name+"`"}};if(Yt(e))return{contents:{kind:`markdown`,value:"deployment node `"+e.name+"`"}};if(Wt(e))return{contents:{kind:`markdown`,value:"relationship kind `"+e.name+"`"}};try{if(S(e))return this.getElementHover(e);if(x(e))return this.getDeploymentNodeHover(e);if(_(e))return this.getDeployedInstanceHover(e)}catch(e){b.debug(k(e))}}getElementHover(e){let t=this.locator.getParsedElement(e);if(!t)return;let n=t.element,r=[`<sup>\`${n.id}\`</sup> `,`### ${n.title} `],i=sa(n);i&&r.push(``,(i.md??i.txt).split(`
12
12
  `).join(`
13
13
  `));let a=this.services.likec4.LastSeen.model(t.projectId)?.findElement(n.id),o=a&&this.getElementModelHover(a,t.projectId);return r.push(o||`
14
14
  <small>_Model not processed yet, open any view to trigger_</small> `),{contents:{kind:`markdown`,value:r.join(`
15
- `)}}}getElementModelHover(e,t){let n=[],r=[...e.incoming(`direct`)].length,i=[...e.outgoing(`direct`)].length;(r>0||i>0)&&n.push(Mo,`<small>**${r}** incoming, **${i}** outgoing relationships</small> `);let printViewLink=e=>{let n=[e.id,t],r=_i.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(n))}`);return` - [${e.titleOrId}](${r})`},a=[...e.scopedViews()].map(printViewLink);a.length>0&&n.push(Mo,`<small>Element views:</small>`,...a);let o=[...e.views()].map(t=>t.isScopedElementView()&&t.viewOf===e?null:printViewLink(t)).filter(Ea);if(o.length>0){let e=a.length>0?`Also appears in views:`:`Appears in views:`;n.push(a.length>0?``:Mo,`<small>${e}</small>`,...o,` `)}return n.length>0?n.join(`
16
- `):void 0}getDeploymentNodeHover(e){let t=C.getDocument(e),n=this.parser.forDocument(t).parseDeploymentNode(e),r=[n.id+` `];n.title!==e.name&&r.push(`### ${n.title}`),r.push("deployment node `"+n.kind+"` ");let i=ua(n);return i&&r.push(``,i.md??i.txt),{contents:{kind:`markdown`,value:r.join(`
17
- `)}}}getDeployedInstanceHover(e){let t=C.getDocument(e),n=this.parser.forDocument(t).parseDeployedInstance(e),[r,i]=k.isImportRef(n.element)?[n.element.project,n.element.model]:[t.likec4ProjectId,n.element.model],a=r?this.locator.getParsedElement(i,r):this.locator.getParsedElement(i),o=[n.id+` `,`instance of \`${k.flatten(n.element)}\``];return a&&o.push(`### ${a.element.title}`,"element kind `"+a.element.kind+"` "),{contents:{kind:`markdown`,value:o.join(`
18
- `)}}}},LikeC4CodeActionProvider=class{getCodeActions(e,t){}};const No=b.getChild(`SemanticTokenProvider`),Po={...Ua},Fo={...Ha};function createSemanticTypeMethods(e){let t=[],n=new Proxy({},{get(r,i){if(i===`modifier`)return e=>(t.push(e),n);if(i in Fo)return t.push(Fo[i]),n;if(i in Po)return()=>e(Po[i],t);throw Error(`Unknown semantic token type or modifier: ${i}`)}});return n}const Io=`Stop Highlighting`,stopHighlight=()=>{throw Io};var LikeC4SemanticTokenProvider=class extends eo{rules=[];constructor(e){super(e),this.services=e,this.initRules()}initRules(){this.rules=[];let when=(e,t)=>{let n={predicate:e,highlightFn:t};this.rules.push(n)};when(Wt,e=>{e.property(`name`).function()}),when(Z(Ee,he,kr),e=>{e.property(`kind`).function()}),when(se,e=>{e.property(`name`).definition.function(),stopHighlight()}),when(Z(yt,Hn),e=>{e.property(`value`).readonly.definition.interface()}),when(Bn,e=>{e.cst().readonly.definition.variable(),stopHighlight()}),when(en,e=>{e.node.selector&&(e.node.ref.parent?e.property(`selector`).property():e.property(`selector`).readonly.definition.variable())}),when(ee,e=>{e.cst().type()}),when(pr,e=>{e.cst().function()}),when(De,e=>{B(e.node.value?.$refText)&&e.property(`value`).function()}),when(Z(bt,Mt,tt),e=>{e.keyword(`metadata`).keyword(),e.property(`key`).property()}),when(Z(gt,d,rn,De),e=>{B(e.node.value)&&e.property(`value`).readonly.definition.type()}),when(Z(It,r,tt),e=>{e.property(`participant`).keyword()}),when(xe,e=>{B(e.node.kind)&&e.property(`kind`).definition.type()}),when(Z(_n,In),e=>{e.property(`id`).readonly.definition.variable()}),when(s,e=>{e.property(`style`).readonly.definition.variable()}),when(Z(Jn,ln),e=>{e.property(`name`).readonly.definition.variable()}),when(On,e=>{e.property(`predicate`).readonly.definition.variable()}),when(er,e=>{B(e.node.tag)&&e.property(`tag`).definition.type()}),when(Z(gr,Mr),e=>{if(e.node.parent){e.property(`value`).property();return}let t=e.node.value.$refText;t!==`this`&&t!==`it`&&e.property(`value`).readonly.definition.variable()}),when(xr,e=>{e.node.parent?e.property(`el`).property():e.property(`el`).readonly.definition.variable()}),when(_r,e=>{e.keyword(`color`).keyword(),e.property(`name`).readonly.declaration.type()}),when(Bt,e=>{B(e.node.color)&&e.keyword(`color`).property()}),when(Z(un,Ln,tn),e=>{e.property(`kind`).readonly.declaration.type()}),when(ct,e=>{e.property(`name`).definition.type()}),when(Ct,e=>{e.property(`value`).number()}),when(qt,e=>{if(e.node.libicon||e.node.value===`none`){e.property(e.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}e.property(`value`).string()}),when(Cn,e=>{B(e.node.value)&&e.property(`value`).string()}),when(Z(dn,br),e=>{B(e.node.customColor)&&e.property(`customColor`).enum(),B(e.node.themeColor)&&e.property(`themeColor`).enum()}),when(e=>Qt(e)&&!Z(h,Me,bn)(e)&&B(e.key),e=>e.property(`key`).property()),when(Z(cr,Pn,o,vr,Nn,jr,Dr,We),e=>{B(e.node.value)&&e.property(`value`).enum()})}highlightElement(e,t){if(Z(S,x,v)(e))return this.highlightNameAndKind(e);if(Dn(e))return this.highlightView(e);let n;for(let{predicate:t,highlightFn:r}of this.rules)if(t(e))try{n??=this.mark(e),r(n)}catch(t){if(t===Io)return`prune`;No.warn(`Error highlighting node of type ${e._type}`,{error:t})}}highlightNameAndKind(e){if(this.mark(e).property(`name`).declaration.readonly.variable(),v(e)||this.mark(e).property(`kind`).keyword(),S(e)){e.props.length>0&&this.mark(e).property(`props`).string();return}e.title&&this.mark(e).property(`title`).string()}highlightView(e){e.name&&this.mark(e).property(`name`).modifier(`local`).declaration.readonly.interface()}mark(e){return{node:e,cst:t=>createSemanticTypeMethods((n,r)=>this.highlightToken({range:Mi(t??e.$cstNode,`AST node has no CST node`).range,type:n,modifier:r})),keyword:t=>createSemanticTypeMethods((n,r)=>this.highlightKeyword({node:e,keyword:t,type:n,modifier:r})),property:(t,n)=>createSemanticTypeMethods((r,i)=>this.highlightProperty({node:e,property:t,type:r,modifier:i,...n===void 0?{}:{index:n}}))}}};const Lo=Z(S,an);var FqnIndex=class extends nr{projects;langiumDocuments;documentCache;workspaceCache;logger=b.getChild(`fqn-index`);constructor(e){super(),this.services=e,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.projects=e.shared.workspace.ProjectsManager,this.documentCache=new Ti(e=>this.createDocumentIndex(e)),this.workspaceCache=new bi(e.shared,w.IndexedContent),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(w.IndexedContent,e=>{ut(e)&&this.documentCache.delete(e)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=w.IndexedContent)}get(e){return e.state<w.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:vi.basename(e.uri),state:e.state,expect:w.IndexedContent}),this.documentCache.get(e)}resolve(e){return e.$type===`Imported`?this.getFqn(e.imported.ref):e.$type===`Element`?this.getFqn(e):this.services.likec4.DeploymentsIndex.getFqn(e)}getFqn(e){A(S(e)||Vt(e));let t=yr.readId(e);if(B(t))return t;let n=C.getDocument(e);return n.state<w.IndexedContent&&this.logger.warn(`document {doc} is not yet indexed, creating on the fly to resolve FQN for element {el}`,{el:e.name??e.$type,doc:vi.basename(n.uri)}),A(Sr(n)),this.get(n),M(yr.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return E(this.workspaceCache.get(`${e}:fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}rootElements(e){return E(this.workspaceCache.get(`${e}:rootElements`,()=>{let t=new D;for(let n of this.documents(e))for(let e of this.get(n).rootElements())t.set(e.name,e);return uniqueByName(t)}))}directChildrenOf(e,t){return E(this.workspaceCache.get(`${e}:directChildrenOf:${t}`,()=>{let n=new D;for(let r of this.documents(e))for(let e of this.get(r).children(t))n.set(e.name,e);return uniqueByName(n)}))}uniqueDescedants(e,t){return E(this.workspaceCache.get(`${e}:uniqueDescedants:${t}`,()=>{let n=new D,r=new D;for(let i of this.documents(e)){let e=this.get(i);for(let r of e.children(t))n.set(r.name,r);for(let n of e.descendants(t))r.set(n.name,n)}let i=uniqueByName(n),a=[...r.associations()].flatMap(([e,t])=>t.length===1&&!n.has(e)?t:[]);return[...i,...Ii(a)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements.filter(Lo));if(t.length===0)return Ro.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new D,a=new D,o=new D,s=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,r,i)=>{let a=Object.assign(s.createDescription(t,r,e),{id:i,likec4ProjectId:n});return yr.writeId(t,i),o.set(i,a),a};function traverseElement(e,t){let n=xo(e.name,t),o=createAndSaveDescription(e,e.name,n);t?i.set(t,o):r.push(o);let s=P(e.body?.elements??[],Lo);if(!I(s,1))return[o];let c=F(s,e=>traverseElement(e,n));for(let e of c)a.set(n,e);return[o,...c]}function traverseExtendElement(e){let t=Rt(e.element),n=W(e.body?.elements??[],P(S),F(e=>traverseElement(e,t)));if(n.length!==0)for(let e of[t,...Ei(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(an(n)){traverseExtendElement(n);continue}traverseElement(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:vi.basename(e.uri),error:t})}return new Ro(r,i,a,o,n)}};function uniqueByName(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>Di(e.name,t.name))}var Ro=class DocumentFqnIndex{static EMPTY=new DocumentFqnIndex([],new D,new D,new D,An.DefaultProjectId);constructor(e,t,n,r,i){this._rootElements=e,this._children=t,this._descendants=n,this._byfqn=r,this.projectId=i}rootElements(){return this._rootElements}byFqn(e){return this._byfqn.get(e)??[]}children(e){return this._children.get(e)??[]}descendants(e){return this._descendants.get(e)??[]}};const zo=ra(Vt,nt);var DeploymentsIndex=class extends FqnIndex{Names;logger=b.getChild(`deployments-index`);constructor(e){super(e),this.services=e,this.Names=e.references.NameProvider}createDocumentIndex(e){let t=e.parseResult.value.deployments.flatMap(e=>e.elements.filter(zo));if(t.length===0)return Ro.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new D,a=new D,o=new D,s=this.Names,c=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,r,i)=>{let a={...c.createDescription(t,r,e),id:i,likec4ProjectId:n};return yr.writeId(t,i),o.set(i,a),a};function traverseElement(e,t){let n=s.getName(e);if(!B(n))return[];let o=Hi(n,t),c=createAndSaveDescription(e,n,o);if(t?i.set(t,c):r.push(c),v(e))return[c];let l=P(e.body?.elements??[],zo);if(!I(l,1))return[c];let u=F(l,e=>traverseElement(e,o));for(let e of u)a.set(o,e);return[c,...u]}function traverseExtend(e){let t=Rt(e.deploymentNode),n=W(e.body?.elements??[],P(zo),F(e=>traverseElement(e,t)));if(n.length!==0)for(let e of[t,...Xi(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(nt(n)){traverseExtend(n);continue}traverseElement(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:vi.basename(e.uri),error:t})}return new Ro(r,i,a,o,n)}};const Bo=/^(aws|azure|gcp|tech):(.+)$/;function deriveTechnologyFromIcon(e){if(!e)return;let t=Bo.exec(e);if(t)return t[2].replace(/-icon$/,``).split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}var MergedSpecification=class{specs={elements:{},deployments:{},relationships:{},colors:{}};tags;globals={predicates:{},dynamicPredicates:{},styles:{}};imports=new D(Set);projectId;inferTechFromIcon;constructor(e,t){let n={},r=[];for(let t of e){let{c4Specification:e,c4Globals:i,c4Imports:a}=t,o=t.likec4ProjectId;Ea(o)&&(r.length===0||r[0]!==o)&&r.push(t.likec4ProjectId),Object.assign(n,e.tags),Object.assign(this.specs.elements,e.elements),Object.assign(this.specs.relationships,e.relationships),Object.assign(this.specs.colors,e.colors),Object.assign(this.specs.deployments,e.deployments),Object.assign(this.globals.predicates,i.predicates),Object.assign(this.globals.dynamicPredicates,i.dynamicPredicates),Object.assign(this.globals.styles,i.styles);for(let[e,t]of a)this.imports.set(e,t)}this.tags=go(n),this.projectId=Pa(r),this.inferTechFromIcon=t?.inferTechFromIcon??!0}toModelElement=({tags:e,links:t,style:n,id:r,kind:i,title:a,description:o,technology:s,summary:c,metadata:l})=>{try{let u=this.specs.elements[i];if(!u)return b.warn`No kind '${i}' found for ${r}`,null;s??=u.technology,o??=u.description,c??=u.summary,t??=u.links,Ta(a)&&(a=u.title||ji(r)),u.tags&&Ai(u.tags)&&(e=e?za([...u.tags,...e]):u.tags);let d=wo({...u.style,...n});return!s&&this.inferTechFromIcon&&(s=deriveTechnologyFromIcon(d.icon)),wo({metadata:l&&!R(l)?l:void 0,notation:u.notation,style:d,links:t,tags:e,summary:c,technology:s,description:o,title:a,kind:i,id:r})}catch(e){_(e)}return null};toModelRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>Ea(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a};toDeploymentElement=e=>{if(`element`in e&&!(`kind`in e))return{...e,element:X.flatten(e.element)};if(`element`in e)return b.warn`Invalid ParsedAstDeployment ${e.id}, has both element and kind properties`,null;try{let t=this.specs.deployments[e.kind];if(!t)return b.warn`No kind ${e.kind} found for ${e.id}`,null;let{id:n,style:r,title:i,...a}=e;return i=i===ji(e.id)&&t.title?t.title:i,wo({...t,...a,title:i,style:wo({...t.style,...r}),id:n})}catch(e){_(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>Ea(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a}},LastSeenArtifacts=class{#e=new Map;#t=new Map;#n=new Map;constructor(e){e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()})}rememberSpecification(e){return e.projectId&&this.#e.set(e.projectId,e),e}rememberModel(e){let t=e.projectId,n=e.$styles,r=this.#t.get(t);return(!r||!r.equals(n))&&this.#t.set(t,n),this.#n.set(t,e),e}specification(e){return this.#e.get(e)}styles(e){return this.#t.get(e)}model(e){return this.#n.get(e)}};function assignNavigateTo(e){let t=new Map;for(let n of e)if(aa(n)&&n.viewOf&&z(n.extends)){let e=t.get(n.viewOf)??[];e.push(n.id),t.set(n.viewOf,e)}for(let{id:n,nodes:r}of e)for(let e of r){let r=e.modelRef;if(e.navigateTo||!r)continue;let i=ma(t.get(r)??[],e=>e!==n);i&&(e.navigateTo=i)}return e}var MergedExtends=class{mergedData=new Map;mergeMetadata(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];if(t===void 0){n[e]=r;continue}let i=Array.isArray(t)?t:[t],a=Array.isArray(r)?r:[r],o=za([...i,...a]);n[e]=o.length===1?o[0]:o}return n}merge(e){for(let t of e){let{id:e,links:n,tags:r,metadata:i}=t,a=this.mergedData.get(e)??{links:[],tags:[],metadata:{}};n&&a.links.push(...n),r&&(a.tags=za([...a.tags,...r])),i&&(a.metadata=this.mergeMetadata(a.metadata,i)),this.mergedData.set(e,a)}}applyExtended(e){let t=this.mergedData.get(e.id);if(!t)return e;let n=t.links;e.links&&e.links.length>0&&(n=[...e.links,...n]);let r=t.tags;e.tags&&e.tags.length>0&&(r=za([...e.tags,...r]));let i=t.metadata;return e.metadata&&(i=this.mergeMetadata(e.metadata,t.metadata)),{...e,tags:I(r,1)?r:null,links:I(n,1)?n:null,...!R(i)&&{metadata:i}}}};function buildModelData(e,t,n){let r=new MergedSpecification(n,{inferTechFromIcon:t.config.inferTechnologyFromIcon??!0});r.projectId===t.id&&e.likec4.LastSeen.rememberSpecification(r);let i=ja(r.specs.colors,e=>_o(e.color)),a=new Set,o=new MergedExtends,s=new MergedExtends,c=n.flatMap(e=>e.c4ExtendRelations),l=new Set,scanMetadataKeys=e=>{e?.metadata&&V(e.metadata).forEach(e=>a.add(e))},u=W(n,F(e=>(o.merge(e.c4ExtendElements),H(e.c4Elements,r.toModelElement))),P(B),Li,La((e,t)=>{let n=Fi(t.id);return n&&z(e[n])?(b.debug`No parent found for ${t.id}`,e):(e[t.id]=o.applyExtended(t),scanMetadataKeys(e[t.id]),e)},{})),d=W(n,F(e=>H(e.c4Relations,r.toModelRelation)),P(e=>{if(!e)return!1;let t=X.flatten(e.source),n=X.flatten(e.target);return z(u[t])&&!oa(t)||z(u[n])&&!oa(n)?(b.debug`Invalid relation ${e.id}
15
+ `)}}}getElementModelHover(e,t){let n=[],r=[...e.incoming(`direct`)].length,i=[...e.outgoing(`direct`)].length;(r>0||i>0)&&n.push(jo,`<small>**${r}** incoming, **${i}** outgoing relationships</small> `);let printViewLink=e=>{let n=[e.id,t],r=ki.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(n))}`);return` - [${e.titleOrId}](${r})`},a=[...e.scopedViews()].map(printViewLink);a.length>0&&n.push(jo,`<small>Element views:</small>`,...a);let o=[...e.views()].map(t=>t.isScopedElementView()&&t.viewOf===e?null:printViewLink(t)).filter(Ca);if(o.length>0){let e=a.length>0?`Also appears in views:`:`Appears in views:`;n.push(a.length>0?``:jo,`<small>${e}</small>`,...o,` `)}return n.length>0?n.join(`
16
+ `):void 0}getDeploymentNodeHover(e){let t=w.getDocument(e),n=this.parser.forDocument(t).parseDeploymentNode(e),r=[n.id+` `];n.title!==e.name&&r.push(`### ${n.title}`),r.push("deployment node `"+n.kind+"` ");let i=sa(n);return i&&r.push(``,i.md??i.txt),{contents:{kind:`markdown`,value:r.join(`
17
+ `)}}}getDeployedInstanceHover(e){let t=w.getDocument(e),n=this.parser.forDocument(t).parseDeployedInstance(e),[r,i]=A.isImportRef(n.element)?[n.element.project,n.element.model]:[t.likec4ProjectId,n.element.model],a=r?this.locator.getParsedElement(i,r):this.locator.getParsedElement(i),o=[n.id+` `,`instance of \`${A.flatten(n.element)}\``];return a&&o.push(`### ${a.element.title}`,"element kind `"+a.element.kind+"` "),{contents:{kind:`markdown`,value:o.join(`
18
+ `)}}}},LikeC4CodeActionProvider=class{getCodeActions(e,t){}};const Mo=b.getChild(`SemanticTokenProvider`),No={...Ba},Po={...za};function createSemanticTypeMethods(e){let t=[],n=new Proxy({},{get(r,i){if(i===`modifier`)return e=>(t.push(e),n);if(i in Po)return t.push(Po[i]),n;if(i in No)return()=>e(No[i],t);throw Error(`Unknown semantic token type or modifier: ${i}`)}});return n}const Fo=`Stop Highlighting`,stopHighlight=()=>{throw Fo};var LikeC4SemanticTokenProvider=class extends Za{rules=[];constructor(e){super(e),this.services=e,this.initRules()}initRules(){this.rules=[];let when=(e,t)=>{let n={predicate:e,highlightFn:t};this.rules.push(n)};when(Wt,e=>{e.property(`name`).function()}),when(X(Te,he,Dr),e=>{e.property(`kind`).function()}),when(se,e=>{e.property(`name`).definition.function(),stopHighlight()}),when(X(yt,Bn),e=>{e.property(`value`).readonly.definition.interface()}),when(Rn,e=>{e.cst().readonly.definition.variable(),stopHighlight()}),when(en,e=>{e.node.selector&&(e.node.ref.parent?e.property(`selector`).property():e.property(`selector`).readonly.definition.variable())}),when(ee,e=>{e.cst().type()}),when(dr,e=>{e.cst().function()}),when(Ee,e=>{V(e.node.value?.$refText)&&e.property(`value`).function()}),when(X(bt,Mt,et),e=>{e.keyword(`metadata`).keyword(),e.property(`key`).property()}),when(X(gt,d,rn,Ee),e=>{V(e.node.value)&&e.property(`value`).readonly.definition.type()}),when(X(It,r,et),e=>{e.property(`participant`).keyword()}),when(xe,e=>{V(e.node.kind)&&e.property(`kind`).definition.type()}),when(X(_n,Pn),e=>{e.property(`id`).readonly.definition.variable()}),when(s,e=>{e.property(`style`).readonly.definition.variable()}),when(X(Kn,ln),e=>{e.property(`name`).readonly.definition.variable()}),when(Dn,e=>{e.property(`predicate`).readonly.definition.variable()}),when(Qn,e=>{V(e.node.tag)&&e.property(`tag`).definition.type()}),when(X(mr,Ar),e=>{if(e.node.parent){e.property(`value`).property();return}let t=e.node.value.$refText;t!==`this`&&t!==`it`&&e.property(`value`).readonly.definition.variable()}),when(yr,e=>{e.node.parent?e.property(`el`).property():e.property(`el`).readonly.definition.variable()}),when(hr,e=>{e.keyword(`color`).keyword(),e.property(`name`).readonly.declaration.type()}),when(Bt,e=>{V(e.node.color)&&e.keyword(`color`).property()}),when(X(un,Fn,tn),e=>{e.property(`kind`).readonly.declaration.type()}),when(ct,e=>{e.property(`name`).definition.type()}),when(Ct,e=>{e.property(`value`).number()}),when(qt,e=>{if(e.node.libicon||e.node.value===`none`){e.property(e.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}e.property(`value`).string()}),when(Sn,e=>{V(e.node.value)&&e.property(`value`).string()}),when(X(dn,vr),e=>{V(e.node.customColor)&&e.property(`customColor`).enum(),V(e.node.themeColor)&&e.property(`themeColor`).enum()}),when(e=>Qt(e)&&!X(h,je,bn)(e)&&V(e.key),e=>e.property(`key`).property()),when(X(or,Mn,o,gr,jn,kr,Tr,Ue),e=>{V(e.node.value)&&e.property(`value`).enum()})}highlightElement(e,t){if(X(S,x,_)(e))return this.highlightNameAndKind(e);if(En(e))return this.highlightView(e);let n;for(let{predicate:t,highlightFn:r}of this.rules)if(t(e))try{n??=this.mark(e),r(n)}catch(t){if(t===Fo)return`prune`;Mo.warn(`Error highlighting node of type ${e._type}`,{error:t})}}highlightNameAndKind(e){if(this.mark(e).property(`name`).declaration.readonly.variable(),_(e)||this.mark(e).property(`kind`).keyword(),S(e)){e.props.length>0&&this.mark(e).property(`props`).string();return}e.title&&this.mark(e).property(`title`).string()}highlightView(e){e.name&&this.mark(e).property(`name`).modifier(`local`).declaration.readonly.interface()}mark(e){return{node:e,cst:t=>createSemanticTypeMethods((n,r)=>this.highlightToken({range:oi(t??e.$cstNode,`AST node has no CST node`).range,type:n,modifier:r})),keyword:t=>createSemanticTypeMethods((n,r)=>this.highlightKeyword({node:e,keyword:t,type:n,modifier:r})),property:(t,n)=>createSemanticTypeMethods((r,i)=>this.highlightProperty({node:e,property:t,type:r,modifier:i,...n===void 0?{}:{index:n}}))}}};const Io=X(S,an);var FqnIndex=class extends er{projects;langiumDocuments;documentCache;workspaceCache;logger=b.getChild(`fqn-index`);constructor(e){super(),this.services=e,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.projects=e.shared.workspace.ProjectsManager,this.documentCache=new $r(e=>this.createDocumentIndex(e)),this.workspaceCache=new ji(e.shared,T.IndexedContent),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(T.IndexedContent,e=>{oe(e)&&this.documentCache.delete(e)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=T.IndexedContent)}get(e){return e.state<T.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:D.basename(e.uri),state:e.state,expect:T.IndexedContent}),this.documentCache.get(e)}resolve(e){return e.$type===`Imported`?this.getFqn(e.imported.ref):e.$type===`Element`?this.getFqn(e):this.services.likec4.DeploymentsIndex.getFqn(e)}getFqn(e){j(S(e)||Vt(e));let t=Or.readId(e);if(V(t))return t;let n=w.getDocument(e);return n.state<T.IndexedContent&&this.logger.warn(`document {doc} is not yet indexed, creating on the fly to resolve FQN for element {el}`,{el:e.name??e.$type,doc:D.basename(n.uri)}),j(ut(n)),this.get(n),N(Or.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return O(this.workspaceCache.get(`${e}:fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}rootElements(e){return O(this.workspaceCache.get(`${e}:rootElements`,()=>{let t=new C;for(let n of this.documents(e))for(let e of this.get(n).rootElements())t.set(e.name,e);return uniqueByName(t)}))}directChildrenOf(e,t){return O(this.workspaceCache.get(`${e}:directChildrenOf:${t}`,()=>{let n=new C;for(let r of this.documents(e))for(let e of this.get(r).children(t))n.set(e.name,e);return uniqueByName(n)}))}uniqueDescedants(e,t){return O(this.workspaceCache.get(`${e}:uniqueDescedants:${t}`,()=>{let n=new C,r=new C;for(let i of this.documents(e)){let e=this.get(i);for(let r of e.children(t))n.set(r.name,r);for(let n of e.descendants(t))r.set(n.name,n)}let i=uniqueByName(n),a=[...r.associations()].flatMap(([e,t])=>t.length===1&&!n.has(e)?t:[]);return[...i,...ui(a)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements.filter(Io));if(t.length===0)return Lo.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new C,a=new C,o=new C,s=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,r,i)=>{let a=Object.assign(s.createDescription(t,r,e),{id:i,likec4ProjectId:n});return Or.writeId(t,i),o.set(i,a),a};function traverseElement(e,t){let n=bo(e.name,t),o=createAndSaveDescription(e,e.name,n);t?i.set(t,o):r.push(o);let s=F(e.body?.elements??[],Io);if(!L(s,1))return[o];let c=I(s,e=>traverseElement(e,n));for(let e of c)a.set(n,e);return[o,...c]}function traverseExtendElement(e){let t=_r(e.element),n=G(e.body?.elements??[],F(S),I(e=>traverseElement(e,t)));if(n.length!==0)for(let e of[t,...ei(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(an(n)){traverseExtendElement(n);continue}traverseElement(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:D.basename(e.uri),error:t})}return new Lo(r,i,a,o,n)}};function uniqueByName(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>ti(e.name,t.name))}var Lo=class DocumentFqnIndex{static EMPTY=new DocumentFqnIndex([],new C,new C,new C,pr.DefaultProjectId);constructor(e,t,n,r,i){this._rootElements=e,this._children=t,this._descendants=n,this._byfqn=r,this.projectId=i}rootElements(){return this._rootElements}byFqn(e){return this._byfqn.get(e)??[]}children(e){return this._children.get(e)??[]}descendants(e){return this._descendants.get(e)??[]}};const Ro=ea(Vt,tt);var DeploymentsIndex=class extends FqnIndex{Names;logger=b.getChild(`deployments-index`);constructor(e){super(e),this.services=e,this.Names=e.references.NameProvider}createDocumentIndex(e){let t=e.parseResult.value.deployments.flatMap(e=>e.elements.filter(Ro));if(t.length===0)return Lo.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new C,a=new C,o=new C,s=this.Names,c=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,r,i)=>{let a={...c.createDescription(t,r,e),id:i,likec4ProjectId:n};return Or.writeId(t,i),o.set(i,a),a};function traverseElement(e,t){let n=s.getName(e);if(!V(n))return[];let o=zi(n,t),c=createAndSaveDescription(e,n,o);if(t?i.set(t,c):r.push(c),_(e))return[c];let l=F(e.body?.elements??[],Ro);if(!L(l,1))return[c];let u=I(l,e=>traverseElement(e,o));for(let e of u)a.set(o,e);return[c,...u]}function traverseExtend(e){let t=_r(e.deploymentNode),n=G(e.body?.elements??[],F(Ro),I(e=>traverseElement(e,t)));if(n.length!==0)for(let e of[t,...qi(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(tt(n)){traverseExtend(n);continue}traverseElement(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:D.basename(e.uri),error:t})}return new Lo(r,i,a,o,n)}};const zo=/^(aws|azure|gcp|tech):(.+)$/;function deriveTechnologyFromIcon(e){if(!e)return;let t=zo.exec(e);if(t)return t[2].replace(/-icon$/,``).split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}var MergedSpecification=class{specs={elements:{},deployments:{},relationships:{},colors:{}};tags;globals={predicates:{},dynamicPredicates:{},styles:{}};imports=new C(Set);projectId;inferTechFromIcon;constructor(e,t){let n={},r=[];for(let t of e){let{c4Specification:e,c4Globals:i,c4Imports:a}=t,o=t.likec4ProjectId;Ca(o)&&(r.length===0||r[0]!==o)&&r.push(t.likec4ProjectId),Object.assign(n,e.tags),Object.assign(this.specs.elements,e.elements),Object.assign(this.specs.relationships,e.relationships),Object.assign(this.specs.colors,e.colors),Object.assign(this.specs.deployments,e.deployments),Object.assign(this.globals.predicates,i.predicates),Object.assign(this.globals.dynamicPredicates,i.dynamicPredicates),Object.assign(this.globals.styles,i.styles);for(let[e,t]of a)this.imports.set(e,t)}this.tags=ho(n),this.projectId=ja(r),this.inferTechFromIcon=t?.inferTechFromIcon??!0}toModelElement=({tags:e,links:t,style:n,id:r,kind:i,title:a,description:o,technology:s,summary:c,metadata:l})=>{try{let u=this.specs.elements[i];if(!u)return b.warn`No kind '${i}' found for ${r}`,null;s??=u.technology,o??=u.description,c??=u.summary,t??=u.links,Sa(a)&&(a=u.title||ai(r)),u.tags&&ii(u.tags)&&(e=e?Ia([...u.tags,...e]):u.tags);let d=Co({...u.style,...n});return!s&&this.inferTechFromIcon&&(s=deriveTechnologyFromIcon(d.icon)),Co({metadata:l&&!z(l)?l:void 0,notation:u.notation,style:d,links:t,tags:e,summary:c,technology:s,description:o,title:a,kind:i,id:r})}catch(e){g(e)}return null};toModelRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>Ca(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a};toDeploymentElement=e=>{if(`element`in e&&!(`kind`in e))return{...e,element:Y.flatten(e.element)};if(`element`in e)return b.warn`Invalid ParsedAstDeployment ${e.id}, has both element and kind properties`,null;try{let t=this.specs.deployments[e.kind];if(!t)return b.warn`No kind ${e.kind} found for ${e.id}`,null;let{id:n,style:r,title:i,...a}=e;return i=i===ai(e.id)&&t.title?t.title:i,Co({...t,...a,title:i,style:Co({...t.style,...r}),id:n})}catch(e){g(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>Ca(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a}},LastSeenArtifacts=class{#e=new Map;#t=new Map;#n=new Map;constructor(e){e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()})}rememberSpecification(e){return e.projectId&&this.#e.set(e.projectId,e),e}rememberModel(e){let t=e.projectId,n=e.$styles,r=this.#t.get(t);return(!r||!r.equals(n))&&this.#t.set(t,n),this.#n.set(t,e),e}specification(e){return this.#e.get(e)}styles(e){return this.#t.get(e)}model(e){return this.#n.get(e)}};function assignNavigateTo(e){let t=new Map;for(let n of e)if(na(n)&&n.viewOf&&B(n.extends)){let e=t.get(n.viewOf)??[];e.push(n.id),t.set(n.viewOf,e)}for(let{id:n,nodes:r}of e)for(let e of r){let r=e.modelRef;if(e.navigateTo||!r)continue;let i=da(t.get(r)??[],e=>e!==n);i&&(e.navigateTo=i)}return e}var MergedExtends=class{mergedData=new Map;mergeMetadata(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];if(t===void 0){n[e]=r;continue}let i=Array.isArray(t)?t:[t],a=Array.isArray(r)?r:[r],o=Ia([...i,...a]);n[e]=o.length===1?o[0]:o}return n}merge(e){for(let t of e){let{id:e,links:n,tags:r,metadata:i}=t,a=this.mergedData.get(e)??{links:[],tags:[],metadata:{}};n&&a.links.push(...n),r&&(a.tags=Ia([...a.tags,...r])),i&&(a.metadata=this.mergeMetadata(a.metadata,i)),this.mergedData.set(e,a)}}applyExtended(e){let t=this.mergedData.get(e.id);if(!t)return e;let n=t.links;e.links&&e.links.length>0&&(n=[...e.links,...n]);let r=t.tags;e.tags&&e.tags.length>0&&(r=Ia([...e.tags,...r]));let i=t.metadata;return e.metadata&&(i=this.mergeMetadata(e.metadata,t.metadata)),{...e,tags:L(r,1)?r:null,links:L(n,1)?n:null,...!z(i)&&{metadata:i}}}};function buildModelData(e,t,n){let r=new MergedSpecification(n,{inferTechFromIcon:t.config.inferTechnologyFromIcon??!0});r.projectId===t.id&&e.likec4.LastSeen.rememberSpecification(r);let i=Oa(r.specs.colors,e=>go(e.color)),a=new Set,o=new MergedExtends,s=new MergedExtends,c=n.flatMap(e=>e.c4ExtendRelations),l=new Set,scanMetadataKeys=e=>{e?.metadata&&H(e.metadata).forEach(e=>a.add(e))},u=G(n,I(e=>(o.merge(e.c4ExtendElements),U(e.c4Elements,r.toModelElement))),F(V),di,Pa((e,t)=>{let n=li(t.id);return n&&B(e[n])?(b.debug`No parent found for ${t.id}`,e):(e[t.id]=o.applyExtended(t),scanMetadataKeys(e[t.id]),e)},{})),d=G(n,I(e=>U(e.c4Relations,r.toModelRelation)),F(e=>{if(!e)return!1;let t=Y.flatten(e.source),n=Y.flatten(e.target);return B(u[t])&&!ra(t)||B(u[n])&&!ra(n)?(b.debug`Invalid relation ${e.id}
19
19
  source: ${t} resolved: ${!!u[t]}
20
- target: ${n} resolved: ${!!u[n]}\n`,!1):!0}),H(e=>{let t=tr(`extend-relation`,X.flatten(e.source),X.flatten(e.target),e.kind??`default`,e.title??``),n=c.filter(e=>e.id===t);if(n.length===0)return e;n.forEach(e=>l.add(e.astPath));let r=e.tags?[...e.tags]:[],i=e.links?[...e.links]:[],a=e.metadata?{...e.metadata}:{};for(let e of n){if(e.tags&&r.push(...e.tags),e.links)for(let t of e.links)i.some(e=>e.url===t.url&&(e.title||``)===(t.title||``))||i.push(t);if(e.metadata)for(let[t,n]of Object.entries(e.metadata)){let e=a[t];if(e===void 0)a[t]=n;else{let r=Array.isArray(e)?e:[e],i=Array.isArray(n)?n:[n],o=za([...r,...i]);a[t]=o.length===1?o[0]:o}}}let o=za(r),s=i;return{...e,...I(o,1)&&{tags:o},...I(s,1)&&{links:s},...!R(a)&&{metadata:a}}}),_a(scanMetadataKeys),Sa(Ia(`id`))),f=W(n,F(e=>(s.merge(e.c4ExtendDeployments),H(e.c4Deployments,r.toDeploymentElement))),P(B),Li,La((e,t)=>{let n=Fi(t.id);return n&&z(e[n])?(b.debug`No parent found for deployment element ${t.id}`,e):(e[t.id]=ia(t)?s.applyExtended(t):t,scanMetadataKeys(e[t.id]),e)},{})),p=W(n,F(e=>H(e.c4DeploymentRelations,r.toDeploymentRelation)),P(e=>e?z(f[e.source.deployment])||z(f[e.target.deployment])?(b.debug`Invalid deployment relation ${e.id}
20
+ target: ${n} resolved: ${!!u[n]}\n`,!1):!0}),U(e=>{let t=$n(`extend-relation`,Y.flatten(e.source),Y.flatten(e.target),e.kind??`default`,e.title??``),n=c.filter(e=>e.id===t);if(n.length===0)return e;n.forEach(e=>l.add(e.astPath));let r=e.tags?[...e.tags]:[],i=e.links?[...e.links]:[],a=e.metadata?{...e.metadata}:{};for(let e of n){if(e.tags&&r.push(...e.tags),e.links)for(let t of e.links)i.some(e=>e.url===t.url&&(e.title||``)===(t.title||``))||i.push(t);if(e.metadata)for(let[t,n]of Object.entries(e.metadata)){let e=a[t];if(e===void 0)a[t]=n;else{let r=Array.isArray(e)?e:[e],i=Array.isArray(n)?n:[n],o=Ia([...r,...i]);a[t]=o.length===1?o[0]:o}}}let o=Ia(r),s=i;return{...e,...L(o,1)&&{tags:o},...L(s,1)&&{links:s},...!z(a)&&{metadata:a}}}),ma(scanMetadataKeys),ya(Na(`id`))),f=G(n,I(e=>(s.merge(e.c4ExtendDeployments),U(e.c4Deployments,r.toDeploymentElement))),F(V),di,Pa((e,t)=>{let n=li(t.id);return n&&B(e[n])?(b.debug`No parent found for deployment element ${t.id}`,e):(e[t.id]=ta(t)?s.applyExtended(t):t,scanMetadataKeys(e[t.id]),e)},{})),p=G(n,I(e=>U(e.c4DeploymentRelations,r.toDeploymentRelation)),F(e=>e?B(f[e.source.deployment])||B(f[e.target.deployment])?(b.debug`Invalid deployment relation ${e.id}
21
21
  source: ${e.source.deployment} resolved: ${!!f[e.source.deployment]}
22
- target: ${e.target.deployment} resolved: ${!!f[e.target.deployment]}\n`,!1):!0:!1),La((e,t)=>L(e[t.id])?(b.debug`Duplicate deployment relation ${t.id}`,e):(scanMetadataKeys(t),e[t.id]=t,e),{}));function toC4View(e){let n=e.uri.toString();return e=>{let{id:r,title:i,description:a,astPath:o,...s}=e;return e[Co]===`element`&&z(i)&&`viewOf`in e&&(i=u[e.viewOf]?.title??null),z(i)&&r===`index`&&(i=`Landscape view`),{...Ma(s,e=>e===void 0),[So]:`parsed`,sourcePath:vi.relative(t.folderUri,n),docUri:n,description:a,title:i,id:r}}}let m=n.flatMap(e=>H(e.c4Views,toC4View(e)));if(m.some(e=>e.id===`index`)||m.unshift({[So]:`parsed`,[Co]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]}),t.config.implicitViews===!0){let e=new Set;for(let t of m)t[Co]===`element`&&`viewOf`in t&&t.viewOf&&e.add(t.viewOf);let t=new Set(m.map(e=>e.id));for(let n of V(u)){if(e.has(n)||oa(n))continue;let r=`__`+n.replaceAll(`.`,`_`);t.has(r)||(t.add(r),m.push({[So]:`parsed`,[Co]:`element`,id:r,viewOf:n,title:`Auto / ${(u[n]?.title??n).replaceAll(`
23
- `,` `)}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let ee=W(m,Sa(Ia(`id`)));m.some(To)&&(ee=po(ee));for(let e of c)l.has(e.astPath)||b.warn(`Relation extend at ${e.astPath} does not match any relation in the model`);return{data:{[So]:`parsed`,projectId:t.id,project:wo({id:t.id,title:t.config.title??t.config.name,styles:t.config.styles,manualLayouts:t.config.manualLayouts,inferTechnologyFromIcon:t.config.inferTechnologyFromIcon}),specification:{tags:r.tags,elements:r.specs.elements,relationships:ja(r.specs.relationships,({notation:e,technology:t,...n})=>({...e&&{notation:e},...t&&{technology:t},style:n})),deployments:r.specs.deployments,...a.size>0&&{metadataKeys:[...a].sort(Di)},customColors:i},elements:u,relations:d,globals:r.globals,views:ee,deployments:{elements:f,relations:p},imports:{}},imports:r.imports}}const Vo=b.getChild(`builder`);var DefaultLikeC4ModelBuilder=class extends nr{projects;parser;listeners=[];cache;DocumentBuilder;manualLayouts;mutex;lastSeen;constructor(t){super(),this.services=t,this.projects=t.shared.workspace.ProjectsManager,this.parser=t.likec4.ModelParser,this.DocumentBuilder=t.shared.workspace.DocumentBuilder,this.mutex=t.shared.workspace.WorkspaceLock,this.manualLayouts=t.shared.workspace.ManualLayouts,this.lastSeen=t.likec4.LastSeen,this.cache=new ProjectModelCache(t),this.onDispose(this.cache,this.DocumentBuilder.onUpdate((e,t)=>{t.length>0&&this.notifyListeners(t)}),t.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.clearCache()}),this.manualLayouts.onManualLayoutUpdate(({projectId:e})=>{this.notifyListeners(e)}));let n=Fa(xa(),P(t=>e(t)&&!this.projects.isExcluded(t)),H(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(w.Validated,(e,t)=>{let r=n(e);r.length>0&&this.notifyListeners(r)})),Vo.debug`created`}unsafeSyncParseModelData(e){return this.cache.parsedData(e,()=>{let t=Vo.getChild(e);try{let n=this.projects.getProject(e),r=this.documents(e);return r.length===0?(t.debug`unsafeSyncParseModelData: skipped due to no documents`,null):(t.debug`unsafeSyncParseModelData: completed`,buildModelData(this.services,n,r))}catch(t){return Vo.warn(`unsafeSyncParseModelData failed for project ${e}`,{err:t}),null}})}unsafeSyncJoinedModelData(e){return this.cache.parsedJoinedData(e,()=>{let t=Vo.getChild(e),n=this.unsafeSyncParseModelData(e);if(!n)return null;if(n.imports.size===0)return n.data;t.debug`processing imports of ${e}`;let r=[...n.imports.associations()].reduce((e,[t,n])=>{if(n.size===0)return e;let r=this.unsafeSyncParseModelData(t);if(r){let i=[...n].flatMap(e=>r.data.elements[e]??[]);I(i,1)&&(e[t]=structuredClone(i))}return e},{});return{...n.data,imports:r}})}async parseModel(e,t){e=this.projects.ensureProjectId(e);let n=ur();return await this.mutex.read(async()=>(t?.isCancellationRequested&&await Si(t),this.cache.parsedModel(e,()=>{let t=Vo.getChild(e),r=this.unsafeSyncJoinedModelData(e);return r?(t.debug`parseModel in ${n.pretty}`,J.create(r)):(t.debug`parseModel: returning EMPTY`,J.EMPTY.asParsed)})))}unsafeSyncComputeModel(e,t){return this.cache.computedModel(e,t??null,()=>{let n=Vo.getChild(e),r=this.unsafeSyncJoinedModelData(e);if(!r)return n.debug`unsafeSyncComputeModel: returning EMPTY`,J.EMPTY.asComputed;let i=J.create(r),a=[];for(let e of Ba(r.views)){let r=fo(e,i);if(!r.isSuccess){n.warn(O(r.error));continue}t?.views[e.id]&&Object.assign(r.view,{hasManualLayout:!0}),a.push(r.view)}assignNavigateTo(a);let o={...r,manualLayouts:{...t?.views},[Ji]:`computed`,views:Sa(a,Ia(`id`))};return n.debug(`unsafeSyncComputeModel${t?` with manual layouts`:``}: completed`),this.lastSeen.rememberModel(J.create(o))})}async computeModel(e,t){e=this.projects.ensureProjectId(e);let n=Vo.getChild(e),r=ur();return await this.mutex.read(async()=>{t?.isCancellationRequested&&await Si(t);let i=this.projects.getProject(e),a=await this.manualLayouts.read(i),o=this.unsafeSyncComputeModel(e,a);return o===J.EMPTY?n.debug(`computeModel returned EMPTY`):r.ms>10&&n.debug(`computeModel completed in ${r.pretty}`),o})}onModelParsed(e){return this.listeners.push(e),ci.create(()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1)})}clearCache(){Vo.debug(`clearCache`),this.cache.clear()}documents(e){return this.parser.documents(e).toArray()}notifyListeners(e){let t;t=Ca(e)?W(e,ba(e=>this.projects.ownerProjectId(e)),pa()):[[e,[]]];for(let e of this.listeners)try{for(let[n,r]of t)e(n,r)}catch(e){Vo.warn(O(e))}}},ProjectModelCache=class extends ti{constructor(e){super(e=>typeof e==`string`?e:e.id),this.toDispose.push(e.shared.workspace.DocumentBuilder.onDocumentPhase(w.Validated,t=>{let n=e.shared.workspace.ProjectsManager.ownerProjectId(t);this.clear(n)})),this.toDispose.push(e.shared.workspace.DocumentBuilder.onUpdate((t,n)=>{if(n.length>0){let t=e.shared.workspace.ProjectsManager,r=za(H(n,t.ownerProjectId.bind(t)));for(let e of r)this.clear(e)}}))}parsedData(e,t){return super.get(e,`parsed-data`,t)}parsedJoinedData(e,t){return super.get(e,`parsed-joined-data`,t)}parsedModel(e,t){return super.get(e,`parsed-model`,t)}computedModel(e,t,n){return super.get(e,`computed-model-${t?.hash??``}`,n)}};const{findNodeForKeyword:Ho,findNodeForProperty:Uo}=T,{getDocument:Wo,streamAllContents:Go}=C,Ko=b.getChild(`locator`);var LikeC4ModelLocator=class{fqnIndex;deploymentsIndex;langiumDocuments;parser;projects;constructor(e){this.services=e,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.parser=e.likec4.ModelParser,this.projects=e.shared.workspace.ProjectsManager}documents(e){return this.parser.documents(e)}getParsedElement(...e){try{let t,n;if(e.length===2?(t=e[0],n=e[1]):(t=e[0],n=ka(t)?this.projects.ensureProjectId():y(t)),ka(t)){let e=t,r=this.fqnIndex.byFqn(n,e).head();if(!r)return null;let i=this.langiumDocuments.getDocument(r.documentUri),a=this.findParsedElementByFqnIn(e,i);return a&&i?{projectId:n,element:a,document:i}:null}let r=this.fqnIndex.getFqn(t),i=Wo(t),a=this.findParsedElementByFqnIn(r,i);return a&&i?{projectId:n,element:a,document:i}:null}catch(e){return Ko.debug(O(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t){let[n,r]=da(e);n??=this.projects.ensureProjectId(t);let i=this.fqnIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateDeploymentElement(e,t){let n=this.projects.ensureProjectId(t),r=e,i=this.deploymentsIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateRelation(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Relations.find(t=>t.id===e)??t.c4DeploymentRelations.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(!Ee(r)&&!kr(r))continue;let i=r.kind?Uo(r.$cstNode,`kind`):void 0;if(i??=r.dotKind?Uo(r.$cstNode,`dotKind`):void 0,i??=Ho(r.$cstNode,`->`),i??=Uo(r.$cstNode,`title`),i??=Uo(r.$cstNode,`target`),i??=r.$cstNode,i)return{uri:t.uri.toString(),range:{start:i.range.start,end:i.range.start}}}return null}locateViewAst(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Views.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(Dn(r))return{doc:t,view:n,viewAst:r}}return null}locateView(e,t){let n=this.locateViewAst(e,t);if(!n)return null;let r=n.viewAst,i=r.name?Uo(r.$cstNode,`name`):void 0;return i??=Ho(r.$cstNode,`view`),i??=r.$cstNode,i?{uri:n.doc.uri.toString(),range:{start:i.range.start,end:i.range.start}}:null}async locateDocumentTags(e,t){let n=this.langiumDocuments.getDocument(e);if(!n||!n.likec4ProjectId)return null;n.state<w.Linked&&(Ko.debug(`Waiting for document ${n.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(w.Linked,n.uri,t));let r=y(n);Ko.trace`locate document tags for ${n.uri.fsPath} in project ${r}`;try{let e=this.services.likec4.LastSeen.specification(r)?.tags,t=this.services.likec4.LastSeen.styles(r)??mo.DEFAULT;if(!e)return Ko.trace(`No specification or styles found for project ${r}, cannot locate tags for document ${n.uri.fsPath}`),null;let i=W(Go(n.parseResult.value),Oi(e=>ct(e)||ee(e)),Ri(),F(n=>{let r,i;try{ct(n)?(r=n.name,i=n.$cstNode):(r=n.tag.$refText,i=n.tag.$refNode);let a=e[r];return ki(a,`Tag ${r} not found in merged specification`),ki(i,`Tag ${r} does not have a $cstNode`),{name:r,color:t.tagColor(a.color).fill,range:i.range,isSpecification:ct(n)}}catch(e){return Ko.warn(`Fail on tag ${r}`,{err:e}),[]}}));return Ko.debug(`Found ${i.length} tags in document ${n.uri.path}`),i}catch(e){return Ko.warn(O(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:n}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!n)return null;if(!Tn(n)||!n.body)return Ko.warn(`View ${e.view} is not a dynamic view`),null;let r=this.services.workspace.AstNodeLocator.getAstNodePath(n.body)+e.astPath,i=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r);if(!i||!ot(i))return Ko.warn(`Failed to locate dynamic view step ${r} in view ${e.view}`),null;let a=i.kind?Uo(i.$cstNode,`kind`):void 0;return a??=i.dotKind?Uo(i.$cstNode,`dotKind`):void 0,a??=Ho(i.$cstNode,`->`),a??=Ho(i.$cstNode,`<-`),a??=Uo(i.$cstNode,`title`),a??=Uo(i.$cstNode,`target`),a??=i.$cstNode,a?{uri:t.uri.toString(),range:{start:a.range.start,end:a.range.start}}:null}};const qo=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function tryOrLog(e){return async function(t,n,r){try{let i=e(t,n,r);Oa(i)&&await i;return}catch(e){let r=e instanceof Error?e.message:String(e);n(`error`,`Validation failed: ${r}`,{node:t}),b.debug(`Validation failed: ${r}`,{error:e})}}}const{getDocument:Jo}=C,deploymentNodeChecks=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return tryOrLog((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`DeploymentNode must be named`,{node:e});return}let a=M(n.getNameNode(e),`name CstNode not found`).range;qo.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=y(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate node name "${s}"`,{node:e,range:a})})},deployedInstanceChecks=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return tryOrLog((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`Deployed instance must be named, unique inside node`,{node:e});return}let a=M(n.getNameNode(e),`name CstNode not found`).range;qo.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=y(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate instance name "${s}"`,{node:e,range:a})})},deploymentRelationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{if(!e.target?.value?.ref){n(`error`,`DeploymentRelation target '${e.target?.$cstNode?.text??``}' not resolved`,{node:e,property:`target`});return}let r=Jo(e),i=t.forDocument(r),a;try{a=i._resolveDeploymentRelationSource(e)}catch(t){b.warn(O(t)),n(`error`,`DeploymentRelation source not resolved`,{node:e,property:`source`});return}if(k.isImportRef(a)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`source`});return}if(k.isModelRef(a)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`source`});return}let o=i.parseFqnRef(e.target);if(k.isImportRef(o)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`target`});return}if(k.isModelRef(o)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`target`});return}ca(a.deployment,o.deployment)&&n(`error`,`Invalid parent-child relationship`,{node:e})})},extendDeploymentChecks=e=>tryOrLog((e,t)=>{let n=e.deploymentNode.value.ref;(!n||!x(n))&&t(`error`,`ExtendDeployment allows only DeploymentNode`,{node:e,property:`deploymentNode`})}),dynamicViewStepSingle=e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,n)=>{let r=fn(e.source),i=r&&t.getFqn(r);i||n(`error`,`Source not found (not parsed/indexed yet)`,{node:e,property:`source`});let a=fn(e.target),o=a&&t.getFqn(a);o||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`}),i&&o&&(ta(i,o)||ta(o,i))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},dynamicViewStepChain=e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,n)=>{let r=e.source;c(r)&&r.isBackward&&n(`error`,`Invalid chain after backward step`,{node:e});let i=fn(e.target);i&&t.getFqn(i)||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`})})},dynamicViewDisplayVariant=e=>tryOrLog((e,t)=>{if(R(e.value)||e.value!==`diagram`&&e.value!==`sequence`){t(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:e,property:`value`});return}C.hasContainerOfType(e,Be)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:Yo}=C,checkElement=e=>{let t=e.likec4.FqnIndex,n=e.workspace.AstNodeLocator;return tryOrLog((e,r)=>{let i=t.getFqn(e);if(!i){r(`error`,`Not indexed element`,{node:e,property:`name`});return}qo.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let a=Yo(e),o=a.uri,s=n.getAstNodePath(e),c=t.byFqn(y(a),i).filter(e=>e.documentUri!==o||e.path!==s).head();if(c){let t=c.documentUri!==o;r(`error`,`Duplicate element name ${e.name===i?e.name:e.name+` (`+i+`)`}`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:c.nameSegment?.range??c.selectionSegment?.range,uri:c.documentUri.toString()},message:`conflicting element`}]}})}})},checkElementRef=e=>tryOrLog((e,t)=>{gn(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:Xo}=C,checkImportsFromPoject=e=>{let t=e.shared.workspace.ProjectsManager;return tryOrLog((e,n)=>{if(!t.all.includes(e.project)){n(`error`,`Imported project not found`,{node:e,property:`project`});return}let r=y(Xo(e));if(e.project===r){n(`error`,`Imported project cannot be the same as the current project`,{node:e,property:`project`});return}})},opacityPropertyRuleChecks=e=>tryOrLog((e,t)=>{let n=parseFloat(e.value);(isNaN(n)||n<0||n>100)&&t(`warning`,`Value ignored, must be between 0% and 100%`,{node:e,property:`value`})}),iconPropertyRuleChecks=e=>(e,t)=>{let n=e.$container;n.props.some(t=>qt(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),Me(n)&&f(n.$container)&&n.$container.props.some(e=>qt(e))&&t(`warning`,`Redundant as icon defined on element`,{node:e}),e.value?.startsWith(`file://`)&&t(`error`,`Icon URI must not start with file://`,{node:e,property:`value`})},colorLiteralRuleChecks=e=>(e,t)=>{if(e.$type===`HexColor`){if(e.hex===void 0||ka(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let n=Da(e.hex)?e.hex.toString().length:e.hex.length;n!==6&&n!==3&&n!==8&&t(`error`,`Invalid value "${e.$cstNode?.text}", must be 3, 6 or 8 characters long`,{node:e,property:`hex`});return}if(e.$type===`RGBAColor`){if((!Da(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!Da(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!Da(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),Da(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),ka(e.alpha)){let n=parseFloat(e.alpha);(n<0||n>100)&&t(`error`,`Invalid value, must be between 0% and 100%`,{node:e,property:`alpha`})}return}N(e)},relationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{let r=t.forDocument(C.getDocument(e)),i=zn(()=>r._resolveRelationSource(e));if(!i){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let a=zn(()=>r.parseFqnRef(e.target));if(!a){n(`error`,`Target not resolved`,{node:e,property:`target`});return}k.isImportRef(i)&&(k.isImportRef(a)?n(`warning`,`Relationship between imported elements may not be visible in origin projects`,{node:e}):n(`warning`,`Relationship from imported element to local element may not be visible in origin project`,{node:e,property:`source`})),ca(k.flatten(i),k.flatten(a))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},checkRelationBody=e=>tryOrLog((e,t)=>{e.$container.tags?.values&&e.tags?.values&&t(`error`,`Relation cannot have tags in both header and body`,{node:e.tags})}),extendRelationChecks=e=>{let t=e.likec4.ModelParser,n=new bi(e.shared,w.Linked),calcFingerprint=({source:e,target:t,kind:n,title:r})=>tr(`extend-relation`,k.flatten(e),k.flatten(t),n??`default`,r??``);function getProjectFingerprints(t){return n.get(t,()=>new Set(W(e.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),F(e=>e.c4Relations??[]),H(e=>calcFingerprint(e)))))}return tryOrLog((e,n)=>{let r=C.getDocument(e),i=t.forDocument(r),a=zn(()=>i.parseFqnRef(e.source));if(!a){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let o=zn(()=>i.parseFqnRef(e.target));if(!o){n(`error`,`Target not resolved`,{node:e,property:`target`});return}if(!k.isModelRef(a)&&!k.isImportRef(a)){n(`error`,`Source must reference a model element`,{node:e,property:`source`});return}if(!k.isModelRef(o)&&!k.isImportRef(o)){n(`error`,`Target must reference a model element`,{node:e,property:`target`});return}let s=y(r),c=(e.kind??e.dotKind?.kind)?.ref?.name??`default`,{title:l=``}=i.parseBaseProps({},{title:e.title}),u=calcFingerprint({source:a,target:o,kind:c,title:l});getProjectFingerprints(s).has(u)||n(`warning`,`This extend does not match any relation (by source, kind, target, title)`,{node:e})})},checkSpecificationRule=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one specification per document`,{node:e,property:`name`})}),checkModel=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one model per document`,{node:e,property:`name`})}),checkGlobals=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one global block per document`,{node:e,property:`name`})}),checkElementKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{qo.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=y(e),i=t.projectElements(r,mt).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==C.getDocument(e).uri;n(`error`,`Duplicate element kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},checkDeploymentNodeKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{qo.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=y(e),i=t.projectElements(r,vt).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==C.getDocument(e).uri;n(`error`,`Duplicate deploymentNode kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},checkTag=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{let r=e.name,i=y(e),a=t.projectElements(i,lr).filter(t=>t.name===r&&t.node!==e).head();if(a){let t=a.documentUri!==C.getDocument(e).uri;n(`error`,`Duplicate tag '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:a.nameSegment.range,uri:a.documentUri.toString()},message:`conflicting definition`}]}})}})},checkRelationshipKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{qo.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=y(e);t.projectElements(r,mr).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate RelationshipKind '${e.name}'`,{node:e,property:`name`})})},checkGlobalPredicate=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{let r=y(e),i=t.projectElements(r,ke),a=t.projectElements(r,me);i.concat(a).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${e.name}'`,{node:e,property:`name`})})},checkGlobalStyleId=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{let r=y(e);t.projectElements(r,Zn).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalStyleId name '${e.name}'`,{node:e,property:`name`})})},Zo=/@likec4-generated/,viewChecks=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{let r=ni.findCommentNode(e.$cstNode,[`BLOCK_COMMENT`]);if(r&&Zo.test(r.text)&&n(`warning`,`ManualLayoutV1 is no longer supported; remove this block`,{node:e,range:r.range}),!e.name)return;qo.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let i=y(e);t.projectElements(i,Pt).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate view '${e.name}'`,{node:e,property:`name`})})};function collectFqnExprs(e){let t=[],n=e;for(;n;)n.value&&t.push(n.value),n=n.prev;return t.reverse()}const viewRuleRankChecks=e=>tryOrLog((e,t)=>{let n=collectFqnExprs(e.targets);n.length<2&&e.value===`same`&&t(`warning`,`Rank rule should have at least 2 targets`,{node:e,property:`targets`});let r=n.filter(en),i=r[0]?.ref?.parent;for(let n=1;n<r.length;n++){let a=r[n];e.value===`same`&&!areSame(i,a?.ref?.parent)&&t(`error`,`All targets must have the same parent rank same`,{node:e,property:`targets`})}});function areSame(e,t){return!e&&!t?!0:!e||!t||e.value.ref!==t.value.ref?!1:areSame(e.parent,t.parent)}const checkFqnExprWith=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{let r=Kt(e);if(r?.$type!==`DynamicViewIncludePredicate`&&r?.isInclude!==!0){n(`error`,`Invalid usage inside "exclude"`,{node:e});return}let i=r.$type===`DynamicViewIncludePredicate`,a=t.forDocument(C.getDocument(r)),o=Y.unwrap(a.parseFqnExprWith(e).custom.expr);switch(!0){case Y.isWildcard(o)&&i:case Y.isElementKindExpr(o)&&i:case Y.isElementTagExpr(o)&&i:n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return;case Y.isWildcard(o):case Y.isModelRef(o):case Y.isDeploymentRef(o):return;case Y.isElementKindExpr(o):case Y.isElementTagExpr(o):n(`error`,`Invalid target (expect reference to specific element)`,{node:e,property:`subject`});return;default:Ni(o)}})},checkFqnRefExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{let r=t.forDocument(C.getDocument(e)).parseFqnRefExpr(e),i=Kt(e),a=Er(e)&&!C.hasContainerOfType(e,e=>ae(e)||Ze(e));if(i?.$type===`DeploymentViewRulePredicate`||a){if(!C.hasContainerOfType(e,Dt)){if(Y.isModelRef(r)){n(`error`,`Deployment view predicate must reference deployment model`,{node:e});return}if(Y.isDeploymentRef(r)&&X.isInsideInstanceRef(r.ref)){n(`error`,`Must reference deployment nodes or instances, but not internals`,{node:e});return}}B(e.selector)&&!x(e.ref.value?.ref)&&n(`warning`,`Selector '${e.selector}' applies to deployment nodes only, ignored here`,{node:e,property:`selector`});return}if(i?.$type===`DynamicViewIncludePredicate`)switch(!0){case Y.isElementKindExpr(r):case Y.isElementTagExpr(r):case Y.isWildcard(r):n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return}})},checkIncomingRelationExpr=e=>tryOrLog((e,t)=>{e.to.$type===`WildcardExpression`&&!Cr(e.$container)&&z(C.getContainerOfType(e,Oe)?.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}),checkOutgoingRelationExpr=e=>tryOrLog((e,t)=>{if(Kt(e)?.$type===`ViewRulePredicate`&&e.$container.$type!==`DirectedRelationExpr`&&e.from.$type===`WildcardExpression`){let n=C.getContainerOfType(e,Oe);n&&z(n.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),checkRelationExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{let r=C.getContainerOfType(e,le);if(!r||r.isInclude!==!0)return;let i=C.getDocument(e),a=t.forDocument(i),o=Ki.unwrap(a.parseRelationExpr(e)),s=`Model reference is allowed in exclude predicate only`;if(Ki.isDirect(o)){(Ui.isModelRef(o.source)||Ui.isModelRef(o.target))&&n(`error`,s,{node:e});return}let c;if(c=Ki.isIncoming(o)?o.incoming:Ki.isOutgoing(o)?o.outgoing:o.inout,Ui.isModelRef(c)){n(`error`,s,{node:e});return}})},checkRelationExprWith=e=>tryOrLog((e,t)=>{let n=Kt(e);if(!(!n||n.$type==`DynamicViewIncludePredicate`)&&!n.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var LikeC4DocumentValidator=class extends ri{constructor(e){super(e),this.services=e}async validateDocument(e,t,n){return this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:await super.validateDocument(e,t,n)}};const Qo=Z(m,g,pn,Jn,ln,In,_n,Xt,on,yn,Dt,we,kn,c,pt,le,kt,Dt,en,ce,Or,wr,ie,Ie,Dn,fe,v,x,kr,Gn,We,de,h,Ee,jt,_t,Jt,yt,S,f,Me,Tt,an,fr,nt,i,Vn,rr,un,Ln,tn,Bt,_r,mn,Lt,nn),findInvalidContainer=e=>{let t=e;for(;t&&!re(t);){if(Qo(t))return t;t=t.$container}};function checksFromDiagnostics(e){let t=e.state>=w.Validated?e.diagnostics?.filter(e=>e.severity===Va.Error)??[]:[],n=new WeakSet;for(let{node:e}of t){if(z(e)||n.has(e))continue;n.add(e);let t=findInvalidContainer(e);t&&n.add(t)}return{isValid:e=>!n.has(e),invalidNodes:n}}function registerValidationChecks(e){b.debug(`registerValidationChecks`),e.validation.ValidationRegistry.register({DeployedInstance:deployedInstanceChecks(e),DeploymentNodeKind:checkDeploymentNodeKind(e),DeploymentNode:deploymentNodeChecks(e),DeploymentRelation:deploymentRelationChecks(e),ExtendDeployment:extendDeploymentChecks(e),ExtendRelation:extendRelationChecks(e),FqnRefExpr:checkFqnRefExpr(e),RelationExpr:checkRelationExpr(e),OpacityProperty:opacityPropertyRuleChecks(e),IconProperty:iconPropertyRuleChecks(e),SpecificationRule:checkSpecificationRule(e),Model:checkModel(e),Globals:checkGlobals(e),GlobalPredicateGroup:checkGlobalPredicate(e),GlobalDynamicPredicateGroup:checkGlobalPredicate(e),GlobalStyleId:checkGlobalStyleId(e),DynamicStepSingle:dynamicViewStepSingle(e),DynamicStepChain:dynamicViewStepChain(e),LikeC4View:viewChecks(e),Element:checkElement(e),ElementRef:checkElementRef(e),ElementKind:checkElementKind(e),Relation:relationChecks(e),RelationBody:checkRelationBody(e),Tag:checkTag(e),FqnExprWith:checkFqnExprWith(e),RelationExprWith:checkRelationExprWith(e),RelationshipKind:checkRelationshipKind(e),IncomingRelationExpr:checkIncomingRelationExpr(e),OutgoingRelationExpr:checkOutgoingRelationExpr(e),ImportsFromPoject:checkImportsFromPoject(e),ColorLiteral:colorLiteralRuleChecks(e),DynamicViewDisplayVariantProperty:dynamicViewDisplayVariant(e),ViewRuleRank:viewRuleRankChecks(e)});let t=e.shared.lsp.Connection;t&&Pi(()=>{e.shared.workspace.DocumentBuilder.onUpdate((e,n)=>{for(let e of n)b.debug(`clear diagnostics for deleted ${e.path}`),t.sendDiagnostics({uri:e.toString(),diagnostics:[]}).catch(e=>b.error(O(e)))})})}const $o=b.getChild(`parser`);function toSingleLine(e){if(e==null)return;let t=removeIndent(e);return ka(t)?t.split(`
22
+ target: ${e.target.deployment} resolved: ${!!f[e.target.deployment]}\n`,!1):!0:!1),Pa((e,t)=>R(e[t.id])?(b.debug`Duplicate deployment relation ${t.id}`,e):(scanMetadataKeys(t),e[t.id]=t,e),{}));function toC4View(e){let n=e.uri.toString();return e=>{let{id:r,title:i,description:a,astPath:o,...s}=e;return e[So]===`element`&&B(i)&&`viewOf`in e&&(i=u[e.viewOf]?.title??null),B(i)&&r===`index`&&(i=`Landscape view`),{...ka(s,e=>e===void 0),[xo]:`parsed`,sourcePath:D.relative(t.folderUri,n),docUri:n,description:a,title:i,id:r}}}let m=n.flatMap(e=>U(e.c4Views,toC4View(e)));if(m.some(e=>e.id===`index`)||m.unshift({[xo]:`parsed`,[So]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]}),t.config.implicitViews===!0){let e=new Set;for(let t of m)t[So]===`element`&&`viewOf`in t&&t.viewOf&&e.add(t.viewOf);let t=new Set(m.map(e=>e.id));for(let n of H(u)){if(e.has(n)||ra(n))continue;let r=`__`+n.replaceAll(`.`,`_`);t.has(r)||(t.add(r),m.push({[xo]:`parsed`,[So]:`element`,id:r,viewOf:n,title:`Auto / ${(u[n]?.title??n).replaceAll(`
23
+ `,` `)}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let ee=G(m,ya(Na(`id`)));m.some(wo)&&(ee=uo(ee));for(let e of c)l.has(e.astPath)||b.warn(`Relation extend at ${e.astPath} does not match any relation in the model`);return{data:{[xo]:`parsed`,projectId:t.id,project:Co({id:t.id,title:t.config.title??t.config.name,styles:t.config.styles,manualLayouts:t.config.manualLayouts,inferTechnologyFromIcon:t.config.inferTechnologyFromIcon}),specification:{tags:r.tags,elements:r.specs.elements,relationships:Oa(r.specs.relationships,({notation:e,technology:t,...n})=>({...e&&{notation:e},...t&&{technology:t},style:n})),deployments:r.specs.deployments,...a.size>0&&{metadataKeys:[...a].sort(ti)},customColors:i},elements:u,relations:d,globals:r.globals,views:ee,deployments:{elements:f,relations:p},imports:{}},imports:r.imports}}const Q=b.getChild(`builder`);var DefaultLikeC4ModelBuilder=class extends er{projects;parser;listeners=[];cache;DocumentBuilder;manualLayouts;mutex;lastSeen;constructor(t){super(),this.services=t,this.projects=t.shared.workspace.ProjectsManager,this.parser=t.likec4.ModelParser,this.DocumentBuilder=t.shared.workspace.DocumentBuilder,this.mutex=t.shared.workspace.WorkspaceLock,this.manualLayouts=t.shared.workspace.ManualLayouts,this.lastSeen=t.likec4.LastSeen,this.cache=new ProjectModelCache(t),this.onDispose(this.cache,this.DocumentBuilder.onUpdate((e,t)=>{t.length>0&&this.notifyListeners(t)}),t.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.clearCache()}),this.manualLayouts.onManualLayoutUpdate(({projectId:e})=>{this.notifyListeners(e)}));let n=Ma(va(),F(t=>e(t)&&!this.projects.isExcluded(t)),U(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(T.Validated,(e,t)=>{let r=n(e);r.length>0&&this.notifyListeners(r)})),Q.debug`created`}unsafeSyncParseModelData(e){return this.cache.parsedData(e,()=>{let t=Q.getChild(e);try{let n=this.projects.getProject(e),r=this.documents(e);return r.length===0?(t.trace`unsafeSyncParseModelData: ${`skipped due to no documents`}`,null):(t.trace`unsafeSyncParseModelData: ${`completed`}`,buildModelData(this.services,n,r))}catch(t){return Q.warn(`unsafeSyncParseModelData failed for project ${e}`,{err:t}),null}})}unsafeSyncJoinedModelData(e){return this.cache.parsedJoinedData(e,()=>{let t=Q.getChild(e),n=this.unsafeSyncParseModelData(e);if(!n)return null;if(n.imports.size===0)return t.trace(`unsafeSyncJoinedModelData: no imports`),n.data;t.debug(`unsafeSyncJoinedModelData: processing imports`);let r=[...n.imports.associations()].reduce((e,[t,n])=>{if(n.size===0)return e;let r=this.unsafeSyncParseModelData(t);if(r){let i=[...n].flatMap(e=>r.data.elements[e]??[]);L(i,1)&&(e[t]=structuredClone(i))}return e},{});return{...n.data,imports:r}})}async parseModel(e,t){return e=this.projects.ensureProjectId(e),await this.mutex.read(async()=>(t?.isCancellationRequested&&await Ni(t),this.cache.parsedModel(e,()=>{let t=Q.getChild(e),n=this.unsafeSyncJoinedModelData(e);return n?fo.create(n):(t.debug`parseModel: returning EMPTY`,fo.EMPTY.asParsed)})))}unsafeSyncComputeModel(e,t){return this.cache.computedModel(e,t??null,()=>{let n=Q.getChild(e),r=this.unsafeSyncJoinedModelData(e);if(!r)return e!==pr.DefaultProjectId&&n.warn`unsafeSyncComputeModel: returning EMPTY`,fo.EMPTY.asComputed;let i=cr(),a=fo.create(r),o=[];for(let e of La(r.views)){let r=lo(e,a);if(!r.isSuccess){n.warn(k(r.error));continue}t?.views[e.id]&&Object.assign(r.view,{hasManualLayout:!0}),o.push(r.view)}assignNavigateTo(o);let s={...r,manualLayouts:{...t?.views},[Gi]:`computed`,views:ya(o,Na(`id`))};return n.debug(`computeModel${t?` with manual layouts`:``}: {status} in ${i.pretty}`,{status:`completed`}),this.lastSeen.rememberModel(fo.create(s))})}async computeModel(e,t){e=this.projects.ensureProjectId(e);let n=Q.getChild(e);return await this.mutex.read(async()=>{t?.isCancellationRequested&&await Ni(t);let r=this.projects.getProject(e),i=await this.manualLayouts.read(r),a=this.unsafeSyncComputeModel(e,i);return a===fo.EMPTY&&e!==pr.DefaultProjectId&&n.warn(`computeModel returned EMPTY`),a})}onModelParsed(e){return this.listeners.push(e),bi.create(()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1)})}clearCache(){Q.debug(`clear all caches`),this.cache.clear()}documents(e){return this.parser.documents(e).toArray()}notifyListeners(e){let t;t=ba(e)?G(e,_a(e=>this.projects.ownerProjectId(e)),ua()):[[e,[]]];for(let e of this.listeners)try{for(let[n,r]of t)e(n,r)}catch(e){Q.warn(k(e))}}},ProjectModelCache=class extends pi{constructor(e){super(e=>typeof e==`string`?e:e.id),this.toDispose.push(e.shared.workspace.DocumentBuilder.onDocumentPhase(T.Validated,t=>{let n=e.shared.workspace.ProjectsManager.ownerProjectId(t);this.clear(n)}),e.shared.workspace.DocumentBuilder.onUpdate((t,n)=>{if(n.length>0){let t=e.shared.workspace.ProjectsManager,r=Ia(U(n,t.ownerProjectId.bind(t)));if(!L(r,1))return;Q.trace`clear project caches for: ${r} (on delete ${n.map(e=>e.fsPath)})`;for(let e of r)this.clear(e)}}))}parsedData(e,t){let n=`parsed-data`,r=this.get(e,n);if(r!==void 0)return Q.trace`cache hit project ${e} key: ${n}`,r;let i=t();return this.set(e,n,i),Q.trace`cache miss project ${e} key: ${n}`,i}parsedJoinedData(e,t){let n=`parsed-joined-data`,r=this.get(e,n);if(r!==void 0)return Q.trace`cache hit project ${e} key: ${n}`,r;let i=t();return this.set(e,n,i),Q.trace`cache miss project ${e} key: ${n}`,i}parsedModel(e,t){let n=`parsed-model`,r=this.get(e,n);if(r!==void 0)return Q.trace`cache hit project ${e} key: ${n}`,r;let i=t();return this.set(e,n,i),Q.trace`cache miss project ${e} key: ${n}`,i}computedModel(e,t,n){let r=t?`computed-model-${t.hash}`:`computed-model`,i=this.get(e,r);if(i!==void 0)return Q.trace`cache hit project ${e} key: ${r}`,i;let a=n();return this.set(e,r,a),Q.trace`cache miss project ${e} key: ${r}`,a}};const{findNodeForKeyword:Bo,findNodeForProperty:Vo}=E,{getDocument:Ho,streamAllContents:Uo}=w,Wo=b.getChild(`locator`);var LikeC4ModelLocator=class{fqnIndex;deploymentsIndex;langiumDocuments;parser;projects;constructor(e){this.services=e,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.parser=e.likec4.ModelParser,this.projects=e.shared.workspace.ProjectsManager}documents(e){return this.parser.documents(e)}getParsedElement(...e){try{let t,n;if(e.length===2?(t=e[0],n=e[1]):(t=e[0],n=Ea(t)?this.projects.ensureProjectId():v(t)),Ea(t)){let e=t,r=this.fqnIndex.byFqn(n,e).head();if(!r)return null;let i=this.langiumDocuments.getDocument(r.documentUri),a=this.findParsedElementByFqnIn(e,i);return a&&i?{projectId:n,element:a,document:i}:null}let r=this.fqnIndex.getFqn(t),i=Ho(t),a=this.findParsedElementByFqnIn(r,i);return a&&i?{projectId:n,element:a,document:i}:null}catch(e){return Wo.debug(k(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t){let[n,r]=ca(e);n??=this.projects.ensureProjectId(t);let i=this.fqnIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateDeploymentElement(e,t){let n=this.projects.ensureProjectId(t),r=e,i=this.deploymentsIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateRelation(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Relations.find(t=>t.id===e)??t.c4DeploymentRelations.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(!Te(r)&&!Dr(r))continue;let i=r.kind?Vo(r.$cstNode,`kind`):void 0;if(i??=r.dotKind?Vo(r.$cstNode,`dotKind`):void 0,i??=Bo(r.$cstNode,`->`),i??=Vo(r.$cstNode,`title`),i??=Vo(r.$cstNode,`target`),i??=r.$cstNode,i)return{uri:t.uri.toString(),range:{start:i.range.start,end:i.range.start}}}return null}locateViewAst(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Views.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(En(r))return{doc:t,view:n,viewAst:r}}return null}locateView(e,t){let n=this.locateViewAst(e,t);if(!n)return null;let r=n.viewAst,i=r.name?Vo(r.$cstNode,`name`):void 0;return i??=Bo(r.$cstNode,`view`),i??=r.$cstNode,i?{uri:n.doc.uri.toString(),range:{start:i.range.start,end:i.range.start}}:null}async locateDocumentTags(e,t){let n=this.langiumDocuments.getDocument(e);if(!n||!n.likec4ProjectId)return null;n.state<T.Linked&&(Wo.debug(`Waiting for document ${n.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(T.Linked,n.uri,t));let r=v(n);Wo.trace`locate document tags for ${n.uri.fsPath} in project ${r}`;try{let e=this.services.likec4.LastSeen.specification(r)?.tags,t=this.services.likec4.LastSeen.styles(r)??po.DEFAULT;if(!e)return Wo.trace(`No specification or styles found for project ${r}, cannot locate tags for document ${n.uri.fsPath}`),null;let i=G(Uo(n.parseResult.value),ni(e=>ct(e)||ee(e)),fi(),I(n=>{let r,i;try{ct(n)?(r=n.name,i=n.$cstNode):(r=n.tag.$refText,i=n.tag.$refNode);let a=e[r];return ri(a,`Tag ${r} not found in merged specification`),ri(i,`Tag ${r} does not have a $cstNode`),{name:r,color:t.tagColor(a.color).fill,range:i.range,isSpecification:ct(n)}}catch(e){return Wo.warn(`Fail on tag ${r}`,{err:e}),[]}}));return Wo.debug(`Found ${i.length} tags in document ${n.uri.path}`),i}catch(e){return Wo.warn(k(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:n}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!n)return null;if(!wn(n)||!n.body)return Wo.warn(`View ${e.view} is not a dynamic view`),null;let r=this.services.workspace.AstNodeLocator.getAstNodePath(n.body)+e.astPath,i=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r);if(!i||!at(i))return Wo.warn(`Failed to locate dynamic view step ${r} in view ${e.view}`),null;let a=i.kind?Vo(i.$cstNode,`kind`):void 0;return a??=i.dotKind?Vo(i.$cstNode,`dotKind`):void 0,a??=Bo(i.$cstNode,`->`),a??=Bo(i.$cstNode,`<-`),a??=Vo(i.$cstNode,`title`),a??=Vo(i.$cstNode,`target`),a??=i.$cstNode,a?{uri:t.uri.toString(),range:{start:a.range.start,end:a.range.start}}:null}};const Go=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function tryOrLog(e){return async function(t,n,r){try{let i=e(t,n,r);Ta(i)&&await i;return}catch(e){let r=e instanceof Error?e.message:String(e);n(`error`,`Validation failed: ${r}`,{node:t}),b.debug(`Validation failed: ${r}`,{error:e})}}}const{getDocument:Ko}=w,deploymentNodeChecks=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return tryOrLog((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`DeploymentNode must be named`,{node:e});return}let a=N(n.getNameNode(e),`name CstNode not found`).range;Go.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=v(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate node name "${s}"`,{node:e,range:a})})},deployedInstanceChecks=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return tryOrLog((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`Deployed instance must be named, unique inside node`,{node:e});return}let a=N(n.getNameNode(e),`name CstNode not found`).range;Go.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=v(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate instance name "${s}"`,{node:e,range:a})})},deploymentRelationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{if(!e.target?.value?.ref){n(`error`,`DeploymentRelation target '${e.target?.$cstNode?.text??``}' not resolved`,{node:e,property:`target`});return}let r=Ko(e),i=t.forDocument(r),a;try{a=i._resolveDeploymentRelationSource(e)}catch(t){b.warn(k(t)),n(`error`,`DeploymentRelation source not resolved`,{node:e,property:`source`});return}if(A.isImportRef(a)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`source`});return}if(A.isModelRef(a)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`source`});return}let o=i.parseFqnRef(e.target);if(A.isImportRef(o)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`target`});return}if(A.isModelRef(o)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`target`});return}aa(a.deployment,o.deployment)&&n(`error`,`Invalid parent-child relationship`,{node:e})})},extendDeploymentChecks=e=>tryOrLog((e,t)=>{let n=e.deploymentNode.value.ref;(!n||!x(n))&&t(`error`,`ExtendDeployment allows only DeploymentNode`,{node:e,property:`deploymentNode`})}),dynamicViewStepSingle=e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,n)=>{let r=Rt(e.source),i=r&&t.getFqn(r);i||n(`error`,`Source not found (not parsed/indexed yet)`,{node:e,property:`source`});let a=Rt(e.target),o=a&&t.getFqn(a);o||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`}),i&&o&&(Qi(i,o)||Qi(o,i))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},dynamicViewStepChain=e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,n)=>{let r=e.source;c(r)&&r.isBackward&&n(`error`,`Invalid chain after backward step`,{node:e});let i=Rt(e.target);i&&t.getFqn(i)||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`})})},dynamicViewDisplayVariant=e=>tryOrLog((e,t)=>{if(z(e.value)||e.value!==`diagram`&&e.value!==`sequence`){t(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:e,property:`value`});return}w.hasContainerOfType(e,ze)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:qo}=w,checkElement=e=>{let t=e.likec4.FqnIndex,n=e.workspace.AstNodeLocator;return tryOrLog((e,r)=>{let i=t.getFqn(e);if(!i){r(`error`,`Not indexed element`,{node:e,property:`name`});return}Go.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let a=qo(e),o=a.uri,s=n.getAstNodePath(e),c=t.byFqn(v(a),i).filter(e=>e.documentUri!==o||e.path!==s).head();if(c){let t=c.documentUri!==o;r(`error`,`Duplicate element name ${e.name===i?e.name:e.name+` (`+i+`)`}`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:c.nameSegment?.range??c.selectionSegment?.range,uri:c.documentUri.toString()},message:`conflicting element`}]}})}})},checkElementRef=e=>tryOrLog((e,t)=>{fn(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:Jo}=w,checkImportsFromPoject=e=>{let t=e.shared.workspace.ProjectsManager;return tryOrLog((e,n)=>{if(!t.all.includes(e.project)){n(`error`,`Imported project not found`,{node:e,property:`project`});return}let r=v(Jo(e));if(e.project===r){n(`error`,`Imported project cannot be the same as the current project`,{node:e,property:`project`});return}})},opacityPropertyRuleChecks=e=>tryOrLog((e,t)=>{let n=parseFloat(e.value);(isNaN(n)||n<0||n>100)&&t(`warning`,`Value ignored, must be between 0% and 100%`,{node:e,property:`value`})}),iconPropertyRuleChecks=e=>(e,t)=>{let n=e.$container;n.props.some(t=>qt(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),je(n)&&f(n.$container)&&n.$container.props.some(e=>qt(e))&&t(`warning`,`Redundant as icon defined on element`,{node:e}),e.value?.startsWith(`file://`)&&t(`error`,`Icon URI must not start with file://`,{node:e,property:`value`})},colorLiteralRuleChecks=e=>(e,t)=>{if(e.$type===`HexColor`){if(e.hex===void 0||Ea(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let n=wa(e.hex)?e.hex.toString().length:e.hex.length;n!==6&&n!==3&&n!==8&&t(`error`,`Invalid value "${e.$cstNode?.text}", must be 3, 6 or 8 characters long`,{node:e,property:`hex`});return}if(e.$type===`RGBAColor`){if((!wa(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!wa(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!wa(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),wa(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),Ea(e.alpha)){let n=parseFloat(e.alpha);(n<0||n>100)&&t(`error`,`Invalid value, must be between 0% and 100%`,{node:e,property:`alpha`})}return}P(e)},relationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{let r=t.forDocument(w.getDocument(e)),i=Ln(()=>r._resolveRelationSource(e));if(!i){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let a=Ln(()=>r.parseFqnRef(e.target));if(!a){n(`error`,`Target not resolved`,{node:e,property:`target`});return}A.isImportRef(i)&&(A.isImportRef(a)?n(`warning`,`Relationship between imported elements may not be visible in origin projects`,{node:e}):n(`warning`,`Relationship from imported element to local element may not be visible in origin project`,{node:e,property:`source`})),aa(A.flatten(i),A.flatten(a))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},checkRelationBody=e=>tryOrLog((e,t)=>{e.$container.tags?.values&&e.tags?.values&&t(`error`,`Relation cannot have tags in both header and body`,{node:e.tags})}),extendRelationChecks=e=>{let t=e.likec4.ModelParser,n=new ji(e.shared,T.Linked),calcFingerprint=({source:e,target:t,kind:n,title:r})=>$n(`extend-relation`,A.flatten(e),A.flatten(t),n??`default`,r??``);function getProjectFingerprints(t){return n.get(t,()=>new Set(G(e.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),I(e=>e.c4Relations??[]),U(e=>calcFingerprint(e)))))}return tryOrLog((e,n)=>{let r=w.getDocument(e),i=t.forDocument(r),a=Ln(()=>i.parseFqnRef(e.source));if(!a){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let o=Ln(()=>i.parseFqnRef(e.target));if(!o){n(`error`,`Target not resolved`,{node:e,property:`target`});return}if(!A.isModelRef(a)&&!A.isImportRef(a)){n(`error`,`Source must reference a model element`,{node:e,property:`source`});return}if(!A.isModelRef(o)&&!A.isImportRef(o)){n(`error`,`Target must reference a model element`,{node:e,property:`target`});return}let s=v(r),c=(e.kind??e.dotKind?.kind)?.ref?.name??`default`,{title:l=``}=i.parseBaseProps({},{title:e.title}),u=calcFingerprint({source:a,target:o,kind:c,title:l});getProjectFingerprints(s).has(u)||n(`warning`,`This extend does not match any relation (by source, kind, target, title)`,{node:e})})},checkSpecificationRule=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one specification per document`,{node:e,property:`name`})}),checkModel=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one model per document`,{node:e,property:`name`})}),checkGlobals=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one global block per document`,{node:e,property:`name`})}),checkElementKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{Go.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=v(e),i=t.projectElements(r,St).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==w.getDocument(e).uri;n(`error`,`Duplicate element kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},checkDeploymentNodeKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{Go.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=v(e),i=t.projectElements(r,ve).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==w.getDocument(e).uri;n(`error`,`Duplicate deploymentNode kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},checkTag=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{let r=e.name,i=v(e),a=t.projectElements(i,`Tag`).filter(t=>t.name===r&&t.node!==e).head();if(a){let t=a.documentUri!==w.getDocument(e).uri;n(`error`,`Duplicate tag '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:a.nameSegment.range,uri:a.documentUri.toString()},message:`conflicting definition`}]}})}})},checkRelationshipKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{Go.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=v(e);t.projectElements(r,`RelationshipKind`).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate RelationshipKind '${e.name}'`,{node:e,property:`name`})})},checkGlobalPredicate=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{let r=v(e),i=t.projectElements(r,Yn),a=t.projectElements(r,Oe);i.concat(a).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${e.name}'`,{node:e,property:`name`})})},checkGlobalStyleId=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{let r=v(e);t.projectElements(r,`GlobalStyleId`).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalStyleId name '${e.name}'`,{node:e,property:`name`})})},Yo=/@likec4-generated/,viewChecks=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{let r=mi.findCommentNode(e.$cstNode,[`BLOCK_COMMENT`]);if(r&&Yo.test(r.text)&&n(`warning`,`ManualLayoutV1 is no longer supported; remove this block`,{node:e,range:r.range}),!e.name)return;Go.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let i=v(e);t.projectElements(i,`LikeC4View`).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate view '${e.name}'`,{node:e,property:`name`})})};function collectFqnExprs(e){let t=[],n=e;for(;n;)n.value&&t.push(n.value),n=n.prev;return t.reverse()}const viewRuleRankChecks=e=>tryOrLog((e,t)=>{let n=collectFqnExprs(e.targets);n.length<2&&e.value===`same`&&t(`warning`,`Rank rule should have at least 2 targets`,{node:e,property:`targets`});let r=n.filter(en),i=r[0]?.ref?.parent;for(let n=1;n<r.length;n++){let a=r[n];e.value===`same`&&!areSame(i,a?.ref?.parent)&&t(`error`,`All targets must have the same parent rank same`,{node:e,property:`targets`})}});function areSame(e,t){return!e&&!t?!0:!e||!t||e.value.ref!==t.value.ref?!1:areSame(e.parent,t.parent)}const checkFqnExprWith=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{let r=wr(e);if(r?.$type!==`DynamicViewIncludePredicate`&&r?.isInclude!==!0){n(`error`,`Invalid usage inside "exclude"`,{node:e});return}let i=r.$type===`DynamicViewIncludePredicate`,a=t.forDocument(w.getDocument(r)),o=J.unwrap(a.parseFqnExprWith(e).custom.expr);switch(!0){case J.isWildcard(o)&&i:case J.isElementKindExpr(o)&&i:case J.isElementTagExpr(o)&&i:n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return;case J.isWildcard(o):case J.isModelRef(o):case J.isDeploymentRef(o):return;case J.isElementKindExpr(o):case J.isElementTagExpr(o):n(`error`,`Invalid target (expect reference to specific element)`,{node:e,property:`subject`});return;default:si(o)}})},checkFqnRefExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{let r=t.forDocument(w.getDocument(e)).parseFqnRefExpr(e),i=wr(e),a=ot(e)&&!w.hasContainerOfType(e,e=>ae(e)||Xe(e));if(i?.$type===`DeploymentViewRulePredicate`||a){if(!w.hasContainerOfType(e,Dt)){if(J.isModelRef(r)){n(`error`,`Deployment view predicate must reference deployment model`,{node:e});return}if(J.isDeploymentRef(r)&&Y.isInsideInstanceRef(r.ref)){n(`error`,`Must reference deployment nodes or instances, but not internals`,{node:e});return}}V(e.selector)&&!x(e.ref.value?.ref)&&n(`warning`,`Selector '${e.selector}' applies to deployment nodes only, ignored here`,{node:e,property:`selector`});return}if(i?.$type===`DynamicViewIncludePredicate`)switch(!0){case J.isElementKindExpr(r):case J.isElementTagExpr(r):case J.isWildcard(r):n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return}})},checkIncomingRelationExpr=e=>tryOrLog((e,t)=>{e.to.$type===`WildcardExpression`&&!xr(e.$container)&&B(w.getContainerOfType(e,De)?.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}),checkOutgoingRelationExpr=e=>tryOrLog((e,t)=>{if(wr(e)?.$type===`ViewRulePredicate`&&e.$container.$type!==`DirectedRelationExpr`&&e.from.$type===`WildcardExpression`){let n=w.getContainerOfType(e,De);n&&B(n.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),checkRelationExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{let r=w.getContainerOfType(e,le);if(!r||r.isInclude!==!0)return;let i=w.getDocument(e),a=t.forDocument(i),o=Ui.unwrap(a.parseRelationExpr(e)),s=`Model reference is allowed in exclude predicate only`;if(Ui.isDirect(o)){(Bi.isModelRef(o.source)||Bi.isModelRef(o.target))&&n(`error`,s,{node:e});return}let c;if(c=Ui.isIncoming(o)?o.incoming:Ui.isOutgoing(o)?o.outgoing:o.inout,Bi.isModelRef(c)){n(`error`,s,{node:e});return}})},checkRelationExprWith=e=>tryOrLog((e,t)=>{let n=wr(e);if(!(!n||n.$type==`DynamicViewIncludePredicate`)&&!n.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var LikeC4DocumentValidator=class extends hi{constructor(e){super(e),this.services=e}async validateDocument(e,t,n){return this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:await super.validateDocument(e,t,n)}};const Xo=X(m,st,pn,Kn,ln,Pn,_n,Xt,on,yn,Dt,we,On,c,pt,le,kt,Dt,en,ce,Er,Sr,ie,Fe,En,fe,_,x,Dr,Un,Ue,de,h,Te,jt,_t,Jt,yt,S,f,je,Tt,an,ur,tt,i,zn,tr,un,Fn,tn,Bt,hr,mn,Lt,nn),findInvalidContainer=e=>{let t=e;for(;t&&!re(t);){if(Xo(t))return t;t=t.$container}};function checksFromDiagnostics(e){let t=e.state>=T.Validated?e.diagnostics?.filter(e=>e.severity===Ra.Error)??[]:[],n=new WeakSet;for(let{node:e}of t){if(B(e)||n.has(e))continue;n.add(e);let t=findInvalidContainer(e);t&&n.add(t)}return{isValid:e=>!n.has(e),invalidNodes:n}}function registerValidationChecks(e){b.debug(`registerValidationChecks`),e.validation.ValidationRegistry.register({DeployedInstance:deployedInstanceChecks(e),DeploymentNodeKind:checkDeploymentNodeKind(e),DeploymentNode:deploymentNodeChecks(e),DeploymentRelation:deploymentRelationChecks(e),ExtendDeployment:extendDeploymentChecks(e),ExtendRelation:extendRelationChecks(e),FqnRefExpr:checkFqnRefExpr(e),RelationExpr:checkRelationExpr(e),OpacityProperty:opacityPropertyRuleChecks(e),IconProperty:iconPropertyRuleChecks(e),SpecificationRule:checkSpecificationRule(e),Model:checkModel(e),Globals:checkGlobals(e),GlobalPredicateGroup:checkGlobalPredicate(e),GlobalDynamicPredicateGroup:checkGlobalPredicate(e),GlobalStyleId:checkGlobalStyleId(e),DynamicStepSingle:dynamicViewStepSingle(e),DynamicStepChain:dynamicViewStepChain(e),LikeC4View:viewChecks(e),Element:checkElement(e),ElementRef:checkElementRef(e),ElementKind:checkElementKind(e),Relation:relationChecks(e),RelationBody:checkRelationBody(e),Tag:checkTag(e),FqnExprWith:checkFqnExprWith(e),RelationExprWith:checkRelationExprWith(e),RelationshipKind:checkRelationshipKind(e),IncomingRelationExpr:checkIncomingRelationExpr(e),OutgoingRelationExpr:checkOutgoingRelationExpr(e),ImportsFromPoject:checkImportsFromPoject(e),ColorLiteral:colorLiteralRuleChecks(e),DynamicViewDisplayVariantProperty:dynamicViewDisplayVariant(e),ViewRuleRank:viewRuleRankChecks(e)});let t=e.shared.lsp.Connection;t&&ci(()=>{e.shared.workspace.DocumentBuilder.onUpdate((e,n)=>{for(let e of n)b.debug(`clear diagnostics for deleted ${e.path}`),t.sendDiagnostics({uri:e.toString(),diagnostics:[]}).catch(e=>b.error(k(e)))})})}const Zo=b.getChild(`parser`);function toSingleLine(e){if(e==null)return;let t=removeIndent(e);return Ea(t)?t.split(`
24
24
  `).join(` `):`md`in t?{md:t.md.split(`
25
25
  `).join(` `)}:{txt:t.txt.split(`
26
- `).join(` `)}}function removeIndent(e){if(e!=null)switch(!0){case ka(e):return Eo(e).trim();case Re(e)&&ka(e.markdown):return{md:Eo(e.markdown).trim()};case Re(e)&&ka(e.text):return{txt:Eo(e.text).trim()};case Re(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(Ci(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`?$o.getChild(n).debug(r):$o.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 F(t,t=>this.tryParse(e,t,n)??[])}resolveFqn(e){if(g(e)){let t=y(e),n=this.resolveFqn(M(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,n),Wi(t,n)}return an(e)?Rt(e.element):nt(e)?Rt(e.deploymentNode):Vt(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)||R(e.props))return;let extractValues=e=>{if(Re(e)){let t=removeIndent(e);if(!t)return[];if(typeof t==`string`)return B(t)?[t]:[];{let e=t.md||t.txt;return B(e)?[e]:[]}}else if(He(e))return e.values.map(e=>removeIndent(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(B);return[]},t=W(e.props,F(e=>e.value?extractValues(e.value).map(t=>[e.key,t]):[[e.key,String(e.boolValue)]]),P(([e,t])=>B(t)));if(R(t))return;let n=W(t,ba(([e])=>e),ja(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 R(r)?void 0:r}parseMarkdownOrString(e){if(Re(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=>M(e.tag.ref,`Tag reference is not resolved`).name).filter(B)),t=t.prev;return j(n)?za(n):null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!e?.props||e.props.length===0)return;let t=this.tryMap(`base`,P(e.props,Cn),e=>{let t=e.value;if(Ta(t))return;let n=B(e.title)?toSingleLine(e.title):void 0,r=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return ea({url:t,title:n,relative:r&&r!==t?r:void 0})});return j(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&&qa(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&&Ja(n):return Ya(this.doc.uri.toString(),`../`,n);case n&&Ka(n):return Xa(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){$o.warn(`Image alias "${n}" not found in project configuration`);return}let a=r?Xa(i,r):i;return Xa(this.project.folderUri.toString(),a)}parseColorLiteral(e){if(this.isValid(e)){if(zt(e))return`#${e.hex}`;if(Qn(e)){let t=Da(e.alpha)?e.alpha:void 0;return ka(e.alpha)&&(t=Ge(e.alpha)/100),t===void 0?`rgb(${e.red},${e.green},${e.blue})`:`rgba(${e.red},${e.green},${e.blue},${t})`}N(e)}}parseElementStyle(e){if(!e)return{};if(Ca(e)){let t=this.parseStyleProps(e.find(Me)?.props);try{let n=this.parseIconProperty(e.find(qt));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 vr(n):B(n.value)&&(t.border=n.value);break;case dn(n):{let e=Ve(n);B(e)&&(t.color=e);break}case cr(n):B(n.value)&&(t.shape=n.value);break;case qt(n):{let e=this.parseIconProperty(n);B(e)&&(t.icon=e);break}case br(n):{let e=Ve(n);B(e)&&(t.iconColor=e);break}case Dr(n):B(n.value)&&(t.iconSize=En(n));break;case jr(n):B(n.value)&&(t.iconPosition=oe(n));break;case Ct(n):t.opacity=ne(n);break;case u(n):t.multiple=wa(n.value)?n.value:!1;break;case Zt(n):B(n.value)&&(t.size=En(n));break;case Ae(n):B(n.value)&&(t.padding=En(n));break;case ft(n):B(n.value)&&(t.textSize=En(n));break;default:N(n)}}catch(e){this.logError(e,n)}return ea(t)}parseBaseProps(e,t){let n=removeIndent(t?.title??a(e.title)),r=t?.description?{txt:removeIndent(t.description)}:this.parseMarkdownOrString(e.description);return ea({title:n,summary:t?.summary?{txt:removeIndent(t.summary)}:this.parseMarkdownOrString(e.summary),description:r,technology:toSingleLine(t?.technology)??removeIndent(a(e.technology))})}};function*streamDeploymentModel(e){let t=Gi.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(kr(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 kr(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case v(t):e.c4Deployments.push(this.parseDeployedInstance(t));break;case x(t):e.c4Deployments.push(this.parseDeploymentNode(t));break;case nt(t):{let n=this.parseExtendDeployment(t);n&&e.c4ExtendDeployments.push(n);break}default:N(t)}}catch(e){this.logError(e,t,`deployment`)}}parseDeploymentNode(e){let t=this.isValid,n=this.resolveFqn(e),r=M(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=W(e.body?.props??[],P(t),P(_e),U(e=>[e.key,e.value])),{title:l,...u}=this.parseBaseProps(c,{title:e.title,summary:e.summary});return ea({id:n,kind:r,title:l??la(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);A(k.isModelRef(r)||k.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=W(e.body?.props??[],P(t),P(_e),U(e=>[e.key,e.value])),c=this.parseBaseProps(s,{title:e.title,summary:e.summary});return ea({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&&R(n??{})&&!r?null:ea({id:this.resolveFqn(e),astPath:this.getAstNodePath(e),metadata:n,tags:t,links:r})}_resolveDeploymentRelationSource(e){if(L(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);A(k.isDeploymentRef(r),`Invalid source for deployment relation`);let i=this.parseFqnRef(e.target);A(k.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=W(e.body?.props??[],P(ir),P(e=>B(e.value)),U(e=>[e.key,e.value])),u=W(e.body?.props??[],P(Hn),ga())?.value.view.ref?.name,d=this.parseBaseProps(l,{title:e.title}),f=e.body?.props.find(bn);return ea({id:tr(`deployment`,n,r.deployment,i.deployment),source:r,target:i,...d,metadata:c,kind:s,tags:a,links:o,...Ye(f?.props,t),navigateTo:u,astPath:n})}}}function DeploymentViewParser(e){return class extends e{parseDeploymentView(e){let t=e.body;A(t,`DynamicElementView body is not defined`);let n=t.props.filter(this.isValid),r=this.getAstNodePath(e),i=e.name;i||=`deployment_`+tr(this.doc.uri.toString(),r);let{title:a=null,description:o=null}=this.parseBaseProps(W(n,P(Ce),U(e=>[e.key,e.value]))),s=this.convertTags(t),c=this.convertLinks(t);return Ar.writeId(e,i),{[Bi._type]:`deployment`,id:i,astPath:r,title:toSingleLine(a)??null,description:o,tags:s,links:j(c)?c:null,rules:this.tryMap(`deployment`,t.rules,e=>this.parseDeploymentViewRule(e))}}parseDeploymentViewRule(e){if(le(e))return this.parseDeploymentViewRulePredicate(e);if(qe(e))return Le(e);if(ae(e))return this.parseDeploymentViewRuleStyle(e);N(e)}parseDeploymentViewRulePredicate(e){let t=[],n=e.expr;for(;n;){try{let e=n.value;Ea(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){_(e)}n=n.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(Or)),n=removeIndent(a(e.props.find(ye)?.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!It(e)&&!r(e)&&!tt(e)?null:e.participant}function parseWhereClause(e){switch(!0){case dr(e):{let t=e.value.tag.ref?.name,n=parseParticipant(e);A(t,`Expected tag name`);let r={tag:parseEquals(e,t)};return n?{participant:n,operator:r}:r}case wt(e):{let t=e.value?.ref?.name,n=parseParticipant(e);A(t,`Expected kind name`);let r={kind:parseEquals(e,t)};return n?{participant:n,operator:r}:r}case ge(e):{let t=e.key,n=parseParticipant(e);A(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 be(e)||Ot(e):return{not:parseWhereClause(e.value)};case Fe(e):{let t=parseWhereClause(e.left),n=parseWhereClause(e.right);return createBinaryOperator(e.operator.toLowerCase(),t,n)}default:N(e)}}function createBinaryOperator(e,t,n){if(n===null)return t;switch(e){case`and`:{let e=[na(t)?t.and:t,na(n)?n.and:n].flat();return A(j(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[sa(t)?t.or:t,sa(n)?n.or:n].flat();return A(j(e),`Expected non-empty array`),{or:e}}default:N(e)}}function ExpressionV2Parser(e){return class extends e{parseFqnRef(e){let t=M(e.value?.ref,()=>`Element "${e.$cstNode?.text}" is not resolved`);if(g(t)){let e={project:y(t),model:this.resolveFqn(M(t.imported.ref,`Imported "${t.$cstNode?.text}" is not resolved`))};return this.doc.c4Imports.set(e.project,e.model),e}if(S(t)){let n=qn(e);if(n){let e={project:y(n),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let r=Fn(e);return r?{deployment:this.resolveFqn(r),element:this.resolveFqn(t)}:{model:this.resolveFqn(t)}}if(Vt(t))return{deployment:this.resolveFqn(t)};N(t)}parseExpressionV2(e){if(Wn(e))return this.parseFqnExprOrWith(e);if(et(e))return this.parseRelationExprOrWith(e);N(e)}parseFqnExprOrWith(e){if(Xt(e))return this.parseFqnExprWith(e);if(Ut(e))return this.parseFqnExprOrWhere(e);N(e)}parseFqnExprWith(e){let t=this.parseFqnExprOrWhere(e.subject);return(e.custom?.props??[]).reduce((e,t)=>{if(!this.isValid(t))return e;if(yt(t)){let n=t.value.view.$refText;return B(n)&&(e.custom.navigateTo=n),e}if(ht(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom[t.key]=n),e}if(_e(t)){if(t.key===`description`||t.key===`summary`){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom.description=n),e}let n=removeIndent(a(t.value));return n&&(e.custom[t.key]=n),e}if(qt(t)){let n=this.parseIconProperty(t);return L(n)&&(e.custom[t.key]=n),e}if(dn(t)){let n=Ve(t);return L(n)&&(e.custom[t.key]=n),e}if(cr(t)||vr(t))return L(t.value)&&(e.custom[t.key]=t.value),e;if(Ct(t))return L(t.value)&&(e.custom[t.key]=ne(t)),e;if(br(t)){let n=Ve(t);return L(n)&&(e.custom[t.key]=n),e}if(ye(t)){let n=B(t.value)?removeIndent(a(t.value)):void 0;return n&&(e.custom[t.key]=n),e}if(u(t))return wa(t.value)&&(e.custom[t.key]=t.value),e;if(Zt(t)||ft(t)||Ae(t)||Dr(t))return B(t.value)&&(e.custom[t.key]=En(t)),e;if(jr(t))return B(t.value)&&(e.custom[t.key]=t.value),e;N(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(sr(e))return this.parseFqnExprWhere(e);if(yn(e))return this.parseFqnExpr(e);N(e)}parseFqnExprWhere(e){return A(!sr(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(Bn(e))return{wildcard:!0};if(xe(e))return A(e.kind?.ref,`ElementKind "${e.$cstNode?.text}" is not resolved`),{elementKind:e.kind.ref.name,isEqual:e.isEqual};if(er(e))return A(e.tag.tag.ref,`Tag ${e.$cstNode?.text} is not resolved`),{elementTag:e.tag.tag.$refText,isEqual:e.isEqual};if(en(e))return this.parseFqnRefExpr(e);N(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{Ea(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(on(e))return this.parseRelationExprWith(e);if(Ft(e))return this.parseRelationExprOrWhere(e);N(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(ht(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e[t.key]=n),e}if(ir(t)||ye(t)){if(t.key===`description`){let n=this.parseMarkdownOrString(t.value);return n&&(e.description=n),e}let n=removeIndent(a(t.value));return n&&(e[t.key]=n),e}if(Pn(t))return B(t.value)&&(e[t.key]=t.value),e;if(dn(t)){let n=Ve(t);return B(n)&&(e[t.key]=n),e}if(o(t))return B(t.value)&&(e[t.key]=t.value),e;if(Hn(t)){let n=t.value.view.ref?.name;return B(n)&&(e[t.key]=n),e}N(t)},{})}parseRelationExprOrWhere(e){if(n(e))return this.parseRelationExprWhere(e);if(Dt(e))return this.parseRelationExpr(e);N(e)}parseRelationExprWhere(e){A(!n(e.subject),`RelationExprWhere is not allowed as subject of RelationExprWhere`);let t=this.parseRelationExpr(e.subject),r=t.where?.expr??t,i=t.where?.condition,a=e.where?parseWhereClause(e.where):null,o;return o=a&&i?createBinaryOperator(`and`,i,a):a??i??{kind:{neq:`--always-true--`}},{where:{expr:r,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:N(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(!B(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(!B(n))continue;if(n in t.styles){this.logError(`Global style named "${n}" is already defined`,e,`globals`);continue}let r=this.parseGlobalStyleOrGroup(e);I(r,1)&&(t.styles[n]=r)}catch(t){this.logError(t,e,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,n){if(Jn(e)){let r=this.parseGlobalPredicateGroup(e);I(r,1)&&(n.predicates[t]=r);return}if(ln(e)){let r=this.parseGlobalDynamicPredicateGroup(e);I(r,1)&&(n.dynamicPredicates[t]=r);return}N(e)}parseGlobalPredicateGroup(e){return e.predicates.map(e=>this.parseViewRulePredicate(e))}parseGlobalDynamicPredicateGroup(e){return e.predicates.map(e=>this.parseDynamicViewIncludePredicate(e))}parseGlobalStyleOrGroup(e){if(In(e))return[this.parseViewRuleStyle(e)];if(_n(e))return e.styles.map(e=>this.parseViewRuleStyle(e));N(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(M(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=Gi.from(e.parseResult.value.models.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(Ee(r)){n.push(r);continue}if(Vn(r)){n.push(r);continue}if(r.body?.elements&&I(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(S(t)){e.c4Elements.push(this.parseElement(t));continue}if(Ee(t)){e.c4Relations.push(this.parseRelation(t));continue}if(an(t)){let n=this.parseExtendElement(t);n&&e.c4ExtendElements.push(n);continue}if(Vn(t)){let n=this.parseExtendRelation(t);n&&e.c4ExtendRelations.push(n);continue}N(t)}catch(e){this.logError(e,t,`model`)}}parseElement(e){let t=this.isValid,n=this.resolveFqn(e),r=M(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=W(e.body?.props??[],P(t),P(_e),U(e=>[e.key,e.value])),{title:f,...p}=this.parseBaseProps(d,{title:c,summary:l,technology:u});return wo({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&&Ta(n)&&!r)return null;let i=this.getAstNodePath(e);return wo({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);A(X.isModelRef(t)||X.isImportRef(t),`Source must be a model reference`),A(X.isModelRef(n)||X.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&&R(i??{})&&!o)return null;let s=(e.kind??e.dotKind?.kind)?.ref?.name,{title:c=``}=this.parseBaseProps({},{title:e.title});return wo({id:tr(`extend-relation`,X.flatten(t),X.flatten(n),s??`default`,c),astPath:a,metadata:i,tags:r,links:o})}_resolveRelationSource(e){if(L(e.source)){let t=this.parseFqnRef(e.source);return A(X.isModelRef(t)||X.isImportRef(t),`Relation source must be a model reference`),t}if(f(e.$container)||fr(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);A(X.isModelRef(r)||X.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=W(e.body?.props??[],P(ir),P(e=>B(e.value)),U(e=>[e.key,e.value])),u=W(e.body?.props??[],P(Hn),H(e=>e.value.view.ref?.name),P(B),ga()),{title:d=``,description:f,technology:p}=this.parseBaseProps(l,{title:e.title,description:e.description,technology:e.technology}),m=e.body?.props.find(bn);return wo({id:tr(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,...Ye(m?.props,t)})}}}function PredicatesParser(e){return class extends e{parsePredicate(e){return this.parseExpressionV2(e)}parseElementPredicate(e){if(Xt(e))return this.parseFqnExprWith(e);if(Ut(e))return this.parseFqnExprOrWhere(e);N(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(!B(r))continue;if(r in t.relationships){this.logError(`Relationship kind "${r}" is already defined`,e,`specification`);continue}let i=W(n.filter(vn)??[],P(e=>this.isValid(e)&&Ea(e.value)),U(e=>[e.key,removeIndent(a(e.value))]),Ma(z));t.relationships[r]={...i,...Ye(n.filter(Gn),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}B(n)&&(t.tags[n]={astPath:r,...i?{color:i}:{}})}catch(t){this.logError(t,e,`specification`)}let o=e.flatMap(e=>e.colors.filter(n));for(let{name:e,color:n}of o)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:Mi(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(!B(r))throw Error(`DeploymentNodeKind name is not resolved`);let i=this.parseTags(e),o=this.parseElementStyle(n.find(Me)),s=this.parseLinks(e),c=W(n.filter(Yn)??[],P(e=>this.isValid(e)),U(e=>[e.key,e.value])),l=this.parseBaseProps(c),u=removeIndent(a(c.notation));return{[r]:ea({...l,notation:u,tags:i??void 0,...s&&Bi.isNonEmptyArray(s)&&{links:s},style:o})}}}}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&&!R(t.folder.trim())?toSingleLine(t.folder):null;for(let i of t.views)try{if(!e(i))continue;switch(!0){case Oe(i):this.doc.c4Views.push(this.parseElementView(i,n));break;case Tn(i):this.doc.c4Views.push(this.parseDynamicElementView(i,n));break;case te(i):this.doc.c4Views.push(this.parseDeploymentView(i));break;default:N(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;A(n,`ElementView body is not defined`);let r=this.getAstNodePath(e),i=null;if(`viewOf`in e){let t=fn(e.viewOf),n=t&&zn(()=>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_`+tr(this.doc.uri.toString(),r,i??``);let{title:o=null,description:s=null}=this.parseBaseProps(W(n.props,P(e=>this.isValid(e)),P(Ce),U(e=>[e.key,e.value]))),c=this.convertTags(n),l=this.convertLinks(n),u={[Bi._type]:`element`,id:a,astPath:r,title:toSingleLine(o)??null,description:s,tags:c,links:j(l)?l:null,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseElementViewRule(e))],...i&&{viewOf:i}};if(Ar.writeId(e,u.id),`extends`in e){let t=e.extends.view.ref;return A(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(u,{extends:t.name})}return u}parseElementViewRule(e){if(ze(e))return this.parseViewRulePredicate(e);if(On(e))return this.parseViewRuleGlobalPredicateRef(e);if(fe(e))return this.parseViewRuleStyleOrGlobalRef(e);if(qe(e))return Le(e);if(wn(e))return this.parseViewRuleGroup(e);if(Ue(e))return this.parseViewRuleRank(e);N(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(Ze(e))return this.parseViewRuleStyle(e);if(s(e))return this.parseViewRuleGlobalStyle(e);N(e)}parseViewRuleGroup(e){let t=[];for(let n of e.groupRules)try{if(!this.isValid(n))continue;if(ze(n)){t.push(this.parseViewRulePredicate(n));continue}if(wn(n)){t.push(this.parseViewRuleGroup(n));continue}N(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=>Bi.ModelExpression.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>Bi.ModelExpression.isFqnExpr(e)),n=this.parseStyleProps(e.props.filter(Or)),r=removeIndent(a(e.props.find(ye)?.value));return{targets:t,style:n,...r&&{notation:r}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let n=e.body;A(n,`DynamicElementView body is not defined`);let r=this.isValid,i=n.props.filter(r),a=this.getAstNodePath(e),o=e.name;o||=`dynamic_`+tr(this.doc.uri.toString(),a);let{title:s=null,description:c=null}=this.parseBaseProps(W(i,P(Ce),U(e=>[e.key,e.value]))),l=this.convertTags(n),u=this.convertLinks(n);Ar.writeId(e,o);let d=ma(i,We)?.value;return{[Bi._type]:`dynamic`,id:o,astPath:a,title:toSingleLine(s)??null,description:c,tags:l,links:j(u)?u:null,variant:d,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseDynamicViewRule(e))],steps:this.tryMap(`views`,n.steps,e=>we(e)?this.parseDynamicParallelSteps(e):this.parseDynamicStep(e))}}parseDynamicViewRule(e){if(pe(e))return this.parseDynamicViewIncludePredicate(e);if(Qe(e))return this.parseViewRuleGlobalPredicateRef(e);if(fe(e))return this.parseViewRuleStyleOrGlobalRef(e);if(qe(e))return Le(e);N(e)}parseDynamicViewIncludePredicate(e){let t=[],n=e.exprs;for(;n;)this.tryParse(`views`,n.value,e=>{if(Wn(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 A(j(n),`Dynamic parallel steps must have at least one step`),{parallelId:t,__parallel:n}}parseDynamicStep(e){if(c(e))return this.parseDynamicStepSingle(e);let t=this.recursiveParseDynamicStepChain(e);return A(j(t),`Dynamic step chain must have at least one step`),{seriesId:pathInsideDynamicView(e),__series:t}}recursiveParseDynamicStepChain(e,t){if(c(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(!j(n)||!this.isValid(e))return[];let r=Aa(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=fn(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=fn(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 Hn(t):{let e=t.value.view.ref?.name;B(e)&&(n.navigateTo=e);break}case ir(t):case ye(t):if(L(t.value))if(t.key===`description`){let e=removeIndent(t.value);e&&(n.description=e)}else n[t.key]=removeIndent(a(t.value))??``;break;case ht(t):L(t.value)&&(n[t.key]=removeIndent(t.value));break;case Pn(t):L(t.value)&&(n[t.key]=t.value);break;case dn(t):{let e=Ve(t);L(e)&&(n[t.key]=e);break}case o(t):L(t.value)&&(n[t.key]=t.value);break;default:N(t)}}catch(e){this.logError(e,t,`views`)}return n}}}function pathInsideDynamicView(e){let t=e,n=[];for(;!Be(t);)Da(t.$containerIndex)&&n.unshift(`@${t.$containerIndex}`),n.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return n.join(``)}const es=W(BaseParser,ExpressionV2Parser,ImportsParser,ModelParser,DeploymentModelParser,DeploymentViewParser,PredicatesParser,SpecificationParser,ViewsParser,GlobalsParser);var DocumentParser=class extends es{};const ts=b.getChild(`parser`),isError=e=>e.severity===Va.Error;var LikeC4ModelParser=class{cachedParsers=new Ti(e=>this.createParser(e));constructor(e){this.services=e,e.shared.workspace.DocumentBuilder.onDocumentPhase(w.Linked,async e=>{this.cachedParsers.has(e)&&(ts.trace(`Linked: clear cached parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:vi.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(w.Linked,async t=>{for(let n of t)if(!e.shared.workspace.ProjectsManager.isExcluded(n))try{this.parse(n)}catch(e){_(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(w.Validated,async e=>{e.diagnostics?.some(isError)&&this.cachedParsers.has(e)&&(ts.trace(`Validated: clear cached parser {projectId} document {doc} because of errors`,{projectId:e.likec4ProjectId,doc:vi.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){ki(Sr(e),`Document ${e.uri.toString()} is not a LikeC4 document`);let t=this.services.shared.workspace.ProjectsManager.getProject(e),n=vi.relative(t.folderUri,e.uri);e.likec4ProjectId?ts.trace(`create parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:n}):ts.debug(`create parser for document without project {doc}`,{doc:e.uri.fsPath}),e.state<w.Linked&&ts.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 D(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 si{runConverter(e,t,n){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),yi.convertString(t)):super.runConverter(e,t,n)}};const{findNodeForKeyword:ns}=T,asViewStyleRule=(e,t,n=0)=>{let r=n>0?` `.repeat(n):``;return[r+`style ${e} {`,...pa(t).map(([e,t])=>r+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),r+`}`]},isMatchingViewRule=(e,t)=>n=>{if(!Ze(n)&&!ae(n))return!1;let r=n.targets.value;if(!r||B(n.targets.prev)||r.$type!==`FqnRefExpr`||B(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}){A(n.body,`View ${t.id} has no body`);let a=n.$cstNode;A(a,`viewCstNode`);let o=Aa(n.body.rules)?.$cstNode?.range.end??n.body.$cstNode?.range.end;A(o,`insertPos is not defined`);let s=a.range.start.character+2,c=e.likec4.FqnIndex,l=P(n.body.rules,e=>Ze(e)||ae(e)),u=t[Yi]===`element`?t.viewOf??null:null,d=[],f=[];r.forEach(e=>{let t=ha(l,isMatchingViewRule(e,c)),n=u&&ta(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(Ga.insert(o,`
26
+ `).join(` `)}}function removeIndent(e){if(e!=null)switch(!0){case Ea(e):return To(e).trim();case Le(e)&&Ea(e.markdown):return{md:To(e.markdown).trim()};case Le(e)&&Ea(e.text):return{txt:To(e.text).trim()};case Le(e):return{txt:``};default:return}}var BaseParser=class{isValid;docUri;docPathInProject;constructor(e,t,n){this.services=e,this.doc=t,this.project=n,this.isValid=checksFromDiagnostics(t).isValid,this.docUri=t.uri.toString(),this.docPathInProject=D.relative(n.folderUri,t.uri)}logError(e,t,n){let r=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(Pi(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`?Zo.getChild(n).debug(r):Zo.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 I(t,t=>this.tryParse(e,t,n)??[])}resolveFqn(e){if(st(e)){let t=v(e),n=this.resolveFqn(N(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,n),Vi(t,n)}return an(e)?_r(e.element):tt(e)?_r(e.deploymentNode):Vt(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)||z(e.props))return;let extractValues=e=>{if(Le(e)){let t=removeIndent(e);if(!t)return[];if(typeof t==`string`)return V(t)?[t]:[];{let e=t.md||t.txt;return V(e)?[e]:[]}}else if(Ve(e))return e.values.map(e=>removeIndent(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(V);return[]},t=G(e.props,I(e=>e.value?extractValues(e.value).map(t=>[e.key,t]):[[e.key,String(e.boolValue)]]),F(([e,t])=>V(t)));if(z(t))return;let n=G(t,_a(([e])=>e),Oa(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 z(r)?void 0:r}parseMarkdownOrString(e){if(Le(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=>N(e.tag.ref,`Tag reference is not resolved`).name).filter(V)),t=t.prev;return M(n)?Ia(n):null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!e?.props||e.props.length===0)return;let t=this.tryMap(`base`,F(e.props,Sn),e=>{let t=e.value;if(Sa(t))return;let n=V(e.title)?toSingleLine(e.title):void 0,r=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return Zi({url:t,title:n,relative:r&&r!==t?r:void 0})});return M(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&&Wa(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&&Ga(n):return Ka(this.doc.uri.toString(),`../`,n);case n&&Ua(n):return qa(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){Zo.warn(`Image alias "${n}" not found in project configuration`);return}let a=r?qa(i,r):i;return qa(this.project.folderUri.toString(),a)}parseColorLiteral(e){if(this.isValid(e)){if(zt(e))return`#${e.hex}`;if(Xn(e)){let t=wa(e.alpha)?e.alpha:void 0;return Ea(e.alpha)&&(t=Tn(e.alpha)/100),t===void 0?`rgb(${e.red},${e.green},${e.blue})`:`rgba(${e.red},${e.green},${e.blue},${t})`}P(e)}}parseElementStyle(e){if(!e)return{};if(ba(e)){let t=this.parseStyleProps(e.find(je)?.props);try{let n=this.parseIconProperty(e.find(qt));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 gr(n):V(n.value)&&(t.border=n.value);break;case dn(n):{let e=Je(n);V(e)&&(t.color=e);break}case or(n):V(n.value)&&(t.shape=n.value);break;case qt(n):{let e=this.parseIconProperty(n);V(e)&&(t.icon=e);break}case vr(n):{let e=Je(n);V(e)&&(t.iconColor=e);break}case Tr(n):V(n.value)&&(t.iconSize=a(n));break;case kr(n):V(n.value)&&(t.iconPosition=ne(n));break;case Ct(n):t.opacity=We(n);break;case u(n):t.multiple=xa(n.value)?n.value:!1;break;case Zt(n):V(n.value)&&(t.size=a(n));break;case ke(n):V(n.value)&&(t.padding=a(n));break;case ft(n):V(n.value)&&(t.textSize=a(n));break;default:P(n)}}catch(e){this.logError(e,n)}return Zi(t)}parseBaseProps(e,t){let n=removeIndent(t?.title??y(e.title)),r=t?.description?{txt:removeIndent(t.description)}:this.parseMarkdownOrString(e.description);return Zi({title:n,summary:t?.summary?{txt:removeIndent(t.summary)}:this.parseMarkdownOrString(e.summary),description:r,technology:toSingleLine(t?.technology)??removeIndent(y(e.technology))})}};function*streamDeploymentModel(e){let t=Hi.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(Dr(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 Dr(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case _(t):e.c4Deployments.push(this.parseDeployedInstance(t));break;case x(t):e.c4Deployments.push(this.parseDeploymentNode(t));break;case tt(t):{let n=this.parseExtendDeployment(t);n&&e.c4ExtendDeployments.push(n);break}default:P(t)}}catch(e){this.logError(e,t,`deployment`)}}parseDeploymentNode(e){let t=this.isValid,n=this.resolveFqn(e),r=N(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=G(e.body?.props??[],F(t),F(_e),W(e=>[e.key,e.value])),{title:l,...u}=this.parseBaseProps(c,{title:e.title,summary:e.summary});return Zi({id:n,kind:r,title:l??oa(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);j(A.isModelRef(r)||A.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=G(e.body?.props??[],F(t),F(_e),W(e=>[e.key,e.value])),c=this.parseBaseProps(s,{title:e.title,summary:e.summary});return Zi({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&&z(n??{})&&!r?null:Zi({id:this.resolveFqn(e),astPath:this.getAstNodePath(e),metadata:n,tags:t,links:r})}_resolveDeploymentRelationSource(e){if(R(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);j(A.isDeploymentRef(r),`Invalid source for deployment relation`);let i=this.parseFqnRef(e.target);j(A.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=G(e.body?.props??[],F(nr),F(e=>V(e.value)),W(e=>[e.key,e.value])),u=G(e.body?.props??[],F(Bn),pa())?.value.view.ref?.name,d=this.parseBaseProps(l,{title:e.title}),f=e.body?.props.find(bn);return Zi({id:$n(`deployment`,this.docUri,n,r.deployment,i.deployment),source:r,target:i,...d,metadata:c,kind:s,tags:a,links:o,...ue(f?.props,t),navigateTo:u,astPath:n})}}}function DeploymentViewParser(e){return class extends e{parseDeploymentView(e){let t=e.body;j(t,`DynamicElementView body is not defined`);let n=t.props.filter(this.isValid),r=this.getAstNodePath(e),i=e.name;i||=`deployment_`+$n(this.doc.uri.toString(),r);let{title:a=null,description:o=null}=this.parseBaseProps(G(n,F(Ce),W(e=>[e.key,e.value]))),s=this.convertTags(t),c=this.convertLinks(t);return Kt.writeId(e,i),{[Li._type]:`deployment`,id:i,astPath:r,title:toSingleLine(a)??null,description:o,tags:s,links:M(c)?c:null,rules:this.tryMap(`deployment`,t.rules,e=>this.parseDeploymentViewRule(e))}}parseDeploymentViewRule(e){if(le(e))return this.parseDeploymentViewRulePredicate(e);if(Ke(e))return Be(e);if(ae(e))return this.parseDeploymentViewRuleStyle(e);P(e)}parseDeploymentViewRulePredicate(e){let t=[],n=e.expr;for(;n;){try{let e=n.value;Ca(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(Er)),n=removeIndent(y(e.props.find(ye)?.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!It(e)&&!r(e)&&!et(e)?null:e.participant}function parseWhereClause(e){switch(!0){case lr(e):{let t=e.value.tag.ref?.name,n=parseParticipant(e);j(t,`Expected tag name`);let r={tag:parseEquals(e,t)};return n?{participant:n,operator:r}:r}case wt(e):{let t=e.value?.ref?.name,n=parseParticipant(e);j(t,`Expected kind name`);let r={kind:parseEquals(e,t)};return n?{participant:n,operator:r}:r}case ge(e):{let t=e.key,n=parseParticipant(e);j(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 be(e)||Ot(e):return{not:parseWhereClause(e.value)};case Pe(e):{let t=parseWhereClause(e.left),n=parseWhereClause(e.right);return createBinaryOperator(e.operator.toLowerCase(),t,n)}default:P(e)}}function createBinaryOperator(e,t,n){if(n===null)return t;switch(e){case`and`:{let e=[$i(t)?t.and:t,$i(n)?n.and:n].flat();return j(M(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[ia(t)?t.or:t,ia(n)?n.or:n].flat();return j(M(e),`Expected non-empty array`),{or:e}}default:P(e)}}function ExpressionV2Parser(e){return class extends e{parseFqnRef(e){let t=N(e.value?.ref,()=>`Element "${e.$cstNode?.text}" is not resolved`);if(st(t)){let e={project:v(t),model:this.resolveFqn(N(t.imported.ref,`Imported "${t.$cstNode?.text}" is not resolved`))};return this.doc.c4Imports.set(e.project,e.model),e}if(S(t)){let n=Nn(e);if(n){let e={project:v(n),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let r=gn(e);return r?{deployment:this.resolveFqn(r),element:this.resolveFqn(t)}:{model:this.resolveFqn(t)}}if(Vt(t))return{deployment:this.resolveFqn(t)};P(t)}parseExpressionV2(e){if(Hn(e))return this.parseFqnExprOrWith(e);if($e(e))return this.parseRelationExprOrWith(e);P(e)}parseFqnExprOrWith(e){if(Xt(e))return this.parseFqnExprWith(e);if(Ut(e))return this.parseFqnExprOrWhere(e);P(e)}parseFqnExprWith(e){let t=this.parseFqnExprOrWhere(e.subject);return(e.custom?.props??[]).reduce((e,t)=>{if(!this.isValid(t))return e;if(yt(t)){let n=t.value.view.$refText;return V(n)&&(e.custom.navigateTo=n),e}if(ht(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom[t.key]=n),e}if(_e(t)){if(t.key===`description`||t.key===`summary`){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom.description=n),e}let n=removeIndent(y(t.value));return n&&(e.custom[t.key]=n),e}if(qt(t)){let n=this.parseIconProperty(t);return R(n)&&(e.custom[t.key]=n),e}if(dn(t)){let n=Je(t);return R(n)&&(e.custom[t.key]=n),e}if(or(t)||gr(t))return R(t.value)&&(e.custom[t.key]=t.value),e;if(Ct(t))return R(t.value)&&(e.custom[t.key]=We(t)),e;if(vr(t)){let n=Je(t);return R(n)&&(e.custom[t.key]=n),e}if(ye(t)){let n=V(t.value)?removeIndent(y(t.value)):void 0;return n&&(e.custom[t.key]=n),e}if(u(t))return xa(t.value)&&(e.custom[t.key]=t.value),e;if(Zt(t)||ft(t)||ke(t)||Tr(t))return V(t.value)&&(e.custom[t.key]=a(t)),e;if(kr(t))return V(t.value)&&(e.custom[t.key]=t.value),e;P(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(ar(e))return this.parseFqnExprWhere(e);if(yn(e))return this.parseFqnExpr(e);P(e)}parseFqnExprWhere(e){return j(!ar(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(Rn(e))return{wildcard:!0};if(xe(e))return j(e.kind?.ref,`ElementKind "${e.$cstNode?.text}" is not resolved`),{elementKind:e.kind.ref.name,isEqual:e.isEqual};if(Qn(e))return j(e.tag.tag.ref,`Tag ${e.$cstNode?.text} is not resolved`),{elementTag:e.tag.tag.$refText,isEqual:e.isEqual};if(en(e))return this.parseFqnRefExpr(e);P(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{Ca(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(on(e))return this.parseRelationExprWith(e);if(Ft(e))return this.parseRelationExprOrWhere(e);P(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(ht(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e[t.key]=n),e}if(nr(t)||ye(t)){if(t.key===`description`){let n=this.parseMarkdownOrString(t.value);return n&&(e.description=n),e}let n=removeIndent(y(t.value));return n&&(e[t.key]=n),e}if(Mn(t))return V(t.value)&&(e[t.key]=t.value),e;if(dn(t)){let n=Je(t);return V(n)&&(e[t.key]=n),e}if(o(t))return V(t.value)&&(e[t.key]=t.value),e;if(Bn(t)){let n=t.value.view.ref?.name;return V(n)&&(e[t.key]=n),e}P(t)},{})}parseRelationExprOrWhere(e){if(n(e))return this.parseRelationExprWhere(e);if(Dt(e))return this.parseRelationExpr(e);P(e)}parseRelationExprWhere(e){j(!n(e.subject),`RelationExprWhere is not allowed as subject of RelationExprWhere`);let t=this.parseRelationExpr(e.subject),r=t.where?.expr??t,i=t.where?.condition,a=e.where?parseWhereClause(e.where):null,o;return o=a&&i?createBinaryOperator(`and`,i,a):a??i??{kind:{neq:`--always-true--`}},{where:{expr:r,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:P(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(!V(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(!V(n))continue;if(n in t.styles){this.logError(`Global style named "${n}" is already defined`,e,`globals`);continue}let r=this.parseGlobalStyleOrGroup(e);L(r,1)&&(t.styles[n]=r)}catch(t){this.logError(t,e,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,n){if(Kn(e)){let r=this.parseGlobalPredicateGroup(e);L(r,1)&&(n.predicates[t]=r);return}if(ln(e)){let r=this.parseGlobalDynamicPredicateGroup(e);L(r,1)&&(n.dynamicPredicates[t]=r);return}P(e)}parseGlobalPredicateGroup(e){return e.predicates.map(e=>this.parseViewRulePredicate(e))}parseGlobalDynamicPredicateGroup(e){return e.predicates.map(e=>this.parseDynamicViewIncludePredicate(e))}parseGlobalStyleOrGroup(e){if(Pn(e))return[this.parseViewRuleStyle(e)];if(_n(e))return e.styles.map(e=>this.parseViewRuleStyle(e));P(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(N(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=Hi.from(e.parseResult.value.models.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(Te(r)){n.push(r);continue}if(zn(r)){n.push(r);continue}if(r.body?.elements&&L(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(S(t)){e.c4Elements.push(this.parseElement(t));continue}if(Te(t)){e.c4Relations.push(this.parseRelation(t));continue}if(an(t)){let n=this.parseExtendElement(t);n&&e.c4ExtendElements.push(n);continue}if(zn(t)){let n=this.parseExtendRelation(t);n&&e.c4ExtendRelations.push(n);continue}P(t)}catch(e){this.logError(e,t,`model`)}}parseElement(e){let t=this.isValid,n=this.resolveFqn(e),r=N(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=G(e.body?.props??[],F(t),F(_e),W(e=>[e.key,e.value])),{title:f,...p}=this.parseBaseProps(d,{title:c,summary:l,technology:u});return Co({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&&Sa(n)&&!r)return null;let i=this.getAstNodePath(e);return Co({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);j(Y.isModelRef(t)||Y.isImportRef(t),`Source must be a model reference`),j(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&&z(i??{})&&!o)return null;let s=(e.kind??e.dotKind?.kind)?.ref?.name,{title:c=``}=this.parseBaseProps({},{title:e.title});return Co({id:$n(`extend-relation`,Y.flatten(t),Y.flatten(n),s??`default`,c),astPath:a,metadata:i,tags:r,links:o})}_resolveRelationSource(e){if(R(e.source)){let t=this.parseFqnRef(e.source);return j(Y.isModelRef(t)||Y.isImportRef(t),`Relation source must be a model reference`),t}if(f(e.$container)||ur(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);j(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=G(e.body?.props??[],F(nr),F(e=>V(e.value)),W(e=>[e.key,e.value])),u=G(e.body?.props??[],F(Bn),U(e=>e.value.view.ref?.name),F(V),pa()),{title:d=``,description:f,technology:p}=this.parseBaseProps(l,{title:e.title,description:e.description,technology:e.technology}),m=e.body?.props.find(bn);return Co({id:$n(this.docUri,c,Y.flatten(n),Y.flatten(r)),astPath:c,source:n,target:r,title:d,metadata:s,kind:o,tags:i,links:a,navigateTo:u,description:f,technology:p,...ue(m?.props,t)})}}}function PredicatesParser(e){return class extends e{parsePredicate(e){return this.parseExpressionV2(e)}parseElementPredicate(e){if(Xt(e))return this.parseFqnExprWith(e);if(Ut(e))return this.parseFqnExprOrWhere(e);P(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(!V(r))continue;if(r in t.relationships){this.logError(`Relationship kind "${r}" is already defined`,e,`specification`);continue}let i=G(n.filter(vn)??[],F(e=>this.isValid(e)&&Ca(e.value)),W(e=>[e.key,removeIndent(y(e.value))]),ka(B));t.relationships[r]={...i,...ue(n.filter(Un),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}V(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:oi(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(!V(r))throw Error(`DeploymentNodeKind name is not resolved`);let i=this.parseTags(e),a=this.parseElementStyle(n.find(je)),o=this.parseLinks(e),s=G(n.filter(qn)??[],F(e=>this.isValid(e)),W(e=>[e.key,e.value])),c=this.parseBaseProps(s),l=removeIndent(y(s.notation));return{[r]:Zi({...c,notation:l,tags:i??void 0,...o&&Li.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&&!z(t.folder.trim())?toSingleLine(t.folder):null;for(let i of t.views)try{if(!e(i))continue;switch(!0){case De(i):this.doc.c4Views.push(this.parseElementView(i,n));break;case wn(i):this.doc.c4Views.push(this.parseDynamicElementView(i,n));break;case te(i):this.doc.c4Views.push(this.parseDeploymentView(i));break;default:P(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;j(n,`ElementView body is not defined`);let r=this.getAstNodePath(e),i=null;if(`viewOf`in e){let t=Rt(e.viewOf),n=t&&Ln(()=>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_`+$n(this.doc.uri.toString(),r,i??``);let{title:o=null,description:s=null}=this.parseBaseProps(G(n.props,F(e=>this.isValid(e)),F(Ce),W(e=>[e.key,e.value]))),c=this.convertTags(n),l=this.convertLinks(n),u={[Li._type]:`element`,id:a,astPath:r,title:toSingleLine(o)??null,description:s,tags:c,links:M(l)?l:null,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseElementViewRule(e))],...i&&{viewOf:i}};if(Kt.writeId(e,u.id),`extends`in e){let t=e.extends.view.ref;return j(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(u,{extends:t.name})}return u}parseElementViewRule(e){if(Re(e))return this.parseViewRulePredicate(e);if(Dn(e))return this.parseViewRuleGlobalPredicateRef(e);if(fe(e))return this.parseViewRuleStyleOrGlobalRef(e);if(Ke(e))return Be(e);if(Cn(e))return this.parseViewRuleGroup(e);if(He(e))return this.parseViewRuleRank(e);P(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(Xe(e))return this.parseViewRuleStyle(e);if(s(e))return this.parseViewRuleGlobalStyle(e);P(e)}parseViewRuleGroup(e){let t=[];for(let n of e.groupRules)try{if(!this.isValid(n))continue;if(Re(n)){t.push(this.parseViewRulePredicate(n));continue}if(Cn(n)){t.push(this.parseViewRuleGroup(n));continue}P(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=>Li.ModelExpression.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>Li.ModelExpression.isFqnExpr(e)),n=this.parseStyleProps(e.props.filter(Er)),r=removeIndent(y(e.props.find(ye)?.value));return{targets:t,style:n,...r&&{notation:r}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let n=e.body;j(n,`DynamicElementView body is not defined`);let r=this.isValid,i=n.props.filter(r),a=this.getAstNodePath(e),o=e.name;o||=`dynamic_`+$n(this.doc.uri.toString(),a);let{title:s=null,description:c=null}=this.parseBaseProps(G(i,F(Ce),W(e=>[e.key,e.value]))),l=this.convertTags(n),u=this.convertLinks(n);Kt.writeId(e,o);let d=da(i,Ue)?.value;return{[Li._type]:`dynamic`,id:o,astPath:a,title:toSingleLine(s)??null,description:c,tags:l,links:M(u)?u:null,variant:d,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseDynamicViewRule(e))],steps:this.tryMap(`views`,n.steps,e=>we(e)?this.parseDynamicParallelSteps(e):this.parseDynamicStep(e))}}parseDynamicViewRule(e){if(pe(e))return this.parseDynamicViewIncludePredicate(e);if(Ze(e))return this.parseViewRuleGlobalPredicateRef(e);if(fe(e))return this.parseViewRuleStyleOrGlobalRef(e);if(Ke(e))return Be(e);P(e)}parseDynamicViewIncludePredicate(e){let t=[],n=e.exprs;for(;n;)this.tryParse(`views`,n.value,e=>{if(Hn(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 j(M(n),`Dynamic parallel steps must have at least one step`),{parallelId:t,__parallel:n}}parseDynamicStep(e){if(c(e))return this.parseDynamicStepSingle(e);let t=this.recursiveParseDynamicStepChain(e);return j(M(t),`Dynamic step chain must have at least one step`),{seriesId:pathInsideDynamicView(e),__series:t}}recursiveParseDynamicStepChain(e,t){if(c(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(!M(n)||!this.isValid(e))return[];let r=Da(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=Rt(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=Rt(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 Bn(t):{let e=t.value.view.ref?.name;V(e)&&(n.navigateTo=e);break}case nr(t):case ye(t):if(R(t.value))if(t.key===`description`){let e=removeIndent(t.value);e&&(n.description=e)}else n[t.key]=removeIndent(y(t.value))??``;break;case ht(t):R(t.value)&&(n[t.key]=removeIndent(t.value));break;case Mn(t):R(t.value)&&(n[t.key]=t.value);break;case dn(t):{let e=Je(t);R(e)&&(n[t.key]=e);break}case o(t):R(t.value)&&(n[t.key]=t.value);break;default:P(t)}}catch(e){this.logError(e,t,`views`)}return n}}}function pathInsideDynamicView(e){let t=e,n=[];for(;!ze(t);)wa(t.$containerIndex)&&n.unshift(`@${t.$containerIndex}`),n.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return n.join(``)}const Qo=G(BaseParser,ExpressionV2Parser,ImportsParser,ModelParser,DeploymentModelParser,DeploymentViewParser,PredicatesParser,SpecificationParser,ViewsParser,GlobalsParser);var DocumentParser=class extends Qo{};const $o=b.getChild(`parser`),isError=e=>e.severity===Ra.Error;var LikeC4ModelParser=class{cachedParsers=new $r(e=>this.createParser(e));constructor(e){this.services=e,e.shared.workspace.DocumentBuilder.onDocumentPhase(T.Linked,async e=>{this.cachedParsers.has(e)&&($o.trace(`Linked: clear cached parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:D.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(T.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(T.Validated,async e=>{e.diagnostics?.some(isError)&&this.cachedParsers.has(e)&&($o.trace(`Validated: clear cached parser {projectId} document {doc} because of errors`,{projectId:e.likec4ProjectId,doc:D.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){ri(ut(e),`Document ${e.uri.toString()} is not a LikeC4 document`);let t=this.services.shared.workspace.ProjectsManager.getProject(e),n=D.relative(t.folderUri,e.uri);e.likec4ProjectId?$o.trace(`create parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:n}):$o.debug(`create parser for document without project {doc}`,{doc:e.uri.fsPath}),e.state<T.Linked&&$o.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 C(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 yi{runConverter(e,t,n){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),Ai.convertString(t)):super.runConverter(e,t,n)}};const{findNodeForKeyword:es}=E,asViewStyleRule=(e,t,n=0)=>{let r=n>0?` `.repeat(n):``;return[r+`style ${e} {`,...ua(t).map(([e,t])=>r+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),r+`}`]},isMatchingViewRule=(e,t)=>n=>{if(!Xe(n)&&!ae(n))return!1;let r=n.targets.value;if(!r||V(n.targets.prev)||r.$type!==`FqnRefExpr`||V(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}){j(n.body,`View ${t.id} has no body`);let a=n.$cstNode;j(a,`viewCstNode`);let o=Da(n.body.rules)?.$cstNode?.range.end??n.body.$cstNode?.range.end;j(o,`insertPos is not defined`);let s=a.range.start.character+2,c=e.likec4.FqnIndex,l=F(n.body.rules,e=>Xe(e)||ae(e)),u=t[Ki]===`element`?t.viewOf??null:null,d=[],f=[];r.forEach(e=>{let t=fa(l,isMatchingViewRule(e,c)),n=u&&Qi(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(Ha.insert(o,`
27
27
  `+e.join(`
28
- `))),p.start={line:o.line+1,character:s},p.end={line:o.line+e.length,character:Aa(e)?.length??0}}if(d.length>0)for(let{rule:e}of d){let t=e.$cstNode;A(t,`RuleCstNode not found`);for(let[n,r]of pa(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(Ga.replace({start:e,end:t},n+` `+i));continue}let o=ns(t,`{`)?.range.end;A(o,`Opening brace not found`);let s=` `.repeat(t.range.start.character)+` `,c=s+n+` `+i;m.push(Ga.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:rs}=T;function changeViewLayout(e,{view:t,viewAst:n,layout:r}){A(n.body,`View ${t.id} has no body`);let i=n.$cstNode;A(i,`viewCstNode`);let a=Sn(r.direction),o=ha(n.body.rules,qe),s=`autoLayout ${a}`;if(Da(r.rankSep)&&(s+=` ${r.rankSep}`,Da(r.nodeSep)&&(s+=` ${r.nodeSep}`)),o&&o.$cstNode)return Ga.replace(o.$cstNode.range,s);let c=rs(n.body.$cstNode,`}`)?.range.start;A(c,`Closing brace not found`);let l=`\t${s}\n\t`;return Ga.insert(c,l)}const is=b.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);is.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 A(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)};A(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=O(zi(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return is.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:N(t)}}},LikeC4NameProvider=class extends ii{constructor(e){super(),this.services=e}getNameStrict(e){return M(this.getName(e),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(e)}`)}getName(e){if(wi(e))return e.name;if(g(e))return e.imported.$refText;if(v(e))return e.target.modelElement.value.$refText}getNameNode(e){if(wi(e))return super.getNameNode(e);if(g(e))return e.imported.$refNode;if(v(e))return e.target.modelElement.value.$refNode}};function uniqueDescriptions(e){return W(e,ba(e=>`${e.type}.${e.name}`),pa(),F(([e,t])=>t.length===1?t:[]))}var LikeC4ScopeComputation=class extends ai{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){_(e)}return n}exportViews(e,t,n){let r=e?.flatMap(e=>e.views);if(!(z(r)||r.length===0))for(let e of r)try{B(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){_(e)}}exportGlobals(e,t,n){if(!(z(e)||e.length===0)){for(let r of e.flatMap(e=>e.predicates))try{let e=r;B(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){_(e)}for(let r of e.flatMap(e=>e.styles))try{let e=r.id;B(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){_(e)}}}exportModel(e,t,n){if(!(z(e)||e.length===0))for(let r of e.flatMap(e=>e.elements))try{S(r)&&B(r.name)&&t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){_(e)}}exportLibrary(e,t,n){if(!z(e))try{for(let r of e.flatMap(e=>e.icons))t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){_(e)}}exportSpecification(e,t,n){if(!(z(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 tn(r):case un(r):B(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case Bt(r):B(r.tag.name)&&t.push(this.descriptions.createDescription(r.tag,r.tag.name,n));continue;case Ln(r):B(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case _r(r):B(r.name.name)&&t.push(this.descriptions.createDescription(r.name,r.name.name,n));continue;default:N(r)}}catch(e){_(e)}}exportDeployments(e,t,n){let r=e?.flatMap(e=>e.elements);if(!(z(r)||r.length===0))for(let e of r)try{x(e)&&B(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){_(e)}}computeLocalScopes(e,t){return new Promise(t=>{let n=e.parseResult.value,r=[],i=new mi;for(let t of n.models)try{r.push(...this.processContainer(t,i,e))}catch(e){_(e)}for(let t of n.deployments)try{r.push(...this.processDeployments(t,i,e))}catch(e){_(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){_(e)}uniqueDescriptions(r).forEach(e=>{i.add(n,e)}),t(i)})}processContainer(e,t,n){let r=new mi,i=[];for(let a of e.elements){if(Ee(a))continue;let e;if(S(a)?(B(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)))):an(a)&&(e=a.body),e&&e.elements.length>0)try{i.push(...this.processContainer(e,t,n))}catch(e){_(e)}}i.length&&W(i,P(e=>!r.has(e.name)),ba(e=>e.name),va((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 mi,i=[];for(let a of e.elements){if(kr(a))continue;let e=a.body;if(!nt(a)){let i=this.nameProvider.getName(a);if(B(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){_(e)}}i.length&&W(i,P(e=>!r.has(e.name)),ba(e=>e.name),va((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}};const{getDocument:as}=C;var LikeC4ScopeProvider=class extends oi{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=y(e.container),n=this.reflection.getReferenceType(e);try{let r=e.container;if(gr(r))return new hi(this.streamForFqnRef(t,r,e));if(Mr(r))return this.getScopeForStrictFqnRef(t,r,e);if(n!==ve)return this.getProjectScope(t,n,e);if(g(r)){let e=y(r);return new hi(this.fqnIndex.rootElements(e))}if(xr(r)&&e.property===`el`){let i=r.parent;return i?new hi(this.fqnIndex.directChildrenOf(t,Rt(i))):this.getProjectScope(t,n,e)}return new hi(E(this.computeScope(t,e)))}catch(r){return _(r),this.getProjectScope(t,n,e)}}catch(e){return _(e),li}}*genUniqueDescedants(e){if(!e)return;let t=y(e);if(S(e)){let n=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,n);return}if(x(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(fn(e))}*genScopeElementView({viewOf:e,extends:t}){if(e){e.modelElement.value.$nodeDescription&&(yield e.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(fn(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 hi(this.deploymentsIndex.directChildrenOf(e,Rt(r)).filter(e=>this.reflection.isSubtype(e.type,l))):this.getProjectScope(e,l,n)}*genScopeExtendDeployment({deploymentNode:e}){e.value.$nodeDescription&&(yield e.value.$nodeDescription);let t=e.value.ref;t&&x(t)&&(yield*this.genUniqueDescedants(t))}streamForFqnRef(e,t,n){let r=t.parent;if(!r)return E(this.genScopeForParentlessFqnRef(e,t,n));let i=r.value.ref;if(!i)return ui;if(g(i))return E(this.genUniqueDescedants(i.imported.ref));if(x(i))return E(this.genUniqueDescedants(i));if(v(i)){let e=i.target.modelElement.value.ref,t=g(e)?e.imported.ref:S(e)?e:void 0;return E(this.genUniqueDescedants(t))}return S(i)?E(this.genUniqueDescedants(i)):N(i)}*genScopeForParentlessFqnRef(e,t,n){C.hasContainerOfType(t,Tt)||p(t)?yield*this.computeScope(e,n,ve):st(t)?(yield*this.computeScope(e,n,ve),yield*this.computeScope(e,n,l),yield*this.computeScope(e,n,rt)):(yield*this.computeScope(e,n,l),yield*this.computeScope(e,n,rt),C.hasContainerOfType(t,Tr)&&(yield*this.computeScope(e,n,ve)));let r=as(t).precomputedScopes;r&&(yield*r.values().filter(e=>this.reflection.isSubtype(e.type,At)))}*computeScope(e,t,n=this.reflection.getReferenceType(t)){let r=this.reflection.isSubtype(n,ve),a=this.reflection.isSubtype(n,Pr),o=as(t.container).precomputedScopes;if(!o){yield*this.getProjectScope(e,n,t).getAllElements();return}let byReferenceType=e=>this.reflection.isSubtype(e.type,n),s=t.container;for(;s;){let e=o.get(s).filter(byReferenceType);e.length>0&&(yield*e),a&&i(s)&&(yield*this.genScopeExtendDeployment(s.$container)),r&&fr(s)&&(yield*this.genScopeExtendElement(s.$container)),r&&Nt(s)&&(yield*this.genScopeElementView(s.$container)),s=s.$container}yield*this.getProjectScope(e,n,t).getAllElements()}getProjectScope(e,t,n){return t===Et?super.getGlobalScope(t,n):this.globalScopeCache.get(`${e}::${t}`,()=>new pi(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===Et)return super.getGlobalScope(e,t);let n=y(t.container);return this.getProjectScope(n,e,t)}};const $=b.getChild(`rpc`);var Rpc=class extends nr{constructor(e){super(),this.services=e}init=Na(()=>{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(zr.type,{projectId:t}).catch(e=>{$.warn(`[ServerRpc] error sending onDidChangeModel for project {project}`,{error:e,project:t})})},a=ya(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=ya(t=>{t>1?$.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:$.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(Br.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(Ur.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===J.EMPTY?{model:null}:{model:a.$data}}),e.onNotification(Vr.type,async e=>{let t=_i.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(Wr.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:Sa(i,e=>e.id)}}}),e.onRequest(Xr.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(ei.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(Gr.req,async()=>($.debug`received request ${`FetchProjects`}`,{projects:ja(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:H(e,e=>e.uri.toString())}})})),e.onRequest($r.req,async e=>{$.debug`received request ${`ReloadProjects`}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.reloadProjects(e)}),e.onRequest(Qr.req,async(e,t)=>{$.debug`received request ${`RegisterProject`}`,n.ManualLayouts.clearCaches();let r;return r=`configUri`in e?await n.ProjectsManager.registerConfigFile(_i.parse(e.configUri),t):await n.ProjectsManager.registerProject(e,t),{id:r.id}}),e.onRequest(Jr.req,async e=>{$.debug`received request ${`FetchViewsFromAllProjects`}`;let r=[];for(let i of n.ProjectsManager.all){await Si(e);try{let n=await t.Views.computedViews(i,e);r.push(...W(n,H(e=>({id:e.id,title:e.title??e.id,projectId:i})),Ra((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(Lr.req,async({docs:t},n)=>{let a=t.map(e=>_i.parse(e)),o=r.userDocuments.map(e=>e.uri).filter(e=>!a.some(t=>vi.equals(t,e))).toArray();$.debug(`[ServerRpc] received request to build:
28
+ `))),p.start={line:o.line+1,character:s},p.end={line:o.line+e.length,character:Da(e)?.length??0}}if(d.length>0)for(let{rule:e}of d){let t=e.$cstNode;j(t,`RuleCstNode not found`);for(let[n,r]of ua(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(Ha.replace({start:e,end:t},n+` `+i));continue}let o=es(t,`{`)?.range.end;j(o,`Opening brace not found`);let s=` `.repeat(t.range.start.character)+` `,c=s+n+` `+i;m.push(Ha.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:ts}=E;function changeViewLayout(e,{view:t,viewAst:n,layout:r}){j(n.body,`View ${t.id} has no body`);let i=n.$cstNode;j(i,`viewCstNode`);let a=Ie(r.direction),o=fa(n.body.rules,Ke),s=`autoLayout ${a}`;if(wa(r.rankSep)&&(s+=` ${r.rankSep}`,wa(r.nodeSep)&&(s+=` ${r.nodeSep}`)),o&&o.$cstNode)return Ha.replace(o.$cstNode.range,s);let c=ts(n.body.$cstNode,`}`)?.range.start;j(c,`Closing brace not found`);let l=`\t${s}\n\t`;return Ha.insert(c,l)}const ns=b.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.workspace;try{let{viewId:n,projectId:r,change:i}=e,a=t.ProjectsManager.ensureProject(r);ns.debug`Applying model change ${i.op} to view ${n} in project ${a.id}`;let o=this.locator.locateViewAst(n,a.id);if(!o)throw Error(`View ${n} not found in project ${a.id}`);let s={uri:o.doc.textDocument.uri,version:o.doc.textDocument.version};if(i.op===`save-view-snapshot`)return j(n===i.layout.id,`View ID does not match, expected `+n+`, got `+i.layout.id),{success:!0,location:await t.ManualLayouts.write(a,i.layout)};if(i.op===`reset-manual-layout`)return{success:!0,location:await t.ManualLayouts.remove(a,n)};let{edits:c,modifiedRange:l}=this.convertToTextEdit({lookup:o,change:i});return c.length?await this.applyTextEdits(o.doc,c)?{success:!0,location:{uri:s.uri,range:l}}:{success:!1,error:`Failed to apply changes`}:{success:!1,error:`No changes to apply`}}catch(t){let n=k(Ii(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return ns.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:P(t)}}async applyTextEdits(e,t){let n=this.services.shared.lsp.Connection,r=this.services.shared.workspace;if(!n){let n=Oi.applyEdits(e.textDocument,t);return await r.FileSystemProvider.writeFile(e.uri,n),!0}let i=await n.workspace.applyEdit({label:`LikeC4 - change view`,edit:{changes:{[e.textDocument.uri]:t}}});return i.applied?(await r.DocumentBuilder.update([e.uri],[]),i.applied):(ns.warn`Failed to apply text edits to document ${e.textDocument.uri}: ${i.failureReason}`,n.window.showErrorMessage(`Failed to apply changes: ${i.failureReason}`),!1)}},LikeC4NameProvider=class extends gi{constructor(e){super(),this.services=e}getNameStrict(e){return N(this.getName(e),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(e)}`)}getName(e){if(Fi(e))return e.name;if(st(e))return e.imported.$refText;if(_(e))return e.target.modelElement.value.$refText}getNameNode(e){if(Fi(e))return super.getNameNode(e);if(st(e))return e.imported.$refNode;if(_(e))return e.target.modelElement.value.$refNode}};function uniqueDescriptions(e){return G(e,_a(e=>`${e.type}.${e.name}`),ua(),I(([e,t])=>t.length===1?t:[]))}var LikeC4ScopeComputation=class extends _i{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(!(B(r)||r.length===0))for(let e of r)try{V(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){g(e)}}exportGlobals(e,t,n){if(!(B(e)||e.length===0)){for(let r of e.flatMap(e=>e.predicates))try{let e=r;V(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;V(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){g(e)}}}exportModel(e,t,n){if(!(B(e)||e.length===0))for(let r of e.flatMap(e=>e.elements))try{S(r)&&V(r.name)&&t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){g(e)}}exportLibrary(e,t,n){if(!B(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(!(B(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 tn(r):case un(r):V(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case Bt(r):V(r.tag.name)&&t.push(this.descriptions.createDescription(r.tag,r.tag.name,n));continue;case Fn(r):V(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case hr(r):V(r.name.name)&&t.push(this.descriptions.createDescription(r.name,r.name.name,n));continue;default:P(r)}}catch(e){g(e)}}exportDeployments(e,t,n){let r=e?.flatMap(e=>e.elements);if(!(B(r)||r.length===0))for(let e of r)try{x(e)&&V(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 Ei;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 Ei,i=[];for(let a of e.elements){if(Te(a))continue;let e;if(S(a)?(V(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)))):an(a)&&(e=a.body),e&&e.elements.length>0)try{i.push(...this.processContainer(e,t,n))}catch(e){g(e)}}i.length&&G(i,F(e=>!r.has(e.name)),_a(e=>e.name),ha((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 Ei,i=[];for(let a of e.elements){if(Dr(a))continue;let e=a.body;if(!tt(a)){let i=this.nameProvider.getName(a);if(V(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&&G(i,F(e=>!r.has(e.name)),_a(e=>e.name),ha((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}};const{getDocument:rs}=w;var LikeC4ScopeProvider=class extends vi{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(mr(r))return new Di(this.streamForFqnRef(t,r,e));if(Ar(r))return this.getScopeForStrictFqnRef(t,r,e);if(n!==`Element`)return this.getProjectScope(t,n,e);if(st(r)){let e=v(r);return new Di(this.fqnIndex.rootElements(e))}if(yr(r)&&e.property===`el`){let i=r.parent;return i?new Di(this.fqnIndex.directChildrenOf(t,_r(i))):this.getProjectScope(t,n,e)}return new Di(O(this.computeScope(t,e)))}catch(r){return g(r),this.getProjectScope(t,n,e)}}catch(e){return g(e),xi}}*genUniqueDescedants(e){if(!e)return;let t=v(e);if(S(e)){let n=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,n);return}if(x(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(Rt(e))}*genScopeElementView({viewOf:e,extends:t}){if(e){e.modelElement.value.$nodeDescription&&(yield e.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(Rt(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 Di(this.deploymentsIndex.directChildrenOf(e,_r(r)).filter(e=>this.reflection.isSubtype(e.type,vt))):this.getProjectScope(e,vt,n)}*genScopeExtendDeployment({deploymentNode:e}){e.value.$nodeDescription&&(yield e.value.$nodeDescription);let t=e.value.ref;t&&x(t)&&(yield*this.genUniqueDescedants(t))}streamForFqnRef(e,t,n){let r=t.parent;if(!r)return O(this.genScopeForParentlessFqnRef(e,t,n));let i=r.value.ref;if(!i)return Si;if(st(i))return O(this.genUniqueDescedants(i.imported.ref));if(x(i))return O(this.genUniqueDescedants(i));if(_(i)){let e=i.target.modelElement.value.ref,t=st(e)?e.imported.ref:S(e)?e:void 0;return O(this.genUniqueDescedants(t))}return S(i)?O(this.genUniqueDescedants(i)):P(i)}*genScopeForParentlessFqnRef(e,t,n){w.hasContainerOfType(t,Tt)||br(t)?yield*this.computeScope(e,n,mt):p(t)?(yield*this.computeScope(e,n,mt),yield*this.computeScope(e,n,vt),yield*this.computeScope(e,n,Mr)):(yield*this.computeScope(e,n,vt),yield*this.computeScope(e,n,Mr),w.hasContainerOfType(t,Cr)&&(yield*this.computeScope(e,n,mt)));let r=rs(t).precomputedScopes;r&&(yield*r.values().filter(e=>this.reflection.isSubtype(e.type,Et)))}*computeScope(e,t,n=this.reflection.getReferenceType(t)){let r=this.reflection.isSubtype(n,mt),a=this.reflection.isSubtype(n,l),o=rs(t.container).precomputedScopes;if(!o){yield*this.getProjectScope(e,n,t).getAllElements();return}let byReferenceType=e=>this.reflection.isSubtype(e.type,n),s=t.container;for(;s;){let e=o.get(s).filter(byReferenceType);e.length>0&&(yield*e),a&&i(s)&&(yield*this.genScopeExtendDeployment(s.$container)),r&&ur(s)&&(yield*this.genScopeExtendElement(s.$container)),r&&Nt(s)&&(yield*this.genScopeElementView(s.$container)),s=s.$container}yield*this.getProjectScope(e,n,t).getAllElements()}getProjectScope(e,t,n){return t===`LibIcon`?super.getGlobalScope(t,n):this.globalScopeCache.get(`${e}::${t}`,()=>new Ti(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===`LibIcon`)return super.getGlobalScope(e,t);let n=v(t.container);return this.getProjectScope(n,e,t)}};const $=b.getChild(`rpc`);var Rpc=class extends er{constructor(e){super(),this.services=e}init=Aa(()=>{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(Lr.type,{projectId:t}).catch(e=>{$.warn(`[ServerRpc] error sending onDidChangeModel for project {project}`,{error:e,project:t})})},a=ga(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=ga(t=>{t>1?$.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:$.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(Rr.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(Vr.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===fo.EMPTY?{model:null}:{model:a.$data}}),e.onNotification(zr.type,async e=>{let t=ki.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(Hr.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:ya(i,e=>e.id)}}}),e.onRequest(Jr.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(Qr.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(Ur.req,async()=>($.debug`received request ${`FetchProjects`}`,{projects:Oa(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:U(e,e=>e.uri.toString())}})})),e.onRequest(Zr.req,async e=>{$.debug`received request ${`ReloadProjects`}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.reloadProjects(e)}),e.onRequest(Xr.req,async(e,t)=>{$.debug`received request ${`RegisterProject`}`,n.ManualLayouts.clearCaches();let r;return r=`configUri`in e?await n.ProjectsManager.registerConfigFile(ki.parse(e.configUri),t):await n.ProjectsManager.registerProject(e,t),{id:r.id}}),e.onRequest(Kr.req,async e=>{$.debug`received request ${`FetchViewsFromAllProjects`}`;let r=[];for(let i of n.ProjectsManager.all){await Ni(e);try{let n=await t.Views.computedViews(i,e);r.push(...G(n,U(e=>({id:e.id,title:e.title??e.id,projectId:i})),Fa((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(Fr.req,async({docs:t},n)=>{let a=t.map(e=>ki.parse(e)),o=r.userDocuments.map(e=>e.uri).filter(e=>!a.some(t=>D.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 Si(n),await i.update(a,o,n)}),e.onRequest(Zr.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:N(e)}}),e.onRequest(Rr.req,async e=>($.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`,await t.ModelChanges.applyChange(e))),e.onRequest(qr.req,async e=>{let r=null;for(let i of n.ProjectsManager.all)try{let n=await t.ModelBuilder.computeModel(i,e);if(n===J.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+=V(n.specification.elements).length,r.deploymentKinds+=V(n.specification.deployments).length,r.relationshipKinds+=V(n.specification.relationships).length,r.tags+=V(n.specification.tags).length,r.customColors+=V(n.specification.customColors??{}).length,r.elements+=V(n.$data.elements).length,r.deploymentNodes+=[...n.deployment.nodes()].length,r.relationships+=V(n.$data.relations).length,r.views+=V(n.$data.views).length,r.projects+=1}catch(e){$.warn(`Error fetching telemetry metrics for project ${i}`,{err:e})}return await Si(e),{metrics:r}}),e.onRequest(Yr.req,async({documentUri:e},r)=>{let i=_i.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(Kr.req,async e=>($.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})),ci.create(()=>{a.cancel()}));function reportLayoutDrift(e){return W(e,P(e=>!!e.hasLayoutDrift),H(e=>{let n=t.ModelLocator.locateView(e.id);return A(n,`View ${e.id} not found`),{uri:n.uri,viewId:e.id,severity:bo.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(Hr.type,e)}},NodeKindProvider$1=class{constructor(e){this.services=e}getSymbolKind(e){let n=Ci(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(n,e));switch(!0){case hasType(ve,St,l,rt,At):return Wa.Constructor;case hasType($e,sn,t,Te,Gt):return Wa.Namespace;case hasType(Pt):return Wa.Class;case hasType(lr,Et,Ne,Kn):return Wa.EnumMember;case hasType(mr,xn):return Wa.Event;case hasType(mt,vt,ar,Un):return Wa.TypeParameter}return Wa.Field}getCompletionItemKind(e){let n=Ci(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(n,e));switch(!0){case hasType(Ne):return G.Color;case hasType(ve,l,rt,St,At):return G.Constructor;case hasType($e,sn,t,Te,Gt):return G.Module;case hasType(Pt):return G.Class;case hasType(lr,Et,Ne,Kn):return G.EnumMember;case hasType(mr,xn):return G.Event;case hasType(mt,ar,vt,Un):return G.TypeParameter;default:return G.Reference}}},WorkspaceSymbolProvider=class extends io{};const os=b.getChild(`views`);var DefaultLikeC4Views=class{#e;#t=new Vi(e=>new ProjectStorage({projectId:e,storage:Oo(this.#e,e),layouter:this.layouter.layout.bind(this.layouter)}));ModelBuilder;constructor(e){this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,this.#e=Do(),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{os.info`force clean cache`,this.#e.clear()})}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){return Ba((await this.ModelBuilder.computeModel(e,t)).$data.views)}async _layoutAllViews(e,t){let n=Ba(e.$data.views);if(n.length===0)return[];let r=e.project.id,i=os.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=ur();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 Si(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=os.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 B(t)?{dot:n.dot,diagram:this.withLayoutType(n.diagram,i,t)}:n}catch(e){let t=O(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=Ba(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):_(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){os.debug`layouting adhoc view...`;let n=await this.ModelBuilder.computeModel(t),r=lo(n,e),{diagram:i}=await this.layouter.layout({view:{...r,hash:``,_type:`element`},styles:n.$styles});return os.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[qi]===`manual`?(os.error(`View ${e.id} already has manual layout, this should not happen`),e):Qi(e,r):$i(e,r):e}projectStorage(e){return this.#t.get(e)}},ProjectStorage=class{#e;#t;#n;#r;constructor(e){this.#e=os.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);b.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);b.trace`cache miss for ${e.view.id}`;let r=ur(),i=await this.#r(e);return b.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:Zi(e,t.diagram)}}const ss={graphviz(){return new so}};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 bi(e,w.Validated),IndexManager:e=>new $t(e),LangiumDocuments:e=>new hr(e),ProjectsManager:e=>new An(e),WorkspaceManager:e=>new Ht(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),likec4:{LanguageServices:bind(DefaultLikeC4LanguageServices),Graphviz:t=>e.graphviz(t),Layouter:e=>new co({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(cn)},references:{NameProvider:bind(LikeC4NameProvider),ScopeComputation:bind(LikeC4ScopeComputation),ScopeProvider:bind(LikeC4ScopeProvider)},parser:{ValueConverter:bind(LikeC4ValueConverter)}}}function createLanguageServices(e={},t,n,r){let i=createSharedServices(e),a=xi([ao({shared:i}),ue,createLikeC4Module({...or,...jn,...ss,...e}),t,n,r].reduce(_merge,{}));return i.ServiceRegistry.register(a),registerValidationChecks(a),e.connection?Pi(()=>a.Rpc.init()):i.workspace.ConfigurationProvider.initialized({}),{shared:i,likec4:a}}function createSharedServices(e={}){let t={...or,...jn,...e};return xi(oo(t),Se,createLikeC4SharedModule(t))}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{ss 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 Ni(n),await i.update(a,o,n)}),e.onRequest(Yr.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:P(e)}}),e.onRequest(Ir.req,async e=>($.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`,await t.ModelChanges.applyChange(e))),e.onRequest(Gr.req,async e=>{let r=null;for(let i of n.ProjectsManager.all)try{let n=await t.ModelBuilder.computeModel(i,e);if(n===fo.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+=H(n.specification.elements).length,r.deploymentKinds+=H(n.specification.deployments).length,r.relationshipKinds+=H(n.specification.relationships).length,r.tags+=H(n.specification.tags).length,r.customColors+=H(n.specification.customColors??{}).length,r.elements+=H(n.$data.elements).length,r.deploymentNodes+=[...n.deployment.nodes()].length,r.relationships+=H(n.$data.relations).length,r.views+=H(n.$data.views).length,r.projects+=1}catch(e){$.warn(`Error fetching telemetry metrics for project ${i}`,{err:e})}return await Ni(e),{metrics:r}}),e.onRequest(qr.req,async({documentUri:e},r)=>{let i=ki.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(Wr.req,async e=>($.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})),bi.create(()=>{a.cancel()}));function reportLayoutDrift(e){return G(e,F(e=>!!e.hasLayoutDrift),U(e=>{let n=t.ModelLocator.locateView(e.id);return j(n,`View ${e.id} not found`),{uri:n.uri,viewId:e.id,severity:yo.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(Br.type,e)}},NodeKindProvider$1=class{constructor(e){this.services=e}getSymbolKind(e){let n=Pi(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(n,e));switch(!0){case hasType(mt,me,vt,Mr,Et):return Va.Constructor;case hasType(t,fr,sn,At,Wn):return Va.Namespace;case hasType(Qe):return Va.Class;case hasType(`Tag`,Pt,nt,sr):return Va.EnumMember;case hasType(Vn,Gt):return Va.Event;case hasType(St,ve,xn,rr):return Va.TypeParameter}return Va.Field}getCompletionItemKind(e){let n=Pi(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(n,e));switch(!0){case hasType(nt):return K.Color;case hasType(mt,vt,Mr,me,Et):return K.Constructor;case hasType(t,fr,sn,At,Wn):return K.Module;case hasType(Qe):return K.Class;case hasType(`Tag`,Pt,nt,sr):return K.EnumMember;case hasType(Vn,Gt):return K.Event;case hasType(St,xn,ve,rr):return K.TypeParameter;default:return K.Reference}}},WorkspaceSymbolProvider=class extends to{};const is=b.getChild(`views`);var DefaultLikeC4Views=class{#e;#t=new Ri(e=>new ProjectStorage({projectId:e,storage:Do(this.#e,e),layouter:this.layouter.layout.bind(this.layouter)}));ModelBuilder;constructor(e){this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,this.#e=Eo(),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{is.info`force clean cache`,this.#e.clear()})}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){return La((await this.ModelBuilder.computeModel(e,t)).$data.views)}async _layoutAllViews(e,t){let n=La(e.$data.views);if(n.length===0)return[];let r=e.project.id,i=is.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(c.length>0&&(o.length>0?i.trace`cached ${c.length} views, need to layout ${o.length} views`:i.trace`cached all ${c.length} views`),o.length>0){let e=cr();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.debug`layouted ${o.length} views in ${e.pretty}`}return t&&t.isCancellationRequested&&await Ni(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=is.getChild(n);if(!a){o.warn`view ${e} not found in model`;let t=i.findManualLayout(e);if(t){o.info`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 V(t)?{dot:n.dot,diagram:this.withLayoutType(n.diagram,i,t)}:n}catch(e){let t=k(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=La(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){is.trace`layouting adhoc view...`;let n=await this.ModelBuilder.computeModel(t),r=so(n,e),{diagram:i}=await this.layouter.layout({view:{...r,hash:``,_type:`element`},styles:n.$styles});return is.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[Wi]===`manual`?(is.error`View ${e.id} already has manual layout, this should not happen`,e):Yi(e,r):Xi(e,r):e}projectStorage(e){return this.#t.get(e)}},ProjectStorage=class{#e;#t;#n;constructor(e){this.#e=is.getChild(e.projectId),this.#t=e.storage,this.#n=e.layouter}async get(e){let t=cacheKey(e),n=await this.#t.get(t);if(n)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,n)}async getOrExecute(e){let t=cacheKey(e),n=await this.#t.get(t);if(n)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,n);this.#e.trace`cache miss for ${e.view.id}`;let r=cr(),i=await this.#n(e);return this.#e.debug(`layouted {view} in ${r.pretty}`,{view:e.view.id}),await this.#t.set(t,i),this.resetViewError(e.view),i}remember=(e,t)=>{let n=cacheKey(e);return t&&(this.#t.set(n,t).catch(e=>{this.#e.error(e)}),this.resetViewError(e.view)),t};reportViewError(e,t){let n=`error-${e.id}`;this.#t.has(n).then(e=>{e||(this.#t.set(n,`true`),t())})}resetViewError(e){this.#t.del(`error-${e.id}`)}};function cacheKey(e){return`${e.view.hash}-${e.styles.fingerprint}`}function mergeWithCachedLayout(e,t){return{dot:t.dot,diagram:Ji(e,t.diagram)}}const as={graphviz(){return new ao}};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 ji(e,T.Validated),IndexManager:e=>new cn(e),LangiumDocuments:e=>new $t(e),ProjectsManager:e=>new pr(e),WorkspaceManager:e=>new Ht(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),likec4:{LanguageServices:bind(DefaultLikeC4LanguageServices),Graphviz:t=>e.graphviz(t),Layouter:e=>new oo({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(Gn)},references:{NameProvider:bind(LikeC4NameProvider),ScopeComputation:bind(LikeC4ScopeComputation),ScopeProvider:bind(LikeC4ScopeProvider)},parser:{ValueConverter:bind(LikeC4ValueConverter)}}}function createLanguageServices(e={},t,n,r){let i=createSharedServices(e),a=Mi([ro({shared:i}),Se,createLikeC4Module({...ir,...kn,...as,...e}),t,n,r].reduce(_merge,{}));return i.ServiceRegistry.register(a),registerValidationChecks(a),e.connection?ci(()=>a.Rpc.init()):i.workspace.ConfigurationProvider.initialized({}),{shared:i,likec4:a}}function createSharedServices(e={}){let t={...ir,...kn,...e};return Mi(io(t),Me,createLikeC4SharedModule(t))}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{as as a,WithGraphviz as i,createLikeC4Module as n,createSharedServices as r,createLanguageServices as t};