@likec4/language-server 1.29.1 → 1.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bundled.mjs CHANGED
@@ -2367,7 +2367,7 @@ return this._registeredResourceTemplates[e]=o,this.setResourceRequestHandlers(),
2367
2367
  "u"&&a.name!==e&&(delete this._registeredTools[e],a.name&&(this._registeredTools[a.name]=o)),typeof a.description<"u"&&(o.description=a.description),typeof a.paramsSchema<"u"&&(o.inputSchema=D.object(a.paramsSchema)),typeof a.callback<"u"&&(o.callback=a.callback),typeof a.enabled<"u"&&(o.enabled=a.enabled),this.sendToolListChanged()}};return this._registeredTools[e]=o,this.setToolRequestHandlers(),this.sendToolListChanged(),o}prompt(e,...n){if(this._registeredPrompts[e])throw new Error(`Prompt ${e}\
2368
2368
  is already registered`);let r;typeof n[0]=="string"&&(r=n.shift());let i;n.length>1&&(i=n.shift());const s=n[0],o={description:r,argsSchema:i===void 0?void 0:D.object(i),callback:s,enabled:!0,disable:()=>o.update({enabled:!1}),enable:()=>o.update({enabled:!0}),remove:()=>o.update({name:null}),update:a=>{typeof a.name<"u"&&a.name!==e&&(delete this._registeredPrompts[e],a.name&&(this._registeredPrompts[a.name]=o)),typeof a.description<"u"&&(o.description=a.description),typeof a.argsSchema<"u"&&(o.
2369
2369
  argsSchema=D.object(a.argsSchema)),typeof a.callback<"u"&&(o.callback=a.callback),typeof a.enabled<"u"&&(o.enabled=a.enabled),this.sendPromptListChanged()}};return this._registeredPrompts[e]=o,this.setPromptRequestHandlers(),this.sendPromptListChanged(),o}isConnected(){return this.server.transport!==void 0}sendResourceListChanged(){this.isConnected()&&this.server.sendResourceListChanged()}sendToolListChanged(){this.isConnected()&&this.server.sendToolListChanged()}sendPromptListChanged(){this.isConnected()&&
2370
- this.server.sendPromptListChanged()}}const wre={type:"object"};function bre(t){return Object.entries(t.shape).map(([e,n])=>({name:e,description:n.description,required:!n.isOptional()}))}function bO(t){return{completion:{values:t.slice(0,100),total:t.length,hasMore:t.length>100}}}const vv={completion:{values:[],hasMore:!1}},Ere="1.29.1",$re={version:Ere};var uk,EO;function kre(){return EO||(EO=1,uk=t=>{const e=t.match(/^[ \t]*(?=\S)/gm);return e?e.reduce((n,r)=>Math.min(n,r.length),1/0):0}),uk}var Rre=kre();
2370
+ this.server.sendPromptListChanged()}}const wre={type:"object"};function bre(t){return Object.entries(t.shape).map(([e,n])=>({name:e,description:n.description,required:!n.isOptional()}))}function bO(t){return{completion:{values:t.slice(0,100),total:t.length,hasMore:t.length>100}}}const vv={completion:{values:[],hasMore:!1}},Ere="1.30.0",$re={version:Ere};var uk,EO;function kre(){return EO||(EO=1,uk=t=>{const e=t.match(/^[ \t]*(?=\S)/gm);return e?e.reduce((n,r)=>Math.min(n,r.length),1/0):0}),uk}var Rre=kre();
2371
2371
  const Dre=En(Rre);function ap(t){const e=Dre(t);if(e===0)return t;const n=new RegExp(`^[ \\t]{${e}}`,"gm");return t.replace(n,"")}const Va=["this","it","self","super","likec4lib","global"];function kt(t){return async function(e,n,r){try{const i=t(e,n,r);vV(i)&&await i;return}catch(i){const s=i instanceof Error?i.message:String(i);n("error",`Validation failed: ${s}`,{node:e}),Ge.debug(`Validation failed: ${s}`,{error:i})}}}const{getDocument:Sre}=ou,Cre=t=>{const e=t.likec4.DeploymentsIndex,n=t.references.
2372
2372
  NameProvider;return kt((r,i)=>{const s=n.getName(r);if(!s){i("error","DeploymentNode must be named",{node:r});return}const o=Ue(n.getNameNode(r),"name CstNode not found").range;Va.includes(s)&&i("error",`Reserved word: ${s}`,{node:r,range:o});const a=pn(r),u=e.getFqn(r);e.byFqn(a,u).limit(2).toArray().length>1&&i("error",`Duplicate node name "${u}"`,{node:r,range:o})})},xre=t=>{const e=t.likec4.DeploymentsIndex,n=t.references.NameProvider;return kt((r,i)=>{const s=n.getName(r);if(!s){i("error","\
2373
2373
  Deployed instance must be named, unique inside node",{node:r});return}const o=Ue(n.getNameNode(r),"name CstNode not found").range;Va.includes(s)&&i("error",`Reserved word: ${s}`,{node:r,range:o});const a=pn(r),u=e.getFqn(r);e.byFqn(a,u).limit(2).toArray().length>1&&i("error",`Duplicate instance name "${u}"`,{node:r,range:o})})},Are=t=>{const e=t.likec4.ModelParser;return kt((n,r)=>{if(!n.target?.value?.ref){let u=n.target?.$cstNode?.text??"";r("error",`DeploymentRelation target '${u}' not resolv\
@@ -2376,31 +2376,32 @@ if(_t.isImportRef(a)){r("error","DeploymentRelation cannot refer imported model
2376
2376
  _re=t=>{const e=t.likec4.FqnIndex;return kt((n,r)=>{const i=Ga(n.source),s=i&&e.getFqn(i);s||r("error","Source not found (not parsed/indexed yet)",{node:n,property:"source"});const o=Ga(n.target),a=o&&e.getFqn(o);a||r("error","Target not found (not parsed/indexed yet)",{node:n,property:"target"}),s&&a&&(Lt(s,a)||Lt(a,s))&&r("error","Invalid parent-child relationship",{node:n})})},{getDocument:Pre}=ou,Ire=t=>{const e=t.likec4.FqnIndex,n=t.workspace.AstNodeLocator;return kt((r,i)=>{const s=e.getFqn(
2377
2377
  r);if(!s){i("error","Not indexed element",{node:r,property:"name"});return}Va.includes(r.name)&&i("error",`Reserved word: ${r.name}`,{node:r,property:"name"});const o=Pre(r),a=o.uri,u=n.getAstNodePath(r),c=e.byFqn(pn(o),s).filter(l=>l.documentUri!==a||l.path!==u).head();if(c){const l=c.documentUri!==a;i("error",`Duplicate element name ${r.name!==s?r.name+" ("+s+")":r.name}`,{node:r,property:"name",...l&&{relatedInformation:[{location:{range:c.nameSegment?.range??c.selectionSegment?.range,uri:c.documentUri.
2378
2378
  toString()},message:"conflicting element"}]}})}})},Nre=t=>kt((e,n)=>{Cee(e.modelElement)&&n("error","Only model elements allowed here",{node:e,property:"modelElement"})}),{getDocument:Ore}=ou,Fre=t=>{const e=t.shared.workspace.ProjectsManager;return kt((n,r)=>{const i=Ore(n),s=pn(i);if(n.project===s){r("error","Imported project cannot be the same as the current project",{node:n,property:"project"});return}if(!e.all.includes(n.project)){r("error","Imported project not found",{node:n,property:"pro\
2379
- ject"});return}})},Lre=t=>(t.likec4.FqnIndex,kt((e,n)=>{})),Mre=t=>kt((e,n)=>{const r=parseFloat(e.value);(isNaN(r)||r<0||r>100)&&n("warning","Value ignored, must be between 0% and 100%",{node:e,property:"value"})}),jre=t=>(e,n)=>{const r=e.$container;r.props.some(i=>yo(i)&&i!==e)&&n("error","Icon must be defined once",{node:e}),xu(r)&&Sg(r.$container)&&r.$container.props.some(i=>yo(i))&&n("warning","Redundant as icon defined on element",{node:e})},qre=t=>(e,n)=>{Bi(e,wb)||n("error","Notes can b\
2380
- e defined only inside dynamic view",{node:e})},Bre=t=>{const e=t.likec4.ModelParser;return kt((n,r)=>{const i=e.forDocument(Et(n)),s=PN(()=>i._resolveRelationSource(n));if(!s){r("error","Source not resolved",{node:n,property:"source"});return}const o=PN(()=>i.parseFqnRef(n.target));if(!o){r("error","Target not resolved",{node:n,property:"target"});return}_t.isImportRef(s)&&(_t.isImportRef(o)?r("warning","Relationship between imported elements may not be visible in origin projects",{node:n}):r("w\
2381
- arning","Relationship from imported element to local element may not be visible in origin project",{node:n,property:"source"})),xa(_t.toModelFqn(s),_t.toModelFqn(o))&&r("error","Invalid parent-child relationship",{node:n})})},zre=t=>kt((e,n)=>{e.$container.tags?.values&&e.tags?.values&&n("error","Relation cannot have tags in both header and body",{node:e.tags})}),Gre=t=>kt((e,n)=>{e.$containerIndex&&e.$containerIndex>0&&n("warning","Prefer one specification per document",{node:e,property:"name"})}),
2382
- Ure=t=>kt((e,n)=>{e.$containerIndex&&e.$containerIndex>0&&n("warning","Prefer one model per document",{node:e,property:"name"})}),Wre=t=>kt((e,n)=>{e.$containerIndex&&e.$containerIndex>0&&n("warning","Prefer one global block per document",{node:e,property:"name"})}),Hre=t=>{const e=t.shared.workspace.IndexManager;return kt((n,r)=>{Va.includes(n.name)&&r("error",`Reserved word: ${n.name}`,{node:n,property:"name"});const i=pn(n),s=e.projectElements(i,Ls).filter(o=>o.name===n.name&&o.node!==n).head();
2383
- if(s){const o=s.documentUri!==Et(n).uri;r("error",`Duplicate element kind '${n.name}'`,{node:n,property:"name",...o&&{relatedInformation:[{location:{range:s.nameSegment.range,uri:s.documentUri.toString()},message:"conflicting definition"}]}})}})},Vre=t=>{const e=t.shared.workspace.IndexManager;return kt((n,r)=>{Va.includes(n.name)&&r("error",`Reserved word: ${n.name}`,{node:n,property:"name"});const i=pn(n),s=e.projectElements(i,Fs).filter(o=>o.name===n.name&&o.node!==n).head();if(s){const o=s.documentUri!==
2384
- Et(n).uri;r("error",`Duplicate deploymentNode kind '${n.name}'`,{node:n,property:"name",...o&&{relatedInformation:[{location:{range:s.nameSegment.range,uri:s.documentUri.toString()},message:"conflicting definition"}]}})}})},Kre=t=>{const e=t.shared.workspace.IndexManager;return kt((n,r)=>{const i="#"+n.name,s=pn(n),o=e.projectElements(s,bo).filter(a=>a.name===i&&a.node!==n).head();if(o){const a=o.documentUri!==Et(n).uri;r("error",`Duplicate tag '${n.name}'`,{node:n,property:"name",...a&&{relatedInformation:[
2385
- {location:{range:o.nameSegment.range,uri:o.documentUri.toString()},message:"conflicting definition"}]}})}})},Zre=t=>{const e=t.shared.workspace.IndexManager;return kt((n,r)=>{Va.includes(n.name)&&r("error",`Reserved word: ${n.name}`,{node:n,property:"name"});const i=pn(n);e.projectElements(i,wo).filter(s=>s.name===n.name).limit(2).count()>1&&r("error",`Duplicate RelationshipKind '${n.name}'`,{node:n,property:"name"})})},$O=t=>{const e=t.shared.workspace.IndexManager;return kt((n,r)=>{const i=pn(
2386
- n),s=e.projectElements(i,Pu),o=e.projectElements(i,_u);s.concat(o).filter(a=>a.name===n.name).limit(2).count()>1&&r("error",`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${n.name}'`,{node:n,property:"name"})})},Yre=t=>{const e=t.shared.workspace.IndexManager;return kt((n,r)=>{const i=pn(n);e.projectElements(i,ff).filter(s=>s.name===n.name).limit(2).count()>1&&r("error",`Duplicate GlobalStyleId name '${n.name}'`,{node:n,property:"name"})})},Xre=t=>{const e=t.shared.workspace.
2387
- IndexManager;return kt((n,r)=>{if(!n.name)return;Va.includes(n.name)&&r("error",`Reserved word: ${n.name}`,{node:n,property:"name"});const i=pn(n);e.projectElements(i,ba).filter(s=>s.name===n.name).limit(2).count()>1&&r("error",`Duplicate view '${n.name}'`,{node:n,property:"name"})})},Jre=t=>{const e=t.likec4.ModelParser;return kt((n,r)=>{const i=nv(n);if(i?.$type!=="DynamicViewIncludePredicate"&&i?.isInclude!==!0){r("error",'Invalid usage inside "exclude"',{node:n});return}const s=i.$type==="Dy\
2388
- namicViewIncludePredicate",o=e.forDocument(Et(i));let a=fe.unwrap(o.parseFqnExprWith(n).custom.expr);switch(!0){case(fe.isWildcard(a)&&s):case(fe.isElementKindExpr(a)&&s):case(fe.isElementTagExpr(a)&&s):{r("warning","Predicate is ignored, as not supported in dynamic views",{node:n});return}case fe.isWildcard(a):case fe.isModelRef(a):case fe.isDeploymentRef(a):return;case fe.isElementKindExpr(a):case fe.isElementTagExpr(a):r("error","Invalid target (expect reference to specific element)",{node:n,
2389
- property:"subject"});return;default:De(a)}})},Qre=t=>{const e=t.likec4.ModelParser;return kt((n,r)=>{const i=e.forDocument(Et(n)).parseFqnRefExpr(n),s=nv(n),o=hee(n)&&!Bi(n,a=>Yd(a)||Vu(a));if(s?.$type==="DeploymentViewRulePredicate"||o){if(!Bi(n,og)){if(fe.isModelRef(i)){r("error","Deployment view predicate must reference deployment model",{node:n});return}if(fe.isDeploymentRef(i)&&_t.isInsideInstanceRef(i.ref)){r("error","Must reference deployment nodes or instances, but not internals",{node:n});
2390
- return}}K(n.selector)&&!Er(n.ref.value?.ref)&&r("warning",`Selector '${n.selector}' applies to deployment nodes only, ignored here`,{node:n,property:"selector"});return}if(s?.$type==="DynamicViewIncludePredicate")switch(!0){case fe.isElementKindExpr(i):case fe.isElementTagExpr(i):case fe.isWildcard(i):{r("warning","Predicate is ignored, as not supported in dynamic views",{node:n});return}}})},eie=t=>kt((e,n)=>{if(e.to.$type==="WildcardExpression"&&!v_(e.$container)){const r=Ar(e,xg);ft(r?.viewOf)&&
2391
- n("warning","Predicate is ignored as it concerns all relationships",{node:e})}}),tie=t=>kt((e,n)=>{if(nv(e)?.$type==="ViewRulePredicate"&&e.$container.$type!=="DirectedRelationExpr"&&e.from.$type==="WildcardExpression"){const r=Ar(e,xg);r&&ft(r.viewOf)&&n("warning","Predicate is ignored as it concerns all relationships",{node:e})}}),nie=t=>{const e=t.likec4.ModelParser;return kt((n,r)=>{const i=Ar(n,Su);if(!i||i.isInclude!==!0)return;const s=Et(n),o=e.forDocument(s);let a=lr.unwrap(o.parseRelationExpr(
2392
- n));const u="Model reference is allowed in exclude predicate only";if(lr.isDirect(a)){(fe.isModelRef(a.source)||fe.isModelRef(a.target))&&r("error",u,{node:n});return}let c;if(lr.isIncoming(a)?c=a.incoming:lr.isOutgoing(a)?c=a.outgoing:c=a.inout,fe.isModelRef(c)){r("error",u,{node:n});return}})},rie=t=>kt((e,n)=>{const r=nv(e);if(!(!r||r.$type=="DynamicViewIncludePredicate")&&!r.isInclude){n("error",'Invalid usage inside "exclude"',{node:e});return}});function iie(t){return e=>t.some(n=>n(e))}const sie=iie(
2393
- [Cb,Ms,Sb,df,lf,Nu,Da,Ng,_b,XT,og,yb,wb,HU,Su,KU,og,Db,JU,pb,Ob,QU,ab,db,mb,Or,Er,Ki,e_,go,qs,VU,t_,Gg,zn,bb,Tu,ka,zu,Uu,qu,Xg,Yg,D_]),oie=t=>{let e=t;for(;e&&!w_(e);){if(sie(e))return e;e=e.$container}};function aie(t){const e=t.state>=ve.Validated?t.diagnostics?.filter(r=>r.severity===$d.Error)??[]:[],n=new WeakSet;for(const{node:r}of e){if(ft(r)||n.has(r))continue;n.add(r);const i=oie(r);i&&n.add(i)}return{isValid:r=>!n.has(r),invalidNodes:n}}function uie(t){Ge.debug("registerValidationChecks"),
2394
- t.validation.ValidationRegistry.register({DeployedInstance:xre(t),DeploymentNodeKind:Vre(t),DeploymentNode:Cre(t),DeploymentRelation:Are(t),ExtendDeployment:Tre(),FqnRefExpr:Qre(t),RelationExpr:nie(t),NotesProperty:qre(),OpacityProperty:Mre(),IconProperty:jre(),SpecificationRule:Gre(),Model:Ure(),Globals:Wre(),GlobalPredicateGroup:$O(t),GlobalDynamicPredicateGroup:$O(t),GlobalStyleId:Yre(t),DynamicViewStep:_re(t),LikeC4View:Xre(t),Element:Ire(t),ElementRef:Nre(),ElementKind:Hre(t),Relation:Bre(t),
2395
- RelationBody:zre(),Tag:Kre(t),FqnExprWith:Jre(t),RelationExprWith:rie(),RelationshipKind:Zre(t),IncomingRelationExpr:eie(),OutgoingRelationExpr:tie(),ImportsFromPoject:Fre(t),Imported:Lre(t)});const e=t.shared.lsp.Connection;e&&t.shared.workspace.DocumentBuilder.onUpdate((n,r)=>{for(const i of r)Ge.debug(`clear diagnostics for deleted ${i.path}`),e.sendDiagnostics({uri:i.toString(),diagnostics:[]})})}function Ni(t){return yn(t)?St(t).split(`
2379
+ ject"});return}})},Lre=t=>(t.likec4.FqnIndex,kt((e,n)=>{})),Mre=t=>kt((e,n)=>{const r=parseFloat(e.value);(isNaN(r)||r<0||r>100)&&n("warning","Value ignored, must be between 0% and 100%",{node:e,property:"value"})}),jre=t=>(e,n)=>{const r=e.$container;r.props.some(i=>yo(i)&&i!==e)&&n("error","Icon must be defined once",{node:e}),xu(r)&&Sg(r.$container)&&r.$container.props.some(i=>yo(i))&&n("warning","Redundant as icon defined on element",{node:e}),e.value?.startsWith("file://")&&n("error","Icon \
2380
+ URI must not start with file://",{node:e,property:"value"})},qre=t=>(e,n)=>{Bi(e,wb)||n("error","Notes can be defined only inside dynamic view",{node:e})},Bre=t=>{const e=t.likec4.ModelParser;return kt((n,r)=>{const i=e.forDocument(Et(n)),s=PN(()=>i._resolveRelationSource(n));if(!s){r("error","Source not resolved",{node:n,property:"source"});return}const o=PN(()=>i.parseFqnRef(n.target));if(!o){r("error","Target not resolved",{node:n,property:"target"});return}_t.isImportRef(s)&&(_t.isImportRef(
2381
+ o)?r("warning","Relationship between imported elements may not be visible in origin projects",{node:n}):r("warning","Relationship from imported element to local element may not be visible in origin project",{node:n,property:"source"})),xa(_t.toModelFqn(s),_t.toModelFqn(o))&&r("error","Invalid parent-child relationship",{node:n})})},zre=t=>kt((e,n)=>{e.$container.tags?.values&&e.tags?.values&&n("error","Relation cannot have tags in both header and body",{node:e.tags})}),Gre=t=>kt((e,n)=>{e.$containerIndex&&
2382
+ e.$containerIndex>0&&n("warning","Prefer one specification per document",{node:e,property:"name"})}),Ure=t=>kt((e,n)=>{e.$containerIndex&&e.$containerIndex>0&&n("warning","Prefer one model per document",{node:e,property:"name"})}),Wre=t=>kt((e,n)=>{e.$containerIndex&&e.$containerIndex>0&&n("warning","Prefer one global block per document",{node:e,property:"name"})}),Hre=t=>{const e=t.shared.workspace.IndexManager;return kt((n,r)=>{Va.includes(n.name)&&r("error",`Reserved word: ${n.name}`,{node:n,
2383
+ property:"name"});const i=pn(n),s=e.projectElements(i,Ls).filter(o=>o.name===n.name&&o.node!==n).head();if(s){const o=s.documentUri!==Et(n).uri;r("error",`Duplicate element kind '${n.name}'`,{node:n,property:"name",...o&&{relatedInformation:[{location:{range:s.nameSegment.range,uri:s.documentUri.toString()},message:"conflicting definition"}]}})}})},Vre=t=>{const e=t.shared.workspace.IndexManager;return kt((n,r)=>{Va.includes(n.name)&&r("error",`Reserved word: ${n.name}`,{node:n,property:"name"});
2384
+ const i=pn(n),s=e.projectElements(i,Fs).filter(o=>o.name===n.name&&o.node!==n).head();if(s){const o=s.documentUri!==Et(n).uri;r("error",`Duplicate deploymentNode kind '${n.name}'`,{node:n,property:"name",...o&&{relatedInformation:[{location:{range:s.nameSegment.range,uri:s.documentUri.toString()},message:"conflicting definition"}]}})}})},Kre=t=>{const e=t.shared.workspace.IndexManager;return kt((n,r)=>{const i="#"+n.name,s=pn(n),o=e.projectElements(s,bo).filter(a=>a.name===i&&a.node!==n).head();
2385
+ if(o){const a=o.documentUri!==Et(n).uri;r("error",`Duplicate tag '${n.name}'`,{node:n,property:"name",...a&&{relatedInformation:[{location:{range:o.nameSegment.range,uri:o.documentUri.toString()},message:"conflicting definition"}]}})}})},Zre=t=>{const e=t.shared.workspace.IndexManager;return kt((n,r)=>{Va.includes(n.name)&&r("error",`Reserved word: ${n.name}`,{node:n,property:"name"});const i=pn(n);e.projectElements(i,wo).filter(s=>s.name===n.name).limit(2).count()>1&&r("error",`Duplicate Relati\
2386
+ onshipKind '${n.name}'`,{node:n,property:"name"})})},$O=t=>{const e=t.shared.workspace.IndexManager;return kt((n,r)=>{const i=pn(n),s=e.projectElements(i,Pu),o=e.projectElements(i,_u);s.concat(o).filter(a=>a.name===n.name).limit(2).count()>1&&r("error",`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${n.name}'`,{node:n,property:"name"})})},Yre=t=>{const e=t.shared.workspace.IndexManager;return kt((n,r)=>{const i=pn(n);e.projectElements(i,ff).filter(s=>s.name===n.name).limit(
2387
+ 2).count()>1&&r("error",`Duplicate GlobalStyleId name '${n.name}'`,{node:n,property:"name"})})},Xre=t=>{const e=t.shared.workspace.IndexManager;return kt((n,r)=>{if(!n.name)return;Va.includes(n.name)&&r("error",`Reserved word: ${n.name}`,{node:n,property:"name"});const i=pn(n);e.projectElements(i,ba).filter(s=>s.name===n.name).limit(2).count()>1&&r("error",`Duplicate view '${n.name}'`,{node:n,property:"name"})})},Jre=t=>{const e=t.likec4.ModelParser;return kt((n,r)=>{const i=nv(n);if(i?.$type!==
2388
+ "DynamicViewIncludePredicate"&&i?.isInclude!==!0){r("error",'Invalid usage inside "exclude"',{node:n});return}const s=i.$type==="DynamicViewIncludePredicate",o=e.forDocument(Et(i));let a=fe.unwrap(o.parseFqnExprWith(n).custom.expr);switch(!0){case(fe.isWildcard(a)&&s):case(fe.isElementKindExpr(a)&&s):case(fe.isElementTagExpr(a)&&s):{r("warning","Predicate is ignored, as not supported in dynamic views",{node:n});return}case fe.isWildcard(a):case fe.isModelRef(a):case fe.isDeploymentRef(a):return;case fe.
2389
+ isElementKindExpr(a):case fe.isElementTagExpr(a):r("error","Invalid target (expect reference to specific element)",{node:n,property:"subject"});return;default:De(a)}})},Qre=t=>{const e=t.likec4.ModelParser;return kt((n,r)=>{const i=e.forDocument(Et(n)).parseFqnRefExpr(n),s=nv(n),o=hee(n)&&!Bi(n,a=>Yd(a)||Vu(a));if(s?.$type==="DeploymentViewRulePredicate"||o){if(!Bi(n,og)){if(fe.isModelRef(i)){r("error","Deployment view predicate must reference deployment model",{node:n});return}if(fe.isDeploymentRef(
2390
+ i)&&_t.isInsideInstanceRef(i.ref)){r("error","Must reference deployment nodes or instances, but not internals",{node:n});return}}K(n.selector)&&!Er(n.ref.value?.ref)&&r("warning",`Selector '${n.selector}' applies to deployment nodes only, ignored here`,{node:n,property:"selector"});return}if(s?.$type==="DynamicViewIncludePredicate")switch(!0){case fe.isElementKindExpr(i):case fe.isElementTagExpr(i):case fe.isWildcard(i):{r("warning","Predicate is ignored, as not supported in dynamic views",{node:n});
2391
+ return}}})},eie=t=>kt((e,n)=>{if(e.to.$type==="WildcardExpression"&&!v_(e.$container)){const r=Ar(e,xg);ft(r?.viewOf)&&n("warning","Predicate is ignored as it concerns all relationships",{node:e})}}),tie=t=>kt((e,n)=>{if(nv(e)?.$type==="ViewRulePredicate"&&e.$container.$type!=="DirectedRelationExpr"&&e.from.$type==="WildcardExpression"){const r=Ar(e,xg);r&&ft(r.viewOf)&&n("warning","Predicate is ignored as it concerns all relationships",{node:e})}}),nie=t=>{const e=t.likec4.ModelParser;return kt(
2392
+ (n,r)=>{const i=Ar(n,Su);if(!i||i.isInclude!==!0)return;const s=Et(n),o=e.forDocument(s);let a=lr.unwrap(o.parseRelationExpr(n));const u="Model reference is allowed in exclude predicate only";if(lr.isDirect(a)){(fe.isModelRef(a.source)||fe.isModelRef(a.target))&&r("error",u,{node:n});return}let c;if(lr.isIncoming(a)?c=a.incoming:lr.isOutgoing(a)?c=a.outgoing:c=a.inout,fe.isModelRef(c)){r("error",u,{node:n});return}})},rie=t=>kt((e,n)=>{const r=nv(e);if(!(!r||r.$type=="DynamicViewIncludePredicate")&&
2393
+ !r.isInclude){n("error",'Invalid usage inside "exclude"',{node:e});return}});function iie(t){return e=>t.some(n=>n(e))}const sie=iie([Cb,Ms,Sb,df,lf,Nu,Da,Ng,_b,XT,og,yb,wb,HU,Su,KU,og,Db,JU,pb,Ob,QU,ab,db,mb,Or,Er,Ki,e_,go,qs,VU,t_,Gg,zn,bb,Tu,ka,zu,Uu,qu,Xg,Yg,D_]),oie=t=>{let e=t;for(;e&&!w_(e);){if(sie(e))return e;e=e.$container}};function aie(t){const e=t.state>=ve.Validated?t.diagnostics?.filter(r=>r.severity===$d.Error)??[]:[],n=new WeakSet;for(const{node:r}of e){if(ft(r)||n.has(r))continue;
2394
+ n.add(r);const i=oie(r);i&&n.add(i)}return{isValid:r=>!n.has(r),invalidNodes:n}}function uie(t){Ge.debug("registerValidationChecks"),t.validation.ValidationRegistry.register({DeployedInstance:xre(t),DeploymentNodeKind:Vre(t),DeploymentNode:Cre(t),DeploymentRelation:Are(t),ExtendDeployment:Tre(),FqnRefExpr:Qre(t),RelationExpr:nie(t),NotesProperty:qre(),OpacityProperty:Mre(),IconProperty:jre(),SpecificationRule:Gre(),Model:Ure(),Globals:Wre(),GlobalPredicateGroup:$O(t),GlobalDynamicPredicateGroup:$O(
2395
+ t),GlobalStyleId:Yre(t),DynamicViewStep:_re(t),LikeC4View:Xre(t),Element:Ire(t),ElementRef:Nre(),ElementKind:Hre(t),Relation:Bre(t),RelationBody:zre(),Tag:Kre(t),FqnExprWith:Jre(t),RelationExprWith:rie(),RelationshipKind:Zre(t),IncomingRelationExpr:eie(),OutgoingRelationExpr:tie(),ImportsFromPoject:Fre(t),Imported:Lre(t)});const e=t.shared.lsp.Connection;e&&t.shared.workspace.DocumentBuilder.onUpdate((n,r)=>{for(const i of r)Ge.debug(`clear diagnostics for deleted ${i.path}`),e.sendDiagnostics({
2396
+ uri:i.toString(),diagnostics:[]})})}function Ni(t){return yn(t)?St(t).split(`
2396
2397
  `).join(" "):void 0}function St(t){return yn(t)?ap(t).trim():void 0}class cie{constructor(e,n){this.services=e,this.doc=n,this.isValid=aie(n).isValid}isValid;get project(){return this.services.shared.workspace.ProjectsManager.getProject(this.doc)}resolveFqn(e){if(Ms(e)){const n=pn(e),r=this.resolveFqn(Ue(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(n,r),ky(n,r)}return Tu(e)?Ua(e.element):ka(e)?Ua(e.deploymentNode):Qm(e)?this.services.likec4.DeploymentsIndex.
2397
2398
  getFqn(e):this.services.likec4.FqnIndex.getFqn(e)}getAstNodePath(e){return this.services.workspace.AstNodeLocator.getAstNodePath(e)}getMetadata(e){if(!e||!this.isValid(e)||$t(e.props))return;const n=X(e.props,Fe(r=>[r.key,St(r.value)]),Ee(([r,i])=>K(i)),NV());return $t(n)?void 0:n}convertTags(e){return this.parseTags(e)}parseTags(e){let n=e?.tags;if(!n)return null;let r=[];for(;n;){try{if(this.isValid(n)){const i=n.values.map(s=>s.ref?.name).filter(K);i.length>0&&r.push(...i)}}catch{}n=n.prev}return r=
2398
2399
  $r(r.reverse()),Pn(r)?r:null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!(!e?.props||e.props.length===0))return X(e.props,Ee(Bg),Ut(n=>{if(!this.isValid(n))return[];const r=n.value;if(K(r)){const i=K(n.title)?Ni(n.title):void 0,s=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,r);return{url:r,...i&&{title:i},...s&&s!==r&&{relative:s}}}return[]}))}parseIconProperty(e){if(!e||!this.isValid(e))return;const{libicon:n,value:r}=e;switch(!0){case!!n:return n.ref?.name;case(r&&
2399
- r==="none"):return r;case(r&&Na(r)):return r;case(r&&l$(r)):return My(this.doc.uri.toString(),"../",r);case(r&&Ly(r)):return FX(this.project.folder.toString(),r);default:return}}parseElementStyle(e){if(!e)return{};if(fh(e)){const n=this.parseStyleProps(e?.find(xu)?.props),r=this.parseIconProperty(e?.find(yo));return r&&(n.icon=r),n}return this.parseStyleProps(e.props)}parseStyleProps(e){const n={};if(!e||e.length===0)return n;for(const r of e)if(this.isValid(r))switch(!0){case pg(r):{K(r.value)&&
2400
- (n.border=r.value);break}case Ea(r):{const i=Uh(r);K(i)&&(n.color=i);break}case Kg(r):{K(r.value)&&(n.shape=r.value);break}case yo(r):{const i=this.parseIconProperty(r);K(i)&&(n.icon=i);break}case Ug(r):{n.opacity=TN(r);break}case xb(r):{n.multiple=yy(r.value)?r.value:!1;break}case Pb(r):{K(r.value)&&(n.size=vc(r));break}case Ab(r):{K(r.value)&&(n.padding=vc(r));break}case Fb(r):{K(r.value)&&(n.textSize=vc(r));break}default:De(r)}return n}}function lie(t,e,n){return{id:e.id,parent:e.parent?{id:e.
2401
- parent.id,title:e.parent.title,kind:e.parent.kind}:null,projectId:n,title:e.title,kind:e.kind,shape:e.shape,technology:e.technology,description:e.description,tags:e.tags,children:ht(sc(e.children(),r=>({id:r.id,title:r.title,kind:e.kind}))),relations:{incoming:ht(sc(e.incoming(),r=>({id:r.id,title:r.title,description:r.description,technology:r.technology,source:{id:r.source.id,title:r.source.title,kind:r.source.kind},...r.target.id===e.id?{type:"direct"}:{type:"implicit, to nested",target:{id:r.
2402
- target.id,title:r.target.title,kind:r.target.kind}}}))),outgoing:ht(sc(e.outgoing(),r=>({id:r.id,title:r.title,description:r.description,technology:r.technology,target:{id:r.target.id,title:r.target.title,kind:r.target.kind},...r.source.id===e.id?{type:"direct"}:{type:"implicit, from nested",source:{id:r.source.id,title:r.source.title,kind:r.source.kind}}})))},views:ht(sc(e.views(),r=>({id:r.id,title:r.title}))),sourceFile:t.locate({element:e.id,projectId:n})}}function die(t,e,n){return{id:e.id,
2403
- title:e.title,projectId:n,viewType:e.__,description:e.$view.description??"",tags:e.tags,nodes:ht(sc(e.nodes(),r=>({id:r.id,title:r.title,represents:r.element?{element:r.element.id}:{}}))),sourceFile:t.locate({view:e.id,projectId:n})}}const kO=Ge.getChild("LikeC4MCPServices");function Ka(t){const e=Ni(t)?.replaceAll('"',"'");return e?`"${e}"`:"null"}function RO(t,e,n){const r=[...t];return r.length===0?[e]:Ut(r,n)}var DO;(t=>(t.instructions=`This server provides access to LikeC4 model.
2400
+ r==="none"):return r;case(r&&Na(r)):return r.startsWith("file:")?void 0:r;case(r&&l$(r)):return My(this.doc.uri.toString(),"../",r);case(r&&Ly(r)):return FX(this.project.folder.toString(),r);default:return}}parseElementStyle(e){if(!e)return{};if(fh(e)){const n=this.parseStyleProps(e?.find(xu)?.props),r=this.parseIconProperty(e?.find(yo));return r&&(n.icon=r),n}return this.parseStyleProps(e.props)}parseStyleProps(e){const n={};if(!e||e.length===0)return n;for(const r of e)if(this.isValid(r))switch(!0){case pg(
2401
+ r):{K(r.value)&&(n.border=r.value);break}case Ea(r):{const i=Uh(r);K(i)&&(n.color=i);break}case Kg(r):{K(r.value)&&(n.shape=r.value);break}case yo(r):{const i=this.parseIconProperty(r);K(i)&&(n.icon=i);break}case Ug(r):{n.opacity=TN(r);break}case xb(r):{n.multiple=yy(r.value)?r.value:!1;break}case Pb(r):{K(r.value)&&(n.size=vc(r));break}case Ab(r):{K(r.value)&&(n.padding=vc(r));break}case Fb(r):{K(r.value)&&(n.textSize=vc(r));break}default:De(r)}return n}}function lie(t,e,n){return{id:e.id,parent:e.
2402
+ parent?{id:e.parent.id,title:e.parent.title,kind:e.parent.kind}:null,projectId:n,title:e.title,kind:e.kind,shape:e.shape,technology:e.technology,description:e.description,tags:e.tags,children:ht(sc(e.children(),r=>({id:r.id,title:r.title,kind:e.kind}))),relations:{incoming:ht(sc(e.incoming(),r=>({id:r.id,title:r.title,description:r.description,technology:r.technology,source:{id:r.source.id,title:r.source.title,kind:r.source.kind},...r.target.id===e.id?{type:"direct"}:{type:"implicit, to nested",
2403
+ target:{id:r.target.id,title:r.target.title,kind:r.target.kind}}}))),outgoing:ht(sc(e.outgoing(),r=>({id:r.id,title:r.title,description:r.description,technology:r.technology,target:{id:r.target.id,title:r.target.title,kind:r.target.kind},...r.source.id===e.id?{type:"direct"}:{type:"implicit, from nested",source:{id:r.source.id,title:r.source.title,kind:r.source.kind}}})))},views:ht(sc(e.views(),r=>({id:r.id,title:r.title}))),sourceFile:t.locate({element:e.id,projectId:n})}}function die(t,e,n){return{
2404
+ id:e.id,title:e.title,projectId:n,viewType:e.__,description:e.$view.description??"",tags:e.tags,nodes:ht(sc(e.nodes(),r=>({id:r.id,title:r.title,represents:r.element?{element:r.element.id}:{}}))),sourceFile:t.locate({view:e.id,projectId:n})}}const kO=Ge.getChild("LikeC4MCPServices");function Ka(t){const e=Ni(t)?.replaceAll('"',"'");return e?`"${e}"`:"null"}function RO(t,e,n){const r=[...t];return r.length===0?[e]:Ut(r,n)}var DO;(t=>(t.instructions=`This server provides access to LikeC4 model.
2404
2405
 
2405
2406
  Key capabilities:
2406
2407
  - List all available LikeC4 projects in the workspace
@@ -139,6 +139,9 @@ export class BaseParser {
139
139
  return value;
140
140
  }
141
141
  case (value && hasProtocol(value)): {
142
+ if (value.startsWith("file:")) {
143
+ return void 0;
144
+ }
142
145
  return value;
143
146
  }
144
147
  case (value && isRelative(value)): {
@@ -26,6 +26,12 @@ export const iconPropertyRuleChecks = (_) => {
26
26
  node
27
27
  });
28
28
  }
29
+ if (node.value?.startsWith("file://")) {
30
+ accept("error", `Icon URI must not start with file://`, {
31
+ node,
32
+ property: "value"
33
+ });
34
+ }
29
35
  };
30
36
  };
31
37
  export const notesPropertyRuleChecks = (_) => {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@likec4/language-server",
3
3
  "description": "LikeC4 Language Server",
4
- "version": "1.29.1",
4
+ "version": "1.30.0",
5
5
  "license": "MIT",
6
6
  "bugs": "https://github.com/likec4/likec4/issues",
7
7
  "homepage": "https://likec4.dev",
@@ -130,11 +130,11 @@
130
130
  "vscode-languageserver-protocol": "3.17.5",
131
131
  "vscode-languageserver-types": "3.17.5",
132
132
  "which": "^5.0.0",
133
- "@likec4/core": "1.29.1",
134
- "@likec4/icons": "1.29.1",
135
- "@likec4/layouts": "1.29.1",
136
- "@likec4/log": "1.29.1",
137
- "@likec4/tsconfig": "1.29.1"
133
+ "@likec4/core": "1.30.0",
134
+ "@likec4/icons": "1.30.0",
135
+ "@likec4/layouts": "1.30.0",
136
+ "@likec4/log": "1.30.0",
137
+ "@likec4/tsconfig": "1.30.0"
138
138
  },
139
139
  "scripts": {
140
140
  "typecheck": "tsc --noEmit",