@likec4/language-server 0.30.0 → 0.31.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/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # LikeC4 Language Server
2
+
3
+ Language Server Protocol (LSP) based on [languim](https://github.com/languim/languim) library.
package/dist/ast.d.ts CHANGED
@@ -16,7 +16,8 @@ export interface ParsedAstElement {
16
16
  title: string;
17
17
  description?: string;
18
18
  technology?: string;
19
- tags?: c4.Tag[];
19
+ tags?: c4.NonEmptyArray<c4.Tag>;
20
+ links?: c4.NonEmptyArray<string>;
20
21
  shape?: c4.ElementShape;
21
22
  color?: c4.ThemeColor;
22
23
  }
@@ -33,6 +34,8 @@ export interface ParsedAstElementView {
33
34
  viewOf?: c4.Fqn;
34
35
  title?: string;
35
36
  description?: string;
37
+ tags?: c4.NonEmptyArray<c4.Tag>;
38
+ links?: c4.NonEmptyArray<string>;
36
39
  rules: c4.ViewRule[];
37
40
  }
38
41
  export declare const ElementViewOps: {
package/dist/ast.js CHANGED
@@ -8,7 +8,7 @@ export { ast };
8
8
  const idattr = Symbol.for('idattr');
9
9
  export const ElementViewOps = {
10
10
  writeId(node, id) {
11
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, no-extra-semi
12
12
  ;
13
13
  node[idattr] = id;
14
14
  return node;
@@ -25,7 +25,7 @@ export const ElementOps = {
25
25
  delete node[idattr];
26
26
  }
27
27
  else {
28
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, no-extra-semi
29
29
  ;
30
30
  node[idattr] = id;
31
31
  }
@@ -120,8 +120,9 @@ export interface ElementView extends AstNode {
120
120
  readonly $container: ModelViews;
121
121
  readonly $type: 'ElementView';
122
122
  name?: Name;
123
- properties: Array<ViewProperty>;
123
+ props: Array<LinkProperty | ViewProperty>;
124
124
  rules: Array<ViewRuleAutoLayout | ViewRuleExpression | ViewRuleStyle>;
125
+ tags?: Tags;
125
126
  viewOf?: ElementRef;
126
127
  }
127
128
  export declare const ElementView = "ElementView";
@@ -166,7 +167,7 @@ export interface LikeC4Document extends AstNode {
166
167
  export declare const LikeC4Document = "LikeC4Document";
167
168
  export declare function isLikeC4Document(item: unknown): item is LikeC4Document;
168
169
  export interface LinkProperty extends AstNode {
169
- readonly $container: ElementBody;
170
+ readonly $container: ElementBody | ElementView;
170
171
  readonly $type: 'LinkProperty';
171
172
  key: 'link';
172
173
  value: Uri;
@@ -288,7 +289,7 @@ export interface Tag extends AstNode {
288
289
  export declare const Tag = "Tag";
289
290
  export declare function isTag(item: unknown): item is Tag;
290
291
  export interface Tags extends AstNode {
291
- readonly $container: ElementBody | RelationBody;
292
+ readonly $container: ElementBody | ElementView | RelationBody;
292
293
  readonly $type: 'Tags';
293
294
  value: Array<Reference<Tag>>;
294
295
  }
@@ -23,7 +23,7 @@ export function isExpression(item) {
23
23
  return reflection.isInstance(item, Expression);
24
24
  }
25
25
  export function isName(item) {
26
- return isElementShape(item) || isThemeColor(item) || item === 'element' || item === 'model' || (typeof item === 'string' && (/((([^\W\d_])|(_))((([^\W\d_])|([0-9]))|(_))*)/.test(item)));
26
+ return isElementShape(item) || isThemeColor(item) || item === 'element' || item === 'model' || (typeof item === 'string' && (/((([^\W\d_])|(_))(((([^\W\d_])|([0-9]))|(_))|(-))*)/.test(item)));
27
27
  }
28
28
  export function isRArrow(item) {
29
29
  return (typeof item === 'string' && (/->/.test(item)));
@@ -308,7 +308,7 @@ export class LikeC4AstReflection extends AbstractAstReflection {
308
308
  return {
309
309
  name: 'ElementView',
310
310
  mandatory: [
311
- { name: 'properties', type: 'array' },
311
+ { name: 'props', type: 'array' },
312
312
  { name: 'rules', type: 'array' }
313
313
  ]
314
314
  };
@@ -125,7 +125,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
125
125
  {
126
126
  "$type": "RuleCall",
127
127
  "rule": {
128
- "$ref": "#/rules@56"
128
+ "$ref": "#/rules@57"
129
129
  },
130
130
  "arguments": []
131
131
  },
@@ -157,7 +157,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
157
157
  {
158
158
  "$type": "RuleCall",
159
159
  "rule": {
160
- "$ref": "#/rules@57"
160
+ "$ref": "#/rules@58"
161
161
  },
162
162
  "arguments": []
163
163
  }
@@ -183,7 +183,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
183
183
  {
184
184
  "$type": "RuleCall",
185
185
  "rule": {
186
- "$ref": "#/rules@56"
186
+ "$ref": "#/rules@57"
187
187
  },
188
188
  "arguments": []
189
189
  },
@@ -197,7 +197,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
197
197
  {
198
198
  "$type": "RuleCall",
199
199
  "rule": {
200
- "$ref": "#/rules@57"
200
+ "$ref": "#/rules@58"
201
201
  },
202
202
  "arguments": []
203
203
  }
@@ -238,7 +238,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
238
238
  {
239
239
  "$type": "RuleCall",
240
240
  "rule": {
241
- "$ref": "#/rules@56"
241
+ "$ref": "#/rules@57"
242
242
  },
243
243
  "arguments": []
244
244
  },
@@ -258,7 +258,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
258
258
  {
259
259
  "$type": "RuleCall",
260
260
  "rule": {
261
- "$ref": "#/rules@57"
261
+ "$ref": "#/rules@58"
262
262
  },
263
263
  "arguments": []
264
264
  }
@@ -302,7 +302,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
302
302
  {
303
303
  "$type": "RuleCall",
304
304
  "rule": {
305
- "$ref": "#/rules@56"
305
+ "$ref": "#/rules@57"
306
306
  },
307
307
  "arguments": []
308
308
  },
@@ -322,7 +322,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
322
322
  {
323
323
  "$type": "RuleCall",
324
324
  "rule": {
325
- "$ref": "#/rules@57"
325
+ "$ref": "#/rules@58"
326
326
  },
327
327
  "arguments": []
328
328
  }
@@ -356,7 +356,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
356
356
  {
357
357
  "$type": "RuleCall",
358
358
  "rule": {
359
- "$ref": "#/rules@56"
359
+ "$ref": "#/rules@57"
360
360
  },
361
361
  "arguments": []
362
362
  },
@@ -395,7 +395,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
395
395
  {
396
396
  "$type": "RuleCall",
397
397
  "rule": {
398
- "$ref": "#/rules@57"
398
+ "$ref": "#/rules@58"
399
399
  },
400
400
  "arguments": []
401
401
  }
@@ -471,7 +471,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
471
471
  {
472
472
  "$type": "RuleCall",
473
473
  "rule": {
474
- "$ref": "#/rules@55"
474
+ "$ref": "#/rules@56"
475
475
  },
476
476
  "arguments": []
477
477
  },
@@ -508,7 +508,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
508
508
  "terminal": {
509
509
  "$type": "RuleCall",
510
510
  "rule": {
511
- "$ref": "#/rules@62"
511
+ "$ref": "#/rules@63"
512
512
  },
513
513
  "arguments": []
514
514
  }
@@ -523,7 +523,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
523
523
  "terminal": {
524
524
  "$type": "RuleCall",
525
525
  "rule": {
526
- "$ref": "#/rules@62"
526
+ "$ref": "#/rules@63"
527
527
  },
528
528
  "arguments": []
529
529
  }
@@ -538,7 +538,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
538
538
  "terminal": {
539
539
  "$type": "RuleCall",
540
540
  "rule": {
541
- "$ref": "#/rules@62"
541
+ "$ref": "#/rules@63"
542
542
  },
543
543
  "arguments": []
544
544
  }
@@ -550,7 +550,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
550
550
  "terminal": {
551
551
  "$type": "RuleCall",
552
552
  "rule": {
553
- "$ref": "#/rules@62"
553
+ "$ref": "#/rules@63"
554
554
  },
555
555
  "arguments": []
556
556
  },
@@ -596,7 +596,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
596
596
  {
597
597
  "$type": "RuleCall",
598
598
  "rule": {
599
- "$ref": "#/rules@56"
599
+ "$ref": "#/rules@57"
600
600
  },
601
601
  "arguments": []
602
602
  },
@@ -666,7 +666,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
666
666
  {
667
667
  "$type": "RuleCall",
668
668
  "rule": {
669
- "$ref": "#/rules@57"
669
+ "$ref": "#/rules@58"
670
670
  },
671
671
  "arguments": []
672
672
  }
@@ -739,7 +739,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
739
739
  {
740
740
  "$type": "RuleCall",
741
741
  "rule": {
742
- "$ref": "#/rules@58"
742
+ "$ref": "#/rules@59"
743
743
  },
744
744
  "arguments": [],
745
745
  "cardinality": "?"
@@ -751,7 +751,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
751
751
  "terminal": {
752
752
  "$type": "RuleCall",
753
753
  "rule": {
754
- "$ref": "#/rules@62"
754
+ "$ref": "#/rules@63"
755
755
  },
756
756
  "arguments": []
757
757
  }
@@ -783,7 +783,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
783
783
  {
784
784
  "$type": "RuleCall",
785
785
  "rule": {
786
- "$ref": "#/rules@56"
786
+ "$ref": "#/rules@57"
787
787
  },
788
788
  "arguments": []
789
789
  },
@@ -797,7 +797,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
797
797
  {
798
798
  "$type": "RuleCall",
799
799
  "rule": {
800
- "$ref": "#/rules@57"
800
+ "$ref": "#/rules@58"
801
801
  },
802
802
  "arguments": []
803
803
  }
@@ -862,7 +862,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
862
862
  {
863
863
  "$type": "RuleCall",
864
864
  "rule": {
865
- "$ref": "#/rules@56"
865
+ "$ref": "#/rules@57"
866
866
  },
867
867
  "arguments": []
868
868
  },
@@ -894,7 +894,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
894
894
  {
895
895
  "$type": "RuleCall",
896
896
  "rule": {
897
- "$ref": "#/rules@57"
897
+ "$ref": "#/rules@58"
898
898
  },
899
899
  "arguments": []
900
900
  }
@@ -938,7 +938,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
938
938
  {
939
939
  "$type": "RuleCall",
940
940
  "rule": {
941
- "$ref": "#/rules@53"
941
+ "$ref": "#/rules@54"
942
942
  },
943
943
  "arguments": []
944
944
  },
@@ -997,7 +997,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
997
997
  {
998
998
  "$type": "RuleCall",
999
999
  "rule": {
1000
- "$ref": "#/rules@53"
1000
+ "$ref": "#/rules@54"
1001
1001
  },
1002
1002
  "arguments": []
1003
1003
  },
@@ -1043,7 +1043,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
1043
1043
  "terminal": {
1044
1044
  "$type": "RuleCall",
1045
1045
  "rule": {
1046
- "$ref": "#/rules@60"
1046
+ "$ref": "#/rules@61"
1047
1047
  },
1048
1048
  "arguments": []
1049
1049
  },
@@ -1056,7 +1056,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
1056
1056
  {
1057
1057
  "$type": "RuleCall",
1058
1058
  "rule": {
1059
- "$ref": "#/rules@59"
1059
+ "$ref": "#/rules@60"
1060
1060
  },
1061
1061
  "arguments": [],
1062
1062
  "cardinality": "?"
@@ -1073,7 +1073,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
1073
1073
  "terminal": {
1074
1074
  "$type": "RuleCall",
1075
1075
  "rule": {
1076
- "$ref": "#/rules@60"
1076
+ "$ref": "#/rules@61"
1077
1077
  },
1078
1078
  "arguments": []
1079
1079
  },
@@ -1147,7 +1147,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
1147
1147
  "terminal": {
1148
1148
  "$type": "RuleCall",
1149
1149
  "rule": {
1150
- "$ref": "#/rules@62"
1150
+ "$ref": "#/rules@63"
1151
1151
  },
1152
1152
  "arguments": []
1153
1153
  },
@@ -1285,7 +1285,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
1285
1285
  {
1286
1286
  "$type": "RuleCall",
1287
1287
  "rule": {
1288
- "$ref": "#/rules@56"
1288
+ "$ref": "#/rules@57"
1289
1289
  },
1290
1290
  "arguments": []
1291
1291
  },
@@ -1318,7 +1318,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
1318
1318
  {
1319
1319
  "$type": "RuleCall",
1320
1320
  "rule": {
1321
- "$ref": "#/rules@57"
1321
+ "$ref": "#/rules@58"
1322
1322
  },
1323
1323
  "arguments": []
1324
1324
  }
@@ -1349,7 +1349,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
1349
1349
  {
1350
1350
  "$type": "RuleCall",
1351
1351
  "rule": {
1352
- "$ref": "#/rules@58"
1352
+ "$ref": "#/rules@59"
1353
1353
  },
1354
1354
  "arguments": [],
1355
1355
  "cardinality": "?"
@@ -1361,7 +1361,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
1361
1361
  "terminal": {
1362
1362
  "$type": "RuleCall",
1363
1363
  "rule": {
1364
- "$ref": "#/rules@62"
1364
+ "$ref": "#/rules@63"
1365
1365
  },
1366
1366
  "arguments": []
1367
1367
  }
@@ -1393,7 +1393,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
1393
1393
  {
1394
1394
  "$type": "RuleCall",
1395
1395
  "rule": {
1396
- "$ref": "#/rules@56"
1396
+ "$ref": "#/rules@57"
1397
1397
  },
1398
1398
  "arguments": []
1399
1399
  },
@@ -1413,7 +1413,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
1413
1413
  {
1414
1414
  "$type": "RuleCall",
1415
1415
  "rule": {
1416
- "$ref": "#/rules@57"
1416
+ "$ref": "#/rules@58"
1417
1417
  },
1418
1418
  "arguments": []
1419
1419
  }
@@ -1481,21 +1481,46 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
1481
1481
  {
1482
1482
  "$type": "RuleCall",
1483
1483
  "rule": {
1484
- "$ref": "#/rules@56"
1484
+ "$ref": "#/rules@57"
1485
1485
  },
1486
1486
  "arguments": []
1487
1487
  },
1488
1488
  {
1489
1489
  "$type": "Assignment",
1490
- "feature": "properties",
1491
- "operator": "+=",
1490
+ "feature": "tags",
1491
+ "operator": "=",
1492
1492
  "terminal": {
1493
1493
  "$type": "RuleCall",
1494
1494
  "rule": {
1495
- "$ref": "#/rules@26"
1495
+ "$ref": "#/rules@17"
1496
1496
  },
1497
1497
  "arguments": []
1498
1498
  },
1499
+ "cardinality": "?"
1500
+ },
1501
+ {
1502
+ "$type": "Assignment",
1503
+ "feature": "props",
1504
+ "operator": "+=",
1505
+ "terminal": {
1506
+ "$type": "Alternatives",
1507
+ "elements": [
1508
+ {
1509
+ "$type": "RuleCall",
1510
+ "rule": {
1511
+ "$ref": "#/rules@26"
1512
+ },
1513
+ "arguments": []
1514
+ },
1515
+ {
1516
+ "$type": "RuleCall",
1517
+ "rule": {
1518
+ "$ref": "#/rules@34"
1519
+ },
1520
+ "arguments": []
1521
+ }
1522
+ ]
1523
+ },
1499
1524
  "cardinality": "*"
1500
1525
  },
1501
1526
  {
@@ -1533,7 +1558,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
1533
1558
  {
1534
1559
  "$type": "RuleCall",
1535
1560
  "rule": {
1536
- "$ref": "#/rules@57"
1561
+ "$ref": "#/rules@58"
1537
1562
  },
1538
1563
  "arguments": []
1539
1564
  }
@@ -1573,7 +1598,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
1573
1598
  {
1574
1599
  "$type": "RuleCall",
1575
1600
  "rule": {
1576
- "$ref": "#/rules@58"
1601
+ "$ref": "#/rules@59"
1577
1602
  },
1578
1603
  "arguments": [],
1579
1604
  "cardinality": "?"
@@ -1585,7 +1610,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
1585
1610
  "terminal": {
1586
1611
  "$type": "RuleCall",
1587
1612
  "rule": {
1588
- "$ref": "#/rules@62"
1613
+ "$ref": "#/rules@63"
1589
1614
  },
1590
1615
  "arguments": []
1591
1616
  }
@@ -1641,7 +1666,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
1641
1666
  {
1642
1667
  "$type": "RuleCall",
1643
1668
  "rule": {
1644
- "$ref": "#/rules@59"
1669
+ "$ref": "#/rules@60"
1645
1670
  },
1646
1671
  "arguments": []
1647
1672
  },
@@ -1760,7 +1785,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
1760
1785
  {
1761
1786
  "$type": "RuleCall",
1762
1787
  "rule": {
1763
- "$ref": "#/rules@59"
1788
+ "$ref": "#/rules@60"
1764
1789
  },
1765
1790
  "arguments": []
1766
1791
  },
@@ -1782,7 +1807,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
1782
1807
  {
1783
1808
  "$type": "RuleCall",
1784
1809
  "rule": {
1785
- "$ref": "#/rules@56"
1810
+ "$ref": "#/rules@57"
1786
1811
  },
1787
1812
  "arguments": []
1788
1813
  },
@@ -1796,7 +1821,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
1796
1821
  {
1797
1822
  "$type": "RuleCall",
1798
1823
  "rule": {
1799
- "$ref": "#/rules@57"
1824
+ "$ref": "#/rules@58"
1800
1825
  },
1801
1826
  "arguments": []
1802
1827
  }
@@ -2006,7 +2031,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
2006
2031
  {
2007
2032
  "$type": "RuleCall",
2008
2033
  "rule": {
2009
- "$ref": "#/rules@53"
2034
+ "$ref": "#/rules@54"
2010
2035
  },
2011
2036
  "arguments": []
2012
2037
  },
@@ -2046,7 +2071,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
2046
2071
  "terminal": {
2047
2072
  "$type": "RuleCall",
2048
2073
  "rule": {
2049
- "$ref": "#/rules@60"
2074
+ "$ref": "#/rules@61"
2050
2075
  },
2051
2076
  "arguments": []
2052
2077
  },
@@ -2172,7 +2197,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
2172
2197
  {
2173
2198
  "$type": "RuleCall",
2174
2199
  "rule": {
2175
- "$ref": "#/rules@58"
2200
+ "$ref": "#/rules@59"
2176
2201
  },
2177
2202
  "arguments": [],
2178
2203
  "cardinality": "?"
@@ -2216,7 +2241,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
2216
2241
  {
2217
2242
  "$type": "RuleCall",
2218
2243
  "rule": {
2219
- "$ref": "#/rules@58"
2244
+ "$ref": "#/rules@59"
2220
2245
  },
2221
2246
  "arguments": [],
2222
2247
  "cardinality": "?"
@@ -2260,7 +2285,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
2260
2285
  {
2261
2286
  "$type": "RuleCall",
2262
2287
  "rule": {
2263
- "$ref": "#/rules@58"
2288
+ "$ref": "#/rules@59"
2264
2289
  },
2265
2290
  "arguments": [],
2266
2291
  "cardinality": "?"
@@ -2457,7 +2482,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
2457
2482
  {
2458
2483
  "$type": "RuleCall",
2459
2484
  "rule": {
2460
- "$ref": "#/rules@61"
2485
+ "$ref": "#/rules@62"
2461
2486
  },
2462
2487
  "arguments": []
2463
2488
  }
@@ -2480,14 +2505,14 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
2480
2505
  {
2481
2506
  "$type": "RuleCall",
2482
2507
  "rule": {
2483
- "$ref": "#/rules@50"
2508
+ "$ref": "#/rules@51"
2484
2509
  },
2485
2510
  "arguments": []
2486
2511
  },
2487
2512
  {
2488
2513
  "$type": "RuleCall",
2489
2514
  "rule": {
2490
- "$ref": "#/rules@51"
2515
+ "$ref": "#/rules@52"
2491
2516
  },
2492
2517
  "arguments": []
2493
2518
  }
@@ -2507,7 +2532,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
2507
2532
  "definition": {
2508
2533
  "$type": "RuleCall",
2509
2534
  "rule": {
2510
- "$ref": "#/rules@52"
2535
+ "$ref": "#/rules@53"
2511
2536
  },
2512
2537
  "arguments": []
2513
2538
  },
@@ -2528,7 +2553,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
2528
2553
  {
2529
2554
  "$type": "RuleCall",
2530
2555
  "rule": {
2531
- "$ref": "#/rules@54"
2556
+ "$ref": "#/rules@55"
2532
2557
  },
2533
2558
  "arguments": []
2534
2559
  },
@@ -2539,7 +2564,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
2539
2564
  "terminal": {
2540
2565
  "$type": "RuleCall",
2541
2566
  "rule": {
2542
- "$ref": "#/rules@55"
2567
+ "$ref": "#/rules@56"
2543
2568
  },
2544
2569
  "arguments": []
2545
2570
  }
@@ -2578,6 +2603,19 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
2578
2603
  },
2579
2604
  "hidden": false
2580
2605
  },
2606
+ {
2607
+ "$type": "TerminalRule",
2608
+ "fragment": true,
2609
+ "name": "DASH",
2610
+ "definition": {
2611
+ "$type": "CharacterRange",
2612
+ "left": {
2613
+ "$type": "Keyword",
2614
+ "value": "-"
2615
+ }
2616
+ },
2617
+ "hidden": false
2618
+ },
2581
2619
  {
2582
2620
  "$type": "TerminalRule",
2583
2621
  "fragment": true,
@@ -2754,7 +2792,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
2754
2792
  {
2755
2793
  "$type": "TerminalRuleCall",
2756
2794
  "rule": {
2757
- "$ref": "#/rules@46"
2795
+ "$ref": "#/rules@47"
2758
2796
  }
2759
2797
  },
2760
2798
  {
@@ -2764,15 +2802,26 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
2764
2802
  "$type": "TerminalAlternatives",
2765
2803
  "elements": [
2766
2804
  {
2767
- "$type": "TerminalRuleCall",
2768
- "rule": {
2769
- "$ref": "#/rules@46"
2770
- }
2805
+ "$type": "TerminalAlternatives",
2806
+ "elements": [
2807
+ {
2808
+ "$type": "TerminalRuleCall",
2809
+ "rule": {
2810
+ "$ref": "#/rules@47"
2811
+ }
2812
+ },
2813
+ {
2814
+ "$type": "TerminalRuleCall",
2815
+ "rule": {
2816
+ "$ref": "#/rules@48"
2817
+ }
2818
+ }
2819
+ ]
2771
2820
  },
2772
2821
  {
2773
2822
  "$type": "TerminalRuleCall",
2774
2823
  "rule": {
2775
- "$ref": "#/rules@47"
2824
+ "$ref": "#/rules@45"
2776
2825
  }
2777
2826
  }
2778
2827
  ]
@@ -2780,7 +2829,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
2780
2829
  {
2781
2830
  "$type": "TerminalRuleCall",
2782
2831
  "rule": {
2783
- "$ref": "#/rules@45"
2832
+ "$ref": "#/rules@46"
2784
2833
  }
2785
2834
  }
2786
2835
  ],
@@ -2803,7 +2852,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
2803
2852
  {
2804
2853
  "$type": "TerminalRuleCall",
2805
2854
  "rule": {
2806
- "$ref": "#/rules@46"
2855
+ "$ref": "#/rules@47"
2807
2856
  }
2808
2857
  },
2809
2858
  {
@@ -2821,15 +2870,26 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
2821
2870
  "$type": "TerminalAlternatives",
2822
2871
  "elements": [
2823
2872
  {
2824
- "$type": "TerminalRuleCall",
2825
- "rule": {
2826
- "$ref": "#/rules@46"
2827
- }
2873
+ "$type": "TerminalAlternatives",
2874
+ "elements": [
2875
+ {
2876
+ "$type": "TerminalRuleCall",
2877
+ "rule": {
2878
+ "$ref": "#/rules@47"
2879
+ }
2880
+ },
2881
+ {
2882
+ "$type": "TerminalRuleCall",
2883
+ "rule": {
2884
+ "$ref": "#/rules@48"
2885
+ }
2886
+ }
2887
+ ]
2828
2888
  },
2829
2889
  {
2830
2890
  "$type": "TerminalRuleCall",
2831
2891
  "rule": {
2832
- "$ref": "#/rules@47"
2892
+ "$ref": "#/rules@45"
2833
2893
  }
2834
2894
  }
2835
2895
  ]
@@ -2837,7 +2897,7 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
2837
2897
  {
2838
2898
  "$type": "TerminalRuleCall",
2839
2899
  "rule": {
2840
- "$ref": "#/rules@45"
2900
+ "$ref": "#/rules@46"
2841
2901
  }
2842
2902
  }
2843
2903
  ],
@@ -2868,13 +2928,13 @@ export const LikeC4Grammar = () => loadedLikeC4Grammar ?? (loadedLikeC4Grammar =
2868
2928
  {
2869
2929
  "$type": "TerminalRuleCall",
2870
2930
  "rule": {
2871
- "$ref": "#/rules@48"
2931
+ "$ref": "#/rules@49"
2872
2932
  }
2873
2933
  },
2874
2934
  {
2875
2935
  "$type": "TerminalRuleCall",
2876
2936
  "rule": {
2877
- "$ref": "#/rules@49"
2937
+ "$ref": "#/rules@50"
2878
2938
  }
2879
2939
  }
2880
2940
  ],
@@ -1,6 +1,6 @@
1
1
  import { ModelIndex, assignNavigateTo, computeView, invariant } from '@likec4/core';
2
2
  import { DefaultElementShape, DefaultThemeColor } from '@likec4/core/types';
3
- import { compareByFqnHierarchically, parentFqn } from '@likec4/core/utils';
3
+ import { compareByFqnHierarchically, isNonEmptyArray, parentFqn } from '@likec4/core/utils';
4
4
  import { DocumentState, getDocument } from 'langium';
5
5
  import objectHash from 'object-hash';
6
6
  import { clone } from 'rambdax';
@@ -67,7 +67,7 @@ export class LikeC4ModelBuilder {
67
67
  kinds: {}
68
68
  };
69
69
  R.forEach(R.map(docs, R.prop('c4Specification')), spec => Object.assign(c4Specification.kinds, spec.kinds));
70
- const toModelElement = ({ astPath, ...parsed }) => {
70
+ const toModelElement = ({ astPath, tags, links, ...parsed }) => {
71
71
  const kind = c4Specification.kinds[parsed.kind];
72
72
  if (kind) {
73
73
  return {
@@ -75,7 +75,8 @@ export class LikeC4ModelBuilder {
75
75
  color: kind.color,
76
76
  description: null,
77
77
  technology: null,
78
- tags: [],
78
+ tags: tags ?? null,
79
+ links: links ?? null,
79
80
  ...parsed
80
81
  };
81
82
  }
@@ -109,7 +110,7 @@ export class LikeC4ModelBuilder {
109
110
  const modelIndex = ModelIndex.from({ elements, relations });
110
111
  const toModelView = (view) => {
111
112
  // eslint-disable-next-line prefer-const
112
- let { astPath, rules, title, ...model } = view;
113
+ let { astPath, rules, title, description, tags, links, ...model } = view;
113
114
  if (!title && view.viewOf) {
114
115
  title = elements[view.viewOf]?.title;
115
116
  }
@@ -118,7 +119,10 @@ export class LikeC4ModelBuilder {
118
119
  }
119
120
  return computeView({
120
121
  ...model,
121
- ...(title && { title }),
122
+ title: title ?? null,
123
+ description: description ?? null,
124
+ tags: tags ?? null,
125
+ links: links ?? null,
122
126
  rules: clone(rules)
123
127
  }, modelIndex);
124
128
  };
@@ -197,7 +201,7 @@ export class LikeC4ModelBuilder {
197
201
  const id = this.resolveFqn(astNode);
198
202
  invariant(astNode.kind.ref, 'Element kind is not resolved: ' + astNode.name);
199
203
  const kind = astNode.kind.ref.name;
200
- const tags = (astNode.body && this.convertTags(astNode.body)) ?? [];
204
+ const tags = (astNode.body && this.convertTags(astNode.body));
201
205
  const styleProps = astNode.body?.props.find(ast.isElementStyleProperties)?.props;
202
206
  const { color, shape } = toElementStyle(styleProps);
203
207
  const astPath = this.getAstNodePath(astNode);
@@ -206,14 +210,16 @@ export class LikeC4ModelBuilder {
206
210
  title = title ?? bodyProps.find(p => p.key === 'title')?.value;
207
211
  description = description ?? bodyProps.find(p => p.key === 'description')?.value;
208
212
  technology = technology ?? bodyProps.find(p => p.key === 'technology')?.value;
213
+ const links = astNode.body?.props.filter(ast.isLinkProperty).map(p => p.value);
209
214
  return {
210
215
  id,
211
216
  kind,
212
217
  astPath,
213
218
  title: title ?? astNode.name,
219
+ ...(tags && { tags }),
220
+ ...(links && isNonEmptyArray(links) && { links }),
214
221
  ...(technology && { technology }),
215
222
  ...(description && { description: stripIndent(description).trim() }),
216
- ...(tags.length > 0 ? { tags } : {}),
217
223
  ...(shape && shape !== DefaultElementShape ? { shape } : {}),
218
224
  ...(color && color !== DefaultThemeColor ? { color } : {})
219
225
  };
@@ -329,14 +335,18 @@ export class LikeC4ModelBuilder {
329
335
  viewOf: viewOf ?? null
330
336
  });
331
337
  }
332
- const title = astNode.properties.find(p => p.key === 'title')?.value;
333
- const description = astNode.properties.find(p => p.key === 'description')?.value;
338
+ const title = astNode.props.find(p => p.key === 'title')?.value;
339
+ const description = astNode.props.find(p => p.key === 'description')?.value;
340
+ const tags = this.convertTags(astNode);
341
+ const links = astNode.props.filter(ast.isLinkProperty).map(p => p.value);
334
342
  return {
335
343
  id,
336
344
  astPath,
337
345
  ...(viewOf && { viewOf }),
338
346
  ...(title && { title }),
339
347
  ...(description && { description }),
348
+ ...(tags && { tags }),
349
+ ...(links && isNonEmptyArray(links) && { links }),
340
350
  rules: astNode.rules.map(n => this.parseViewRule(n))
341
351
  };
342
352
  }
@@ -352,7 +362,8 @@ export class LikeC4ModelBuilder {
352
362
  return this.services.workspace.AstNodeLocator.getAstNodePath(node);
353
363
  }
354
364
  convertTags(el) {
355
- return el.tags?.value.map(tagRef => tagRef.ref?.name) ?? [];
365
+ const tags = el.tags?.value.map(tagRef => tagRef.ref?.name);
366
+ return tags && isNonEmptyArray(tags) ? tags : null;
356
367
  }
357
368
  scheduledCb = null;
358
369
  notifyClient(cancelToken) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@likec4/language-server",
3
3
  "description": "LikeC4 Language Server",
4
- "version": "0.30.0",
4
+ "version": "0.31.0",
5
5
  "license": "MIT",
6
6
  "bugs": "https://github.com/likec4/likec4/issues",
7
7
  "homepage": "https://likec4.dev",
@@ -59,12 +59,12 @@
59
59
  "test:watch": "run -T vitest"
60
60
  },
61
61
  "dependencies": {
62
- "@likec4/core": "0.30.0",
62
+ "@likec4/core": "0.31.0",
63
63
  "langium": "^1.2.1",
64
64
  "nanoid": "^4.0.2",
65
65
  "object-hash": "^3.0.0",
66
66
  "rambdax": "^9.1.1",
67
- "remeda": "^1.23.0",
67
+ "remeda": "^1.24.0",
68
68
  "strip-indent": "^4.0.0",
69
69
  "vscode-languageserver": "~8.1.0",
70
70
  "vscode-languageserver-protocol": "~3.17.3"