@likec4/language-server 1.21.1 → 1.22.1

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 (113) hide show
  1. package/README.md +4 -1
  2. package/bin/likec4-language-server.mjs +5 -2
  3. package/dist/LikeC4FileSystem.js +2 -2
  4. package/dist/browser.d.ts +3 -3
  5. package/dist/browser.js +15 -2
  6. package/dist/bundled.d.ts +8 -0
  7. package/dist/bundled.js +25 -0
  8. package/dist/bundled.mjs +2555 -4022
  9. package/dist/index.d.ts +3 -3
  10. package/dist/index.js +19 -2
  11. package/dist/logger.d.ts +10 -3
  12. package/dist/logger.js +56 -50
  13. package/dist/model/fqn-computation.js +2 -2
  14. package/dist/model/model-builder.js +13 -14
  15. package/dist/model-change/ModelChanges.js +2 -2
  16. package/dist/module.js +1 -4
  17. package/dist/references/scope-provider.js +3 -3
  18. package/dist/view-utils/manual-layout.js +2 -2
  19. package/dist/views/configurable-layouter.js +4 -4
  20. package/dist/views/likec4-views.d.ts +2 -1
  21. package/dist/views/likec4-views.js +2 -2
  22. package/package.json +14 -12
  23. package/dist/test/setup.d.ts +0 -1
  24. package/dist/test/setup.js +0 -7
  25. package/src/LikeC4FileSystem.ts +0 -38
  26. package/src/Rpc.ts +0 -134
  27. package/src/ast.ts +0 -556
  28. package/src/browser.ts +0 -35
  29. package/src/documentation/documentation-provider.ts +0 -52
  30. package/src/documentation/index.ts +0 -1
  31. package/src/formatting/LikeC4Formatter.ts +0 -639
  32. package/src/formatting/utils.ts +0 -26
  33. package/src/generated/ast.ts +0 -3735
  34. package/src/generated/grammar.ts +0 -10
  35. package/src/generated/module.ts +0 -33
  36. package/src/generated-lib/icons.ts +0 -1538
  37. package/src/index.ts +0 -30
  38. package/src/like-c4.langium +0 -901
  39. package/src/likec4lib.ts +0 -6
  40. package/src/logger.ts +0 -80
  41. package/src/lsp/CodeLensProvider.ts +0 -50
  42. package/src/lsp/CompletionProvider.ts +0 -147
  43. package/src/lsp/DocumentHighlightProvider.ts +0 -12
  44. package/src/lsp/DocumentLinkProvider.ts +0 -65
  45. package/src/lsp/DocumentSymbolProvider.ts +0 -313
  46. package/src/lsp/HoverProvider.ts +0 -92
  47. package/src/lsp/RenameProvider.ts +0 -8
  48. package/src/lsp/SemanticTokenProvider.ts +0 -383
  49. package/src/lsp/index.ts +0 -8
  50. package/src/model/deployments-index.ts +0 -209
  51. package/src/model/fqn-computation.ts +0 -83
  52. package/src/model/fqn-index.ts +0 -138
  53. package/src/model/index.ts +0 -6
  54. package/src/model/model-builder.ts +0 -724
  55. package/src/model/model-locator.ts +0 -146
  56. package/src/model/model-parser-where.ts +0 -84
  57. package/src/model/model-parser.ts +0 -86
  58. package/src/model/parser/Base.ts +0 -113
  59. package/src/model/parser/DeploymentModelParser.ts +0 -192
  60. package/src/model/parser/DeploymentViewParser.ts +0 -122
  61. package/src/model/parser/FqnRefParser.ts +0 -143
  62. package/src/model/parser/GlobalsParser.ts +0 -96
  63. package/src/model/parser/ModelParser.ts +0 -170
  64. package/src/model/parser/PredicatesParser.ts +0 -315
  65. package/src/model/parser/SpecificationParser.ts +0 -133
  66. package/src/model/parser/ViewsParser.ts +0 -428
  67. package/src/model-change/ModelChanges.ts +0 -101
  68. package/src/model-change/changeElementStyle.ts +0 -172
  69. package/src/model-change/changeViewLayout.ts +0 -47
  70. package/src/model-change/saveManualLayout.ts +0 -41
  71. package/src/module.ts +0 -255
  72. package/src/protocol.ts +0 -93
  73. package/src/references/index.ts +0 -3
  74. package/src/references/name-provider.ts +0 -37
  75. package/src/references/scope-computation.ts +0 -364
  76. package/src/references/scope-provider.ts +0 -201
  77. package/src/shared/NodeKindProvider.ts +0 -121
  78. package/src/shared/WorkspaceManager.ts +0 -48
  79. package/src/shared/WorkspaceSymbolProvider.ts +0 -3
  80. package/src/shared/index.ts +0 -3
  81. package/src/test/index.ts +0 -1
  82. package/src/test/setup.ts +0 -8
  83. package/src/test/testServices.ts +0 -152
  84. package/src/utils/disposable.ts +0 -30
  85. package/src/utils/elementRef.ts +0 -26
  86. package/src/utils/fqnRef.ts +0 -56
  87. package/src/utils/index.ts +0 -2
  88. package/src/utils/printDocs.ts +0 -3
  89. package/src/utils/stringHash.ts +0 -6
  90. package/src/validation/_shared.ts +0 -29
  91. package/src/validation/deployment-checks.ts +0 -131
  92. package/src/validation/dynamic-view-rule.ts +0 -23
  93. package/src/validation/dynamic-view-step.ts +0 -36
  94. package/src/validation/element.ts +0 -56
  95. package/src/validation/index.ts +0 -171
  96. package/src/validation/property-checks.ts +0 -52
  97. package/src/validation/relation.ts +0 -63
  98. package/src/validation/specification.ts +0 -205
  99. package/src/validation/view-predicates/element-with.ts +0 -36
  100. package/src/validation/view-predicates/expanded-element.ts +0 -16
  101. package/src/validation/view-predicates/expression-v2.ts +0 -101
  102. package/src/validation/view-predicates/incoming.ts +0 -20
  103. package/src/validation/view-predicates/index.ts +0 -6
  104. package/src/validation/view-predicates/outgoing.ts +0 -20
  105. package/src/validation/view-predicates/relation-with.ts +0 -17
  106. package/src/validation/view.ts +0 -37
  107. package/src/view-utils/assignNavigateTo.ts +0 -31
  108. package/src/view-utils/index.ts +0 -2
  109. package/src/view-utils/manual-layout.ts +0 -116
  110. package/src/view-utils/resolve-relative-paths.ts +0 -90
  111. package/src/views/configurable-layouter.ts +0 -65
  112. package/src/views/index.ts +0 -1
  113. package/src/views/likec4-views.ts +0 -139
