@likec4/language-server 1.10.0 → 1.11.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 (55) hide show
  1. package/dist/browser.cjs +5 -1
  2. package/dist/browser.d.cts +9 -8
  3. package/dist/browser.d.mts +9 -8
  4. package/dist/browser.d.ts +9 -8
  5. package/dist/browser.mjs +3 -2
  6. package/dist/index.cjs +15 -2
  7. package/dist/index.d.cts +14 -11
  8. package/dist/index.d.mts +14 -11
  9. package/dist/index.d.ts +14 -11
  10. package/dist/index.mjs +17 -1
  11. package/dist/likec4lib.cjs +949 -952
  12. package/dist/likec4lib.d.cts +1 -1
  13. package/dist/likec4lib.d.mts +1 -1
  14. package/dist/likec4lib.d.ts +1 -1
  15. package/dist/likec4lib.mjs +949 -952
  16. package/dist/model-graph/index.cjs +1 -1
  17. package/dist/model-graph/index.mjs +1 -1
  18. package/dist/protocol.cjs +1 -1
  19. package/dist/protocol.d.cts +3 -1
  20. package/dist/protocol.d.mts +3 -1
  21. package/dist/protocol.d.ts +3 -1
  22. package/dist/protocol.mjs +1 -1
  23. package/dist/shared/{language-server.JWkqVjGv.cjs → language-server.C8lV6gDw.cjs} +120 -118
  24. package/dist/shared/{language-server.DBJJUUgF.mjs → language-server.CCOotWDz.mjs} +120 -119
  25. package/dist/shared/{language-server.DtBRb9os.mjs → language-server.CbqwHp7Q.mjs} +23 -9
  26. package/dist/shared/{language-server.CtKHXJDD.d.ts → language-server.Cyw-bCtc.d.ts} +145 -138
  27. package/dist/shared/{language-server.D-84I33F.d.mts → language-server.DGjTE7xL.d.mts} +145 -138
  28. package/dist/shared/{language-server.DwyCJvXm.cjs → language-server.DJhoJBWh.cjs} +17 -3
  29. package/dist/shared/{language-server.CjFzaJwI.d.cts → language-server.Ol32Kygo.d.cts} +145 -138
  30. package/package.json +34 -29
  31. package/src/Rpc.ts +10 -6
  32. package/src/ast.ts +1 -1
  33. package/src/browser.ts +5 -0
  34. package/src/formatting/LikeC4Formatter.ts +4 -2
  35. package/src/generated/ast.ts +99 -1
  36. package/src/generated/grammar.ts +1 -1
  37. package/src/generated/module.ts +1 -1
  38. package/src/generated-lib/icons.ts +949 -952
  39. package/src/index.ts +23 -2
  40. package/src/likec4lib.ts +1 -1
  41. package/src/logger.ts +16 -16
  42. package/src/lsp/CompletionProvider.ts +1 -1
  43. package/src/model/model-builder.ts +12 -12
  44. package/src/model-graph/compute-view/compute.ts +9 -4
  45. package/src/model-graph/utils/applyCustomRelationProperties.ts +1 -1
  46. package/src/model-graph/utils/uniqueTags.test.ts +42 -0
  47. package/src/model-graph/utils/uniqueTags.ts +19 -0
  48. package/src/protocol.ts +5 -1
  49. package/src/shared/WorkspaceManager.ts +1 -1
  50. package/dist/node.cjs +0 -18
  51. package/dist/node.d.cts +0 -20
  52. package/dist/node.d.mts +0 -20
  53. package/dist/node.d.ts +0 -20
  54. package/dist/node.mjs +0 -16
  55. package/src/node.ts +0 -20
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const LikeC4ModelGraph = require('../shared/language-server.DwyCJvXm.cjs');
3
+ const LikeC4ModelGraph = require('../shared/language-server.DJhoJBWh.cjs');
4
4
 
5
5
 
6
6
 
