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