@likec4/language-server 1.49.0 → 1.50.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.
Files changed (41) hide show
  1. package/dist/_chunks/ConfigurableLayouter.mjs +1 -1
  2. package/dist/_chunks/LikeC4FileSystem.mjs +3 -3
  3. package/dist/_chunks/WithMCPServer.mjs +686 -13
  4. package/dist/_chunks/common-exports.mjs +0 -0
  5. package/dist/_chunks/libs/@msgpack/msgpack.mjs +1 -1
  6. package/dist/_chunks/libs/eventemitter3.mjs +1 -1
  7. package/dist/_chunks/libs/fast-equals.mjs +1 -1
  8. package/dist/_chunks/libs/p-queue.mjs +1 -1
  9. package/dist/_chunks/libs/picomatch.mjs +1 -1
  10. package/dist/_chunks/libs/pretty-ms.mjs +1 -1
  11. package/dist/_chunks/libs/remeda.mjs +2 -1
  12. package/dist/_chunks/libs/ufo.mjs +1 -1
  13. package/dist/_chunks/likec4lib.mjs +2 -0
  14. package/dist/_chunks/{index.d.mts → module.d.mts} +247 -7
  15. package/dist/_chunks/module.mjs +34 -0
  16. package/dist/_chunks/noop.mjs +1 -0
  17. package/dist/_chunks/protocol.d.mts +315 -0
  18. package/dist/_chunks/rolldown-runtime.mjs +1 -1
  19. package/dist/_chunks/utils.mjs +1 -1
  20. package/dist/_chunks/workspace.mjs +1 -0
  21. package/dist/browser/index.d.mts +7 -2
  22. package/dist/browser/index.mjs +1 -1
  23. package/dist/browser/worker.mjs +1 -1
  24. package/dist/bundled.d.mts +2 -2
  25. package/dist/bundled.mjs +1 -1
  26. package/dist/filesystem/index.d.mts +3 -2
  27. package/dist/filesystem/index.mjs +1 -1
  28. package/dist/index.d.mts +2 -38
  29. package/dist/index.mjs +1 -1
  30. package/dist/likec4lib.mjs +1 -1
  31. package/dist/mcp/index.d.mts +3 -2
  32. package/dist/mcp/index.mjs +1 -1
  33. package/dist/module.d.mts +2 -125
  34. package/dist/module.mjs +1 -1
  35. package/dist/protocol.d.mts +1 -314
  36. package/dist/protocol.mjs +1 -1
  37. package/package.json +15 -15
  38. package/dist/_chunks/LikeC4Views.mjs +0 -34
  39. package/dist/_chunks/ProjectsManager.mjs +0 -1
  40. package/dist/_chunks/icons.mjs +0 -2
  41. package/dist/_chunks/logger.mjs +0 -1