package/dist/index.d.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  import { LikeC4FileSystem } from './LikeC4FileSystem';
2
2
  import { type LikeC4Services, type LikeC4SharedServices } from './module';
3
- export { logger as lspLogger, setLogLevel } from './logger';
3
+ export { getLspConnectionSink, logger as lspLogger } from './logger';
4
4
  export type { DocumentParser, LikeC4ModelBuilder, LikeC4ModelLocator, LikeC4ModelParser } from './model';
5
5
  export { createCustomLanguageServices, createLanguageServices, LikeC4Module } from './module';
6
6
  export type { LikeC4Services, LikeC4SharedServices } from './module';
7
7
  export type { LikeC4Views } from './views';
8
8
  export { LikeC4FileSystem };
9
- export declare function startLanguageServer(): {
9
+ export declare function startLanguageServer(): Promise<{
10
10
  shared: LikeC4SharedServices;
11
11
  likec4: LikeC4Services;
12
- };
12
+ }>;
package/dist/index.js CHANGED
@@ -1,13 +1,30 @@
1
+ import { configureLogger, getConsoleSink, getTextFormatter } from "@likec4/log";
1
2
  import { startLanguageServer as startLanguim } from "langium/lsp";
2
3
  import { createConnection, ProposedFeatures } from "vscode-languageserver/node";
