@likec4/language-server 1.49.0 → 1.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/_chunks/ConfigurableLayouter.mjs +1 -1
  2. package/dist/_chunks/LikeC4FileSystem.mjs +3 -3
  3. package/dist/_chunks/WithMCPServer.mjs +686 -13
  4. package/dist/_chunks/common-exports.mjs +0 -0
  5. package/dist/_chunks/libs/@msgpack/msgpack.mjs +1 -1
  6. package/dist/_chunks/libs/eventemitter3.mjs +1 -1
  7. package/dist/_chunks/libs/fast-equals.mjs +1 -1
  8. package/dist/_chunks/libs/p-queue.mjs +1 -1
  9. package/dist/_chunks/libs/picomatch.mjs +1 -1
  10. package/dist/_chunks/libs/pretty-ms.mjs +1 -1
  11. package/dist/_chunks/libs/remeda.mjs +2 -1
  12. package/dist/_chunks/libs/ufo.mjs +1 -1
  13. package/dist/_chunks/likec4lib.mjs +2 -0
  14. package/dist/_chunks/{index.d.mts → module.d.mts} +247 -7
  15. package/dist/_chunks/module.mjs +34 -0
  16. package/dist/_chunks/noop.mjs +1 -0
  17. package/dist/_chunks/protocol.d.mts +315 -0
  18. package/dist/_chunks/rolldown-runtime.mjs +1 -1
  19. package/dist/_chunks/utils.mjs +1 -1
  20. package/dist/_chunks/workspace.mjs +1 -0
  21. package/dist/browser/index.d.mts +7 -2
  22. package/dist/browser/index.mjs +1 -1
  23. package/dist/browser/worker.mjs +1 -1
  24. package/dist/bundled.d.mts +2 -2
  25. package/dist/bundled.mjs +1 -1
  26. package/dist/filesystem/index.d.mts +3 -2
  27. package/dist/filesystem/index.mjs +1 -1
  28. package/dist/index.d.mts +2 -38
  29. package/dist/index.mjs +1 -1
  30. package/dist/likec4lib.mjs +1 -1
  31. package/dist/mcp/index.d.mts +3 -2
  32. package/dist/mcp/index.mjs +1 -1
  33. package/dist/module.d.mts +2 -125
  34. package/dist/module.mjs +1 -1
  35. package/dist/protocol.d.mts +1 -314
  36. package/dist/protocol.mjs +1 -1
  37. package/package.json +15 -15
  38. package/dist/_chunks/LikeC4Views.mjs +0 -34
  39. package/dist/_chunks/ProjectsManager.mjs +0 -1
  40. package/dist/_chunks/icons.mjs +0 -2
  41. package/dist/_chunks/logger.mjs +0 -1