@@ -0,0 +1,34 @@
1
+ import{i as e}from"./likec4lib.mjs";import{r as t,t as n}from"./noop.mjs";import{$ as r,$n as i,$t as a,A as o,An as s,At as c,B as l,Bn as u,Bt as d,C as f,Cn as p,Ct as m,D as ee,Dn as te,Dt as ne,E as re,En as ie,Er as h,Et as ae,F as oe,Fn as se,Ft as ce,G as le,Gn as ue,Gt as de,H as g,Hn as fe,Ht as pe,I as me,In as he,It as ge,J as _e,Jn as ve,Jt as ye,K as be,Kn as xe,Kt as _,L as Se,Ln as Ce,Lt as we,M as Te,Mn as Ee,Mt as De,N as Oe,Nn as ke,Nt as Ae,O as je,On as Me,Ot as Ne,P as Pe,Pn as Fe,Pt as Ie,Q as Le,Qn as Re,Qt as ze,R as Be,Rn as Ve,Rt as He,S as Ue,Sn as We,Sr as Ge,St as Ke,T as qe,Tn as Je,Tr as v,Tt as Ye,U as Xe,Un as Ze,Ut as Qe,V as $e,Vn as et,Vt as tt,W as nt,Wn as rt,Wt as it,X as at,Xn as ot,Xt as st,Y as ct,Yn as lt,Yt as ut,Z as dt,Zn as ft,Zt as pt,_ as mt,_n as ht,_r as gt,_t,a as vt,an as yt,ar as bt,at as xt,b as St,bn as Ct,br as wt,bt as Tt,c as Et,cn as Dt,cr as Ot,ct as kt,d as At,dn as jt,dr as Mt,dt as Nt,en as Pt,er as Ft,et as It,f as Lt,fn as Rt,fr as zt,ft as Bt,g as Vt,gn as Ht,gr as Ut,gt as Wt,h as Gt,hn as Kt,hr as qt,ht as Jt,i as Yt,in as Xt,ir as Zt,it as Qt,j as $t,jn as en,jt as tn,k as nn,kn as rn,kt as an,l as on,ln as sn,lr as cn,lt as y,m as ln,mn as un,mr as dn,mt as fn,nn as pn,nr as mn,nt as hn,on as b,or as gn,ot as _n,p as vn,pn as yn,pr as bn,pt as xn,q as Sn,qn as Cn,qt as wn,rn as Tn,rr as En,rt as Dn,s as On,sn as kn,sr as An,st as jn,tn as Mn,tr as Nn,tt as Pn,u as Fn,un as In,ur as Ln,ut as Rn,v as zn,vn as Bn,vr as Vn,vt as Hn,w as Un,wn as Wn,wt as Gn,x as Kn,xn as qn,xr as Jn,xt as Yn,y as Xn,yn as Zn,yr as Qn,yt as $n,z as x,zn as er,zt as tr}from"./utils.mjs";import{A as nr,B as S,C,D as rr,E as ir,F as ar,H as or,I as sr,L as w,M as cr,N as T,O as lr,P as ur,R as dr,S as fr,T as pr,_ as mr,a as hr,b as E,c as gr,d as _r,f as D,g as O,h as k,i as vr,j as yr,k as br,l as xr,m as Sr,o as Cr,p as A,r as wr,s as Tr,t as Er,u as Dr,v as Or,w as j,x as kr,y as Ar,z as M}from"./libs/remeda.mjs";import{C as jr,S as Mr,_ as Nr,a as Pr,b as Fr,c as Ir,d as Lr,f as Rr,g as zr,h as Br,i as Vr,l as Hr,m as Ur,n as Wr,o as Gr,p as Kr,r as qr,s as Jr,t as Yr,u as Xr,v as Zr,x as Qr,y as N}from"./workspace.mjs";import{a as $r,c as ei,i as ti,l as ni,n as ri,o as ii,r as ai}from"./libs/ufo.mjs";import{t as oi}from"./libs/pretty-ms.mjs";import{t as si}from"./libs/fast-equals.mjs";import{t as ci}from"./libs/@msgpack/msgpack.mjs";import{t as li}from"./libs/strip-indent.mjs";import{BuildDocuments as ui,ChangeView as di,DidChangeModelNotification as fi,DidChangeProjectsNotification as pi,DidChangeSnapshotNotification as mi,DidRequestOpenViewNotification as hi,FetchComputedModel as gi,FetchLayoutedModel as _i,FetchProjects as vi,FetchProjectsOverview as yi,FetchTelemetryMetrics as bi,FetchViewsFromAllProjects as xi,GetDocumentTags as Si,LayoutView as Ci,Locate as wi,RegisterProject as Ti,ReloadProjects as Ei,ValidateLayout as Di}from"../protocol.mjs";import{AstUtils as P,CstUtils as Oi,DefaultDocumentValidator as ki,DefaultNameProvider as Ai,DefaultScopeComputation as ji,DefaultScopeProvider as Mi,DefaultValueConverter as Ni,Disposable as Pi,DocumentState as F,EMPTY_SCOPE as Fi,EMPTY_STREAM as Ii,GrammarAST as Li,GrammarUtils as I,JSDocDocumentationProvider as Ri,MapScope as zi,MultiMap as Bi,StreamScope as Vi,URI as Hi,UriUtils as Ui,ValueConverter as Wi,WorkspaceCache as Gi,inject as Ki,interruptAndCheck as qi,isAstNode as Ji,isNamed as Yi,stream as L}from"langium";import{DefaultWeakMap as Xi,MultiMap as R,ancestorsFqn as Zi,compareNatural as Qi,ifilter as $i,invariant as ea,isNonEmptyArray as ta,nameFromFqn as na,nonNullable as ra,nonexhaustive as ia,onNextTick as aa,parentFqn as oa,sortNaturalByFqn as sa,sortParentsFirst as ca,stringHash as la,toArray as ua}from"@likec4/core/utils";import{loggable as z,wrapError as da}from"@likec4/log";import{CompletionItemKind as B,DiagnosticSeverity as fa,InsertTextFormat as V,SemanticTokenModifiers as pa,SemanticTokenTypes as ma,SymbolKind as ha,TextEdit as ga}from"vscode-languageserver-types";import{AbstractFormatter as _a,AbstractSemanticTokenProvider as va,AstNodeHoverProvider as ya,DefaultCompletionProvider as ba,DefaultDocumentHighlightProvider as xa,DefaultWorkspaceSymbolProvider as Sa,Formatting as H,createDefaultModule as Ca,createDefaultSharedModule as wa}from"langium/lsp";import{GraphvizWasmAdapter as Ta,QueueGraphvizLayoter as Ea}from"@likec4/layouts";import*as Da from"@likec4/core";import{Fqn as Oa,FqnExpr as ka,FqnRef as U,GlobalFqn as Aa,LinkedList as ja,RelationExpr as Ma,_layout as Na,_stage as Pa,_type as Fa,ancestorsFqn as Ia,applyManualLayout as La,calcDriftsFromSnapshot as Ra,exact as za,invariant as W,isAncestor as Ba,isAndOperator as Va,isAnyOf as Ha,isAutoLayoutDirection as Ua,isDeploymentNode as Wa,isElementView as Ga,isGlobalFqn as Ka,isNonEmptyArray as G,isOrOperator as qa,isSameHierarchy as Ja,nameFromFqn as Ya,nonNullable as K,nonexhaustive as q,preferSummary as Xa,splitGlobalFqn as Za}from"@likec4/core";import{computeAdhocView as Qa,computeProjectsView as $a,computeView as eo,resolveRulesExtendedViews as to}from"@likec4/core/compute-view";import{LikeC4Model as J}from"@likec4/core/model";import"vscode-uri";import{LikeC4Styles as no,ThemeColors as ro,assignTagColors as io,computeColorValues as ao}from"@likec4/core/styles";import{DocumentHighlight as oo,DocumentHighlightKind as so}from"vscode-languageserver";import{CancellationToken as co,Command as lo,DiagnosticSeverity as uo,TextEdit as fo}from"vscode-languageserver-protocol";import{Fqn as po,FqnExpr as Y,FqnRef as X,_stage as mo,_type as ho,exact as go,isAnyOf as Z,isExtendsElementView as _o}from"@likec4/core/types";import{fromBase64 as vo}from"@smithy/util-base64";var LikeC4DocumentationProvider=class extends Ri{parser;locator;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getDocumentation(e){if(!g(e)&&!x(e)&&!y(e))return super.getDocumentation(e);try{let t=P.getDocument(e);if(t.state<F.Linked)return super.getDocumentation(e);let n=this.parser.forDocument(t);switch(!0){case g(e):{let t=n.parseDeploymentNode(e);return t?`**${t.title}**`:void 0}case x(e):{let r=n.parseDeployedInstance(e);if(!r)return;let[i,a]=U.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
+ `)}case y(e):{let t=n.parseElement(e);return t?[`**${t.title}**`,`<small>kind: \`${t.kind}\`</small>`].join(`
3
+ `):void 0}default:return e}}catch(e){v(e)}}};function areOverlap(e,t){return[e,t]=compareRanges(e,t)>0?[t,e]:[e,t],isInRagne(e.range,t.range.start)}function compareRanges(e,t){let n=e.range.start.line-t.range.start.line;return n===0?e.range.start.character-t.range.start.character:n}function isInRagne(e,t){return!(t.line<e.start.line||t.line>e.end.line||t.line==e.start.line&&t.character<e.start.character||t.line==e.end.line&&t.character>e.end.character)}function isMultiline(e){return!!e&&e.range.start.line!=e.range.end.line}const Q={newLine:H.newLine({allowMore:!0}),oneSpace:H.oneSpace(),noSpace:H.noSpace(),indent:H.indent({allowMore:!0}),noIndent:H.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,ve,(e,t)=>{let n=I.findNodesForProperty(e.$cstNode,`values`).filter(O).slice(1);t.cst(n).prepend(Q.oneSpace),t.keywords(`,`).prepend(Q.noSpace).append(Q.oneSpace)})}formatDeploymentRelation(e){this.on(e,le,(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(Q.oneSpace),t.keywords(`]->`).prepend(Q.noSpace),t.keywords(`-[`).append(Q.noSpace),t.nodes(...w([e.target,e.tags],O)).prepend(Q.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Q.oneSpace)})}formatExtendDeployment(e){this.on(e,Ke,(e,t)=>{t.keywords(`extend`).append(Q.oneSpace)})}formatRelation(e){this.on(e,e=>Bn(e)||le(e),(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(Q.oneSpace),t.keywords(`]->`).prepend(Q.noSpace),t.keywords(`-[`).append(Q.noSpace),t.nodes(...w([e.target,e.tags],O)).prepend(Q.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Q.oneSpace)}),this.on(e,kt,(e,t)=>{t.keywords(`->`,`<-`).surround(Q.oneSpace),t.property(`dotKind`).prepend(Q.oneSpace).append(Q.oneSpace),t.keywords(`]->`).prepend(Q.noSpace).append(Q.oneSpace),t.keywords(`-[`).prepend(Q.oneSpace).append(Q.noSpace),t.properties(`title`).prepend(Q.oneSpace),(r(e)&&isMultiline(e.$cstNode)||It(e)&&r(e.$container)&&isMultiline(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(H.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(H.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){pt(e.$container)&&this.getNodeFormatter(e).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(Q.noIndent)}indentContentInBraces(e){if(ze(e)||u(e)||he(e)||Ve(e)||se(e)||d(e)||He(e)||tr(e)||we(e)||ge(e)||tr(e)||kn(e)||Rn(e)||Ye(e)||Zn(e)||Me(e)||yt(e)||sn(e)||$n(e)||hn(e)||_e(e)||Zt(e)||Nn(e)||Se(e)||Be(e)||Wt(e)||_n(e)||Dt(e)||Xe(e)||be(e)||l(e)||m(e)){let t=this.getNodeFormatter(e),n=t.keywords(`{`);n.prepend(Q.noIndent).prepend(Q.oneSpace);let r=isMultiline(e.$cstNode),i=t.keywords(`}`),a=t.interior(n,i),o=null;for(let e of a.nodes){if(!r){t.cst([e]).surround(Q.oneSpace);continue}(!o||!areOverlap(o,e))&&t.cst([e]).prepend(H.newLine({allowMore:!0})).prepend(Q.indent),o=e}r?i.prepend(Q.noIndent).prepend(H.newLine({allowMore:!0})):i.prepend(H.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,Nt)?.keywords(`element`).append(Q.oneSpace)}formatView(e){this.on(e,Hn,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(Q.oneSpace),t.keywords(`of`,`extends`).surround(Q.oneSpace)}),this.on(e,Pn)?.keywords(`dynamic`,`view`).append(Q.oneSpace),this.on(e,Sn)?.keywords(`deployment`,`view`).append(Q.oneSpace)}formatLeafProperty(e){if(Jt(e)||te(e)||gn(e)||Rt(e)||yn(e)||Ce(e)||er(e)||me(e)||Pt(e)||Oe(e)||it(e)||en(e)||Pe(e)||un(e)||In(e)||pe(e)||de(e)||Qe(e)||Ee(e)||Ht(e)||lt(e)){let t=this.getNodeFormatter(e),n=t.keyword(`:`),r=t.keywords(`title`,`description`,`technology`,`summary`,`notation`,`notes`,`color`,`line`,`head`,`tail`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`shape`,`border`,`opacity`,`multiple`,`size`,`padding`,`textSize`);n.nodes.length===0?r.append(Q.oneSpace):n.prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)}}formatLinkProperty(e){this.on(e,Mn,(e,t)=>{t.keyword(`link`).append(Q.oneSpace),t.property(`value`).append(Q.oneSpace),t.keyword(`:`).prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)})}formatNavigateToProperty(e){this.on(e,jt)?.property(`key`).append(Q.oneSpace)}formatAutolayoutProperty(e){this.on(e,Re,(e,t)=>{t.keyword(`autoLayout`).append(Q.oneSpace),t.property(`rankSep`).prepend(Q.oneSpace),t.property(`nodeSep`).prepend(Q.oneSpace)})}formatMetadataProperty(e){this.on(e,Xt,(e,t)=>{t.property(`key`).append(Q.oneSpace),t.keyword(`:`).prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)})}formatElementDeclaration(e){this.on(e,y,(e,t)=>{let n=I.findNodeForProperty(e.$cstNode,`kind`),r=I.findNodeForProperty(e.$cstNode,`name`);r&&n&&(compareRanges(r,n)>0?t.cst([n]).append(Q.oneSpace):(t.cst([r]).append(Q.oneSpace),t.cst([n]).prepend(Q.oneSpace))),t.properties(`props`).prepend(Q.oneSpace)})}formatExtendElement(e){this.on(e,Gn,(e,t)=>{t.keywords(`extend`).append(Q.oneSpace)})}formatGlobals(e){this.on(e,He,(e,t)=>{t.keyword(`style`).append(Q.oneSpace),t.property(`id`).append(Q.oneSpace)}),this.on(e,tr,(e,t)=>{t.keyword(`styleGroup`).append(Q.oneSpace)}),this.on(e,we,(e,t)=>{t.keyword(`predicateGroup`).append(Q.oneSpace)}),this.on(e,ge,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(Q.oneSpace)})}formatImports(e){this.on(e,wn,(e,t)=>{t.keyword(`import`).append(Q.oneSpace),t.keywords(`{`,`}`,`from`).surround(Q.oneSpace)}),this.on(e,_,(e,t)=>{t.keywords(`,`).prepend(Q.noSpace).append(Q.oneSpace)})}formatSpecificationRule(e){if((he(e)||Ve(e)||et(e)||se(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(Q.oneSpace),Fe(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(Q.oneSpace),t.property(`name`).append(Q.oneSpace)}}formatWithPredicate(e){(De(e)||Wn(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(Q.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,g,(e,t)=>{let n=I.findNodeForProperty(e.$cstNode,`kind`),r=I.findNodeForProperty(e.$cstNode,`name`);r&&n&&(compareRanges(r,n)>0?t.cst([n]).append(Q.oneSpace):(t.cst([r]).append(Q.oneSpace),t.cst([n]).prepend(Q.oneSpace))),t.properties(`title`).prepend(Q.oneSpace)})}formatDeployedInstance(e){this.on(e,x,(e,t)=>{let n=e.$cstNode?.content.find(e=>e.text===`=`);n&&t.cst([n]).surround(Q.oneSpace),t.keyword(`instanceOf`).append(Q.oneSpace),t.property(`title`).prepend(Q.oneSpace)})}formatViewRuleGlobalStyle(e){this.on(e,Ft,(e,t)=>{t.keywords(`global`,`style`).append(Q.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(i(e)||Qt(e))&&t.keywords(`global`,`predicate`).append(Q.oneSpace)}formatViewRuleGroup(e){this.on(e,Nn,(e,t)=>{t.keyword(`group`).append(Q.oneSpace)})}formatViewRuleStyle(e){this.on(e,Zt)?.keyword(`style`).append(Q.oneSpace),this.on(e,dt)?.keyword(`style`).append(Q.oneSpace),this.on(e,Yn)?.keyword(`,`).prepend(Q.noSpace).append(Q.oneSpace),this.on(e,Ae)?.keyword(`,`).prepend(Q.noSpace).append(Q.oneSpace)}formatWhereExpression(e){(p(e)||tn(e))&&this.getNodeFormatter(e).keyword(`where`).append(Q.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,qt,(e,t)=>{t.property(`operator`).surround(Q.oneSpace)}),this.on(e,gt,(e,t)=>{t.keyword(`not`).append(Q.oneSpace)}),dn(e)||wt(e)||Ut(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Q.oneSpace),t.property(`not`).surround(Q.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,cn,(e,t)=>{t.property(`operator`).surround(Q.oneSpace)}),this.on(e,Mt,(e,t)=>{t.keyword(`not`).append(Q.oneSpace)}),Ot(e)||zt(e)||Ln(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Q.oneSpace),t.property(`not`).surround(Q.oneSpace)}}formatIncludeExcludeExpressions(e){if(jn(e)||mn(e)||at(e)){let t=this.getNodeFormatter(e);(!e.$cstNode||!isMultiline(e.$cstNode))&&t.keywords(`include`,`exclude`).append(Q.oneSpace)}if(Yn(e)){let t=this.getNodeFormatter(e),n=this.findPredicateExpressionRoot(e),r=n?.$cstNode&&isMultiline(n?.$cstNode);r&&t.property(`value`).prepend(Q.indent),t.keyword(`,`).prepend(Q.noSpace).append(r?Q.newLine:Q.oneSpace)}}formatRelationExpression(e){this.on(e,ut,(e,t)=>{t.keyword(`->`).append(Q.oneSpace)}),this.on(e,ye,(e,t)=>{t.keyword(`->`).prepend(Q.oneSpace)}),this.on(e,Kt,(e,t)=>{t.keywords(`->`,`<->`).prepend(Q.oneSpace),t.keywords(`-[`).prepend(Q.oneSpace).append(Q.noSpace),t.keywords(`]->`).prepend(Q.noSpace).append(Q.oneSpace),t.property(`dotKind`).prepend(Q.oneSpace).append(Q.oneSpace)}),this.on(e,Le,(e,t)=>{t.property(`target`).prepend(Q.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||jn(t)||mn(t)||at(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:q(n.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;t??=this.on(e,rt)?.property(`value`),t??=this.on(e,y)?.properties(`props`),t??=this.on(e,wn)?.properties(`project`),t??=this.on(e,Bn)?.properties(`title`,`technology`),t??=this.on(e,Nn)?.properties(`title`),t??=this.on(e,kt)?.properties(`title`),t??=this.on(e,g)?.properties(`title`),t??=this.on(e,x)?.properties(`title`),t??=this.on(e,le)?.properties(`title`,`technology`),t??=this.on(e,Mn)?.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 yo=h.getChild(`LanguageServices`),isErrorDiagnostic=e=>e.severity===fa.Error;var DefaultLikeC4LanguageServices=class{builder;editor;projectsManager;constructor(e){this.services=e,this.builder=e.likec4.ModelBuilder,this.projectsManager=e.shared.workspace.ProjectsManager,this.editor=e.likec4.ModelChanges}get mcpServer(){let e=this.services.mcp.Server;return e instanceof Jr?null:e}get views(){return this.services.likec4.Views}get workspaceUri(){return this.services.shared.workspace.WorkspaceManager.workspaceUri}projects(){let e=this.services.shared.workspace.ProjectsManager,t=S(this.services.shared.workspace.LangiumDocuments.groupedByProject(),dr(),A(([t,n])=>{let r=t,{folderUri:i,config:a}=e.getProject(r);return{id:r,folder:i,title:a.title??a.name,documents:A(n,Cr(`uri`)),config:a}}));if(M(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(M(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=A(this.services.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),Cr(`uri`));return{id:t,folder:n,title:r.title??r.name,documents:i,config:r}}async diagrams(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.views.diagrams(n,t)}async computedModel(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.builder.computeModel(n,t)}async layoutedModel(e,t){let n=this.projectsManager.ensureProjectId(e),r=await this.builder.computeModel(n,t);if(!r)throw Error(`Failed to compute model, empty project?`);let i=await this.views.layoutAllViews(n,t);return J.create({...r.$data,_stage:`layouted`,views:S(i,A(Cr(`diagram`)),rr(Cr(`id`)))})}async projectsOverview(e){let t=this.services.shared.workspace.ProjectsManager.all,n=[];for(let r of t){let t=await this.builder.computeModel(r,e);if(e?.isCancellationRequested)throw Error(`Operation cancelled`);if(t===J.EMPTY){yo.debug(`Project ${r} is empty, skipping`);continue}n.push(t)}if(!M(n,1))throw Error(`No models found`);let r=$a(n);return await this.views.layouter.layoutProjectsView(r)}getErrors(){return S(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),T(e=>S(e.diagnostics??[],w(isErrorDiagnostic),A(({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:q(e)}}async dispose(){try{yo.debug(`disposing LikeC4LanguageServices`),await this.services.shared.workspace.FileSystemWatcher.dispose(),this.services.mcp.Server.isStarted&&await this.services.mcp.Server.stop(),this.services.Rpc.dispose(),this.services.likec4.ModelBuilder.dispose()}catch(e){yo.error(z(e))}finally{yo.debug(`LikeC4LanguageServices disposed`)}}},ADisposable=class{toDispose=[];isDisposed=!1;onDispose(...e){this.toDispose.push(...e)}dispose(){this.throwIfDisposed(),this.isDisposed=!0;let e;for(;e=this.toDispose.pop();)try{e.dispose()}catch(e){v(e)}}throwIfDisposed(){if(this.isDisposed)throw Error(`This has already been disposed`)}};function elementRef(e){try{let t=fe(e)?e.el.ref:e.modelElement.value.ref;return t?.$type===`Imported`&&(t=t.imported.ref),t?.$type===`Element`?t:void 0}catch{return}}function readStrictFqn(e){let t=[e.$type===`StrictFqnRef`?e.value.$refText:e.el.$refText],n=e.parent;for(;n;)t.push(n.$type===`StrictFqnRef`?n.value.$refText:n.el.$refText),n=n.parent;return t.length===1?t[0]:t.reverse().join(`.`)}function referenceableParent(e){for(;e.parent;)e=e.parent;return e.value.ref??null}function instanceRef(e){let t;for(;t=e.value?.ref;){if(g(t))return null;if(x(t))return t;if(E(e.parent))return null;e=e.parent}return null}function importsRef(e){let t=referenceableParent(e);return t?.$type===`Imported`?t:null}function isReferenceToDeploymentModel(e){let t;for(;t=e.value?.ref;){if($e(t))return!0;if(E(e.parent))return!1;e=e.parent}return!1}function projectIdFrom(e){if(_(e)){for(;e.$type===`Imported`&&e.$container;)e=e.$container;W(wn(e))}if(wn(e))return e.project;let t=Ji(e)?P.getDocument(e):e;return t.likec4ProjectId?t.likec4ProjectId:(h.warn`Document ${t.uri.fsPath} does not have a project ID assigned, this may lead to unexpected behavior.`,Wr.DefaultProjectId)}function stringHash$1(...e){return la(e.length>1?e.join(`:::`):e[0])}function safeCall(e){try{return e()}catch(e){h.trace(`Safe call failed`,{error:e});return}}function performanceNow(){try{return globalThis.performance.now()}catch{return Date.now()}}function performanceMark(){let e=performanceNow();return{get ms(){return performanceNow()-e},get pretty(){return oi(performanceNow()-e)}}}var LikeC4CodeLensProvider=class{constructor(e){this.services=e}async provideCodeLens(e,t,n){if(Ur(e))return e.state<F.Linked&&(h.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(F.Linked,e.uri,n),h.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=Hr.readId(e),n=e.$cstNode?.range;if(!n||!t)return[];let r=projectIdFrom(e);return{range:{start:n.start,end:{line:n.start.line,character:n.start.character+4}},command:{command:`likec4.open-preview`,arguments:[t,r],title:`open preview`}}})}};const bo=[`color`,`shape`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`border`,`opacity`,`multiple`,`size`,`textSize`].join(`,`);function isCompletionForPojectName(e,t){return Li.isRuleCall(t.feature)&&t.property===`project`&&wn(e.node)}var LikeC4CompletionProvider=class extends ba{constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,n){switch(!0){case Li.isKeyword(t.feature):return this.completionForKeyword(e,t.feature,n);case Li.isCrossReference(t.feature)&&!!e.node:return this.completionForCrossReference(e,t,n);case isCompletionForPojectName(e,t):return this.completionForImportedProject(e,n)}}completionForKeyword(e,t,n){if(this.filterKeyword(e,t))switch(!0){case t.value===`import`:n(e,{label:t.value,kind:B.Snippet,insertTextFormat:V.Snippet,insertText:`${t.value} { $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&P.hasContainerOfType(e.node,sn):n(e,{label:t.value,detail:`Insert deployment view`,kind:B.Class,insertTextFormat:V.Snippet,insertText:["deployment view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` include $0`,`}`].join(`
4
+ `)});break;case[`title`,`description`,`technology`,`link`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} property`,kind:B.Property,insertTextFormat:V.Snippet,insertText:`${t.value} '\${0}'`});break;case t.value===`color`:n(e,{label:t.value,kind:B.Property,insertTextFormat:V.Snippet,insertText:`${t.value} \${1|${ro.join(`,`)}|}$0`});break;case t.value===`opacity`:n(e,{label:t.value,kind:B.Property,insertTextFormat:V.Snippet,insertText:`${t.value} \${0:100}%`});break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:B.Module,insertTextFormat:V.Snippet,insertText:`${t.value} {\n\t$0\n}`});break;case t.value===`group`:n(e,{label:t.value,detail:`Insert group block`,kind:B.Module,insertTextFormat:V.Snippet,insertText:["group '${1:Title}' {",` $0`,`}`].join(`
5
+ `)});break;case[`par`,`parallel`].includes(t.value):n(e,{label:t.value,detail:`Insert block of parallel steps`,kind:B.Module,insertTextFormat:V.Snippet,insertText:[`${t.value} {`,` $0`,`}`].join(`
6
+ `)});break;case t.value===`dynamic`&&P.hasContainerOfType(e.node,sn):n(e,{label:t.value,detail:`Insert dynamic view`,kind:B.Class,insertTextFormat:V.Snippet,insertText:["dynamic view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` $0`,`}`].join(`
7
+ `)});break;case t.value===`style`&&e.node&&P.hasContainerOfType(e.node,He):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:B.Module,insertTextFormat:V.Snippet,insertText:`${t.value} \${1:name} \${2:*} {\n\t\${3|${bo}|} $0\n}`});break;case t.value===`style`&&e.node&&P.hasContainerOfType(e.node,or([sn,tr])):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:B.Module,insertTextFormat:V.Snippet,insertText:`${t.value} \${1:*} {\n\t\${2|${bo}|} $0\n}`});break;case t.value===`style`:n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:B.Module,insertTextFormat:V.Snippet,insertText:`${t.value} {\n\t\${1|${bo}|} $0\n}`});break;case t.value===`extend`:n(e,{label:t.value,detail:`Extend another view`,kind:B.Class,insertTextFormat:V.Snippet,insertText:`extend $1 {
8
+ $0
9
+ }`});break;case t.value===`autoLayout`:n(e,{label:t.value,kind:B.Property,insertTextFormat:V.Snippet,insertText:"autoLayout ${1|TopBottom,BottomTop,LeftRight,RightLeft|}$0"});break;case t.value===`mode`:n(e,{label:t.value,kind:B.Property,insertTextFormat:V.Snippet,insertText:"mode ${1|sequence,diagram|}$0"});break;case[`include`,`exclude`].includes(t.value):n(e,{label:t.value,kind:B.Operator,detail:`Insert ${t.value} predicate`,insertTextFormat:V.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=C(a)?`'`:a.substring(0,1);for(let r of n.all){let n=o+r+o;t(e,{label:r,kind:B.Folder,insertText:n,filterText:n,textEdit:ga.replace(i,n),detail:`Project`,sortText:`0_`+r})}}},LikeC4DocumentHighlightProvider=class extends xa{createDocumentHighlight(e){return oo.create(e.segment.range,so.Read)}},LikeC4DocumentLinkProvider=class{constructor(e){this.services=e}async getDocumentLinks(e,t,n){return!Ur(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:P.streamAllContents(e.parseResult.value).filter(Mn).map(t=>{try{let n=I.findNodeForProperty(t.$cstNode,`value`)?.range,r=n&&this.resolveLink(e,t.value);if(r&&ai(r))return{range:n,target:r}}catch(e){v(e)}return null}).nonNullable().toArray()}resolveLink(e,t){if(ai(t)||ri(t))return t;if(ti(t))return $r(e.uri.toString(),`../`,t);let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri;return $r(n.toString(),t)}relativeLink(e,t){if(ri(t))return ni(t);if(ti(t)){let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri.toString(),r=new URL(e.uri.toString());return ni(ei(new URL(t,r).toString(),n))}return null}};const xo=h.getChild(`DocumentSymbolProvider`);var LikeC4DocumentSymbolProvider=class{nodeKindProvider;nameProvider;parser;locator;constructor(e){this.services=e,this.nodeKindProvider=e.shared.lsp.NodeKindProvider,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator,this.nameProvider=e.references.NameProvider}async getSymbols(e,t,n){if(!Ur(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e))return[];e.state<F.Linked&&(xo.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(F.Linked,e.uri,n),xo.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 v(e),[]}})}getLikec4LibSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=e.icons.map(e=>this.getLibIconSymbol(e)).filter(O);return n.length===0?[]:[{kind:ha.Namespace,name:`icons`,range:t.range,selectionRange:I.findNodeForKeyword(t,`icons`)?.range??t.range,children:n}]}getSpecSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=I.findNodeForProperty(t,`name`);if(!n)return[];let r=S([...e.elements,...e.tags,...e.relationships],A(e=>{try{if(he(e)||Ve(e)||se(e))return this.getKindSymbol(e);if(et(e))return this.getTagSymbol(e)}catch(e){return v(e),null}q(e)}),w(O));return r.length===0?[]:[{kind:ha.Namespace,name:e.name,range:t.range,selectionRange:n.range,children:r}]}getModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=I.findNodeForProperty(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>ae(e)?[]:this.getElementsSymbol(e))}]:[]}getDeploymentModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=I.findNodeForProperty(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>this.getDeploymentElementSymbol(e))}]:[]}getElementsSymbol(e){try{if(Gn(e))return this.getExtendElementSymbol(e);if(y(e))return this.getElementSymbol(e)}catch(e){v(e)}return[]}getExtendElementSymbol(e){let t=e.$cstNode,n=e.element.$cstNode,r=e.body;return!t||!n?[]:[{kind:this.symbolKind(e),name:readStrictFqn(e.element),range:t.range,selectionRange:n.range,children:r.elements.flatMap(e=>this.getElementsSymbol(e))}]}getElementSymbol(e){let t=e.$cstNode,n=I.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=I.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||C(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||C(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||C(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?I.findNodeForProperty(t,`name`):null;return n?[{kind:this.symbolKind(e),name:n.text,range:t.range,selectionRange:n.range,children:[]}]:[]}getDeploymentElementSymbol(e){try{if(g(e))return this.getDeploymentNodeSymbol(e);if(x(e))return this.getDeployedInstanceSymbol(e);if(Ke(e))return[]}catch(e){v(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=P.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 So=`
10
+ ---
11
+ `;var LikeC4HoverProvider=class extends ya{parser;locator;constructor(e){super(e),this.services=e,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getAstNodeHoverContent(e){if(xe(e))return{contents:{kind:`markdown`,value:"tag `"+e.name+"`"}};if(Nt(e))return{contents:{kind:`markdown`,value:"element kind `"+e.name+"`"}};if(nt(e))return{contents:{kind:`markdown`,value:"deployment node `"+e.name+"`"}};if(rn(e))return{contents:{kind:`markdown`,value:"relationship kind `"+e.name+"`"}};try{if(y(e))return this.getElementHover(e);if(g(e))return this.getDeploymentNodeHover(e);if(x(e))return this.getDeployedInstanceHover(e)}catch(e){h.debug(z(e))}}getElementHover(e){let t=this.locator.getParsedElement(e);if(!t)return;let n=t.element,r=[`<sup>\`${n.id}\`</sup> `,`### ${n.title} `],i=Xa(n);i&&r.push(``,(i.md??i.txt).split(`
12
+ `).join(`
13
+ `));let a=this.services.likec4.LastSeen.model(t.projectId)?.findElement(n.id),o=a&&this.getElementModelHover(a,t.projectId);return r.push(o||`
14
+ <small>_Model not processed yet, open any view to trigger_</small> `),{contents:{kind:`markdown`,value:r.join(`
15
+ `)}}}getElementModelHover(e,t){let n=[],r=[...e.incoming(`direct`)].length,i=[...e.outgoing(`direct`)].length;(r>0||i>0)&&n.push(So,`<small>**${r}** incoming, **${i}** outgoing relationships</small> `);let printViewLink=e=>{let n=[e.id,t],r=Hi.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(n))}`);return` - [${e.titleOrId}](${r})`},a=[...e.scopedViews()].map(printViewLink);a.length>0&&n.push(So,`<small>Element views:</small>`,...a);let o=[...e.views()].map(t=>t.isScopedElementView()&&t.viewOf===e?null:printViewLink(t)).filter(kr);if(o.length>0){let e=a.length>0?`Also appears in views:`:`Appears in views:`;n.push(a.length>0?``:So,`<small>${e}</small>`,...o,` `)}return n.length>0?n.join(`
16
+ `):void 0}getDeploymentNodeHover(e){let t=P.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=Xa(n);return i&&r.push(``,i.md??i.txt),{contents:{kind:`markdown`,value:r.join(`
17
+ `)}}}getDeployedInstanceHover(e){let t=P.getDocument(e),n=this.parser.forDocument(t).parseDeployedInstance(e),[r,i]=U.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 \`${U.flatten(n.element)}\``];return a&&o.push(`### ${a.element.title}`,"element kind `"+a.element.kind+"` "),{contents:{kind:`markdown`,value:o.join(`
18
+ `)}}}},LikeC4CodeActionProvider=class{getCodeActions(e,t){let n=t.context.diagnostics,r=[];for(let i of n)i.code===`manual-layout-v1`&&r.push({title:`Migrate Manual Layouts`,command:lo.create(`Migrate Manual Layouts`,`likec4.migrate-manual-layouts`),edit:{changes:{[e.textDocument.uri]:[fo.insert(t.range.start,``)]}},kind:`quickfix`,isPreferred:!0,diagnostics:[i]});return r.length>0?r:void 0}};const Co=h.getChild(`SemanticTokenProvider`),wo={...ma},To={...pa};function createSemanticTypeMethods(e){let t=[],n=new Proxy({},{get(r,i){if(i===`modifier`)return e=>(t.push(e),n);if(i in To)return t.push(To[i]),n;if(i in wo)return()=>e(wo[i],t);throw Error(`Unknown semantic token type or modifier: ${i}`)}});return n}const Eo=`Stop Highlighting`,stopHighlight=()=>{throw Eo};var LikeC4SemanticTokenProvider=class extends va{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(rn,e=>{e.property(`name`).function()}),when(Z(Bn,Kt,le),e=>{e.property(`kind`).function()}),when(st,e=>{e.property(`name`).definition.function(),stopHighlight()}),when(Z(jt,ie),e=>{e.property(`value`).readonly.definition.interface(),stopHighlight()}),when(Ge,e=>{e.cst().readonly.definition.variable(),stopHighlight()}),when(ce,e=>{e.node.selector&&(e.node.ref.parent?e.property(`selector`).property():e.property(`selector`).readonly.definition.variable())}),when(Cn,e=>{e.cst().type(),stopHighlight()}),when(Je,e=>{e.cst().function(),stopHighlight()}),when(Ut,e=>{O(e.node.value)&&e.property(`value`).function()}),when(Z(Ot,dn),e=>{O(e.node.value)&&e.property(`value`).readonly.definition.type()}),when(Z(Vn,Qn),e=>{e.property(`participant`).keyword()}),when(Bt,e=>{O(e.node.kind)&&e.property(`kind`).definition.type()}),when(Z(tr,He),e=>{e.property(`id`).readonly.definition.variable()}),when(Ft,e=>{e.property(`style`).readonly.definition.variable()}),when(Z(we,ge),e=>{e.property(`name`).readonly.definition.variable()}),when(i,e=>{e.property(`predicate`).readonly.definition.variable()}),when(_t,e=>{O(e.node.tag)&&e.property(`tag`).definition.type()}),when(Z(Ie,Ze),e=>{if(e.node.parent){e.property(`value`).property();return}let t=e.node.$cstNode?.text;t!==`this`&&t!==`it`&&e.property(`value`).readonly.definition.variable(),stopHighlight()}),when(fe,e=>{e.node.parent?e.property(`el`).property():(e.property(`el`).readonly.definition.variable(),stopHighlight())}),when(Fe,e=>{e.keyword(`color`).keyword(),e.property(`name`).readonly.declaration.type()}),when(et,e=>{O(e.node.color)&&e.keyword(`color`).property()}),when(Z(he,Ve,se),e=>{e.property(`kind`).readonly.declaration.type()}),when(xe,e=>{e.property(`name`).definition.type()}),when(un,e=>{e.property(`value`).number()}),when(it,e=>{if(e.node.libicon||e.node.value===`none`){e.property(e.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}e.property(`value`).string()}),when(Mn,e=>{O(e.node.value)&&e.property(`value`).string()}),when(me,e=>{O(e.node.customColor)&&e.property(`customColor`).enum(),O(e.node.themeColor)&&e.property(`themeColor`).enum()}),when(pe,e=>{O(e.node.customColor)&&e.property(`customColor`).enum(),O(e.node.themeColor)&&e.property(`themeColor`).enum()}),when(Z(en,Oe,Pt,Pe,ke,Qe,Dn),e=>{O(e.node.value)&&e.property(`value`).enum()})}async semanticHighlight(e,t,n=co.None){return e.state<F.Linked&&await this.ensureState(e,n),await super.semanticHighlight(e,t,n)}async semanticHighlightRange(e,t,n=co.None){return e.state<F.Linked&&await this.ensureState(e,n),await super.semanticHighlightRange(e,t,n)}async semanticHighlightDelta(e,t,n=co.None){return e.state<F.Linked&&await this.ensureState(e,n),await super.semanticHighlightDelta(e,t,n)}async ensureState(e,t){e.state<F.Linked&&(Co.debug`waiting for document ${e.uri.path} to be ${`Linked`}`,await this.services.shared.workspace.DocumentBuilder.waitUntil(F.Linked,e.uri,t),Co.debug`document ${e.uri.path} is ${`Linked`}`)}highlightElement(e,t){if(Z(y,g,x)(e))return this.highlightNameAndKind(e);if(a(e))return this.highlightView(e);Te(e)&&!Z(b,Wt,Me)(e)&&O(e.key)&&t({node:e,property:`key`,type:ma.property});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===Eo)return`prune`;Co.warn(`Error highlighting node of type ${e._type}`,{error:t})}}highlightNameAndKind(e){if(this.mark(e).property(`name`).declaration.readonly.variable(),x(e)||this.mark(e).property(`kind`).keyword(),y(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:ra(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 Do=Z(y,Gn);var FqnIndex=class extends ADisposable{projects;langiumDocuments;documentCache;workspaceCache;logger=h.getChild(`fqn-index`);constructor(t){super(),this.services=t,this.langiumDocuments=t.shared.workspace.LangiumDocuments,this.projects=t.shared.workspace.ProjectsManager,this.documentCache=new Xi(e=>this.createDocumentIndex(e)),this.workspaceCache=new Gi(t.shared,F.IndexedContent),this.onDispose(t.shared.workspace.DocumentBuilder.onDocumentPhase(F.IndexedContent,t=>{Ur(t)&&e(t)&&this.documentCache.delete(t)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=F.IndexedContent)}get(e){return e.state<F.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:Ui.basename(e.uri),state:e.state,expect:F.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){W(y(e)||$e(e));let t=Ir.readId(e);if(O(t))return t;let n=P.getDocument(e);return n.state<F.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:Ui.basename(n.uri)}),W(Ur(n)),this.get(n),K(Ir.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return L(this.workspaceCache.get(`${e}:fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}rootElements(e){return L(this.workspaceCache.get(`${e}:rootElements`,()=>{let t=new R;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 L(this.workspaceCache.get(`${e}:directChildrenOf:${t}`,()=>{let n=new R;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 L(this.workspaceCache.get(`${e}:uniqueDescedants:${t}`,()=>{let n=new R,r=new R;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,...sa(a)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements.filter(Do));if(t.length===0)return Oo.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new R,a=new R,o=new R,s=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,r,i)=>{let a=Object.assign(s.createDescription(t,r,e),{id:i,likec4ProjectId:n});return Ir.writeId(t,i),o.set(i,a),a};function traverseElement(e,t){let n=po(e.name,t),o=createAndSaveDescription(e,e.name,n);t?i.set(t,o):r.push(o);let s=w(e.body?.elements??[],Do);if(!M(s,1))return[o];let c=s.flatMap(e=>traverseElement(e,n));for(let e of c)a.set(n,e);return[o,...c]}function traverseExtendElement(e){let t=readStrictFqn(e.element),n=S(e.body?.elements??[],w(y),T(e=>traverseElement(e,t)));if(n.length!==0)for(let e of[t,...Zi(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(Gn(n)){traverseExtendElement(n);continue}traverseElement(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:Ui.basename(e.uri),error:t})}return new Oo(r,i,a,o,n)}};function uniqueByName(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>Qi(e.name,t.name))}var Oo=class DocumentFqnIndex{static EMPTY=new DocumentFqnIndex([],new R,new R,new R,Wr.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 ko=Ha($e,Ke);var DeploymentsIndex=class extends FqnIndex{Names;logger=h.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(ko));if(t.length===0)return Oo.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new R,a=new R,o=new R,s=this.Names,c=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,r,i)=>{let a={...c.createDescription(t,r,e),id:i,likec4ProjectId:n};return Ir.writeId(t,i),o.set(i,a),a};function traverseElement(e,t){let n=s.getName(e);if(!O(n))return[];let o=Oa(n,t),c=createAndSaveDescription(e,n,o);if(t?i.set(t,c):r.push(c),x(e))return[c];let l=w(e.body?.elements??[],ko);if(!M(l,1))return[c];let u=l.flatMap(e=>traverseElement(e,o));for(let e of u)a.set(o,e);return[c,...u]}function traverseExtend(e){let t=readStrictFqn(e.deploymentNode),n=S(e.body?.elements??[],w(ko),T(e=>traverseElement(e,t)));if(n.length!==0)for(let e of[t,...Ia(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(Ke(n)){traverseExtend(n);continue}traverseElement(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:Ui.basename(e.uri),error:t})}return new Oo(r,i,a,o,n)}};const Ao=/^(aws|azure|gcp|tech):(.+)$/;function deriveTechnologyFromIcon(e){if(!e)return;let t=Ao.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 R(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;kr(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=io(n),this.projectId=gr(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 h.warn`No kind '${i}' found for ${r}`,null;s??=u.technology,o??=u.description,c??=u.summary,t??=u.links,fr(a)&&(a=u.title||na(r)),u.tags&&ta(u.tags)&&(e=e?wr([...u.tags,...e]):u.tags);let d=go({...u.style,...n});return!s&&this.inferTechFromIcon&&(s=deriveTechnologyFromIcon(d.icon)),go({metadata:l&&!C(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){v(e)}return null};toModelRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>kr(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a};toDeploymentElement=e=>{if(`element`in e&&!(`kind`in e))return{...e,element:X.flatten(e.element)};if(`element`in e)return h.warn`Invalid ParsedAstDeployment ${e.id}, has both element and kind properties`,null;try{let t=this.specs.deployments[e.kind];if(!t)return h.warn`No kind ${e.kind} found for ${e.id}`,null;let{id:n,style:r,title:i,...a}=e;return i=i===na(e.id)&&t.title?t.title:i,go({...t,...a,title:i,style:go({...t.style,...r}),id:n})}catch(e){v(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>kr(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a}},LastSeenArtifacts=class{#e=new Map;#t=new Map;#n=new Map;constructor(e){e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()})}rememberSpecification(e){return e.projectId&&this.#e.set(e.projectId,e),e}rememberModel(e){let t=e.projectId,n=e.$styles,r=this.#t.get(t);return(!r||!r.equals(n))&&this.#t.set(t,n),this.#n.set(t,e),e}specification(e){return this.#e.get(e)}styles(e){return this.#t.get(e)}model(e){return this.#n.get(e)}};function assignNavigateTo(e){let t=new Map;for(let n of e)if(Ga(n)&&n.viewOf&&E(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=sr(t.get(r)??[],e=>e!==n);i&&(e.navigateTo=i)}return e}const{getDocument:jo}=P;function unpack({nodes:e,edges:t,autoLayout:n,...r}){return{...r,autoLayout:Ua(n)?{direction:n}:n,nodes:_r(e,({b:e,c:t,...n})=>({x:e[0],y:e[1],width:e[2],height:e[3],isCompound:t,...n})),edges:_r(t,({p:e,cp:t,l:n,...r})=>({...!!t&&{controlPoints:t},...!!n&&{labelBBox:n},...r,points:e}))}}function hasManualLayout(e){return e.includes(`@likec4-generated`)}function deserializeFromComment(e){if(!hasManualLayout(e))throw Error(`Not a likec4-generated comment: ${e}`);return unpack(ci(vo(e.trim().split(`
19
+ `).filter(e=>!e.includes(`**`)&&!e.includes(`@likec4-`)&&!e.includes(`*/`)).map(e=>e.replaceAll(`*`,``).trim()).join(``))))}function parseViewManualLayout(e){let t=Oi.findCommentNode(e.$cstNode,[`BLOCK_COMMENT`]);if(!(!t||!hasManualLayout(t.text)))try{return deserializeFromComment(t.text)}catch(n){let r=jo(e);v(n),h.warn(`Ignoring manual layout of "${e.name??`unnamed`}" at ${r.uri.fsPath}:${1+(t.range.start.line||0)}`);return}}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=wr([...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=wr([...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=wr([...e.tags,...r]));let i=t.metadata;return e.metadata&&(i=this.mergeMetadata(e.metadata,t.metadata)),{...e,tags:M(r,1)?r:null,links:M(n,1)?n:null,...!C(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=_r(r.specs.colors,e=>ao(e.color)),a=new Set,o=new MergedExtends,s=new MergedExtends,c=n.flatMap(e=>e.c4ExtendRelations),l=new Set,scanMetadataKeys=e=>{e?.metadata&&k(e.metadata).forEach(e=>a.add(e))},u=S(n,T(e=>(o.merge(e.c4ExtendElements),A(e.c4Elements,r.toModelElement))),w(O),ca,hr((e,t)=>{let n=oa(t.id);return n&&E(e[n])?(h.debug`No parent found for ${t.id}`,e):(e[t.id]=o.applyExtended(t),scanMetadataKeys(e[t.id]),e)},{})),d=S(n,T(e=>A(e.c4Relations,r.toModelRelation)),w(e=>{if(!e)return!1;let t=X.flatten(e.source),n=X.flatten(e.target);return E(u[t])&&!Ka(t)||E(u[n])&&!Ka(n)?(h.debug`Invalid relation ${e.id}
20
+ source: ${t} resolved: ${!!u[t]}
21
+ target: ${n} resolved: ${!!u[n]}\n`,!1):!0}),A(e=>{let t=stringHash$1(`extend-relation`,X.flatten(e.source),X.flatten(e.target),e.kind??`default`,e.title??``),n=c.filter(e=>e.id===t);if(n.length===0)return e;n.forEach(e=>l.add(e.astPath));let r=e.tags?[...e.tags]:[],i=e.links?[...e.links]:[],a=e.metadata?{...e.metadata}:{};for(let e of n){if(e.tags&&r.push(...e.tags),e.links)for(let t of e.links)i.some(e=>e.url===t.url&&(e.title||``)===(t.title||``))||i.push(t);if(e.metadata)for(let[t,n]of Object.entries(e.metadata)){let e=a[t];if(e===void 0)a[t]=n;else{let r=Array.isArray(e)?e:[e],i=Array.isArray(n)?n:[n],o=wr([...r,...i]);a[t]=o.length===1?o[0]:o}}}let o=wr(r),s=i;return{...e,...M(o,1)&&{tags:o},...M(s,1)&&{links:s},...!C(a)&&{metadata:a}}}),cr(scanMetadataKeys),rr(Cr(`id`))),f=S(n,T(e=>(s.merge(e.c4ExtendDeployments),A(e.c4Deployments,r.toDeploymentElement))),w(O),ca,hr((e,t)=>{let n=oa(t.id);return n&&E(e[n])?(h.debug`No parent found for deployment element ${t.id}`,e):(e[t.id]=Wa(t)?s.applyExtended(t):t,scanMetadataKeys(e[t.id]),e)},{})),p=S(n,T(e=>A(e.c4DeploymentRelations,r.toDeploymentRelation)),w(e=>e?E(f[e.source.deployment])||E(f[e.target.deployment])?(h.debug`Invalid deployment relation ${e.id}
22
+ source: ${e.source.deployment} resolved: ${!!f[e.source.deployment]}
23
+ target: ${e.target.deployment} resolved: ${!!f[e.target.deployment]}\n`,!1):!0:!1),hr((e,t)=>j(e[t.id])?(h.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[ho]===`element`&&E(i)&&`viewOf`in e&&(i=u[e.viewOf]?.title??null),E(i)&&r===`index`&&(i=`Landscape view`),{...Dr(s,e=>e===void 0),[mo]:`parsed`,sourcePath:Ui.relative(t.folderUri,n),docUri:n,description:a,title:i,id:r}}}let m=n.flatMap(e=>A(e.c4Views,toC4View(e)));if(m.some(e=>e.id===`index`)||m.unshift({[mo]:`parsed`,[ho]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]}),t.config.implicitViews!==!1){let e=new Set;for(let t of m)t[ho]===`element`&&`viewOf`in t&&t.viewOf&&e.add(t.viewOf);let t=new Set(m.map(e=>e.id));for(let n of k(u)){if(e.has(n)||Ka(n))continue;let r=`__`+n.replaceAll(`.`,`_`);t.has(r)||(t.add(r),m.push({[mo]:`parsed`,[ho]:`element`,id:r,viewOf:n,title:`Auto / ${u[n]?.title??n}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let ee=S(m,rr(Cr(`id`)));m.some(_o)&&(ee=to(ee));for(let e of c)l.has(e.astPath)||h.warn(`Relation extend at ${e.astPath} does not match any relation in the model`);return{data:{[mo]:`parsed`,projectId:t.id,project:go({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:_r(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(Qi)},customColors:i},elements:u,relations:d,globals:r.globals,views:ee,deployments:{elements:f,relations:p},imports:{}},imports:r.imports}}const parsedWithoutImportsCacheKey=e=>`parsed-without-imports-${e}`,parsedModelCacheKey=e=>`parsed-model-${e}`,computedModelCacheKey=e=>`computed-model-${e}`,Mo=h.getChild(`builder`);var DefaultLikeC4ModelBuilder=class extends ADisposable{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.cache=t.shared.workspace.Cache,this.DocumentBuilder=t.shared.workspace.DocumentBuilder,this.mutex=t.shared.workspace.WorkspaceLock,this.manualLayouts=t.shared.workspace.ManualLayouts,this.lastSeen=t.likec4.LastSeen,this.onDispose(this.DocumentBuilder.onUpdate((e,t)=>{t.length>0&&this.notifyListeners(t)}),t.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.clearCache()}));let n=Tr(lr(),w(t=>e(t)&&!this.projects.isExcluded(t)),A(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(F.Validated,(e,t)=>{let r=n(e);r.length>0&&this.notifyListeners(r)})),Mo.debug`created`}unsafeSyncParseModelData(e){let t=this.cache,n=parsedWithoutImportsCacheKey(e);return t.get(n,()=>{let t=Mo.getChild(e);try{let n=this.projects.getProject(e),r=this.documents(e);return r.length===0?(t.debug`unsafeSyncParseModelData: skipped due to no documents`,null):(t.debug`unsafeSyncParseModelData: completed`,buildModelData(this.services,n,r))}catch(t){return Mo.warn(`unsafeSyncParseModelData failed for project ${e}`,{err:t}),null}})}unsafeSyncJoinedModelData(e){let t=Mo.getChild(e),n=this.unsafeSyncParseModelData(e);if(!n)return null;if(n.imports.size===0)return n.data;t.debug`processing imports of ${e}`;let r=[...n.imports.associations()].reduce((e,[t,n])=>{if(n.size===0)return e;let r=this.unsafeSyncParseModelData(t);if(r){let i=[...n].flatMap(e=>r.data.elements[e]??[]);M(i,1)&&(e[t]=structuredClone(i))}return e},{});return{...n.data,imports:r}}async parseModel(e,t){e=this.projects.ensureProjectId(e);let n=Mo.getChild(e),r=this.cache,i=performanceMark();return await this.mutex.read(async()=>{t?.isCancellationRequested&&await qi(t);let a=parsedModelCacheKey(e);return r.has(a)&&n.debug`parseModel from cache`,r.get(a,()=>{let t=this.unsafeSyncJoinedModelData(e);return t?(n.debug`parseModel in ${i.pretty}`,J.create(t)):(n.debug`parseModel: returning EMPTY`,J.EMPTY.asParsed)})})}previousViews={};unsafeSyncComputeModel(e,t){let n=this.cache,r=computedModelCacheKey(e)+(t?.hash??``);return n.get(r,()=>{let n=Mo.getChild(e),r=this.unsafeSyncJoinedModelData(e);if(!r)return n.debug`unsafeSyncComputeModel: returning EMPTY`,J.EMPTY.asComputed;let i=J.create(r),a=[];for(let e of Er(r.views)){let r=eo(e,i);if(!r.isSuccess){n.warn(z(r.error));continue}t?.views[e.id]&&Object.assign(r.view,{hasManualLayout:!0}),a.push(r.view)}assignNavigateTo(a);let o=D(a,t=>{let n=computedViewKey(e,t.id),r=this.previousViews[n],i=r&&si(t,r)?r:t;return this.previousViews[n]=i,[t.id,i]}),s={...r,manualLayouts:{...t?.views},[Pa]:`computed`,views:o};return n.debug(`unsafeSyncComputeModel${t?` with manual layouts`:``}: completed`),this.lastSeen.rememberModel(J.create(s))})}async computeModel(e,t){e=this.projects.ensureProjectId(e);let n=Mo.getChild(e),r=performanceMark();return await this.mutex.read(async()=>{t?.isCancellationRequested&&await qi(t);let i=this.projects.getProject(e),a=await this.manualLayouts.read(i),o=this.unsafeSyncComputeModel(e,a);return o===J.EMPTY?n.debug(`computeModel returned EMPTY`):r.ms>10&&n.debug(`computeModel completed in ${r.pretty}`),o})}onModelParsed(e){return this.listeners.push(e),Pi.create(()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1)})}clearCache(){Mo.debug(`clearCache`),this.cache.clear(),this.previousViews={}}documents(e){return this.parser.documents(e).toArray()}notifyListeners(e){for(let t of this.listeners)try{t(e)}catch(e){Mo.warn(z(e))}}};function computedViewKey(e,t){return`computed-view-${e}-${t}`}const{findNodeForKeyword:No,findNodeForProperty:Po}=I,{getDocument:Fo,streamAllContents:Io}=P,Lo=h.getChild(`locator`);var LikeC4ModelLocator=class{fqnIndex;deploymentsIndex;langiumDocuments;parser;projects;constructor(e){this.services=e,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.parser=e.likec4.ModelParser,this.projects=e.shared.workspace.ProjectsManager}documents(e){return this.parser.documents(e)}getParsedElement(...e){try{let t,n;if(e.length===2?(t=e[0],n=e[1]):(t=e[0],n=mr(t)?this.projects.ensureProjectId():projectIdFrom(t)),mr(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=Fo(t),a=this.findParsedElementByFqnIn(r,i);return a&&i?{projectId:n,element:a,document:i}:null}catch(e){return Lo.debug(z(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t){let[n,r]=Za(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(!Bn(r)&&!le(r))continue;let i=r.kind?Po(r.$cstNode,`kind`):void 0;if(i??=r.dotKind?Po(r.$cstNode,`dotKind`):void 0,i??=No(r.$cstNode,`->`),i??=Po(r.$cstNode,`title`),i??=Po(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(a(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?Po(r.$cstNode,`name`):void 0;return i??=No(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<F.Linked&&(Lo.debug(`Waiting for document ${n.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(F.Linked,n.uri,t));let r=projectIdFrom(n);Lo.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)??no.DEFAULT;if(!e)return Lo.trace(`No specification or styles found for project ${r}, cannot locate tags for document ${n.uri.fsPath}`),null;let i=S(Io(n.parseResult.value),$i(e=>xe(e)||Cn(e)),ua(),T(n=>{let r,i;try{xe(n)?(r=n.name,i=n.$cstNode):(r=n.tag.$refText,i=n.tag.$refNode);let a=e[r];return ea(a,`Tag ${r} not found in merged specification`),ea(i,`Tag ${r} does not have a $cstNode`),{name:r,color:t.tagColor(a.color).fill,range:i.range,isSpecification:xe(n)}}catch(e){return Lo.warn(`Fail on tag ${r}`,{err:e}),[]}}));return Lo.debug(`Found ${i.length} tags in document ${n.uri.path}`),i}catch(e){return Lo.warn(z(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:n}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!n)return null;if(!Pn(n)||!n.body)return Lo.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||!kt(i))return Lo.warn(`Failed to locate dynamic view step ${r} in view ${e.view}`),null;let a=i.kind?Po(i.$cstNode,`kind`):void 0;return a??=i.dotKind?Po(i.$cstNode,`dotKind`):void 0,a??=No(i.$cstNode,`->`),a??=No(i.$cstNode,`<-`),a??=Po(i.$cstNode,`title`),a??=Po(i.$cstNode,`target`),a??=i.$cstNode,a?{uri:t.uri.toString(),range:{start:a.range.start,end:a.range.start}}:null}};const Ro=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function tryOrLog(e){return async function(t,n,r){try{let i=e(t,n,r);Or(i)&&await i;return}catch(e){let r=e instanceof Error?e.message:String(e);n(`error`,`Validation failed: ${r}`,{node:t}),h.debug(`Validation failed: ${r}`,{error:e})}}}const{getDocument:zo}=P,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=K(n.getNameNode(e),`name CstNode not found`).range;Ro.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=projectIdFrom(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=K(n.getNameNode(e),`name CstNode not found`).range;Ro.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=projectIdFrom(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=zo(e),i=t.forDocument(r),a;try{a=i._resolveDeploymentRelationSource(e)}catch(t){h.warn(z(t)),n(`error`,`DeploymentRelation source not resolved`,{node:e,property:`source`});return}if(U.isImportRef(a)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`source`});return}if(U.isModelRef(a)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`source`});return}let o=i.parseFqnRef(e.target);if(U.isImportRef(o)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`target`});return}if(U.isModelRef(o)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`target`});return}Ja(a.deployment,o.deployment)&&n(`error`,`Invalid parent-child relationship`,{node:e})})},extendDeploymentChecks=e=>tryOrLog((e,t)=>{let n=e.deploymentNode.value.ref;(!n||!g(n))&&t(`error`,`ExtendDeployment allows only DeploymentNode`,{node:e,property:`deploymentNode`})}),dynamicViewStepSingle=e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,n)=>{let r=elementRef(e.source),i=r&&t.getFqn(r);i||n(`error`,`Source not found (not parsed/indexed yet)`,{node:e,property:`source`});let a=elementRef(e.target),o=a&&t.getFqn(a);o||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`}),i&&o&&(Ba(i,o)||Ba(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;It(r)&&r.isBackward&&n(`error`,`Invalid chain after backward step`,{node:e});let i=elementRef(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(C(e.value)||e.value!==`diagram`&&e.value!==`sequence`){t(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:e,property:`value`});return}P.hasContainerOfType(e,hn)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:Bo}=P,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}Ro.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let a=Bo(e),o=a.uri,s=n.getAstNodePath(e),c=t.byFqn(projectIdFrom(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)=>{isReferenceToDeploymentModel(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:Vo}=P,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=projectIdFrom(Vo(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=>it(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),Wt(n)&&Rn(n.$container)&&n.$container.props.some(e=>it(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||mr(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let n=Ar(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((!Ar(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!Ar(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!Ar(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),Ar(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),mr(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}q(e)},relationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{let r=t.forDocument(P.getDocument(e)),i=safeCall(()=>r._resolveRelationSource(e));if(!i){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let a=safeCall(()=>r.parseFqnRef(e.target));if(!a){n(`error`,`Target not resolved`,{node:e,property:`target`});return}U.isImportRef(i)&&(U.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`})),Ja(U.flatten(i),U.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 Gi(e.shared,F.Linked),calcFingerprint=({source:e,target:t,kind:n,title:r})=>stringHash$1(`extend-relation`,U.flatten(e),U.flatten(t),n??`default`,r??``);function getProjectFingerprints(t){return n.get(t,()=>new Set(S(e.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),T(e=>e.c4Relations??[]),A(e=>calcFingerprint(e)))))}return tryOrLog((e,n)=>{let r=P.getDocument(e),i=t.forDocument(r),a=safeCall(()=>i.parseFqnRef(e.source));if(!a){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let o=safeCall(()=>i.parseFqnRef(e.target));if(!o){n(`error`,`Target not resolved`,{node:e,property:`target`});return}if(!U.isModelRef(a)&&!U.isImportRef(a)){n(`error`,`Source must reference a model element`,{node:e,property:`source`});return}if(!U.isModelRef(o)&&!U.isImportRef(o)){n(`error`,`Target must reference a model element`,{node:e,property:`target`});return}let s=projectIdFrom(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)=>{Ro.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=projectIdFrom(e),i=t.projectElements(r,vn).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==P.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)=>{Ro.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=projectIdFrom(e),i=t.projectElements(r,At).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==P.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=projectIdFrom(e),a=t.projectElements(i,$t).filter(t=>t.name===r&&t.node!==e).head();if(a){let t=a.documentUri!==P.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)=>{Ro.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=projectIdFrom(e);t.projectElements(r,qe).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=projectIdFrom(e),i=t.projectElements(r,Vt),a=t.projectElements(r,Gt);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=projectIdFrom(e);t.projectElements(r,mt).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalStyleId name '${e.name}'`,{node:e,property:`name`})})},viewChecks=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{let r=Oi.findCommentNode(e.$cstNode,[`BLOCK_COMMENT`]);if(r&&hasManualLayout(r.text)&&n(`warning`,`Migrate to the new manual layout snapshots (run LikeC4: Migrate manual layouts)`,{node:e,range:r.range,code:`manual-layout-v1`}),!e.name)return;Ro.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let i=projectIdFrom(e);t.projectElements(i,Kn).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(ce),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=Xr(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(P.getDocument(r)),o=Y.unwrap(a.parseFqnExprWith(e).custom.expr);switch(!0){case Y.isWildcard(o)&&i:case Y.isElementKindExpr(o)&&i:case Y.isElementTagExpr(o)&&i:n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return;case Y.isWildcard(o):case Y.isModelRef(o):case Y.isDeploymentRef(o):return;case Y.isElementKindExpr(o):case Y.isElementTagExpr(o):n(`error`,`Invalid target (expect reference to specific element)`,{node:e,property:`subject`});return;default:ia(o)}})},checkFqnRefExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{let r=t.forDocument(P.getDocument(e)).parseFqnRefExpr(e),i=Xr(e),a=Lr(e)&&!P.hasContainerOfType(e,e=>dt(e)||Zt(e));if(i?.$type===`DeploymentViewRulePredicate`||a){if(!P.hasContainerOfType(e,Ct)){if(Y.isModelRef(r)){n(`error`,`Deployment view predicate must reference deployment model`,{node:e});return}if(Y.isDeploymentRef(r)&&X.isInsideInstanceRef(r.ref)){n(`error`,`Must reference deployment nodes or instances, but not internals`,{node:e});return}}O(e.selector)&&!g(e.ref.value?.ref)&&n(`warning`,`Selector '${e.selector}' applies to deployment nodes only, ignored here`,{node:e,property:`selector`});return}if(i?.$type===`DynamicViewIncludePredicate`)switch(!0){case Y.isElementKindExpr(r):case Y.isElementTagExpr(r):case Y.isWildcard(r):n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return}})},checkIncomingRelationExpr=e=>tryOrLog((e,t)=>{e.to.$type===`WildcardExpression`&&!ye(e.$container)&&E(P.getContainerOfType(e,Hn)?.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}),checkOutgoingRelationExpr=e=>tryOrLog((e,t)=>{if(Xr(e)?.$type===`ViewRulePredicate`&&e.$container.$type!==`DirectedRelationExpr`&&e.from.$type===`WildcardExpression`){let n=P.getContainerOfType(e,Hn);n&&E(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=P.getContainerOfType(e,at);if(!r||r.isInclude!==!0)return;let i=P.getDocument(e),a=t.forDocument(i),o=Ma.unwrap(a.parseRelationExpr(e)),s=`Model reference is allowed in exclude predicate only`;if(Ma.isDirect(o)){(ka.isModelRef(o.source)||ka.isModelRef(o.target))&&n(`error`,s,{node:e});return}let c;if(c=Ma.isIncoming(o)?o.incoming:Ma.isOutgoing(o)?o.outgoing:o.inout,ka.isModelRef(c)){n(`error`,s,{node:e});return}})},checkRelationExprWith=e=>tryOrLog((e,t)=>{let n=Xr(e);if(!(!n||n.$type==`DynamicViewIncludePredicate`)&&!n.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var LikeC4DocumentValidator=class extends ki{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 Ho=Z(wn,_,d,we,ge,He,tr,De,Wn,Ne,Ct,_n,r,It,ct,at,Tt,Ct,ce,ot,ue,ve,ft,jn,a,bt,x,g,le,s,Dn,yt,b,Bn,Zn,xn,rt,jt,y,Rn,Wt,fn,Gn,Ye,Ke,m,ae,ne,he,Ve,se,et,Fe,u,Yn,oe),findInvalidContainer=e=>{let t=e;for(;t&&!pt(t);){if(Ho(t))return t;t=t.$container}};function checksFromDiagnostics(e){let t=e.state>=F.Validated?e.diagnostics?.filter(e=>e.severity===fa.Error)??[]:[],n=new WeakSet;for(let{node:e}of t){if(E(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){h.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&&aa(()=>{e.shared.workspace.DocumentBuilder.onUpdate((e,n)=>{for(let e of n)h.debug(`clear diagnostics for deleted ${e.path}`),t.sendDiagnostics({uri:e.toString(),diagnostics:[]}).catch(e=>h.error(z(e)))})})}const Uo=h.getChild(`parser`);function toSingleLine(e){if(e==null)return;let t=removeIndent(e);return mr(t)?t.split(`
24
+ `).join(` `):`md`in t?{md:t.md.split(`
25
+ `).join(` `)}:{txt:t.txt.split(`
26
+ `).join(` `)}}function removeIndent(e){if(e!=null)switch(!0){case mr(e):return li(e).trim();case pn(e)&&mr(e.markdown):return{md:li(e.markdown).trim()};case pn(e)&&mr(e.text):return{txt:li(e.text).trim()};case pn(e):return{txt:``};default:return}}var BaseParser=class{isValid;constructor(e,t,n){this.services=e,this.doc=t,this.project=n,this.isValid=checksFromDiagnostics(t).isValid}logError(e,t,n){let r=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(Ji(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`?Uo.getChild(n).debug(r):Uo.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 T(t,t=>this.tryParse(e,t,n)??[])}resolveFqn(e){if(_(e)){let t=projectIdFrom(e),n=this.resolveFqn(K(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,n),Aa(t,n)}return Gn(e)?readStrictFqn(e.element):Ke(e)?readStrictFqn(e.deploymentNode):$e(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)||C(e.props))return;let extractValues=e=>{if(pn(e)){let t=removeIndent(e);if(!t)return[];if(typeof t==`string`)return O(t)?[t]:[];{let e=t.md||t.txt;return O(e)?[e]:[]}}else if(Tn(e))return e.values.map(e=>removeIndent(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(O);return[]},t=S(e.props,T(e=>extractValues(e.value).map(t=>[e.key,t])),w(([e,t])=>O(t)));if(C(t))return;let n=S(t,br(([e])=>e),_r(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 C(r)?void 0:r}parseMarkdownOrString(e){if(pn(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=>K(e.tag.ref,`Tag reference is not resolved`).name).filter(O)),t=t.prev;return G(n)?wr(n):null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!e?.props||e.props.length===0)return;let t=this.tryMap(`base`,w(e.props,Mn),e=>{let t=e.value;if(fr(t))return;let n=O(e.title)?toSingleLine(e.title):void 0,r=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return za({url:t,title:n,relative:r&&r!==t?r:void 0})});return G(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&&ai(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&&ti(n):return $r(this.doc.uri.toString(),`../`,n);case n&&ri(n):return ii(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){Uo.warn(`Image alias "${n}" not found in project configuration`);return}let a=r?ii(i,r):i;return ii(this.project.folderUri.toString(),a)}parseColorLiteral(e){if(this.isValid(e)){if(tt(e))return`#${e.hex}`;if(ht(e)){let t=Ar(e.alpha)?e.alpha:void 0;return mr(e.alpha)&&(t=Nr(e.alpha)/100),t===void 0?`rgb(${e.red},${e.green},${e.blue})`:`rgba(${e.red},${e.green},${e.blue},${t})`}q(e)}}parseElementStyle(e){if(!e)return{};if(ir(e)){let t=this.parseStyleProps(e.find(Wt)?.props);try{let n=this.parseIconProperty(e.find(it));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 Pe(n):O(n.value)&&(t.border=n.value);break;case me(n):{let e=Mr(n);O(e)&&(t.color=e);break}case en(n):O(n.value)&&(t.shape=n.value);break;case it(n):{let e=this.parseIconProperty(n);O(e)&&(t.icon=e);break}case pe(n):{let e=Mr(n);O(e)&&(t.iconColor=e);break}case de(n):O(n.value)&&(t.iconSize=Zr(n));break;case Qe(n):O(n.value)&&(t.iconPosition=Br(n));break;case un(n):t.opacity=zr(n);break;case In(n):t.multiple=pr(n.value)?n.value:!1;break;case Ee(n):O(n.value)&&(t.size=Zr(n));break;case Ht(n):O(n.value)&&(t.padding=Zr(n));break;case lt(n):O(n.value)&&(t.textSize=Zr(n));break;default:q(n)}}catch(e){this.logError(e,n)}return za(t)}parseBaseProps(e,t){let n=removeIndent(t?.title??N(e.title)),r=t?.description?{txt:removeIndent(t.description)}:this.parseMarkdownOrString(e.description);return za({title:n,summary:t?.summary?{txt:removeIndent(t.summary)}:this.parseMarkdownOrString(e.summary),description:r,technology:toSingleLine(t?.technology)??removeIndent(N(e.technology))})}};function*streamDeploymentModel(e){let t=ja.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(le(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 le(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case x(t):e.c4Deployments.push(this.parseDeployedInstance(t));break;case g(t):e.c4Deployments.push(this.parseDeploymentNode(t));break;case Ke(t):{let n=this.parseExtendDeployment(t);n&&e.c4ExtendDeployments.push(n);break}default:q(t)}}catch(e){this.logError(e,t,`deployment`)}}parseDeploymentNode(e){let t=this.isValid,n=this.resolveFqn(e),r=K(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(b)),c=S(e.body?.props??[],w(t),w(Jt),D(e=>[e.key,e.value])),{title:l,...u}=this.parseBaseProps(c,{title:e.title,summary:e.summary});return za({id:n,kind:r,title:l??Ya(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);W(U.isModelRef(r)||U.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(b)),s=S(e.body?.props??[],w(t),w(Jt),D(e=>[e.key,e.value])),c=this.parseBaseProps(s,{title:e.title,summary:e.summary});return za({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(b)),r=this.parseLinks(e.body);return!t&&C(n??{})&&!r?null:za({id:this.resolveFqn(e),astPath:this.getAstNodePath(e),metadata:n,tags:t,links:r})}_resolveDeploymentRelationSource(e){if(j(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);W(U.isDeploymentRef(r),`Invalid source for deployment relation`);let i=this.parseFqnRef(e.target);W(U.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(b)),l=S(e.body?.props??[],w(te),w(e=>O(e.value)),D(e=>[e.key,e.value])),u=S(e.body?.props??[],w(ie),ur())?.value.view.ref?.name,d=this.parseBaseProps(l,{title:e.title}),f=e.body?.props.find(Me);return za({id:stringHash$1(`deployment`,n,r.deployment,i.deployment),source:r,target:i,...d,metadata:c,kind:s,tags:a,links:o,...jr(f?.props,t),navigateTo:u,astPath:n})}}}function DeploymentViewParser(e){return class extends e{parseDeploymentView(e){let t=e.body;W(t,`DynamicElementView body is not defined`);let n=t.props.filter(this.isValid),r=this.getAstNodePath(e),i=e.name;i||=`deployment_`+stringHash$1(this.doc.uri.toString(),r);let{title:a=null,description:o=null}=this.parseBaseProps(S(n,w(gn),D(e=>[e.key,e.value]))),s=this.convertTags(t),c=this.convertLinks(t);Hr.writeId(e,i);let l=parseViewManualLayout(e);return{[Da._type]:`deployment`,id:i,astPath:r,title:toSingleLine(a)??null,description:o,tags:s,links:G(c)?c:null,rules:this.tryMap(`deployment`,t.rules,e=>this.parseDeploymentViewRule(e)),...l&&{manualLayout:l}}}parseDeploymentViewRule(e){if(at(e))return this.parseDeploymentViewRulePredicate(e);if(Re(e))return Qr(e);if(dt(e))return this.parseDeploymentViewRuleStyle(e);q(e)}parseDeploymentViewRulePredicate(e){let t=[],n=e.expr;for(;n;){try{let e=n.value;kr(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){v(e)}n=n.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(ue)),n=removeIndent(N(e.props.find(Rt)?.value));return{targets:this.parseFqnExpressions(e.targets),style:t,...n&&{notation:n}}}}}const parseEquals=({operator:e,not:t},n)=>e.startsWith(`!=`)?{neq:n}:e.startsWith(`=`)?{eq:n}:t?{neq:n}:{eq:n};function parseParticipant(e){return!Vn(e)&&!Qn(e)?null:e.participant}function parseWhereClause(e){switch(!0){case Jn(e):{let t=e.value.tag.ref?.name,n=parseParticipant(e);W(t,`Expected tag name`);let r={tag:parseEquals(e,t)};return n?{participant:n,operator:r}:r}case bn(e):{let t=e.value?.ref?.name,n=parseParticipant(e);W(t,`Expected kind name`);let r={kind:parseEquals(e,t)};return n?{participant:n,operator:r}:r}case Mt(e)||gt(e):return{not:parseWhereClause(e.value)};case An(e):{let t=parseWhereClause(e.left),n=parseWhereClause(e.right);return createBinaryOperator(e.operator.toLowerCase(),t,n)}default:q(e)}}function createBinaryOperator(e,t,n){if(n===null)return t;switch(e){case`and`:{let e=[Va(t)?t.and:t,Va(n)?n.and:n].flat();return W(G(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[qa(t)?t.or:t,qa(n)?n.or:n].flat();return W(G(e),`Expected non-empty array`),{or:e}}default:q(e)}}function ExpressionV2Parser(e){return class extends e{parseFqnRef(e){let t=K(e.value?.ref,()=>`Element "${e.$cstNode?.text}" is not resolved`);if(_(t)){let e={project:projectIdFrom(t),model:this.resolveFqn(K(t.imported.ref,`Imported "${t.$cstNode?.text}" is not resolved`))};return this.doc.c4Imports.set(e.project,e.model),e}if(y(t)){let n=importsRef(e);if(n){let e={project:projectIdFrom(n),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let r=instanceRef(e);return r?{deployment:this.resolveFqn(r),element:this.resolveFqn(t)}:{model:this.resolveFqn(t)}}if($e(t))return{deployment:this.resolveFqn(t)};q(t)}parseExpressionV2(e){if(c(e))return this.parseFqnExprOrWith(e);if(We(e))return this.parseRelationExprOrWith(e);q(e)}parseFqnExprOrWith(e){if(De(e))return this.parseFqnExprWith(e);if(an(e))return this.parseFqnExprOrWhere(e);q(e)}parseFqnExprWith(e){let t=this.parseFqnExprOrWhere(e.subject);return(e.custom?.props??[]).reduce((e,t)=>{if(!this.isValid(t))return e;if(jt(t)){let n=t.value.view.$refText;return O(n)&&(e.custom.navigateTo=n),e}if(yn(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom[t.key]=n),e}if(Jt(t)){if(t.key===`description`||t.key===`summary`){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom.description=n),e}let n=removeIndent(N(t.value));return n&&(e.custom[t.key]=n),e}if(it(t)){let n=this.parseIconProperty(t);return j(n)&&(e.custom[t.key]=n),e}if(me(t)){let n=Mr(t);return j(n)&&(e.custom[t.key]=n),e}if(en(t)||Pe(t))return j(t.value)&&(e.custom[t.key]=t.value),e;if(un(t))return j(t.value)&&(e.custom[t.key]=zr(t)),e;if(pe(t)){let n=Mr(t);return j(n)&&(e.custom[t.key]=n),e}if(Rt(t)){let n=O(t.value)?removeIndent(N(t.value)):void 0;return n&&(e.custom[t.key]=n),e}if(In(t))return pr(t.value)&&(e.custom[t.key]=t.value),e;if(Ee(t)||lt(t)||Ht(t)||de(t))return O(t.value)&&(e.custom[t.key]=Zr(t)),e;if(Qe(t))return O(t.value)&&(e.custom[t.key]=t.value),e;q(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(tn(e))return this.parseFqnExprWhere(e);if(Ne(e))return this.parseFqnExpr(e);q(e)}parseFqnExprWhere(e){return W(!tn(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(Ge(e))return{wildcard:!0};if(Bt(e))return W(e.kind?.ref,`ElementKind "${e.$cstNode?.text}" is not resolved`),{elementKind:e.kind.ref.name,isEqual:e.isEqual};if(_t(e))return W(e.tag.tag.ref,`Tag ${e.$cstNode?.text} is not resolved`),{elementTag:e.tag.tag.$refText,isEqual:e.isEqual};if(ce(e))return this.parseFqnRefExpr(e);q(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{kr(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(Wn(e))return this.parseRelationExprWith(e);if(qn(e))return this.parseRelationExprOrWhere(e);q(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(yn(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e[t.key]=n),e}if(te(t)||Rt(t)){if(t.key===`description`){let n=this.parseMarkdownOrString(t.value);return n&&(e.description=n),e}let n=removeIndent(N(t.value));return n&&(e[t.key]=n),e}if(Oe(t))return O(t.value)&&(e[t.key]=t.value),e;if(me(t)){let n=Mr(t);return O(n)&&(e[t.key]=n),e}if(Pt(t))return O(t.value)&&(e[t.key]=t.value),e;if(ie(t)){let n=t.value.view.ref?.name;return O(n)&&(e[t.key]=n),e}q(t)},{})}parseRelationExprOrWhere(e){if(p(e))return this.parseRelationExprWhere(e);if(Ct(e))return this.parseRelationExpr(e);q(e)}parseRelationExprWhere(e){W(!p(e.subject),`RelationExprWhere is not allowed as subject of RelationExprWhere`);let t=this.parseRelationExpr(e.subject),n=t.where?.expr??t,r=t.where?.condition,i=e.where?parseWhereClause(e.where):null,a;return a=i&&r?createBinaryOperator(`and`,r,i):i??r??{kind:{neq:`--always-true--`}},{where:{expr:n,condition:a}}}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:q(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(!O(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(!O(n))continue;if(n in t.styles){this.logError(`Global style named "${n}" is already defined`,e,`globals`);continue}let r=this.parseGlobalStyleOrGroup(e);M(r,1)&&(t.styles[n]=r)}catch(t){this.logError(t,e,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,n){if(we(e)){let r=this.parseGlobalPredicateGroup(e);M(r,1)&&(n.predicates[t]=r);return}if(ge(e)){let r=this.parseGlobalDynamicPredicateGroup(e);M(r,1)&&(n.dynamicPredicates[t]=r);return}q(e)}parseGlobalPredicateGroup(e){return e.predicates.map(e=>this.parseViewRulePredicate(e))}parseGlobalDynamicPredicateGroup(e){return e.predicates.map(e=>this.parseDynamicViewIncludePredicate(e))}parseGlobalStyleOrGroup(e){if(He(e))return[this.parseViewRuleStyle(e)];if(tr(e))return e.styles.map(e=>this.parseViewRuleStyle(e));q(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(K(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=ja.from(e.parseResult.value.models.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(Bn(r)){n.push(r);continue}if(ae(r)){n.push(r);continue}if(r.body?.elements&&M(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(y(t)){e.c4Elements.push(this.parseElement(t));continue}if(Bn(t)){e.c4Relations.push(this.parseRelation(t));continue}if(Gn(t)){let n=this.parseExtendElement(t);n&&e.c4ExtendElements.push(n);continue}if(ae(t)){let n=this.parseExtendRelation(t);n&&e.c4ExtendRelations.push(n);continue}q(t)}catch(e){this.logError(e,t,`model`)}}parseElement(e){let t=this.isValid,n=this.resolveFqn(e),r=K(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(b)),s=this.getAstNodePath(e),[c,l,u]=e.props??[],d=S(e.body?.props??[],w(t),w(Jt),D(e=>[e.key,e.value])),{title:f,...p}=this.parseBaseProps(d,{title:c,summary:l,technology:u});return go({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(b)),r=this.parseLinks(e.body);if(!t&&fr(n)&&!r)return null;let i=this.getAstNodePath(e);return go({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);W(X.isModelRef(t)||X.isImportRef(t),`Source must be a model reference`),W(X.isModelRef(n)||X.isImportRef(n),`Target must be a model reference`);let r=this.parseTags(e.body),i=this.getMetadata(e.body?.props.find(b)),a=this.getAstNodePath(e),o=this.parseLinks(e.body);if(!r&&C(i??{})&&!o)return null;let s=(e.kind??e.dotKind?.kind)?.ref?.name,{title:c=``}=this.parseBaseProps({},{title:e.title});return go({id:stringHash$1(`extend-relation`,X.flatten(t),X.flatten(n),s??`default`,c),astPath:a,metadata:i,tags:r,links:o})}_resolveRelationSource(e){if(j(e.source)){let t=this.parseFqnRef(e.source);return W(X.isModelRef(t)||X.isImportRef(t),`Relation source must be a model reference`),t}if(Rn(e.$container)||Ye(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);W(X.isModelRef(r)||X.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e)??this.parseTags(e.body)??void 0,a=this.parseLinks(e.body),o=(e.kind??e.dotKind?.kind)?.ref?.name,s=this.getMetadata(e.body?.props.find(b)),c=this.getAstNodePath(e),l=S(e.body?.props??[],w(te),w(e=>O(e.value)),D(e=>[e.key,e.value])),u=S(e.body?.props??[],w(ie),A(e=>e.value.view.ref?.name),w(O),ur()),{title:d=``,description:f,technology:p}=this.parseBaseProps(l,{title:e.title,description:e.description,technology:e.technology}),m=e.body?.props.find(Me);return go({id:stringHash$1(c,n.model,r.model),astPath:c,source:n,target:r,title:d,metadata:s,kind:o,tags:i,links:a,navigateTo:u,description:f,technology:p,...jr(m?.props,t)})}}}function PredicatesParser(e){return class extends e{parsePredicate(e){return this.parseExpressionV2(e)}parseElementPredicate(e){if(De(e))return this.parseFqnExprWith(e);if(an(e))return this.parseFqnExprOrWhere(e);q(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(!O(r))continue;if(r in t.relationships){this.logError(`Relationship kind "${r}" is already defined`,e,`specification`);continue}let i=S(n.filter(er)??[],w(e=>this.isValid(e)&&kr(e.value)),D(e=>[e.key,removeIndent(N(e.value))]),Dr(E));t.relationships[r]={...i,...jr(n.filter(s),this.isValid)}}catch(t){this.logError(t,e,`specification`)}let i=e.flatMap(e=>e.tags.filter(this.isValid));for(let e of i)try{let n=e.tag.name,r=this.getAstNodePath(e.tag),i=e.color&&this.parseColorLiteral(e.color);if(n in t.tags){this.logError(`Tag ${n} is already defined, skipping duplicate`,e,`specification`);continue}O(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:ra(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(!O(r))throw Error(`DeploymentNodeKind name is not resolved`);let i=this.parseTags(e),a=this.parseElementStyle(n.find(Wt)),o=this.parseLinks(e),s=S(n.filter(Ce)??[],w(e=>this.isValid(e)),D(e=>[e.key,e.value])),c=this.parseBaseProps(s),l=removeIndent(N(s.notation));return{[r]:za({...c,notation:l,tags:i??void 0,...o&&Da.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&&!C(t.folder.trim())?toSingleLine(t.folder):null;for(let i of t.views)try{if(!e(i))continue;switch(!0){case Hn(i):this.doc.c4Views.push(this.parseElementView(i,n));break;case Pn(i):this.doc.c4Views.push(this.parseDynamicElementView(i,n));break;case Sn(i):this.doc.c4Views.push(this.parseDeploymentView(i));break;default:q(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;W(n,`ElementView body is not defined`);let r=this.getAstNodePath(e),i=null;if(`viewOf`in e){let t=elementRef(e.viewOf),n=t&&safeCall(()=>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_`+stringHash$1(this.doc.uri.toString(),r,i??``);let{title:o=null,description:s=null}=this.parseBaseProps(S(n.props,w(e=>this.isValid(e)),w(gn),D(e=>[e.key,e.value]))),c=this.convertTags(n),l=this.convertLinks(n),u=parseViewManualLayout(e),d={[Da._type]:`element`,id:a,astPath:r,title:toSingleLine(o)??null,description:s,tags:c,links:G(l)?l:null,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseElementViewRule(e))],...i&&{viewOf:i},...u&&{manualLayout:u}};if(Hr.writeId(e,d.id),`extends`in e){let t=e.extends.view.ref;return W(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(d,{extends:t.name})}return d}parseElementViewRule(e){if(mn(e))return this.parseViewRulePredicate(e);if(i(e))return this.parseViewRuleGlobalPredicateRef(e);if(bt(e))return this.parseViewRuleStyleOrGlobalRef(e);if(Re(e))return Qr(e);if(Nn(e))return this.parseViewRuleGroup(e);if(En(e))return this.parseViewRuleRank(e);q(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(Zt(e))return this.parseViewRuleStyle(e);if(Ft(e))return this.parseViewRuleGlobalStyle(e);q(e)}parseViewRuleGroup(e){let t=[];for(let n of e.groupRules)try{if(!this.isValid(n))continue;if(mn(n)){t.push(this.parseViewRulePredicate(n));continue}if(Nn(n)){t.push(this.parseViewRuleGroup(n));continue}q(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=>Da.ModelExpression.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>Da.ModelExpression.isFqnExpr(e)),n=this.parseStyleProps(e.props.filter(ue)),r=removeIndent(N(e.props.find(Rt)?.value));return{targets:t,style:n,...r&&{notation:r}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let n=e.body;W(n,`DynamicElementView body is not defined`);let r=this.isValid,i=n.props.filter(r),a=this.getAstNodePath(e),o=e.name;o||=`dynamic_`+stringHash$1(this.doc.uri.toString(),a);let{title:s=null,description:c=null}=this.parseBaseProps(S(i,w(gn),D(e=>[e.key,e.value]))),l=this.convertTags(n),u=this.convertLinks(n);Hr.writeId(e,o);let d=parseViewManualLayout(e),f=sr(i,Dn)?.value;return{[Da._type]:`dynamic`,id:o,astPath:a,title:toSingleLine(s)??null,description:c,tags:l,links:G(u)?u:null,variant:f,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseDynamicViewRule(e))],steps:this.tryMap(`views`,n.steps,e=>_n(e)?this.parseDynamicParallelSteps(e):this.parseDynamicStep(e)),...d&&{manualLayout:d}}}parseDynamicViewRule(e){if(xt(e))return this.parseDynamicViewIncludePredicate(e);if(Qt(e))return this.parseViewRuleGlobalPredicateRef(e);if(bt(e))return this.parseViewRuleStyleOrGlobalRef(e);if(Re(e))return Qr(e);q(e)}parseDynamicViewIncludePredicate(e){let t=[],n=e.exprs;for(;n;)this.tryParse(`views`,n.value,e=>{if(c(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 W(G(n),`Dynamic parallel steps must have at least one step`),{parallelId:t,__parallel:n}}parseDynamicStep(e){if(It(e))return this.parseDynamicStepSingle(e);let t=this.recursiveParseDynamicStepChain(e);return W(G(t),`Dynamic step chain must have at least one step`),{seriesId:pathInsideDynamicView(e),__series:t}}recursiveParseDynamicStepChain(e,t){if(It(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(!G(n)||!this.isValid(e))return[];let r=Sr(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=elementRef(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=elementRef(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 ie(t):{let e=t.value.view.ref?.name;O(e)&&(n.navigateTo=e);break}case te(t):case Rt(t):if(j(t.value))if(t.key===`description`){let e=removeIndent(t.value);e&&(n.description=e)}else n[t.key]=removeIndent(N(t.value))??``;break;case yn(t):j(t.value)&&(n[t.key]=removeIndent(t.value));break;case Oe(t):j(t.value)&&(n[t.key]=t.value);break;case me(t):{let e=Mr(t);j(e)&&(n[t.key]=e);break}case Pt(t):j(t.value)&&(n[t.key]=t.value);break;default:q(t)}}catch(e){this.logError(e,t,`views`)}return n}}}function pathInsideDynamicView(e){let t=e,n=[];for(;!hn(t);)Ar(t.$containerIndex)&&n.unshift(`@${t.$containerIndex}`),n.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return n.join(``)}const Wo=S(BaseParser,ExpressionV2Parser,ImportsParser,ModelParser,DeploymentModelParser,DeploymentViewParser,PredicatesParser,SpecificationParser,ViewsParser,GlobalsParser);var DocumentParser=class extends Wo{};const Go=h.getChild(`parser`),isError=e=>e.severity===fa.Error;var LikeC4ModelParser=class{cachedParsers=new Xi(e=>this.createParser(e));constructor(e){this.services=e,e.shared.workspace.DocumentBuilder.onDocumentPhase(F.Linked,async e=>{this.cachedParsers.has(e)&&(Go.trace(`Linked: clear cached parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:Ui.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(F.Linked,async t=>{for(let n of t)if(!e.shared.workspace.ProjectsManager.isExcluded(n))try{this.parse(n)}catch(e){v(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(F.Validated,async e=>{e.diagnostics?.some(isError)&&this.cachedParsers.has(e)&&(Go.trace(`Validated: clear cached parser {projectId} document {doc} because of errors`,{projectId:e.likec4ProjectId,doc:Ui.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){ea(Ur(e),`Document ${e.uri.toString()} is not a LikeC4 document`);let t=this.services.shared.workspace.ProjectsManager.getProject(e),n=Ui.relative(t.folderUri,e.uri);e.likec4ProjectId?Go.trace(`create parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:n}):Go.debug(`create parser for document without project {doc}`,{doc:e.uri.fsPath}),e.state<F.Linked&&Go.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 R(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 Ni{runConverter(e,t,n){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),Wi.convertString(t)):super.runConverter(e,t,n)}};const{findNodeForKeyword:Ko}=I,asViewStyleRule=(e,t,n=0)=>{let r=n>0?` `.repeat(n):``;return[r+`style ${e} {`,...dr(t).map(([e,t])=>r+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),r+`}`]},isMatchingViewRule=(e,t)=>n=>{if(!Zt(n)&&!dt(n))return!1;let r=n.targets.value;if(!r||O(n.targets.prev)||r.$type!==`FqnRefExpr`||O(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}){W(n.body,`View ${t.id} has no body`);let a=n.$cstNode;W(a,`viewCstNode`);let o=Sr(n.body.rules)?.$cstNode?.range.end??n.body.$cstNode?.range.end;W(o,`insertPos is not defined`);let s=a.range.start.character+2,c=e.likec4.FqnIndex,l=w(n.body.rules,e=>Zt(e)||dt(e)),u=t[Fa]===`element`?t.viewOf??null:null,d=[],f=[];r.forEach(e=>{let t=ar(l,isMatchingViewRule(e,c)),n=u&&Ba(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,`
27
+ `+e.join(`
28
+ `))),p.start={line:o.line+1,character:s},p.end={line:o.line+e.length,character:Sr(e)?.length??0}}if(d.length>0)for(let{rule:e}of d){let t=e.$cstNode;W(t,`RuleCstNode not found`);for(let[n,r]of dr(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=Ko(t,`{`)?.range.end;W(o,`Opening brace not found`);let s=` `.repeat(t.range.start.character)+` `,c=s+n+` `+i;m.push(ga.insert(o,`
29
+ `+c)),includeRange({start:{line:o.line+1,character:s.length},end:{line:o.line+1,character:c.length}})}}return{modifiedRange:p,edits:m}}const{findNodeForKeyword:qo}=I;function changeViewLayout(e,{view:t,viewAst:n,layout:r}){W(n.body,`View ${t.id} has no body`);let i=n.$cstNode;W(i,`viewCstNode`);let a=Fr(r.direction),o=ar(n.body.rules,Re),s=`autoLayout ${a}`;if(Ar(r.rankSep)&&(s+=` ${r.rankSep}`,Ar(r.nodeSep)&&(s+=` ${r.nodeSep}`)),o&&o.$cstNode)return ga.replace(o.$cstNode.range,s);let c=qo(n.body.$cstNode,`}`)?.range.start;W(c,`Closing brace not found`);let l=`\t${s}\n\t`;return ga.insert(c,l)}async function removeManualLayoutV1(e,{lookup:t}){if(!t.view.manualLayout)return!1;let n=t.viewAst.$cstNode;W(n,`invalid view.$cstNode`);let r=e.shared.lsp.Connection;W(r,`LSP Connection not available`);let i=Oi.findCommentNode(n,[`BLOCK_COMMENT`]);return i&&hasManualLayout(i.text)?(await r.workspace.applyEdit({label:`LikeC4 - remove manual layout v1 for ${t.view.id}`,edit:{changes:{[t.doc.textDocument.uri]:[ga.del(i.range)]}}})).applied:!1}const Jo=h.getChild(`model-changes`);var LikeC4ModelChanges=class{locator;constructor(e){this.services=e,this.locator=e.likec4.ModelLocator}async applyChange(e){let t=this.services.shared.lsp.Connection,n=this.services.shared.workspace;try{let{viewId:r,projectId:i,change:a}=e,o=n.ProjectsManager.ensureProject(i);Jo.debug`Applying model change ${a.op} to view ${r} in project ${o.id}`;let s=this.locator.locateViewAst(r,o.id);if(!s)throw Error(`View ${r} not found in project ${o.id}`);let c={uri:s.doc.textDocument.uri,version:s.doc.textDocument.version};if(a.op===`save-view-snapshot`)return W(r===a.layout.id,`View ID does not match, expected `+r+`, got `+a.layout.id),s.view.manualLayout&&t&&await removeManualLayoutV1(this.services,{lookup:s}).catch(e=>{Jo.warn(`Failed to remove manual layout v1 for view ${r} in project ${o.id}`,{err:e})}),{success:!0,location:await n.ManualLayouts.write(o,a.layout)};if(a.op===`reset-manual-layout`)return s.view.manualLayout&&await removeManualLayoutV1(this.services,{lookup:s}).catch(e=>{Jo.warn(`Failed to remove manual layout v1 for view ${r} in project ${o.id}`,{err:e})}),{success:!0,location:await n.ManualLayouts.remove(o,r)};W(t,`This change only supported in IDE (running as Extension)`);let{edits:l,modifiedRange:u}=this.convertToTextEdit({lookup:s,change:a});if(!l.length)return{success:!1,error:`No changes to apply`};let d=await t.workspace.applyEdit({label:`LikeC4 - change view ${e.viewId}`,edit:{changes:{[c.uri]:l}}});return d.applied?{success:!0,location:{uri:c.uri,range:u}}:(t.window.showErrorMessage(`Failed to apply changes ${d.failureReason}`),{success:!1,error:`Failed to apply changes ${d.failureReason}`})}catch(t){let n=z(da(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return Jo.error(n),{success:!1,error:n}}finally{this.services.likec4.ModelBuilder.clearCache()}}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:q(t)}}},LikeC4NameProvider=class extends Ai{constructor(e){super(),this.services=e}getNameStrict(e){return K(this.getName(e),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(e)}`)}getName(e){if(Yi(e))return e.name;if(_(e))return e.imported.$refText;if(x(e))return e.target.modelElement.value.$refText}getNameNode(e){if(Yi(e))return super.getNameNode(e);if(_(e))return e.imported.$refNode;if(x(e))return e.target.modelElement.value.$refNode}};function uniqueDescriptions(e){return S(e,br(e=>`${e.type}.${e.name}`),dr(),T(([e,t])=>t.length===1?t:[]))}var LikeC4ScopeComputation=class extends ji{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){v(e)}return n}exportViews(e,t,n){let r=e?.flatMap(e=>e.views);if(!(E(r)||r.length===0))for(let e of r)try{O(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){v(e)}}exportGlobals(e,t,n){if(!(E(e)||e.length===0)){for(let r of e.flatMap(e=>e.predicates))try{let e=r;O(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){v(e)}for(let r of e.flatMap(e=>e.styles))try{let e=r.id;O(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){v(e)}}}exportModel(e,t,n){if(!(E(e)||e.length===0))for(let r of e.flatMap(e=>e.elements))try{y(r)&&O(r.name)&&t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){v(e)}}exportLibrary(e,t,n){if(!E(e))try{for(let r of e.flatMap(e=>e.icons))t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){v(e)}}exportSpecification(e,t,n){if(!(E(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 se(r):case he(r):O(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case et(r):O(r.tag.name)&&t.push(this.descriptions.createDescription(r.tag,r.tag.name,n));continue;case Ve(r):O(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case Fe(r):O(r.name.name)&&t.push(this.descriptions.createDescription(r.name,r.name.name,n));continue;default:q(r)}}catch(e){v(e)}}exportDeployments(e,t,n){let r=e?.flatMap(e=>e.elements);if(!(E(r)||r.length===0))for(let e of r)try{g(e)&&O(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){v(e)}}computeLocalScopes(e,t){return new Promise(t=>{let n=e.parseResult.value,r=[],i=new Bi;for(let t of n.models)try{r.push(...this.processContainer(t,i,e))}catch(e){v(e)}for(let t of n.deployments)try{r.push(...this.processDeployments(t,i,e))}catch(e){v(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){v(e)}uniqueDescriptions(r).forEach(e=>{i.add(n,e)}),t(i)})}processContainer(e,t,n){let r=new Bi,i=[];for(let a of e.elements){if(Bn(a))continue;let e;if(y(a)?(O(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)))):Gn(a)&&(e=a.body),e&&e.elements.length>0)try{i.push(...this.processContainer(e,t,n))}catch(e){v(e)}}i.length&&S(i,w(e=>!r.has(e.name)),br(e=>e.name),yr((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 Bi,i=[];for(let a of e.elements){if(le(a))continue;let e=a.body;if(!Ke(a)){let i=this.nameProvider.getName(a);if(O(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){v(e)}}i.length&&S(i,w(e=>!r.has(e.name)),br(e=>e.name),yr((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}};const{getDocument:Yo}=P;var LikeC4ScopeProvider=class extends Mi{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=projectIdFrom(e.container),n=this.reflection.getReferenceType(e);try{let r=e.container;if(Ie(r))return new Vi(this.streamForFqnRef(t,r,e));if(Ze(r))return this.getScopeForStrictFqnRef(t,r,e);if(n!==Lt)return this.getProjectScope(t,n,e);if(_(r)){let e=projectIdFrom(r);return new Vi(this.fqnIndex.rootElements(e))}if(fe(r)&&e.property===`el`){let i=r.parent;return i?new Vi(this.fqnIndex.directChildrenOf(t,readStrictFqn(i))):this.getProjectScope(t,n,e)}return new Vi(L(this.computeScope(t,e)))}catch(r){return v(r),this.getProjectScope(t,n,e)}}catch(e){return v(e),Fi}}*genUniqueDescedants(e){if(!e)return;let t=projectIdFrom(e);if(y(e)){let n=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,n);return}if(g(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(elementRef(e))}*genScopeElementView({viewOf:e,extends:t}){if(e){e.modelElement.value.$nodeDescription&&(yield e.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(elementRef(e));return}if(t){let e=t.view.ref;e&&(yield*this.genScopeElementView(e))}}getScopeForStrictFqnRef(e,t,n){let r=t.parent;return r?new Vi(this.deploymentsIndex.directChildrenOf(e,readStrictFqn(r)).filter(e=>this.reflection.isSubtype(e.type,Fn))):this.getProjectScope(e,Fn,n)}*genScopeExtendDeployment({deploymentNode:e}){e.value.$nodeDescription&&(yield e.value.$nodeDescription);let t=e.value.ref;t&&g(t)&&(yield*this.genUniqueDescedants(t))}streamForFqnRef(e,t,n){let r=t.parent;if(!r)return L(this.genScopeForParentlessFqnRef(e,t,n));let i=r.value.ref;if(!i)return Ii;if(_(i))return L(this.genUniqueDescedants(i.imported.ref));if(g(i))return L(this.genUniqueDescedants(i));if(x(i)){let e=i.target.modelElement.value.ref,t=_(e)?e.imported.ref:y(e)?e:void 0;return L(this.genUniqueDescedants(t))}return y(i)?L(this.genUniqueDescedants(i)):q(i)}*genScopeForParentlessFqnRef(e,t,n){P.hasContainerOfType(t,fn)||Kr(t)?yield*this.computeScope(e,n,Lt):Rr(t)?(yield*this.computeScope(e,n,Lt),yield*this.computeScope(e,n,Fn),yield*this.computeScope(e,n,Et)):(yield*this.computeScope(e,n,Fn),yield*this.computeScope(e,n,Et),P.hasContainerOfType(t,_e)&&(yield*this.computeScope(e,n,Lt)));let r=Yo(t).precomputedScopes;r&&(yield*r.values().filter(e=>this.reflection.isSubtype(e.type,Xn)))}*computeScope(e,t,n=this.reflection.getReferenceType(t)){let r=this.reflection.isSubtype(n,Lt),i=this.reflection.isSubtype(n,on),a=Yo(t.container).precomputedScopes;if(!a){yield*this.getProjectScope(e,n,t).getAllElements();return}let byReferenceType=e=>this.reflection.isSubtype(e.type,n),o=t.container;for(;o;){let e=a.get(o).filter(byReferenceType);e.length>0&&(yield*e),i&&m(o)&&(yield*this.genScopeExtendDeployment(o.$container)),r&&Ye(o)&&(yield*this.genScopeExtendElement(o.$container)),r&&$n(o)&&(yield*this.genScopeElementView(o.$container)),o=o.$container}yield*this.getProjectScope(e,n,t).getAllElements()}getProjectScope(e,t,n){return t===St?super.getGlobalScope(t,n):this.globalScopeCache.get(`${e}::${t}`,()=>new zi(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===St)return super.getGlobalScope(e,t);let n=projectIdFrom(t.container);return this.getProjectScope(n,e,t)}};const $=h.getChild(`rpc`);var Rpc=class extends ADisposable{constructor(e){super(),this.services=e}init=xr(()=>{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,a=nr(t=>{t>1?$.debug`send ${`onDidChangeModel`} (${t} batched)`:$.debug`send ${`onDidChangeModel`}`,e.sendNotification(fi.type,``).catch(e=>{$.warn(`[ServerRpc] error sending onDidChangeModel:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:130,maxBurstDurationMs:400}),o=nr(t=>{t>1?$.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:$.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(pi.type).catch(e=>{$.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:100,maxBurstDurationMs:500}),s=!0;this.onDispose(t.ModelBuilder.onModelParsed(()=>a.call(1)),n.ProjectsManager.onProjectsUpdate(()=>o.call(1)),e.onRequest(gi.req,async({projectId:e,cleanCaches:r=!1},i)=>{$.debug`received request ${`fetchComputedModel`} for project ${e}`,r&&($.debug`cleanCaches: ${r}`,e?await n.ProjectsManager.rebuildProject(e):await n.WorkspaceManager.rebuildAll());let a=await t.ModelBuilder.computeModel(e,i);return a===J.EMPTY?{model:null}:{model:a.$data}}),e.onNotification(mi.type,async({snapshotUri:e})=>{$.debug`received notification ${`onDidChangeSnapshot`} for snapshot ${e}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.rebuildProject(n.ProjectsManager.ownerProjectId(e))}),e.onRequest(_i.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:rr(i,e=>e.id)}}}),e.onRequest(Ci.req,async({viewId:e,projectId:n,layoutType:r},i)=>($.debug`received request ${`layoutView`} for ${e} from project ${n} (layout type: ${r??`not set`})`,{result:await t.Views.layoutView({viewId:e,projectId:n,layoutType:r,cancelToken:i})})),e.onRequest(Di.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(vi.req,async()=>($.debug`received request ${`FetchProjects`}`,{projects:_r(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:A(e,e=>e.uri.toString())}})})),e.onRequest(Ei.req,async e=>{$.debug`received request ${`ReloadProjects`}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.reloadProjects(e)}),e.onRequest(Ti.req,async(e,t)=>{$.debug`received request ${`RegisterProject`}`,n.ManualLayouts.clearCaches();let r;return r=`configUri`in e?await n.ProjectsManager.registerConfigFile(Hi.parse(e.configUri),t):await n.ProjectsManager.registerProject(e,t),{id:r.id}}),e.onRequest(xi.req,async e=>{$.debug`received request ${`FetchViewsFromAllProjects`}`;let r=[];for(let i of n.ProjectsManager.all){await qi(e);try{let n=await t.Views.computedViews(i,e);r.push(...S(n,A(e=>({id:e.id,title:e.title??e.id,projectId:i})),vr((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(ui.req,async({docs:t},n)=>{let a=t.map(e=>Hi.parse(e)),o=r.userDocuments.map(e=>e.uri).filter(e=>!a.some(t=>Ui.equals(t,e))).toArray();$.debug(`[ServerRpc] received request to build:
30
+ changed (total ${a.length}):${t.map(e=>`
31
+ - `+e).join(``)}
32
+ deleted (total ${o.length}):${o.map(e=>`
33
+ - `+e.toString()).join(`
34
+ `)}`),!s&&a.length+o.length>0&&await Promise.allSettled([...a,...o].map(async t=>{let n=t.toString();$.debug(`clear diagnostics for ${n}`);try{await e.sendDiagnostics({uri:n,diagnostics:[]})}catch(e){$.warn(`error clearing diagnostics for ${n}: ${e}`)}})),s=!1,await qi(n),await i.update(a,o,n)}),e.onRequest(wi.req,e=>{switch($.debug`received request ${`locate`}, ${e}`,!0){case`element`in e:return t.ModelLocator.locateElement(e.element,e.projectId);case`relation`in e:return t.ModelLocator.locateRelation(e.relation,e.projectId);case`astPath`in e:return t.ModelLocator.locateDynamicViewStep({view:e.view,astPath:e.astPath,projectId:e.projectId});case`view`in e:return t.ModelLocator.locateView(e.view,e.projectId);case`deployment`in e:return t.ModelLocator.locateDeploymentElement(e.deployment,e.projectId);default:q(e)}}),e.onRequest(di.req,async(e,r)=>{$.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`;let i=await t.ModelChanges.applyChange(e),a=e.change.op;return e.projectId&&(a===`save-view-snapshot`||a===`reset-manual-layout`)&&await n.ProjectsManager.rebuildProject(e.projectId,r),i}),e.onRequest(bi.req,async e=>{let r=null;for(let i of n.ProjectsManager.all)try{let n=await t.ModelBuilder.computeModel(i,e);if(n===J.EMPTY)continue;r??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},r.elementKinds+=k(n.specification.elements).length,r.deploymentKinds+=k(n.specification.deployments).length,r.relationshipKinds+=k(n.specification.relationships).length,r.tags+=k(n.specification.tags).length,r.customColors+=k(n.specification.customColors??{}).length,r.elements+=k(n.$data.elements).length,r.deploymentNodes+=[...n.deployment.nodes()].length,r.relationships+=k(n.$data.relations).length,r.views+=k(n.$data.views).length,r.projects+=1}catch(e){$.warn(`Error fetching telemetry metrics for project ${i}`,{err:e})}return await qi(e),{metrics:r}}),e.onRequest(Si.req,async({documentUri:e},r)=>{let i=Hi.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(yi.req,async e=>($.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})),Pi.create(()=>{a.cancel()}));function reportLayoutDrift(e){return S(e,w(e=>!!e.hasLayoutDrift),A(e=>{let n=t.ModelLocator.locateView(e.id);return W(n,`View ${e.id} not found`),{uri:n.uri,viewId:e.id,severity:uo.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(hi.type,e)}},NodeKindProvider$1=class{constructor(e){this.services=e}getSymbolKind(e){let t=Ji(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(Lt,ln,Fn,Et,Xn):return ha.Constructor;case hasType(Ue,Un,f,zn,nn):return ha.Namespace;case hasType(Kn):return ha.Class;case hasType($t,St,On,o):return ha.EnumMember;case hasType(qe,je):return ha.Event;case hasType(vn,At,ee,re):return ha.TypeParameter}return ha.Field}getCompletionItemKind(e){let t=Ji(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(On):return B.Color;case hasType(Lt,Fn,Et,ln,Xn):return B.Constructor;case hasType(Ue,Un,f,zn,nn):return B.Module;case hasType(Kn):return B.Class;case hasType($t,St,On,o):return B.EnumMember;case hasType(qe,je):return B.Event;case hasType(vn,ee,At,re):return B.TypeParameter;default:return B.Reference}}},WorkspaceSymbolProvider=class extends Sa{};const Xo=h.getChild(`views`);var DefaultLikeC4Views=class{cache=new WeakMap;viewsWithReportedErrors=new Set;ModelBuilder;constructor(e){this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.cache=new WeakMap})}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){return Er((await this.ModelBuilder.computeModel(e,t)).$data.views)}async _layoutAllViews(e,t){let n=Er(e.$data.views);if(n.length===0)return[];let r=performanceMark(),i=e.project.id,a=Xo.getChild(i);a.debug`layoutAll: ${n.length} views`;let o=[],s=e.$styles,c=[];for(let e of n){let t=this.cache.get(e);if(t){a.debug`layout ${e.id} from cache`,c.push(t);continue}o.push({view:e,styles:s})}return o.length>0&&await this.layouter.batchLayout({batch:o,cancelToken:t,onSuccess:(t,n)=>{c.push(this.viewSucceed(t.view,e,n))},onError:(e,t)=>{a.warn(`Fail layout view ${e.view.id}`,{error:t})}}),t&&t.isCancellationRequested&&await qi(t),c.length===n.length?c.length>0&&a.debug`layouted all ${c.length} views in ${r.pretty}`:a.warn`layouted ${c.length} of ${n.length} views in ${r.pretty}`,c}async layoutAllViews(e,t){let n=await this.ModelBuilder.computeModel(e,t);return await this._layoutAllViews(n,t)}async layoutView({viewId:e,layoutType:t,projectId:n,cancelToken:r}){let i=await this.ModelBuilder.computeModel(n,r),a=i.findView(e)?.$view;n=i.project.id;let o=Xo.getChild(n);if(!a){o.warn`layoutView ${e} not found`;let t=i.findManualLayout(e);if(t){o.debug`found manual layout for ${e}`;let n={...t};return n.drifts=[`not-exists`],n._layout=`manual`,{diagram:n,dot:`# manual layout`}}return null}try{let n=performanceMark(),r=this.cache.get(a)??await this.layouter.layout({view:a,styles:i.$styles});return this.cache.has(a)?o.debug`layout ${e} from cache`:(this.viewSucceed(a,i,r),o.debug(`layout {viewId} in ${n.pretty}`,{viewId:e})),O(t)?{dot:r.dot,diagram:this.withLayoutType(r.diagram,i,t)}:r}catch(e){let t=z(e);return o.warn(t),this.reportViewError(a,n,t),Promise.reject(e)}}async diagrams(e,t){let n=await this.ModelBuilder.computeModel(e,t);return(await this._layoutAllViews(n,t)).map(({diagram:e})=>this.withLayoutType(e,n,`manual`))}async viewsAsGraphvizOut(e,t){let n=`All-LayoutedViews-DotWithSvg`,r=this.services.shared.workspace.Cache;if(r.has(n))return await Promise.resolve(r.get(n));let i=await this.ModelBuilder.computeModel(e,t),a=Er(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):v(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){Xo.debug`layouting adhoc view...`;let n=await this.ModelBuilder.computeModel(t),r=Qa(n,e),{diagram:i}=await this.layouter.layout({view:{...r,hash:``,_type:`element`},styles:n.$styles});return Xo.debug`layouting adhoc view... done`,i}reportViewError(e,t,n){let r=`${t}-${e.id}`;this.cache.delete(e),this.viewsWithReportedErrors.has(r)||(this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${n}`),this.viewsWithReportedErrors.add(r))}withLayoutType(e,t,n){if(!n)return e;let r=t.findManualLayout(e.id);return r?n===`manual`?e[Na]===`manual`?(Xo.error(`View ${e.id} already has manual layout, this should not happen`),e):La(e,r):Ra(e,r):e}viewSucceed(e,t,n){let r=`${t.project.id}-${e.id}`;return this.viewsWithReportedErrors.delete(r),this.cache.set(e,n),n}};function createLikeC4SharedModule(e){return{lsp:{NodeKindProvider:e=>new NodeKindProvider$1(e),WorkspaceSymbolProvider:e=>new WorkspaceSymbolProvider(e)},workspace:{Cache:e=>new Gi(e,F.Validated),IndexManager:e=>new Vr(e),LangiumDocuments:e=>new qr(e),ProjectsManager:e=>new Wr(e),WorkspaceManager:e=>new Yr(e),FileSystemProvider:()=>e.fileSystemProvider(),FileSystemWatcher:t=>e.fileSystemWatcher(t),ManualLayouts:t=>e.manualLayouts(t)}}}function bind(e){return t=>new e(t)}function createLikeC4Module(e){return{documentation:{DocumentationProvider:bind(LikeC4DocumentationProvider)},validation:{DocumentValidator:bind(LikeC4DocumentValidator)},Rpc:bind(Rpc),mcp:{Server:t=>e.mcpServer(t),ServerFactory:t=>e.mcpServerFactory(t)},likec4:{LanguageServices:bind(DefaultLikeC4LanguageServices),Layouter:e=>new Ea({graphviz:new Ta}),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(Pr)},references:{NameProvider:bind(LikeC4NameProvider),ScopeComputation:bind(LikeC4ScopeComputation),ScopeProvider:bind(LikeC4ScopeProvider)},parser:{ValueConverter:bind(LikeC4ValueConverter)}}}function createLanguageServices(e={},r,i,a){let o=createSharedServices(e),s=Ki([Ca({shared:o}),Yt,createLikeC4Module({...Gr,...n,...t,...e}),r,i,a].reduce(_merge,{}));return o.ServiceRegistry.register(s),registerValidationChecks(s),e.connection?aa(()=>s.Rpc.init()):o.workspace.ConfigurationProvider.initialized({}),{shared:o,likec4:s}}function createSharedServices(e={}){let r={...Gr,...n,...t,...e};return Ki(wa(r),vt,createLikeC4SharedModule(r))}function _merge(e,t){if(t){for(let[n,r]of Object.entries(t))if(r!==void 0){let t=e[n];t!==null&&r!==null&&typeof t==`object`&&typeof r==`object`?e[n]=_merge(t,r):e[n]=r}}return e}export{createLikeC4Module as n,createSharedServices as r,createLanguageServices as t};
@@ -0,0 +1 @@
1
+ import{a as e,r as t}from"./likec4lib.mjs";var NoopFileSystemProvider=class{scanProjectFiles(){return Promise.resolve([])}scanDirectory(){return Promise.resolve([])}readFile(n){if(t(n))return Promise.resolve(e);throw Error(`No file system is available.`)}readDirectory(){return Promise.resolve([])}loadProjectConfig(){throw Error(`No file system is available.`)}writeFile(){throw Error(`No file system is available.`)}deleteFile(){throw Error(`No file system is available.`)}},NoopFileSystemWatcher=class{watch(){}dispose(){return Promise.resolve()}},NoopLikeC4ManualLayouts=class{read(){return Promise.resolve(null)}write(){return Promise.reject(Error(`NoopLikeC4ManualLayouts: write operation is not supported`))}remove(){return Promise.resolve(null)}clearCaches(){}};const n={fileSystemWatcher:()=>new NoopFileSystemWatcher},r={fileSystemProvider:()=>new NoopFileSystemProvider,...n},i={manualLayouts:()=>new NoopLikeC4ManualLayouts};export{n,i as r,r as t};