3
4
  import { LikeC4FileSystem } from "./LikeC4FileSystem.js";
5
+ import { getTelemetrySink, logger } from "./logger.js";
4
6
  import { createCustomLanguageServices } from "./module.js";
5
7
  import { ConfigurableLayouter } from "./views/configurable-layouter.js";
6
- export { logger as lspLogger, setLogLevel } from "./logger.js";
8
+ export { getLspConnectionSink, logger as lspLogger } from "./logger.js";
7
9
  export { createCustomLanguageServices, createLanguageServices, LikeC4Module } from "./module.js";
8
10
  export { LikeC4FileSystem };
9
- export function startLanguageServer() {
11
+ export async function startLanguageServer() {
10
12
  const connection = createConnection(ProposedFeatures.all);
13
+ await configureLogger({
14
+ sinks: {
15
+ console: getConsoleSink({
16
+ formatter: getTextFormatter()
17
+ }),
18
+ telemetry: getTelemetrySink(connection)
19
+ },
20
+ loggers: [
21
+ {
22
+ category: ["likec4"],
23
+ sinks: ["console", "telemetry"]
24
+ }
25
+ ]
26
+ });
27
+ logger.info("Starting LikeC4 language server");
11
28
  const services = createCustomLanguageServices({ connection, ...LikeC4FileSystem }, ConfigurableLayouter);
12
29
  startLanguim(services.shared);
13
30
  return services;
package/dist/logger.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { LogLevels } from '@likec4/log';
1
+ import { type Sink, type TextFormatter } from '@likec4/log';
2
2
  import type { Connection } from 'vscode-languageserver';
3
3
  export declare const logger: any;
4
4
  export declare function logError(err: unknown): void;
@@ -6,5 +6,12 @@ export declare function logError(err: unknown): void;
6
6
  * Logs an error as warning (not critical)
7
7
  */
8
8
  export declare function logWarnError(err: unknown): void;
9
- export declare function setLogLevel(level: keyof typeof LogLevels): void;
10
- export declare function logToLspConnection(connection: Connection): void;
9
+ type LspConnectionSinkProps = {
10
+ /**
11
+ * The text formatter to use. Defaults to {@link defaultTextFormatter}.
12
+ */
13
+ formatter?: TextFormatter;
14
+ };
15
+ export declare function getLspConnectionSink(connection: Connection, props?: LspConnectionSinkProps): Sink;
16
+ export declare function getTelemetrySink(connection: Connection): Sink;
17
+ export {};
package/dist/logger.js CHANGED
@@ -1,69 +1,75 @@
1
- import { nonexhaustive } from "@likec4/core";
2
- import { formatLogObj, LogLevels, rootLogger as root } from "@likec4/log";
3
- import { BROWSER } from "esm-env";
4
- export const logger = root.withTag("lsp");
1
+ import {
2
+ errorFromLogRecord,
3
+ getMessageOnlyFormatter,
4
+ getTextFormatter,
5
+ loggable,
6
+ logger as root
7
+ } from "@likec4/log";
8
+ export const logger = root.getChild("server");
5
9
  export function logError(err) {
6
- logger.error(err);
10
+ logger.error(loggable(err));
7
11
  }
8
12
  export function logWarnError(err) {
9
- logger.warn(err);
13
+ logger.warn(loggable(err));
10
14
  }
11
- export function setLogLevel(level) {
12
- logger.level = LogLevels[level];
13
- }
14
- export function logToLspConnection(connection) {
15
- const reporter = {
16
- log: (logObj, _ctx) => {
17
- const { message, error } = formatLogObj(logObj);
18
- switch (logObj.type) {
19
- case "silent": {
20
- break;
21
- }
22
- case "verbose":
23
- case "trace": {
24
- connection.tracer.log(message);
25
- break;
26
- }
27
- case "debug": {
28
- connection.console.debug(message);
29
- break;
30
- }
31
- case "log": {
32
- connection.console.log(message);
15
+ export function getLspConnectionSink(connection, props) {
16
+ const format = props?.formatter ?? getTextFormatter({
17
+ format: ({ category, message }) => {
18
+ return `${category} ${message}`;
19
+ }
20
+ });
21
+ return (logObj) => {
22
+ try {
23
+ switch (logObj.level) {
24
+ case "debug":
25
+ connection.console.debug(format(logObj));
33
26
  break;
34
- }
35
27
  case "info":
36
- case "box":
37
- case "ready":
38
- case "start":
39
- case "success": {
40
- connection.console.info(message);
28
+ connection.console.info(format(logObj));
41
29
  break;
42
- }
43
- case "warn": {
44
- connection.console.warn(message);
30
+ case "warning":
31
+ connection.console.warn(format(logObj));
32
+ break;
33
+ case "error":
34
+ case "fatal": {
35
+ connection.console.error(format(logObj));
45
36
  break;
46
37
  }
47
- case "fail":
38
+ }
39
+ } catch (e) {
40
+ console.error("Error while logging to LSP connection:", e);
41
+ }
42
+ };
43
+ }
44
+ export function getTelemetrySink(connection) {
45
+ const messageOnly = getMessageOnlyFormatter();
46
+ return (logObj) => {
47
+ try {
48
+ switch (logObj.level) {
48
49
  case "error":
49
50
  case "fatal": {
50
- connection.console.error(message);
51
- if (error) {
52
- connection.telemetry.logEvent({ eventName: "error", ...error });
51
+ const err = errorFromLogRecord(logObj);
52
+ if (err) {
53
+ connection.telemetry.logEvent({
54
+ eventName: "error",
55
+ message: `${err.name}: ${err.message}`,
56
+ category: logObj.category.join("."),
57
+ ...err.stack && {
58
+ stack: err.stack
59
+ }
60
+ });
53
61
  } else {
54
- connection.telemetry.logEvent({ eventName: "error", message });
62
+ connection.telemetry.logEvent({
63
+ eventName: "error",
64
+ message: messageOnly(logObj),
65
+ category: logObj.category.join(".")
66
+ });
55
67
  }
56
68
  break;
57
69
  }
58
- default:
59
- nonexhaustive(logObj.type);
60
70
  }
71
+ } catch (e) {
72
+ console.error("Error while logging to LSP connection:", e);
61
73
  }
62
74
  };
63
- if (BROWSER) {
64
- root.addReporter(reporter);
65
- } else {
66
- root.setReporters([reporter]);
67
- }
68
- logger.setReporters(root.options.reporters);
69
75
  }
@@ -2,7 +2,7 @@ import { AsFqn, LinkedList, nonexhaustive } from "@likec4/core";
2
2
  import { AstUtils, CstUtils, GrammarUtils, MultiMap } from "langium";
3
3
  import { isDefined, isEmpty } from "remeda";
4
4
  import { ast, ElementOps } from "../ast.js";
5
- import { logError } from "../logger.js";
5
+ import { logWarnError } from "../logger.js";
6
6
  import { getFqnElementRef } from "../utils/elementRef.js";
7
7
  const { findNodeForProperty } = GrammarUtils;
8
8
  const { toDocumentSegment } = CstUtils;
@@ -66,7 +66,7 @@ export function computeDocumentFqn(document, services) {
66
66
  }
67
67
  nonexhaustive(el);
68
68
  } catch (e) {
69
- logError(e);
69
+ logWarnError(e);
70
70
  }
71
71
  }
72
72
  }
@@ -114,7 +114,7 @@ function buildModel(services, docs) {
114
114
  try {
115
115
  const __kind = c4Specification.elements[kind];
116
116
  if (!__kind) {
117
- logger.warn(`No kind '${kind}' found for ${id}`);
117
+ logger.warn`No kind '${kind}' found for ${id}`;
118
118
  return null;
119
119
  }
120
120
  const links = unresolvedLinks ? resolveLinks(doc, unresolvedLinks) : null;
@@ -210,7 +210,7 @@ function buildModel(services, docs) {
210
210
  (acc, el) => {
211
211
  const parent = parentFqn(el.id);
212
212
  if (parent && isNullish(acc[parent])) {
213
- logWarnError(`No parent found for ${el.id}`);
213
+ logger.debug`No parent found for ${el.id}`;
214
214
  return acc;
215
215
  }
216
216
  acc[el.id] = withExtendElementData(el);
@@ -230,9 +230,10 @@ function buildModel(services, docs) {
230
230
  ...model
231
231
  }) => {
232
232
  if (isNullish(elements[source]) || isNullish(elements[target])) {
233
- logger.warn(
234
- `Invalid relation ${id} at ${doc.uri.path} ${astPath}, source: ${source}(${!!elements[source]}), target: ${target}(${!!elements[target]})`
235
- );
233
+ logger.debug`Invalid relation ${id}
234
+ source: ${source} resolved: ${!!elements[source]}
235
+ target: ${target} resolved: ${!!elements[target]}
236
+ at ${doc.uri.path}\n`;
236
237
  return null;
237
238
  }
238
239
  const links = unresolvedLinks ? resolveLinks(doc, unresolvedLinks) : null;
@@ -279,7 +280,7 @@ function buildModel(services, docs) {
279
280
  try {
280
281
  const __kind = c4Specification.deployments[parsed.kind];
281
282
  if (!__kind) {
282
- logger.warn(`No kind '${parsed.kind}' found for ${parsed.id}`);
283
+ logger.warn`No kind ${parsed.kind} found for ${parsed.id}`;
283
284
  return null;
284
285
  }
285
286
  let {
@@ -317,7 +318,7 @@ function buildModel(services, docs) {
317
318
  (acc, el) => {
318
319
  const parent = parentFqn(el.id);
319
320
  if (parent && isNullish(acc[parent])) {
320
- logWarnError(`No parent found for deployment element ${el.id}`);
321
+ logger.debug`No parent found for deployment element ${el.id}`;
321
322
  return acc;
322
323
  }
323
324
  acc[el.id] = el;
@@ -337,9 +338,7 @@ function buildModel(services, docs) {
337
338
  ...model
338
339
  }) => {
339
340
  if (isNullish(deploymentElements[source.id]) || isNullish(deploymentElements[target.id])) {
340
- logger.warn(
341
- `Invalid deployment relation ${id} at ${doc.uri.path} ${astPath}, source: ${source.id}(${!!deploymentElements[source.id]}), target: ${target.id}(${!!deploymentElements[target.id]})`
342
- );
341
+ logger.warn`Invalid deployment relation ${id} at ${doc.uri.path} ${astPath}, source: ${source.id}(${!!deploymentElements[source.id]}), target: ${target.id}(${!!deploymentElements[target.id]})`;
343
342
  return null;
344
343
  }
345
344
  const links = unresolvedLinks ? resolveLinks(doc, unresolvedLinks) : null;
@@ -370,7 +369,7 @@ function buildModel(services, docs) {
370
369
  reduce(
371
370
  (acc, el) => {
372
371
  if (isDefined(acc[el.id])) {
373
- logWarnError(`Duplicate deployment relation ${el.id}`);
372
+ logger.debug`Duplicate deployment relation ${el.id}`;
374
373
  return acc;
375
374
  }
376
375
  acc[el.id] = el;
@@ -480,7 +479,7 @@ export class LikeC4ModelBuilder extends ADisposable {
480
479
  DocumentState.Validated,
481
480
  async (docs, _cancelToken) => {
482
481
  let parsed = [];
483
- logger.debug(`[ModelBuilder] onValidated (${docs.length} docs)`);
482
+ logger.debug`[ModelBuilder] onValidated (${docs.length} docs)`;
484
483
  for (const doc of docs) {
485
484
  try {
486
485
  parsed.push(parser.parse(doc).uri);
@@ -495,7 +494,7 @@ export class LikeC4ModelBuilder extends ADisposable {
495
494
  }
496
495
  )
497
496
  );
498
- logger.debug(`[ModelBuilder] Created`);
497
+ logger.debug`[ModelBuilder] Created`;
499
498
  }
500
499
  langiumDocuments;
501
500
  listeners = [];
@@ -512,7 +511,7 @@ export class LikeC4ModelBuilder extends ADisposable {
512
511
  }
513
512
  const cache = this.services.WorkspaceCache;
514
513
  return cache.get(CACHE_KEY_PARSED_MODEL, () => {
515
- logger.debug(`[ModelBuilder] buildModel (${docs.length} docs)`);
514
+ logger.debug`[ModelBuilder] buildModel (${docs.length} docs)`;
516
515
  return buildModel(this.services, docs);
517
516
  });
518
517
  }
@@ -40,8 +40,8 @@ export class LikeC4ModelChanges {
40
40
  range: modifiedRange
41
41
  };
42
42
  });
43
- } catch (e) {
44
- logger.error(`Failed to apply change ${changeView.change.op} ${changeView.viewId}`, e);
43
+ } catch (error) {
44
+ logger.error(`Failed to apply change ${changeView.change.op} ${changeView.viewId}`, { error });
45
45
  }
46
46
  return result;
47
47
  }
package/dist/module.js CHANGED
@@ -15,7 +15,7 @@ import {
15
15
  LikeC4GeneratedModule,
16
16
  LikeC4GeneratedSharedModule
17
17
  } from "./generated/module.js";
18
- import { logger, logToLspConnection } from "./logger.js";
18
+ import { logger } from "./logger.js";
19
19
  import {
20
20
  LikeC4CodeLensProvider,
21
21
  LikeC4CompletionProvider,
@@ -120,9 +120,6 @@ export function createSharedServices(context = {}) {
120
120
  ...EmptyFileSystem,
121
121
  ...context
122
122
  };
123
- if (context.connection) {
124
- logToLspConnection(context.connection);
125
- }
126
123
  return inject(
127
124
  createDefaultSharedModule(moduleContext),
128
125
  LikeC4GeneratedSharedModule,
@@ -11,7 +11,7 @@ import {
11
11
  StreamScope
12
12
  } from "langium";
13
13
  import { ast } from "../ast.js";
14
- import { logger } from "../logger.js";
14
+ import { logWarnError } from "../logger.js";
15
15
  import { elementRef, getFqnElementRef } from "../utils/elementRef.js";
16
16
  const { getDocument } = AstUtils;
17
17
  export class LikeC4ScopeProvider extends DefaultScopeProvider {
@@ -98,11 +98,11 @@ export class LikeC4ScopeProvider extends DefaultScopeProvider {
98
98
  }
99
99
  return this.computeScope(context);
100
100
  } catch (e) {
101
- logger.warn(e);
101
+ logWarnError(e);
102
102
  return this.getGlobalScope(referenceType, context);
103
103
  }
104
104
  } catch (e) {
105
- logger.warn(e);
105
+ logWarnError(e);
106
106
  return EMPTY_SCOPE;
107
107
  }
108
108
  }
@@ -3,7 +3,7 @@ import { decode, encode } from "@msgpack/msgpack";
3
3
  import { fromBase64, toBase64 } from "@smithy/util-base64";
4
4
  import { AstUtils, CstUtils } from "langium";
5
5
  import { mapValues } from "remeda";
6
- import { logger } from "../logger.js";
6
+ import { logger, logWarnError } from "../logger.js";
7
7
  const { getDocument } = AstUtils;
8
8
  function pack({
9
9
  nodes,
@@ -90,7 +90,7 @@ export function parseViewManualLayout(node) {
90
90
  return deserializeFromComment(commentNode.text);
91
91
  } catch (e) {
92
92
  const doc = getDocument(node);
93
- logger.warn(e);
93
+ logWarnError(e);
94
94
  logger.warn(
95
95
  `Ignoring manual layout of "${node.name ?? "unnamed"}" at ${doc.uri.fsPath}:${1 + (commentNode.range.start.line || 0)}`
96
96
  );
@@ -7,7 +7,7 @@ function graphvizBinPath() {
7
7
  try {
8
8
  return which.sync("dot");
9
9
  } catch (error) {
10
- logger.error("Error checking for native Graphviz:", error);
10
+ logger.error("Error checking for native Graphviz:", { error });
11
11
  return null;
12
12
  }
13
13
  }
@@ -19,7 +19,7 @@ export const ConfigurableLayouter = {
19
19
  const layouter = new GraphvizLayouter(wasmAdapter);
20
20
  const langId = services.LanguageMetaData.languageId;
21
21
  services.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate((update) => {
22
- logger.debug("Configuration update", update);
22
+ logger.debug("Configuration update", { update });
23
23
  if (update.section === langId) {
24
24
  try {
25
25
  const { mode, path } = update.configuration.graphviz ?? {
@@ -43,11 +43,11 @@ export const ConfigurableLayouter = {
43
43
  layouter.changePort(new GraphvizBinaryAdapter(binaryPath));
44
44
  logger.info(`use graphviz binary: ${binaryPath}`);
45
45
  } catch (error) {
46
- logger.error("Failed to update configuration", error);
46
+ logger.error("Failed to update configuration", { error });
47
47
  }
48
48
  return;
49
49
  }
50
- logger.warn("Unexpected configuration update", update);
50
+ logger.warn("Unexpected configuration update", { update });
51
51
  });
52
52
  return layouter;
53
53
  }
@@ -1,4 +1,5 @@
1
1
  import type { ComputedView, DiagramView, OverviewGraph, ViewId } from '@likec4/core';
2
+ import { GraphvizLayouter } from '@likec4/layouts';
2
3
  import { type Cancellation } from 'langium';
3
4
  import type { LikeC4Services } from '../module';
4
5
  export type GraphvizOut = {
@@ -15,7 +16,7 @@ export declare class LikeC4Views {
15
16
  private cache;
16
17
  private viewsWithReportedErrors;
17
18
  constructor(services: LikeC4Services);
18
- private get layouter();
19
+ get layouter(): GraphvizLayouter;
19
20
  computedViews(cancelToken?: Cancellation.CancellationToken): Promise<ComputedView[]>;
20
21
  layoutAllViews(cancelToken?: Cancellation.CancellationToken): Promise<Array<Readonly<GraphvizOut>>>;
21
22
  layoutView(viewId: ViewId, cancelToken?: Cancellation.CancellationToken): Promise<GraphvizOut | null>;
@@ -1,5 +1,5 @@
1
1
  import { values } from "remeda";
2
- import { logger, logWarnError } from "../logger.js";
2
+ import { logError, logWarnError } from "../logger.js";
3
3
  export class LikeC4Views {
4
4
  constructor(services) {
5
5
  this.services = services;
@@ -64,7 +64,7 @@ export class LikeC4Views {
64
64
  this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${errMessage}`);
65
65
  this.viewsWithReportedErrors.add(viewId);
66
66
  }
67
- logger.error(e);
67
+ logError(e);
68
68
  return Promise.reject(e);
69
69
  }
70
70
  }
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.21.1",
4
+ "version": "1.22.1",
5
5
  "license": "MIT",
6
6
  "bugs": "https://github.com/likec4/likec4/issues",
7
7
  "homepage": "https://likec4.dev",
@@ -9,7 +9,6 @@
9
9
  "files": [
10
10
  "bin",
11
11
  "dist",
12
- "src",
13
12
  "!**/__mocks__/",
14
13
  "!**/__tests__/",
15
14
  "!**/*.spec.*",
@@ -21,7 +20,7 @@
21
20
  "directory": "packages/language-server"
22
21
  },
23
22
  "engines": {
24
- "node": ">=20"
23
+ "node": ">=20.18.3"
25
24
  },
26
25
  "engineStrict": true,
27
26
  "type": "module",
@@ -89,15 +88,18 @@
89
88
  "vitest:ui": "vitest --no-isolate --ui",
90
89
  "test:watch": "vitest"
91
90
  },
91
+ "dependencies": {
92
+ "@hpcc-js/wasm-graphviz": "1.7.0"
93
+ },
92
94
  "devDependencies": {
93
- "@likec4/core": "1.21.1",
94
- "@likec4/icons": "1.21.1",
95
- "@likec4/layouts": "1.21.1",
96
- "@likec4/log": "1.21.1",
97
- "@likec4/tsconfig": "1.21.1",
98
- "@msgpack/msgpack": "^3.0.0-beta4",
95
+ "@likec4/core": "1.22.1",
96
+ "@likec4/icons": "1.22.1",
97
+ "@likec4/layouts": "1.22.1",
98
+ "@likec4/log": "1.22.1",
99
+ "@likec4/tsconfig": "1.22.1",
100
+ "@msgpack/msgpack": "^3.0.0",
99
101
  "@smithy/util-base64": "^4.0.0",
100
- "@types/node": "^20.17.7",
102
+ "@types/node": "^20.17.17",
101
103
  "@types/which": "^3.0.4",
102
104
  "@vitest/coverage-v8": "^3.0.4",
103
105
  "esm-env": "^1.2.2",
@@ -113,7 +115,7 @@
113
115
  "strip-indent": "^4.0.0",
114
116
  "tsx": "~4.19.2",
115
117
  "turbo": "^2.4.0",
116
- "type-fest": "4.28.1",
118
+ "type-fest": "4.34.1",
117
119
  "typescript": "^5.7.3",
118
120
  "ufo": "^1.5.4",
119
121
  "unbuild": "^3.3.1",
@@ -122,7 +124,7 @@
122
124
  "vscode-languageserver": "9.0.1",
123
125
  "vscode-languageserver-types": "3.17.5",
124
126
  "vscode-uri": "3.0.8",
125
- "which": "^4.0.0"
127
+ "which": "^5.0.0"
126
128
  },
127
129
  "packageManager": "yarn@4.6.0"
128
130
  }
@@ -1 +0,0 @@
1
- export {};
@@ -1,7 +0,0 @@
1
- import { consola } from "@likec4/log";
2
- import { beforeEach, vi } from "vitest";
3
- import { logger } from "../logger.js";
4
- beforeEach(() => {
5
- consola.mockTypes(() => vi.fn());
6
- logger.mockTypes(() => vi.fn());
7
- });
@@ -1,38 +0,0 @@
1
- import { fdir } from 'fdir'
2
- import { type FileSystemNode, URI } from 'langium'
3
- import { NodeFileSystemProvider } from 'langium/node'
4
- import { LikeC4LanguageMetaData } from './generated/module'
5
- import { logger } from './logger'
6
-
7
- export const LikeC4FileSystem = {
8
- fileSystemProvider: () => new SymLinkTraversingFileSystemProvider(),
9
- }
10
-
11
- const hasExtension = (path: string) => LikeC4LanguageMetaData.fileExtensions.some((ext) => path.endsWith(ext))
12
- /**
13
- * A file system provider that follows symbolic links.
14
- * @see https://github.com/likec4/likec4/pull/1213
15
- */
16
- class SymLinkTraversingFileSystemProvider extends NodeFileSystemProvider {
17
- override async readDirectory(folderPath: URI): Promise<FileSystemNode[]> {
18
- const entries = [] as FileSystemNode[]
19
- try {
20
- const crawled = await new fdir()
21
- .withSymlinks()
22
- .withFullPaths()
23
- .filter(hasExtension)
24
- .crawl(folderPath.fsPath)
25
- .withPromise()
26
- for (const path of crawled) {
27
- entries.push({
28
- isFile: true,
29
- isDirectory: false,
30
- uri: URI.file(path),
31
- })
32
- }
33
- } catch (error) {
34
- logger.error(error)
35
- }
36
- return entries
37
- }
38
- }