@@ -1,34 +0,0 @@
1
- import{t as LibIcons}from"./icons.mjs";import{Uri,isLikeC4Builtin,isNotLikeC4Builtin}from"../likec4lib.mjs";import{$ as isDynamicStepChain,$n as isViewRuleGlobalPredicateRef,$t as isLikeC4View,A as SpecificationTag,An as isRelationshipStyleProperty,At as isFqnExprOrWith,B as isDeployedInstanceBody,Bn as isSpecificationRule,Bt as isGlobals,C as ModelDeployments,Cn as isRelationExprWhere,Ct as isExtendDeploymentBody,D as SpecificationElementKind,Dn as isRelationStringProperty,Dt as isExtendRelationBody,E as SpecificationDeploymentNodeKind,En as isRelationNavigateToProperty,Et as isExtendRelation,F as isColorLiteral,Fn as isSpecificationDeploymentNodeKind,Ft as isFqnRefExpr,G as isDeploymentRelation,Gn as isStyleProperty,Gt as isIconSizeProperty,H as isDeploymentNode$1,Hn as isStrictFqnElementRef,Ht as isIconColorProperty,I as isColorProperty,In as isSpecificationElementKind,It as isGlobalDynamicPredicateGroup,J as isDeploymentViewBody,Jn as isTags,Jt as isInOutRelationExpr,K as isDeploymentRelationBody,Kn as isTag,Kt as isImported,L as isCustomElementProperties,Ln as isSpecificationElementStringProperty,Lt as isGlobalPredicateGroup,M as isAnyProperty,Mn as isShapeSizeProperty,Mt as isFqnExprWith,N as isArrowProperty,Nn as isSizeProperty,Nt as isFqnExpressions,O as SpecificationRelationshipKind,On as isRelationStyleProperty,Ot as isFqnExpr,P as isBorderProperty,Pn as isSpecificationColor,Pt as isFqnRef,Q as isDirectedRelationExpr,Qn as isViewRuleAutoLayout,Qt as isLikeC4Lib,R as isCustomRelationProperties,Rn as isSpecificationRelationshipKind,Rt as isGlobalStyle,S as Model,Sn as isRelationExprOrWith,Sr as isWildcardExpression,St as isExtendDeployment,T as RelationshipKind,Tn as isRelationKindDotRef,Tt as isExtendElementBody,U as isDeploymentNodeBody,Un as isStrictFqnRef,Ut as isIconPositionProperty,V as isDeploymentElement,Vn as isSpecificationTag,Vt as isHexColor,W as isDeploymentNodeKind,Wn as isStringProperty,Wt as isIconProperty,X as isDeploymentViewRulePredicate,Xn as isViewProperty,Xt as isLibIcon,Y as isDeploymentViewRule,Yn as isTextSizeProperty,Yt as isIncomingRelationExpr,Z as isDeploymentViewRuleStyle,Zn as isViewRule,Zt as isLikeC4Grammar,_ as GlobalStyleId,_n as isRGBAColor,_r as isWhereRelationNegation,_t as isElementTagExpression,an as isMetadataBody,ar as isViewRuleStyleOrGlobalRef,at as isDynamicViewIncludePredicate,b as LibIcon,bn as isRelationExpr,br as isWhereRelationTag,bt as isExpressionV2,c as DeployedInstance,cn as isModelDeployments,cr as isWhereElement,ct as isDynamicViewStep,d as DeploymentNodeKind,dn as isNavigateToProperty,dr as isWhereElementNegation,dt as isElementKind,en as isLineProperty,er as isViewRuleGlobalStyle,et as isDynamicStepSingle,f as Element,fn as isNotationProperty,fr as isWhereElementTag,ft as isElementKindExpression,g as GlobalPredicateGroup,gn as isPaddingSizeProperty,gr as isWhereRelationKind,gt as isElementStyleProperty,h as GlobalDynamicPredicateGroup,hn as isOutgoingRelationExpr,hr as isWhereRelationExpression,ht as isElementStringProperty,in as isMetadataAttribute,ir as isViewRuleStyle,it as isDynamicViewGlobalPredicateRef,j as Tag$1,jn as isShapeProperty,jt as isFqnExprWhere,k as SpecificationRule,kn as isRelationshipKind,kt as isFqnExprOrWhere,l as DeploymentElement,ln as isModelViews,lr as isWhereElementExpression,lt as isElement,m as ExtendElement,mn as isOpacityProperty,mr as isWhereRelation,mt as isElementRef,n as excludeNodeModules,nn as isMarkdownOrString,nr as isViewRulePredicate,nt as isDynamicViewBody,o as LikeC4LanguageMetaData,on as isMetadataProperty,or as isViewStringProperty,ot as isDynamicViewParallelSteps,p as ElementKind,pn as isNotesProperty,pr as isWhereKindEqual,pt as isElementProperty,q as isDeploymentView,qn as isTagRef,qt as isImportsFromPoject,rn as isMetadataArray,rr as isViewRuleRank,rt as isDynamicViewDisplayVariantProperty,s as CustomColor,sn as isModel,sr as isWhereBinaryExpression,st as isDynamicViewRule,tn as isLinkProperty,tr as isViewRuleGroup,tt as isDynamicView,u as DeploymentNode,un as isMultipleProperty,ur as isWhereElementKind,ut as isElementBody,v as Globals,vn as isRelation,vr as isWhereRelationParticipantKind,vt as isElementView$1,w as ModelViews,wn as isRelationExprWith,wt as isExtendElement,x as LikeC4View,xn as isRelationExprOrWhere,xr as isWhereTagEqual,xt as isExpressions,y as Imported,yn as isRelationBody,yr as isWhereRelationParticipantTag,yt as isElementViewBody,z as isDeployedInstance,zn as isSpecificationRelationshipStringProperty,zt as isGlobalStyleGroup}from"./utils.mjs";import{i as logger$9,r as logWarnError}from"./logger.mjs";import{A as n$4,B as t$1,C as e$3,D as t$6,E as e$11,F as t$19,H as t$8,I as r,L as n,M as t$13,N as t$7,O as e$7,P as n$3,R as t$5,S as e$5,T as e$12,V as t,_ as e$8,a as t$12,b as e,c as t$9,d as t$10,f as t$17,g as e$1,h as t$11,i as t$21,j as t$20,k as t$3,l as e$13,m as t$18,n as n$1,o as e$2,p as t$2,r as n$2,s as t$15,t as t$16,u as t$14,v as e$9,w as e$6,x as e$4,y as e$10,z as t$4}from"./libs/remeda.mjs";import{r as NoopLikeC4MCPServer,t as ProjectsManager}from"./ProjectsManager.mjs";import{a as joinRelativeURL,c as withoutBase,i as isRelative,l as withoutLeadingSlash,n as hasLeadingSlash,o as joinURL,r as hasProtocol}from"./libs/ufo.mjs";import{t as prettyMilliseconds}from"./libs/pretty-ms.mjs";import{t as deepEqual}from"./libs/fast-equals.mjs";import{t as decode}from"./libs/@msgpack/msgpack.mjs";import{t as dedent}from"./libs/strip-indent.mjs";import{BuildDocuments,ChangeView,DidChangeModelNotification,DidChangeProjectsNotification,DidChangeSnapshotNotification,DidRequestOpenViewNotification,FetchComputedModel,FetchLayoutedModel,FetchProjects,FetchProjectsOverview,FetchTelemetryMetrics,FetchViewsFromAllProjects,GetDocumentTags,LayoutView,Locate,RegisterProject,ReloadProjects,ValidateLayout}from"../protocol.mjs";import{AstUtils,Cancellation,CstUtils,DefaultAstNodeDescriptionProvider,DefaultDocumentValidator,DefaultIndexManager,DefaultLangiumDocuments,DefaultNameProvider,DefaultScopeComputation,DefaultScopeProvider,DefaultValueConverter,DefaultWorkspaceManager,Disposable,DocumentState,EMPTY_SCOPE,EMPTY_STREAM,GrammarAST,GrammarUtils,JSDocDocumentationProvider,MapScope,MultiMap,StreamScope,URI,UriUtils,ValueConverter,WorkspaceCache,interruptAndCheck,isAstNode,isNamed,stream}from"langium";import{DefaultWeakMap,MultiMap as MultiMap$1,ancestorsFqn,compareNatural,compareNaturalHierarchically,ifilter,invariant,isNonEmptyArray,nameFromFqn,nonNullable,nonexhaustive,onNextTick,parentFqn,sortNaturalByFqn,sortParentsFirst,stringHash,toArray}from"@likec4/core/utils";import{loggable,wrapError}from"@likec4/log";import{CompletionItemKind,DiagnosticSeverity,InsertTextFormat,Range,SemanticTokenModifiers,SemanticTokenTypes,SymbolKind,TextEdit}from"vscode-languageserver-types";import{AbstractFormatter,AbstractSemanticTokenProvider,AstNodeHoverProvider,DefaultCompletionProvider,DefaultDocumentHighlightProvider,DefaultWorkspaceSymbolProvider,Formatting,FormattingRegion}from"langium/lsp";import{GraphvizLayouter}from"@likec4/layouts";import*as c4 from"@likec4/core";import{Fqn,FqnExpr,FqnRef,GlobalFqn,LinkedList,RelationExpr,_layout,_stage,_type,ancestorsFqn as ancestorsFqn$1,applyManualLayout,calcDriftsFromSnapshot,exact,invariant as invariant$1,isAncestor,isAndOperator,isAnyOf,isAutoLayoutDirection,isDeploymentNode,isElementView,isGlobalFqn,isNonEmptyArray as isNonEmptyArray$1,isOrOperator,isSameHierarchy as isSameHierarchy$1,nameFromFqn as nameFromFqn$1,nonNullable as nonNullable$1,nonexhaustive as nonexhaustive$1,preferSummary,splitGlobalFqn}from"@likec4/core";import{computeAdhocView,computeProjectsView,computeView,resolveRulesExtendedViews}from"@likec4/core/compute-view";import{LikeC4Model}from"@likec4/core/model";import{URI as URI$2}from"vscode-uri";import{LikeC4Styles,ThemeColors,assignTagColors,computeColorValues}from"@likec4/core/styles";import{DocumentHighlight,DocumentHighlightKind}from"vscode-languageserver";import{CancellationToken as CancellationToken$1,CodeAction,Command,DiagnosticSeverity as DiagnosticSeverity$1,TextEdit as TextEdit$1}from"vscode-languageserver-protocol";import{Fqn as Fqn$1,FqnExpr as FqnExpr$1,FqnRef as FqnRef$1,_stage as _stage$1,_type as _type$1,exact as exact$1,isAnyOf as isAnyOf$1,isExtendsElementView}from"@likec4/core/types";import{fromBase64}from"@smithy/util-base64";const idattr=Symbol.for(`idattr`),ViewOps={writeId(i,a){return i[idattr]=a,i},readId(i){return i[idattr]}},ElementOps={writeId(i,a){return e(a)?i[idattr]=void 0:i[idattr]=a,i},readId(i){return i[idattr]}};function isLikeC4LangiumDocument(i){return i?.textDocument.languageId===LikeC4LanguageMetaData.languageId}function parseMarkdownAsString(i){return i?.markdown||i?.text}function parseAstPercent(i){let a=parseFloat(i);return isNaN(a)?100:t(a,{min:0,max:100})}function parseAstOpacityProperty({value:i}){return parseAstPercent(i)}function parseAstSizeValue({value:i}){switch(i){case`xs`:case`sm`:case`md`:case`lg`:case`xl`:return i;case`xsmall`:return`xs`;case`small`:return`sm`;case`medium`:return`md`;case`large`:return`lg`;case`xlarge`:return`xl`;default:nonexhaustive(i)}}function parseAstIconPositionValue({value:i}){switch(i){case`left`:case`right`:case`top`:case`bottom`:return i;default:nonexhaustive(i)}}function toRelationshipStyle(i,a){let o={};if(!i||i.length===0)return o;for(let s of i)if(a(s))switch(!0){case isColorProperty(s):{let i=toColor(s);e$1(i)&&(o.color=i);break}case isLineProperty(s):o.line=s.value;break;case isArrowProperty(s):switch(s.key){case`head`:o.head=s.value;break;case`tail`:o.tail=s.value;break;default:nonexhaustive(s)}break;default:nonexhaustive(s)}return o}function toColor(i){return i?.themeColor??i?.customColor?.$refText}function toAutoLayout(i){let a=i.rankSep,o=i.nodeSep,s;switch(i.direction){case`TopBottom`:s=`TB`;break;case`BottomTop`:s=`BT`;break;case`LeftRight`:s=`LR`;break;case`RightLeft`:s=`RL`;break;default:nonexhaustive(i.direction)}return{direction:s,...o&&{nodeSep:o},...a&&{rankSep:a}}}function toAstViewLayoutDirection(i){switch(i){case`TB`:return`TopBottom`;case`BT`:return`BottomTop`;case`LR`:return`LeftRight`;case`RL`:return`RightLeft`;default:nonexhaustive(i)}}function getViewRulePredicateContainer(i){return AstUtils.getContainerOfType(i,i=>isViewRulePredicate(i)||isDeploymentViewRulePredicate(i)||isDynamicViewIncludePredicate(i))}const _isModel=i=>isModel(i)||isElementBody(i)||isExtendElementBody(i)||isElementViewBody(i)||isDynamicViewBody(i)||isElementRef(i),_isDeployment$1=i=>isModelDeployments(i)||isDeploymentViewBody(i)||isDeploymentNodeBody(i)||isExtendDeploymentBody(i)||isDeployedInstanceBody(i);function isFqnRefInsideGlobals(i){for(;;){if(_isDeployment$1(i)||_isModel(i))return!1;if(isGlobals(i)||isModelViews(i))return!0;if(i.$container)i=i.$container;else return!1}}function isFqnRefInsideModel(i){for(;;){if(_isDeployment$1(i))return!1;if(_isModel(i))return!0;if(i.$container)i=i.$container;else return!1}}function isFqnRefInsideDeployment(i){for(;;){if(_isModel(i))return!1;if(_isDeployment$1(i))return!0;if(i.$container)i=i.$container;else return!1}}var LikeC4DocumentationProvider=class extends JSDocDocumentationProvider{parser;locator;constructor(i){super(i),this.parser=i.likec4.ModelParser,this.locator=i.likec4.ModelLocator}getDocumentation(i){if(!isDeploymentNode$1(i)&&!isDeployedInstance(i)&&!isElement(i))return super.getDocumentation(i);try{let a=AstUtils.getDocument(i);if(a.state<DocumentState.Linked)return super.getDocumentation(i);let o=this.parser.forDocument(a);if(isDeploymentNode$1(i))return`**${o.parseDeploymentNode(i).title}**`;if(isDeployedInstance(i)){let s=o.parseDeployedInstance(i),[c,l]=FqnRef.isImportRef(s.element)?[s.element.project,s.element.model]:[a.likec4ProjectId,s.element.model],u=c?this.locator.getParsedElement(l,c):this.locator.getParsedElement(l),d=[`_instance of_ \`${l}\``];return u&&d.push(`**${u.element.title}**`),d.join(`
2
- `)}if(isElement(i)){let a=o.parseElement(i);return a?[`**${a.title}**`,`<small>kind: \`${a.kind}\`</small>`].join(`
3
- `):void 0}nonexhaustive$1(i)}catch(i){logWarnError(i)}}};function areOverlap(i,a){return[i,a]=compareRanges(i,a)>0?[a,i]:[i,a],isInRagne(i.range,a.range.start)}function compareRanges(i,a){let o=i.range.start.line-a.range.start.line;return o===0?i.range.start.character-a.range.start.character:o}function isInRagne(i,a){return!(a.line<i.start.line||a.line>i.end.line||a.line==i.start.line&&a.character<i.start.character||a.line==i.end.line&&a.character>i.end.character)}function isMultiline(i){return!!i&&i.range.start.line!=i.range.end.line}const FormattingOptions$1={newLine:Formatting.newLine({allowMore:!0}),oneSpace:Formatting.oneSpace(),noSpace:Formatting.noSpace(),indent:Formatting.indent({allowMore:!0}),noIndent:Formatting.noIndent()};var LikeC4Formatter=class extends AbstractFormatter{options={quoteStyle:`auto`};extendedFormattingCommands=[];constructor(i){super(),i.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(i=>this.onConfigurationUpdate(i.configuration.formatting))}doDocumentFormat(i,a,o){this.extendedFormattingCommands=[];let s=super.doDocumentFormat(i,a,o);return this.doExtendedFormatting(s),s}format(i){this.removeIndentFromTopLevelStatements(i),this.indentContentInBraces(i),this.normalizeQuotes(i),this.formatImports(i),this.formatSpecificationRule(i),this.formatGlobals(i),this.formatElementDeclaration(i),this.formatExtendElement(i),this.formatRelation(i),this.formatMetadataProperty(i),this.formatDeploymentNodeDeclaration(i),this.formatDeployedInstance(i),this.formatDeploymentRelation(i),this.formatExtendDeployment(i),this.formatView(i),this.formatViewRuleGroup(i),this.formatViewRuleGlobalStyle(i),this.formatViewRuleGlobalPredicate(i),this.formatIncludeExcludeExpressions(i),this.formatWhereExpression(i),this.formatWhereRelationExpression(i),this.formatWhereElementExpression(i),this.formatRelationExpression(i),this.formatAutolayoutProperty(i),this.formatWithPredicate(i),this.formatViewRuleStyle(i),this.formatLeafProperty(i),this.formatLinkProperty(i),this.formatNavigateToProperty(i),this.formatTags(i)}formatTags(i){this.on(i,isTags,(i,a)=>{let o=GrammarUtils.findNodesForProperty(i.$cstNode,`values`).filter(e$1).slice(1);a.cst(o).prepend(FormattingOptions$1.oneSpace),a.keywords(`,`).prepend(FormattingOptions$1.noSpace).append(FormattingOptions$1.oneSpace)})}formatDeploymentRelation(i){this.on(i,isDeploymentRelation,(i,a)=>{let o=i?.source?.$cstNode?[i?.source?.$cstNode]:[];a.cst(o).append(FormattingOptions$1.oneSpace),a.keywords(`]->`).prepend(FormattingOptions$1.noSpace),a.keywords(`-[`).append(FormattingOptions$1.noSpace),a.nodes(...n([i.target,i.tags],e$1)).prepend(FormattingOptions$1.oneSpace),a.properties(`title`,`description`,`technology`).prepend(FormattingOptions$1.oneSpace)})}formatExtendDeployment(i){this.on(i,isExtendDeployment,(i,a)=>{a.keywords(`extend`).append(FormattingOptions$1.oneSpace)})}formatRelation(i){this.on(i,i=>isRelation(i)||isDeploymentRelation(i),(i,a)=>{let o=i?.source?.$cstNode?[i?.source?.$cstNode]:[];a.cst(o).append(FormattingOptions$1.oneSpace),a.keywords(`]->`).prepend(FormattingOptions$1.noSpace),a.keywords(`-[`).append(FormattingOptions$1.noSpace),a.nodes(...n([i.target,i.tags],e$1)).prepend(FormattingOptions$1.oneSpace),a.properties(`title`,`description`,`technology`).prepend(FormattingOptions$1.oneSpace)}),this.on(i,isDynamicViewStep,(i,a)=>{a.keywords(`->`,`<-`).surround(FormattingOptions$1.oneSpace),a.property(`dotKind`).prepend(FormattingOptions$1.oneSpace).append(FormattingOptions$1.oneSpace),a.keywords(`]->`).prepend(FormattingOptions$1.noSpace).append(FormattingOptions$1.oneSpace),a.keywords(`-[`).prepend(FormattingOptions$1.oneSpace).append(FormattingOptions$1.noSpace),a.properties(`title`).prepend(FormattingOptions$1.oneSpace),(isDynamicStepChain(i)&&isMultiline(i.$cstNode)||isDynamicStepSingle(i)&&isDynamicStepChain(i.$container)&&isMultiline(i.$container.$cstNode))&&(a.property(`dotKind`).prepend(Formatting.indent({allowLess:!1,allowMore:!0,priority:2})),a.keywords(`->`,`-[`).prepend(Formatting.indent({allowLess:!1,allowMore:!0,priority:2})),i.custom?.$cstNode&&isMultiline(i.custom.$cstNode)&&a.property(`custom`).prepend({options:{allowLess:!1,allowMore:!0,priority:2},moves:[{tabs:1}]}))})}removeIndentFromTopLevelStatements(i){isLikeC4Grammar(i.$container)&&this.getNodeFormatter(i).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(FormattingOptions$1.noIndent)}indentContentInBraces(i){if(isLikeC4Lib(i)||isSpecificationRule(i)||isSpecificationElementKind(i)||isSpecificationRelationshipKind(i)||isSpecificationDeploymentNodeKind(i)||isGlobals(i)||isGlobalStyle(i)||isGlobalStyleGroup(i)||isGlobalPredicateGroup(i)||isGlobalDynamicPredicateGroup(i)||isGlobalStyleGroup(i)||isModel(i)||isElementBody(i)||isExtendElementBody(i)||isRelationBody(i)||isRelationStyleProperty(i)||isMetadataBody(i)||isModelViews(i)||isElementViewBody(i)||isDynamicViewBody(i)||isDeploymentViewBody(i)||isViewRuleStyle(i)||isViewRuleGroup(i)||isCustomElementProperties(i)||isCustomRelationProperties(i)||isElementStyleProperty(i)||isDynamicViewParallelSteps(i)||isModelDeployments(i)||isDeploymentNodeBody(i)||isDeploymentRelationBody(i)||isDeployedInstanceBody(i)||isExtendDeploymentBody(i)){let a=this.getNodeFormatter(i),o=a.keywords(`{`);o.prepend(FormattingOptions$1.noIndent).prepend(FormattingOptions$1.oneSpace);let s=isMultiline(i.$cstNode),c=a.keywords(`}`),l=a.interior(o,c),u=null;for(let i of l.nodes){if(!s){a.cst([i]).surround(FormattingOptions$1.oneSpace);continue}(!u||!areOverlap(u,i))&&a.cst([i]).prepend(Formatting.newLine({allowMore:!0})).prepend(FormattingOptions$1.indent),u=i}s?c.prepend(FormattingOptions$1.noIndent).prepend(Formatting.newLine({allowMore:!0})):c.prepend(Formatting.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(i){this.on(i,isElementKind)?.keywords(`element`).append(FormattingOptions$1.oneSpace)}formatView(i){this.on(i,isElementView$1,(i,a)=>{(i.extends||i.viewOf||i.name)&&a.keywords(`view`).append(FormattingOptions$1.oneSpace),a.keywords(`of`,`extends`).surround(FormattingOptions$1.oneSpace)}),this.on(i,isDynamicView)?.keywords(`dynamic`,`view`).append(FormattingOptions$1.oneSpace),this.on(i,isDeploymentView)?.keywords(`deployment`,`view`).append(FormattingOptions$1.oneSpace)}formatLeafProperty(i){if(isElementStringProperty(i)||isRelationStringProperty(i)||isViewStringProperty(i)||isNotationProperty(i)||isNotesProperty(i)||isSpecificationElementStringProperty(i)||isSpecificationRelationshipStringProperty(i)||isColorProperty(i)||isLineProperty(i)||isArrowProperty(i)||isIconProperty(i)||isShapeProperty(i)||isBorderProperty(i)||isOpacityProperty(i)||isMultipleProperty(i)||isIconColorProperty(i)||isIconSizeProperty(i)||isIconPositionProperty(i)||isShapeSizeProperty(i)||isPaddingSizeProperty(i)||isTextSizeProperty(i)){let a=this.getNodeFormatter(i),o=a.keyword(`:`),s=a.keywords(`title`,`description`,`technology`,`summary`,`notation`,`notes`,`color`,`line`,`head`,`tail`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`shape`,`border`,`opacity`,`multiple`,`size`,`padding`,`textSize`);o.nodes.length===0?s.append(FormattingOptions$1.oneSpace):o.prepend(FormattingOptions$1.noSpace).append(FormattingOptions$1.oneSpace),a.keyword(`;`).prepend(FormattingOptions$1.noSpace).append(FormattingOptions$1.newLine)}}formatLinkProperty(i){this.on(i,isLinkProperty,(i,a)=>{a.keyword(`link`).append(FormattingOptions$1.oneSpace),a.property(`value`).append(FormattingOptions$1.oneSpace),a.keyword(`:`).prepend(FormattingOptions$1.noSpace).append(FormattingOptions$1.oneSpace),a.keyword(`;`).prepend(FormattingOptions$1.noSpace).append(FormattingOptions$1.newLine)})}formatNavigateToProperty(i){this.on(i,isNavigateToProperty)?.property(`key`).append(FormattingOptions$1.oneSpace)}formatAutolayoutProperty(i){this.on(i,isViewRuleAutoLayout,(i,a)=>{a.keyword(`autoLayout`).append(FormattingOptions$1.oneSpace),a.property(`rankSep`).prepend(FormattingOptions$1.oneSpace),a.property(`nodeSep`).prepend(FormattingOptions$1.oneSpace)})}formatMetadataProperty(i){this.on(i,isMetadataAttribute,(i,a)=>{a.property(`key`).append(FormattingOptions$1.oneSpace),a.keyword(`:`).prepend(FormattingOptions$1.noSpace).append(FormattingOptions$1.oneSpace),a.keyword(`;`).prepend(FormattingOptions$1.noSpace).append(FormattingOptions$1.newLine)})}formatElementDeclaration(i){this.on(i,isElement,(i,a)=>{let o=GrammarUtils.findNodeForProperty(i.$cstNode,`kind`),s=GrammarUtils.findNodeForProperty(i.$cstNode,`name`);s&&o&&(compareRanges(s,o)>0?a.cst([o]).append(FormattingOptions$1.oneSpace):(a.cst([s]).append(FormattingOptions$1.oneSpace),a.cst([o]).prepend(FormattingOptions$1.oneSpace))),a.properties(`props`).prepend(FormattingOptions$1.oneSpace)})}formatExtendElement(i){this.on(i,isExtendElement,(i,a)=>{a.keywords(`extend`).append(FormattingOptions$1.oneSpace)})}formatGlobals(i){this.on(i,isGlobalStyle,(i,a)=>{a.keyword(`style`).append(FormattingOptions$1.oneSpace),a.property(`id`).append(FormattingOptions$1.oneSpace)}),this.on(i,isGlobalStyleGroup,(i,a)=>{a.keyword(`styleGroup`).append(FormattingOptions$1.oneSpace)}),this.on(i,isGlobalPredicateGroup,(i,a)=>{a.keyword(`predicateGroup`).append(FormattingOptions$1.oneSpace)}),this.on(i,isGlobalDynamicPredicateGroup,(i,a)=>{a.keyword(`dynamicPredicateGroup`).append(FormattingOptions$1.oneSpace)})}formatImports(i){this.on(i,isImportsFromPoject,(i,a)=>{a.keyword(`import`).append(FormattingOptions$1.oneSpace),a.keywords(`{`,`}`,`from`).surround(FormattingOptions$1.oneSpace)}),this.on(i,isImported,(i,a)=>{a.keywords(`,`).prepend(FormattingOptions$1.noSpace).append(FormattingOptions$1.oneSpace)})}formatSpecificationRule(i){if((isSpecificationElementKind(i)||isSpecificationRelationshipKind(i)||isSpecificationTag(i)||isSpecificationDeploymentNodeKind(i))&&this.getNodeFormatter(i).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(FormattingOptions$1.oneSpace),isSpecificationColor(i)){let a=this.getNodeFormatter(i);a.keyword(`color`).append(FormattingOptions$1.oneSpace),a.property(`name`).append(FormattingOptions$1.oneSpace)}}formatWithPredicate(i){(isFqnExprWith(i)||isRelationExprWith(i))&&this.getNodeFormatter(i).keyword(`with`).prepend(FormattingOptions$1.oneSpace)}formatDeploymentNodeDeclaration(i){this.on(i,isDeploymentNode$1,(i,a)=>{let o=GrammarUtils.findNodeForProperty(i.$cstNode,`kind`),s=GrammarUtils.findNodeForProperty(i.$cstNode,`name`);s&&o&&(compareRanges(s,o)>0?a.cst([o]).append(FormattingOptions$1.oneSpace):(a.cst([s]).append(FormattingOptions$1.oneSpace),a.cst([o]).prepend(FormattingOptions$1.oneSpace))),a.properties(`title`).prepend(FormattingOptions$1.oneSpace)})}formatDeployedInstance(i){this.on(i,isDeployedInstance,(i,a)=>{let o=i.$cstNode?.content.find(i=>i.text===`=`);o&&a.cst([o]).surround(FormattingOptions$1.oneSpace),a.keyword(`instanceOf`).append(FormattingOptions$1.oneSpace),a.property(`title`).prepend(FormattingOptions$1.oneSpace)})}formatViewRuleGlobalStyle(i){this.on(i,isViewRuleGlobalStyle,(i,a)=>{a.keywords(`global`,`style`).append(FormattingOptions$1.oneSpace)})}formatViewRuleGlobalPredicate(i){let a=this.getNodeFormatter(i);(isViewRuleGlobalPredicateRef(i)||isDynamicViewGlobalPredicateRef(i))&&a.keywords(`global`,`predicate`).append(FormattingOptions$1.oneSpace)}formatViewRuleGroup(i){this.on(i,isViewRuleGroup,(i,a)=>{a.keyword(`group`).append(FormattingOptions$1.oneSpace)})}formatViewRuleStyle(i){this.on(i,isViewRuleStyle)?.keyword(`style`).append(FormattingOptions$1.oneSpace),this.on(i,isDeploymentViewRuleStyle)?.keyword(`style`).append(FormattingOptions$1.oneSpace),this.on(i,isExpressions)?.keyword(`,`).prepend(FormattingOptions$1.noSpace).append(FormattingOptions$1.oneSpace),this.on(i,isFqnExpressions)?.keyword(`,`).prepend(FormattingOptions$1.noSpace).append(FormattingOptions$1.oneSpace)}formatWhereExpression(i){(isRelationExprWhere(i)||isFqnExprWhere(i))&&this.getNodeFormatter(i).keyword(`where`).append(FormattingOptions$1.oneSpace)}formatWhereRelationExpression(i){if(this.on(i,isWhereRelationExpression,(i,a)=>{a.property(`operator`).surround(FormattingOptions$1.oneSpace)}),this.on(i,isWhereRelationNegation,(i,a)=>{a.keyword(`not`).append(FormattingOptions$1.oneSpace)}),isWhereRelation(i)||isWhereRelationTag(i)||isWhereRelationKind(i)){let a=this.getNodeFormatter(i);a.property(`operator`).surround(FormattingOptions$1.oneSpace),a.property(`not`).surround(FormattingOptions$1.oneSpace)}}formatWhereElementExpression(i){if(this.on(i,isWhereElementExpression,(i,a)=>{a.property(`operator`).surround(FormattingOptions$1.oneSpace)}),this.on(i,isWhereElementNegation,(i,a)=>{a.keyword(`not`).append(FormattingOptions$1.oneSpace)}),isWhereElement(i)||isWhereElementTag(i)||isWhereElementKind(i)){let a=this.getNodeFormatter(i);a.property(`operator`).surround(FormattingOptions$1.oneSpace),a.property(`not`).surround(FormattingOptions$1.oneSpace)}}formatIncludeExcludeExpressions(i){if(isDynamicViewRule(i)||isViewRulePredicate(i)||isDeploymentViewRulePredicate(i)){let a=this.getNodeFormatter(i);(!i.$cstNode||!isMultiline(i.$cstNode))&&a.keywords(`include`,`exclude`).append(FormattingOptions$1.oneSpace)}if(isExpressions(i)){let a=this.getNodeFormatter(i),o=this.findPredicateExpressionRoot(i),s=o?.$cstNode&&isMultiline(o?.$cstNode);s&&a.property(`value`).prepend(FormattingOptions$1.indent),a.keyword(`,`).prepend(FormattingOptions$1.noSpace).append(s?FormattingOptions$1.newLine:FormattingOptions$1.oneSpace)}}formatRelationExpression(i){this.on(i,isIncomingRelationExpr,(i,a)=>{a.keyword(`->`).append(FormattingOptions$1.oneSpace)}),this.on(i,isInOutRelationExpr,(i,a)=>{a.keyword(`->`).prepend(FormattingOptions$1.oneSpace)}),this.on(i,isOutgoingRelationExpr,(i,a)=>{a.keywords(`->`,`<->`).prepend(FormattingOptions$1.oneSpace),a.keywords(`-[`).prepend(FormattingOptions$1.oneSpace).append(FormattingOptions$1.noSpace),a.keywords(`]->`).prepend(FormattingOptions$1.noSpace).append(FormattingOptions$1.oneSpace),a.property(`dotKind`).prepend(FormattingOptions$1.oneSpace).append(FormattingOptions$1.oneSpace)}),this.on(i,isDirectedRelationExpr,(i,a)=>{a.property(`target`).prepend(FormattingOptions$1.oneSpace)})}findPredicateExpressionRoot(i){let a=i.$container;for(;;){if(!a||isDynamicViewRule(a)||isViewRulePredicate(a)||isDeploymentViewRulePredicate(a))return a;a=a.$container}}on(i,a,o){let s=a(i)?this.getNodeFormatter(i):void 0;return o&&s&&o(i,s),s}doExtendedFormatting(i){let a=this.quotesNormalizerFactory(this.extendedFormattingCommands);for(let o of this.extendedFormattingCommands)switch(o.type){case`normalizeQuotes`:a(o,i);break;default:nonexhaustive$1(o.type)}}normalizeQuotes(i){if(this.options.quoteStyle===`ignore`)return;let a=null;a??=this.on(i,isStringProperty)?.property(`value`),a??=this.on(i,isElement)?.properties(`props`),a??=this.on(i,isImportsFromPoject)?.properties(`project`),a??=this.on(i,isRelation)?.properties(`title`,`technology`),a??=this.on(i,isViewRuleGroup)?.properties(`title`),a??=this.on(i,isDynamicViewStep)?.properties(`title`),a??=this.on(i,isDeploymentNode$1)?.properties(`title`),a??=this.on(i,isDeployedInstance)?.properties(`title`),a??=this.on(i,isDeploymentRelation)?.properties(`title`,`technology`),a??=this.on(i,isLinkProperty)?.properties(`title`),a&&this.extendedFormattingCommands.push({type:`normalizeQuotes`,region:a})}quotesNormalizerFactory(i){let a=this.options.quoteStyle==`auto`?this.getAutoQuoteStyle(i):this.options.quoteStyle;return(i,o)=>{let s=a===`single`?`"`:`'`,c=a===`single`?`'`:`"`,l=c.repeat(3),u=c,d=i.region.nodes.map(i=>{let a=i.text.startsWith(`"""`)||i.text.startsWith(`'''`)?l:u;return{range:i.range,newText:a+this.escapeQuotesInternalQuotes(i.text.slice(a.length,-a.length),s,c)+a}});o.push(...d)}}escapeQuotesInternalQuotes(i,a,o){let s=``,c=0;for(;c>=0;){let a=i.indexOf(o,c);if(a<0){s+=i.slice(c);break}s+=i.slice(c,a),c=a+1;let l=!1;for(;a>0&&i[a-1]==`\\`;)l=!l,a--;s+=l?o:`\\${o}`}return s}getAutoQuoteStyle(i){let a=i.flatMap(i=>i.region.nodes);return a.filter(i=>i.text[0]==`"`).length*2>=a.length?`double`:`single`}onConfigurationUpdate(i){this.options={...this.options,...i??{quoteStyle:`auto`}}}},AstNodeDescriptionProvider=class extends DefaultAstNodeDescriptionProvider{constructor(i){super(i),this.services=i}createDescription(i,a,s){s??=AstUtils.getDocument(i);let c=super.createDescription(i,a,s);return isLikeC4Builtin(s.uri)||(s.likec4ProjectId??=this.services.shared.workspace.ProjectsManager.ownerProjectId(s),c.likec4ProjectId=s.likec4ProjectId),c}},IndexManager=class extends DefaultIndexManager{constructor(i){super(i),this.services=i}async updateContent(i,a){i.likec4ProjectId=this.services.workspace.ProjectsManager.ownerProjectId(i),await super.updateContent(i,a)}projectElements(i,a,o){let s=this.services.workspace.ProjectsManager;return stream(this.symbolIndex.keys()).filter(a=>o&&!o.has(a)?!1:s.isIncluded(i,a)).flatMap(i=>this.getFileDescriptions(i,a))}};const compare=compareNaturalHierarchically(`/`),ensureOrder=(i,a)=>compare(i.uri.path,a.uri.path),isLikeC4UserDocument=i=>isLikeC4LangiumDocument(i)&&isNotLikeC4Builtin(i);var LangiumDocuments=class extends DefaultLangiumDocuments{constructor(i){super(i),this.services=i}get projectsManager(){return this.services.workspace.ProjectsManager}addDocument(i){let a=i.uri.toString();if(this.documentMap.has(a))throw Error(`A document with the URI '${a}' is already present.`);let o=[...this.documentMap.values(),i].sort(ensureOrder);this.documentMap.clear();for(let i of o)this.documentMap.set(i.uri.toString(),i);isLikeC4UserDocument(i)&&(i.likec4ProjectId=this.projectsManager.ownerProjectId(i))}getDocument(i){let a=super.getDocument(i);return isLikeC4UserDocument(a)&&(a.likec4ProjectId=this.projectsManager.ownerProjectId(a)),a}get userDocuments(){return stream(this.documentMap.values()).filter(i=>isLikeC4UserDocument(i)&&!this.projectsManager.isExcluded(i))}get all(){return stream(this.documentMap.values()).map(i=>(isLikeC4UserDocument(i)&&(i.likec4ProjectId=this.projectsManager.ownerProjectId(i)),i))}projectDocuments(i){let a=this.services.workspace.ProjectsManager;return stream(this.documentMap.values()).filter(o=>isLikeC4UserDocument(o)&&a.isIncluded(i,o)?(o.likec4ProjectId=i,!0):!1)}groupedByProject(){let i=this.services.workspace.ProjectsManager;return t$1(this.userDocuments.toArray(),t$2(a=>(a.likec4ProjectId=i.ownerProjectId(a),a)),t$3(e$2(`likec4ProjectId`)))}resetProjectIds(){let i=[];for(let a of this.documentMap.values())delete a.likec4ProjectId,isLikeC4UserDocument(a)&&!this.projectsManager.isExcluded(a)&&i.push(a.uri);return i}},LikeC4WorkspaceManager=class extends DefaultWorkspaceManager{documentFactory;fileSystemProvider;#e=[];initialBuildOptions={eagerLinking:!0,validation:!0};constructor(i){super(i),this.services=i,this.documentFactory=i.workspace.LangiumDocumentFactory,this.fileSystemProvider=i.workspace.FileSystemProvider}async performStartup(i){this.folders??=i;let a=[];for(let o of i)try{let i=URI$2.parse(o.uri),s=await this.fileSystemProvider.scanProjectFiles(i);a.push(...s),this.services.workspace.FileSystemWatcher.watch(i.fsPath)}catch(i){logWarnError(i)}let o=this.services.workspace.ProjectsManager;for(let i of a)try{await o.registerConfigFile(i.uri)}catch(i){logWarnError(i)}return await super.performStartup(i)}async loadAdditionalDocuments(o,s){s(this.documentFactory.fromString(LibIcons,URI$2.parse(Uri)));let c=this.services.workspace.ProjectsManager.getAllIncludePaths(),l=0,u=[];for(let{projectId:i,includePath:a,includeConfig:o}of c)try{logger$9.debug`scanning include path ${a.fsPath} for project ${i}`;let s=await this.fileSystemProvider.readDirectory(a,{recursive:!0,maxDepth:o.maxDepth});u.push(...s),s.length===0&&logger$9.debug`loaded ${s.length} files from include path ${a.fsPath}`}catch(i){logger$9.warn(`Failed to scan include path ${a.fsPath}`,{error:i})}for(let i of n$1(u,i=>i.uri.path))try{s(await this.langiumDocuments.getOrCreateDocument(i.uri)),l++}catch(a){logger$9.warn(`Failed to load document ${i.uri.fsPath}`,{error:a})}if(c.length>0&&l>0){let i=Math.min(...c.map(i=>i.includeConfig.fileThreshold));l>i?logger$9.warn(`Loaded ${l} files from include paths (threshold: ${i}). Large include directories may slow workspace initialization. Consider adjusting "include.fileThreshold" or "include.maxDepth" in your project configuration.`):logger$9.info`loaded ${l} total files from ${c.length} include paths`}}includeEntry(i,a,o){let s=UriUtils.basename(a.uri);return a.isDirectory?!excludeNodeModules(s):a.isFile?(o.fileExtensions.includes(UriUtils.extname(a.uri))||o.fileNames.includes(s))&&!this.services.workspace.ProjectsManager.isExcluded(a.uri):!1}workspace(){return this.folders&&t$4(this.folders,1)?this.folders[0]:null}async rebuildAll(i){let a=this.services.workspace.LangiumDocuments.resetProjectIds();logger$9.info(`invalidate and rebuild all {docs} documents`,{docs:a.length}),this.forceCleanCaches(),await this.documentBuilder.update(a,[],i)}get workspaceUri(){let i=this.workspace();return invariant$1(i,`Workspace not initialized`),URI$2.parse(i.uri)}get workspaceURL(){let i=this.workspace();return invariant$1(i,`Workspace not initialized`),new URL(i.uri)}forceCleanCaches(){for(let i of this.#e)i();this.services.workspace.ManualLayouts.clearCaches(),this.services.workspace.Cache.clear()}onForceCleanCache(i){return this.#e.push(i),Disposable.create(()=>{this.#e=this.#e.filter(a=>a!==i)})}};const logger$8=logger$9.getChild(`LanguageServices`),isErrorDiagnostic=i=>i.severity===DiagnosticSeverity.Error;var DefaultLikeC4LanguageServices=class{builder;editor;projectsManager;constructor(i){this.services=i,this.builder=i.likec4.ModelBuilder,this.projectsManager=i.shared.workspace.ProjectsManager,this.editor=i.likec4.ModelChanges}get mcpServer(){let i=this.services.mcp.Server;return i instanceof NoopLikeC4MCPServer?null:i}get views(){return this.services.likec4.Views}get workspaceUri(){return this.services.shared.workspace.WorkspaceManager.workspaceUri}projects(){let i=this.services.shared.workspace.ProjectsManager,a=t$1(this.services.shared.workspace.LangiumDocuments.groupedByProject(),t$5(),t$2(([a,o])=>{let s=a,{folderUri:c,config:l}=i.getProject(s);return{id:s,folder:c,title:l.title??l.name,documents:t$2(o,e$2(`uri`)),config:l}}));if(t$4(a,2)&&i.defaultProjectId){let o=a.findIndex(a=>a.id===i.defaultProjectId);if(o>0){let[i]=a.splice(o,1);return[i,...a]}return a}if(t$4(a,1))return a;let{id:o,folderUri:s,config:c}=i.default;return[{id:o,folder:s,title:c.title??c.name,documents:[],config:c}]}project(i){let{id:a,folderUri:o,config:s}=this.projectsManager.ensureProject(i),c=t$2(this.services.shared.workspace.LangiumDocuments.projectDocuments(a).toArray(),e$2(`uri`));return{id:a,folder:o,title:s.title??s.name,documents:c,config:s}}async diagrams(i,a){let o=this.projectsManager.ensureProjectId(i);return await this.views.diagrams(o,a)}async computedModel(i,a){let o=this.projectsManager.ensureProjectId(i);return await this.builder.computeModel(o,a)}async layoutedModel(i,a){let o=this.projectsManager.ensureProjectId(i),s=await this.builder.computeModel(o,a);if(!s)throw Error(`Failed to compute model, empty project?`);let c=await this.views.layoutAllViews(o,a);return LikeC4Model.create({...s.$data,_stage:`layouted`,views:t$1(c,t$2(e$2(`diagram`)),t$6(e$2(`id`)))})}async projectsOverview(i){let a=this.services.shared.workspace.ProjectsManager.all,o=[];for(let s of a){let a=await this.builder.computeModel(s,i);if(i?.isCancellationRequested)throw Error(`Operation cancelled`);if(a===LikeC4Model.EMPTY){logger$8.debug(`Project ${s} is empty, skipping`);continue}o.push(a)}if(!t$4(o,1))throw Error(`No models found`);let s=computeProjectsView(o);return await this.views.layouter.layoutProjectsView(s)}getErrors(){return t$1(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),t$7(i=>t$1(i.diagnostics??[],n(isErrorDiagnostic),t$2(({message:a,range:o})=>({message:a,line:o.start.line,range:o,sourceFsPath:i.uri.fsPath})))))}locate(i){switch(!0){case`element`in i:return this.services.likec4.ModelLocator.locateElement(i.element,i.projectId);case`relation`in i:return this.services.likec4.ModelLocator.locateRelation(i.relation,i.projectId);case`view`in i:return this.services.likec4.ModelLocator.locateView(i.view,i.projectId);case`deployment`in i:return this.services.likec4.ModelLocator.locateDeploymentElement(i.deployment,i.projectId);default:nonexhaustive$1(i)}}async dispose(){try{logger$8.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(i){logger$8.error(loggable(i))}finally{logger$8.debug(`LikeC4LanguageServices disposed`)}}},ADisposable=class{toDispose=[];isDisposed=!1;onDispose(...i){this.toDispose.push(...i)}dispose(){this.throwIfDisposed(),this.isDisposed=!0;let i;for(;i=this.toDispose.pop();)try{i.dispose()}catch(i){logWarnError(i)}}throwIfDisposed(){if(this.isDisposed)throw Error(`This has already been disposed`)}};function elementRef(i){try{let a=isStrictFqnElementRef(i)?i.el.ref:i.modelElement.value.ref;return a?.$type===`Imported`&&(a=a.imported.ref),a?.$type===`Element`?a:void 0}catch{return}}function readStrictFqn(i){let a=[i.$type===`StrictFqnRef`?i.value.$refText:i.el.$refText],o=i.parent;for(;o;)a.push(o.$type===`StrictFqnRef`?o.value.$refText:o.el.$refText),o=o.parent;return a.length===1?a[0]:a.reverse().join(`.`)}function referenceableParent(i){for(;i.parent;)i=i.parent;return i.value.ref??null}function instanceRef(i){let a;for(;a=i.value?.ref;){if(isDeploymentNode$1(a))return null;if(isDeployedInstance(a))return a;if(e(i.parent))return null;i=i.parent}return null}function importsRef(i){let a=referenceableParent(i);return a?.$type===`Imported`?a:null}function isReferenceToDeploymentModel(i){let a;for(;a=i.value?.ref;){if(isDeploymentElement(a))return!0;if(e(i.parent))return!1;i=i.parent}return!1}function projectIdFrom(i){if(isImported(i)){for(;i.$type===`Imported`&&i.$container;)i=i.$container;invariant$1(isImportsFromPoject(i))}if(isImportsFromPoject(i))return i.project;let a=isAstNode(i)?AstUtils.getDocument(i):i;return a.likec4ProjectId?a.likec4ProjectId:(logger$9.warn`Document ${a.uri.fsPath} does not have a project ID assigned, this may lead to unexpected behavior.`,ProjectsManager.DefaultProjectId)}function stringHash$1(...i){return stringHash(i.length>1?i.join(`:::`):i[0])}function safeCall(i){try{return i()}catch(i){logger$9.trace(`Safe call failed`,{error:i});return}}function performanceNow(){try{return globalThis.performance.now()}catch{return Date.now()}}function performanceMark(){let i=performanceNow();return{get ms(){return performanceNow()-i},get pretty(){return prettyMilliseconds(performanceNow()-i)}}}var LikeC4CodeLensProvider=class{constructor(i){this.services=i}async provideCodeLens(i,a,o){if(isLikeC4LangiumDocument(i))return i.state<DocumentState.Linked&&(logger$9.debug(`Waiting for document ${i.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(DocumentState.Linked,i.uri,o),logger$9.debug(`Document is linked`)),i.parseResult.value.views.flatMap(i=>i.views).flatMap(i=>{let a=ViewOps.readId(i),o=i.$cstNode?.range;if(!o||!a)return[];let s=projectIdFrom(i);return{range:{start:o.start,end:{line:o.start.line,character:o.start.character+4}},command:{command:`likec4.open-preview`,arguments:[a,s],title:`open preview`}}})}};const STYLE_FIELDS=[`color`,`shape`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`border`,`opacity`,`multiple`,`size`,`textSize`].join(`,`);function isCompletionForPojectName(i,a){return GrammarAST.isRuleCall(a.feature)&&a.property===`project`&&isImportsFromPoject(i.node)}var LikeC4CompletionProvider=class extends DefaultCompletionProvider{constructor(i){super(i),this.services=i}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(i,a,o){switch(!0){case GrammarAST.isKeyword(a.feature):return this.completionForKeyword(i,a.feature,o);case GrammarAST.isCrossReference(a.feature)&&!!i.node:return this.completionForCrossReference(i,a,o);case isCompletionForPojectName(i,a):return this.completionForImportedProject(i,o)}}completionForKeyword(i,a,o){if(this.filterKeyword(i,a))switch(!0){case a.value===`import`:o(i,{label:a.value,kind:CompletionItemKind.Snippet,insertTextFormat:InsertTextFormat.Snippet,insertText:`${a.value} { $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case a.value===`deployment`&&AstUtils.hasContainerOfType(i.node,isModelViews):o(i,{label:a.value,detail:`Insert deployment view`,kind:CompletionItemKind.Class,insertTextFormat:InsertTextFormat.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(a.value):o(i,{label:a.value,detail:`Insert ${a.value} property`,kind:CompletionItemKind.Property,insertTextFormat:InsertTextFormat.Snippet,insertText:`${a.value} '\${0}'`});break;case a.value===`color`:o(i,{label:a.value,kind:CompletionItemKind.Property,insertTextFormat:InsertTextFormat.Snippet,insertText:`${a.value} \${1|${ThemeColors.join(`,`)}|}$0`});break;case a.value===`opacity`:o(i,{label:a.value,kind:CompletionItemKind.Property,insertTextFormat:InsertTextFormat.Snippet,insertText:`${a.value} \${0:100}%`});break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(a.value):o(i,{label:a.value,detail:`Insert ${a.value} block`,kind:CompletionItemKind.Module,insertTextFormat:InsertTextFormat.Snippet,insertText:`${a.value} {\n\t$0\n}`});break;case a.value===`group`:o(i,{label:a.value,detail:`Insert group block`,kind:CompletionItemKind.Module,insertTextFormat:InsertTextFormat.Snippet,insertText:["group '${1:Title}' {",` $0`,`}`].join(`
5
- `)});break;case[`par`,`parallel`].includes(a.value):o(i,{label:a.value,detail:`Insert block of parallel steps`,kind:CompletionItemKind.Module,insertTextFormat:InsertTextFormat.Snippet,insertText:[`${a.value} {`,` $0`,`}`].join(`
6
- `)});break;case a.value===`dynamic`&&AstUtils.hasContainerOfType(i.node,isModelViews):o(i,{label:a.value,detail:`Insert dynamic view`,kind:CompletionItemKind.Class,insertTextFormat:InsertTextFormat.Snippet,insertText:["dynamic view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` $0`,`}`].join(`
7
- `)});break;case a.value===`style`&&i.node&&AstUtils.hasContainerOfType(i.node,isGlobalStyle):o(i,{label:a.value,detail:`Insert ${a.value} block`,kind:CompletionItemKind.Module,insertTextFormat:InsertTextFormat.Snippet,insertText:`${a.value} \${1:name} \${2:*} {\n\t\${3|${STYLE_FIELDS}|} $0\n}`});break;case a.value===`style`&&i.node&&AstUtils.hasContainerOfType(i.node,t$8([isModelViews,isGlobalStyleGroup])):o(i,{label:a.value,detail:`Insert ${a.value} block`,kind:CompletionItemKind.Module,insertTextFormat:InsertTextFormat.Snippet,insertText:`${a.value} \${1:*} {\n\t\${2|${STYLE_FIELDS}|} $0\n}`});break;case a.value===`style`:o(i,{label:a.value,detail:`Insert ${a.value} block`,kind:CompletionItemKind.Module,insertTextFormat:InsertTextFormat.Snippet,insertText:`${a.value} {\n\t\${1|${STYLE_FIELDS}|} $0\n}`});break;case a.value===`extend`:o(i,{label:a.value,detail:`Extend another view`,kind:CompletionItemKind.Class,insertTextFormat:InsertTextFormat.Snippet,insertText:`extend $1 {
8
- $0
9
- }`});break;case a.value===`autoLayout`:o(i,{label:a.value,kind:CompletionItemKind.Property,insertTextFormat:InsertTextFormat.Snippet,insertText:"autoLayout ${1|TopBottom,BottomTop,LeftRight,RightLeft|}$0"});break;case a.value===`mode`:o(i,{label:a.value,kind:CompletionItemKind.Property,insertTextFormat:InsertTextFormat.Snippet,insertText:"mode ${1|sequence,diagram|}$0"});break;case[`include`,`exclude`].includes(a.value):o(i,{label:a.value,kind:CompletionItemKind.Operator,detail:`Insert ${a.value} predicate`,insertTextFormat:InsertTextFormat.PlainText,insertText:`${a.value} `});break;default:o(i,{label:a.value,kind:this.getKeywordCompletionItemKind(a),detail:`Keyword`,sortText:`1`})}}completionForImportedProject(i,a){let o=this.services.shared.workspace.ProjectsManager,s=i.document.textDocument,c={start:s.positionAt(i.tokenOffset),end:s.positionAt(i.tokenEndOffset)},l=s.getText(c),u=e$3(l)?`'`:l.substring(0,1);for(let s of o.all){let o=u+s+u;a(i,{label:s,kind:CompletionItemKind.Folder,insertText:o,filterText:o,textEdit:TextEdit.replace(c,o),detail:`Project`,sortText:`0_`+s})}}},LikeC4DocumentHighlightProvider=class extends DefaultDocumentHighlightProvider{createDocumentHighlight(i){return DocumentHighlight.create(i.segment.range,DocumentHighlightKind.Read)}},LikeC4DocumentLinkProvider=class{constructor(i){this.services=i}async getDocumentLinks(i,a,o){return!isLikeC4LangiumDocument(i)||this.services.shared.workspace.ProjectsManager.isExcluded(i)?[]:AstUtils.streamAllContents(i.parseResult.value).filter(isLinkProperty).map(a=>{try{let o=GrammarUtils.findNodeForProperty(a.$cstNode,`value`)?.range,s=o&&this.resolveLink(i,a.value);if(s&&hasProtocol(s))return{range:o,target:s}}catch(i){logWarnError(i)}return null}).nonNullable().toArray()}resolveLink(i,a){if(hasProtocol(a)||hasLeadingSlash(a))return a;if(isRelative(a))return joinRelativeURL(i.uri.toString(),`../`,a);let o=this.services.shared.workspace.ProjectsManager.getProject(i).folderUri;return joinRelativeURL(o.toString(),a)}relativeLink(i,a){if(hasLeadingSlash(a))return withoutLeadingSlash(a);if(isRelative(a)){let o=this.services.shared.workspace.ProjectsManager.getProject(i).folderUri.toString(),s=new URL(i.uri.toString());return withoutLeadingSlash(withoutBase(new URL(a,s).toString(),o))}return null}};const logger$7=logger$9.getChild(`DocumentSymbolProvider`);var LikeC4DocumentSymbolProvider=class{nodeKindProvider;nameProvider;parser;locator;constructor(i){this.services=i,this.nodeKindProvider=i.shared.lsp.NodeKindProvider,this.parser=i.likec4.ModelParser,this.locator=i.likec4.ModelLocator,this.nameProvider=i.references.NameProvider}async getSymbols(i,a,o){if(!isLikeC4LangiumDocument(i)||this.services.shared.workspace.ProjectsManager.isExcluded(i))return[];i.state<DocumentState.Linked&&(logger$7.debug(`Waiting for document ${i.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(DocumentState.Linked,i.uri,o),logger$7.debug(`document is Linked`));let{parseResult:{value:{specifications:s,models:c,deployments:l,views:u,likec4lib:d}}}=i;return[...d.map(i=>()=>this.getLikec4LibSymbol(i)),...s.map(i=>()=>this.getSpecSymbol(i)),...c.map(i=>()=>this.getModelSymbol(i)),...l.map(i=>()=>this.getDeploymentModelSymbol(i)),...u.map(i=>()=>this.getModelViewsSymbol(i))].flatMap(i=>{try{return i()??[]}catch(i){return logWarnError(i),[]}})}getLikec4LibSymbol(i){let a=i?.$cstNode;if(!a)return[];let o=i.icons.map(i=>this.getLibIconSymbol(i)).filter(e$1);return o.length===0?[]:[{kind:SymbolKind.Namespace,name:`icons`,range:a.range,selectionRange:GrammarUtils.findNodeForKeyword(a,`icons`)?.range??a.range,children:o}]}getSpecSymbol(i){let a=i?.$cstNode;if(!a)return[];let o=GrammarUtils.findNodeForProperty(a,`name`);if(!o)return[];let s=t$1([...i.elements,...i.tags,...i.relationships],t$2(i=>{try{if(isSpecificationElementKind(i)||isSpecificationRelationshipKind(i)||isSpecificationDeploymentNodeKind(i))return this.getKindSymbol(i);if(isSpecificationTag(i))return this.getTagSymbol(i)}catch(i){return logWarnError(i),null}nonexhaustive$1(i)}),n(e$1));return s.length===0?[]:[{kind:SymbolKind.Namespace,name:i.name,range:a.range,selectionRange:o.range,children:s}]}getModelSymbol(i){let a=i.$cstNode;if(!a)return[];let o=GrammarUtils.findNodeForProperty(a,`name`);return o?[{kind:this.symbolKind(i),name:i.name,range:a.range,selectionRange:o.range,children:i.elements.flatMap(i=>isExtendRelation(i)?[]:this.getElementsSymbol(i))}]:[]}getDeploymentModelSymbol(i){let a=i.$cstNode;if(!a)return[];let o=GrammarUtils.findNodeForProperty(a,`name`);return o?[{kind:this.symbolKind(i),name:i.name,range:a.range,selectionRange:o.range,children:i.elements.flatMap(i=>this.getDeploymentElementSymbol(i))}]:[]}getElementsSymbol(i){try{if(isExtendElement(i))return this.getExtendElementSymbol(i);if(isElement(i))return this.getElementSymbol(i)}catch(i){logWarnError(i)}return[]}getExtendElementSymbol(i){let a=i.$cstNode,o=i.element.$cstNode,s=i.body;return!a||!o?[]:[{kind:this.symbolKind(i),name:readStrictFqn(i.element),range:a.range,selectionRange:o.range,children:s.elements.flatMap(i=>this.getElementsSymbol(i))}]}getElementSymbol(i){let a=i.$cstNode,o=GrammarUtils.findNodeForProperty(a,`name`);if(!o||!a)return[];let s=i.name,c=i.kind.$refText;return[{kind:this.symbolKind(i),name:s,range:a.range,selectionRange:o.range,detail:c,children:i.body?.elements.flatMap(i=>this.getElementsSymbol(i))??[]}]}getModelViewsSymbol(i){let a=i.$cstNode,o=GrammarUtils.findNodeForProperty(a,`name`);return!o||!a?[]:[{kind:this.symbolKind(i),name:i.name,range:a.range,selectionRange:o.range,children:i.views.flatMap(i=>this.getViewSymbol(i))}]}getKindSymbol(i){return!i.$cstNode||!i.kind.$cstNode||e$3(i.kind.name)?null:{kind:this.symbolKind(i),name:i.kind.name,range:i.$cstNode.range,selectionRange:i.kind.$cstNode.range}}getTagSymbol(i){return!i.$cstNode||!i.tag.$cstNode||e$3(i.tag.name)?null:{kind:this.symbolKind(i),name:`#`+i.tag.name,range:i.$cstNode.range,selectionRange:i.tag.$cstNode.range}}getLibIconSymbol(i){return!i.$cstNode||e$3(i.name)?null:{kind:this.symbolKind(i),name:i.name,range:i.$cstNode.range,selectionRange:i.$cstNode.range}}getViewSymbol(i){let a=i?.$cstNode;if(!a)return[];let o=i.name?GrammarUtils.findNodeForProperty(a,`name`):null;return o?[{kind:this.symbolKind(i),name:o.text,range:a.range,selectionRange:o.range,children:[]}]:[]}getDeploymentElementSymbol(i){try{if(isDeploymentNode$1(i))return this.getDeploymentNodeSymbol(i);if(isDeployedInstance(i))return this.getDeployedInstanceSymbol(i);if(isExtendDeployment(i))return[]}catch(i){logWarnError(i)}return[]}getDeploymentNodeSymbol(i){let a=i.$cstNode,o=this.nameProvider.getNameNode(i);if(!o||!a)return[];let s=this.nameProvider.getNameStrict(i),c=i.kind.$refText;return[{kind:this.symbolKind(i),name:s,range:a.range,selectionRange:o.range,detail:c,children:i.body?.elements.flatMap(i=>this.getDeploymentElementSymbol(i))??[]}]}getDeployedInstanceSymbol(i){let a=i.$cstNode,o=this.nameProvider.getNameNode(i);if(!o||!a)return[];let s=AstUtils.getDocument(i),c=this.parser.forDocument(s).parseDeployedInstance(i),l=this.nameProvider.getNameStrict(i),u=`instance of `+c.element.model;return[{kind:this.symbolKind(i),name:l,range:a.range,selectionRange:o.range,detail:u,children:[]}]}symbolKind(i){return this.nodeKindProvider.getSymbolKind(i)}};const HR=`
10
- ---
11
- `;var LikeC4HoverProvider=class extends AstNodeHoverProvider{parser;locator;constructor(i){super(i),this.services=i,this.parser=i.likec4.ModelParser,this.locator=i.likec4.ModelLocator}getAstNodeHoverContent(i){if(isTag(i))return{contents:{kind:`markdown`,value:"tag `"+i.name+"`"}};if(isElementKind(i))return{contents:{kind:`markdown`,value:"element kind `"+i.name+"`"}};if(isDeploymentNodeKind(i))return{contents:{kind:`markdown`,value:"deployment node `"+i.name+"`"}};if(isRelationshipKind(i))return{contents:{kind:`markdown`,value:"relationship kind `"+i.name+"`"}};try{if(isElement(i))return this.getElementHover(i);if(isDeploymentNode$1(i))return this.getDeploymentNodeHover(i);if(isDeployedInstance(i))return this.getDeployedInstanceHover(i)}catch(i){logger$9.debug(loggable(i))}}getElementHover(i){let a=this.locator.getParsedElement(i);if(!a)return;let o=a.element,s=[`<sup>\`${o.id}\`</sup> `,`### ${o.title} `],c=preferSummary(o);c&&s.push(``,(c.md??c.txt).split(`
12
- `).join(`
13
- `));let l=this.services.likec4.LastSeen.model(a.projectId)?.findElement(o.id),u=l&&this.getElementModelHover(l,a.projectId);return s.push(u||`
14
- <small>_Model not processed yet, open any view to trigger_</small> `),{contents:{kind:`markdown`,value:s.join(`
15
- `)}}}getElementModelHover(i,a){let o=[],s=[...i.incoming(`direct`)].length,c=[...i.outgoing(`direct`)].length;(s>0||c>0)&&o.push(HR,`<small>**${s}** incoming, **${c}** outgoing relationships</small> `);let printViewLink=i=>{let o=[i.id,a],s=URI.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(o))}`);return` - [${i.titleOrId}](${s})`},l=[...i.scopedViews()].map(printViewLink);l.length>0&&o.push(HR,`<small>Element views:</small>`,...l);let u=[...i.views()].map(a=>a.isScopedElementView()&&a.viewOf===i?null:printViewLink(a)).filter(e$4);if(u.length>0){let i=l.length>0?`Also appears in views:`:`Appears in views:`;o.push(l.length>0?``:HR,`<small>${i}</small>`,...u,` `)}return o.length>0?o.join(`
16
- `):void 0}getDeploymentNodeHover(i){let a=AstUtils.getDocument(i),o=this.parser.forDocument(a).parseDeploymentNode(i),s=[o.id+` `];o.title!==i.name&&s.push(`### ${o.title}`),s.push("deployment node `"+o.kind+"` ");let c=preferSummary(o);return c&&s.push(``,c.md??c.txt),{contents:{kind:`markdown`,value:s.join(`
17
- `)}}}getDeployedInstanceHover(i){let a=AstUtils.getDocument(i),o=this.parser.forDocument(a).parseDeployedInstance(i),[s,c]=FqnRef.isImportRef(o.element)?[o.element.project,o.element.model]:[a.likec4ProjectId,o.element.model],l=s?this.locator.getParsedElement(c,s):this.locator.getParsedElement(c),u=[o.id+` `,`instance of \`${FqnRef.flatten(o.element)}\``];return l&&u.push(`### ${l.element.title}`,"element kind `"+l.element.kind+"` "),{contents:{kind:`markdown`,value:u.join(`
18
- `)}}}},LikeC4CodeActionProvider=class{getCodeActions(i,a){let o=a.context.diagnostics,s=[];for(let c of o)c.code===`manual-layout-v1`&&s.push({title:`Migrate Manual Layouts`,command:Command.create(`Migrate Manual Layouts`,`likec4.migrate-manual-layouts`),edit:{changes:{[i.textDocument.uri]:[TextEdit$1.insert(a.range.start,``)]}},kind:`quickfix`,isPreferred:!0,diagnostics:[c]});return s.length>0?s:void 0}};const logger$6=logger$9.getChild(`SemanticTokenProvider`),SemanticTypes={...SemanticTokenTypes},SemanticModifiers={...SemanticTokenModifiers};function createSemanticTypeMethods(i){let a=[],o=new Proxy({},{get(s,c){if(c===`modifier`)return i=>(a.push(i),o);if(c in SemanticModifiers)return a.push(SemanticModifiers[c]),o;if(c in SemanticTypes)return()=>i(SemanticTypes[c],a);throw Error(`Unknown semantic token type or modifier: ${c}`)}});return o}const PRUNE=`Stop Highlighting`,stopHighlight=()=>{throw PRUNE};var LikeC4SemanticTokenProvider=class extends AbstractSemanticTokenProvider{rules=[];constructor(i){super(i),this.services=i,this.initRules()}initRules(){this.rules=[];let when=(i,a)=>{let o={predicate:i,highlightFn:a};this.rules.push(o)};when(isRelationshipKind,i=>{i.property(`name`).function()}),when(isAnyOf$1(isRelation,isOutgoingRelationExpr,isDeploymentRelation),i=>{i.property(`kind`).function()}),when(isLibIcon,i=>{i.property(`name`).definition.function(),stopHighlight()}),when(isAnyOf$1(isNavigateToProperty,isRelationNavigateToProperty),i=>{i.property(`value`).readonly.definition.interface(),stopHighlight()}),when(isWildcardExpression,i=>{i.cst().readonly.definition.variable(),stopHighlight()}),when(isFqnRefExpr,i=>{i.node.selector&&(i.node.ref.parent?i.property(`selector`).property():i.property(`selector`).readonly.definition.variable())}),when(isTagRef,i=>{i.cst().type(),stopHighlight()}),when(isRelationKindDotRef,i=>{i.cst().function(),stopHighlight()}),when(isWhereRelationKind,i=>{e$1(i.node.value)&&i.property(`value`).function()}),when(isAnyOf$1(isWhereElement,isWhereRelation),i=>{e$1(i.node.value)&&i.property(`value`).readonly.definition.type()}),when(isAnyOf$1(isWhereRelationParticipantKind,isWhereRelationParticipantTag),i=>{i.property(`participant`).keyword()}),when(isElementKindExpression,i=>{e$1(i.node.kind)&&i.property(`kind`).definition.type()}),when(isAnyOf$1(isGlobalStyleGroup,isGlobalStyle),i=>{i.property(`id`).readonly.definition.variable()}),when(isViewRuleGlobalStyle,i=>{i.property(`style`).readonly.definition.variable()}),when(isAnyOf$1(isGlobalPredicateGroup,isGlobalDynamicPredicateGroup),i=>{i.property(`name`).readonly.definition.variable()}),when(isViewRuleGlobalPredicateRef,i=>{i.property(`predicate`).readonly.definition.variable()}),when(isElementTagExpression,i=>{e$1(i.node.tag)&&i.property(`tag`).definition.type()}),when(isAnyOf$1(isFqnRef,isStrictFqnRef),i=>{if(i.node.parent){i.property(`value`).property();return}let a=i.node.$cstNode?.text;a!==`this`&&a!==`it`&&i.property(`value`).readonly.definition.variable(),stopHighlight()}),when(isStrictFqnElementRef,i=>{i.node.parent?i.property(`el`).property():(i.property(`el`).readonly.definition.variable(),stopHighlight())}),when(isSpecificationColor,i=>{i.keyword(`color`).keyword(),i.property(`name`).readonly.declaration.type()}),when(isSpecificationTag,i=>{e$1(i.node.color)&&i.keyword(`color`).property()}),when(isAnyOf$1(isSpecificationElementKind,isSpecificationRelationshipKind,isSpecificationDeploymentNodeKind),i=>{i.property(`kind`).readonly.declaration.type()}),when(isTag,i=>{i.property(`name`).definition.type()}),when(isOpacityProperty,i=>{i.property(`value`).number()}),when(isIconProperty,i=>{if(i.node.libicon||i.node.value===`none`){i.property(i.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}i.property(`value`).string()}),when(isLinkProperty,i=>{e$1(i.node.value)&&i.property(`value`).string()}),when(isColorProperty,i=>{e$1(i.node.customColor)&&i.property(`customColor`).enum(),e$1(i.node.themeColor)&&i.property(`themeColor`).enum()}),when(isIconColorProperty,i=>{e$1(i.node.customColor)&&i.property(`customColor`).enum(),e$1(i.node.themeColor)&&i.property(`themeColor`).enum()}),when(isAnyOf$1(isShapeProperty,isArrowProperty,isLineProperty,isBorderProperty,isSizeProperty,isIconPositionProperty,isDynamicViewDisplayVariantProperty),i=>{e$1(i.node.value)&&i.property(`value`).enum()})}async semanticHighlight(i,a,o=CancellationToken$1.None){return i.state<DocumentState.Linked&&await this.ensureState(i,o),await super.semanticHighlight(i,a,o)}async semanticHighlightRange(i,a,o=CancellationToken$1.None){return i.state<DocumentState.Linked&&await this.ensureState(i,o),await super.semanticHighlightRange(i,a,o)}async semanticHighlightDelta(i,a,o=CancellationToken$1.None){return i.state<DocumentState.Linked&&await this.ensureState(i,o),await super.semanticHighlightDelta(i,a,o)}async ensureState(i,a){i.state<DocumentState.Linked&&(logger$6.debug`waiting for document ${i.uri.path} to be ${`Linked`}`,await this.services.shared.workspace.DocumentBuilder.waitUntil(DocumentState.Linked,i.uri,a),logger$6.debug`document ${i.uri.path} is ${`Linked`}`)}highlightElement(i,a){if(isAnyOf$1(isElement,isDeploymentNode$1,isDeployedInstance)(i))return this.highlightNameAndKind(i);if(isLikeC4View(i))return this.highlightView(i);isAnyProperty(i)&&!isAnyOf$1(isMetadataProperty,isElementStyleProperty,isRelationStyleProperty)(i)&&e$1(i.key)&&a({node:i,property:`key`,type:SemanticTokenTypes.property});let o;for(let{predicate:a,highlightFn:s}of this.rules)if(a(i))try{o??=this.mark(i),s(o)}catch(a){if(a===PRUNE)return`prune`;logger$6.warn(`Error highlighting node of type ${i._type}`,{error:a})}}highlightNameAndKind(i){if(this.mark(i).property(`name`).declaration.readonly.variable(),isDeployedInstance(i)||this.mark(i).property(`kind`).keyword(),isElement(i)){i.props.length>0&&this.mark(i).property(`props`).string();return}i.title&&this.mark(i).property(`title`).string()}highlightView(i){i.name&&this.mark(i).property(`name`).modifier(`local`).declaration.readonly.interface()}mark(i){return{node:i,cst:a=>createSemanticTypeMethods((o,s)=>this.highlightToken({range:nonNullable(a??i.$cstNode,`AST node has no CST node`).range,type:o,modifier:s})),keyword:a=>createSemanticTypeMethods((o,s)=>this.highlightKeyword({node:i,keyword:a,type:o,modifier:s})),property:(a,o)=>createSemanticTypeMethods((s,c)=>this.highlightProperty({node:i,property:a,type:s,modifier:c,...o===void 0?{}:{index:o}}))}}};const isIndexableElement=isAnyOf$1(isElement,isExtendElement);var FqnIndex=class extends ADisposable{projects;langiumDocuments;documentCache;workspaceCache;logger=logger$9.getChild(`fqn-index`);constructor(i){super(),this.services=i,this.langiumDocuments=i.shared.workspace.LangiumDocuments,this.projects=i.shared.workspace.ProjectsManager,this.documentCache=new DefaultWeakMap(i=>this.createDocumentIndex(i)),this.workspaceCache=new WorkspaceCache(i.shared,DocumentState.IndexedContent),this.onDispose(i.shared.workspace.DocumentBuilder.onDocumentPhase(DocumentState.IndexedContent,i=>{isLikeC4LangiumDocument(i)&&isNotLikeC4Builtin(i)&&this.documentCache.delete(i)}))}documents(i){return this.langiumDocuments.projectDocuments(i).filter(i=>i.state>=DocumentState.IndexedContent)}get(i){return i.state<DocumentState.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:UriUtils.basename(i.uri),state:i.state,expect:DocumentState.IndexedContent}),this.documentCache.get(i)}resolve(i){return i.$type===`Imported`?this.getFqn(i.imported.ref):i.$type===`Element`?this.getFqn(i):this.services.likec4.DeploymentsIndex.getFqn(i)}getFqn(i){invariant$1(isElement(i)||isDeploymentElement(i));let a=ElementOps.readId(i);if(e$1(a))return a;let o=AstUtils.getDocument(i);return o.state<DocumentState.IndexedContent&&this.logger.warn(`document {doc} is not yet indexed, creating on the fly to resolve FQN for element {el}`,{el:i.name??i.$type,doc:UriUtils.basename(o.uri)}),invariant$1(isLikeC4LangiumDocument(o)),this.get(o),nonNullable$1(ElementOps.readId(i),`Element fqn must be set, invalid state`)}byFqn(i,a){return stream(this.workspaceCache.get(`${i}:fqn:${a}`,()=>this.documents(i).flatMap(i=>this.get(i).byFqn(a)).toArray()))}rootElements(i){return stream(this.workspaceCache.get(`${i}:rootElements`,()=>{let a=new MultiMap$1;for(let o of this.documents(i))for(let i of this.get(o).rootElements())a.set(i.name,i);return uniqueByName(a)}))}directChildrenOf(i,a){return stream(this.workspaceCache.get(`${i}:directChildrenOf:${a}`,()=>{let o=new MultiMap$1;for(let s of this.documents(i))for(let i of this.get(s).children(a))o.set(i.name,i);return uniqueByName(o)}))}uniqueDescedants(i,a){return stream(this.workspaceCache.get(`${i}:uniqueDescedants:${a}`,()=>{let o=new MultiMap$1,s=new MultiMap$1;for(let c of this.documents(i)){let i=this.get(c);for(let s of i.children(a))o.set(s.name,s);for(let o of i.descendants(a))s.set(o.name,o)}let c=uniqueByName(o),l=[...s.associations()].flatMap(([i,a])=>a.length===1&&!o.has(i)?a:[]);return[...c,...sortNaturalByFqn(l)]}))}createDocumentIndex(i){let a=i.parseResult.value.models.flatMap(i=>i.elements.filter(isIndexableElement));if(a.length===0)return DocumentFqnIndex.EMPTY;let o=i.likec4ProjectId??this.projects.ownerProjectId(i),s=[],c=new MultiMap$1,l=new MultiMap$1,u=new MultiMap$1,d=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(a,s,c)=>{let l=Object.assign(d.createDescription(a,s,i),{id:c,likec4ProjectId:o});return ElementOps.writeId(a,c),u.set(c,l),l};function traverseElement(i,a){let o=Fqn$1(i.name,a),u=createAndSaveDescription(i,i.name,o);a?c.set(a,u):s.push(u);let d=n(i.body?.elements??[],isIndexableElement);if(!t$4(d,1))return[u];let f=d.flatMap(i=>traverseElement(i,o));for(let i of f)l.set(o,i);return[u,...f]}function traverseExtendElement(i){let a=readStrictFqn(i.element),o=t$1(i.body?.elements??[],n(isElement),t$7(i=>traverseElement(i,a)));if(o.length!==0)for(let i of[a,...ancestorsFqn(a)])for(let a of o)l.set(i,a)}for(let o of a)try{if(isExtendElement(o)){traverseExtendElement(o);continue}traverseElement(o,null)}catch(a){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:o.$type,doc:UriUtils.basename(i.uri),error:a})}return new DocumentFqnIndex(s,c,l,u,o)}};function uniqueByName(i){return[...i.associations()].flatMap(([i,a])=>a.length===1?a:[]).sort((i,a)=>compareNatural(i.name,a.name))}var DocumentFqnIndex=class DocumentFqnIndex{static EMPTY=new DocumentFqnIndex([],new MultiMap$1,new MultiMap$1,new MultiMap$1,ProjectsManager.DefaultProjectId);constructor(i,a,o,s,c){this._rootElements=i,this._children=a,this._descendants=o,this._byfqn=s,this.projectId=c}rootElements(){return this._rootElements}byFqn(i){return this._byfqn.get(i)??[]}children(i){return this._children.get(i)??[]}descendants(i){return this._descendants.get(i)??[]}};const _isDeployment=isAnyOf(isDeploymentElement,isExtendDeployment);var DeploymentsIndex=class extends FqnIndex{Names;logger=logger$9.getChild(`deployments-index`);constructor(i){super(i),this.services=i,this.Names=i.references.NameProvider}createDocumentIndex(i){let a=i.parseResult.value.deployments.flatMap(i=>i.elements.filter(_isDeployment));if(a.length===0)return DocumentFqnIndex.EMPTY;let o=i.likec4ProjectId??this.projects.ownerProjectId(i),s=[],c=new MultiMap$1,l=new MultiMap$1,u=new MultiMap$1,d=this.Names,f=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(a,s,c)=>{let l={...f.createDescription(a,s,i),id:c,likec4ProjectId:o};return ElementOps.writeId(a,c),u.set(c,l),l};function traverseElement(i,a){let o=d.getName(i);if(!e$1(o))return[];let u=Fqn(o,a),f=createAndSaveDescription(i,o,u);if(a?c.set(a,f):s.push(f),isDeployedInstance(i))return[f];let p=n(i.body?.elements??[],_isDeployment);if(!t$4(p,1))return[f];let m=p.flatMap(i=>traverseElement(i,u));for(let i of m)l.set(u,i);return[f,...m]}function traverseExtend(i){let a=readStrictFqn(i.deploymentNode),o=t$1(i.body?.elements??[],n(_isDeployment),t$7(i=>traverseElement(i,a)));if(o.length!==0)for(let i of[a,...ancestorsFqn$1(a)])for(let a of o)l.set(i,a)}for(let o of a)try{if(isExtendDeployment(o)){traverseExtend(o);continue}traverseElement(o,null)}catch(a){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:o.$type,doc:UriUtils.basename(i.uri),error:a})}return new DocumentFqnIndex(s,c,l,u,o)}},MergedSpecification=class{specs={elements:{},deployments:{},relationships:{},colors:{}};tags;globals={predicates:{},dynamicPredicates:{},styles:{}};imports=new MultiMap$1(Set);projectId;constructor(i){let a={},o=[];for(let s of i){let{c4Specification:i,c4Globals:c,c4Imports:l}=s,u=s.likec4ProjectId;e$4(u)&&(o.length===0||o[0]!==u)&&o.push(s.likec4ProjectId),Object.assign(a,i.tags),Object.assign(this.specs.elements,i.elements),Object.assign(this.specs.relationships,i.relationships),Object.assign(this.specs.colors,i.colors),Object.assign(this.specs.deployments,i.deployments),Object.assign(this.globals.predicates,c.predicates),Object.assign(this.globals.dynamicPredicates,c.dynamicPredicates),Object.assign(this.globals.styles,c.styles);for(let[i,a]of l)this.imports.set(i,a)}this.tags=assignTagColors(a),this.projectId=t$9(o)}toModelElement=({tags:i,links:a,style:o,id:s,kind:c,title:l,description:u,technology:d,summary:f,metadata:p})=>{try{let m=this.specs.elements[c];return m?(d??=m.technology,u??=m.description,f??=m.summary,a??=m.links,e$5(l)&&(l=m.title||nameFromFqn(s)),m.tags&&isNonEmptyArray(m.tags)&&(i=i?n$2([...m.tags,...i]):m.tags),exact$1({metadata:p&&!e$3(p)?p:void 0,notation:m.notation,style:exact$1({...m.style,...o}),links:a,tags:i,summary:f,technology:d,description:u,title:l,kind:c,id:s})):(logger$9.warn`No kind '${c}' found for ${s}`,null)}catch(i){logWarnError(i)}return null};toModelRelation=({astPath:i,source:a,target:o,kind:s,links:c,id:l,...u})=>e$4(s)&&this.specs.relationships[s]?{...this.specs.relationships[s],...u,...c&&{links:c},source:a,target:o,kind:s,id:l}:{...c&&{links:c},...u,source:a,target:o,id:l};toDeploymentElement=i=>{if(`element`in i&&!(`kind`in i))return{...i,element:FqnRef$1.flatten(i.element)};if(`element`in i)return logger$9.warn`Invalid ParsedAstDeployment ${i.id}, has both element and kind properties`,null;try{let a=this.specs.deployments[i.kind];if(!a)return logger$9.warn`No kind ${i.kind} found for ${i.id}`,null;let{id:o,style:s,title:c,...l}=i;return c=c===nameFromFqn(i.id)&&a.title?a.title:c,exact$1({...a,...l,title:c,style:exact$1({...a.style,...s}),id:o})}catch(i){logWarnError(i)}return null};toDeploymentRelation=({astPath:i,source:a,target:o,kind:s,links:c,id:l,...u})=>e$4(s)&&this.specs.relationships[s]?{...this.specs.relationships[s],...u,...c&&{links:c},source:a,target:o,kind:s,id:l}:{...c&&{links:c},...u,source:a,target:o,id:l}},LastSeenArtifacts=class{#e=new Map;#t=new Map;#n=new Map;constructor(i){i.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()})}rememberSpecification(i){return i.projectId&&this.#e.set(i.projectId,i),i}rememberModel(i){let a=i.projectId,o=i.$styles,s=this.#t.get(a);return(!s||!s.equals(o))&&this.#t.set(a,o),this.#n.set(a,i),i}specification(i){return this.#e.get(i)}styles(i){return this.#t.get(i)}model(i){return this.#n.get(i)}};function assignNavigateTo(i){let a=new Map;for(let o of i)if(isElementView(o)&&o.viewOf&&e(o.extends)){let i=a.get(o.viewOf)??[];i.push(o.id),a.set(o.viewOf,i)}for(let{id:o,nodes:s}of i)for(let i of s){let s=i.modelRef;if(i.navigateTo||!s)continue;let c=r(a.get(s)??[],i=>i!==o);c&&(i.navigateTo=c)}return i}const{getDocument:getDocument$5}=AstUtils;function unpack({nodes:i,edges:a,autoLayout:o,...s}){return{...s,autoLayout:isAutoLayoutDirection(o)?{direction:o}:o,nodes:t$10(i,({b:i,c:a,...o})=>({x:i[0],y:i[1],width:i[2],height:i[3],isCompound:a,...o})),edges:t$10(a,({p:i,cp:a,l:o,...s})=>({...!!a&&{controlPoints:a},...!!o&&{labelBBox:o},...s,points:i}))}}function hasManualLayout(i){return i.includes(`@likec4-generated`)}function deserializeFromComment(i){if(!hasManualLayout(i))throw Error(`Not a likec4-generated comment: ${i}`);return unpack(decode(fromBase64(i.trim().split(`
19
- `).filter(i=>!i.includes(`**`)&&!i.includes(`@likec4-`)&&!i.includes(`*/`)).map(i=>i.replaceAll(`*`,``).trim()).join(``))))}function parseViewManualLayout(i){let a=CstUtils.findCommentNode(i.$cstNode,[`BLOCK_COMMENT`]);if(!(!a||!hasManualLayout(a.text)))try{return deserializeFromComment(a.text)}catch(o){let s=getDocument$5(i);logWarnError(o),logger$9.warn(`Ignoring manual layout of "${i.name??`unnamed`}" at ${s.uri.fsPath}:${1+(a.range.start.line||0)}`);return}}var MergedExtends=class{mergedData=new Map;mergeMetadata(i,a){let o={...i};for(let[i,s]of Object.entries(a)){let a=o[i];if(a===void 0){o[i]=s;continue}let c=Array.isArray(a)?a:[a],l=Array.isArray(s)?s:[s],u=n$2([...c,...l]);o[i]=u.length===1?u[0]:u}return o}merge(i){for(let a of i){let{id:i,links:o,tags:s,metadata:c}=a,l=this.mergedData.get(i)??{links:[],tags:[],metadata:{}};o&&l.links.push(...o),s&&(l.tags=n$2([...l.tags,...s])),c&&(l.metadata=this.mergeMetadata(l.metadata,c)),this.mergedData.set(i,l)}}applyExtended(i){let a=this.mergedData.get(i.id);if(!a)return i;let o=a.links;i.links&&i.links.length>0&&(o=[...i.links,...o]);let s=a.tags;i.tags&&i.tags.length>0&&(s=n$2([...i.tags,...s]));let c=a.metadata;return i.metadata&&(c=this.mergeMetadata(i.metadata,a.metadata)),{...i,tags:t$4(s,1)?s:null,links:t$4(o,1)?o:null,...!e$3(c)&&{metadata:c}}}};function buildModelData(i,a,o){let s=new MergedSpecification(o);s.projectId===a.id&&i.likec4.LastSeen.rememberSpecification(s);let c=t$10(s.specs.colors,i=>computeColorValues(i.color)),l=new Set,u=new MergedExtends,d=new MergedExtends,f=o.flatMap(i=>i.c4ExtendRelations),p=new Set,scanMetadataKeys=i=>{i?.metadata&&t$11(i.metadata).forEach(i=>l.add(i))},m=t$1(o,t$7(i=>(u.merge(i.c4ExtendElements),t$2(i.c4Elements,s.toModelElement))),n(e$1),sortParentsFirst,t$12((i,a)=>{let o=parentFqn(a.id);return o&&e(i[o])?(logger$9.debug`No parent found for ${a.id}`,i):(i[a.id]=u.applyExtended(a),scanMetadataKeys(i[a.id]),i)},{})),h=t$1(o,t$7(i=>t$2(i.c4Relations,s.toModelRelation)),n(i=>{if(!i)return!1;let a=FqnRef$1.flatten(i.source),o=FqnRef$1.flatten(i.target);return e(m[a])&&!isGlobalFqn(a)||e(m[o])&&!isGlobalFqn(o)?(logger$9.debug`Invalid relation ${i.id}
20
- source: ${a} resolved: ${!!m[a]}
21
- target: ${o} resolved: ${!!m[o]}\n`,!1):!0}),t$2(i=>{let a=stringHash$1(`extend-relation`,FqnRef$1.flatten(i.source),FqnRef$1.flatten(i.target),i.kind??`default`,i.title??``),o=f.filter(i=>i.id===a);if(o.length===0)return i;o.forEach(i=>p.add(i.astPath));let s=i.tags?[...i.tags]:[],c=i.links?[...i.links]:[],l=i.metadata?{...i.metadata}:{};for(let i of o){if(i.tags&&s.push(...i.tags),i.links)for(let a of i.links)c.some(i=>i.url===a.url&&(i.title||``)===(a.title||``))||c.push(a);if(i.metadata)for(let[a,o]of Object.entries(i.metadata)){let i=l[a];if(i===void 0)l[a]=o;else{let s=Array.isArray(i)?i:[i],c=Array.isArray(o)?o:[o],u=n$2([...s,...c]);l[a]=u.length===1?u[0]:u}}}let u=n$2(s),d=c;return{...i,...t$4(u,1)&&{tags:u},...t$4(d,1)&&{links:d},...!e$3(l)&&{metadata:l}}}),t$13(scanMetadataKeys),t$6(e$2(`id`))),g=t$1(o,t$7(i=>(d.merge(i.c4ExtendDeployments),t$2(i.c4Deployments,s.toDeploymentElement))),n(e$1),sortParentsFirst,t$12((i,a)=>{let o=parentFqn(a.id);return o&&e(i[o])?(logger$9.debug`No parent found for deployment element ${a.id}`,i):(i[a.id]=isDeploymentNode(a)?d.applyExtended(a):a,scanMetadataKeys(i[a.id]),i)},{})),_=t$1(o,t$7(i=>t$2(i.c4DeploymentRelations,s.toDeploymentRelation)),n(i=>i?e(g[i.source.deployment])||e(g[i.target.deployment])?(logger$9.debug`Invalid deployment relation ${i.id}
22
- source: ${i.source.deployment} resolved: ${!!g[i.source.deployment]}
23
- target: ${i.target.deployment} resolved: ${!!g[i.target.deployment]}\n`,!1):!0:!1),t$12((i,a)=>e$6(i[a.id])?(logger$9.debug`Duplicate deployment relation ${a.id}`,i):(scanMetadataKeys(a),i[a.id]=a,i),{}));function toC4View(i){let o=i.uri.toString();return i=>{let{id:s,title:c,description:l,astPath:u,...d}=i;return i[_type$1]===`element`&&e(c)&&`viewOf`in i&&(c=m[i.viewOf]?.title??null),e(c)&&s===`index`&&(c=`Landscape view`),{...t$14(d,i=>i===void 0),[_stage$1]:`parsed`,sourcePath:UriUtils.relative(a.folderUri,o),docUri:o,description:l,title:c,id:s}}}let v=o.flatMap(i=>t$2(i.c4Views,toC4View(i)));v.some(i=>i.id===`index`)||v.unshift({[_stage$1]:`parsed`,[_type$1]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]});let y=t$1(v,t$6(e$2(`id`)));v.some(isExtendsElementView)&&(y=resolveRulesExtendedViews(y));for(let i of f)p.has(i.astPath)||logger$9.warn(`Relation extend at ${i.astPath} does not match any relation in the model`);return{data:{[_stage$1]:`parsed`,projectId:a.id,project:exact$1({id:a.id,title:a.config.title??a.config.name,styles:a.config.styles,manualLayouts:a.config.manualLayouts}),specification:{tags:s.tags,elements:s.specs.elements,relationships:t$10(s.specs.relationships,({notation:i,technology:a,...o})=>({...i&&{notation:i},...a&&{technology:a},style:o})),deployments:s.specs.deployments,...l.size>0&&{metadataKeys:[...l].sort(compareNatural)},customColors:c},elements:m,relations:h,globals:s.globals,views:y,deployments:{elements:g,relations:_},imports:{}},imports:s.imports}}const parsedWithoutImportsCacheKey=i=>`parsed-without-imports-${i}`,parsedModelCacheKey=i=>`parsed-model-${i}`,computedModelCacheKey=i=>`computed-model-${i}`,builderLogger=logger$9.getChild(`builder`);var DefaultLikeC4ModelBuilder=class extends ADisposable{projects;parser;listeners=[];cache;DocumentBuilder;manualLayouts;mutex;lastSeen;constructor(i){super(),this.services=i,this.projects=i.shared.workspace.ProjectsManager,this.parser=i.likec4.ModelParser,this.cache=i.shared.workspace.Cache,this.DocumentBuilder=i.shared.workspace.DocumentBuilder,this.mutex=i.shared.workspace.WorkspaceLock,this.manualLayouts=i.shared.workspace.ManualLayouts,this.lastSeen=i.likec4.LastSeen,this.onDispose(this.DocumentBuilder.onUpdate((i,a)=>{a.length>0&&this.notifyListeners(a)}),i.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.clearCache()}));let a=t$15(e$7(),n(i=>isNotLikeC4Builtin(i)&&!this.projects.isExcluded(i)),t$2(i=>i.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(DocumentState.Validated,(i,o)=>{let s=a(i);s.length>0&&this.notifyListeners(s)})),builderLogger.debug`created`}unsafeSyncParseModelData(i){let a=this.cache,o=parsedWithoutImportsCacheKey(i);return a.get(o,()=>{let a=builderLogger.getChild(i);try{let o=this.projects.getProject(i),s=this.documents(i);return s.length===0?(a.debug`unsafeSyncParseModelData: skipped due to no documents`,null):(a.debug`unsafeSyncParseModelData: completed`,buildModelData(this.services,o,s))}catch(a){return builderLogger.warn(`unsafeSyncParseModelData failed for project ${i}`,{err:a}),null}})}unsafeSyncJoinedModelData(i){let a=builderLogger.getChild(i),o=this.unsafeSyncParseModelData(i);if(!o)return null;if(o.imports.size===0)return o.data;a.debug`processing imports of ${i}`;let s=[...o.imports.associations()].reduce((i,[a,o])=>{if(o.size===0)return i;let s=this.unsafeSyncParseModelData(a);if(s){let c=[...o].flatMap(i=>s.data.elements[i]??[]);t$4(c,1)&&(i[a]=structuredClone(c))}return i},{});return{...o.data,imports:s}}async parseModel(i,a){i=this.projects.ensureProjectId(i);let o=builderLogger.getChild(i),s=this.cache,c=performanceMark();return await this.mutex.read(async()=>{a?.isCancellationRequested&&await interruptAndCheck(a);let l=parsedModelCacheKey(i);return s.has(l)&&o.debug`parseModel from cache`,s.get(l,()=>{let a=this.unsafeSyncJoinedModelData(i);return a?(o.debug`parseModel in ${c.pretty}`,LikeC4Model.create(a)):(o.debug`parseModel: returning EMPTY`,LikeC4Model.EMPTY.asParsed)})})}previousViews={};unsafeSyncComputeModel(i,a){let o=this.cache,s=computedModelCacheKey(i)+(a?.hash??``);return o.get(s,()=>{let o=builderLogger.getChild(i),s=this.unsafeSyncJoinedModelData(i);if(!s)return o.debug`unsafeSyncComputeModel: returning EMPTY`,LikeC4Model.EMPTY.asComputed;let c=LikeC4Model.create(s),l=[];for(let i of t$16(s.views)){let s=computeView(i,c);if(!s.isSuccess){o.warn(loggable(s.error));continue}a?.views[i.id]&&Object.assign(s.view,{hasManualLayout:!0}),l.push(s.view)}assignNavigateTo(l);let u=t$17(l,a=>{let o=computedViewKey(i,a.id),s=this.previousViews[o],c=s&&deepEqual(a,s)?s:a;return this.previousViews[o]=c,[a.id,c]}),d={...s,manualLayouts:{...a?.views},[_stage]:`computed`,views:u};return o.debug(`unsafeSyncComputeModel${a?` with manual layouts`:``}: completed`),this.lastSeen.rememberModel(LikeC4Model.create(d))})}async computeModel(i,a){i=this.projects.ensureProjectId(i);let o=builderLogger.getChild(i),s=performanceMark();return await this.mutex.read(async()=>{a?.isCancellationRequested&&await interruptAndCheck(a);let c=this.projects.getProject(i),l=await this.manualLayouts.read(c),u=this.unsafeSyncComputeModel(i,l);return u===LikeC4Model.EMPTY?o.debug(`computeModel returned EMPTY`):s.ms>10&&o.debug(`computeModel completed in ${s.pretty}`),u})}onModelParsed(i){return this.listeners.push(i),Disposable.create(()=>{let a=this.listeners.indexOf(i);a>=0&&this.listeners.splice(a,1)})}clearCache(){builderLogger.debug(`clearCache`),this.cache.clear(),this.previousViews={}}documents(i){return this.parser.documents(i).toArray()}notifyListeners(i){for(let a of this.listeners)try{a(i)}catch(i){builderLogger.warn(loggable(i))}}};function computedViewKey(i,a){return`computed-view-${i}-${a}`}const{findNodeForKeyword:findNodeForKeyword$2,findNodeForProperty}=GrammarUtils,{getDocument:getDocument$4,streamAllContents}=AstUtils,logger$5=logger$9.getChild(`locator`);var LikeC4ModelLocator=class{fqnIndex;deploymentsIndex;langiumDocuments;parser;projects;constructor(i){this.services=i,this.fqnIndex=i.likec4.FqnIndex,this.deploymentsIndex=i.likec4.DeploymentsIndex,this.langiumDocuments=i.shared.workspace.LangiumDocuments,this.parser=i.likec4.ModelParser,this.projects=i.shared.workspace.ProjectsManager}documents(i){return this.parser.documents(i)}getParsedElement(...i){try{let a,o;if(i.length===2?(a=i[0],o=i[1]):(a=i[0],o=e$8(a)?this.projects.ensureProjectId():projectIdFrom(a)),e$8(a)){let i=a,s=this.fqnIndex.byFqn(o,i).head();if(!s)return null;let c=this.langiumDocuments.getDocument(s.documentUri),l=this.findParsedElementByFqnIn(i,c);return l&&c?{projectId:o,element:l,document:c}:null}let s=this.fqnIndex.getFqn(a),c=getDocument$4(a),l=this.findParsedElementByFqnIn(s,c);return l&&c?{projectId:o,element:l,document:c}:null}catch(i){return logger$5.debug(loggable(i)),null}}findParsedElementByFqnIn(i,a){if(a)return this.parser.parse(a).c4Elements.find(a=>a.id===i)}locateElement(i,a){let[o,s]=splitGlobalFqn(i);o??=this.projects.ensureProjectId(a);let c=this.fqnIndex.byFqn(o,s).head(),l=c?.nameSegment??c?.selectionSegment;return!c||!l?null:{uri:c.documentUri.toString(),range:l.range}}locateDeploymentElement(i,a){let o=this.projects.ensureProjectId(a),s=i,c=this.deploymentsIndex.byFqn(o,s).head(),l=c?.nameSegment??c?.selectionSegment;return!c||!l?null:{uri:c.documentUri.toString(),range:l.range}}locateRelation(i,a){let o=this.projects.ensureProjectId(a);for(let a of this.documents(o)){let o=a.c4Relations.find(a=>a.id===i)??a.c4DeploymentRelations.find(a=>a.id===i);if(!o)continue;let s=this.services.workspace.AstNodeLocator.getAstNode(a.parseResult.value,o.astPath);if(!isRelation(s)&&!isDeploymentRelation(s))continue;let c=s.kind?findNodeForProperty(s.$cstNode,`kind`):void 0;if(c??=s.dotKind?findNodeForProperty(s.$cstNode,`dotKind`):void 0,c??=findNodeForKeyword$2(s.$cstNode,`->`),c??=findNodeForProperty(s.$cstNode,`title`),c??=findNodeForProperty(s.$cstNode,`target`),c??=s.$cstNode,c)return{uri:a.uri.toString(),range:{start:c.range.start,end:c.range.start}}}return null}locateViewAst(i,a){let o=this.projects.ensureProjectId(a);for(let a of this.documents(o)){let o=a.c4Views.find(a=>a.id===i);if(!o)continue;let s=this.services.workspace.AstNodeLocator.getAstNode(a.parseResult.value,o.astPath);if(isLikeC4View(s))return{doc:a,view:o,viewAst:s}}return null}locateView(i,a){let o=this.locateViewAst(i,a);if(!o)return null;let s=o.viewAst,c=s.name?findNodeForProperty(s.$cstNode,`name`):void 0;return c??=findNodeForKeyword$2(s.$cstNode,`view`),c??=s.$cstNode,c?{uri:o.doc.uri.toString(),range:{start:c.range.start,end:c.range.start}}:null}async locateDocumentTags(i,a){let o=this.langiumDocuments.getDocument(i);if(!o||!o.likec4ProjectId)return null;o.state<DocumentState.Linked&&(logger$5.debug(`Waiting for document ${o.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(DocumentState.Linked,o.uri,a));let s=projectIdFrom(o);logger$5.trace`locate document tags for ${o.uri.fsPath} in project ${s}`;try{let i=this.services.likec4.LastSeen.specification(s)?.tags,a=this.services.likec4.LastSeen.styles(s)??LikeC4Styles.DEFAULT;if(!i)return logger$5.trace(`No specification or styles found for project ${s}, cannot locate tags for document ${o.uri.fsPath}`),null;let c=t$1(streamAllContents(o.parseResult.value),ifilter(i=>isTag(i)||isTagRef(i)),toArray(),t$7(o=>{let s,c;try{isTag(o)?(s=o.name,c=o.$cstNode):(s=o.tag.$refText,c=o.tag.$refNode);let l=i[s];return invariant(l,`Tag ${s} not found in merged specification`),invariant(c,`Tag ${s} does not have a $cstNode`),{name:s,color:a.tagColor(l.color).fill,range:c.range,isSpecification:isTag(o)}}catch(i){return logger$5.warn(`Fail on tag ${s}`,{err:i}),[]}}));return logger$5.debug(`Found ${c.length} tags in document ${o.uri.path}`),c}catch(i){return logger$5.warn(loggable(i)),null}}locateDynamicViewStep(i){let{doc:a,viewAst:o}=this.locateViewAst(i.view,i.projectId)??{};if(!a||!o)return null;if(!isDynamicView(o)||!o.body)return logger$5.warn(`View ${i.view} is not a dynamic view`),null;let s=this.services.workspace.AstNodeLocator.getAstNodePath(o.body)+i.astPath,c=this.services.workspace.AstNodeLocator.getAstNode(a.parseResult.value,s);if(!c||!isDynamicViewStep(c))return logger$5.warn(`Failed to locate dynamic view step ${s} in view ${i.view}`),null;let l=c.kind?findNodeForProperty(c.$cstNode,`kind`):void 0;return l??=c.dotKind?findNodeForProperty(c.$cstNode,`dotKind`):void 0,l??=findNodeForKeyword$2(c.$cstNode,`->`),l??=findNodeForKeyword$2(c.$cstNode,`<-`),l??=findNodeForProperty(c.$cstNode,`title`),l??=findNodeForProperty(c.$cstNode,`target`),l??=c.$cstNode,l?{uri:a.uri.toString(),range:{start:l.range.start,end:l.range.start}}:null}};const RESERVED_WORDS=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function tryOrLog(i){return async function(a,o,s){try{let c=i(a,o,s);e$9(c)&&await c;return}catch(i){let s=i instanceof Error?i.message:String(i);o(`error`,`Validation failed: ${s}`,{node:a}),logger$9.debug(`Validation failed: ${s}`,{error:i})}}}const{getDocument:getDocument$3}=AstUtils,deploymentNodeChecks=i=>{let a=i.likec4.DeploymentsIndex,o=i.references.NameProvider;return tryOrLog((i,s)=>{let c=o.getName(i);if(!c){s(`error`,`DeploymentNode must be named`,{node:i});return}let l=nonNullable$1(o.getNameNode(i),`name CstNode not found`).range;RESERVED_WORDS.includes(c)&&s(`error`,`Reserved word: ${c}`,{node:i,range:l});let u=projectIdFrom(i),d=a.getFqn(i);a.byFqn(u,d).limit(2).toArray().length>1&&s(`error`,`Duplicate node name "${d}"`,{node:i,range:l})})},deployedInstanceChecks=i=>{let a=i.likec4.DeploymentsIndex,o=i.references.NameProvider;return tryOrLog((i,s)=>{let c=o.getName(i);if(!c){s(`error`,`Deployed instance must be named, unique inside node`,{node:i});return}let l=nonNullable$1(o.getNameNode(i),`name CstNode not found`).range;RESERVED_WORDS.includes(c)&&s(`error`,`Reserved word: ${c}`,{node:i,range:l});let u=projectIdFrom(i),d=a.getFqn(i);a.byFqn(u,d).limit(2).toArray().length>1&&s(`error`,`Duplicate instance name "${d}"`,{node:i,range:l})})},deploymentRelationChecks=i=>{let a=i.likec4.ModelParser;return tryOrLog((i,o)=>{if(!i.target?.value?.ref){o(`error`,`DeploymentRelation target '${i.target?.$cstNode?.text??``}' not resolved`,{node:i,property:`target`});return}let s=getDocument$3(i),c=a.forDocument(s),l;try{l=c._resolveDeploymentRelationSource(i)}catch(a){logger$9.warn(loggable(a)),o(`error`,`DeploymentRelation source not resolved`,{node:i,property:`source`});return}if(FqnRef.isImportRef(l)){o(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:i,property:`source`});return}if(FqnRef.isModelRef(l)){o(`error`,`DeploymentRelation must refer deployment element`,{node:i,property:`source`});return}let u=c.parseFqnRef(i.target);if(FqnRef.isImportRef(u)){o(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:i,property:`target`});return}if(FqnRef.isModelRef(u)){o(`error`,`DeploymentRelation must refer deployment element`,{node:i,property:`target`});return}isSameHierarchy$1(l.deployment,u.deployment)&&o(`error`,`Invalid parent-child relationship`,{node:i})})},extendDeploymentChecks=i=>tryOrLog((i,a)=>{let o=i.deploymentNode.value.ref;(!o||!isDeploymentNode$1(o))&&a(`error`,`ExtendDeployment allows only DeploymentNode`,{node:i,property:`deploymentNode`})}),dynamicViewStepSingle=i=>{let a=i.likec4.FqnIndex;return tryOrLog((i,o)=>{let s=elementRef(i.source),c=s&&a.getFqn(s);c||o(`error`,`Source not found (not parsed/indexed yet)`,{node:i,property:`source`});let l=elementRef(i.target),u=l&&a.getFqn(l);u||o(`error`,`Target not found (not parsed/indexed yet)`,{node:i,property:`target`}),c&&u&&(isAncestor(c,u)||isAncestor(u,c))&&o(`error`,`Invalid parent-child relationship`,{node:i})})},dynamicViewStepChain=i=>{let a=i.likec4.FqnIndex;return tryOrLog((i,o)=>{let s=i.source;isDynamicStepSingle(s)&&s.isBackward&&o(`error`,`Invalid chain after backward step`,{node:i});let c=elementRef(i.target);c&&a.getFqn(c)||o(`error`,`Target not found (not parsed/indexed yet)`,{node:i,property:`target`})})},dynamicViewDisplayVariant=i=>tryOrLog((i,a)=>{if(e$3(i.value)||i.value!==`diagram`&&i.value!==`sequence`){a(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:i,property:`value`});return}AstUtils.hasContainerOfType(i,isDynamicViewBody)||a(`error`,`Display mode can be defined only inside dynamic view`,{node:i})}),{getDocument:getDocument$2}=AstUtils,checkElement=i=>{let a=i.likec4.FqnIndex,o=i.workspace.AstNodeLocator;return tryOrLog((i,s)=>{let c=a.getFqn(i);if(!c){s(`error`,`Not indexed element`,{node:i,property:`name`});return}RESERVED_WORDS.includes(i.name)&&s(`error`,`Reserved word: ${i.name}`,{node:i,property:`name`});let l=getDocument$2(i),u=l.uri,d=o.getAstNodePath(i),f=a.byFqn(projectIdFrom(l),c).filter(i=>i.documentUri!==u||i.path!==d).head();if(f){let a=f.documentUri!==u;s(`error`,`Duplicate element name ${i.name===c?i.name:i.name+` (`+c+`)`}`,{node:i,property:`name`,...a&&{relatedInformation:[{location:{range:f.nameSegment?.range??f.selectionSegment?.range,uri:f.documentUri.toString()},message:`conflicting element`}]}})}})},checkElementRef=i=>tryOrLog((i,a)=>{isReferenceToDeploymentModel(i.modelElement)&&a(`error`,`Only model elements allowed here`,{node:i,property:`modelElement`})}),{getDocument:getDocument$1}=AstUtils,checkImportsFromPoject=i=>{let a=i.shared.workspace.ProjectsManager;return tryOrLog((i,o)=>{if(!a.all.includes(i.project)){o(`error`,`Imported project not found`,{node:i,property:`project`});return}let s=projectIdFrom(getDocument$1(i));if(i.project===s){o(`error`,`Imported project cannot be the same as the current project`,{node:i,property:`project`});return}})},opacityPropertyRuleChecks=i=>tryOrLog((i,a)=>{let o=parseFloat(i.value);(isNaN(o)||o<0||o>100)&&a(`warning`,`Value ignored, must be between 0% and 100%`,{node:i,property:`value`})}),iconPropertyRuleChecks=i=>(i,a)=>{let o=i.$container;o.props.some(a=>isIconProperty(a)&&a!==i)&&a(`error`,`Icon must be defined once`,{node:i}),isElementStyleProperty(o)&&isElementBody(o.$container)&&o.$container.props.some(i=>isIconProperty(i))&&a(`warning`,`Redundant as icon defined on element`,{node:i}),i.value?.startsWith(`file://`)&&a(`error`,`Icon URI must not start with file://`,{node:i,property:`value`})},colorLiteralRuleChecks=i=>(i,a)=>{if(i.$type===`HexColor`){if(i.hex===void 0||e$8(i.hex)&&!i.hex.match(/^[a-fA-F0-9]+$/)){a(`error`,`Invalid HEX`,{node:i,property:`hex`});return}let o=e$10(i.hex)?i.hex.toString().length:i.hex.length;o!==6&&o!==3&&o!==8&&a(`error`,`Invalid value "${i.$cstNode?.text}", must be 3, 6 or 8 characters long`,{node:i,property:`hex`});return}if(i.$type===`RGBAColor`){if((!e$10(i.red)||i.red<0||i.red>255)&&a(`error`,`Invalid value, must be between 0 and 255`,{node:i,property:`red`}),(!e$10(i.green)||i.green<0||i.green>255)&&a(`error`,`Invalid value, must be between 0 and 255`,{node:i,property:`green`}),(!e$10(i.blue)||i.blue<0||i.blue>255)&&a(`error`,`Invalid value, must be between 0 and 255`,{node:i,property:`blue`}),e$10(i.alpha)&&(i.alpha<0||i.alpha>1)&&a(`error`,`Invalid value, must be between 0 and 1`,{node:i,property:`alpha`}),e$8(i.alpha)){let o=parseFloat(i.alpha);(o<0||o>100)&&a(`error`,`Invalid value, must be between 0% and 100%`,{node:i,property:`alpha`})}return}nonexhaustive$1(i)},relationChecks=i=>{let a=i.likec4.ModelParser;return tryOrLog((i,o)=>{let s=a.forDocument(AstUtils.getDocument(i)),c=safeCall(()=>s._resolveRelationSource(i));if(!c){o(`error`,`Source not resolved`,{node:i,property:`source`});return}let l=safeCall(()=>s.parseFqnRef(i.target));if(!l){o(`error`,`Target not resolved`,{node:i,property:`target`});return}FqnRef.isImportRef(c)&&(FqnRef.isImportRef(l)?o(`warning`,`Relationship between imported elements may not be visible in origin projects`,{node:i}):o(`warning`,`Relationship from imported element to local element may not be visible in origin project`,{node:i,property:`source`})),isSameHierarchy$1(FqnRef.flatten(c),FqnRef.flatten(l))&&o(`error`,`Invalid parent-child relationship`,{node:i})})},checkRelationBody=i=>tryOrLog((i,a)=>{i.$container.tags?.values&&i.tags?.values&&a(`error`,`Relation cannot have tags in both header and body`,{node:i.tags})}),extendRelationChecks=i=>{let a=i.likec4.ModelParser,o=new WorkspaceCache(i.shared,DocumentState.Linked),calcFingerprint=({source:i,target:a,kind:o,title:s})=>stringHash$1(`extend-relation`,FqnRef.flatten(i),FqnRef.flatten(a),o??`default`,s??``);function getProjectFingerprints(a){return o.get(a,()=>new Set(t$1(i.shared.workspace.LangiumDocuments.projectDocuments(a).toArray(),t$7(i=>i.c4Relations??[]),t$2(i=>calcFingerprint(i)))))}return tryOrLog((i,o)=>{let s=AstUtils.getDocument(i),c=a.forDocument(s),l=safeCall(()=>c.parseFqnRef(i.source));if(!l){o(`error`,`Source not resolved`,{node:i,property:`source`});return}let u=safeCall(()=>c.parseFqnRef(i.target));if(!u){o(`error`,`Target not resolved`,{node:i,property:`target`});return}if(!FqnRef.isModelRef(l)&&!FqnRef.isImportRef(l)){o(`error`,`Source must reference a model element`,{node:i,property:`source`});return}if(!FqnRef.isModelRef(u)&&!FqnRef.isImportRef(u)){o(`error`,`Target must reference a model element`,{node:i,property:`target`});return}let d=projectIdFrom(s),f=(i.kind??i.dotKind?.kind)?.ref?.name??`default`,{title:p=``}=c.parseBaseProps({},{title:i.title}),m=calcFingerprint({source:l,target:u,kind:f,title:p});getProjectFingerprints(d).has(m)||o(`warning`,`This extend does not match any relation (by source, kind, target, title)`,{node:i})})},checkSpecificationRule=i=>tryOrLog((i,a)=>{i.$containerIndex&&i.$containerIndex>0&&a(`warning`,`Prefer one specification per document`,{node:i,property:`name`})}),checkModel=i=>tryOrLog((i,a)=>{i.$containerIndex&&i.$containerIndex>0&&a(`warning`,`Prefer one model per document`,{node:i,property:`name`})}),checkGlobals=i=>tryOrLog((i,a)=>{i.$containerIndex&&i.$containerIndex>0&&a(`warning`,`Prefer one global block per document`,{node:i,property:`name`})}),checkElementKind=i=>{let a=i.shared.workspace.IndexManager;return tryOrLog((i,o)=>{RESERVED_WORDS.includes(i.name)&&o(`error`,`Reserved word: ${i.name}`,{node:i,property:`name`});let s=projectIdFrom(i),c=a.projectElements(s,ElementKind).filter(a=>a.name===i.name&&a.node!==i).head();if(c){let a=c.documentUri!==AstUtils.getDocument(i).uri;o(`error`,`Duplicate element kind '${i.name}'`,{node:i,property:`name`,...a&&{relatedInformation:[{location:{range:c.nameSegment.range,uri:c.documentUri.toString()},message:`conflicting definition`}]}})}})},checkDeploymentNodeKind=i=>{let a=i.shared.workspace.IndexManager;return tryOrLog((i,o)=>{RESERVED_WORDS.includes(i.name)&&o(`error`,`Reserved word: ${i.name}`,{node:i,property:`name`});let s=projectIdFrom(i),c=a.projectElements(s,DeploymentNodeKind).filter(a=>a.name===i.name&&a.node!==i).head();if(c){let a=c.documentUri!==AstUtils.getDocument(i).uri;o(`error`,`Duplicate deploymentNode kind '${i.name}'`,{node:i,property:`name`,...a&&{relatedInformation:[{location:{range:c.nameSegment.range,uri:c.documentUri.toString()},message:`conflicting definition`}]}})}})},checkTag=i=>{let a=i.shared.workspace.IndexManager;return tryOrLog((i,o)=>{let s=i.name,c=projectIdFrom(i),l=a.projectElements(c,Tag$1).filter(a=>a.name===s&&a.node!==i).head();if(l){let a=l.documentUri!==AstUtils.getDocument(i).uri;o(`error`,`Duplicate tag '${i.name}'`,{node:i,property:`name`,...a&&{relatedInformation:[{location:{range:l.nameSegment.range,uri:l.documentUri.toString()},message:`conflicting definition`}]}})}})},checkRelationshipKind=i=>{let a=i.shared.workspace.IndexManager;return tryOrLog((i,o)=>{RESERVED_WORDS.includes(i.name)&&o(`error`,`Reserved word: ${i.name}`,{node:i,property:`name`});let s=projectIdFrom(i);a.projectElements(s,RelationshipKind).filter(a=>a.name===i.name).limit(2).count()>1&&o(`error`,`Duplicate RelationshipKind '${i.name}'`,{node:i,property:`name`})})},checkGlobalPredicate=i=>{let a=i.shared.workspace.IndexManager;return tryOrLog((i,o)=>{let s=projectIdFrom(i),c=a.projectElements(s,GlobalPredicateGroup),l=a.projectElements(s,GlobalDynamicPredicateGroup);c.concat(l).filter(a=>a.name===i.name).limit(2).count()>1&&o(`error`,`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${i.name}'`,{node:i,property:`name`})})},checkGlobalStyleId=i=>{let a=i.shared.workspace.IndexManager;return tryOrLog((i,o)=>{let s=projectIdFrom(i);a.projectElements(s,GlobalStyleId).filter(a=>a.name===i.name).limit(2).count()>1&&o(`error`,`Duplicate GlobalStyleId name '${i.name}'`,{node:i,property:`name`})})},viewChecks=i=>{let a=i.shared.workspace.IndexManager;return tryOrLog((i,o)=>{let s=CstUtils.findCommentNode(i.$cstNode,[`BLOCK_COMMENT`]);if(s&&hasManualLayout(s.text)&&o(`warning`,`Migrate to the new manual layout snapshots (run LikeC4: Migrate manual layouts)`,{node:i,range:s.range,code:`manual-layout-v1`}),!i.name)return;RESERVED_WORDS.includes(i.name)&&o(`error`,`Reserved word: ${i.name}`,{node:i,property:`name`});let c=projectIdFrom(i);a.projectElements(c,LikeC4View).filter(a=>a.name===i.name).limit(2).count()>1&&o(`error`,`Duplicate view '${i.name}'`,{node:i,property:`name`})})};function collectFqnExprs(i){let a=[],o=i;for(;o;)o.value&&a.push(o.value),o=o.prev;return a.reverse()}const viewRuleRankChecks=i=>tryOrLog((i,a)=>{let o=collectFqnExprs(i.targets);o.length<2&&i.value===`same`&&a(`warning`,`Rank rule should have at least 2 targets`,{node:i,property:`targets`});let s=o.filter(isFqnRefExpr),c=s[0]?.ref?.parent;for(let o=1;o<s.length;o++){let l=s[o];i.value===`same`&&!areSame(c,l?.ref?.parent)&&a(`error`,`All targets must have the same parent rank same`,{node:i,property:`targets`})}});function areSame(i,a){return!i&&!a?!0:!i||!a||i.value.ref!==a.value.ref?!1:areSame(i.parent,a.parent)}const checkFqnExprWith=i=>{let a=i.likec4.ModelParser;return tryOrLog((i,o)=>{let s=getViewRulePredicateContainer(i);if(s?.$type!==`DynamicViewIncludePredicate`&&s?.isInclude!==!0){o(`error`,`Invalid usage inside "exclude"`,{node:i});return}let c=s.$type===`DynamicViewIncludePredicate`,l=a.forDocument(AstUtils.getDocument(s)),u=FqnExpr$1.unwrap(l.parseFqnExprWith(i).custom.expr);switch(!0){case FqnExpr$1.isWildcard(u)&&c:case FqnExpr$1.isElementKindExpr(u)&&c:case FqnExpr$1.isElementTagExpr(u)&&c:o(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:i});return;case FqnExpr$1.isWildcard(u):case FqnExpr$1.isModelRef(u):case FqnExpr$1.isDeploymentRef(u):return;case FqnExpr$1.isElementKindExpr(u):case FqnExpr$1.isElementTagExpr(u):o(`error`,`Invalid target (expect reference to specific element)`,{node:i,property:`subject`});return;default:nonexhaustive(u)}})},checkFqnRefExpr=i=>{let a=i.likec4.ModelParser;return tryOrLog((i,o)=>{let s=a.forDocument(AstUtils.getDocument(i)).parseFqnRefExpr(i),c=getViewRulePredicateContainer(i),l=isFqnRefInsideDeployment(i)&&!AstUtils.hasContainerOfType(i,i=>isDeploymentViewRuleStyle(i)||isViewRuleStyle(i));if(c?.$type===`DeploymentViewRulePredicate`||l){if(!AstUtils.hasContainerOfType(i,isRelationExpr)){if(FqnExpr$1.isModelRef(s)){o(`error`,`Deployment view predicate must reference deployment model`,{node:i});return}if(FqnExpr$1.isDeploymentRef(s)&&FqnRef$1.isInsideInstanceRef(s.ref)){o(`error`,`Must reference deployment nodes or instances, but not internals`,{node:i});return}}e$1(i.selector)&&!isDeploymentNode$1(i.ref.value?.ref)&&o(`warning`,`Selector '${i.selector}' applies to deployment nodes only, ignored here`,{node:i,property:`selector`});return}if(c?.$type===`DynamicViewIncludePredicate`)switch(!0){case FqnExpr$1.isElementKindExpr(s):case FqnExpr$1.isElementTagExpr(s):case FqnExpr$1.isWildcard(s):o(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:i});return}})},checkIncomingRelationExpr=i=>tryOrLog((i,a)=>{i.to.$type===`WildcardExpression`&&!isInOutRelationExpr(i.$container)&&e(AstUtils.getContainerOfType(i,isElementView$1)?.viewOf)&&a(`warning`,`Predicate is ignored as it concerns all relationships`,{node:i})}),checkOutgoingRelationExpr=i=>tryOrLog((i,a)=>{if(getViewRulePredicateContainer(i)?.$type===`ViewRulePredicate`&&i.$container.$type!==`DirectedRelationExpr`&&i.from.$type===`WildcardExpression`){let o=AstUtils.getContainerOfType(i,isElementView$1);o&&e(o.viewOf)&&a(`warning`,`Predicate is ignored as it concerns all relationships`,{node:i})}}),checkRelationExpr=i=>{let a=i.likec4.ModelParser;return tryOrLog((i,o)=>{let s=AstUtils.getContainerOfType(i,isDeploymentViewRulePredicate);if(!s||s.isInclude!==!0)return;let c=AstUtils.getDocument(i),l=a.forDocument(c),u=RelationExpr.unwrap(l.parseRelationExpr(i)),d=`Model reference is allowed in exclude predicate only`;if(RelationExpr.isDirect(u)){(FqnExpr.isModelRef(u.source)||FqnExpr.isModelRef(u.target))&&o(`error`,d,{node:i});return}let f;if(f=RelationExpr.isIncoming(u)?u.incoming:RelationExpr.isOutgoing(u)?u.outgoing:u.inout,FqnExpr.isModelRef(f)){o(`error`,d,{node:i});return}})},checkRelationExprWith=i=>tryOrLog((i,a)=>{let o=getViewRulePredicateContainer(i);if(!(!o||o.$type==`DynamicViewIncludePredicate`)&&!o.isInclude){a(`error`,`Invalid usage inside "exclude"`,{node:i});return}});var LikeC4DocumentValidator=class extends DefaultDocumentValidator{constructor(i){super(i),this.services=i}async validateDocument(i,a,o){return this.services.shared.workspace.ProjectsManager.isExcluded(i)?[]:await super.validateDocument(i,a,o)}};const isValidatableAstNode=isAnyOf$1(isImportsFromPoject,isImported,isGlobals,isGlobalPredicateGroup,isGlobalDynamicPredicateGroup,isGlobalStyle,isGlobalStyleGroup,isFqnExprWith,isRelationExprWith,isFqnExpr,isRelationExpr,isDynamicViewParallelSteps,isDynamicStepChain,isDynamicStepSingle,isDeploymentViewRule,isDeploymentViewRulePredicate,isExpressionV2,isRelationExpr,isFqnRefExpr,isViewProperty,isStyleProperty,isTags,isViewRule,isDynamicViewRule,isLikeC4View,isViewRuleStyleOrGlobalRef,isDeployedInstance,isDeploymentNode$1,isDeploymentRelation,isRelationshipStyleProperty,isDynamicViewDisplayVariantProperty,isMetadataBody,isMetadataProperty,isRelation,isRelationBody,isElementProperty,isStringProperty,isNavigateToProperty,isElement,isElementBody,isElementStyleProperty,isElementRef,isExtendElement,isExtendElementBody,isExtendDeployment,isExtendDeploymentBody,isExtendRelation,isExtendRelationBody,isSpecificationElementKind,isSpecificationRelationshipKind,isSpecificationDeploymentNodeKind,isSpecificationTag,isSpecificationColor,isSpecificationRule,isExpressions,isColorLiteral),findInvalidContainer=i=>{let a=i;for(;a&&!isLikeC4Grammar(a);){if(isValidatableAstNode(a))return a;a=a.$container}};function checksFromDiagnostics(i){let a=i.state>=DocumentState.Validated?i.diagnostics?.filter(i=>i.severity===DiagnosticSeverity.Error)??[]:[],o=new WeakSet;for(let{node:i}of a){if(e(i)||o.has(i))continue;o.add(i);let a=findInvalidContainer(i);a&&o.add(a)}return{isValid:i=>!o.has(i),invalidNodes:o}}function registerValidationChecks(i){logger$9.debug(`registerValidationChecks`),i.validation.ValidationRegistry.register({DeployedInstance:deployedInstanceChecks(i),DeploymentNodeKind:checkDeploymentNodeKind(i),DeploymentNode:deploymentNodeChecks(i),DeploymentRelation:deploymentRelationChecks(i),ExtendDeployment:extendDeploymentChecks(i),ExtendRelation:extendRelationChecks(i),FqnRefExpr:checkFqnRefExpr(i),RelationExpr:checkRelationExpr(i),OpacityProperty:opacityPropertyRuleChecks(i),IconProperty:iconPropertyRuleChecks(i),SpecificationRule:checkSpecificationRule(i),Model:checkModel(i),Globals:checkGlobals(i),GlobalPredicateGroup:checkGlobalPredicate(i),GlobalDynamicPredicateGroup:checkGlobalPredicate(i),GlobalStyleId:checkGlobalStyleId(i),DynamicStepSingle:dynamicViewStepSingle(i),DynamicStepChain:dynamicViewStepChain(i),LikeC4View:viewChecks(i),Element:checkElement(i),ElementRef:checkElementRef(i),ElementKind:checkElementKind(i),Relation:relationChecks(i),RelationBody:checkRelationBody(i),Tag:checkTag(i),FqnExprWith:checkFqnExprWith(i),RelationExprWith:checkRelationExprWith(i),RelationshipKind:checkRelationshipKind(i),IncomingRelationExpr:checkIncomingRelationExpr(i),OutgoingRelationExpr:checkOutgoingRelationExpr(i),ImportsFromPoject:checkImportsFromPoject(i),ColorLiteral:colorLiteralRuleChecks(i),DynamicViewDisplayVariantProperty:dynamicViewDisplayVariant(i),ViewRuleRank:viewRuleRankChecks(i)});let a=i.shared.lsp.Connection;a&&onNextTick(()=>{i.shared.workspace.DocumentBuilder.onUpdate((i,o)=>{for(let i of o)logger$9.debug(`clear diagnostics for deleted ${i.path}`),a.sendDiagnostics({uri:i.toString(),diagnostics:[]}).catch(i=>logger$9.error(loggable(i)))})})}const logger$4=logger$9.getChild(`parser`);function toSingleLine(i){if(i==null)return;let a=removeIndent(i);return e$8(a)?a.split(`
24
- `).join(` `):`md`in a?{md:a.md.split(`
25
- `).join(` `)}:{txt:a.txt.split(`
26
- `).join(` `)}}function removeIndent(i){if(i!=null)switch(!0){case e$8(i):return dedent(i).trim();case isMarkdownOrString(i)&&e$8(i.markdown):return{md:dedent(i.markdown).trim()};case isMarkdownOrString(i)&&e$8(i.text):return{txt:dedent(i.text).trim()};case isMarkdownOrString(i):return{txt:``};default:return}}var BaseParser=class{isValid;constructor(i,a,o){this.services=i,this.doc=a,this.project=o,this.isValid=checksFromDiagnostics(a).isValid}logError(i,a,o){let s=i instanceof Error?i.message:typeof i==`string`?i:String(i);if(isAstNode(a)){let i=this.services.references.NameProvider.getName(a);i=i?`"${i}" (${a.$type})`:`${a.$type}`;let o=a.$cstNode,c=o?`:${o.range.start.line+1}:${o.range.start.character+1}`:``;s+=`\n\tat ${i} (${this.doc.uri.fsPath}${c})`}else a&&`$refText`in a&&(s+=`\n\tat reference "${a.$refText}" (${this.doc.uri.fsPath})`);o&&o!==`base`?logger$4.getChild(o).debug(s):logger$4.debug(s)}tryParse(i,a,o){try{return!a||!this.isValid(a)?void 0:o(a)}catch(o){this.logError(o,a,i);return}}tryMap(i,a,o){return t$7(a,a=>this.tryParse(i,a,o)??[])}resolveFqn(i){if(isImported(i)){let a=projectIdFrom(i),o=this.resolveFqn(nonNullable$1(i.imported.ref,`FqnRef is empty of imported: ${i.$cstNode?.text}`));return this.doc.c4Imports.set(a,o),GlobalFqn(a,o)}return isExtendElement(i)?readStrictFqn(i.element):isExtendDeployment(i)?readStrictFqn(i.deploymentNode):isDeploymentElement(i)?this.services.likec4.DeploymentsIndex.getFqn(i):this.services.likec4.FqnIndex.getFqn(i)}getAstNodePath(i){return this.services.workspace.AstNodeLocator.getAstNodePath(i)}getMetadata(i){if(!i||!this.isValid(i)||e$3(i.props))return;let extractValues=i=>{if(isMarkdownOrString(i)){let a=removeIndent(i);if(!a)return[];if(typeof a==`string`)return e$1(a)?[a]:[];{let i=a.md||a.txt;return e$1(i)?[i]:[]}}else if(isMetadataArray(i))return i.values.map(i=>removeIndent(i)).map(i=>typeof i==`string`?i:i.md||i.txt).filter(e$1);return[]},a=t$1(i.props,t$7(i=>extractValues(i.value).map(a=>[i.key,a])),n(([i,a])=>e$1(a)));if(e$3(a))return;let o=t$1(a,t$3(([i])=>i),t$10(i=>i.map(([i,a])=>a))),s={};for(let[i,a]of Object.entries(o))a&&a.length>0&&(s[i]=a.length===1?a[0]:a);return e$3(s)?void 0:s}parseMarkdownOrString(i){if(isMarkdownOrString(i))return removeIndent(i)}convertTags(i){return this.parseTags(i)}parseTags(i){let a=i?.tags;if(!a)return null;let o=[];for(;a;)o.push(...this.tryMap(`base`,a.values,i=>nonNullable$1(i.tag.ref,`Tag reference is not resolved`).name).filter(e$1)),a=a.prev;return isNonEmptyArray$1(o)?n$2(o):null}convertLinks(i){return this.parseLinks(i)}parseLinks(i){if(!i?.props||i.props.length===0)return;let a=this.tryMap(`base`,n(i.props,isLinkProperty),i=>{let a=i.value;if(e$5(a))return;let o=e$1(i.title)?toSingleLine(i.title):void 0,s=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,a);return exact({url:a,title:o,relative:s&&s!==a?s:void 0})});return isNonEmptyArray$1(a)?a:void 0}parseIconProperty(i){if(!i||!this.isValid(i))return;let{libicon:a,value:o}=i;switch(!0){case!!a:{let o=a.ref?.name;if(!o){this.logError(`Library icon ${a.$refText} is not a valid library icon`,i);return}return o}case o&&o===`none`:return o;case o&&hasProtocol(o):if(o.startsWith(`file:`)){this.logError(`Icon property '${o}' used the 'file' protocol which is not supported`,i);return}return o;case o&&o.startsWith(`@`):return this.parseImageAlias(o);case o&&isRelative(o):return joinRelativeURL(this.doc.uri.toString(),`../`,o);case o&&hasLeadingSlash(o):return joinURL(this.project.folderUri.toString(),o);default:this.logError(`Icon property '${o}' is not a valid URL, library icon, image alias or 'none'`,i);return}}parseImageAlias(i){let a=i.indexOf(`/`),o=a>0?i.substring(0,a):i,s=a>0?i.substring(a+1):``,c={"@":`./images`,...this.project.config.imageAliases}[o];if(!c){logger$4.warn(`Image alias "${o}" not found in project configuration`);return}let l=s?joinURL(c,s):c;return joinURL(this.project.folderUri.toString(),l)}parseColorLiteral(i){if(this.isValid(i)){if(isHexColor(i))return`#${i.hex}`;if(isRGBAColor(i)){let a=e$10(i.alpha)?i.alpha:void 0;return e$8(i.alpha)&&(a=parseAstPercent(i.alpha)/100),a===void 0?`rgb(${i.red},${i.green},${i.blue})`:`rgba(${i.red},${i.green},${i.blue},${a})`}nonexhaustive$1(i)}}parseElementStyle(i){if(!i)return{};if(e$11(i)){let a=this.parseStyleProps(i.find(isElementStyleProperty)?.props);try{let o=this.parseIconProperty(i.find(isIconProperty));o&&(a.icon=o)}catch(i){this.logError(i)}return a}return this.parseStyleProps(i.props)}parseStyleProps(i){let a={};if(!i||i.length===0)return a;for(let o of i)if(this.isValid(o))try{switch(!0){case isBorderProperty(o):e$1(o.value)&&(a.border=o.value);break;case isColorProperty(o):{let i=toColor(o);e$1(i)&&(a.color=i);break}case isShapeProperty(o):e$1(o.value)&&(a.shape=o.value);break;case isIconProperty(o):{let i=this.parseIconProperty(o);e$1(i)&&(a.icon=i);break}case isIconColorProperty(o):{let i=toColor(o);e$1(i)&&(a.iconColor=i);break}case isIconSizeProperty(o):e$1(o.value)&&(a.iconSize=parseAstSizeValue(o));break;case isIconPositionProperty(o):e$1(o.value)&&(a.iconPosition=parseAstIconPositionValue(o));break;case isOpacityProperty(o):a.opacity=parseAstOpacityProperty(o);break;case isMultipleProperty(o):a.multiple=e$12(o.value)?o.value:!1;break;case isShapeSizeProperty(o):e$1(o.value)&&(a.size=parseAstSizeValue(o));break;case isPaddingSizeProperty(o):e$1(o.value)&&(a.padding=parseAstSizeValue(o));break;case isTextSizeProperty(o):e$1(o.value)&&(a.textSize=parseAstSizeValue(o));break;default:nonexhaustive$1(o)}}catch(i){this.logError(i,o)}return exact(a)}parseBaseProps(i,a){let o=removeIndent(a?.title??parseMarkdownAsString(i.title)),s=a?.description?{txt:removeIndent(a.description)}:this.parseMarkdownOrString(i.description);return exact({title:o,summary:a?.summary?{txt:removeIndent(a.summary)}:this.parseMarkdownOrString(i.summary),description:s,technology:toSingleLine(a?.technology)??removeIndent(parseMarkdownAsString(i.technology))})}};function*streamDeploymentModel(i){let a=LinkedList.from(i.parseResult.value.deployments.flatMap(i=>i.elements)),o=[],s;for(;s=a.shift();){if(isDeploymentRelation(s)){o.push(s);continue}if(s.body&&s.body.elements.length>0)for(let i of s.body.elements)a.push(i);yield s}yield*o}function DeploymentModelParser(i){return class extends i{parseDeployment(){let i=this.doc;for(let a of streamDeploymentModel(i))try{switch(!0){case isDeploymentRelation(a):this.isValid(a)&&i.c4DeploymentRelations.push(this.parseDeploymentRelation(a));break;case isDeployedInstance(a):i.c4Deployments.push(this.parseDeployedInstance(a));break;case isDeploymentNode$1(a):i.c4Deployments.push(this.parseDeploymentNode(a));break;case isExtendDeployment(a):{let o=this.parseExtendDeployment(a);o&&i.c4ExtendDeployments.push(o);break}default:nonexhaustive$1(a)}}catch(i){this.logError(i,a,`deployment`)}}parseDeploymentNode(i){let a=this.isValid,o=this.resolveFqn(i),s=nonNullable$1(i.kind.ref,`DeploymentKind not resolved`).name,c=this.parseTags(i.body)??void 0,l=this.parseLinks(i.body),u=this.parseElementStyle(i.body?.props),d=this.getMetadata(i.body?.props.find(isMetadataProperty)),f=t$1(i.body?.props??[],n(a),n(isElementStringProperty),t$17(i=>[i.key,i.value])),{title:p,...m}=this.parseBaseProps(f,{title:i.title,summary:i.summary});return exact({id:o,kind:s,title:p??nameFromFqn$1(o),...m,tags:c,links:l,style:u,metadata:d})}parseDeployedInstance(i){let a=this.isValid,o=this.resolveFqn(i),s=this.parseFqnRef(i.target.modelElement);invariant$1(FqnRef.isModelRef(s)||FqnRef.isImportRef(s),`Target must be a model reference`);let c=this.parseTags(i.body)??void 0,l=this.parseElementStyle(i.body?.props),u=this.getMetadata(i.body?.props.find(isMetadataProperty)),d=t$1(i.body?.props??[],n(a),n(isElementStringProperty),t$17(i=>[i.key,i.value])),f=this.parseBaseProps(d,{title:i.title,summary:i.summary});return exact({id:o,element:s,tags:c,links:this.parseLinks(i.body),...f,style:l,metadata:u})}parseExtendDeployment(i){let a=this.parseTags(i.body),o=this.getMetadata(i.body?.props.find(isMetadataProperty)),s=this.parseLinks(i.body);return!a&&e$3(o??{})&&!s?null:exact({id:this.resolveFqn(i),astPath:this.getAstNodePath(i),metadata:o,tags:a,links:s})}_resolveDeploymentRelationSource(i){if(e$6(i.source))return this.parseFqnRef(i.source);if(i.$container.$type===`DeploymentNodeBody`||i.$container.$type===`DeployedInstanceBody`)return{deployment:this.resolveFqn(i.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseDeploymentRelation(i){let a=this.isValid,o=this.getAstNodePath(i),s=this._resolveDeploymentRelationSource(i);invariant$1(FqnRef.isDeploymentRef(s),`Invalid source for deployment relation`);let c=this.parseFqnRef(i.target);invariant$1(FqnRef.isDeploymentRef(c),`Invalid target for deployment relation`);let l=this.convertTags(i)??this.convertTags(i.body)??void 0,u=this.convertLinks(i.body),d=(i.kind??i.dotKind?.kind)?.ref?.name,f=this.getMetadata(i.body?.props.find(isMetadataProperty)),p=t$1(i.body?.props??[],n(isRelationStringProperty),n(i=>e$1(i.value)),t$17(i=>[i.key,i.value])),m=t$1(i.body?.props??[],n(isRelationNavigateToProperty),n$3())?.value.view.ref?.name,h=this.parseBaseProps(p,{title:i.title}),g=i.body?.props.find(isRelationStyleProperty);return exact({id:stringHash$1(`deployment`,o,s.deployment,c.deployment),source:s,target:c,...h,metadata:f,kind:d,tags:l,links:u,...toRelationshipStyle(g?.props,a),navigateTo:m,astPath:o})}}}function DeploymentViewParser(i){return class extends i{parseDeploymentView(i){let a=i.body;invariant$1(a,`DynamicElementView body is not defined`);let o=a.props.filter(this.isValid),s=this.getAstNodePath(i),c=i.name;c||=`deployment_`+stringHash$1(this.doc.uri.toString(),s);let{title:l=null,description:u=null}=this.parseBaseProps(t$1(o,n(isViewStringProperty),t$17(i=>[i.key,i.value]))),d=this.convertTags(a),f=this.convertLinks(a);ViewOps.writeId(i,c);let p=parseViewManualLayout(i);return{[c4._type]:`deployment`,id:c,astPath:s,title:toSingleLine(l)??null,description:u,tags:d,links:isNonEmptyArray$1(f)?f:null,rules:this.tryMap(`deployment`,a.rules,i=>this.parseDeploymentViewRule(i)),...p&&{manualLayout:p}}}parseDeploymentViewRule(i){if(isDeploymentViewRulePredicate(i))return this.parseDeploymentViewRulePredicate(i);if(isViewRuleAutoLayout(i))return toAutoLayout(i);if(isDeploymentViewRuleStyle(i))return this.parseDeploymentViewRuleStyle(i);nonexhaustive$1(i)}parseDeploymentViewRulePredicate(i){let a=[],o=i.expr;for(;o;){try{let i=o.value;e$4(i)&&this.isValid(i)&&a.unshift(this.parseExpressionV2(i))}catch(i){logWarnError(i)}o=o.prev}return i.isInclude?{include:a}:{exclude:a}}parseDeploymentViewRuleStyle(i){let a=this.parseStyleProps(i.props.filter(isStyleProperty)),o=removeIndent(parseMarkdownAsString(i.props.find(isNotationProperty)?.value));return{targets:this.parseFqnExpressions(i.targets),style:a,...o&&{notation:o}}}}}const parseEquals=({operator:i,not:a},o)=>i.startsWith(`!=`)?{neq:o}:i.startsWith(`=`)?{eq:o}:a?{neq:o}:{eq:o};function parseParticipant(i){return!isWhereRelationParticipantKind(i)&&!isWhereRelationParticipantTag(i)?null:i.participant}function parseWhereClause(i){switch(!0){case isWhereTagEqual(i):{let a=i.value.tag.ref?.name,o=parseParticipant(i);invariant$1(a,`Expected tag name`);let s={tag:parseEquals(i,a)};return o?{participant:o,operator:s}:s}case isWhereKindEqual(i):{let a=i.value?.ref?.name,o=parseParticipant(i);invariant$1(a,`Expected kind name`);let s={kind:parseEquals(i,a)};return o?{participant:o,operator:s}:s}case isWhereElementNegation(i)||isWhereRelationNegation(i):return{not:parseWhereClause(i.value)};case isWhereBinaryExpression(i):{let a=parseWhereClause(i.left),o=parseWhereClause(i.right);return createBinaryOperator(i.operator.toLowerCase(),a,o)}default:nonexhaustive$1(i)}}function createBinaryOperator(i,a,o){if(o===null)return a;switch(i){case`and`:{let i=[isAndOperator(a)?a.and:a,isAndOperator(o)?o.and:o].flat();return invariant$1(isNonEmptyArray$1(i),`Expected non-empty array`),{and:i}}case`or`:{let i=[isOrOperator(a)?a.or:a,isOrOperator(o)?o.or:o].flat();return invariant$1(isNonEmptyArray$1(i),`Expected non-empty array`),{or:i}}default:nonexhaustive$1(i)}}function ExpressionV2Parser(i){return class extends i{parseFqnRef(i){let a=nonNullable$1(i.value?.ref,()=>`Element "${i.$cstNode?.text}" is not resolved`);if(isImported(a)){let i={project:projectIdFrom(a),model:this.resolveFqn(nonNullable$1(a.imported.ref,`Imported "${a.$cstNode?.text}" is not resolved`))};return this.doc.c4Imports.set(i.project,i.model),i}if(isElement(a)){let o=importsRef(i);if(o){let i={project:projectIdFrom(o),model:this.resolveFqn(a)};return this.doc.c4Imports.set(i.project,i.model),i}let s=instanceRef(i);return s?{deployment:this.resolveFqn(s),element:this.resolveFqn(a)}:{model:this.resolveFqn(a)}}if(isDeploymentElement(a))return{deployment:this.resolveFqn(a)};nonexhaustive$1(a)}parseExpressionV2(i){if(isFqnExprOrWith(i))return this.parseFqnExprOrWith(i);if(isRelationExprOrWith(i))return this.parseRelationExprOrWith(i);nonexhaustive$1(i)}parseFqnExprOrWith(i){if(isFqnExprWith(i))return this.parseFqnExprWith(i);if(isFqnExprOrWhere(i))return this.parseFqnExprOrWhere(i);nonexhaustive$1(i)}parseFqnExprWith(i){let a=this.parseFqnExprOrWhere(i.subject);return(i.custom?.props??[]).reduce((i,a)=>{if(!this.isValid(a))return i;if(isNavigateToProperty(a)){let o=a.value.view.$refText;return e$1(o)&&(i.custom.navigateTo=o),i}if(isNotesProperty(a)){let o=this.parseMarkdownOrString(a.value);return o&&(i.custom[a.key]=o),i}if(isElementStringProperty(a)){if(a.key===`description`||a.key===`summary`){let o=this.parseMarkdownOrString(a.value);return o&&(i.custom.description=o),i}let o=removeIndent(parseMarkdownAsString(a.value));return o&&(i.custom[a.key]=o),i}if(isIconProperty(a)){let o=this.parseIconProperty(a);return e$6(o)&&(i.custom[a.key]=o),i}if(isColorProperty(a)){let o=toColor(a);return e$6(o)&&(i.custom[a.key]=o),i}if(isShapeProperty(a)||isBorderProperty(a))return e$6(a.value)&&(i.custom[a.key]=a.value),i;if(isOpacityProperty(a))return e$6(a.value)&&(i.custom[a.key]=parseAstOpacityProperty(a)),i;if(isIconColorProperty(a)){let o=toColor(a);return e$6(o)&&(i.custom[a.key]=o),i}if(isNotationProperty(a)){let o=e$1(a.value)?removeIndent(parseMarkdownAsString(a.value)):void 0;return o&&(i.custom[a.key]=o),i}if(isMultipleProperty(a))return e$12(a.value)&&(i.custom[a.key]=a.value),i;if(isShapeSizeProperty(a)||isTextSizeProperty(a)||isPaddingSizeProperty(a)||isIconSizeProperty(a))return e$1(a.value)&&(i.custom[a.key]=parseAstSizeValue(a)),i;if(isIconPositionProperty(a))return e$1(a.value)&&(i.custom[a.key]=a.value),i;nonexhaustive$1(a)},{custom:{expr:a}})}parseFqnExprOrWhere(i){if(isFqnExprWhere(i))return this.parseFqnExprWhere(i);if(isFqnExpr(i))return this.parseFqnExpr(i);nonexhaustive$1(i)}parseFqnExprWhere(i){return invariant$1(!isFqnExprWhere(i.subject),`FqnExprWhere is not allowed as subject of FqnExprWhere`),{where:{expr:this.parseFqnExpr(i.subject),condition:i.where?parseWhereClause(i.where):{kind:{neq:`--always-true--`}}}}}parseFqnExpr(i){if(isWildcardExpression(i))return{wildcard:!0};if(isElementKindExpression(i))return invariant$1(i.kind?.ref,`ElementKind "${i.$cstNode?.text}" is not resolved`),{elementKind:i.kind.ref.name,isEqual:i.isEqual};if(isElementTagExpression(i))return invariant$1(i.tag.tag.ref,`Tag ${i.$cstNode?.text} is not resolved`),{elementTag:i.tag.tag.$refText,isEqual:i.isEqual};if(isFqnRefExpr(i))return this.parseFqnRefExpr(i);nonexhaustive$1(i)}parseFqnRefExpr(i){let a=this.parseFqnRef(i.ref);switch(!0){case i.selector===`._`:return{ref:a,selector:`expanded`};case i.selector===`.**`:return{ref:a,selector:`descendants`};case i.selector===`.*`:return{ref:a,selector:`children`};default:return{ref:a}}}parseFqnExpressions(i){let a=[],o=i;for(;o;){try{e$4(o.value)&&this.isValid(o.value)&&a.push(this.parseFqnExpr(o.value))}catch(i){this.logError(i,o.value,`fqnref`)}o=o.prev}return a.reverse()}parseRelationExprOrWith(i){if(isRelationExprWith(i))return this.parseRelationExprWith(i);if(isRelationExprOrWhere(i))return this.parseRelationExprOrWhere(i);nonexhaustive$1(i)}parseRelationExprWith(i){let a=this.parseRelationExprOrWhere(i.subject);return{customRelation:{...this.parseCustomRelationProperties(i.custom),expr:a}}}parseCustomRelationProperties(i){return(i?.props??[]).reduce((i,a)=>{if(isNotesProperty(a)){let o=this.parseMarkdownOrString(a.value);return o&&(i[a.key]=o),i}if(isRelationStringProperty(a)||isNotationProperty(a)){if(a.key===`description`){let o=this.parseMarkdownOrString(a.value);return o&&(i.description=o),i}let o=removeIndent(parseMarkdownAsString(a.value));return o&&(i[a.key]=o),i}if(isArrowProperty(a))return e$1(a.value)&&(i[a.key]=a.value),i;if(isColorProperty(a)){let o=toColor(a);return e$1(o)&&(i[a.key]=o),i}if(isLineProperty(a))return e$1(a.value)&&(i[a.key]=a.value),i;if(isRelationNavigateToProperty(a)){let o=a.value.view.ref?.name;return e$1(o)&&(i[a.key]=o),i}nonexhaustive$1(a)},{})}parseRelationExprOrWhere(i){if(isRelationExprWhere(i))return this.parseRelationExprWhere(i);if(isRelationExpr(i))return this.parseRelationExpr(i);nonexhaustive$1(i)}parseRelationExprWhere(i){invariant$1(!isRelationExprWhere(i.subject),`RelationExprWhere is not allowed as subject of RelationExprWhere`);let a=this.parseRelationExpr(i.subject),o=a.where?.expr??a,s=a.where?.condition,c=i.where?parseWhereClause(i.where):null,l;return l=c&&s?createBinaryOperator(`and`,s,c):c??s??{kind:{neq:`--always-true--`}},{where:{expr:o,condition:l}}}parseRelationExpr(i){switch(i.$type){case`DirectedRelationExpr`:return this.wrapInWhere({source:this.parseFqnExpr(i.source.from),target:this.parseFqnExpr(i.target),isBidirectional:i.source.isBidirectional},this.parseInlineKindCondition(i.source));case`InOutRelationExpr`:return{inout:this.parseFqnExpr(i.inout.to)};case`OutgoingRelationExpr`:return this.wrapInWhere({outgoing:this.parseFqnExpr(i.from)},this.parseInlineKindCondition(i));case`IncomingRelationExpr`:return{incoming:this.parseFqnExpr(i.to)};default:nonexhaustive$1(i)}}parseInlineKindCondition(i){let a=i.kind??i.dotKind?.kind;return a?a.ref?{kind:{eq:a.ref?.name}}:(this.logError(`RelationshipKind "${a.$refText}" is not resolved`,i,`fqnref`),null):null}wrapInWhere(i,a){return a?{where:{expr:i,condition:a}}:i}}}function GlobalsParser(i){return class extends i{parseGlobals(){let{parseResult:i,c4Globals:a}=this.doc,o=this.isValid,s=i.value.globals.filter(o),c=s.flatMap(i=>i.predicates.filter(o));for(let i of c)try{let o=i.name;if(!e$1(o))continue;if(o in a.predicates){this.logError(`Global predicate named "${o}" is already defined`,i,`globals`);continue}this.parseAndStoreGlobalPredicateGroupOrDynamic(i,o,a)}catch(a){this.logError(a,i,`globals`)}let l=s.flatMap(i=>i.styles.filter(o));for(let i of l)try{let o=i.id.name;if(!e$1(o))continue;if(o in a.styles){this.logError(`Global style named "${o}" is already defined`,i,`globals`);continue}let s=this.parseGlobalStyleOrGroup(i);t$4(s,1)&&(a.styles[o]=s)}catch(a){this.logError(a,i,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(i,a,o){if(isGlobalPredicateGroup(i)){let s=this.parseGlobalPredicateGroup(i);t$4(s,1)&&(o.predicates[a]=s);return}if(isGlobalDynamicPredicateGroup(i)){let s=this.parseGlobalDynamicPredicateGroup(i);t$4(s,1)&&(o.dynamicPredicates[a]=s);return}nonexhaustive$1(i)}parseGlobalPredicateGroup(i){return i.predicates.map(i=>this.parseViewRulePredicate(i))}parseGlobalDynamicPredicateGroup(i){return i.predicates.map(i=>this.parseDynamicViewIncludePredicate(i))}parseGlobalStyleOrGroup(i){if(isGlobalStyle(i))return[this.parseViewRuleStyle(i)];if(isGlobalStyleGroup(i))return i.styles.map(i=>this.parseViewRuleStyle(i));nonexhaustive$1(i)}}}function ImportsParser(i){return class extends i{parseImports(){let i=this.doc.parseResult.value.imports??[];for(let a of i){let i=a.project,o=a.imports;for(;o;){try{this.doc.c4Imports.set(i,this.resolveFqn(nonNullable$1(o.imported.ref,`ElementRef is empty of imported: ${o.imported.$refText}`)))}catch(i){this.logError(i,o,`imports`)}o=o.prev}}}}}function*streamModel(i){let a=LinkedList.from(i.parseResult.value.models.flatMap(i=>i.elements)),o=[],s;for(;s=a.shift();){if(isRelation(s)){o.push(s);continue}if(isExtendRelation(s)){o.push(s);continue}if(s.body?.elements&&t$4(s.body.elements,1))for(let i of s.body.elements)a.push(i);yield s}yield*o}function ModelParser(i){return class extends i{parseModel(){let i=this.doc;for(let a of streamModel(i))try{if(isElement(a)){i.c4Elements.push(this.parseElement(a));continue}if(isRelation(a)){i.c4Relations.push(this.parseRelation(a));continue}if(isExtendElement(a)){let o=this.parseExtendElement(a);o&&i.c4ExtendElements.push(o);continue}if(isExtendRelation(a)){let o=this.parseExtendRelation(a);o&&i.c4ExtendRelations.push(o);continue}nonexhaustive$1(a)}catch(i){this.logError(i,a,`model`)}}parseElement(i){let a=this.isValid,o=this.resolveFqn(i),s=nonNullable$1(i.kind.ref,`Element kind is not resolved`).name,c=this.parseTags(i.body),l=this.parseElementStyle(i.body?.props),u=this.getMetadata(i.body?.props.find(isMetadataProperty)),d=this.getAstNodePath(i),[f,p,m]=i.props??[],h=t$1(i.body?.props??[],n(a),n(isElementStringProperty),t$17(i=>[i.key,i.value])),{title:g,..._}=this.parseBaseProps(h,{title:f,summary:p,technology:m});return exact$1({id:o,kind:s,astPath:d,title:g,metadata:u,tags:c??void 0,links:this.parseLinks(i.body),..._,style:l})}parseExtendElement(i){let a=this.parseTags(i.body),o=this.getMetadata(i.body?.props.find(isMetadataProperty)),s=this.parseLinks(i.body);if(!a&&e$5(o)&&!s)return null;let c=this.getAstNodePath(i);return exact$1({id:this.resolveFqn(i),astPath:c,metadata:o,tags:a,links:s})}parseExtendRelation(i){let a=this.parseFqnRef(i.source),o=this.parseFqnRef(i.target);invariant$1(FqnRef$1.isModelRef(a)||FqnRef$1.isImportRef(a),`Source must be a model reference`),invariant$1(FqnRef$1.isModelRef(o)||FqnRef$1.isImportRef(o),`Target must be a model reference`);let s=this.parseTags(i.body),c=this.getMetadata(i.body?.props.find(isMetadataProperty)),l=this.getAstNodePath(i),u=this.parseLinks(i.body);if(!s&&e$3(c??{})&&!u)return null;let d=(i.kind??i.dotKind?.kind)?.ref?.name,{title:f=``}=this.parseBaseProps({},{title:i.title});return exact$1({id:stringHash$1(`extend-relation`,FqnRef$1.flatten(a),FqnRef$1.flatten(o),d??`default`,f),astPath:l,metadata:c,tags:s,links:u})}_resolveRelationSource(i){if(e$6(i.source)){let a=this.parseFqnRef(i.source);return invariant$1(FqnRef$1.isModelRef(a)||FqnRef$1.isImportRef(a),`Relation source must be a model reference`),a}if(isElementBody(i.$container)||isExtendElementBody(i.$container))return{model:this.resolveFqn(i.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseRelation(i){let a=this.isValid,o=this._resolveRelationSource(i),s=this.parseFqnRef(i.target);invariant$1(FqnRef$1.isModelRef(s)||FqnRef$1.isImportRef(s),`Target must be a model reference`);let c=this.parseTags(i)??this.parseTags(i.body)??void 0,l=this.parseLinks(i.body),u=(i.kind??i.dotKind?.kind)?.ref?.name,d=this.getMetadata(i.body?.props.find(isMetadataProperty)),f=this.getAstNodePath(i),p=t$1(i.body?.props??[],n(isRelationStringProperty),n(i=>e$1(i.value)),t$17(i=>[i.key,i.value])),m=t$1(i.body?.props??[],n(isRelationNavigateToProperty),t$2(i=>i.value.view.ref?.name),n(e$1),n$3()),{title:h=``,description:g,technology:_}=this.parseBaseProps(p,{title:i.title,description:i.description,technology:i.technology}),v=i.body?.props.find(isRelationStyleProperty);return exact$1({id:stringHash$1(f,o.model,s.model),astPath:f,source:o,target:s,title:h,metadata:d,kind:u,tags:c,links:l,navigateTo:m,description:g,technology:_,...toRelationshipStyle(v?.props,a)})}}}function PredicatesParser(i){return class extends i{parsePredicate(i){return this.parseExpressionV2(i)}parseElementPredicate(i){if(isFqnExprWith(i))return this.parseFqnExprWith(i);if(isFqnExprOrWhere(i))return this.parseFqnExprOrWhere(i);nonexhaustive$1(i)}parseElementPredicateOrWhere(i){return this.parseFqnExprOrWhere(i)}parseElementExpression(i){return this.parseFqnExpr(i)}parseElementPredicateWhere(i){return this.parseFqnExprWhere(i)}parseElementPredicateWith(i){return this.parseFqnExprWith(i)}parseRelationPredicate(i){return this.parseRelationExprOrWith(i)}parseRelationPredicateOrWhere(i){return this.parseRelationExprOrWhere(i)}parseRelationPredicateWhere(i){return this.parseRelationExprWhere(i)}parseRelationPredicateWith(i){return this.parseRelationExprWith(i)}parseRelationExpression(i){return this.parseRelationExpr(i)}}}function SpecificationParser(i){return class extends i{parseSpecification(){let{parseResult:{value:{specifications:i}},c4Specification:a}=this.doc,o=this.isValid;for(let s of i.flatMap(i=>i.elements.filter(o)))try{Object.assign(a.elements,this.parseElementSpecificationNode(s))}catch(i){this.logError(i,s,`specification`)}for(let s of i.flatMap(i=>i.deploymentNodes.filter(o)))try{Object.assign(a.deployments,this.parseElementSpecificationNode(s))}catch(i){this.logError(i,s,`specification`)}let s=i.flatMap(i=>i.relationships.filter(this.isValid));for(let{kind:i,props:o}of s)try{let s=i.name;if(!e$1(s))continue;if(s in a.relationships){this.logError(`Relationship kind "${s}" is already defined`,i,`specification`);continue}let c=t$1(o.filter(isSpecificationRelationshipStringProperty)??[],n(i=>this.isValid(i)&&e$4(i.value)),t$17(i=>[i.key,removeIndent(parseMarkdownAsString(i.value))]),t$14(e));a.relationships[s]={...c,...toRelationshipStyle(o.filter(isRelationshipStyleProperty),this.isValid)}}catch(a){this.logError(a,i,`specification`)}let c=i.flatMap(i=>i.tags.filter(this.isValid));for(let i of c)try{let o=i.tag.name,s=this.getAstNodePath(i.tag),c=i.color&&this.parseColorLiteral(i.color);if(o in a.tags){this.logError(`Tag ${o} is already defined, skipping duplicate`,i,`specification`);continue}e$1(o)&&(a.tags[o]={astPath:s,...c?{color:c}:{}})}catch(a){this.logError(a,i,`specification`)}let l=i.flatMap(i=>i.colors.filter(o));for(let{name:i,color:o}of l)try{let s=i.name;if(s in a.colors){this.logError(`Custom color "${s}" is already defined`,i,`specification`);continue}a.colors[s]={color:nonNullable(this.parseColorLiteral(o),`Color "${s}" is not valid`)}}catch(i){this.logError(i,o,`specification`)}}parseElementSpecificationNode(i){let{kind:a,props:o}=i,s=a.name;if(!e$1(s))throw Error(`DeploymentNodeKind name is not resolved`);let c=this.parseTags(i),l=this.parseElementStyle(o.find(isElementStyleProperty)),u=this.parseLinks(i),d=t$1(o.filter(isSpecificationElementStringProperty)??[],n(i=>this.isValid(i)),t$17(i=>[i.key,i.value])),f=this.parseBaseProps(d),p=removeIndent(parseMarkdownAsString(d.notation));return{[s]:exact({...f,notation:p,tags:c??void 0,...u&&c4.isNonEmptyArray(u)&&{links:u},style:l})}}}}function ViewsParser(i){return class extends i{parseViews(){let i=this.isValid;for(let a of this.doc.parseResult.value.views){let o=a.styles.flatMap(a=>{try{return i(a)?this.parseViewRuleStyleOrGlobalRef(a):[]}catch(i){return this.logError(i,a,`views`),[]}}),s=a.folder&&!e$3(a.folder.trim())?toSingleLine(a.folder):null;for(let c of a.views)try{if(!i(c))continue;switch(!0){case isElementView$1(c):this.doc.c4Views.push(this.parseElementView(c,o));break;case isDynamicView(c):this.doc.c4Views.push(this.parseDynamicElementView(c,o));break;case isDeploymentView(c):this.doc.c4Views.push(this.parseDeploymentView(c));break;default:nonexhaustive$1(c)}if(s){let i=this.doc.c4Views.at(-1);i.title=s+` / `+(i.title||i.id)}}catch(i){this.logError(i,c,`views`)}}}parseElementView(i,a){let o=i.body;invariant$1(o,`ElementView body is not defined`);let s=this.getAstNodePath(i),c=null;if(`viewOf`in i){let a=elementRef(i.viewOf),o=a&&safeCall(()=>this.resolveFqn(a));if(o)c=o;else{let a=i.name??`unnamed`,o=i.viewOf.$cstNode?.text??`<unknown>`;this.logError(`viewOf ${a} not resolved ${o}`,i.viewOf)}}let l=i.name;l||=`view_`+stringHash$1(this.doc.uri.toString(),s,c??``);let{title:u=null,description:d=null}=this.parseBaseProps(t$1(o.props,n(i=>this.isValid(i)),n(isViewStringProperty),t$17(i=>[i.key,i.value]))),f=this.convertTags(o),p=this.convertLinks(o),m=parseViewManualLayout(i),h={[c4._type]:`element`,id:l,astPath:s,title:toSingleLine(u)??null,description:d,tags:f,links:isNonEmptyArray$1(p)?p:null,rules:[...a,...this.tryMap(`views`,o.rules,i=>this.parseElementViewRule(i))],...c&&{viewOf:c},...m&&{manualLayout:m}};if(ViewOps.writeId(i,h.id),`extends`in i){let a=i.extends.view.ref;return invariant$1(a?.name,`view extends is not resolved: `+i.$cstNode?.text),Object.assign(h,{extends:a.name})}return h}parseElementViewRule(i){if(isViewRulePredicate(i))return this.parseViewRulePredicate(i);if(isViewRuleGlobalPredicateRef(i))return this.parseViewRuleGlobalPredicateRef(i);if(isViewRuleStyleOrGlobalRef(i))return this.parseViewRuleStyleOrGlobalRef(i);if(isViewRuleAutoLayout(i))return toAutoLayout(i);if(isViewRuleGroup(i))return this.parseViewRuleGroup(i);if(isViewRuleRank(i))return this.parseViewRuleRank(i);nonexhaustive$1(i)}parseViewRulePredicate(i){let a=[],o=i.exprs;for(;o;){let{value:i,prev:s}=o;if(this.tryParse(`views`,i,()=>{let o=this.parsePredicate(i);a.unshift(o)}),!s)break;o=s}return i.isInclude?{include:a}:{exclude:a}}parseViewRuleGlobalPredicateRef(i){return{predicateId:i.predicate.$refText}}parseViewRuleStyleOrGlobalRef(i){if(isViewRuleStyle(i))return this.parseViewRuleStyle(i);if(isViewRuleGlobalStyle(i))return this.parseViewRuleGlobalStyle(i);nonexhaustive$1(i)}parseViewRuleGroup(i){let a=[];for(let o of i.groupRules)try{if(!this.isValid(o))continue;if(isViewRulePredicate(o)){a.push(this.parseViewRulePredicate(o));continue}if(isViewRuleGroup(o)){a.push(this.parseViewRuleGroup(o));continue}nonexhaustive$1(o)}catch(i){this.logError(i,o,`views`)}return{title:toSingleLine(i.title)??null,groupRules:a,...this.parseStyleProps(i.props)}}parseViewRuleRank(i){let a=this.parseFqnExpressions(i.targets).filter(i=>c4.ModelExpression.isFqnExpr(i));return{rank:i.value??`same`,targets:a}}parseViewRuleStyle(i){let a=this.parseFqnExpressions(i.targets).filter(i=>c4.ModelExpression.isFqnExpr(i)),o=this.parseStyleProps(i.props.filter(isStyleProperty)),s=removeIndent(parseMarkdownAsString(i.props.find(isNotationProperty)?.value));return{targets:a,style:o,...s&&{notation:s}}}parseViewRuleGlobalStyle(i){return{styleId:i.style.$refText}}parseDynamicElementView(i,a){let o=i.body;invariant$1(o,`DynamicElementView body is not defined`);let s=this.isValid,c=o.props.filter(s),l=this.getAstNodePath(i),u=i.name;u||=`dynamic_`+stringHash$1(this.doc.uri.toString(),l);let{title:d=null,description:f=null}=this.parseBaseProps(t$1(c,n(isViewStringProperty),t$17(i=>[i.key,i.value]))),p=this.convertTags(o),m=this.convertLinks(o);ViewOps.writeId(i,u);let h=parseViewManualLayout(i),g=r(c,isDynamicViewDisplayVariantProperty)?.value;return{[c4._type]:`dynamic`,id:u,astPath:l,title:toSingleLine(d)??null,description:f,tags:p,links:isNonEmptyArray$1(m)?m:null,variant:g,rules:[...a,...this.tryMap(`views`,o.rules,i=>this.parseDynamicViewRule(i))],steps:this.tryMap(`views`,o.steps,i=>isDynamicViewParallelSteps(i)?this.parseDynamicParallelSteps(i):this.parseDynamicStep(i)),...h&&{manualLayout:h}}}parseDynamicViewRule(i){if(isDynamicViewIncludePredicate(i))return this.parseDynamicViewIncludePredicate(i);if(isDynamicViewGlobalPredicateRef(i))return this.parseViewRuleGlobalPredicateRef(i);if(isViewRuleStyleOrGlobalRef(i))return this.parseViewRuleStyleOrGlobalRef(i);if(isViewRuleAutoLayout(i))return toAutoLayout(i);nonexhaustive$1(i)}parseDynamicViewIncludePredicate(i){let a=[],o=i.exprs;for(;o;)this.tryParse(`views`,o.value,i=>{if(isFqnExprOrWith(i)){let o=this.parseElementPredicate(i);a.unshift(o)}}),o=o.prev;return{include:a}}parseDynamicParallelSteps(i){let a=pathInsideDynamicView(i),o=this.tryMap(`views`,i.steps,i=>this.parseDynamicStep(i));return invariant$1(isNonEmptyArray$1(o),`Dynamic parallel steps must have at least one step`),{parallelId:a,__parallel:o}}parseDynamicStep(i){if(isDynamicStepSingle(i))return this.parseDynamicStepSingle(i);let a=this.recursiveParseDynamicStepChain(i);return invariant$1(isNonEmptyArray$1(a),`Dynamic step chain must have at least one step`),{seriesId:pathInsideDynamicView(i),__series:a}}recursiveParseDynamicStepChain(i,a){if(isDynamicStepSingle(i.source)){if(!this.isValid(i.source))return[];let o=this.parseDynamicStepSingle(i.source);if(o.isBackward)return[];let s={...this.parseAbstractDynamicStep(i),source:o.target};return s.target===o.source?s.isBackward=!0:a&&(a.push([o.source,o.target]),a.push([s.source,s.target])),[o,s]}a??=[];let o=this.recursiveParseDynamicStepChain(i.source,a);if(!isNonEmptyArray$1(o)||!this.isValid(i))return[];let s=t$18(o),c={...this.parseAbstractDynamicStep(i),source:s.target},l=a.findIndex(([i,a])=>i===c.target&&a===c.source);return l===-1?a.push([c.source,c.target]):(c.isBackward=!0,a.splice(l,a.length-l)),[...o,c]}parseDynamicStepSingle(i){let a=elementRef(i.source);if(!a)throw Error(`Invalid reference to source`);let o={...this.parseAbstractDynamicStep(i),source:this.resolveFqn(a)};return i.isBackward&&(o={...o,source:o.target,target:o.source,isBackward:!0}),o}parseAbstractDynamicStep(i){let a=elementRef(i.target);if(!a)throw Error(`Invalid reference to target`);let o={target:this.resolveFqn(a),astPath:pathInsideDynamicView(i)},s=removeIndent(i.title);s&&(o.title=s);let c=i.kind?.ref?.name??i.dotKind?.kind.ref?.name;c&&(o.kind=c);for(let a of i.custom?.props??[])try{switch(!0){case isRelationNavigateToProperty(a):{let i=a.value.view.ref?.name;e$1(i)&&(o.navigateTo=i);break}case isRelationStringProperty(a):case isNotationProperty(a):if(e$6(a.value))if(a.key===`description`){let i=removeIndent(a.value);i&&(o.description=i)}else o[a.key]=removeIndent(parseMarkdownAsString(a.value))??``;break;case isNotesProperty(a):e$6(a.value)&&(o[a.key]=removeIndent(a.value));break;case isArrowProperty(a):e$6(a.value)&&(o[a.key]=a.value);break;case isColorProperty(a):{let i=toColor(a);e$6(i)&&(o[a.key]=i);break}case isLineProperty(a):e$6(a.value)&&(o[a.key]=a.value);break;default:nonexhaustive$1(a)}}catch(i){this.logError(i,a,`views`)}return o}}}function pathInsideDynamicView(i){let a=i,o=[];for(;!isDynamicViewBody(a);)e$10(a.$containerIndex)&&o.unshift(`@${a.$containerIndex}`),o.unshift(`/${a.$containerProperty??`__invalid__`}`),a=a.$container;return o.join(``)}const DocumentParserFromMixins=t$1(BaseParser,ExpressionV2Parser,ImportsParser,ModelParser,DeploymentModelParser,DeploymentViewParser,PredicatesParser,SpecificationParser,ViewsParser,GlobalsParser);var DocumentParser=class extends DocumentParserFromMixins{};const logger$3=logger$9.getChild(`parser`),isError=i=>i.severity===DiagnosticSeverity.Error;var LikeC4ModelParser=class{cachedParsers=new DefaultWeakMap(i=>this.createParser(i));constructor(i){this.services=i,i.shared.workspace.DocumentBuilder.onDocumentPhase(DocumentState.Linked,async i=>{this.cachedParsers.has(i)&&(logger$3.trace(`Linked: clear cached parser {projectId} document {doc}`,{projectId:i.likec4ProjectId,doc:UriUtils.basename(i.uri)}),this.cachedParsers.delete(i))}),i.shared.workspace.DocumentBuilder.onBuildPhase(DocumentState.Linked,async a=>{for(let o of a)if(!i.shared.workspace.ProjectsManager.isExcluded(o))try{this.parse(o)}catch(i){logWarnError(i)}}),i.shared.workspace.DocumentBuilder.onDocumentPhase(DocumentState.Validated,async i=>{i.diagnostics?.some(isError)&&this.cachedParsers.has(i)&&(logger$3.trace(`Validated: clear cached parser {projectId} document {doc} because of errors`,{projectId:i.likec4ProjectId,doc:UriUtils.basename(i.uri)}),this.cachedParsers.delete(i))})}documents(i){return this.services.shared.workspace.LangiumDocuments.projectDocuments(i).map(i=>this.parse(i))}parse(i){return this.forDocument(i).doc}forDocument(i){return this.cachedParsers.get(i)}createParser(i){invariant(isLikeC4LangiumDocument(i),`Document ${i.uri.toString()} is not a LikeC4 document`);let a=this.services.shared.workspace.ProjectsManager.getProject(i),o=UriUtils.relative(a.folderUri,i.uri);i.likec4ProjectId?logger$3.trace(`create parser {projectId} document {doc}`,{projectId:i.likec4ProjectId,doc:o}):logger$3.debug(`create parser for document without project {doc}`,{doc:i.uri.fsPath}),i.state<DocumentState.Linked&&logger$3.debug(`Document {doc} is not linked, state is {state}`,{doc:o,state:i.state});let s={c4Specification:{tags:{},elements:{},relationships:{},colors:{},deployments:{}},c4Elements:[],c4ExtendElements:[],c4ExtendDeployments:[],c4ExtendRelations:[],c4Relations:[],c4Deployments:[],c4DeploymentRelations:[],c4Globals:{predicates:{},dynamicPredicates:{},styles:{}},c4Views:[],c4Imports:new MultiMap$1(Set)};i=Object.assign(i,s);let c=new DocumentParser(this.services,i,a);try{c.parseSpecification(),c.parseImports(),c.parseModel(),c.parseDeployment(),c.parseGlobals(),c.parseViews()}catch(i){throw Error(`Error parsing document ${o}`,{cause:i})}return c}},LikeC4ValueConverter=class extends DefaultValueConverter{runConverter(i,a,o){return i.name===`MarkdownString`?((a.startsWith(`"""`)&&a.endsWith(`"""`)||a.startsWith(`'''`)&&a.endsWith(`'''`))&&(a=a.slice(2,-2)),ValueConverter.convertString(a)):super.runConverter(i,a,o)}};const{findNodeForKeyword:findNodeForKeyword$1}=GrammarUtils,asViewStyleRule=(i,a,o=0)=>{let s=o>0?` `.repeat(o):``;return[s+`style ${i} {`,...t$5(a).map(([i,a])=>s+` ${i} ${i===`opacity`?a.toString()+`%`:a}`),s+`}`]},isMatchingViewRule=(i,a)=>o=>{if(!isViewRuleStyle(o)&&!isDeploymentViewRuleStyle(o))return!1;let s=o.targets.value;if(!s||e$1(o.targets.prev)||s.$type!==`FqnRefExpr`||e$1(s.selector))return!1;let c=s.ref?.value?.ref;return(c?a.resolve(c):null)===i};function changeElementStyle(i,{view:a,viewAst:o,targets:s,style:c}){invariant$1(o.body,`View ${a.id} has no body`);let l=o.$cstNode;invariant$1(l,`viewCstNode`);let u=t$18(o.body.rules)?.$cstNode?.range.end??o.body.$cstNode?.range.end;invariant$1(u,`insertPos is not defined`);let d=l.range.start.character+2,f=i.likec4.FqnIndex,p=n(o.body.rules,i=>isViewRuleStyle(i)||isDeploymentViewRuleStyle(i)),m=a[_type]===`element`?a.viewOf??null:null,h=[],g=[];s.forEach(i=>{let a=t$19(p,isMatchingViewRule(i,f)),o=m&&isAncestor(m,i)?i.substring(m.length+1):i;a?h.push({fqn:o,rule:a}):g.push({fqn:o})});let _={start:u,end:u},includeRange=i=>{i.start.line<=_.start.line&&(i.start.line==_.start.line?_.start.character=Math.min(i.start.character,_.start.character):_.start=i.start),i.end.line>=_.end.line&&(i.end.line==_.end.line?_.end.character=Math.max(i.end.character,_.end.character):_.end=i.end)},v=[];if(g.length>0){let i=g.flatMap(({fqn:i})=>asViewStyleRule(i,c,d));v.push(TextEdit.insert(u,`
27
- `+i.join(`
28
- `))),_.start={line:u.line+1,character:d},_.end={line:u.line+i.length,character:t$18(i)?.length??0}}if(h.length>0)for(let{rule:i}of h){let a=i.$cstNode;invariant$1(a,`RuleCstNode not found`);for(let[o,s]of t$5(c)){let c=o===`opacity`?s.toString()+`%`:s,l=i.props.find(i=>i.key===o);if(l&&l.$cstNode){let{range:{start:i,end:a}}=l.$cstNode;includeRange({start:i,end:a}),v.push(TextEdit.replace({start:i,end:a},o+` `+c));continue}let u=findNodeForKeyword$1(a,`{`)?.range.end;invariant$1(u,`Opening brace not found`);let d=` `.repeat(a.range.start.character)+` `,f=d+o+` `+c;v.push(TextEdit.insert(u,`
29
- `+f)),includeRange({start:{line:u.line+1,character:d.length},end:{line:u.line+1,character:f.length}})}}return{modifiedRange:_,edits:v}}const{findNodeForKeyword}=GrammarUtils;function changeViewLayout(i,{view:a,viewAst:o,layout:s}){invariant$1(o.body,`View ${a.id} has no body`);let c=o.$cstNode;invariant$1(c,`viewCstNode`);let l=toAstViewLayoutDirection(s.direction),u=t$19(o.body.rules,isViewRuleAutoLayout),d=`autoLayout ${l}`;if(e$10(s.rankSep)&&(d+=` ${s.rankSep}`,e$10(s.nodeSep)&&(d+=` ${s.nodeSep}`)),u&&u.$cstNode)return TextEdit.replace(u.$cstNode.range,d);let f=findNodeForKeyword(o.body.$cstNode,`}`)?.range.start;invariant$1(f,`Closing brace not found`);let p=`\t${d}\n\t`;return TextEdit.insert(f,p)}async function removeManualLayoutV1(i,{lookup:a}){if(!a.view.manualLayout)return!1;let o=a.viewAst.$cstNode;invariant$1(o,`invalid view.$cstNode`);let s=i.shared.lsp.Connection;invariant$1(s,`LSP Connection not available`);let c=CstUtils.findCommentNode(o,[`BLOCK_COMMENT`]);return c&&hasManualLayout(c.text)?(await s.workspace.applyEdit({label:`LikeC4 - remove manual layout v1 for ${a.view.id}`,edit:{changes:{[a.doc.textDocument.uri]:[TextEdit.del(c.range)]}}})).applied:!1}const logger$2=logger$9.getChild(`model-changes`);var LikeC4ModelChanges=class{locator;constructor(i){this.services=i,this.locator=i.likec4.ModelLocator}async applyChange(i){let a=this.services.shared.lsp.Connection,o=this.services.shared.workspace;try{let{viewId:s,projectId:c,change:l}=i,u=o.ProjectsManager.ensureProject(c);logger$2.debug`Applying model change ${l.op} to view ${s} in project ${u.id}`;let d=this.locator.locateViewAst(s,u.id);if(!d)throw Error(`View ${s} not found in project ${u.id}`);let f={uri:d.doc.textDocument.uri,version:d.doc.textDocument.version};if(l.op===`save-view-snapshot`)return invariant$1(s===l.layout.id,`View ID does not match, expected `+s+`, got `+l.layout.id),d.view.manualLayout&&a&&await removeManualLayoutV1(this.services,{lookup:d}).catch(i=>{logger$2.warn(`Failed to remove manual layout v1 for view ${s} in project ${u.id}`,{err:i})}),{success:!0,location:await o.ManualLayouts.write(u,l.layout)};if(l.op===`reset-manual-layout`)return d.view.manualLayout&&await removeManualLayoutV1(this.services,{lookup:d}).catch(i=>{logger$2.warn(`Failed to remove manual layout v1 for view ${s} in project ${u.id}`,{err:i})}),{success:!0,location:await o.ManualLayouts.remove(u,s)};invariant$1(a,`This change only supported in IDE (running as Extension)`);let{edits:p,modifiedRange:m}=this.convertToTextEdit({lookup:d,change:l});if(!p.length)return{success:!1,error:`No changes to apply`};let h=await a.workspace.applyEdit({label:`LikeC4 - change view ${i.viewId}`,edit:{changes:{[f.uri]:p}}});return h.applied?{success:!0,location:{uri:f.uri,range:m}}:(a.window.showErrorMessage(`Failed to apply changes ${h.failureReason}`),{success:!1,error:`Failed to apply changes ${h.failureReason}`})}catch(a){let o=loggable(wrapError(a,`Failed to apply change ${i.change.op} ${i.viewId}`));return logger$2.error(o),{success:!1,error:o}}finally{this.services.likec4.ModelBuilder.clearCache()}}convertToTextEdit({lookup:i,change:a}){switch(a.op){case`change-element-style`:return changeElementStyle(this.services,{...i,targets:a.targets,style:a.style});case`change-autolayout`:{let o=changeViewLayout(this.services,{...i,layout:a.layout});return{modifiedRange:o.range,edits:[o]}}default:nonexhaustive$1(a)}}},LikeC4NameProvider=class extends DefaultNameProvider{constructor(i){super(),this.services=i}getNameStrict(i){return nonNullable$1(this.getName(i),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(i)}`)}getName(i){if(isNamed(i))return i.name;if(isImported(i))return i.imported.$refText;if(isDeployedInstance(i))return i.target.modelElement.value.$refText}getNameNode(i){if(isNamed(i))return super.getNameNode(i);if(isImported(i))return i.imported.$refNode;if(isDeployedInstance(i))return i.target.modelElement.value.$refNode}};function uniqueDescriptions(i){return t$1(i,t$3(i=>`${i.type}.${i.name}`),t$5(),t$7(([i,a])=>a.length===1?a:[]))}var LikeC4ScopeComputation=class extends DefaultScopeComputation{constructor(i){super(i)}async computeExports(i,a){let o=[];try{let{specifications:a,models:s,views:c,globals:l,likec4lib:u,deployments:d}=i.parseResult.value;this.exportLibrary(u,o,i),this.exportSpecification(a,o,i),this.exportModel(s,o,i),this.exportViews(c,o,i),this.exportGlobals(l,o,i),this.exportDeployments(d,o,i)}catch(i){logWarnError(i)}return o}exportViews(i,a,o){let s=i?.flatMap(i=>i.views);if(!(e(s)||s.length===0))for(let i of s)try{e$1(i.name)&&a.push(this.descriptions.createDescription(i,i.name,o))}catch(i){logWarnError(i)}}exportGlobals(i,a,o){if(!(e(i)||i.length===0)){for(let s of i.flatMap(i=>i.predicates))try{let i=s;e$1(i.name)&&a.push(this.descriptions.createDescription(i,i.name,o))}catch(i){logWarnError(i)}for(let s of i.flatMap(i=>i.styles))try{let i=s.id;e$1(i.name)&&a.push(this.descriptions.createDescription(i,i.name,o))}catch(i){logWarnError(i)}}}exportModel(i,a,o){if(!(e(i)||i.length===0))for(let s of i.flatMap(i=>i.elements))try{isElement(s)&&e$1(s.name)&&a.push(this.descriptions.createDescription(s,s.name,o))}catch(i){logWarnError(i)}}exportLibrary(i,a,o){if(!e(i))try{for(let s of i.flatMap(i=>i.icons))a.push(this.descriptions.createDescription(s,s.name,o))}catch(i){logWarnError(i)}}exportSpecification(i,a,o){if(!(e(i)||i.length===0))for(let s of i.flatMap(i=>[...i.elements,...i.relationships,...i.deploymentNodes,...i.tags,...i.colors]))try{switch(!0){case isSpecificationDeploymentNodeKind(s):case isSpecificationElementKind(s):e$1(s.kind.name)&&a.push(this.descriptions.createDescription(s.kind,s.kind.name,o));continue;case isSpecificationTag(s):e$1(s.tag.name)&&a.push(this.descriptions.createDescription(s.tag,s.tag.name,o));continue;case isSpecificationRelationshipKind(s):e$1(s.kind.name)&&a.push(this.descriptions.createDescription(s.kind,s.kind.name,o));continue;case isSpecificationColor(s):e$1(s.name.name)&&a.push(this.descriptions.createDescription(s.name,s.name.name,o));continue;default:nonexhaustive$1(s)}}catch(i){logWarnError(i)}}exportDeployments(i,a,o){let s=i?.flatMap(i=>i.elements);if(!(e(s)||s.length===0))for(let i of s)try{isDeploymentNode$1(i)&&e$1(i.name)&&a.push(this.descriptions.createDescription(i,i.name,o))}catch(i){logWarnError(i)}}computeLocalScopes(i,a){return new Promise(a=>{let o=i.parseResult.value,s=[],c=new MultiMap;for(let a of o.models)try{s.push(...this.processContainer(a,c,i))}catch(i){logWarnError(i)}for(let a of o.deployments)try{s.push(...this.processDeployments(a,c,i))}catch(i){logWarnError(i)}for(let i of o.imports.flatMap(i=>i.imports))try{let a=i;for(;a;)s.push(this.descriptions.createDescription(a,a.imported.$refText)),a=a.prev}catch(i){logWarnError(i)}uniqueDescriptions(s).forEach(i=>{c.add(o,i)}),a(c)})}processContainer(i,a,o){let s=new MultiMap,c=[];for(let l of i.elements){if(isRelation(l))continue;let i;if(isElement(l)?(e$1(l.name)&&s.add(l.name,this.descriptions.createDescription(l,l.name,o)),i=l.body,i&&(a.add(i,this.descriptions.createDescription(l,`this`,o)),a.add(i,this.descriptions.createDescription(l,`it`,o)))):isExtendElement(l)&&(i=l.body),i&&i.elements.length>0)try{c.push(...this.processContainer(i,a,o))}catch(i){logWarnError(i)}}c.length&&t$1(c,n(i=>!s.has(i.name)),t$3(i=>i.name),t$20((i,a)=>{i.length===1&&s.add(a,i[0])}));let l=[...s.values()];return a.addAll(i,l),l}processDeployments(i,a,o){let s=new MultiMap,c=[];for(let l of i.elements){if(isDeploymentRelation(l))continue;let i=l.body;if(!isExtendDeployment(l)){let c=this.nameProvider.getName(l);if(e$1(c)){let i=this.descriptions.createDescription(l,c,o);s.add(c,i)}i&&(a.add(i,this.descriptions.createDescription(l,`this`,o)),a.add(i,this.descriptions.createDescription(l,`it`,o)))}if(i)try{c.push(...this.processDeployments(i,a,o))}catch(i){logWarnError(i)}}c.length&&t$1(c,n(i=>!s.has(i.name)),t$3(i=>i.name),t$20((i,a)=>{i.length===1&&s.add(a,i[0])}));let l=[...s.values()];return a.addAll(i,l),l}};const{getDocument}=AstUtils;var LikeC4ScopeProvider=class extends DefaultScopeProvider{deploymentsIndex;fqnIndex;indexManager;constructor(i){super(i),this.indexManager=i.shared.workspace.IndexManager,this.fqnIndex=i.likec4.FqnIndex,this.deploymentsIndex=i.likec4.DeploymentsIndex}getScope(i){try{let a=projectIdFrom(i.container),o=this.reflection.getReferenceType(i);try{let s=i.container;if(isFqnRef(s))return new StreamScope(this.streamForFqnRef(a,s,i));if(isStrictFqnRef(s))return this.getScopeForStrictFqnRef(a,s,i);if(o!==Element)return this.getProjectScope(a,o,i);if(isImported(s)){let i=projectIdFrom(s);return new StreamScope(this.fqnIndex.rootElements(i))}if(isStrictFqnElementRef(s)&&i.property===`el`){let c=s.parent;return c?new StreamScope(this.fqnIndex.directChildrenOf(a,readStrictFqn(c))):this.getProjectScope(a,o,i)}return new StreamScope(stream(this.computeScope(a,i)))}catch(s){return logWarnError(s),this.getProjectScope(a,o,i)}}catch(i){return logWarnError(i),EMPTY_SCOPE}}*genUniqueDescedants(i){if(!i)return;let a=projectIdFrom(i);if(isElement(i)){let o=this.fqnIndex.getFqn(i);yield*this.fqnIndex.uniqueDescedants(a,o);return}if(isDeploymentNode$1(i)){let o=this.deploymentsIndex.getFqn(i);yield*this.deploymentsIndex.uniqueDescedants(a,o)}}*genScopeExtendElement({element:i}){i.el.$nodeDescription&&(yield i.el.$nodeDescription,yield{...i.el.$nodeDescription,name:`this`},yield{...i.el.$nodeDescription,name:`it`}),yield*this.genUniqueDescedants(elementRef(i))}*genScopeElementView({viewOf:i,extends:a}){if(i){i.modelElement.value.$nodeDescription&&(yield i.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(elementRef(i));return}if(a){let i=a.view.ref;i&&(yield*this.genScopeElementView(i))}}getScopeForStrictFqnRef(i,a,o){let s=a.parent;return s?new StreamScope(this.deploymentsIndex.directChildrenOf(i,readStrictFqn(s)).filter(i=>this.reflection.isSubtype(i.type,DeploymentNode))):this.getProjectScope(i,DeploymentNode,o)}*genScopeExtendDeployment({deploymentNode:i}){i.value.$nodeDescription&&(yield i.value.$nodeDescription);let a=i.value.ref;a&&isDeploymentNode$1(a)&&(yield*this.genUniqueDescedants(a))}streamForFqnRef(i,a,o){let s=a.parent;if(!s)return stream(this.genScopeForParentlessFqnRef(i,a,o));let c=s.value.ref;if(!c)return EMPTY_STREAM;if(isImported(c))return stream(this.genUniqueDescedants(c.imported.ref));if(isDeploymentNode$1(c))return stream(this.genUniqueDescedants(c));if(isDeployedInstance(c)){let i=c.target.modelElement.value.ref,a=isImported(i)?i.imported.ref:isElement(i)?i:void 0;return stream(this.genUniqueDescedants(a))}return isElement(c)?stream(this.genUniqueDescedants(c)):nonexhaustive$1(c)}*genScopeForParentlessFqnRef(i,a,o){AstUtils.hasContainerOfType(a,isElementRef)||isFqnRefInsideModel(a)?yield*this.computeScope(i,o,Element):isFqnRefInsideGlobals(a)?(yield*this.computeScope(i,o,Element),yield*this.computeScope(i,o,DeploymentNode),yield*this.computeScope(i,o,DeployedInstance)):(yield*this.computeScope(i,o,DeploymentNode),yield*this.computeScope(i,o,DeployedInstance),AstUtils.hasContainerOfType(a,isDeploymentViewBody)&&(yield*this.computeScope(i,o,Element)));let s=getDocument(a).precomputedScopes;s&&(yield*s.values().filter(i=>this.reflection.isSubtype(i.type,Imported)))}*computeScope(i,a,o=this.reflection.getReferenceType(a)){let s=this.reflection.isSubtype(o,Element),c=this.reflection.isSubtype(o,DeploymentElement),l=getDocument(a.container).precomputedScopes;if(!l){yield*this.getProjectScope(i,o,a).getAllElements();return}let byReferenceType=i=>this.reflection.isSubtype(i.type,o),u=a.container;for(;u;){let i=l.get(u).filter(byReferenceType);i.length>0&&(yield*i),c&&isExtendDeploymentBody(u)&&(yield*this.genScopeExtendDeployment(u.$container)),s&&isExtendElementBody(u)&&(yield*this.genScopeExtendElement(u.$container)),s&&isElementViewBody(u)&&(yield*this.genScopeElementView(u.$container)),u=u.$container}yield*this.getProjectScope(i,o,a).getAllElements()}getProjectScope(i,a,o){return a===LibIcon?super.getGlobalScope(a,o):this.globalScopeCache.get(`${i}::${a}`,()=>new MapScope(this.indexManager.projectElements(i,a)))}getGlobalScope(i,a){if(i===LibIcon)return super.getGlobalScope(i,a);let o=projectIdFrom(a.container);return this.getProjectScope(o,i,a)}};const logger$1=logger$9.getChild(`rpc`);var Rpc=class extends ADisposable{constructor(i){super(),this.services=i}init=e$13(()=>{let i=this.services.shared.lsp.Connection;if(!i){logger$1.info(`no connection, skip init ServerRpc`);return}logger$1.info(`init ServerRpc`);let a=this.services.likec4,o=this.services.shared.workspace,s=o.LangiumDocuments,c=o.DocumentBuilder,l=n$4(a=>{a>1?logger$1.debug`send ${`onDidChangeModel`} (${a} batched)`:logger$1.debug`send ${`onDidChangeModel`}`,i.sendNotification(DidChangeModelNotification.type,``).catch(i=>{logger$1.warn(`[ServerRpc] error sending onDidChangeModel:`,{error:i})})},{reducer:(i,a)=>(i??0)+a,triggerAt:`end`,minQuietPeriodMs:130,maxBurstDurationMs:400}),u=n$4(a=>{a>1?logger$1.debug`send ${`DidChangeProjectsNotification`} (${a} batched)`:logger$1.debug`send ${`DidChangeProjectsNotification`}`,i.sendNotification(DidChangeProjectsNotification.type).catch(i=>{logger$1.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:i})})},{reducer:(i,a)=>(i??0)+a,triggerAt:`end`,minQuietPeriodMs:100,maxBurstDurationMs:500}),d=!0;this.onDispose(a.ModelBuilder.onModelParsed(()=>l.call(1)),o.ProjectsManager.onProjectsUpdate(()=>u.call(1)),i.onRequest(FetchComputedModel.req,async({projectId:i,cleanCaches:s=!1},c)=>{logger$1.debug`received request ${`fetchComputedModel`} for project ${i}`,s&&(logger$1.debug`cleanCaches: ${s}`,i?await o.ProjectsManager.rebuildProject(i):await o.WorkspaceManager.rebuildAll());let l=await a.ModelBuilder.computeModel(i,c);return l===LikeC4Model.EMPTY?{model:null}:{model:l.$data}}),i.onNotification(DidChangeSnapshotNotification.type,async({snapshotUri:i})=>{logger$1.debug`received notification ${`onDidChangeSnapshot`} for snapshot ${i}`,o.ManualLayouts.clearCaches(),await o.ProjectsManager.rebuildProject(o.ProjectsManager.ownerProjectId(i))}),i.onRequest(FetchLayoutedModel.req,async({projectId:i},o)=>{logger$1.debug`received request ${`fetchLayoutedModel`} for project ${i}`;let s=await a.LanguageServices.layoutedModel(i);if(s===null)return{model:null};let c=await a.Views.diagrams(i,o);return{model:{...s.$data,_stage:`layouted`,views:t$6(c,i=>i.id)}}}),i.onRequest(LayoutView.req,async({viewId:i,projectId:o,layoutType:s},c)=>(logger$1.debug`received request ${`layoutView`} for ${i} from project ${o} (layout type: ${s??`not set`})`,{result:await a.Views.layoutView({viewId:i,projectId:o,layoutType:s,cancelToken:c})})),i.onRequest(ValidateLayout.req,async({projectId:i},o)=>(logger$1.debug`received request ${`validateLayout`} for project ${i}`,{result:reportLayoutDrift((await a.Views.layoutAllViews(i,o)).map(i=>i.diagram))})),i.onRequest(FetchProjects.req,async()=>(logger$1.debug`received request ${`FetchProjects`}`,{projects:t$10(s.groupedByProject(),(i,a)=>{let{folderUri:s,config:{name:c,title:l}}=o.ProjectsManager.getProject(a);return{folder:s.toString(),config:{name:c,title:l},docs:t$2(i,i=>i.uri.toString())}})})),i.onRequest(ReloadProjects.req,async i=>{logger$1.debug`received request ${`ReloadProjects`}`,o.ManualLayouts.clearCaches(),await o.ProjectsManager.reloadProjects(i)}),i.onRequest(RegisterProject.req,async(i,a)=>{logger$1.debug`received request ${`RegisterProject`}`,o.ManualLayouts.clearCaches();let s;return s=`configUri`in i?await o.ProjectsManager.registerConfigFile(URI.parse(i.configUri),a):await o.ProjectsManager.registerProject(i,a),{id:s.id}}),i.onRequest(FetchViewsFromAllProjects.req,async i=>{logger$1.debug`received request ${`FetchViewsFromAllProjects`}`;let s=[];for(let c of o.ProjectsManager.all){await interruptAndCheck(i);try{let o=await a.Views.computedViews(c,i);s.push(...t$1(o,t$2(i=>({id:i.id,title:i.title??i.id,projectId:c})),t$21((i,a)=>i.id===`index`?-1:a.id===`index`?1:i.title.localeCompare(a.title))))}catch(i){logger$1.warn(`Failed to fetch views for project ${c}:`,{error:i})}}return{views:s}}),i.onRequest(BuildDocuments.req,async({docs:a},o)=>{let l=a.map(i=>URI.parse(i)),u=s.userDocuments.map(i=>i.uri).filter(i=>!l.some(a=>UriUtils.equals(a,i))).toArray();logger$1.debug(`[ServerRpc] received request to build:
30
- changed (total ${l.length}):${a.map(i=>`
31
- - `+i).join(``)}
32
- deleted (total ${u.length}):${u.map(i=>`
33
- - `+i.toString()).join(`
34
- `)}`),!d&&l.length+u.length>0&&await Promise.allSettled([...l,...u].map(async a=>{let o=a.toString();logger$1.debug(`clear diagnostics for ${o}`);try{await i.sendDiagnostics({uri:o,diagnostics:[]})}catch(i){logger$1.warn(`error clearing diagnostics for ${o}: ${i}`)}})),d=!1,await interruptAndCheck(o),await c.update(l,u,o)}),i.onRequest(Locate.req,i=>{switch(logger$1.debug`received request ${`locate`}, ${i}`,!0){case`element`in i:return a.ModelLocator.locateElement(i.element,i.projectId);case`relation`in i:return a.ModelLocator.locateRelation(i.relation,i.projectId);case`astPath`in i:return a.ModelLocator.locateDynamicViewStep({view:i.view,astPath:i.astPath,projectId:i.projectId});case`view`in i:return a.ModelLocator.locateView(i.view,i.projectId);case`deployment`in i:return a.ModelLocator.locateDeploymentElement(i.deployment,i.projectId);default:nonexhaustive$1(i)}}),i.onRequest(ChangeView.req,async(i,s)=>{logger$1.debug`received request ${`changeView`} of ${i.viewId} from project ${i.projectId}`;let c=await a.ModelChanges.applyChange(i),l=i.change.op;return i.projectId&&(l===`save-view-snapshot`||l===`reset-manual-layout`)&&await o.ProjectsManager.rebuildProject(i.projectId,s),c}),i.onRequest(FetchTelemetryMetrics.req,async i=>{let s=null;for(let c of o.ProjectsManager.all)try{let o=await a.ModelBuilder.computeModel(c,i);if(o===LikeC4Model.EMPTY)continue;s??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},s.elementKinds+=t$11(o.specification.elements).length,s.deploymentKinds+=t$11(o.specification.deployments).length,s.relationshipKinds+=t$11(o.specification.relationships).length,s.tags+=t$11(o.specification.tags).length,s.customColors+=t$11(o.specification.customColors??{}).length,s.elements+=t$11(o.$data.elements).length,s.deploymentNodes+=[...o.deployment.nodes()].length,s.relationships+=t$11(o.$data.relations).length,s.views+=t$11(o.$data.views).length,s.projects+=1}catch(i){logger$1.warn(`Error fetching telemetry metrics for project ${c}`,{err:i})}return await interruptAndCheck(i),{metrics:s}}),i.onRequest(GetDocumentTags.req,async({documentUri:i},s)=>{let c=URI.parse(i);logger$1.debug`received request ${`GetDocumentTags`} for document ${c}`;let l=await a.ModelLocator.locateDocumentTags(c,s);return{projectId:o.ProjectsManager.ownerProjectId(c),tags:l??[]}}),i.onRequest(FetchProjectsOverview.req,async i=>(logger$1.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await a.LanguageServices.projectsOverview(i)})),Disposable.create(()=>{l.cancel()}));function reportLayoutDrift(i){return t$1(i,n(i=>!!i.hasLayoutDrift),t$2(i=>{let o=a.ModelLocator.locateView(i.id);return invariant$1(o,`View ${i.id} not found`),{uri:o.uri,viewId:i.id,severity:DiagnosticSeverity$1.Warning,message:`Layout drift detected for view '${i.id}'`,range:o.range}}))}});async openView(i){let a=this.services.shared.lsp.Connection;if(!a){logger$1.warn(`No LSP connection`);return}await a.sendNotification(DidRequestOpenViewNotification.type,i)}},NodeKindProvider$1=class{constructor(i){this.services=i}getSymbolKind(i){let a=isAstNode(i)?i.$type:i.type,hasType=(...i)=>i.some(i=>this.services.AstReflection.isSubtype(a,i));switch(!0){case hasType(Element,ExtendElement,DeploymentNode,DeployedInstance,Imported):return SymbolKind.Constructor;case hasType(Model,ModelViews,ModelDeployments,Globals,SpecificationRule):return SymbolKind.Namespace;case hasType(LikeC4View):return SymbolKind.Class;case hasType(Tag$1,LibIcon,CustomColor,SpecificationTag):return SymbolKind.EnumMember;case hasType(RelationshipKind,SpecificationRelationshipKind):return SymbolKind.Event;case hasType(ElementKind,DeploymentNodeKind,SpecificationElementKind,SpecificationDeploymentNodeKind):return SymbolKind.TypeParameter}return SymbolKind.Field}getCompletionItemKind(i){let a=isAstNode(i)?i.$type:i.type,hasType=(...i)=>i.some(i=>this.services.AstReflection.isSubtype(a,i));switch(!0){case hasType(CustomColor):return CompletionItemKind.Color;case hasType(Element,DeploymentNode,DeployedInstance,ExtendElement,Imported):return CompletionItemKind.Constructor;case hasType(Model,ModelViews,ModelDeployments,Globals,SpecificationRule):return CompletionItemKind.Module;case hasType(LikeC4View):return CompletionItemKind.Class;case hasType(Tag$1,LibIcon,CustomColor,SpecificationTag):return CompletionItemKind.EnumMember;case hasType(RelationshipKind,SpecificationRelationshipKind):return CompletionItemKind.Event;case hasType(ElementKind,SpecificationElementKind,DeploymentNodeKind,SpecificationDeploymentNodeKind):return CompletionItemKind.TypeParameter;default:return CompletionItemKind.Reference}}},WorkspaceSymbolProvider=class extends DefaultWorkspaceSymbolProvider{};const viewsLogger=logger$9.getChild(`views`);var DefaultLikeC4Views=class{cache=new WeakMap;viewsWithReportedErrors=new Set;ModelBuilder;constructor(i){this.services=i,this.ModelBuilder=i.likec4.ModelBuilder,i.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.cache=new WeakMap})}get layouter(){return this.services.likec4.Layouter}async computedViews(i,a){return t$16((await this.ModelBuilder.computeModel(i,a)).$data.views)}async _layoutAllViews(i,a){let o=t$16(i.$data.views);if(o.length===0)return[];let s=performanceMark(),c=i.project.id,l=viewsLogger.getChild(c);l.debug`layoutAll: ${o.length} views`;let u=[],d=i.$styles,f=[];for(let i of o){let a=this.cache.get(i);if(a){l.debug`layout ${i.id} from cache`,f.push(a);continue}u.push({view:i,styles:d})}return u.length>0&&await this.layouter.batchLayout({batch:u,cancelToken:a,onSuccess:(a,o)=>{f.push(this.viewSucceed(a.view,i,o))},onError:(i,a)=>{l.warn(`Fail layout view ${i.view.id}`,{error:a})}}),a&&a.isCancellationRequested&&await interruptAndCheck(a),f.length===o.length?f.length>0&&l.debug`layouted all ${f.length} views in ${s.pretty}`:l.warn`layouted ${f.length} of ${o.length} views in ${s.pretty}`,f}async layoutAllViews(i,a){let o=await this.ModelBuilder.computeModel(i,a);return await this._layoutAllViews(o,a)}async layoutView({viewId:i,layoutType:a,projectId:o,cancelToken:s}){let c=await this.ModelBuilder.computeModel(o,s),l=c.findView(i)?.$view;o=c.project.id;let u=viewsLogger.getChild(o);if(!l){u.warn`layoutView ${i} not found`;let a=c.findManualLayout(i);if(a){u.debug`found manual layout for ${i}`;let o={...a};return o.drifts=[`not-exists`],o._layout=`manual`,{diagram:o,dot:`# manual layout`}}return null}try{let o=performanceMark(),s=this.cache.get(l)??await this.layouter.layout({view:l,styles:c.$styles});return this.cache.has(l)?u.debug`layout ${i} from cache`:(this.viewSucceed(l,c,s),u.debug(`layout {viewId} in ${o.pretty}`,{viewId:i})),e$1(a)?{dot:s.dot,diagram:this.withLayoutType(s.diagram,c,a)}:s}catch(i){let a=loggable(i);return u.warn(a),this.reportViewError(l,o,a),Promise.reject(i)}}async diagrams(i,a){let o=await this.ModelBuilder.computeModel(i,a);return(await this._layoutAllViews(o,a)).map(({diagram:i})=>this.withLayoutType(i,o,`manual`))}async viewsAsGraphvizOut(i,a){let o=`All-LayoutedViews-DotWithSvg`,s=this.services.shared.workspace.Cache;if(s.has(o))return await Promise.resolve(s.get(o));let c=await this.ModelBuilder.computeModel(i,a),l=t$16(c.$data.views);if(l.length===0)return[];let u=l.map(async i=>{let{dot:a,svg:o}=await this.layouter.svg({view:i,styles:c.$styles});return{id:i.id,dot:a,svg:o}}),d=[],f=await Promise.allSettled(u);for(let i of f)i.status===`fulfilled`?d.push(i.value):logWarnError(i.reason);return s.set(o,d),d}async openView(i,a){await this.services.Rpc.openView({viewId:i,projectId:a})}async adhocView(i,a){viewsLogger.debug`layouting adhoc view...`;let o=await this.ModelBuilder.computeModel(a),s=computeAdhocView(o,i),{diagram:c}=await this.layouter.layout({view:{...s,hash:``,_type:`element`},styles:o.$styles});return viewsLogger.debug`layouting adhoc view... done`,c}reportViewError(i,a,o){let s=`${a}-${i.id}`;this.cache.delete(i),this.viewsWithReportedErrors.has(s)||(this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${o}`),this.viewsWithReportedErrors.add(s))}withLayoutType(i,a,o){if(!o)return i;let s=a.findManualLayout(i.id);return s?o===`manual`?i[_layout]===`manual`?(viewsLogger.error(`View ${i.id} already has manual layout, this should not happen`),i):applyManualLayout(i,s):calcDriftsFromSnapshot(i,s):i}viewSucceed(i,a,o){let s=`${a.project.id}-${i.id}`;return this.viewsWithReportedErrors.delete(s),this.cache.set(i,o),o}};export{AstNodeDescriptionProvider as A,LikeC4DocumentHighlightProvider as C,LikeC4WorkspaceManager as D,DefaultLikeC4LanguageServices as E,LikeC4DocumentationProvider as M,LangiumDocuments as O,LikeC4DocumentLinkProvider as S,LikeC4CodeLensProvider as T,FqnIndex as _,LikeC4ScopeProvider as a,LikeC4HoverProvider as b,LikeC4ModelChanges as c,registerValidationChecks as d,LikeC4DocumentValidator as f,DeploymentsIndex as g,LastSeenArtifacts as h,Rpc as i,LikeC4Formatter as j,IndexManager as k,LikeC4ValueConverter as l,DefaultLikeC4ModelBuilder as m,WorkspaceSymbolProvider as n,LikeC4ScopeComputation as o,LikeC4ModelLocator as p,NodeKindProvider$1 as r,LikeC4NameProvider as s,DefaultLikeC4Views as t,LikeC4ModelParser as u,LikeC4SemanticTokenProvider as v,LikeC4CompletionProvider as w,LikeC4DocumentSymbolProvider as x,LikeC4CodeActionProvider as y};
@@ -1 +0,0 @@
1
- import{n as __toESM}from"./rolldown-runtime.mjs";import{isLikeC4Builtin}from"../likec4lib.mjs";import{i as logger$2}from"./logger.mjs";import{B as t$3,I as r,S as e,U as t,b as e$2,i as t$4,o as e$1,p as t$2,z as t$1}from"./libs/remeda.mjs";import{t as require_picomatch}from"./libs/picomatch.mjs";import{a as joinRelativeURL,d as withoutTrailingSlash,i as isRelative,o as joinURL,r as hasProtocol,s as withTrailingSlash,t as cleanDoubleSlashes,u as withoutProtocol}from"./libs/ufo.mjs";import{Disposable,URI,UriUtils,isOperationCancelled}from"langium";import{DefaultMap,compareNaturalHierarchically,invariant,isString,nonNullable}from"@likec4/core/utils";import{loggable,wrapError}from"@likec4/log";import{LikeC4ProjectConfigOps}from"@likec4/config";const NoMCPServer={mcpServer:()=>new NoopLikeC4MCPServer,mcpServerFactory:()=>new NoopLikeC4MCPServerFactory};var NoopLikeC4MCPServer=class{get mcp(){throw Error(`NoopLikeC4MCPServer does not have a McpServer`)}get isStarted(){return!1}get port(){return NaN}start(){return Promise.resolve()}stop(){return Promise.resolve()}},NoopLikeC4MCPServerFactory=class{create(n){throw Error(`NoopLikeC4MCPServerFactory`)}},import_picomatch=__toESM(require_picomatch(),1);const logger$1=logger$2.getChild(`projects`);function isLangiumDocument(n){return typeof n==`object`&&`uri`in n&&`textDocument`in n}function normalizeUri(n){return isLangiumDocument(n)?n.uri.toString():typeof n==`string`?hasProtocol(n)?n:URI.file(n).toString():n.toString()}const compare=compareNaturalHierarchically(`/`,!0),compareUri=(n,i)=>compare(withoutTrailingSlash(n.path),withoutTrailingSlash(i.path));function isParentFolderFor(n){return i=>n.startsWith(isString(i)?i:i.folder)}function _overlaps(n,i){let a=isString(n)?n:n.folder,o=isString(i)?i:i.folder;return a.startsWith(o)||o.startsWith(a)}function overlaps(...n){return t(_overlaps,n)}function _includes(n,i){return i.startsWith(n.folder)||n.includePaths?.some(isParentFolderFor(i))?!_excludes(n,i):!1}function _excludes(n,i){return n.exclude?.(withoutProtocol(i))??!1}function includes(...n){return t(_includes,n)}function excludes(...n){return t(_excludes,n)}function ProjectFolder(n){return n=normalizeUri(n),withTrailingSlash(n)}const DefaultProject={id:`default`,config:{name:`default`,exclude:[`**/node_modules/**`]},exclude:(0,import_picomatch.default)(`**/node_modules/**`,{dot:!0}),includeConfig:{paths:[],maxDepth:3,fileThreshold:30}};function isExcludedByDefault(n){return DefaultProject.exclude(withoutProtocol(n))}function parseRegisterOptions(n){if(`configUri`in n){invariant(!e(n.configUri),`configUri is emptyish`);let i=URI.isUri(n.configUri)?n.configUri:URI.parse(normalizeUri(n.configUri)),a=ProjectFolder(UriUtils.dirname(i));return{configUri:i,folder:a,folderUri:URI.parse(a)}}invariant(!e(n.folderUri),`folderUri is emptyish`);let i=ProjectFolder(n.folderUri),a=URI.parse(i);return{configUri:UriUtils.joinPath(a,`likec4.config.json`),folder:i,folderUri:a}}var ProjectsManager=class ProjectsManager{static DefaultProjectId=DefaultProject.id;#e=[];#t=void 0;#n=void 0;#r=[];#i=new DefaultMap(n=>{if(n===ProjectsManager.DefaultProjectId){let i=this.getWorkspaceFolder(),a=UriUtils.joinPath(i,`.likec4rc`),o=ProjectFolder(i);return{id:n,config:DefaultProject.config,folder:o,folderUri:URI.parse(o),configUri:a,exclude:DefaultProject.exclude,includeConfig:DefaultProject.includeConfig}}return nonNullable(this.#r.find(i=>i.id===n),`Project ${n} not found`)});#a=new DefaultMap(n=>{let i=normalizeUri(n),a=this.#o.get(i);return a?excludes(a,i)?!this.#r.some(includes(i)):!1:isExcludedByDefault(i)});#o=new DefaultMap(n=>{let i=isParentFolderFor(n);return this.#r.find(i)??this.#r.find(includes(n))??null});constructor(n){this.services=n,logger$1.debug`created`}get defaultProjectId(){if(this.#t)return this.#t;if(!(this.#r.length>1))return t$1(this.#r,1)?this.#r[0].id:ProjectsManager.DefaultProjectId}set defaultProjectId(n){if(n!==this.#t){if(this.#n=void 0,!n||n===ProjectsManager.DefaultProjectId){logger$1.debug`reset default project ID`,this.#t=void 0;return}invariant(this.#r.find(i=>i.id===n),`Project "${n}" not found`),logger$1.debug`set default project ID to ${n}`,this.#t=n}}get default(){if(!this.#n){let n=this.defaultProjectId??ProjectsManager.DefaultProjectId;this.#n=this.#i.get(n)}return this.#n}get all(){if(t$1(this.#r,1)){let n=[...t$2(this.#r,e$1(`id`)),DefaultProject.id];if(this.#t){let i=n.findIndex(n=>n===this.#t);i>0&&(n.splice(i,1),n.unshift(this.#t))}return n}return[DefaultProject.id]}getProject(n){let i=typeof n==`string`?n:n.likec4ProjectId||this.ownerProjectId(n);return this.#i.get(i)}findOverlaped(n){let i=overlaps(ProjectFolder(n));return this.#r.filter(n=>i(n)||!!n.includePaths&&!!r(n.includePaths,i))}ensureProjectId(n){return n===ProjectsManager.DefaultProjectId?this.defaultProjectId??ProjectsManager.DefaultProjectId:n?(invariant(this.#r.some(i=>n===i.id),`Project ID ${n} is not registered`),n):nonNullable(this.defaultProjectId,()=>`Specify exact project, known: [${t$2(this.#r,e$1(`id`)).join(`, `)}]`)}ensureProject(n){return n=this.ensureProjectId(n),this.getProject(n)}hasMultipleProjects(){return this.#r.length>1}isExcluded(...n){let a=n.length===1?n[0]:n[1];return isLangiumDocument(a)&&isLikeC4Builtin(a)?!0:n.length===1?this.#a.get(normalizeUri(a)):excludes(this.#i.get(n[0]),normalizeUri(a))}isIncluded(n,i){let a=normalizeUri(i);return t$1(this.#r,1)?n===ProjectsManager.DefaultProjectId?!this.#o.get(a)&&!isExcludedByDefault(a):includes(this.#i.get(n),normalizeUri(i)):!isExcludedByDefault(a)}async registerConfigFile(n,i){if(isExcludedByDefault(normalizeUri(n)))throw Error(`Failed to register project config, path ${n.fsPath} is excluded by: ${DefaultProject.config.exclude.map(n=>`"${n}"`).join(`, `)}`);try{let a=await this.services.workspace.FileSystemProvider.loadProjectConfig(n);return await this.registerProject({config:a,configUri:n},i)}catch(i){if(!isOperationCancelled(i))throw wrapError(i,`Failed to register project config ${n.fsPath}:\n`);return Promise.reject(i)}}async registerProject(n,i){let a=LikeC4ProjectConfigOps.validate(n.config),{configUri:s,folder:c,folderUri:l}=parseRegisterOptions(n),u=LikeC4ProjectConfigOps.normalizeInclude(a.include),d=this.#r.find(n=>n.folder===c);return d?(d.config.name!==a.name&&(d.id=this.uniqueProjectId(a.name),logger$1.info`re-register ${d.id}`),d.config=a,d.folder=c,d.folderUri=l,d.configUri=s,d.includeConfig=u):(d={id:this.uniqueProjectId(a.name),config:a,folder:c,configUri:s,folderUri:l,includeConfig:u},this.#r=t$3([...this.#r,d],t$4((n,i)=>compareUri(n.folderUri,i.folderUri))),logger$1.info`register ${d.id}`),this.updateIncludesExcludes(d),this.resetCaches(),this.#s?d:(this.notifyListeners(),await this.rebuildProject(d.id,i).catch(n=>isOperationCancelled(n)?Promise.reject(n):(logger$1.warn(`Failed to rebuild project {projectId} after config change`,{projectId:d.id,error:n}),Promise.resolve())),d)}ownerProjectId(n){return this.#o.get(normalizeUri(n))?.id??this.#t??ProjectsManager.DefaultProjectId}#s=null;async reloadProjects(n){return this.#s?(logger$1.debug`reload projects is already in progress, waiting`,await this.#s.catch(()=>{})):(logger$1.debug`schedule reload projects`,this.#s=Promise.resolve().then(()=>this._reloadProjects(n)).catch(n=>(isOperationCancelled(n)||logger$1.warn(`Failed to reload projects`,{error:n}),Promise.reject(n))).finally(()=>{this.#s=null,this.notifyListeners()}),await this.#s)}async _reloadProjects(n){let i=this.services.workspace.WorkspaceManager.workspaceFolders;if(!i||i.length===0){logger$1.warn(`Failed to reloadProjects, no workspace folders found`);return}logger$1.debug`start reload projects`;let a=[];for(let n of i){let i=URI.parse(n.uri);logger$1.debug`scan projects in ${i.fsPath}`;try{let n=await this.services.workspace.FileSystemProvider.scanProjectFiles(i);for(let o of n)logger$1.debug`found config ${UriUtils.relative(i,o.uri)}`,a.push(o.uri)}catch(n){logger$1.warn(`Failed on scanProjectFiles in {folder}`,{folder:i.fsPath,error:n})}}if(a.length===0){if(this.#r.length===0){logger$1.warning(`No config files found`);return}logger$1.warning(`No config files found, but {count} projects were registered before`,{count:this.#r.length})}a.sort(compareUri);let o=new Map(this.#r.map(n=>[n.configUri.toString(),n]));this.#r=[],this.#i.clear();for(let n of a)try{await this.registerConfigFile(n)}catch(i){logger$1.warn(loggable(i));let a=o.get(n.toString());a&&(logger$1.debug`Update failed, restore project ${a.id}`,await this.registerProject(a))}this.resetCaches(),this.notifyListeners(),await this.services.workspace.WorkspaceManager.rebuildAll(n)}uniqueProjectId(n){let i=new Set(t$2(this.#r,e$1(`id`))),a=n;if(!i.has(a))return a;logger$1.warn`Project "${n}" already exists, generating unique ID`;let o=1;for(;i.has(a);)a=`${n}-${o++}`;return a}resetCaches(){logger$1.trace(`resetCaches`),this.#n=void 0,this.#t&&!this.#r.some(n=>n.id===this.#t)&&(this.#t=void 0),this.#i.clear(),this.#o.clear(),this.#a.clear()}async rebuildProject(n,i){let a=this.#r.find(i=>i.id===n);if(!a)return n===ProjectsManager.DefaultProjectId?logger$1.info`Rebuilding all documents `:logger$1.warn`Project ${n} not found, rebuilding all`,await this.services.workspace.WorkspaceManager.rebuildAll(i);let o=logger$1.getChild(a.id),s=this.services.workspace.LangiumDocuments.resetProjectIds().filter(n=>includes(a,normalizeUri(n)));s.length!==0&&(o.info(`rebuild project documents: {docs}`,{docs:s.length}),this.resetCaches(),await this.services.workspace.DocumentBuilder.update(s,[],i).catch(n=>{o.warn(`Failed to rebuild project`,{error:n})}))}getAllIncludePaths(){let n=[];for(let i of this.#r)if(i.includePaths)for(let a of i.includePaths)n.push({projectId:i.id,includePath:a.uri,includeConfig:i.includeConfig});return n}onProjectsUpdate(n){return this.#e.push(n),Disposable.create(()=>{let i=this.#e.indexOf(n);i>=0&&this.#e.splice(i,1)})}getWorkspaceFolder(){try{return this.services.workspace.WorkspaceManager.workspaceUri}catch(n){return logger$1.warn(`Failed to get workspace URI, using default folder`,{error:n}),URI.file(`/`)}}notifyListeners(){for(let n of this.#e)try{n()}catch(n){logger$1.warn(loggable(n))}}updateIncludesExcludes(n){let i=n.config;switch(!0){case e$2(i.exclude):n.exclude=DefaultProject.exclude;break;case i.exclude&&t$1(i.exclude,1):n.exclude=(0,import_picomatch.default)(t$2(i.exclude,i=>(!isRelative(i)&&!i.startsWith(`**`)&&(i=joinURL(`**`,i)),cleanDoubleSlashes(joinRelativeURL(n.folderUri.path,i)))),{contains:!0,dot:!0});break;default:delete n.exclude}let a=n.includeConfig.paths;if(!t$1(a,1))return delete n.includePaths,n;n.includePaths=t$2(a,i=>{let a=UriUtils.resolvePath(n.folderUri,i);return{uri:a,folder:ProjectFolder(a)}}),logger$1.debug`project ${n.id} include paths: ${n.includePaths.map(n=>n.uri.fsPath).join(`, `)}`;for(let i of n.includePaths)for(let a of this.#r)a.id!==n.id&&(overlaps(i,a)&&logger$1.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" folder. Files in overlapping areas will only belong to one project.`,{projectId:n.id,includePath:i.folder,otherProjectId:a.id}),a.includePaths?.forEach(o=>{overlaps(i,o)&&logger$1.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" include path "{otherIncludePath}". Files in overlapping areas will only belong to one project.`,{projectId:n.id,includePath:i.folder,otherProjectId:a.id,otherIncludePath:o.folder})}));return n}};export{NoMCPServer as n,NoopLikeC4MCPServer as r,ProjectsManager as t};