@likec4/language-server 1.57.0 → 1.58.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,49 +1,49 @@
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 Ut,an as Wt,ar as Gt,at as Kt,b as qt,bn as Jt,br as Yt,bt as Xt,cn as Zt,cr as Qt,ct as $t,d as en,dn as tn,dr as nn,dt as rn,ei as an,en as on,er as sn,et as cn,f as ln,fn as un,fr as dn,ft as fn,g as pn,gn as mn,gr as hn,gt as gn,h as _n,hn as vn,hr as yn,ht as g,i as _,ii as bn,in as xn,ir as Sn,it as Cn,j as v,jn as wn,jr as Tn,jt as En,k as Dn,kn as On,kr as kn,kt as An,li as y,ln as jn,lr as Mn,lt as Nn,m as Pn,mn as Fn,mr as In,mt as Ln,n as Rn,ni as zn,nn as Bn,nr as Vn,nt as Hn,on as Un,or as Wn,ot as Gn,p as Kn,pn as qn,pr as Jn,pt as Yn,q as Xn,qn as Zn,qr as Qn,qt as $n,r as er,ri as tr,rn as nr,rr,rt as ir,si as ar,sn as or,sr,st as cr,t as lr,ti as ur,tn as dr,tr as fr,tt as pr,u as mr,ui as b,un as hr,ur as gr,ut as _r,v as vr,vn as yr,vr as br,vt as x,w as xr,wn as Sr,wr as Cr,wt as wr,x as Tr,xn as Er,xr as Dr,xt as Or,y as kr,yn as Ar,yr as jr,yt as Mr,z as Nr,zn as Pr,zr as Fr,zt as S}from"./utils.mjs";import{BuildDocuments as Ir,ChangeView as Lr,DidChangeModelNotification as Rr,DidChangeProjectsNotification as zr,DidChangeSnapshotNotification as Br,DidRequestOpenViewNotification as Vr,FetchComputedModel as Hr,FetchLayoutedModel as Ur,FetchProjects as Wr,FetchProjectsOverview as Gr,FetchTelemetryMetrics as Kr,FetchViewsFromAllProjects as qr,GetDocumentTags as Jr,LayoutView as Yr,Locate as Xr,RegisterProject as Zr,ReloadProjects as Qr,ValidateLayout as $r}from"../protocol.mjs";import{DefaultWeakMap as ei,MultiMap as C,ancestorsFqn as ti,compareNatural as ni,ifilter as ri,invariant as ii,isNonEmptyArray as ai,nameFromFqn as oi,nonNullable as si,nonexhaustive as ci,onNextTick as li,parentFqn as ui,sortNaturalByFqn as di,sortParentsFirst as fi,toArray as pi}from"@likec4/core/utils";import{loggable as w,wrapError as mi}from"@likec4/log";import{AstUtils as T,ContextCache as hi,CstUtils as gi,DefaultDocumentValidator as _i,DefaultNameProvider as vi,DefaultScopeComputation as yi,DefaultScopeProvider as bi,DefaultValueConverter as xi,Disposable as Si,DocumentState as E,EMPTY_SCOPE as Ci,EMPTY_STREAM as wi,GrammarAST as Ti,GrammarUtils as D,JSDocDocumentationProvider as Ei,MapScope as Di,MultiMap as Oi,StreamScope as ki,TextDocument as Ai,URI as ji,UriUtils as O,ValueConverter as Mi,WorkspaceCache as Ni,inject as Pi,interruptAndCheck as Fi,isAstNode as Ii,isNamed as Li,stream as k}from"langium";import*as Ri from"@likec4/core";import{DefaultMap as zi,Fqn as Bi,FqnExpr as Vi,FqnRef as A,GlobalFqn as Hi,LinkedList as Ui,RelationExpr as Wi,_layout as Gi,_stage as Ki,_type as qi,ancestorsFqn as Ji,applyCachedLayout as Yi,applyManualLayout as Xi,calcDriftsFromSnapshot as Zi,exact as Qi,invariant as j,isAncestor as $i,isAndOperator as ea,isAnyOf as ta,isDeploymentNode as na,isElementView as ra,isGlobalFqn as ia,isNonEmptyArray as M,isOrOperator as aa,isSameHierarchy as oa,nameFromFqn as sa,nonNullable as N,nonexhaustive as P,preferSummary as ca,splitGlobalFqn as la}from"@likec4/core";import{anyPass as ua,entries as da,filter as F,find as fa,findLast as pa,first as ma,flatMap as I,forEach as ha,forEachObj as ga,funnel as _a,groupBy as va,hasAtLeast as L,identity as ya,indexBy as ba,isArray as xa,isBoolean as Sa,isDefined as R,isEmpty as z,isEmptyish as Ca,isNonNullish as wa,isNullish as B,isNumber as Ta,isPromise as Ea,isString as Da,isTruthy as V,keys as H,last as Oa,map as U,mapToObj as W,mapValues as ka,omitBy as Aa,once as ja,only as Ma,pipe as G,piped as Na,prop as Pa,reduce as Fa,sort as Ia,unique as La,values as Ra}from"remeda";import{CompletionItemKind as K,DiagnosticSeverity as za,InsertTextFormat as Ba,SemanticTokenModifiers as Va,SemanticTokenTypes as Ha,SymbolKind as Ua,TextEdit as Wa}from"vscode-languageserver-types";import{hasLeadingSlash as Ga,hasProtocol as Ka,isRelative as qa,joinRelativeURL as Ja,joinURL as Ya,withoutBase as Xa,withoutLeadingSlash as Za}from"ufo";import"vscode-uri";import{AbstractFormatter as Qa,AbstractSemanticTokenProvider as $a,AstNodeHoverProvider as eo,DefaultCompletionProvider as to,DefaultDocumentHighlightProvider as no,DefaultWorkspaceSymbolProvider as ro,Formatting as io,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 q}from"@likec4/core/model";import{BorderStyles as mo,ElementShapes as ho,LikeC4Styles as go,Sizes as _o,ThemeColors as vo,assignTagColors as yo,computeColorValues as bo}from"@likec4/core/styles";import{DocumentHighlight as xo,DocumentHighlightKind as So}from"vscode-languageserver";import{DiagnosticSeverity as Co,Position as wo,TextEdit as To}from"vscode-languageserver-protocol";import{Fqn as Eo,FqnExpr as J,FqnRef as Y,_stage as Do,_type as Oo,exact as ko,isAnyOf as X,isExtendsElementView as Ao}from"@likec4/core/types";import{dedent as jo}from"strip-indent";import{indent as Mo,materialize as No,newline as Po,ops as Fo,print as Io,printOperation as Lo,withctx as Ro}from"@likec4/generators/likec4";import{createStorage as zo,prefixStorage as Bo}from"unstorage";var LikeC4DocumentationProvider=class extends Ei{parser;locator;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getDocumentation(e){if(!x(e)&&!g(e)&&!S(e))return super.getDocumentation(e);try{let t=T.getDocument(e);if(t.state<E.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 g(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(`
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 Ut,an as Wt,ar as Gt,at as Kt,b as qt,bn as Jt,br as Yt,bt as Xt,cn as Zt,cr as Qt,ct as $t,d as en,dn as tn,dr as nn,dt as rn,ei as an,en as on,er as sn,et as cn,f as ln,fn as un,fr as dn,ft as fn,g as pn,gn as mn,gr as hn,gt as gn,h as _n,hn as vn,hr as yn,ht as g,i as _,ii as bn,in as xn,ir as Sn,it as Cn,j as v,jn as wn,jr as Tn,jt as En,k as Dn,kn as On,kr as kn,kt as An,li as y,ln as jn,lr as Mn,lt as Nn,m as Pn,mn as Fn,mr as In,mt as Ln,n as Rn,ni as zn,nn as Bn,nr as Vn,nt as Hn,on as Un,or as Wn,ot as Gn,p as Kn,pn as qn,pr as Jn,pt as Yn,q as Xn,qn as Zn,qr as Qn,qt as $n,r as er,ri as tr,rn as nr,rr,rt as ir,si as ar,sn as or,sr,st as cr,t as lr,ti as ur,tn as dr,tr as fr,tt as pr,u as mr,ui as b,un as hr,ur as gr,ut as _r,v as vr,vn as yr,vr as br,vt as x,w as xr,wn as Sr,wr as Cr,wt as wr,x as Tr,xn as Er,xr as Dr,xt as Or,y as kr,yn as Ar,yr as jr,yt as Mr,z as Nr,zn as Pr,zr as Fr,zt as S}from"./utils.mjs";import{BuildDocuments as Ir,ChangeView as Lr,DidChangeModelNotification as Rr,DidChangeProjectsNotification as zr,DidChangeSnapshotNotification as Br,DidRequestOpenViewNotification as Vr,FetchComputedModel as Hr,FetchLayoutedModel as Ur,FetchProjects as Wr,FetchProjectsOverview as Gr,FetchTelemetryMetrics as Kr,FetchViewsFromAllProjects as qr,GetDocumentTags as Jr,LayoutView as Yr,Locate as Xr,RegisterProject as Zr,ReloadProjects as Qr,ValidateLayout as $r}from"../protocol.mjs";import{DefaultWeakMap as ei,MultiMap as C,ancestorsFqn as ti,compareNatural as ni,ifilter as ri,invariant as ii,isNonEmptyArray as ai,nameFromFqn as oi,nonNullable as si,nonexhaustive as ci,onNextTick as li,parentFqn as ui,sortNaturalByFqn as di,sortParentsFirst as fi,toArray as pi}from"@likec4/core/utils";import{loggable as w,wrapError as mi}from"@likec4/log";import{AstUtils as T,ContextCache as hi,CstUtils as gi,DefaultDocumentValidator as _i,DefaultNameProvider as vi,DefaultScopeComputation as yi,DefaultScopeProvider as bi,DefaultValueConverter as xi,Disposable as Si,DocumentState as E,EMPTY_SCOPE as Ci,EMPTY_STREAM as wi,GrammarAST as Ti,GrammarUtils as D,JSDocDocumentationProvider as Ei,MapScope as Di,MultiMap as Oi,StreamScope as ki,TextDocument as Ai,URI as ji,UriUtils as Mi,ValueConverter as Ni,WorkspaceCache as Pi,inject as Fi,interruptAndCheck as Ii,isAstNode as Li,isNamed as Ri,stream as O}from"langium";import*as zi from"@likec4/core";import{DefaultMap as Bi,Fqn as Vi,FqnExpr as Hi,FqnRef as k,GlobalFqn as Ui,LinkedList as Wi,RelationExpr as Gi,_layout as Ki,_stage as qi,_type as Ji,ancestorsFqn as Yi,applyCachedLayout as Xi,applyManualLayout as Zi,calcDriftsFromSnapshot as Qi,exact as $i,invariant as A,isAncestor as ea,isAndOperator as ta,isAnyOf as na,isDeploymentNode as ra,isElementView as ia,isGlobalFqn as aa,isNonEmptyArray as j,isOrOperator as oa,isSameHierarchy as sa,nameFromFqn as ca,nonNullable as M,nonexhaustive as N,preferSummary as la,splitGlobalFqn as ua}from"@likec4/core";import{anyPass as da,entries as fa,filter as P,find as pa,findLast as ma,first as ha,flatMap as F,forEach as ga,forEachObj as _a,funnel as va,groupBy as ya,hasAtLeast as I,identity as ba,indexBy as xa,isArray as Sa,isBoolean as Ca,isDefined as L,isEmpty as R,isEmptyish as wa,isNonNullish as Ta,isNullish as z,isNumber as Ea,isPromise as Da,isString as Oa,isTruthy as B,keys as V,last as ka,map as H,mapToObj as U,mapValues as Aa,omitBy as ja,once as Ma,only as Na,pipe as W,piped as Pa,prop as Fa,reduce as Ia,sort as La,unique as Ra,values as za}from"remeda";import{CompletionItemKind as G,DiagnosticSeverity as Ba,InsertTextFormat as Va,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 K,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 q}from"@likec4/core/model";import{BorderStyles as mo,ElementShapes as ho,LikeC4Styles as go,Sizes as _o,ThemeColors as vo,assignTagColors as yo,computeColorValues as bo}from"@likec4/core/styles";import{DocumentHighlight as xo,DocumentHighlightKind as So}from"vscode-languageserver";import{DiagnosticSeverity as Co,Position as wo,TextEdit as To}from"vscode-languageserver-protocol";import{Fqn as Eo,FqnExpr as J,FqnRef as Y,_stage as Do,_type as Oo,exact as ko,isAnyOf as X,isExtendsElementView as Ao}from"@likec4/core/types";import{dedent as jo}from"strip-indent";import{indent as Mo,materialize as No,newline as Po,ops as Fo,print as Io,printOperation as Lo,withctx as Ro}from"@likec4/generators/likec4";import{createStorage as zo,prefixStorage as Bo}from"unstorage";var LikeC4DocumentationProvider=class extends Ei{parser;locator;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getDocumentation(e){if(!x(e)&&!g(e)&&!S(e))return super.getDocumentation(e);try{let t=T.getDocument(e);if(t.state<E.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 g(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(`
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){y(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:io.newLine({allowMore:!0}),oneSpace:io.oneSpace(),noSpace:io.noSpace(),indent:io.indent({allowMore:!0}),noIndent:io.noIndent()};var LikeC4Formatter=class extends Qa{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,Cr,(e,t)=>{let n=D.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,Or,(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)||Or(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),(An(e)&&isMultiline(e.$cstNode)||c(e)&&An(e.$container)&&isMultiline(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(io.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(io.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)||hn(e)||dn(e)||In(e)||nn(e)||mn(e)||Fn(e)||vn(e)||qn(e)||un(e)||vn(e)||Ne(e)||f(e)||dr(e)||jt(e)||Sn(e)||de(e)||Pr(e)||Nt(e)||ze(e)||wr(e)||fe(e)||Re(e)||Yn(e)||Ln(e)||je(e)||we(e)||rt(e)||Mr(e)||lt(e)||gn(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(io.newLine({allowMore:!0})).prepend(Z.indent),o=e}r?i.prepend(Z.noIndent).prepend(io.newLine({allowMore:!0})):i.prepend(io.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,En)?.keywords(`dynamic`,`view`).append(Z.oneSpace),this.on(e,te)?.keywords(`deployment`,`view`).append(Z.oneSpace)}formatLeafProperty(e){if(_e(e)||rr(e)||Pe(e)||ye(e)||ht(e)||Jn(e)||yn(e)||fn(e)||o(e)||Nn(e)||Jt(e)||sr(e)||_r(e)||Ct(e)||u(e)||yr(e)||Er(e)||Ar(e)||Qt(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,wn,(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,kn,(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=D.findNodeForProperty(e.$cstNode,`kind`),r=D.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,on,(e,t)=>{t.keywords(`extend`).append(Z.oneSpace)})}formatGlobals(e){this.on(e,Fn,(e,t)=>{t.keyword(`style`).append(Z.oneSpace),t.property(`id`).append(Z.oneSpace)}),this.on(e,vn,(e,t)=>{t.keyword(`styleGroup`).append(Z.oneSpace)}),this.on(e,qn,(e,t)=>{t.keyword(`predicateGroup`).append(Z.oneSpace)}),this.on(e,un,(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((dn(e)||In(e)||Bt(e)||nn(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(Z.oneSpace),gr(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(Z.oneSpace),t.property(`name`).append(Z.oneSpace)}}formatWithPredicate(e){(Zt(e)||sn(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(Z.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,x,(e,t)=>{let n=D.findNodeForProperty(e.$cstNode,`kind`),r=D.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,g,(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,Tn,(e,t)=>{t.keywords(`global`,`style`).append(Z.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(s(e)||Ze(e))&&t.keywords(`global`,`predicate`).append(Z.oneSpace)}formatViewRuleGroup(e){this.on(e,Re,(e,t)=>{t.keyword(`group`).append(Z.oneSpace)})}formatViewRuleStyle(e){this.on(e,fe)?.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,jn)?.keyword(`,`).prepend(Z.noSpace).append(Z.oneSpace)}formatWhereExpression(e){(n(e)||or(e))&&this.getNodeFormatter(e).keyword(`where`).append(Z.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,Ee,(e,t)=>{t.property(`operator`).surround(Z.oneSpace)}),this.on(e,It,(e,t)=>{t.keyword(`not`).append(Z.oneSpace)}),Qn(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Z.oneSpace),t.property(`not`).surround(Z.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,d,(e,t)=>{t.property(`operator`).surround(Z.oneSpace)}),this.on(e,gt,(e,t)=>{t.keyword(`not`).append(Z.oneSpace)}),Fr(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Z.oneSpace),t.property(`not`).surround(Z.oneSpace)}}formatIncludeExcludeExpressions(e){if(Fe(e)||He(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,Sr,(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)||He(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;if(Ye(e)){let n=e.value;Ve(n)?t=this.getNodeFormatter(n).nodes(...n.values):n&&(t=this.getNodeFormatter(e).property(`value`))}else t=this.on(e,Yt)?.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,Re)?.properties(`title`),t??=this.on(e,at)?.properties(`title`),t??=this.on(e,x)?.properties(`title`),t??=this.on(e,g)?.properties(`title`),t??=this.on(e,Or)?.properties(`title`,`technology`),t??=this.on(e,wn)?.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 Vo=b.getChild(`LanguageServices`),isErrorDiagnostic=e=>e.severity===za.Error;var DefaultLikeC4LanguageServices=class{services;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(),da(),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,Pa(`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(),Pa(`uri`));return{id:t,folder:n,title:r.title??r.name,documents:i,config:r}}async diagrams(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.views.diagrams(n,t)}async computedModel(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.builder.computeModel(n,t)}async layoutedModel(e,t){let n=this.projectsManager.ensureProjectId(e),r=await this.builder.computeModel(n,t);if(!r)throw Error(`Failed to compute model, empty project?`);let i=await this.views.layoutAllViews(n,t);return q.create({...r.$data,_stage:`layouted`,views:G(i,U(Pa(`diagram`)),ba(Pa(`id`)))})}async projectsOverview(e){let t=this.services.shared.workspace.ProjectsManager.all,n=[];for(let r of t){let t=await this.builder.computeModel(r,e);if(e?.isCancellationRequested)throw Error(`Operation cancelled`);if(t===q.EMPTY){Vo.debug(`Project ${r} is empty, skipping`);continue}n.push(t)}if(!L(n,1))throw Error(`No models found`);let r=uo(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():Ai.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(ji.parse(t))}catch{Vo.warn(`format: skipping unknown document ${t}`);continue}if(!ut(n)){Vo.warn(`format: skipping unknown document ${t}`);continue}i.set(t,n)}return[...i.values()]}async dispose(){try{Vo.debug(`disposing LikeC4LanguageServices`),this.services.likec4.ModelBuilder.dispose(),this.services.Rpc.dispose(),await this.services.shared.workspace.FileSystemWatcher.dispose()}catch(e){Vo.error(w(e))}finally{Vo.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{services;constructor(e){this.services=e}async provideCodeLens(e,t,n){if(ut(e))return e.state<E.Linked&&(b.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(E.Linked,e.uri,n),b.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=qt.readId(e),n=e.$cstNode?.range;if(!n||!t)return[];let r=_(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`}}})}};function isCompletionForPojectName(e,t){return Ti.isRuleCall(t.feature)&&t.property===`project`&&m(e.node)}const Ho=`view_\${CURRENT_MINUTE}_\${CURRENT_SECOND} {
3
+ `):void 0}default:return e}}catch(e){y(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:K.newLine({allowMore:!0}),oneSpace:K.oneSpace(),noSpace:K.noSpace(),indent:K.indent({allowMore:!0}),noIndent:K.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,Cr,(e,t)=>{let n=D.findNodesForProperty(e.$cstNode,`values`).filter(B).slice(1);t.cst(n).prepend(Z.oneSpace),t.keywords(`,`).prepend(Z.noSpace).append(Z.oneSpace)})}formatDeploymentRelation(e){this.on(e,Or,(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(...P([e.target,e.tags],B)).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)||Or(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(...P([e.target,e.tags],B)).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),(An(e)&&isMultiline(e.$cstNode)||c(e)&&An(e.$container)&&isMultiline(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(K.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(K.indent({allowLess:!1,allowMore:!0,priority:2})),e.custom?.$cstNode&&isMultiline(e.custom.$cstNode)&&t.property(`custom`).prepend({options:{allowLess:!1,allowMore:!0,priority:2},moves:[{tabs:1}]}))})}removeIndentFromTopLevelStatements(e){re(e.$container)&&this.getNodeFormatter(e).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(Z.noIndent)}indentContentInBraces(e){if(Ge(e)||hn(e)||dn(e)||In(e)||nn(e)||mn(e)||Fn(e)||vn(e)||qn(e)||un(e)||vn(e)||Ne(e)||f(e)||dr(e)||jt(e)||Sn(e)||de(e)||Pr(e)||Nt(e)||ze(e)||wr(e)||fe(e)||Re(e)||Yn(e)||Ln(e)||je(e)||we(e)||rt(e)||Mr(e)||lt(e)||gn(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(K.newLine({allowMore:!0})).prepend(Z.indent),o=e}r?i.prepend(Z.noIndent).prepend(K.newLine({allowMore:!0})):i.prepend(K.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,En)?.keywords(`dynamic`,`view`).append(Z.oneSpace),this.on(e,te)?.keywords(`deployment`,`view`).append(Z.oneSpace)}formatLeafProperty(e){if(_e(e)||rr(e)||Pe(e)||ye(e)||ht(e)||Jn(e)||yn(e)||fn(e)||o(e)||Nn(e)||Jt(e)||sr(e)||_r(e)||Ct(e)||u(e)||yr(e)||Er(e)||Ar(e)||Qt(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,wn,(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,kn,(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=D.findNodeForProperty(e.$cstNode,`kind`),r=D.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,on,(e,t)=>{t.keywords(`extend`).append(Z.oneSpace)})}formatGlobals(e){this.on(e,Fn,(e,t)=>{t.keyword(`style`).append(Z.oneSpace),t.property(`id`).append(Z.oneSpace)}),this.on(e,vn,(e,t)=>{t.keyword(`styleGroup`).append(Z.oneSpace)}),this.on(e,qn,(e,t)=>{t.keyword(`predicateGroup`).append(Z.oneSpace)}),this.on(e,un,(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((dn(e)||In(e)||Bt(e)||nn(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(Z.oneSpace),gr(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(Z.oneSpace),t.property(`name`).append(Z.oneSpace)}}formatWithPredicate(e){(Zt(e)||sn(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(Z.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,x,(e,t)=>{let n=D.findNodeForProperty(e.$cstNode,`kind`),r=D.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,g,(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,Tn,(e,t)=>{t.keywords(`global`,`style`).append(Z.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(s(e)||Ze(e))&&t.keywords(`global`,`predicate`).append(Z.oneSpace)}formatViewRuleGroup(e){this.on(e,Re,(e,t)=>{t.keyword(`group`).append(Z.oneSpace)})}formatViewRuleStyle(e){this.on(e,fe)?.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,jn)?.keyword(`,`).prepend(Z.noSpace).append(Z.oneSpace)}formatWhereExpression(e){(n(e)||or(e))&&this.getNodeFormatter(e).keyword(`where`).append(Z.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,Ee,(e,t)=>{t.property(`operator`).surround(Z.oneSpace)}),this.on(e,It,(e,t)=>{t.keyword(`not`).append(Z.oneSpace)}),Qn(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Z.oneSpace),t.property(`not`).surround(Z.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,d,(e,t)=>{t.property(`operator`).surround(Z.oneSpace)}),this.on(e,gt,(e,t)=>{t.keyword(`not`).append(Z.oneSpace)}),Fr(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Z.oneSpace),t.property(`not`).surround(Z.oneSpace)}}formatIncludeExcludeExpressions(e){if(Fe(e)||He(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,Sr,(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)||He(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;if(Ye(e)){let n=e.value;Ve(n)?t=this.getNodeFormatter(n).nodes(...n.values):n&&(t=this.getNodeFormatter(e).property(`value`))}else t=this.on(e,Yt)?.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,Re)?.properties(`title`),t??=this.on(e,at)?.properties(`title`),t??=this.on(e,x)?.properties(`title`),t??=this.on(e,g)?.properties(`title`),t??=this.on(e,Or)?.properties(`title`,`technology`),t??=this.on(e,wn)?.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 Vo=b.getChild(`LanguageServices`),isErrorDiagnostic=e=>e.severity===Ba.Error;var DefaultLikeC4LanguageServices=class{services;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=W(this.services.shared.workspace.LangiumDocuments.groupedByProject(),fa(),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,Fa(`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(),Fa(`uri`));return{id:t,folder:n,title:r.title??r.name,documents:i,config:r}}async diagrams(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.views.diagrams(n,t)}async computedModel(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.builder.computeModel(n,t)}async layoutedModel(e,t){let n=this.projectsManager.ensureProjectId(e),r=await this.builder.computeModel(n,t);if(!r)throw Error(`Failed to compute model, empty project?`);let i=await this.views.layoutAllViews(n,t);return q.create({...r.$data,_stage:`layouted`,views:W(i,H(Fa(`diagram`)),xa(Fa(`id`)))})}async projectsOverview(e){let t=this.services.shared.workspace.ProjectsManager.all,n=[];for(let r of t){let t=await this.builder.computeModel(r,e);if(e?.isCancellationRequested)throw Error(`Operation cancelled`);if(t===q.EMPTY){Vo.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():Ai.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(ji.parse(t))}catch{Vo.warn(`format: skipping unknown document ${t}`);continue}if(!ut(n)){Vo.warn(`format: skipping unknown document ${t}`);continue}i.set(t,n)}return[...i.values()]}async dispose(){try{Vo.debug(`disposing LikeC4LanguageServices`),this.services.likec4.FqnIndex.dispose(),this.services.likec4.DeploymentsIndex.dispose(),this.services.likec4.ModelParser.dispose(),this.services.likec4.ModelBuilder.dispose(),this.services.likec4.Views.dispose(),this.services.likec4.LastSeen.dispose(),this.services.Rpc.dispose(),this.services.shared.workspace.ManualLayouts.dispose(),this.services.shared.workspace.ProjectsManager.dispose(),await this.services.shared.workspace.FileSystemWatcher.dispose()}catch(e){Vo.error(w(e))}finally{Vo.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{services;constructor(e){this.services=e}async provideCodeLens(e,t,n){if(ut(e))return e.state<E.Linked&&(b.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(E.Linked,e.uri,n),b.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=qt.readId(e),n=e.$cstNode?.range;if(!n||!t)return[];let r=_(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`}}})}};function isCompletionForPojectName(e,t){return Ti.isRuleCall(t.feature)&&t.property===`project`&&m(e.node)}const Ho=`view_\${CURRENT_MINUTE}_\${CURRENT_SECOND} {
4
4
  title 'Untitled'
5
5
 
6
6
  include \${0:*}
7
- }`;var LikeC4CompletionProvider=class extends to{services;constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,n){switch(!0){case Ti.isKeyword(t.feature):return this.completionForKeyword(e,t.feature,n);case Ti.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))return;let acceptProperty=r=>{n(e,{label:t.value,detail:`Insert ${t.value} property`,kind:K.Property,insertTextFormat:Ba.Snippet,insertText:`${t.value} ${r}`})},acceptSnippet=({insertText:r,...i})=>{n(e,{label:t.value,detail:`Insert ${t.value}`,kind:K.Snippet,insertTextFormat:Ba.Snippet,...i,insertText:`${t.value} ${r}`})},acceptPropertyAndSuggest=e=>{acceptProperty(`\${1|${e.join(`,`)}|}$0`)};switch(!0){case t.value===`import`:acceptSnippet({insertText:`{ $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&T.hasContainerOfType(e.node,Pr):acceptSnippet({detail:`Insert deployment view`,kind:K.Class,insertText:`view ${Ho}`});break;case t.value===`dynamic`&&T.hasContainerOfType(e.node,Pr):acceptSnippet({detail:`Insert dynamic view`,kind:K.Class,insertText:["view view_${CURRENT_MINUTE}_${CURRENT_SECOND} {",` title 'Untitled'`,` `,` $0`,`}`].join(`
8
- `)});break;case t.value===`view`&&T.hasContainerOfType(e.node,Pr):acceptSnippet({detail:`Insert element view`,kind:K.Class,insertText:Ho});break;case t.value===`opacity`:acceptPropertyAndSuggest([`0%`,`20%`,`60%`,`100%`]);break;case t.value===`shape`:acceptPropertyAndSuggest(ho);break;case[`color`,`iconColor`].includes(t.value):acceptPropertyAndSuggest(vo);break;case[`size`,`textSize`,`padding`].includes(t.value):acceptPropertyAndSuggest(_o);break;case t.value===`border`:acceptPropertyAndSuggest(mo);break;case t.value===`autoLayout`:acceptPropertyAndSuggest([`TopBottom`,`BottomTop`,`LeftRight`,`RightLeft`]);break;case[`title`,`description`,`technology`,`summary`,`notes`,`notation`].includes(t.value):acceptProperty(`'$0'`);break;case t.value===`metadata`:acceptProperty(`{
7
+ }`;var LikeC4CompletionProvider=class extends no{services;constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,n){switch(!0){case Ti.isKeyword(t.feature):return this.completionForKeyword(e,t.feature,n);case Ti.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))return;let acceptProperty=r=>{n(e,{label:t.value,detail:`Insert ${t.value} property`,kind:G.Property,insertTextFormat:Va.Snippet,insertText:`${t.value} ${r}`})},acceptSnippet=({insertText:r,...i})=>{n(e,{label:t.value,detail:`Insert ${t.value}`,kind:G.Snippet,insertTextFormat:Va.Snippet,...i,insertText:`${t.value} ${r}`})},acceptPropertyAndSuggest=e=>{acceptProperty(`\${1|${e.join(`,`)}|}$0`)};switch(!0){case t.value===`import`:acceptSnippet({insertText:`{ $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&T.hasContainerOfType(e.node,Pr):acceptSnippet({detail:`Insert deployment view`,kind:G.Class,insertText:`view ${Ho}`});break;case t.value===`dynamic`&&T.hasContainerOfType(e.node,Pr):acceptSnippet({detail:`Insert dynamic view`,kind:G.Class,insertText:["view view_${CURRENT_MINUTE}_${CURRENT_SECOND} {",` title 'Untitled'`,` `,` $0`,`}`].join(`
8
+ `)});break;case t.value===`view`&&T.hasContainerOfType(e.node,Pr):acceptSnippet({detail:`Insert element view`,kind:G.Class,insertText:Ho});break;case t.value===`opacity`:acceptPropertyAndSuggest([`0%`,`20%`,`60%`,`100%`]);break;case t.value===`shape`:acceptPropertyAndSuggest(ho);break;case[`color`,`iconColor`].includes(t.value):acceptPropertyAndSuggest(vo);break;case[`size`,`textSize`,`padding`].includes(t.value):acceptPropertyAndSuggest(_o);break;case t.value===`border`:acceptPropertyAndSuggest(mo);break;case t.value===`autoLayout`:acceptPropertyAndSuggest([`TopBottom`,`BottomTop`,`LeftRight`,`RightLeft`]);break;case[`title`,`description`,`technology`,`summary`,`notes`,`notation`].includes(t.value):acceptProperty(`'$0'`);break;case t.value===`metadata`:acceptProperty(`{
9
9
  $0
10
- }`);break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(t.value):acceptSnippet({kind:K.Module,insertText:`{
10
+ }`);break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(t.value):acceptSnippet({kind:G.Module,insertText:`{
11
11
  $0
12
- }`});break;case t.value===`group`:acceptSnippet({kind:K.Module,insertText:`'\${1:Title}' {
12
+ }`});break;case t.value===`group`:acceptSnippet({kind:G.Module,insertText:`'\${1:Title}' {
13
13
  $0
14
- }`});break;case[`par`,`parallel`].includes(t.value):acceptSnippet({detail:`Insert parallel steps`,kind:K.Module,insertText:`{
14
+ }`});break;case[`par`,`parallel`].includes(t.value):acceptSnippet({detail:`Insert parallel steps`,kind:G.Module,insertText:`{
15
15
  $0
16
- }`});break;case t.value===`style`&&e.node&&T.hasContainerOfType(e.node,Fn):acceptSnippet({kind:K.Module,insertText:`\${1:name} \${2:*} {
16
+ }`});break;case t.value===`style`&&e.node&&T.hasContainerOfType(e.node,Fn):acceptSnippet({kind:G.Module,insertText:`\${1:name} \${2:*} {
17
17
  $0
18
- }`});break;case t.value===`style`&&e.node&&T.hasContainerOfType(e.node,ua([Pr,vn])):acceptSnippet({kind:K.Module,insertText:`\${1:*} {
18
+ }`});break;case t.value===`style`&&e.node&&T.hasContainerOfType(e.node,da([Pr,vn])):acceptSnippet({kind:G.Module,insertText:`\${1:*} {
19
19
  $0
20
- }`});break;case t.value===`style`:acceptSnippet({kind:K.Module,insertText:`{
20
+ }`});break;case t.value===`style`:acceptSnippet({kind:G.Module,insertText:`{
21
21
  $0
22
- }`});break;case t.value===`extend`:acceptSnippet({detail:`Extend another view`,kind:K.Class,insertText:`$1 {
22
+ }`});break;case t.value===`extend`:acceptSnippet({detail:`Extend another view`,kind:G.Class,insertText:`$1 {
23
23
  $0
24
- }`});break;case t.value===`mode`:acceptPropertyAndSuggest([`sequence`,`diagram`]);break;case[`include`,`exclude`].includes(t.value):n(e,{label:t.value,kind:K.Operator,detail:`Insert ${t.value} predicate`,insertTextFormat:Ba.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:Wa.replace(i,n),detail:`Project`,sortText:`0_`+r})}}},LikeC4DocumentHighlightProvider=class extends no{createDocumentHighlight(e){return xo.create(e.segment.range,So.Read)}},LikeC4DocumentLinkProvider=class{services;constructor(e){this.services=e}async getDocumentLinks(e,t,n){return!ut(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:T.streamAllContents(e.parseResult.value).filter(wn).map(t=>{try{let n=D.findNodeForProperty(t.$cstNode,`value`)?.range,r=n&&this.resolveLink(e,t.value);if(r&&Ka(r))return{range:n,target:r}}catch(e){y(e)}return null}).nonNullable().toArray()}resolveLink(e,t){if(Ka(t)||Ga(t))return t;if(qa(t))return Ja(e.uri.toString(),`../`,t);let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri;return Ja(n.toString(),t)}relativeLink(e,t){if(Ga(t))return Za(t);if(qa(t)){let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri.toString(),r=new URL(e.uri.toString());return Za(Xa(new URL(t,r).toString(),n))}return null}};const Uo=b.getChild(`DocumentSymbolProvider`);var LikeC4DocumentSymbolProvider=class{services;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<E.Linked&&(Uo.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(E.Linked,e.uri,n),Uo.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 y(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:Ua.Namespace,name:`icons`,range:t.range,selectionRange:D.findNodeForKeyword(t,`icons`)?.range??t.range,children:n}]}getSpecSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=D.findNodeForProperty(t,`name`);if(!n)return[];let r=G([...e.elements,...e.tags,...e.relationships],U(e=>{try{if(dn(e)||In(e)||nn(e))return this.getKindSymbol(e);if(Bt(e))return this.getTagSymbol(e)}catch(e){return y(e),null}P(e)}),F(V));return r.length===0?[]:[{kind:Ua.Namespace,name:e.name,range:t.range,selectionRange:n.range,children:r}]}getModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=D.findNodeForProperty(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>Bn(e)?[]:this.getElementsSymbol(e))}]:[]}getDeploymentModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=D.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,t){try{if(on(e))return this.getExtendElementSymbol(e);if(S(e))return this.getElementSymbol(e)}catch(e){y(e)}return[]}getExtendElementSymbol(e){let t=e.$cstNode,n=e.element.$cstNode,r=e.body;return!t||!n?[]:[{kind:this.symbolKind(e),name:vr(e.element),range:t.range,selectionRange:n.range,children:r.elements.flatMap(t=>this.getElementsSymbol(t,vr(e.element)))}]}getElementSymbol(e){let t=e.$cstNode,n=D.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=D.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?D.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(g(e))return this.getDeployedInstanceSymbol(e);if(tt(e))return[]}catch(e){y(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=T.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 Wo=`
24
+ }`});break;case t.value===`mode`:acceptPropertyAndSuggest([`sequence`,`diagram`]);break;case[`include`,`exclude`].includes(t.value):n(e,{label:t.value,kind:G.Operator,detail:`Insert ${t.value} predicate`,insertTextFormat:Va.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 xo.create(e.segment.range,So.Read)}},LikeC4DocumentLinkProvider=class{services;constructor(e){this.services=e}async getDocumentLinks(e,t,n){return!ut(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:T.streamAllContents(e.parseResult.value).filter(wn).map(t=>{try{let n=D.findNodeForProperty(t.$cstNode,`value`)?.range,r=n&&this.resolveLink(e,t.value);if(r&&qa(r))return{range:n,target:r}}catch(e){y(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 Uo=b.getChild(`DocumentSymbolProvider`);var LikeC4DocumentSymbolProvider=class{services;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<E.Linked&&(Uo.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(E.Linked,e.uri,n),Uo.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 y(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:D.findNodeForKeyword(t,`icons`)?.range??t.range,children:n}]}getSpecSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=D.findNodeForProperty(t,`name`);if(!n)return[];let r=W([...e.elements,...e.tags,...e.relationships],H(e=>{try{if(dn(e)||In(e)||nn(e))return this.getKindSymbol(e);if(Bt(e))return this.getTagSymbol(e)}catch(e){return y(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=D.findNodeForProperty(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>Bn(e)?[]:this.getElementsSymbol(e))}]:[]}getDeploymentModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=D.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,t){try{if(on(e))return this.getExtendElementSymbol(e);if(S(e))return this.getElementSymbol(e)}catch(e){y(e)}return[]}getExtendElementSymbol(e){let t=e.$cstNode,n=e.element.$cstNode,r=e.body;return!t||!n?[]:[{kind:this.symbolKind(e),name:vr(e.element),range:t.range,selectionRange:n.range,children:r.elements.flatMap(t=>this.getElementsSymbol(t,vr(e.element)))}]}getElementSymbol(e){let t=e.$cstNode,n=D.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=D.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?D.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(g(e))return this.getDeployedInstanceSymbol(e);if(tt(e))return[]}catch(e){y(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=T.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 Wo=`
25
25
  ---
26
- `;var LikeC4HoverProvider=class extends eo{services;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(Xt(e))return{contents:{kind:`markdown`,value:"deployment node `"+e.name+"`"}};if(Gt(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(g(e))return this.getDeployedInstanceHover(e)}catch(e){b.debug(w(e))}}getElementHover(e){let t=this.locator.getParsedElement(e);if(!t)return;let n=t.element,r=[`<sup>\`${n.id}\`</sup> `,`### ${n.title} `],i=ca(n);i&&r.push(``,(i.md??i.txt).split(`
26
+ `;var LikeC4HoverProvider=class extends to{services;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(Xt(e))return{contents:{kind:`markdown`,value:"deployment node `"+e.name+"`"}};if(Gt(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(g(e))return this.getDeployedInstanceHover(e)}catch(e){b.debug(w(e))}}getElementHover(e){let t=this.locator.getParsedElement(e);if(!t)return;let n=t.element,r=[`<sup>\`${n.id}\`</sup> `,`### ${n.title} `],i=la(n);i&&r.push(``,(i.md??i.txt).split(`
27
27
  `).join(`
28
28
  `));let a=this.services.likec4.LastSeen.model(t.projectId)?.findElement(n.id),o=a&&this.getElementModelHover(a,t.projectId);return r.push(o||`
29
29
  <small>_Model not processed yet, open any view to trigger_</small> `),{contents:{kind:`markdown`,value:r.join(`
30
- `)}}}getElementModelHover(e,t){let n=[],r=[...e.incoming(`direct`)].length,i=[...e.outgoing(`direct`)].length;(r>0||i>0)&&n.push(Wo,`<small>**${r}** incoming, **${i}** outgoing relationships</small> `);let printViewLink=e=>{let n=[e.id,t],r=ji.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(n))}`);return` - [${e.titleOrId}](${r})`},a=[...e.scopedViews()].map(printViewLink);a.length>0&&n.push(Wo,`<small>Element views:</small>`,...a);let o=[...e.views()].map(t=>t.isScopedElementView()&&t.viewOf===e?null:printViewLink(t)).filter(wa);if(o.length>0){let e=a.length>0?`Also appears in views:`:`Appears in views:`;n.push(a.length>0?``:Wo,`<small>${e}</small>`,...o,` `)}return n.length>0?n.join(`
31
- `):void 0}getDeploymentNodeHover(e){let t=T.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=ca(n);return i&&r.push(``,i.md??i.txt),{contents:{kind:`markdown`,value:r.join(`
32
- `)}}}getDeployedInstanceHover(e){let t=T.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(`
33
- `)}}}},LikeC4CodeActionProvider=class{getCodeActions(e,t){}};const Go=b.getChild(`SemanticTokenProvider`),Ko={...Ha},qo={...Va};function createSemanticTypeMethods(e){let t=[],n=new Proxy({},{get(r,i){if(i===`modifier`)return e=>(t.push(e),n);if(i in qo)return t.push(qo[i]),n;if(i in Ko)return()=>e(Ko[i],t);throw Error(`Unknown semantic token type or modifier: ${i}`)}});return n}const Jo=`Stop Highlighting`,stopHighlight=()=>{throw Jo};var LikeC4SemanticTokenProvider=class extends $a{services;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(Gt,e=>{e.property(`name`).function()}),when(X(Te,he,Or),e=>{e.property(`kind`).function()}),when(se,e=>{e.property(`name`).definition.function(),stopHighlight()}),when(X(yt,Vn),e=>{e.property(`value`).readonly.definition.interface()}),when(tr,e=>{e.cst().readonly.definition.variable(),stopHighlight()}),when(tn,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(fr,e=>{e.cst().function()}),when(Mt,e=>{V(e.node.value?.$refText)&&e.property(`value`).function()}),when(X(be,Ot,r),e=>{e.keyword(`metadata`).keyword(),e.property(`key`).property()}),when(X(wt,bt,ur,Mt),e=>{V(e.node.value)&&e.property(`value`).readonly.definition.type()}),when(X(et,an,r),e=>{e.property(`participant`).keyword()}),when(xe,e=>{V(e.node.kind)&&e.property(`kind`).definition.type()}),when(X(vn,Fn),e=>{e.property(`id`).readonly.definition.variable()}),when(Tn,e=>{e.property(`style`).readonly.definition.variable()}),when(X(qn,un),e=>{e.property(`name`).readonly.definition.variable()}),when(s,e=>{e.property(`predicate`).readonly.definition.variable()}),when($n,e=>{V(e.node.tag)&&e.property(`tag`).definition.type()}),when(X(hr,jr),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(br,e=>{e.node.parent?e.property(`el`).property():e.property(`el`).readonly.definition.variable()}),when(gr,e=>{e.keyword(`color`).keyword(),e.property(`name`).readonly.declaration.type()}),when(Bt,e=>{V(e.node.color)&&e.keyword(`color`).property()}),when(X(dn,In,nn),e=>{e.property(`kind`).readonly.declaration.type()}),when(ct,e=>{e.property(`name`).definition.type()}),when(Ct,e=>{e.property(`value`).number()}),when(Jt,e=>{if(e.node.libicon||e.node.value===`none`){e.property(e.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}e.property(`value`).string()}),when(wn,e=>{V(e.node.value)&&e.property(`value`).string()}),when(X(fn,yr),e=>{V(e.node.customColor)&&e.property(`customColor`).enum(),V(e.node.themeColor)&&e.property(`themeColor`).enum()}),when(e=>$t(e)&&!X(h,je,Sn)(e)&&V(e.key),e=>e.property(`key`).property()),when(X(sr,Nn,o,_r,Mn,Ar,Er,Ue),e=>{V(e.node.value)&&e.property(`value`).enum()})}highlightElement(e,t){if(X(S,x,g)(e))return this.highlightNameAndKind(e);if(On(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===Jo)return`prune`;Go.warn(`Error highlighting node of type ${e._type}`,{error:t})}}highlightNameAndKind(e){if(this.mark(e).property(`name`).declaration.readonly.variable(),g(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:si(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 Yo=X(S,on);var FqnIndex=class extends bn{services;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 ei(e=>this.createDocumentIndex(e)),this.workspaceCache=new Ni(e.shared,E.IndexedContent),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(E.IndexedContent,e=>{oe(e)&&this.documentCache.delete(e)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=E.IndexedContent)}get(e){return e.state<E.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:O.basename(e.uri),state:e.state,expect:E.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=kr.readId(e);if(V(t))return t;let n=T.getDocument(e);return n.state<E.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:O.basename(n.uri)}),j(ut(n)),this.get(n),N(kr.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return k(this.workspaceCache.get(`${e}:fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}rootElements(e){return k(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 k(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 k(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,...di(a)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements.filter(Yo));if(t.length===0)return Xo.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 kr.writeId(t,i),o.set(i,a),a};function traverseElement(e,t){let n=Eo(e.name,t),o=createAndSaveDescription(e,e.name,n);t?i.set(t,o):r.push(o);let s=F(e.body?.elements??[],Yo);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=vr(e.element),n=G(e.body?.elements??[],F(S),I(e=>traverseElement(e,t)));if(n.length!==0)for(let e of[t,...ti(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(on(n)){traverseExtendElement(n);continue}traverseElement(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:O.basename(e.uri),error:t})}return new Xo(r,i,a,o,n)}};function uniqueByName(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>ni(e.name,t.name))}var Xo=class DocumentFqnIndex{_rootElements;_children;_descendants;_byfqn;projectId;static EMPTY=new DocumentFqnIndex([],new C,new C,new C,mr.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=ta(Vt,tt);var DeploymentsIndex=class extends FqnIndex{services;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 Xo.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 kr.writeId(t,i),o.set(i,a),a};function traverseElement(e,t){let n=s.getName(e);if(!V(n))return[];let o=Bi(n,t),c=createAndSaveDescription(e,n,o);if(t?i.set(t,c):r.push(c),g(e))return[c];let l=F(e.body?.elements??[],Zo);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=vr(e.deploymentNode),n=G(e.body?.elements??[],F(Zo),I(e=>traverseElement(e,t)));if(n.length!==0)for(let e of[t,...Ji(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:O.basename(e.uri),error:t})}return new Xo(r,i,a,o,n)}};const Qo=/^(aws|azure|gcp|tech):(.+)$/;function deriveTechnologyFromIcon(e){if(!e)return;let t=Qo.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;wa(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=yo(n),this.projectId=Ma(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,Ca(a)&&(a=u.title||oi(r)),u.tags&&ai(u.tags)&&(e=e?La([...u.tags,...e]):u.tags);let d=ko({...u.style,...n});return!s&&this.inferTechFromIcon&&(s=deriveTechnologyFromIcon(d.icon)),ko({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){y(e)}return null};toModelRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>{if(wa(r)&&this.specs.relationships[r]){let{multiple:e,...s}=this.specs.relationships[r];return{...s,...o,...i&&{links:i},source:t,target:n,kind:r,id:a}}return{...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===oi(e.id)&&t.title?t.title:i,ko({...t,...a,title:i,style:ko({...t.style,...r}),id:n})}catch(e){y(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>{if(wa(r)&&this.specs.relationships[r]){let{multiple:e,...s}=this.specs.relationships[r];return{...s,...o,...i&&{links:i},source:t,target:n,kind:r,id:a}}return{...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(ra(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=fa(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=La([...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=La([...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=La([...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=ka(r.specs.colors,e=>bo(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),fi,Fa((e,t)=>{let n=ui(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])&&!ia(t)||B(u[n])&&!ia(n)?(b.debug`Invalid relation ${e.id}
30
+ `)}}}getElementModelHover(e,t){let n=[],r=[...e.incoming(`direct`)].length,i=[...e.outgoing(`direct`)].length;(r>0||i>0)&&n.push(Wo,`<small>**${r}** incoming, **${i}** outgoing relationships</small> `);let printViewLink=e=>{let n=[e.id,t],r=ji.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(n))}`);return` - [${e.titleOrId}](${r})`},a=[...e.scopedViews()].map(printViewLink);a.length>0&&n.push(Wo,`<small>Element views:</small>`,...a);let o=[...e.views()].map(t=>t.isScopedElementView()&&t.viewOf===e?null:printViewLink(t)).filter(Ta);if(o.length>0){let e=a.length>0?`Also appears in views:`:`Appears in views:`;n.push(a.length>0?``:Wo,`<small>${e}</small>`,...o,` `)}return n.length>0?n.join(`
31
+ `):void 0}getDeploymentNodeHover(e){let t=T.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=la(n);return i&&r.push(``,i.md??i.txt),{contents:{kind:`markdown`,value:r.join(`
32
+ `)}}}getDeployedInstanceHover(e){let t=T.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(`
33
+ `)}}}},LikeC4CodeActionProvider=class{getCodeActions(e,t){}};const Go=b.getChild(`SemanticTokenProvider`),Ko={...Ua},qo={...Ha};function createSemanticTypeMethods(e){let t=[],n=new Proxy({},{get(r,i){if(i===`modifier`)return e=>(t.push(e),n);if(i in qo)return t.push(qo[i]),n;if(i in Ko)return()=>e(Ko[i],t);throw Error(`Unknown semantic token type or modifier: ${i}`)}});return n}const Jo=`Stop Highlighting`,stopHighlight=()=>{throw Jo};var LikeC4SemanticTokenProvider=class extends eo{services;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(Gt,e=>{e.property(`name`).function()}),when(X(Te,he,Or),e=>{e.property(`kind`).function()}),when(se,e=>{e.property(`name`).definition.function(),stopHighlight()}),when(X(yt,Vn),e=>{e.property(`value`).readonly.definition.interface()}),when(tr,e=>{e.cst().readonly.definition.variable(),stopHighlight()}),when(tn,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(fr,e=>{e.cst().function()}),when(Mt,e=>{B(e.node.value?.$refText)&&e.property(`value`).function()}),when(X(be,Ot,r),e=>{e.keyword(`metadata`).keyword(),e.property(`key`).property()}),when(X(wt,bt,ur,Mt),e=>{B(e.node.value)&&e.property(`value`).readonly.definition.type()}),when(X(et,an,r),e=>{e.property(`participant`).keyword()}),when(xe,e=>{B(e.node.kind)&&e.property(`kind`).definition.type()}),when(X(vn,Fn),e=>{e.property(`id`).readonly.definition.variable()}),when(Tn,e=>{e.property(`style`).readonly.definition.variable()}),when(X(qn,un),e=>{e.property(`name`).readonly.definition.variable()}),when(s,e=>{e.property(`predicate`).readonly.definition.variable()}),when($n,e=>{B(e.node.tag)&&e.property(`tag`).definition.type()}),when(X(hr,jr),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(br,e=>{e.node.parent?e.property(`el`).property():e.property(`el`).readonly.definition.variable()}),when(gr,e=>{e.keyword(`color`).keyword(),e.property(`name`).readonly.declaration.type()}),when(Bt,e=>{B(e.node.color)&&e.keyword(`color`).property()}),when(X(dn,In,nn),e=>{e.property(`kind`).readonly.declaration.type()}),when(ct,e=>{e.property(`name`).definition.type()}),when(Ct,e=>{e.property(`value`).number()}),when(Jt,e=>{if(e.node.libicon||e.node.value===`none`){e.property(e.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}e.property(`value`).string()}),when(wn,e=>{B(e.node.value)&&e.property(`value`).string()}),when(X(fn,yr),e=>{B(e.node.customColor)&&e.property(`customColor`).enum(),B(e.node.themeColor)&&e.property(`themeColor`).enum()}),when(e=>$t(e)&&!X(h,je,Sn)(e)&&B(e.key),e=>e.property(`key`).property()),when(X(sr,Nn,o,_r,Mn,Ar,Er,Ue),e=>{B(e.node.value)&&e.property(`value`).enum()})}highlightElement(e,t){if(X(S,x,g)(e))return this.highlightNameAndKind(e);if(On(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===Jo)return`prune`;Go.warn(`Error highlighting node of type ${e._type}`,{error:t})}}highlightNameAndKind(e){if(this.mark(e).property(`name`).declaration.readonly.variable(),g(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:si(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 Yo=X(S,on);var FqnIndex=class extends bn{services;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 ei(e=>this.createDocumentIndex(e)),this.workspaceCache=new Pi(e.shared,E.IndexedContent),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(E.IndexedContent,e=>{oe(e)&&this.documentCache.delete(e)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=E.IndexedContent)}get(e){return e.state<E.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:Mi.basename(e.uri),state:e.state,expect:E.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=kr.readId(e);if(B(t))return t;let n=T.getDocument(e);return n.state<E.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:Mi.basename(n.uri)}),A(ut(n)),this.get(n),M(kr.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,...di(a)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements.filter(Yo));if(t.length===0)return Xo.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 kr.writeId(t,i),o.set(i,a),a};function traverseElement(e,t){let n=Eo(e.name,t),o=createAndSaveDescription(e,e.name,n);t?i.set(t,o):r.push(o);let s=P(e.body?.elements??[],Yo);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=vr(e.element),n=W(e.body?.elements??[],P(S),F(e=>traverseElement(e,t)));if(n.length!==0)for(let e of[t,...ti(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(on(n)){traverseExtendElement(n);continue}traverseElement(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:Mi.basename(e.uri),error:t})}return new Xo(r,i,a,o,n)}};function uniqueByName(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>ni(e.name,t.name))}var Xo=class DocumentFqnIndex{_rootElements;_children;_descendants;_byfqn;projectId;static EMPTY=new DocumentFqnIndex([],new C,new C,new C,mr.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=na(Vt,tt);var DeploymentsIndex=class extends FqnIndex{services;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 Xo.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 kr.writeId(t,i),o.set(i,a),a};function traverseElement(e,t){let n=s.getName(e);if(!B(n))return[];let o=Vi(n,t),c=createAndSaveDescription(e,n,o);if(t?i.set(t,c):r.push(c),g(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=vr(e.deploymentNode),n=W(e.body?.elements??[],P(Zo),F(e=>traverseElement(e,t)));if(n.length!==0)for(let e of[t,...Yi(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:Mi.basename(e.uri),error:t})}return new Xo(r,i,a,o,n)}};const Qo=/^(aws|azure|gcp|tech):(.+)$/;function deriveTechnologyFromIcon(e){if(!e)return;let t=Qo.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;Ta(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=yo(n),this.projectId=Na(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,wa(a)&&(a=u.title||oi(r)),u.tags&&ai(u.tags)&&(e=e?Ra([...u.tags,...e]):u.tags);let d=ko({...u.style,...n});return!s&&this.inferTechFromIcon&&(s=deriveTechnologyFromIcon(d.icon)),ko({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){y(e)}return null};toModelRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>{if(Ta(r)&&this.specs.relationships[r]){let{multiple:e,...s}=this.specs.relationships[r];return{...s,...o,...i&&{links:i},source:t,target:n,kind:r,id:a}}return{...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===oi(e.id)&&t.title?t.title:i,ko({...t,...a,title:i,style:ko({...t.style,...r}),id:n})}catch(e){y(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>{if(Ta(r)&&this.specs.relationships[r]){let{multiple:e,...s}=this.specs.relationships[r];return{...s,...o,...i&&{links:i},source:t,target:n,kind:r,id:a}}return{...i&&{links:i},...o,source:t,target:n,id:a}}},LastSeenArtifacts=class extends bn{#e=new Map;#t=new Map;#n=new Map;constructor(e){super();let clearCache=()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()};this.onDispose(e.shared.workspace.WorkspaceManager.onForceCleanCache(clearCache),Si.create(clearCache))}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(ia(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=pa(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=Ra([...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=Ra([...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=Ra([...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=Aa(r.specs.colors,e=>bo(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),fi,Ia((e,t)=>{let n=ui(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=Y.flatten(e.source),n=Y.flatten(e.target);return z(u[t])&&!aa(t)||z(u[n])&&!aa(n)?(b.debug`Invalid relation ${e.id}
34
34
  source: ${t} resolved: ${!!u[t]}
35
- target: ${n} resolved: ${!!u[n]}\n`,!1):!0}),U(e=>{let t=er(`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=La([...r,...i]);a[t]=o.length===1?o[0]:o}}}let o=La(r),s=i;return{...e,...L(o,1)&&{tags:o},...L(s,1)&&{links:s},...!z(a)&&{metadata:a}}}),ha(scanMetadataKeys),ba(Pa(`id`))),f=G(n,I(e=>(s.merge(e.c4ExtendDeployments),U(e.c4Deployments,r.toDeploymentElement))),F(V),fi,Fa((e,t)=>{let n=ui(t.id);return n&&B(e[n])?(b.debug`No parent found for deployment element ${t.id}`,e):(e[t.id]=na(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}
35
+ target: ${n} resolved: ${!!u[n]}\n`,!1):!0}),H(e=>{let t=er(`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=Ra([...r,...i]);a[t]=o.length===1?o[0]:o}}}let o=Ra(r),s=i;return{...e,...I(o,1)&&{tags:o},...I(s,1)&&{links:s},...!R(a)&&{metadata:a}}}),ga(scanMetadataKeys),xa(Fa(`id`))),f=W(n,F(e=>(s.merge(e.c4ExtendDeployments),H(e.c4Deployments,r.toDeploymentElement))),P(B),fi,Ia((e,t)=>{let n=ui(t.id);return n&&z(e[n])?(b.debug`No parent found for deployment element ${t.id}`,e):(e[t.id]=ra(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}
36
36
  source: ${e.source.deployment} resolved: ${!!f[e.source.deployment]}
37
- target: ${e.target.deployment} resolved: ${!!f[e.target.deployment]}\n`,!1):!0:!1),Fa((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[Oo]===`element`&&B(i)&&`viewOf`in e&&(i=u[e.viewOf]?.title??null),B(i)&&r===`index`&&(i=`Landscape view`),{...Aa(s,e=>e===void 0),[Do]:`parsed`,sourcePath:O.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({[Do]:`parsed`,[Oo]:`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[Oo]===`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)||ia(n))continue;let r=`__`+n.replaceAll(`.`,`_`);t.has(r)||(t.add(r),m.push({[Do]:`parsed`,[Oo]:`element`,id:r,viewOf:n,title:`Auto / ${(u[n]?.title??n).replaceAll(`
38
- `,` `)}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let ee=G(m,ba(Pa(`id`)));m.some(Ao)&&(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:{[Do]:`parsed`,projectId:t.id,project:ko({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:ka(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(ni)},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 bn{services;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=Na(ya(),F(t=>e(t)&&!this.projects.isExcluded(t)),U(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(E.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 Fi(t),this.cache.parsedModel(e,()=>{let t=Q.getChild(e),n=this.unsafeSyncJoinedModelData(e);return n?q.create(n):(t.debug`parseModel: returning EMPTY`,q.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!==mr.DefaultProjectId&&n.warn`unsafeSyncComputeModel: returning EMPTY`,q.EMPTY.asComputed;let i=lr(),a=q.create(r),o=[];for(let e of Ra(r.views)){let r=fo(e,a);if(!r.isSuccess){n.warn(w(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},[Ki]:`computed`,views:ba(o,Pa(`id`))};return n.debug(`computeModel${t?` with manual layouts`:``}: {status} in ${i.pretty}`,{status:`completed`}),this.lastSeen.rememberModel(q.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 Fi(t);let r=this.projects.getProject(e),i=await this.manualLayouts.read(r),a=this.unsafeSyncComputeModel(e,i);return a===q.EMPTY&&e!==mr.DefaultProjectId&&n.warn(`computeModel returned EMPTY`),a})}onModelParsed(e){return this.listeners.push(e),Si.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=xa(e)?G(e,va(e=>this.projects.ownerProjectId(e)),da()):[[e,[]]];for(let e of this.listeners)try{for(let[n,r]of t)e(n,r)}catch(e){Q.warn(w(e))}}},ProjectModelCache=class extends hi{constructor(e){super(e=>typeof e==`string`?e:e.id),this.toDispose.push(e.shared.workspace.DocumentBuilder.onDocumentPhase(E.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=La(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:$o,findNodeForProperty:es}=D,{getDocument:ts,streamAllContents:ns}=T,rs=b.getChild(`locator`);var LikeC4ModelLocator=class{services;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=Da(t)?this.projects.ensureProjectId():_(t)),Da(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=ts(t),a=this.findParsedElementByFqnIn(r,i);return a&&i?{projectId:n,element:a,document:i}:null}catch(e){return rs.debug(w(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t){let[n,r]=la(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)&&!Or(r))continue;let i=r.kind?es(r.$cstNode,`kind`):void 0;if(i??=r.dotKind?es(r.$cstNode,`dotKind`):void 0,i??=$o(r.$cstNode,`->`),i??=es(r.$cstNode,`title`),i??=es(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(On(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?es(r.$cstNode,`name`):void 0;return i??=$o(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<E.Linked&&(rs.debug(`Waiting for document ${n.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(E.Linked,n.uri,t));let r=_(n);rs.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)??go.DEFAULT;if(!e)return rs.trace(`No specification or styles found for project ${r}, cannot locate tags for document ${n.uri.fsPath}`),null;let i=G(ns(n.parseResult.value),ri(e=>ct(e)||ee(e)),pi(),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 ii(a,`Tag ${r} not found in merged specification`),ii(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 rs.warn(`Fail on tag ${r}`,{err:e}),[]}}));return rs.debug(`Found ${i.length} tags in document ${n.uri.path}`),i}catch(e){return rs.warn(w(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:n}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!n)return null;if(!En(n)||!n.body)return rs.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 rs.warn(`Failed to locate dynamic view step ${r} in view ${e.view}`),null;let a=i.kind?es(i.$cstNode,`kind`):void 0;return a??=i.dotKind?es(i.$cstNode,`dotKind`):void 0,a??=$o(i.$cstNode,`->`),a??=$o(i.$cstNode,`<-`),a??=es(i.$cstNode,`title`),a??=es(i.$cstNode,`target`),a??=i.$cstNode,a?{uri:t.uri.toString(),range:{start:a.range.start,end:a.range.start}}:null}};const is=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function tryOrLog(e){return async function(t,n,r){try{let i=e(t,n,r);Ea(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:as}=T,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;is.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=_(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;is.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=_(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=as(e),i=t.forDocument(r),a;try{a=i._resolveDeploymentRelationSource(e)}catch(t){b.warn(w(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}oa(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&&($i(i,o)||$i(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}T.hasContainerOfType(e,ze)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:os}=T,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}is.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let a=os(e),o=a.uri,s=n.getAstNodePath(e),c=t.byFqn(_(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)=>{pn(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:ss}=T,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=_(ss(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=>Jt(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),je(n)&&f(n.$container)&&n.$container.props.some(e=>Jt(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||Da(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let n=Ta(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((!Ta(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!Ta(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!Ta(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),Ta(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),Da(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(T.getDocument(e)),i=Rn(()=>r._resolveRelationSource(e));if(!i){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let a=Rn(()=>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`})),oa(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 Ni(e.shared,E.Linked),calcFingerprint=({source:e,target:t,kind:n,title:r})=>er(`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=T.getDocument(e),i=t.forDocument(r),a=Rn(()=>i.parseFqnRef(e.source));if(!a){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let o=Rn(()=>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=_(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)=>{is.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=_(e),i=t.projectElements(r,St).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==T.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)=>{is.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=_(e),i=t.projectElements(r,ve).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==T.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=_(e),a=t.projectElements(i,`Tag`).filter(t=>t.name===r&&t.node!==e).head();if(a){let t=a.documentUri!==T.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)=>{is.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=_(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=_(e),i=t.projectElements(r,Xn),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=_(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`})})},cs=/@likec4-generated/,viewChecks=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{let r=gi.findCommentNode(e.$cstNode,[`BLOCK_COMMENT`]);if(r&&cs.test(r.text)&&n(`warning`,`ManualLayoutV1 is no longer supported; remove this block`,{node:e,range:r.range}),!e.name)return;is.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let i=_(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(tn),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=Tr(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(T.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:ci(o)}})},checkFqnRefExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{let r=t.forDocument(T.getDocument(e)).parseFqnRefExpr(e),i=Tr(e),a=ot(e)&&!T.hasContainerOfType(e,e=>ae(e)||fe(e));if(i?.$type===`DeploymentViewRulePredicate`||a){if(!T.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`&&!Sr(e.$container)&&B(T.getContainerOfType(e,De)?.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}),checkOutgoingRelationExpr=e=>tryOrLog((e,t)=>{if(Tr(e)?.$type===`ViewRulePredicate`&&e.$container.$type!==`DirectedRelationExpr`&&e.from.$type===`WildcardExpression`){let n=T.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=T.getContainerOfType(e,le);if(!r||r.isInclude!==!0)return;let i=T.getDocument(e),a=t.forDocument(i),o=Wi.unwrap(a.parseRelationExpr(e)),s=`Model reference is allowed in exclude predicate only`;if(Wi.isDirect(o)){(Vi.isModelRef(o.source)||Vi.isModelRef(o.target))&&n(`error`,s,{node:e});return}let c;if(c=Wi.isIncoming(o)?o.incoming:Wi.isOutgoing(o)?o.outgoing:o.inout,Vi.isModelRef(c)){n(`error`,s,{node:e});return}})},checkRelationExprWith=e=>tryOrLog((e,t)=>{let n=Tr(e);if(!(!n||n.$type==`DynamicViewIncludePredicate`)&&!n.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var LikeC4DocumentValidator=class extends _i{services;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 ls=X(m,st,mn,qn,un,Fn,vn,Zt,sn,xn,Dt,we,An,c,pt,le,kt,Dt,tn,ce,Dr,Cr,ie,Fe,On,Ce,g,x,Or,Wn,Ue,de,h,Te,jt,_t,Yt,yt,S,f,je,Tt,on,dr,tt,i,Bn,nr,dn,In,nn,Bt,gr,hn,Lt,rn),findInvalidContainer=e=>{let t=e;for(;t&&!re(t);){if(ls(t))return t;t=t.$container}};function checksFromDiagnostics(e){let t=e.state>=E.Validated?e.diagnostics?.filter(e=>e.severity===za.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&&li(()=>{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(w(e)))})})}const us=b.getChild(`parser`);function toSingleLine(e){if(e==null)return;let t=removeIndent(e);return Da(t)?t.split(`
37
+ target: ${e.target.deployment} resolved: ${!!f[e.target.deployment]}\n`,!1):!0:!1),Ia((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[Oo]===`element`&&z(i)&&`viewOf`in e&&(i=u[e.viewOf]?.title??null),z(i)&&r===`index`&&(i=`Landscape view`),{...ja(s,e=>e===void 0),[Do]:`parsed`,sourcePath:Mi.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({[Do]:`parsed`,[Oo]:`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[Oo]===`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)||aa(n))continue;let r=`__`+n.replaceAll(`.`,`_`);t.has(r)||(t.add(r),m.push({[Do]:`parsed`,[Oo]:`element`,id:r,viewOf:n,title:`Auto / ${(u[n]?.title??n).replaceAll(`
38
+ `,` `)}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let ee=W(m,xa(Fa(`id`)));m.some(Ao)&&(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:{[Do]:`parsed`,projectId:t.id,project:ko({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:Aa(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(ni)},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 bn{services;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,Si.create(()=>{this.listeners.length=0}),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=Pa(ba(),P(t=>e(t)&&!this.projects.isExcluded(t)),H(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(E.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]??[]);I(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 Ii(t),this.cache.parsedModel(e,()=>{let t=Q.getChild(e),n=this.unsafeSyncJoinedModelData(e);return n?q.create(n):(t.debug`parseModel: returning EMPTY`,q.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!==mr.DefaultProjectId&&n.warn`unsafeSyncComputeModel: returning EMPTY`,q.EMPTY.asComputed;let i=lr(),a=q.create(r),o=[];for(let e of za(r.views)){let r=fo(e,a);if(!r.isSuccess){n.warn(w(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},[qi]:`computed`,views:xa(o,Fa(`id`))};return n.debug(`computeModel${t?` with manual layouts`:``}: {status} in ${i.pretty}`,{status:`completed`}),this.lastSeen.rememberModel(q.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 Ii(t);let r=this.projects.getProject(e),i=await this.manualLayouts.read(r),a=this.unsafeSyncComputeModel(e,i);return a===q.EMPTY&&e!==mr.DefaultProjectId&&n.warn(`computeModel returned EMPTY`),a})}onModelParsed(e){return this.listeners.push(e),Si.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;if(Sa(e)){if(t=W(e,ya(e=>this.projects.ownerProjectId(e)),fa()),wa(t))return}else t=[[e,[]]];for(let e of[...this.listeners])for(let[n,r]of t)try{e(n,r)}catch(e){Q.warn(w(e))}}},ProjectModelCache=class extends hi{constructor(e){super(e=>typeof e==`string`?e:e.id),this.toDispose.push(e.shared.workspace.DocumentBuilder.onDocumentPhase(E.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=Ra(H(n,t.ownerProjectId.bind(t)));if(!I(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:$o,findNodeForProperty:es}=D,{getDocument:ts,streamAllContents:ns}=T,rs=b.getChild(`locator`);var LikeC4ModelLocator=class{services;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=Oa(t)?this.projects.ensureProjectId():_(t)),Oa(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=ts(t),a=this.findParsedElementByFqnIn(r,i);return a&&i?{projectId:n,element:a,document:i}:null}catch(e){return rs.debug(w(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t){let[n,r]=ua(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)&&!Or(r))continue;let i=r.kind?es(r.$cstNode,`kind`):void 0;if(i??=r.dotKind?es(r.$cstNode,`dotKind`):void 0,i??=$o(r.$cstNode,`->`),i??=es(r.$cstNode,`title`),i??=es(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(On(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?es(r.$cstNode,`name`):void 0;return i??=$o(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<E.Linked&&(rs.debug(`Waiting for document ${n.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(E.Linked,n.uri,t));let r=_(n);rs.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)??go.DEFAULT;if(!e)return rs.trace(`No specification or styles found for project ${r}, cannot locate tags for document ${n.uri.fsPath}`),null;let i=W(ns(n.parseResult.value),ri(e=>ct(e)||ee(e)),pi(),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 ii(a,`Tag ${r} not found in merged specification`),ii(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 rs.warn(`Fail on tag ${r}`,{err:e}),[]}}));return rs.debug(`Found ${i.length} tags in document ${n.uri.path}`),i}catch(e){return rs.warn(w(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:n}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!n)return null;if(!En(n)||!n.body)return rs.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 rs.warn(`Failed to locate dynamic view step ${r} in view ${e.view}`),null;let a=i.kind?es(i.$cstNode,`kind`):void 0;return a??=i.dotKind?es(i.$cstNode,`dotKind`):void 0,a??=$o(i.$cstNode,`->`),a??=$o(i.$cstNode,`<-`),a??=es(i.$cstNode,`title`),a??=es(i.$cstNode,`target`),a??=i.$cstNode,a?{uri:t.uri.toString(),range:{start:a.range.start,end:a.range.start}}:null}};const is=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function tryOrLog(e){return async function(t,n,r){try{let i=e(t,n,r);Da(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:as}=T,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;is.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=_(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;is.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=_(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=as(e),i=t.forDocument(r),a;try{a=i._resolveDeploymentRelationSource(e)}catch(t){b.warn(w(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}sa(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&&(ea(i,o)||ea(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`})})},dynamicViewParallelSteps=e=>tryOrLog((e,t)=>{for(let n of e.steps)we(n)&&t(`error`,`Nested parallel blocks are not allowed`,{node:n})}),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}T.hasContainerOfType(e,ze)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:os}=T,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}is.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let a=os(e),o=a.uri,s=n.getAstNodePath(e),c=t.byFqn(_(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)=>{pn(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:ss}=T,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=_(ss(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=>Jt(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),je(n)&&f(n.$container)&&n.$container.props.some(e=>Jt(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||Oa(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let n=Ea(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((!Ea(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!Ea(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!Ea(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),Ea(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),Oa(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(T.getDocument(e)),i=Rn(()=>r._resolveRelationSource(e));if(!i){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let a=Rn(()=>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`})),sa(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 Pi(e.shared,E.Linked),calcFingerprint=({source:e,target:t,kind:n,title:r})=>er(`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=T.getDocument(e),i=t.forDocument(r),a=Rn(()=>i.parseFqnRef(e.source));if(!a){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let o=Rn(()=>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=_(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)=>{is.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=_(e),i=t.projectElements(r,St).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==T.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)=>{is.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=_(e),i=t.projectElements(r,ve).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==T.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=_(e),a=t.projectElements(i,`Tag`).filter(t=>t.name===r&&t.node!==e).head();if(a){let t=a.documentUri!==T.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)=>{is.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=_(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=_(e),i=t.projectElements(r,Xn),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=_(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`})})},cs=/@likec4-generated/,viewChecks=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{let r=gi.findCommentNode(e.$cstNode,[`BLOCK_COMMENT`]);if(r&&cs.test(r.text)&&n(`warning`,`ManualLayoutV1 is no longer supported; remove this block`,{node:e,range:r.range}),!e.name)return;is.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let i=_(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(tn),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=Tr(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(T.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:ci(o)}})},checkFqnRefExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{let r=t.forDocument(T.getDocument(e)).parseFqnRefExpr(e),i=Tr(e),a=ot(e)&&!T.hasContainerOfType(e,e=>ae(e)||fe(e));if(i?.$type===`DeploymentViewRulePredicate`||a){if(!T.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}}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 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`&&!Sr(e.$container)&&z(T.getContainerOfType(e,De)?.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}),checkOutgoingRelationExpr=e=>tryOrLog((e,t)=>{if(Tr(e)?.$type===`ViewRulePredicate`&&e.$container.$type!==`DirectedRelationExpr`&&e.from.$type===`WildcardExpression`){let n=T.getContainerOfType(e,De);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=T.getContainerOfType(e,le);if(!r||r.isInclude!==!0)return;let i=T.getDocument(e),a=t.forDocument(i),o=Gi.unwrap(a.parseRelationExpr(e)),s=`Model reference is allowed in exclude predicate only`;if(Gi.isDirect(o)){(Hi.isModelRef(o.source)||Hi.isModelRef(o.target))&&n(`error`,s,{node:e});return}let c;if(c=Gi.isIncoming(o)?o.incoming:Gi.isOutgoing(o)?o.outgoing:o.inout,Hi.isModelRef(c)){n(`error`,s,{node:e});return}})},checkRelationExprWith=e=>tryOrLog((e,t)=>{let n=Tr(e);if(!(!n||n.$type==`DynamicViewIncludePredicate`)&&!n.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var LikeC4DocumentValidator=class extends _i{services;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 ls=X(m,st,mn,qn,un,Fn,vn,Zt,sn,xn,Dt,we,An,c,pt,le,kt,Dt,tn,ce,Dr,Cr,ie,Fe,On,Ce,g,x,Or,Wn,Ue,de,h,Te,jt,_t,Yt,yt,S,f,je,Tt,on,dr,tt,i,Bn,nr,dn,In,nn,Bt,gr,hn,Lt,rn),findInvalidContainer=e=>{let t=e;for(;t&&!re(t);){if(ls(t))return t;t=t.$container}};function checksFromDiagnostics(e){let t=e.state>=E.Validated?e.diagnostics?.filter(e=>e.severity===Ba.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),DynamicViewParallelSteps:dynamicViewParallelSteps(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&&li(()=>{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(w(e)))})})}const us=b.getChild(`parser`);function toSingleLine(e){if(e==null)return;let t=removeIndent(e);return Oa(t)?t.split(`
39
39
  `).join(` `):`md`in t?{md:t.md.split(`
40
40
  `).join(` `)}:{txt:t.txt.split(`
41
- `).join(` `)}}function removeIndent(e){if(e!=null)switch(!0){case Da(e):return jo(e).trim();case Le(e)&&Da(e.markdown):return{md:jo(e.markdown).trim()};case Le(e)&&Da(e.text):return{txt:jo(e.text).trim()};case Le(e):return{txt:``};default:return}}var BaseParser=class{services;doc;project;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=O.relative(n.folderUri,t.uri)}logError(e,t,n){let r=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(Ii(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`?us.getChild(n).debug(r):us.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=_(e),n=this.resolveFqn(N(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,n),Hi(t,n)}return on(e)?vr(e.element):tt(e)?vr(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,va(([e])=>e),ka(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)?La(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,wn),e=>{let t=e.value;if(Ca(t))return;let n=V(e.title)?toSingleLine(e.title):void 0,r=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return Qi({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&&Ka(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&&qa(n):return Ja(this.doc.uri.toString(),`../`,n);case n&&Ga(n):return Ya(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){us.warn(`Image alias "${n}" not found in project configuration`);return}let a=r?Ya(i,r):i;return Ya(this.project.folderUri.toString(),a)}parseColorLiteral(e){if(this.isValid(e)){if(zt(e))return`#${e.hex}`;if(Zn(e)){let t=Ta(e.alpha)?e.alpha:void 0;return Da(e.alpha)&&(t=Dn(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(xa(e)){let t=this.parseStyleProps(e.find(je)?.props);try{let n=this.parseIconProperty(e.find(Jt));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 _r(n):V(n.value)&&(t.border=n.value);break;case fn(n):{let e=Je(n);V(e)&&(t.color=e);break}case sr(n):V(n.value)&&(t.shape=n.value);break;case Jt(n):{let e=this.parseIconProperty(n);V(e)&&(t.icon=e);break}case yr(n):{let e=Je(n);V(e)&&(t.iconColor=e);break}case Er(n):V(n.value)&&(t.iconSize=a(n));break;case Ar(n):V(n.value)&&(t.iconPosition=ne(n));break;case Ct(n):t.opacity=We(n);break;case u(n):t.multiple=Sa(n.value)?n.value:!1;break;case Qt(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 Qi(t)}parseBaseProps(e,t){let n=removeIndent(t?.title??v(e.title)),r=t?.description?{txt:removeIndent(t.description)}:this.parseMarkdownOrString(e.description);return Qi({title:n,summary:t?.summary?{txt:removeIndent(t.summary)}:this.parseMarkdownOrString(e.summary),description:r,technology:toSingleLine(t?.technology)??removeIndent(v(e.technology))})}};function*streamDeploymentModel(e){let t=Ui.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(Or(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 Or(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case g(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 Qi({id:n,kind:r,title:l??sa(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 Qi({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:Qi({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(rr),F(e=>V(e.value)),W(e=>[e.key,e.value])),u=G(e.body?.props??[],F(Vn),ma())?.value.view.ref?.name,d=this.parseBaseProps(l,{title:e.title}),f=e.body?.props.find(Sn);return Qi({id:er(`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_`+er(this.doc.uri.toString(),r);let{title:a=null,description:o=null}=this.parseBaseProps(G(n,F(Pe),W(e=>[e.key,e.value]))),s=this.convertTags(t),c=this.convertLinks(t);return qt.writeId(e,i),{[Ri._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(kn(e))return Be(e);if(Ke(e))return{includeAncestors:e.value};if(ae(e))return this.parseDeploymentViewRuleStyle(e);P(e)}parseDeploymentViewRulePredicate(e){let t=[],n=e.expr;for(;n;){try{let e=n.value;wa(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){y(e)}n=n.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(Dr)),n=removeIndent(v(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!et(e)&&!an(e)&&!r(e)?null:e.participant}function parseWhereClause(e){switch(!0){case zn(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 ge(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 Ae(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 gt(e)||It(e):return{not:parseWhereClause(e.value)};case it(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=[ea(t)?t.and:t,ea(n)?n.and:n].flat();return j(M(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[aa(t)?t.or:t,aa(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:_(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=Pn(e);if(n){let e={project:_(n),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let r=_n(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(Un(e))return this.parseFqnExprOrWith(e);if($e(e))return this.parseRelationExprOrWith(e);P(e)}parseFqnExprOrWith(e){if(Zt(e))return this.parseFqnExprWith(e);if(Wt(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(v(t.value));return n&&(e.custom[t.key]=n),e}if(Jt(t)){let n=this.parseIconProperty(t);return R(n)&&(e.custom[t.key]=n),e}if(fn(t)){let n=Je(t);return R(n)&&(e.custom[t.key]=n),e}if(sr(t)||_r(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(yr(t)){let n=Je(t);return R(n)&&(e.custom[t.key]=n),e}if(ye(t)){let n=V(t.value)?removeIndent(v(t.value)):void 0;return n&&(e.custom[t.key]=n),e}if(u(t))return Sa(t.value)&&(e.custom[t.key]=t.value),e;if(Qt(t)||ft(t)||ke(t)||Er(t))return V(t.value)&&(e.custom[t.key]=a(t)),e;if(Ar(t))return V(t.value)&&(e.custom[t.key]=t.value),e;P(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(or(e))return this.parseFqnExprWhere(e);if(xn(e))return this.parseFqnExpr(e);P(e)}parseFqnExprWhere(e){return j(!or(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(tr(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($n(e))return j(e.tag.tag.ref,`Tag ${e.$cstNode?.text} is not resolved`),{elementTag:e.tag.tag.$refText,isEqual:e.isEqual};if(tn(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{wa(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(sn(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(rr(t)||ye(t)){if(t.key===`description`){let n=this.parseMarkdownOrString(t.value);return n&&(e.description=n),e}let n=removeIndent(v(t.value));return n&&(e[t.key]=n),e}if(Nn(t))return V(t.value)&&(e[t.key]=t.value),e;if(fn(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(Vn(t)){let n=t.value.view.ref?.name;return V(n)&&(e[t.key]=n),e}if(u(t))return Sa(t.value)&&(e[t.key]=t.value),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(qn(e)){let r=this.parseGlobalPredicateGroup(e);L(r,1)&&(n.predicates[t]=r);return}if(un(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(Fn(e))return[this.parseViewRuleStyle(e)];if(vn(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=Ui.from(e.parseResult.value.models.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(Te(r)){n.push(r);continue}if(Bn(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(on(t)){let n=this.parseExtendElement(t);n&&e.c4ExtendElements.push(n);continue}if(Bn(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 ko({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&&Ca(n)&&!r)return null;let i=this.getAstNodePath(e);return ko({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 ko({id:er(`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)||dr(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(rr),F(e=>V(e.value)),W(e=>[e.key,e.value])),u=G(e.body?.props??[],F(Vn),U(e=>e.value.view.ref?.name),F(V),ma()),{title:d=``,description:f,technology:p}=this.parseBaseProps(l,{title:e.title,description:e.description,technology:e.technology}),m=e.body?.props.find(Sn);return ko({id:er(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(Zt(e))return this.parseFqnExprWith(e);if(Wt(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(yn)??[],F(e=>this.isValid(e)&&wa(e.value)),W(e=>[e.key,removeIndent(v(e.value))]),Aa(B)),a=n.filter(u);a.length>1&&this.logError(`Duplicate 'multiple' property for relationship "${r}", using the first one`,e,`specification`);let o=a[0];t.relationships[r]={...i,...ue(n.filter(Wn),this.isValid),...o&&{multiple:o.value}}}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:si(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(Jn)??[],F(e=>this.isValid(e)),W(e=>[e.key,e.value])),c=this.parseBaseProps(s),l=removeIndent(v(s.notation));return{[r]:Qi({...c,notation:l,tags:i??void 0,...o&&Ri.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 En(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&&Rn(()=>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_`+er(this.doc.uri.toString(),r,i??``);let{title:o=null,description:s=null}=this.parseBaseProps(G(n.props,F(e=>this.isValid(e)),F(Pe),W(e=>[e.key,e.value]))),c=this.convertTags(n),l=this.convertLinks(n),u={[Ri._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(qt.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(He(e))return this.parseViewRulePredicate(e);if(s(e))return this.parseViewRuleGlobalPredicateRef(e);if(Ce(e))return this.parseViewRuleStyleOrGlobalRef(e);if(kn(e))return Be(e);if(Re(e))return this.parseViewRuleGroup(e);if(Xe(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(fe(e))return this.parseViewRuleStyle(e);if(Tn(e))return this.parseViewRuleGlobalStyle(e);P(e)}parseViewRuleGroup(e){let t=[];for(let n of e.groupRules)try{if(!this.isValid(n))continue;if(He(n)){t.push(this.parseViewRulePredicate(n));continue}if(Re(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=>Ri.ModelExpression.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>Ri.ModelExpression.isFqnExpr(e)),n=this.parseStyleProps(e.props.filter(Dr)),r=removeIndent(v(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_`+er(this.doc.uri.toString(),a);let{title:s=null,description:c=null}=this.parseBaseProps(G(i,F(Pe),W(e=>[e.key,e.value]))),l=this.convertTags(n),u=this.convertLinks(n);qt.writeId(e,o);let d=fa(i,Ue)?.value;return{[Ri._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(Ce(e))return this.parseViewRuleStyleOrGlobalRef(e);if(kn(e))return Be(e);P(e)}parseDynamicViewIncludePredicate(e){let t=[],n=e.exprs;for(;n;)this.tryParse(`views`,n.value,e=>{if(Un(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=Oa(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 Vn(t):{let e=t.value.view.ref?.name;V(e)&&(n.navigateTo=e);break}case rr(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(v(t.value))??``;break;case ht(t):R(t.value)&&(n[t.key]=removeIndent(t.value));break;case Nn(t):R(t.value)&&(n[t.key]=t.value);break;case fn(t):{let e=Je(t);R(e)&&(n[t.key]=e);break}case o(t):R(t.value)&&(n[t.key]=t.value);break;case u(t):break;default:P(t)}}catch(e){this.logError(e,t,`views`)}return n}}}function pathInsideDynamicView(e){let t=e,n=[];for(;!ze(t);)Ta(t.$containerIndex)&&n.unshift(`@${t.$containerIndex}`),n.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return n.join(``)}const ds=G(BaseParser,ExpressionV2Parser,ImportsParser,ModelParser,DeploymentModelParser,DeploymentViewParser,PredicatesParser,SpecificationParser,ViewsParser,GlobalsParser);var DocumentParser=class extends ds{};const fs=b.getChild(`parser`),isError=e=>e.severity===za.Error;var LikeC4ModelParser=class{services;cachedParsers=new ei(e=>this.createParser(e));constructor(e){this.services=e,e.shared.workspace.DocumentBuilder.onDocumentPhase(E.Linked,async e=>{this.cachedParsers.has(e)&&(fs.trace(`Linked: clear cached parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:O.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(E.Linked,async t=>{for(let n of t)if(!e.shared.workspace.ProjectsManager.isExcluded(n))try{this.parse(n)}catch(e){y(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(E.Validated,async e=>{e.diagnostics?.some(isError)&&this.cachedParsers.has(e)&&(fs.trace(`Validated: clear cached parser {projectId} document {doc} because of errors`,{projectId:e.likec4ProjectId,doc:O.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){ii(ut(e),`Document ${e.uri.toString()} is not a LikeC4 document`);let t=this.services.shared.workspace.ProjectsManager.getProject(e),n=O.relative(t.folderUri,e.uri);e.likec4ProjectId?fs.trace(`create parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:n}):fs.debug(`create parser for document without project {doc}`,{doc:e.uri.fsPath}),e.state<E.Linked&&fs.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 xi{runConverter(e,t,n){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),Mi.convertString(t)):super.runConverter(e,t,n)}};const{findNodeForKeyword:ps}=D,asViewStyleRule=(e,t,n=0)=>{let r=n>0?` `.repeat(n):``;return[r+`style ${e} {`,...da(t).map(([e,t])=>r+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),r+`}`]},isMatchingViewRule=(e,t)=>n=>{if(!fe(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=Oa(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=>fe(e)||ae(e)),u=t[qi]===`element`?t.viewOf??null:null,d=[],f=[];r.forEach(e=>{let t=pa(l,isMatchingViewRule(e,c)),n=u&&$i(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(Wa.insert(o,`
41
+ `).join(` `)}}function removeIndent(e){if(e!=null)switch(!0){case Oa(e):return jo(e).trim();case Le(e)&&Oa(e.markdown):return{md:jo(e.markdown).trim()};case Le(e)&&Oa(e.text):return{txt:jo(e.text).trim()};case Le(e):return{txt:``};default:return}}var BaseParser=class{services;doc;project;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=Mi.relative(n.folderUri,t.uri)}logError(e,t,n){let r=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(Li(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`?us.getChild(n).debug(r):us.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(st(e)){let t=_(e),n=this.resolveFqn(M(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,n),Ui(t,n)}return on(e)?vr(e.element):tt(e)?vr(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(Le(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(Ve(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,ya(([e])=>e),Aa(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(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=>M(e.tag.ref,`Tag reference is not resolved`).name).filter(B)),t=t.prev;return j(n)?Ra(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,wn),e=>{let t=e.value;if(wa(t))return;let n=B(e.title)?toSingleLine(e.title):void 0,r=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return $i({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){us.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(Zn(e)){let t=Ea(e.alpha)?e.alpha:void 0;return Oa(e.alpha)&&(t=Dn(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(Sa(e)){let t=this.parseStyleProps(e.find(je)?.props);try{let n=this.parseIconProperty(e.find(Jt));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 _r(n):B(n.value)&&(t.border=n.value);break;case fn(n):{let e=Je(n);B(e)&&(t.color=e);break}case sr(n):B(n.value)&&(t.shape=n.value);break;case Jt(n):{let e=this.parseIconProperty(n);B(e)&&(t.icon=e);break}case yr(n):{let e=Je(n);B(e)&&(t.iconColor=e);break}case Er(n):B(n.value)&&(t.iconSize=a(n));break;case Ar(n):B(n.value)&&(t.iconPosition=ne(n));break;case Ct(n):t.opacity=We(n);break;case u(n):t.multiple=Ca(n.value)?n.value:!1;break;case Qt(n):B(n.value)&&(t.size=a(n));break;case ke(n):B(n.value)&&(t.padding=a(n));break;case ft(n):B(n.value)&&(t.textSize=a(n));break;default:N(n)}}catch(e){this.logError(e,n)}return $i(t)}parseBaseProps(e,t){let n=removeIndent(t?.title??v(e.title)),r=t?.description?{txt:removeIndent(t.description)}:this.parseMarkdownOrString(e.description);return $i({title:n,summary:t?.summary?{txt:removeIndent(t.summary)}:this.parseMarkdownOrString(e.summary),description:r,technology:toSingleLine(t?.technology)??removeIndent(v(e.technology))})}};function*streamDeploymentModel(e){let t=Wi.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(Or(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 Or(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case g(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: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 $i({id:n,kind:r,title:l??ca(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 $i({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:$i({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(rr),P(e=>B(e.value)),U(e=>[e.key,e.value])),u=W(e.body?.props??[],P(Vn),ha())?.value.view.ref?.name,d=this.parseBaseProps(l,{title:e.title}),f=e.body?.props.find(Sn);return $i({id:er(`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;A(t,`DynamicElementView body is not defined`);let n=t.props.filter(this.isValid),r=this.getAstNodePath(e),i=e.name;i||=`deployment_`+er(this.doc.uri.toString(),r);let{title:a=null,description:o=null}=this.parseBaseProps(W(n,P(Pe),U(e=>[e.key,e.value]))),s=this.convertTags(t),c=this.convertLinks(t);return qt.writeId(e,i),{[zi._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(kn(e))return Be(e);if(Ke(e))return{includeAncestors:e.value};if(ae(e))return this.parseDeploymentViewRuleStyle(e);N(e)}parseDeploymentViewRulePredicate(e){let t=[],n=e.expr;for(;n;){try{let e=n.value;Ta(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){y(e)}n=n.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(Dr)),n=removeIndent(v(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!et(e)&&!an(e)&&!r(e)?null:e.participant}function parseWhereClause(e){switch(!0){case zn(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 ge(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 Ae(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 gt(e)||It(e):return{not:parseWhereClause(e.value)};case it(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=[ta(t)?t.and:t,ta(n)?n.and:n].flat();return A(j(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[oa(t)?t.or:t,oa(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(st(t)){let e={project:_(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=Pn(e);if(n){let e={project:_(n),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let r=_n(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(Un(e))return this.parseFqnExprOrWith(e);if($e(e))return this.parseRelationExprOrWith(e);N(e)}parseFqnExprOrWith(e){if(Zt(e))return this.parseFqnExprWith(e);if(Wt(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(v(t.value));return n&&(e.custom[t.key]=n),e}if(Jt(t)){let n=this.parseIconProperty(t);return L(n)&&(e.custom[t.key]=n),e}if(fn(t)){let n=Je(t);return L(n)&&(e.custom[t.key]=n),e}if(sr(t)||_r(t))return L(t.value)&&(e.custom[t.key]=t.value),e;if(Ct(t))return L(t.value)&&(e.custom[t.key]=We(t)),e;if(yr(t)){let n=Je(t);return L(n)&&(e.custom[t.key]=n),e}if(ye(t)){let n=B(t.value)?removeIndent(v(t.value)):void 0;return n&&(e.custom[t.key]=n),e}if(u(t))return Ca(t.value)&&(e.custom[t.key]=t.value),e;if(Qt(t)||ft(t)||ke(t)||Er(t))return B(t.value)&&(e.custom[t.key]=a(t)),e;if(Ar(t))return B(t.value)&&(e.custom[t.key]=t.value),e;N(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(or(e))return this.parseFqnExprWhere(e);if(xn(e))return this.parseFqnExpr(e);N(e)}parseFqnExprWhere(e){return A(!or(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(tr(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($n(e))return A(e.tag.tag.ref,`Tag ${e.$cstNode?.text} is not resolved`),{elementTag:e.tag.tag.$refText,isEqual:e.isEqual};if(tn(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{Ta(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(sn(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(rr(t)||ye(t)){if(t.key===`description`){let n=this.parseMarkdownOrString(t.value);return n&&(e.description=n),e}let n=removeIndent(v(t.value));return n&&(e[t.key]=n),e}if(Nn(t))return B(t.value)&&(e[t.key]=t.value),e;if(fn(t)){let n=Je(t);return B(n)&&(e[t.key]=n),e}if(o(t))return B(t.value)&&(e[t.key]=t.value),e;if(Vn(t)){let n=t.value.view.ref?.name;return B(n)&&(e[t.key]=n),e}if(u(t))return Ca(t.value)&&(e[t.key]=t.value),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(qn(e)){let r=this.parseGlobalPredicateGroup(e);I(r,1)&&(n.predicates[t]=r);return}if(un(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(Fn(e))return[this.parseViewRuleStyle(e)];if(vn(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=Wi.from(e.parseResult.value.models.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(Te(r)){n.push(r);continue}if(Bn(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(Te(t)){e.c4Relations.push(this.parseRelation(t));continue}if(on(t)){let n=this.parseExtendElement(t);n&&e.c4ExtendElements.push(n);continue}if(Bn(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 ko({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&&wa(n)&&!r)return null;let i=this.getAstNodePath(e);return ko({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(Y.isModelRef(t)||Y.isImportRef(t),`Source must be a model reference`),A(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&&R(i??{})&&!o)return null;let s=(e.kind??e.dotKind?.kind)?.ref?.name,{title:c=``}=this.parseBaseProps({},{title:e.title});return ko({id:er(`extend-relation`,Y.flatten(t),Y.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(Y.isModelRef(t)||Y.isImportRef(t),`Relation source must be a model reference`),t}if(f(e.$container)||dr(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(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=W(e.body?.props??[],P(rr),P(e=>B(e.value)),U(e=>[e.key,e.value])),u=W(e.body?.props??[],P(Vn),H(e=>e.value.view.ref?.name),P(B),ha()),{title:d=``,description:f,technology:p}=this.parseBaseProps(l,{title:e.title,description:e.description,technology:e.technology}),m=e.body?.props.find(Sn);return ko({id:er(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(Zt(e))return this.parseFqnExprWith(e);if(Wt(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(yn)??[],P(e=>this.isValid(e)&&Ta(e.value)),U(e=>[e.key,removeIndent(v(e.value))]),ja(z)),a=n.filter(u);a.length>1&&this.logError(`Duplicate 'multiple' property for relationship "${r}", using the first one`,e,`specification`);let o=a[0];t.relationships[r]={...i,...ue(n.filter(Wn),this.isValid),...o&&{multiple:o.value}}}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 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:si(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),a=this.parseElementStyle(n.find(je)),o=this.parseLinks(e),s=W(n.filter(Jn)??[],P(e=>this.isValid(e)),U(e=>[e.key,e.value])),c=this.parseBaseProps(s),l=removeIndent(v(s.notation));return{[r]:$i({...c,notation:l,tags:i??void 0,...o&&zi.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&&!R(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 En(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=Rt(e.viewOf),n=t&&Rn(()=>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_`+er(this.doc.uri.toString(),r,i??``);let{title:o=null,description:s=null}=this.parseBaseProps(W(n.props,P(e=>this.isValid(e)),P(Pe),U(e=>[e.key,e.value]))),c=this.convertTags(n),l=this.convertLinks(n),u={[zi._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(qt.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(He(e))return this.parseViewRulePredicate(e);if(s(e))return this.parseViewRuleGlobalPredicateRef(e);if(Ce(e))return this.parseViewRuleStyleOrGlobalRef(e);if(kn(e))return Be(e);if(Re(e))return this.parseViewRuleGroup(e);if(Xe(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(fe(e))return this.parseViewRuleStyle(e);if(Tn(e))return this.parseViewRuleGlobalStyle(e);N(e)}parseViewRuleGroup(e){let t=[];for(let n of e.groupRules)try{if(!this.isValid(n))continue;if(He(n)){t.push(this.parseViewRulePredicate(n));continue}if(Re(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=>zi.ModelExpression.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>zi.ModelExpression.isFqnExpr(e)),n=this.parseStyleProps(e.props.filter(Dr)),r=removeIndent(v(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_`+er(this.doc.uri.toString(),a);let{title:s=null,description:c=null}=this.parseBaseProps(W(i,P(Pe),U(e=>[e.key,e.value]))),l=this.convertTags(n),u=this.convertLinks(n);qt.writeId(e,o);let d=pa(i,Ue)?.value;return{[zi._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(Ze(e))return this.parseViewRuleGlobalPredicateRef(e);if(Ce(e))return this.parseViewRuleStyleOrGlobalRef(e);if(kn(e))return Be(e);N(e)}parseDynamicViewIncludePredicate(e){let t=[],n=e.exprs;for(;n;)this.tryParse(`views`,n.value,e=>{if(Un(e)){let n=this.parseElementPredicate(e);t.unshift(n)}}),n=n.prev;return{include:t}}parseDynamicParallelSteps(e){let t=pathInsideDynamicView(e),n=e.steps.filter(e=>!we(e)),r=this.tryMap(`views`,n,e=>this.parseDynamicStep(e));return A(j(r),`Dynamic parallel steps must have at least one step`),{parallelId:t,__parallel:r}}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=ka(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 Vn(t):{let e=t.value.view.ref?.name;B(e)&&(n.navigateTo=e);break}case rr(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(v(t.value))??``;break;case ht(t):L(t.value)&&(n[t.key]=removeIndent(t.value));break;case Nn(t):L(t.value)&&(n[t.key]=t.value);break;case fn(t):{let e=Je(t);L(e)&&(n[t.key]=e);break}case o(t):L(t.value)&&(n[t.key]=t.value);break;case u(t):break;default:N(t)}}catch(e){this.logError(e,t,`views`)}return n}}}function pathInsideDynamicView(e){let t=e,n=[];for(;!ze(t);)Ea(t.$containerIndex)&&n.unshift(`@${t.$containerIndex}`),n.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return n.join(``)}const ds=W(BaseParser,ExpressionV2Parser,ImportsParser,ModelParser,DeploymentModelParser,DeploymentViewParser,PredicatesParser,SpecificationParser,ViewsParser,GlobalsParser);var DocumentParser=class extends ds{};const fs=b.getChild(`parser`),isError=e=>e.severity===Ba.Error;var LikeC4ModelParser=class extends bn{services;cachedParsers=new ei(e=>this.createParser(e));constructor(e){super(),this.services=e,this.onDispose(Si.create(()=>{this.cachedParsers.clear()}),e.shared.workspace.DocumentBuilder.onDocumentPhase(E.Linked,async e=>{this.cachedParsers.has(e)&&(fs.trace(`Linked: clear cached parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:Mi.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(E.Linked,async t=>{for(let n of t)if(!e.shared.workspace.ProjectsManager.isExcluded(n))try{this.parse(n)}catch(e){y(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(E.Validated,async e=>{e.diagnostics?.some(isError)&&this.cachedParsers.has(e)&&(fs.trace(`Validated: clear cached parser {projectId} document {doc} because of errors`,{projectId:e.likec4ProjectId,doc:Mi.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){ii(ut(e),`Document ${e.uri.toString()} is not a LikeC4 document`);let t=this.services.shared.workspace.ProjectsManager.getProject(e),n=Mi.relative(t.folderUri,e.uri);e.likec4ProjectId?fs.trace(`create parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:n}):fs.debug(`create parser for document without project {doc}`,{doc:e.uri.fsPath}),e.state<E.Linked&&fs.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 xi{runConverter(e,t,n){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),Ni.convertString(t)):super.runConverter(e,t,n)}};const{findNodeForKeyword:ps}=D,asViewStyleRule=(e,t,n=0)=>{let r=n>0?` `.repeat(n):``;return[r+`style ${e} {`,...fa(t).map(([e,t])=>r+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),r+`}`]},isMatchingViewRule=(e,t)=>n=>{if(!fe(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=ka(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=>fe(e)||ae(e)),u=t[Ji]===`element`?t.viewOf??null:null,d=[],f=[];r.forEach(e=>{let t=ma(l,isMatchingViewRule(e,c)),n=u&&ea(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,`
42
42
  `+e.join(`
43
- `))),p.start={line:o.line+1,character:s},p.end={line:o.line+e.length,character:Oa(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 da(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(Wa.replace({start:e,end:t},n+` `+i));continue}let o=ps(t,`{`)?.range.end;j(o,`Opening brace not found`);let s=` `.repeat(t.range.start.character)+` `,c=s+n+` `+i;m.push(Wa.insert(o,`
44
- `+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:ms}=D;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=pa(n.body.rules,kn),s=`autoLayout ${a}`;if(Ta(r.rankSep)&&(s+=` ${r.rankSep}`,Ta(r.nodeSep)&&(s+=` ${r.nodeSep}`)),o&&o.$cstNode)return Wa.replace(o.$cstNode.range,s);let c=ms(n.body.$cstNode,`}`)?.range.start;j(c,`Closing brace not found`);let l=`\t${s}\n\t`;return Wa.insert(c,l)}function preparePayload(e,t){let n=t.shared.workspace,{viewId:r,projectId:i,change:a}=e,o=n.ProjectsManager.ensureProject(i),s=t.likec4.ModelLocator.locateViewAst(r,o.id);if(!s)throw Error(`View ${r} not found in project ${o.id}`);return{viewId:r,change:a,services:t,project:o,doc:s.doc,viewAst:s.viewAst,workspace:n}}function viewChangeHandler(e,t){return n=>{if(n.change.op===e)return t(n)}}const hs=viewChangeHandler(`change-property`,({change:e,viewAst:t})=>{let{title:n,description:r}=e,i=[];return n!==void 0&&i.push(updateViewTitle(t,n)),r!==void 0&&i.push(...updateViewDescription(t,r)),e.tag!==void 0&&i.push(...updateViewTags(t,e.tag)),i});function findExistingViewProperty(e,t){let n=e.body?.props;if(!(!n||!L(n,1)))return pa(n,e=>e.key===t&&e.$cstNode!==void 0)}function findInsertPosition(e,t){let n=t(N(e.body,`View body is required`));if(!n)return wo.create(0,0);let{line:r,character:i}=n;return wo.create(r,i+1)}const doubleIndent=e=>Na(Po(),Mo(Mo(e)));function updateViewTitle(e,t){let n=findExistingViewProperty(e,`title`),r=Ro({title:t})(Fo.props.titleProperty());return n?To.replace(n.$cstNode.range,Lo(r)):To.insert(findInsertPosition(e,e=>e.tags?.$cstNode?.range.end??e.$cstNode?.range.start),No(doubleIndent(r)).trimEnd())}function collectAllTagRefs(e){let t=[],n=e;for(;n;){let e=[];for(let t of n.values)t.$cstNode&&e.push(t);t.push(e),n=n.prev}return t.reverse().flat()}function addTag(e,t,n){let r=t.tags;return r?.$cstNode?To.insert(r.$cstNode.range.end,`, #${n}`):To.insert(findInsertPosition(e,e=>e.$cstNode?.range.start),No(doubleIndent(Io(`#${n}`))).trimEnd())}function removeTag(e,t){let n=collectAllTagRefs(e.tags),r=n.findIndex(e=>e.tag.ref?.name===t);if(r<0)return;if(n.length===1){let t=e.tags;if(t?.$cstNode){let{start:e}=t.$cstNode.range;return To.del({start:wo.create(e.line,0),end:wo.create(e.line+1,0)})}return}let i=n[r];if(r>0){let e=n[r-1];return To.del({start:e.$cstNode.range.end,end:i.$cstNode.range.end})}let a=n[r+1];return To.del({start:i.$cstNode.range.start,end:a.$cstNode.range.start})}function updateViewTags(e,t){let n=[],r=N(e.body,`View body is required`);if(t.add){let i=Array.isArray(t.add)?t.add:[t.add];for(let t of i)t&&n.push(addTag(e,r,t))}if(t.remove){let e=Array.isArray(t.remove)?t.remove:[t.remove];for(let t of e){let e=t?removeTag(r,t):void 0;e&&n.push(e)}}return n}function updateViewDescription(e,t){let n=findExistingViewProperty(e,`description`),r=Ro({description:t},Mo(Mo(Fo.props.descriptionProperty())));if(n)return[To.replace({start:{line:n.$cstNode.range.start.line,character:0},end:n.$cstNode.range.end},No(r).trimEnd())];let i=findInsertPosition(e,e=>G(e.props,U(e=>e.$cstNode?.range.end),F(V),Oa())??e.tags?.$cstNode?.range.end??e.$cstNode?.range.start);return[To.insert({line:i.line+1,character:0},No(r))]}const gs=b.getChild(`model-changes`);var LikeC4ModelChanges=class{services;locator;constructor(e){this.services=e,this.locator=e.likec4.ModelLocator}async applyChange(e){let{viewId:t,projectId:n,change:r}=e;if(r.op===`change-property`){let t=preparePayload(e,this.services),n=hs(t);if(!n)return{success:!1,error:`No changes to apply`};let r=Array.isArray(n)?n:[n];return await this.applyTextEdits(t.doc,r)?{success:!0,location:null}:{success:!1,error:`Failed to apply text edits`}}let i=this.services.shared.workspace;try{let e=i.ProjectsManager.ensureProject(n);gs.debug`Applying model change ${r.op} to view ${t} in project ${e.id}`;let a=this.locator.locateViewAst(t,e.id);if(!a)throw Error(`View ${t} not found in project ${e.id}`);let o={uri:a.doc.textDocument.uri,version:a.doc.textDocument.version};if(r.op===`save-view-snapshot`)return j(t===r.layout.id,`View ID does not match, expected `+t+`, got `+r.layout.id),{success:!0,location:await i.ManualLayouts.write(e,r.layout)};if(r.op===`reset-manual-layout`)return{success:!0,location:await i.ManualLayouts.remove(e,t)};let{edits:s,modifiedRange:c}=this.convertToTextEdit({lookup:a,change:r});return s.length?await this.applyTextEdits(a.doc,s)?{success:!0,location:{uri:o.uri,range:c}}:{success:!1,error:`Failed to apply changes`}:{success:!1,error:`No changes to apply`}}catch(t){let n=w(mi(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return gs.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=Ai.applyEdits(e.textDocument,t);return await r.FileSystemProvider.writeFile(e.uri,n),await r.DocumentBuilder.update([e.uri],[]),!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):(gs.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 vi{services;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(Li(e))return e.name;if(st(e))return e.imported.$refText;if(g(e))return e.target.modelElement.value.$refText}getNameNode(e){if(Li(e))return super.getNameNode(e);if(st(e))return e.imported.$refNode;if(g(e))return e.target.modelElement.value.$refNode}};function uniqueDescriptions(e){return G(e,va(e=>`${e.type}.${e.name}`),da(),I(([e,t])=>t.length===1?t:[]))}var LikeC4ScopeComputation=class extends yi{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){y(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){y(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){y(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){y(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){y(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){y(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 nn(r):case dn(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 In(r):V(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case gr(r):V(r.name.name)&&t.push(this.descriptions.createDescription(r.name,r.name.name,n));continue;default:P(r)}}catch(e){y(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){y(e)}}computeLocalScopes(e,t){return new Promise(t=>{let n=e.parseResult.value,r=[],i=new Oi;for(let t of n.models)try{r.push(...this.processContainer(t,i,e))}catch(e){y(e)}for(let t of n.deployments)try{r.push(...this.processDeployments(t,i,e))}catch(e){y(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){y(e)}uniqueDescriptions(r).forEach(e=>{i.add(n,e)}),t(i)})}processContainer(e,t,n){let r=new Oi,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)))):on(a)&&(e=a.body),e&&e.elements.length>0)try{i.push(...this.processContainer(e,t,n))}catch(e){y(e)}}i.length&&G(i,F(e=>!r.has(e.name)),va(e=>e.name),ga((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 Oi,i=[];for(let a of e.elements){if(Or(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){y(e)}}i.length&&G(i,F(e=>!r.has(e.name)),va(e=>e.name),ga((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}};const{getDocument:_s}=T;var LikeC4ScopeProvider=class extends bi{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=_(e.container),n=this.reflection.getReferenceType(e);try{let r=e.container;if(hr(r))return new ki(this.streamForFqnRef(t,r,e));if(jr(r))return this.getScopeForStrictFqnRef(t,r,e);if(n!==`Element`)return this.getProjectScope(t,n,e);if(st(r)){let e=_(r);return new ki(this.fqnIndex.rootElements(e))}if(br(r)&&e.property===`el`){let i=r.parent;return i?new ki(this.fqnIndex.directChildrenOf(t,vr(i))):this.getProjectScope(t,n,e)}return new ki(k(this.computeScope(t,e)))}catch(r){return y(r),this.getProjectScope(t,n,e)}}catch(e){return y(e),Ci}}*genUniqueDescedants(e){if(!e)return;let t=_(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 ki(this.deploymentsIndex.directChildrenOf(e,vr(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 k(this.genScopeForParentlessFqnRef(e,t,n));let i=r.value.ref;if(!i)return wi;if(st(i))return k(this.genUniqueDescedants(i.imported.ref));if(x(i))return k(this.genUniqueDescedants(i));if(g(i)){let e=i.target.modelElement.value.ref,t=st(e)?e.imported.ref:S(e)?e:void 0;return k(this.genUniqueDescedants(t))}return S(i)?k(this.genUniqueDescedants(i)):P(i)}*genScopeForParentlessFqnRef(e,t,n){T.hasContainerOfType(t,Tt)||xr(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,Nr)):(yield*this.computeScope(e,n,vt),yield*this.computeScope(e,n,Nr),T.hasContainerOfType(t,wr)&&(yield*this.computeScope(e,n,mt)));let r=_s(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=_s(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&&dr(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 Di(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===`LibIcon`)return super.getGlobalScope(e,t);let n=_(t.container);return this.getProjectScope(n,e,t)}};const $=b.getChild(`rpc`);var Rpc=class extends bn{services;constructor(e){super(),this.services=e}init=ja(()=>{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(Rr.type,{projectId:t}).catch(e=>{$.warn(`[ServerRpc] error sending onDidChangeModel for project {project}`,{error:e,project:t})})},a=_a(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=_a(t=>{t>1?$.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:$.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(zr.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(Hr.req,async({projectId:e,cleanCaches:r=!1},i)=>{$.debug`received request ${`fetchComputedModel`} for project ${e}`,r&&($.debug`cleanCaches: ${r}`,e?await n.ProjectsManager.rebuildProject(e):await n.WorkspaceManager.rebuildAll());let a=await t.ModelBuilder.computeModel(e,i);return a===q.EMPTY?{model:null}:{model:a.$data}}),e.onNotification(Br.type,async e=>{let t=ji.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(Ur.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:ba(i,e=>e.id)}}}),e.onRequest(Yr.req,async({viewId:e,projectId:n,layoutType:r,hints:i},a)=>($.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,layoutHints:i,cancelToken:a})})),e.onRequest($r.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(Wr.req,async()=>($.debug`received request ${`FetchProjects`}`,{projects:ka(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(Qr.req,async e=>{$.debug`received request ${`ReloadProjects`}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.reloadProjects(e)}),e.onRequest(Zr.req,async(e,t)=>{$.debug`received request ${`RegisterProject`}`,n.ManualLayouts.clearCaches();let r;return r=`configUri`in e?await n.ProjectsManager.registerConfigFile(ji.parse(e.configUri),t):await n.ProjectsManager.registerProject(e,t),{id:r.id}}),e.onRequest(qr.req,async e=>{$.debug`received request ${`FetchViewsFromAllProjects`}`;let r=[];for(let i of n.ProjectsManager.all){await Fi(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})),Ia((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(Ir.req,async({docs:t},n)=>{let a=t.map(e=>ji.parse(e)),o=r.userDocuments.map(e=>e.uri).filter(e=>!a.some(t=>O.equals(t,e))).toArray();$.debug(`[ServerRpc] received request to build:
43
+ `))),p.start={line:o.line+1,character:s},p.end={line:o.line+e.length,character:ka(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 fa(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=ps(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,`
44
+ `+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:ms}=D;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=Ie(r.direction),o=ma(n.body.rules,kn),s=`autoLayout ${a}`;if(Ea(r.rankSep)&&(s+=` ${r.rankSep}`,Ea(r.nodeSep)&&(s+=` ${r.nodeSep}`)),o&&o.$cstNode)return Ga.replace(o.$cstNode.range,s);let c=ms(n.body.$cstNode,`}`)?.range.start;A(c,`Closing brace not found`);let l=`\t${s}\n\t`;return Ga.insert(c,l)}function preparePayload(e,t){let n=t.shared.workspace,{viewId:r,projectId:i,change:a}=e,o=n.ProjectsManager.ensureProject(i),s=t.likec4.ModelLocator.locateViewAst(r,o.id);if(!s)throw Error(`View ${r} not found in project ${o.id}`);return{viewId:r,change:a,services:t,project:o,doc:s.doc,viewAst:s.viewAst,workspace:n}}function viewChangeHandler(e,t){return n=>{if(n.change.op===e)return t(n)}}const hs=viewChangeHandler(`change-property`,({change:e,viewAst:t})=>{let{title:n,description:r}=e,i=[];return n!==void 0&&i.push(updateViewTitle(t,n)),r!==void 0&&i.push(...updateViewDescription(t,r)),e.tag!==void 0&&i.push(...updateViewTags(t,e.tag)),i});function findExistingViewProperty(e,t){let n=e.body?.props;if(!(!n||!I(n,1)))return ma(n,e=>e.key===t&&e.$cstNode!==void 0)}function findInsertPosition(e,t){let n=t(M(e.body,`View body is required`));if(!n)return wo.create(0,0);let{line:r,character:i}=n;return wo.create(r,i+1)}const doubleIndent=e=>Pa(Po(),Mo(Mo(e)));function updateViewTitle(e,t){let n=findExistingViewProperty(e,`title`),r=Ro({title:t})(Fo.props.titleProperty());return n?To.replace(n.$cstNode.range,Lo(r)):To.insert(findInsertPosition(e,e=>e.tags?.$cstNode?.range.end??e.$cstNode?.range.start),No(doubleIndent(r)).trimEnd())}function collectAllTagRefs(e){let t=[],n=e;for(;n;){let e=[];for(let t of n.values)t.$cstNode&&e.push(t);t.push(e),n=n.prev}return t.reverse().flat()}function addTag(e,t,n){let r=t.tags;return r?.$cstNode?To.insert(r.$cstNode.range.end,`, #${n}`):To.insert(findInsertPosition(e,e=>e.$cstNode?.range.start),No(doubleIndent(Io(`#${n}`))).trimEnd())}function removeTag(e,t){let n=collectAllTagRefs(e.tags),r=n.findIndex(e=>e.tag.ref?.name===t);if(r<0)return;if(n.length===1){let t=e.tags;if(t?.$cstNode){let{start:e}=t.$cstNode.range;return To.del({start:wo.create(e.line,0),end:wo.create(e.line+1,0)})}return}let i=n[r];if(r>0){let e=n[r-1];return To.del({start:e.$cstNode.range.end,end:i.$cstNode.range.end})}let a=n[r+1];return To.del({start:i.$cstNode.range.start,end:a.$cstNode.range.start})}function updateViewTags(e,t){let n=[],r=M(e.body,`View body is required`);if(t.add){let i=Array.isArray(t.add)?t.add:[t.add];for(let t of i)t&&n.push(addTag(e,r,t))}if(t.remove){let e=Array.isArray(t.remove)?t.remove:[t.remove];for(let t of e){let e=t?removeTag(r,t):void 0;e&&n.push(e)}}return n}function updateViewDescription(e,t){let n=findExistingViewProperty(e,`description`),r=Ro({description:t},Mo(Mo(Fo.props.descriptionProperty())));if(n)return[To.replace({start:{line:n.$cstNode.range.start.line,character:0},end:n.$cstNode.range.end},No(r).trimEnd())];let i=findInsertPosition(e,e=>W(e.props,H(e=>e.$cstNode?.range.end),P(B),ka())??e.tags?.$cstNode?.range.end??e.$cstNode?.range.start);return[To.insert({line:i.line+1,character:0},No(r))]}const gs=b.getChild(`model-changes`);var LikeC4ModelChanges=class{services;locator;constructor(e){this.services=e,this.locator=e.likec4.ModelLocator}async applyChange(e){let{viewId:t,projectId:n,change:r}=e;if(r.op===`change-property`){let t=preparePayload(e,this.services),n=hs(t);if(!n)return{success:!1,error:`No changes to apply`};let r=Array.isArray(n)?n:[n];return await this.applyTextEdits(t.doc,r)?{success:!0,location:null}:{success:!1,error:`Failed to apply text edits`}}let i=this.services.shared.workspace;try{let e=i.ProjectsManager.ensureProject(n);gs.debug`Applying model change ${r.op} to view ${t} in project ${e.id}`;let a=this.locator.locateViewAst(t,e.id);if(!a)throw Error(`View ${t} not found in project ${e.id}`);let o={uri:a.doc.textDocument.uri,version:a.doc.textDocument.version};if(r.op===`save-view-snapshot`)return A(t===r.layout.id,`View ID does not match, expected `+t+`, got `+r.layout.id),{success:!0,location:await i.ManualLayouts.write(e,r.layout)};if(r.op===`reset-manual-layout`)return{success:!0,location:await i.ManualLayouts.remove(e,t)};let{edits:s,modifiedRange:c}=this.convertToTextEdit({lookup:a,change:r});return s.length?await this.applyTextEdits(a.doc,s)?{success:!0,location:{uri:o.uri,range:c}}:{success:!1,error:`Failed to apply changes`}:{success:!1,error:`No changes to apply`}}catch(t){let n=w(mi(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return gs.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)}}async applyTextEdits(e,t){let n=this.services.shared.lsp.Connection,r=this.services.shared.workspace;if(!n){let n=Ai.applyEdits(e.textDocument,t);return await r.FileSystemProvider.writeFile(e.uri,n),await r.DocumentBuilder.update([e.uri],[]),!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):(gs.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 vi{services;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(Ri(e))return e.name;if(st(e))return e.imported.$refText;if(g(e))return e.target.modelElement.value.$refText}getNameNode(e){if(Ri(e))return super.getNameNode(e);if(st(e))return e.imported.$refNode;if(g(e))return e.target.modelElement.value.$refNode}};function uniqueDescriptions(e){return W(e,ya(e=>`${e.type}.${e.name}`),fa(),F(([e,t])=>t.length===1?t:[]))}var LikeC4ScopeComputation=class extends yi{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){y(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){y(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){y(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){y(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){y(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){y(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 nn(r):case dn(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 In(r):B(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case gr(r):B(r.name.name)&&t.push(this.descriptions.createDescription(r.name,r.name.name,n));continue;default:N(r)}}catch(e){y(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){y(e)}}computeLocalScopes(e,t){return new Promise(t=>{let n=e.parseResult.value,r=[],i=new Oi;for(let t of n.models)try{r.push(...this.processContainer(t,i,e))}catch(e){y(e)}for(let t of n.deployments)try{r.push(...this.processDeployments(t,i,e))}catch(e){y(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){y(e)}uniqueDescriptions(r).forEach(e=>{i.add(n,e)}),t(i)})}processContainer(e,t,n){let r=new Oi,i=[];for(let a of e.elements){if(Te(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)))):on(a)&&(e=a.body),e&&e.elements.length>0)try{i.push(...this.processContainer(e,t,n))}catch(e){y(e)}}i.length&&W(i,P(e=>!r.has(e.name)),ya(e=>e.name),_a((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 Oi,i=[];for(let a of e.elements){if(Or(a))continue;let e=a.body;if(!tt(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){y(e)}}i.length&&W(i,P(e=>!r.has(e.name)),ya(e=>e.name),_a((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}};const{getDocument:_s}=T;var LikeC4ScopeProvider=class extends bi{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=_(e.container),n=this.reflection.getReferenceType(e);try{let r=e.container;if(hr(r))return new ki(this.streamForFqnRef(t,r,e));if(jr(r))return this.getScopeForStrictFqnRef(t,r,e);if(n!==`Element`)return this.getProjectScope(t,n,e);if(st(r)){let e=_(r);return new ki(this.fqnIndex.rootElements(e))}if(br(r)&&e.property===`el`){let i=r.parent;return i?new ki(this.fqnIndex.directChildrenOf(t,vr(i))):this.getProjectScope(t,n,e)}return new ki(O(this.computeScope(t,e)))}catch(r){return y(r),this.getProjectScope(t,n,e)}}catch(e){return y(e),Ci}}*genUniqueDescedants(e){if(!e)return;let t=_(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 ki(this.deploymentsIndex.directChildrenOf(e,vr(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 wi;if(st(i))return O(this.genUniqueDescedants(i.imported.ref));if(x(i))return O(this.genUniqueDescedants(i));if(g(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)):N(i)}*genScopeForParentlessFqnRef(e,t,n){T.hasContainerOfType(t,Tt)||xr(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,Nr)):(yield*this.computeScope(e,n,vt),yield*this.computeScope(e,n,Nr),T.hasContainerOfType(t,wr)&&(yield*this.computeScope(e,n,mt)));let r=_s(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=_s(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&&dr(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 Di(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===`LibIcon`)return super.getGlobalScope(e,t);let n=_(t.container);return this.getProjectScope(n,e,t)}};const $=b.getChild(`rpc`);var Rpc=class extends bn{services;constructor(e){super(),this.services=e}init=Ma(()=>{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(Rr.type,{projectId:t}).catch(e=>{$.warn(`[ServerRpc] error sending onDidChangeModel for project {project}`,{error:e,project:t})})},a=va(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=va(t=>{t>1?$.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:$.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(zr.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(Si.create(()=>{a.cancel(),o.cancel()}),t.ModelBuilder.onModelParsed(e=>a.call(e)),n.ProjectsManager.onProjectsUpdate(()=>o.call(1)),e.onRequest(Hr.req,async({projectId:e,cleanCaches:r=!1},i)=>{$.debug`received request ${`fetchComputedModel`} for project ${e}`,r&&($.debug`cleanCaches: ${r}`,e?(n.ManualLayouts.clearCaches(),await n.ProjectsManager.rebuildProject(e)):await n.WorkspaceManager.rebuildAll());let a=await t.ModelBuilder.computeModel(e,i);return a===q.EMPTY?{model:null}:{model:a.$data}}),e.onNotification(Br.type,async e=>{let t=ji.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(Ur.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:xa(i,e=>e.id)}}}),e.onRequest(Yr.req,async({viewId:e,projectId:n,layoutType:r,hints:i},a)=>($.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,layoutHints:i,cancelToken:a})})),e.onRequest($r.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(Wr.req,async()=>($.debug`received request ${`FetchProjects`}`,{projects:Aa(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(Qr.req,async e=>{$.debug`received request ${`ReloadProjects`}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.reloadProjects(e)}),e.onRequest(Zr.req,async(e,t)=>{$.debug`received request ${`RegisterProject`}`,n.ManualLayouts.clearCaches();let r;return r=`configUri`in e?await n.ProjectsManager.registerConfigFile(ji.parse(e.configUri),t):await n.ProjectsManager.registerProject(e,t),{id:r.id}}),e.onRequest(qr.req,async e=>{$.debug`received request ${`FetchViewsFromAllProjects`}`;let r=[];for(let i of n.ProjectsManager.all){await Ii(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})),La((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(Ir.req,async({docs:t},n)=>{let a=t.map(e=>ji.parse(e)),o=r.userDocuments.map(e=>e.uri).filter(e=>!a.some(t=>Mi.equals(t,e))).toArray();$.debug(`[ServerRpc] received request to build:
45
45
  changed (total ${a.length}):${t.map(e=>`
46
46
  - `+e).join(``)}
47
47
  deleted (total ${o.length}):${o.map(e=>`
48
48
  - `+e.toString()).join(`
49
- `)}`),!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 Fi(n),await i.update(a,o,n)}),e.onRequest(Xr.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(Lr.req,async e=>($.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`,await t.ModelChanges.applyChange(e))),e.onRequest(Kr.req,async e=>{let r=null;for(let i of n.ProjectsManager.all)try{let n=await t.ModelBuilder.computeModel(i,e);if(n===q.EMPTY)continue;r??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},r.elementKinds+=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 Fi(e),{metrics:r}}),e.onRequest(Jr.req,async({documentUri:e},r)=>{let i=ji.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(Gr.req,async e=>($.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})),Si.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:Co.Warning,message:`Layout drift detected for view '${e.id}'`,range:n.range}}))}});async openView(e){let t=this.services.shared.lsp.Connection;if(!t){$.warn(`No LSP connection`);return}await t.sendNotification(Vr.type,e)}},NodeKindProvider$1=class{services;constructor(e){this.services=e}getSymbolKind(e){let n=Ii(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(n,e));switch(!0){case hasType(mt,me,vt,Nr,Et):return Ua.Constructor;case hasType(t,pr,cn,At,Gn):return Ua.Namespace;case hasType(Qe):return Ua.Struct;case hasType(`Tag`,Pt,nt,cr):return Ua.EnumMember;case hasType(Hn,Kt):return Ua.Event;case hasType(St,ve,Cn,ir):return Ua.TypeParameter}return Ua.Field}getCompletionItemKind(e){let n=Ii(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,Nr,me,Et):return K.Constructor;case hasType(t,pr,cn,At,Gn):return K.Module;case hasType(Qe):return K.Class;case hasType(`Tag`,Pt,nt,cr):return K.EnumMember;case hasType(Hn,Kt):return K.Event;case hasType(St,Cn,ve,ir):return K.TypeParameter;default:return K.Reference}}},WorkspaceSymbolProvider=class extends ro{};const vs=b.getChild(`views`);var DefaultLikeC4Views=class{services;#e;#t=new zi(e=>new ProjectStorage({projectId:e,storage:Bo(this.#e,e),layouter:e=>this.layouter.layout(e)}));ModelBuilder;constructor(e){this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,this.#e=zo(),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{vs.info`force clean cache`,this.#e.clear()}),e.shared.workspace.ManualLayouts.onManualLayoutUpdate(({projectId:e,viewId:t})=>{this.#t.has(e)&&t&&this.projectStorage(e).clearView(t)})}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){return Ra((await this.ModelBuilder.computeModel(e,t)).$data.views)}async _layoutAllViews(e,t){let n=Ra(e.$data.views);if(n.length===0)return[];let r=e.project.id,i=vs.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=lr();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 Fi(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,layoutHints:i}){let a=await this.ModelBuilder.computeModel(n,r),o=a.findView(e)?.$view;n=a.project.id;let s=vs.getChild(n);if(i){j(o,`View ${e} not found in model`),s.debug`using provided AI layout hints for view ${e}`;let{dot:t,diagram:n}=await this.layouter.aiLayout({view:o,styles:a.$styles},i);return{dot:t,diagram:n}}if(!o){s.warn`view ${e} not found in model`;let t=a.findManualLayout(e);if(t){s.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 c=this.projectStorage(n);try{let e={view:o,styles:a.$styles},n=await c.getOrExecute(e);return V(t)?{dot:n.dot,diagram:this.withLayoutType(n.diagram,a,t)}:n}catch(e){let t=w(e);return s.warn(t),this.reportViewError(o,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=Ra(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):y(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){vs.trace`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 vs.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[Gi]===`manual`?(vs.error`View ${e.id} already has manual layout, this should not happen`,e):Xi(e,r):Zi(e,r):e}projectStorage(e){return this.#t.get(e)}},ProjectStorage=class{#e;#t;#n;constructor(e){this.#e=vs.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);this.#e.trace`cache miss for ${e.view.id}`}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=lr(),i=await this.#n(e);return this.#e.trace(`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())})}async clearView(e){this.resetViewError(e);let t=await this.#t.keys(`v:${e}:`);if(t.length!==0){this.#e.trace`clear ${t.length} cached entries for view ${e}`;for(let e of t)await this.#t.remove(e)}}clearAll(){this.#e.trace`clear caches`,this.#t.clear()}resetViewError(e){let t=typeof e==`string`?e:e.id;this.#t.del(`error:${t}`)}};function cacheKey(e){return`v:${e.view.id}:${e.view.hash}:${e.styles.fingerprint}`}function mergeWithCachedLayout(e,t){return{dot:t.dot,diagram:Yi(e,t.diagram)}}const ys={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 Ni(e,E.Validated),IndexManager:e=>new ln(e),LangiumDocuments:e=>new en(e),ProjectsManager:e=>new mr(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(Kn)},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=Pi([ao({shared:i}),Se,createLikeC4Module({...Ut,...ar,...ys,...e}),t,n,r].reduce(_merge,{}));return i.ServiceRegistry.register(a),registerValidationChecks(a),e.connection?li(()=>a.Rpc.init()):i.workspace.ConfigurationProvider.initialized({}),{shared:i,likec4:a}}function createSharedServices(e={}){let t={...Ut,...ar,...e};return Pi(oo(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{ys as a,WithGraphviz as i,createLikeC4Module as n,createSharedServices as r,createLanguageServices as t};
49
+ `)}`),!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 Ii(n),await i.update(a,o,n)}),e.onRequest(Xr.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(Lr.req,async e=>($.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`,await t.ModelChanges.applyChange(e))),e.onRequest(Kr.req,async e=>{let r=null;for(let i of n.ProjectsManager.all)try{let n=await t.ModelBuilder.computeModel(i,e);if(n===q.EMPTY)continue;r??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},r.elementKinds+=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 Ii(e),{metrics:r}}),e.onRequest(Jr.req,async({documentUri:e},r)=>{let i=ji.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(Gr.req,async e=>($.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})));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:Co.Warning,message:`Layout drift detected for view '${e.id}'`,range:n.range}}))}});async openView(e){let t=this.services.shared.lsp.Connection;if(!t){$.warn(`No LSP connection`);return}await t.sendNotification(Vr.type,e)}},NodeKindProvider$1=class{services;constructor(e){this.services=e}getSymbolKind(e){let n=Li(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(n,e));switch(!0){case hasType(mt,me,vt,Nr,Et):return Wa.Constructor;case hasType(t,pr,cn,At,Gn):return Wa.Namespace;case hasType(Qe):return Wa.Struct;case hasType(`Tag`,Pt,nt,cr):return Wa.EnumMember;case hasType(Hn,Kt):return Wa.Event;case hasType(St,ve,Cn,ir):return Wa.TypeParameter}return Wa.Field}getCompletionItemKind(e){let n=Li(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(n,e));switch(!0){case hasType(nt):return G.Color;case hasType(mt,vt,Nr,me,Et):return G.Constructor;case hasType(t,pr,cn,At,Gn):return G.Module;case hasType(Qe):return G.Class;case hasType(`Tag`,Pt,nt,cr):return G.EnumMember;case hasType(Hn,Kt):return G.Event;case hasType(St,Cn,ve,ir):return G.TypeParameter;default:return G.Reference}}},WorkspaceSymbolProvider=class extends io{};const vs=b.getChild(`views`);var DefaultLikeC4Views=class extends bn{services;#e;#t=new Bi(e=>new ProjectStorage({projectId:e,storage:Bo(this.#e,e),layouter:e=>this.layouter.layout(e)}));ModelBuilder;constructor(e){super(),this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,this.#e=zo(),this.onDispose(this.#e,Si.create(()=>{this.#t.clear()}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{vs.info`force clean cache`,this.#e.clear()}),e.shared.workspace.ManualLayouts.onManualLayoutUpdate(({projectId:e,viewId:t})=>{this.#t.has(e)&&t&&this.projectStorage(e).clearView(t)}))}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){return za((await this.ModelBuilder.computeModel(e,t)).$data.views)}async _layoutAllViews(e,t){let n=za(e.$data.views);if(n.length===0)return[];let r=e.project.id,i=vs.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=lr();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 Ii(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,layoutHints:i}){let a=await this.ModelBuilder.computeModel(n,r),o=a.findView(e)?.$view;n=a.project.id;let s=vs.getChild(n);if(i){A(o,`View ${e} not found in model`),s.debug`using provided AI layout hints for view ${e}`;let{dot:t,diagram:n}=await this.layouter.aiLayout({view:o,styles:a.$styles},i);return{dot:t,diagram:n}}if(!o){s.warn`view ${e} not found in model`;let t=a.findManualLayout(e);if(t){s.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 c=this.projectStorage(n);try{let e={view:o,styles:a.$styles},n=await c.getOrExecute(e);return B(t)?{dot:n.dot,diagram:this.withLayoutType(n.diagram,a,t)}:n}catch(e){let t=w(e);return s.warn(t),this.reportViewError(o,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=za(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):y(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){vs.trace`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 vs.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[Ki]===`manual`?(vs.error`View ${e.id} already has manual layout, this should not happen`,e):Zi(e,r):Qi(e,r):e}projectStorage(e){return this.#t.get(e)}},ProjectStorage=class{#e;#t;#n;constructor(e){this.#e=vs.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);this.#e.trace`cache miss for ${e.view.id}`}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=lr(),i=await this.#n(e);return this.#e.trace(`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())})}async clearView(e){this.resetViewError(e);let t=await this.#t.keys(`v:${e}:`);if(t.length!==0){this.#e.trace`clear ${t.length} cached entries for view ${e}`;for(let e of t)await this.#t.remove(e)}}clearAll(){this.#e.trace`clear caches`,this.#t.clear()}resetViewError(e){let t=typeof e==`string`?e:e.id;this.#t.del(`error:${t}`)}};function cacheKey(e){return`v:${e.view.id}:${e.view.hash}:${e.styles.fingerprint}`}function mergeWithCachedLayout(e,t){return{dot:t.dot,diagram:Xi(e,t.diagram)}}const ys={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 Pi(e,E.Validated),IndexManager:e=>new ln(e),LangiumDocuments:e=>new en(e),ProjectsManager:e=>new mr(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(Kn)},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=Fi([ao({shared:i}),Se,createLikeC4Module({...Ut,...ar,...ys,...e}),t,n,r].reduce(_merge,{}));return i.ServiceRegistry.register(a),registerValidationChecks(a),e.connection?li(()=>a.Rpc.init()):i.workspace.ConfigurationProvider.initialized({}),{shared:i,likec4:a}}function createSharedServices(e={}){let t={...Ut,...ar,...e};return Fi(oo(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{ys as a,WithGraphviz as i,createLikeC4Module as n,createSharedServices as r,createLanguageServices as t};