@@ -1 +1 @@
1
- export { L as LikeC4ModelGraph, b as computeDynamicView, c as computeElementView, a as computeView } from '../shared/language-server.DtBRb9os.mjs';
1
+ export { L as LikeC4ModelGraph, b as computeDynamicView, c as computeElementView, a as computeView } from '../shared/language-server.CbqwHp7Q.mjs';
package/dist/protocol.cjs CHANGED
@@ -6,7 +6,7 @@ const onDidChangeModel = new vscodeJsonrpc.NotificationType("likec4/onDidChangeM
6
6
  const fetchModel = new vscodeJsonrpc.RequestType0(
7
7
  "likec4/fetchModel"
8
8
  );
9
- const fetchComputedModel = new vscodeJsonrpc.RequestType0(
9
+ const fetchComputedModel = new vscodeJsonrpc.RequestType(
10
10
  "likec4/fetchComputedModel"
11
11
  );
12
12
  const computeView = new vscodeJsonrpc.RequestType(
@@ -8,7 +8,9 @@ declare const fetchModel: RequestType0<{
8
8
  model: ParsedLikeC4Model | null;
9
9
  }, void>;
10
10
  type FetchModelRequest = typeof fetchModel;
11
- declare const fetchComputedModel: RequestType0<{
11
+ declare const fetchComputedModel: RequestType<{
12
+ cleanCaches?: boolean | undefined;
13
+ }, {
12
14
  model: ComputedLikeC4Model | null;
13
15
  }, void>;
14
16
  type FetchComputedModelRequest = typeof fetchComputedModel;
@@ -8,7 +8,9 @@ declare const fetchModel: RequestType0<{
8
8
  model: ParsedLikeC4Model | null;
9
9
  }, void>;
10
10
  type FetchModelRequest = typeof fetchModel;
11
- declare const fetchComputedModel: RequestType0<{
11
+ declare const fetchComputedModel: RequestType<{
12
+ cleanCaches?: boolean | undefined;
13
+ }, {
12
14
  model: ComputedLikeC4Model | null;
13
15
  }, void>;
14
16
  type FetchComputedModelRequest = typeof fetchComputedModel;
@@ -8,7 +8,9 @@ declare const fetchModel: RequestType0<{
8
8
  model: ParsedLikeC4Model | null;
9
9
  }, void>;
10
10
  type FetchModelRequest = typeof fetchModel;
11
- declare const fetchComputedModel: RequestType0<{
11
+ declare const fetchComputedModel: RequestType<{
12
+ cleanCaches?: boolean | undefined;
13
+ }, {
12
14
  model: ComputedLikeC4Model | null;
13
15
  }, void>;
14
16
  type FetchComputedModelRequest = typeof fetchComputedModel;
package/dist/protocol.mjs CHANGED
@@ -4,7 +4,7 @@ const onDidChangeModel = new NotificationType("likec4/onDidChangeModel");
4
4
  const fetchModel = new RequestType0(
5
5
  "likec4/fetchModel"
6
6
  );
7
- const fetchComputedModel = new RequestType0(
7
+ const fetchComputedModel = new RequestType(
8
8
  "likec4/fetchComputedModel"
9
9
  );
10
10
  const computeView = new RequestType(
@@ -3,8 +3,8 @@
3
3
  const langium = require('langium');
4
4
  const lsp = require('langium/lsp');
5
5
  const log = require('@likec4/log');
6
- const core = require('@likec4/core');
7
6
  const remeda = require('remeda');
7
+ const core = require('@likec4/core');
8
8
  const vscodeLanguageserverTypes = require('vscode-languageserver-types');
9
9
  const indentString = require('indent-string');
10
10
  const msgpack = require('@msgpack/msgpack');
@@ -15,7 +15,7 @@ const vscodeUri = require('vscode-uri');
15
15
  const stripIndent = require('strip-indent');
16
16
  const hash = require('string-hash');
17
17
  const fastEquals = require('fast-equals');
18
- const LikeC4ModelGraph = require('./language-server.DwyCJvXm.cjs');
18
+ const LikeC4ModelGraph = require('./language-server.DJhoJBWh.cjs');
19
19
  const ufo = require('ufo');
20
20
  const graphlib = require('@dagrejs/graphlib');
21
21
  const vscodeLanguageserver = require('vscode-languageserver');
@@ -26,95 +26,6 @@ const indentString__default = /*#__PURE__*/_interopDefaultCompat(indentString);
26
26
  const stripIndent__default = /*#__PURE__*/_interopDefaultCompat(stripIndent);
27
27
  const hash__default = /*#__PURE__*/_interopDefaultCompat(hash);
28
28
 
29
- const logger = log.rootLogger.withTag("lsp");
30
- function logError(err) {
31
- logger.error(err);
32
- }
33
- function logWarnError(err) {
34
- if (err instanceof Error) {
35
- logger.warn(err.stack ?? err.message);
36
- return;
37
- }
38
- logger.warn(err);
39
- }
40
- function setLogLevel(level) {
41
- logger.level = log.LogLevels[level];
42
- }
43
- function logErrorToTelemetry(connection) {
44
- const reporter = {
45
- log: ({ level, ...logObj }, ctx) => {
46
- if (level !== log.LogLevels.error && level !== log.LogLevels.fatal) {
47
- return;
48
- }
49
- const tag = logObj.tag || "";
50
- const parts = logObj.args.map((arg) => {
51
- if (arg && typeof arg.stack === "string") {
52
- return arg.message + "\n" + arg.stack;
53
- }
54
- if (typeof arg === "string") {
55
- return arg;
56
- }
57
- return String(arg);
58
- });
59
- if (tag) {
60
- parts.unshift(`[${tag}]`);
61
- }
62
- const message = parts.join(" ");
63
- connection.telemetry.logEvent({ eventName: "error", error: message });
64
- }
65
- };
66
- log.rootLogger.addReporter(reporter);
67
- logger.setReporters(log.rootLogger.options.reporters);
68
- }
69
- function logToLspConnection(connection) {
70
- const reporter = {
71
- log: ({ level, ...logObj }, ctx) => {
72
- const tag = logObj.tag || "";
73
- const parts = logObj.args.map((arg) => {
74
- if (arg && typeof arg.stack === "string") {
75
- return arg.message + "\n" + arg.stack;
76
- }
77
- if (typeof arg === "string") {
78
- return arg;
79
- }
80
- return String(arg);
81
- });
82
- if (tag) {
83
- parts.unshift(`[${tag}]`);
84
- }
85
- const message = parts.join(" ");
86
- switch (true) {
87
- case level >= log.LogLevels.trace: {
88
- connection.tracer.log(message);
89
- break;
90
- }
91
- case level >= log.LogLevels.debug: {
92
- connection.console.debug(message);
93
- break;
94
- }
95
- case level >= log.LogLevels.info: {
96
- connection.console.info(message);
97
- break;
98
- }
99
- case level >= log.LogLevels.log: {
100
- connection.console.log(message);
101
- break;
102
- }
103
- case level >= log.LogLevels.warn: {
104
- connection.console.warn(message);
105
- break;
106
- }
107
- case level >= log.LogLevels.fatal: {
108
- connection.console.error(message);
109
- break;
110
- }
111
- }
112
- }
113
- };
114
- log.rootLogger.addReporter(reporter);
115
- logger.setReporters(log.rootLogger.options.reporters);
116
- }
117
-
118
29
  const DynamicViewRule = "DynamicViewRule";
119
30
  function isDynamicViewRule(item) {
120
31
  return reflection.isInstance(item, DynamicViewRule);
@@ -1496,6 +1407,94 @@ const LikeC4GeneratedModule = {
1496
1407
  }
1497
1408
  };
1498
1409
 
1410
+ const logger = log.rootLogger.withTag("lsp");
1411
+ function logError(err) {
1412
+ logger.error(err);
1413
+ }
1414
+ function logWarnError(err) {
1415
+ if (err instanceof Error) {
1416
+ logger.warn(err.stack ?? err.message);
1417
+ return;
1418
+ }
1419
+ logger.warn(err);
1420
+ }
1421
+ function setLogLevel(level) {
1422
+ logger.level = log.LogLevels[level];
1423
+ }
1424
+ function logErrorToTelemetry(connection) {
1425
+ const reporter = {
1426
+ log: ({ level, ...logObj }, ctx) => {
1427
+ if (level !== log.LogLevels.error && level !== log.LogLevels.fatal) {
1428
+ return;
1429
+ }
1430
+ const tag = logObj.tag || "";
1431
+ const parts = logObj.args.map((arg) => {
1432
+ if (remeda.isError(arg)) {
1433
+ return arg.stack ?? arg.message;
1434
+ }
1435
+ if (typeof arg === "string") {
1436
+ return arg;
1437
+ }
1438
+ return "" + arg;
1439
+ });
1440
+ if (tag) {
1441
+ parts.unshift(`[${tag}]`);
1442
+ }
1443
+ const message = parts.join(" ");
1444
+ connection.telemetry.logEvent({ eventName: "error", error: message });
1445
+ }
1446
+ };
1447
+ log.rootLogger.addReporter(reporter);
1448
+ logger.setReporters(log.rootLogger.options.reporters);
1449
+ }
1450
+ function logToLspConnection(connection) {
1451
+ const reporter = {
1452
+ log: ({ level, ...logObj }, ctx) => {
1453
+ const tag = logObj.tag || "";
1454
+ const parts = logObj.args.map((arg) => {
1455
+ if (remeda.isError(arg)) {
1456
+ return arg.stack ?? arg.message;
1457
+ }
1458
+ if (typeof arg === "string") {
1459
+ return arg;
1460
+ }
1461
+ return "" + arg;
1462
+ });
1463
+ if (tag) {
1464
+ parts.unshift(`[${tag}]`);
1465
+ }
1466
+ const message = parts.join(" ");
1467
+ switch (true) {
1468
+ case level >= log.LogLevels.debug: {
1469
+ connection.console.debug(message);
1470
+ break;
1471
+ }
1472
+ // case level >= LogLevels.info: {
1473
+ // connection.console.info(message)
1474
+ // break
1475
+ // }
1476
+ case level >= log.LogLevels.log: {
1477
+ connection.console.info(message);
1478
+ break;
1479
+ }
1480
+ case level >= log.LogLevels.warn: {
1481
+ connection.console.warn(message);
1482
+ break;
1483
+ }
1484
+ case level >= log.LogLevels.fatal: {
1485
+ connection.console.error(message);
1486
+ break;
1487
+ }
1488
+ default: {
1489
+ connection.console.log(message);
1490
+ }
1491
+ }
1492
+ }
1493
+ };
1494
+ log.rootLogger.setReporters([reporter]);
1495
+ logger.setReporters(log.rootLogger.options.reporters);
1496
+ }
1497
+
1499
1498
  function elementRef(node) {
1500
1499
  return node.el.ref;
1501
1500
  }
@@ -1617,7 +1616,7 @@ function checksFromDiagnostics(doc) {
1617
1616
  };
1618
1617
  }
1619
1618
  function* streamModel(doc, isValid) {
1620
- const traverseStack = doc.parseResult.value.models.flatMap((m) => isValid(m) ? m.elements : []);
1619
+ const traverseStack = doc.parseResult.value.models.flatMap((m) => m.elements);
1621
1620
  const relations = [];
1622
1621
  let el;
1623
1622
  while (el = traverseStack.shift()) {
@@ -2548,8 +2547,6 @@ class FqnIndex {
2548
2547
  }
2549
2548
  }
2550
2549
 
2551
- const printDocs = (docs) => docs.map((d) => " - " + d.uri.toString(true)).join("\n");
2552
-
2553
2550
  function assignNavigateTo(views) {
2554
2551
  const allElementViews = /* @__PURE__ */ new Map();
2555
2552
  for (const v of views) {
@@ -2943,8 +2940,7 @@ class LikeC4ModelBuilder {
2943
2940
  async (docs, _cancelToken) => {
2944
2941
  let parsed = [];
2945
2942
  try {
2946
- logger.debug(`[ModelBuilder] onValidated (${docs.length} docs)
2947
- ${printDocs(docs)}`);
2943
+ logger.debug(`[ModelBuilder] onValidated (${docs.length} docs)`);
2948
2944
  for (const doc of parser.parse(docs)) {
2949
2945
  parsed.push(doc.uri);
2950
2946
  }
@@ -2974,8 +2970,7 @@ ${printDocs(docs)}`);
2974
2970
  logger.debug("[ModelBuilder] No documents to build model from");
2975
2971
  return null;
2976
2972
  }
2977
- logger.debug(`[ModelBuilder] buildModel from ${docs.length} docs:
2978
- ${printDocs(docs)}`);
2973
+ logger.debug(`[ModelBuilder] onValidated (${docs.length} docs)`);
2979
2974
  return buildModel(this.services, docs);
2980
2975
  });
2981
2976
  }
@@ -3032,14 +3027,14 @@ ${printDocs(docs)}`);
3032
3027
  if (cache.has(CACHE_KEY_COMPUTED_MODEL)) {
3033
3028
  return cache.get(CACHE_KEY_COMPUTED_MODEL);
3034
3029
  }
3035
- const model = await this.buildModel(cancelToken);
3036
- if (!model) {
3037
- return null;
3038
- }
3039
3030
  return await this.services.shared.workspace.WorkspaceLock.read(async () => {
3040
3031
  if (cancelToken) {
3041
3032
  await langium.interruptAndCheck(cancelToken);
3042
3033
  }
3034
+ const model = this.unsafeSyncBuildModel();
3035
+ if (!model) {
3036
+ return null;
3037
+ }
3043
3038
  return this.unsafeSyncBuildComputedModel(model);
3044
3039
  });
3045
3040
  }
@@ -3049,17 +3044,17 @@ ${printDocs(docs)}`);
3049
3044
  if (cache.has(cacheKey)) {
3050
3045
  return cache.get(cacheKey);
3051
3046
  }
3052
- const model = await this.buildModel(cancelToken);
3053
- const view = model?.views[viewId];
3054
- if (!view) {
3055
- logger.warn(`[ModelBuilder] Cannot find view ${viewId}`);
3056
- return null;
3057
- }
3058
3047
  return await this.services.shared.workspace.WorkspaceLock.read(async () => {
3059
3048
  if (cancelToken) {
3060
3049
  await langium.interruptAndCheck(cancelToken);
3061
3050
  }
3062
3051
  return cache.get(cacheKey, () => {
3052
+ const model = this.unsafeSyncBuildModel();
3053
+ const view = model?.views[viewId];
3054
+ if (!view) {
3055
+ logger.warn(`[ModelBuilder] Cannot find view ${viewId}`);
3056
+ return null;
3057
+ }
3063
3058
  const index = new LikeC4ModelGraph.LikeC4ModelGraph(model);
3064
3059
  const result = core.isElementView(view) ? LikeC4ModelGraph.computeView(view, index) : LikeC4ModelGraph.computeDynamicView(view, index);
3065
3060
  if (!result.isSuccess) {
@@ -4745,14 +4740,16 @@ class Rpc {
4745
4740
  const LangiumDocuments = this.services.shared.workspace.LangiumDocuments;
4746
4741
  const DocumentBuilder = this.services.shared.workspace.DocumentBuilder;
4747
4742
  const notifyModelParsed = remeda.debounce(
4748
- () => void connection.sendNotification(protocol.onDidChangeModel, "").catch((e) => {
4749
- logger.error(`[ServerRpc] error sending onDidChangeModel: ${e}`);
4750
- return Promise.resolve();
4751
- }),
4743
+ () => {
4744
+ connection.sendNotification(protocol.onDidChangeModel, "").catch((e) => {
4745
+ logger.error(`[ServerRpc] error sending onDidChangeModel: ${e}`);
4746
+ return Promise.resolve();
4747
+ });
4748
+ },
4752
4749
  {
4753
4750
  timing: "both",
4754
- waitMs: 350,
4755
- maxWaitMs: 1e3
4751
+ waitMs: 300,
4752
+ maxWaitMs: 600
4756
4753
  }
4757
4754
  );
4758
4755
  let isFirstBuild = true;
@@ -4761,7 +4758,10 @@ class Rpc {
4761
4758
  notifyModelParsed.cancel();
4762
4759
  }),
4763
4760
  modelBuilder.onModelParsed(() => notifyModelParsed.call()),
4764
- connection.onRequest(protocol.fetchComputedModel, async (cancelToken) => {
4761
+ connection.onRequest(protocol.fetchComputedModel, async ({ cleanCaches }, cancelToken) => {
4762
+ if (cleanCaches) {
4763
+ this.services.WorkspaceCache.clear();
4764
+ }
4765
4765
  const model = await modelBuilder.buildComputedModel(cancelToken);
4766
4766
  return { model };
4767
4767
  }),
@@ -4937,8 +4937,8 @@ class LikeC4WorkspaceManager extends langium.DefaultWorkspaceManager {
4937
4937
  * your language, which can be either loaded from provided files or constructed in memory.
4938
4938
  */
4939
4939
  async loadAdditionalDocuments(folders, collector) {
4940
- await super.loadAdditionalDocuments(folders, collector);
4941
4940
  collector(this.documentFactory.fromString(likec4lib.Content, vscodeUri.URI.parse(likec4lib.Uri)));
4941
+ await super.loadAdditionalDocuments(folders, collector);
4942
4942
  }
4943
4943
  workspace() {
4944
4944
  if (this.folders && core.hasAtLeast(this.folders, 1)) {
@@ -5458,7 +5458,8 @@ class LikeC4Formatter extends lsp.AbstractFormatter {
5458
5458
  }
5459
5459
  formatRelation(node) {
5460
5460
  this.on(node, isRelation, (n, f) => {
5461
- f.property("source").append(FormattingOptions.oneSpace);
5461
+ const sourceNodes = n?.source?.$cstNode ? [n?.source?.$cstNode] : [];
5462
+ f.cst(sourceNodes).append(FormattingOptions.oneSpace);
5462
5463
  f.keywords("]->").prepend(FormattingOptions.noSpace);
5463
5464
  f.keywords("-[").append(FormattingOptions.noSpace);
5464
5465
  f.properties("target", "title", "technology", "tags").prepend(FormattingOptions.oneSpace);
@@ -5476,7 +5477,7 @@ class LikeC4Formatter extends lsp.AbstractFormatter {
5476
5477
  f.keywords("-[").append(FormattingOptions.noSpace);
5477
5478
  });
5478
5479
  this.on(node, isIncomingRelationExpression)?.keywords("->").append(FormattingOptions.oneSpace);
5479
- this.on(node, isInOutRelationExpression)?.property("inout").append(FormattingOptions.oneSpace);
5480
+ this.on(node, isInOutRelationExpression)?.keyword("->").prepend(FormattingOptions.oneSpace);
5480
5481
  }
5481
5482
  removeIndentFromTopLevelStatements(node) {
5482
5483
  if (isModel(node) || isSpecificationRule(node) || isModelViews(node) || isLikeC4Lib(node)) {
@@ -5745,4 +5746,5 @@ function _merge(target, source) {
5745
5746
  exports.LikeC4Module = LikeC4Module;
5746
5747
  exports.createCustomLanguageServices = createCustomLanguageServices;
5747
5748
  exports.createLanguageServices = createLanguageServices;
5749
+ exports.logger = logger;
5748
5750
  exports.setLogLevel = setLogLevel;