@likec4/language-server 1.39.5 → 1.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/ast.d.ts +4 -2
  2. package/dist/bundled.mjs +3438 -3428
  3. package/dist/formatting/LikeC4Formatter.mjs +14 -8
  4. package/dist/generated/ast.d.ts +22 -5
  5. package/dist/generated/ast.mjs +28 -2
  6. package/dist/generated/grammar.mjs +1 -1
  7. package/dist/logger.d.ts +1 -1
  8. package/dist/logger.mjs +3 -0
  9. package/dist/lsp/CompletionProvider.mjs +34 -3
  10. package/dist/lsp/HoverProvider.mjs +14 -2
  11. package/dist/lsp/SemanticTokenProvider.mjs +1 -1
  12. package/dist/model/builder/MergedSpecification.d.ts +1 -1
  13. package/dist/model/builder/MergedSpecification.mjs +39 -35
  14. package/dist/model/builder/buildModel.mjs +2 -1
  15. package/dist/model/model-parser.d.ts +72 -45
  16. package/dist/model/parser/Base.d.ts +13 -7
  17. package/dist/model/parser/Base.mjs +27 -16
  18. package/dist/model/parser/DeploymentModelParser.d.ts +8 -5
  19. package/dist/model/parser/DeploymentModelParser.mjs +47 -45
  20. package/dist/model/parser/DeploymentViewParser.d.ts +8 -5
  21. package/dist/model/parser/DeploymentViewParser.mjs +1 -2
  22. package/dist/model/parser/FqnRefParser.d.ts +10 -6
  23. package/dist/model/parser/FqnRefParser.mjs +12 -4
  24. package/dist/model/parser/GlobalsParser.d.ts +8 -5
  25. package/dist/model/parser/GlobalsParser.mjs +5 -3
  26. package/dist/model/parser/ImportsParser.d.ts +8 -5
  27. package/dist/model/parser/ImportsParser.mjs +4 -2
  28. package/dist/model/parser/ModelParser.d.ts +8 -5
  29. package/dist/model/parser/ModelParser.mjs +31 -36
  30. package/dist/model/parser/PredicatesParser.d.ts +8 -5
  31. package/dist/model/parser/SpecificationParser.d.ts +8 -5
  32. package/dist/model/parser/SpecificationParser.mjs +15 -21
  33. package/dist/model/parser/ValueConverter.mjs +1 -1
  34. package/dist/model/parser/ViewsParser.d.ts +8 -5
  35. package/dist/model/parser/ViewsParser.mjs +5 -5
  36. package/dist/test/testServices.mjs +22 -24
  37. package/dist/validation/{dynamic-view-step.d.ts → dynamic-view.d.ts} +2 -1
  38. package/dist/validation/{dynamic-view-step.mjs → dynamic-view.mjs} +19 -0
  39. package/dist/validation/index.d.ts +1 -1
  40. package/dist/validation/index.mjs +4 -2
  41. package/package.json +8 -8
package/dist/logger.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { type Logger, type Sink, type TextFormatter } from '@likec4/log';
2
2
  import type { Connection } from 'vscode-languageserver';
3
3
  export declare const logger: Logger;
4
+ export { logger as serverLogger, };
4
5
  export declare function logError(err: unknown): void;
5
6
  /**
6
7
  * Logs an error as warning (not critical)
@@ -14,4 +15,3 @@ type LspConnectionSinkProps = {
14
15
  };
15
16
  export declare function getLspConnectionSink(connection: Connection, props?: LspConnectionSinkProps): Sink;
16
17
  export declare function getTelemetrySink(connection: Connection): Sink;
17
- export {};
package/dist/logger.mjs CHANGED
@@ -7,6 +7,9 @@ import {
7
7
  logger as root
8
8
  } from "@likec4/log";
9
9
  export const logger = root.getChild("server");
10
+ export {
11
+ logger as serverLogger
12
+ };
10
13
  export function logError(err) {
11
14
  logger.error(loggable(err));
12
15
  }
@@ -52,9 +52,10 @@ export class LikeC4CompletionProvider extends DefaultCompletionProvider {
52
52
  ].join("\n")
53
53
  });
54
54
  break;
55
- case ["title", "description", "technology"].includes(keyword.value):
55
+ case ["title", "description", "technology", "link"].includes(keyword.value):
56
56
  acceptor(context, {
57
57
  label: keyword.value,
58
+ detail: `Insert ${keyword.value} property`,
58
59
  kind: CompletionItemKind.Property,
59
60
  insertTextFormat: InsertTextFormat.Snippet,
60
61
  insertText: `${keyword.value} '\${0}'`
@@ -91,7 +92,7 @@ export class LikeC4CompletionProvider extends DefaultCompletionProvider {
91
92
  acceptor(context, {
92
93
  label: keyword.value,
93
94
  detail: `Insert group block`,
94
- kind: CompletionItemKind.Class,
95
+ kind: CompletionItemKind.Module,
95
96
  insertTextFormat: InsertTextFormat.Snippet,
96
97
  insertText: [
97
98
  "group '${1:Title}' {",
@@ -100,6 +101,19 @@ export class LikeC4CompletionProvider extends DefaultCompletionProvider {
100
101
  ].join("\n")
101
102
  });
102
103
  break;
104
+ case ["par", "parallel"].includes(keyword.value):
105
+ acceptor(context, {
106
+ label: keyword.value,
107
+ detail: `Insert block of parallel steps`,
108
+ kind: CompletionItemKind.Module,
109
+ insertTextFormat: InsertTextFormat.Snippet,
110
+ insertText: [
111
+ `${keyword.value} {`,
112
+ " $0",
113
+ "}"
114
+ ].join("\n")
115
+ });
116
+ break;
103
117
  case (keyword.value === "dynamic" && AstUtils.hasContainerOfType(context.node, ast.isModelViews)):
104
118
  acceptor(context, {
105
119
  label: keyword.value,
@@ -160,11 +174,28 @@ export class LikeC4CompletionProvider extends DefaultCompletionProvider {
160
174
  case keyword.value === "autoLayout":
161
175
  acceptor(context, {
162
176
  label: keyword.value,
163
- kind: CompletionItemKind.Class,
177
+ kind: CompletionItemKind.Property,
164
178
  insertTextFormat: InsertTextFormat.Snippet,
165
179
  insertText: "autoLayout ${1|TopBottom,BottomTop,LeftRight,RightLeft|}$0"
166
180
  });
167
181
  break;
182
+ case keyword.value === "mode":
183
+ acceptor(context, {
184
+ label: keyword.value,
185
+ kind: CompletionItemKind.Property,
186
+ insertTextFormat: InsertTextFormat.Snippet,
187
+ insertText: "mode ${1|sequence,diagram|}$0"
188
+ });
189
+ break;
190
+ case ["include", "exclude"].includes(keyword.value):
191
+ acceptor(context, {
192
+ label: keyword.value,
193
+ kind: CompletionItemKind.Operator,
194
+ detail: `Insert ${keyword.value} predicate`,
195
+ insertTextFormat: InsertTextFormat.PlainText,
196
+ insertText: `${keyword.value} `
197
+ });
198
+ break;
168
199
  default:
169
200
  acceptor(context, {
170
201
  label: keyword.value,
@@ -1,4 +1,4 @@
1
- import { FqnRef } from "@likec4/core";
1
+ import { FqnRef, preferSummary } from "@likec4/core";
2
2
  import { AstUtils } from "langium";
3
3
  import { AstNodeHoverProvider } from "langium/lsp";
4
4
  import { ast } from "../ast.mjs";
@@ -27,6 +27,10 @@ export class LikeC4HoverProvider extends AstNodeHoverProvider {
27
27
  lines.push(`### ${el.title}`);
28
28
  }
29
29
  lines.push("deployment node `" + el.kind + "` ");
30
+ const summary = preferSummary(el);
31
+ if (summary) {
32
+ lines.push("", summary.md ?? summary.txt);
33
+ }
30
34
  return {
31
35
  contents: {
32
36
  kind: "markdown",
@@ -79,7 +83,15 @@ export class LikeC4HoverProvider extends AstNodeHoverProvider {
79
83
  if (!el) {
80
84
  return;
81
85
  }
82
- const lines = [el.id, `### ${el.title}`, "element kind `" + el.kind + "` "];
86
+ const lines = [
87
+ el.id,
88
+ `### ${el.title}`,
89
+ "element kind `" + el.kind + "` "
90
+ ];
91
+ const summary = preferSummary(el);
92
+ if (summary) {
93
+ lines.push("", summary.md ?? summary.txt);
94
+ }
83
95
  return {
84
96
  contents: {
85
97
  kind: "markdown",
@@ -281,7 +281,7 @@ export class LikeC4SemanticTokenProvider extends AbstractSemanticTokenProvider {
281
281
  }
282
282
  return "prune";
283
283
  }
284
- if (ast.isColorProperty(node) || ast.isShapeProperty(node) || ast.isArrowProperty(node) || ast.isLineProperty(node) || ast.isBorderProperty(node) || ast.isSizeProperty(node)) {
284
+ if (ast.isColorProperty(node) || ast.isShapeProperty(node) || ast.isArrowProperty(node) || ast.isLineProperty(node) || ast.isBorderProperty(node) || ast.isSizeProperty(node) || ast.isDynamicViewDisplayVariantProperty(node)) {
285
285
  acceptor({
286
286
  node,
287
287
  property: "key",
@@ -16,7 +16,7 @@ export declare class MergedSpecification {
16
16
  /**
17
17
  * Converts a parsed model into a C4 model element.
18
18
  */
19
- toModelElement: ({ tags, links, style: { color, shape, icon, opacity, border, size, multiple, padding, textSize, }, id, kind, title, description, technology, metadata, }: ParsedAstElement) => c4.Element | null;
19
+ toModelElement: ({ tags, links, style: { color, shape, icon, opacity, border, size, multiple, padding, textSize, }, id, kind, title, description, technology, summary, metadata, }: ParsedAstElement) => c4.Element | null;
20
20
  /**
21
21
  * Converts a parsed model into a C4 model relation.
22
22
  */
@@ -1,10 +1,9 @@
1
- import { FqnRef } from "@likec4/core/types";
2
- import { MultiMap, nameFromFqn } from "@likec4/core/utils";
1
+ import { FqnRef, omitUndefined } from "@likec4/core/types";
2
+ import { isNonEmptyArray, MultiMap, nameFromFqn } from "@likec4/core/utils";
3
3
  import {
4
- isBoolean,
5
4
  isEmpty,
6
5
  isNonNullish,
7
- isNumber
6
+ unique
8
7
  } from "remeda";
9
8
  import { logger, logWarnError } from "../../logger.mjs";
10
9
  import { assignTagColors } from "./assignTagColors.mjs";
@@ -66,6 +65,7 @@ export class MergedSpecification {
66
65
  title,
67
66
  description,
68
67
  technology,
68
+ summary,
69
69
  metadata
70
70
  }) => {
71
71
  try {
@@ -85,30 +85,38 @@ export class MergedSpecification {
85
85
  padding ??= __kind.style.padding;
86
86
  textSize ??= __kind.style.textSize;
87
87
  description ??= __kind.description;
88
+ summary ??= __kind.summary;
88
89
  links ??= __kind.links;
89
90
  title = title === nameFromFqn(id) && __kind.title ? __kind.title : title;
90
- return {
91
- ...color && { color },
92
- ...shape && { shape },
93
- ...icon && { icon },
94
- ...metadata && !isEmpty(metadata) && { metadata },
95
- ...__kind.notation && { notation: __kind.notation },
96
- style: {
97
- ...border && { border },
98
- ...size && { size },
99
- ...padding && { padding },
100
- ...textSize && { textSize },
101
- ...isBoolean(multiple) && { multiple },
102
- ...isNumber(opacity) && { opacity }
103
- },
104
- links: links ?? null,
105
- tags: tags ?? [],
106
- ...technology && { technology },
107
- ...description && { description },
91
+ if (__kind.tags && isNonEmptyArray(__kind.tags)) {
92
+ tags = tags ? unique([
93
+ ...__kind.tags,
94
+ ...tags
95
+ ]) : __kind.tags;
96
+ }
97
+ return omitUndefined({
98
+ metadata: metadata && !isEmpty(metadata) ? metadata : void 0,
99
+ color,
100
+ notation: __kind?.notation,
101
+ shape,
102
+ icon,
103
+ style: omitUndefined({
104
+ border,
105
+ size,
106
+ padding,
107
+ textSize,
108
+ multiple,
109
+ opacity
110
+ }),
111
+ links,
112
+ tags,
113
+ summary,
114
+ technology,
115
+ description,
108
116
  title,
109
117
  kind,
110
118
  id
111
- };
119
+ });
112
120
  } catch (e) {
113
121
  logWarnError(e);
114
122
  }
@@ -166,28 +174,24 @@ export class MergedSpecification {
166
174
  return null;
167
175
  }
168
176
  let {
169
- technology = __kind.technology,
170
- notation = __kind.notation,
177
+ id,
171
178
  style,
172
179
  title,
173
- description,
174
180
  ...rest
175
181
  } = parsed;
176
- description ??= __kind.description;
177
182
  title = title === nameFromFqn(parsed.id) && __kind.title ? __kind.title : title;
178
- return {
183
+ return omitUndefined({
184
+ ...__kind,
179
185
  ...rest,
180
- ...{ title },
181
- ...description && { description },
182
- ...notation && { notation },
183
- ...technology && { technology },
184
- style: {
186
+ title,
187
+ style: omitUndefined({
185
188
  border: "dashed",
186
189
  opacity: 10,
187
190
  ...__kind.style,
188
191
  ...style
189
- }
190
- };
192
+ }),
193
+ id
194
+ });
191
195
  } catch (e) {
192
196
  logWarnError(e);
193
197
  }
@@ -21,6 +21,7 @@ import {
21
21
  keys,
22
22
  map,
23
23
  mapValues,
24
+ omitBy,
24
25
  pipe,
25
26
  prop,
26
27
  reduce
@@ -153,7 +154,7 @@ export function buildModelData(project, docs) {
153
154
  title = "Landscape view";
154
155
  }
155
156
  return {
156
- ...model,
157
+ ...omitBy(model, (v) => v === void 0),
157
158
  [_stage]: "parsed",
158
159
  docUri,
159
160
  description,
@@ -75,16 +75,19 @@ declare const DocumentParserFromMixins: {
75
75
  parseColorLiteral(astNode: import("../generated/ast").ColorLiteral): ProjectId | undefined;
76
76
  parseElementStyle(elementProps: Array<import("../generated/ast").ElementProperty> | import("../generated/ast").ElementStyleProperty | undefined): import("../ast").ParsedElementStyle;
77
77
  parseStyleProps(styleProps: Array<import("../generated/ast").StyleProperty> | undefined): import("../ast").ParsedElementStyle;
78
- parseTitleDescriptionTechnology(inlineProps: {
79
- title?: string | undefined;
80
- description?: string | undefined;
81
- technology?: string | undefined;
82
- }, bodyProps: {
78
+ parseBaseProps(props: {
83
79
  title?: import("../generated/ast").MarkdownOrString | undefined;
80
+ summary?: import("../generated/ast").MarkdownOrString | undefined;
84
81
  description?: import("../generated/ast").MarkdownOrString | undefined;
85
82
  technology?: import("../generated/ast").MarkdownOrString | undefined;
83
+ }, override?: {
84
+ title?: string | undefined;
85
+ summary?: string | undefined;
86
+ description?: string | undefined;
87
+ technology?: string | undefined;
86
88
  }): {
87
89
  title?: string;
90
+ summary?: ProjectId;
88
91
  description?: ProjectId;
89
92
  technology?: string;
90
93
  };
@@ -165,16 +168,19 @@ declare const DocumentParserFromMixins: {
165
168
  parseColorLiteral(astNode: import("../generated/ast").ColorLiteral): ProjectId | undefined;
166
169
  parseElementStyle(elementProps: Array<import("../generated/ast").ElementProperty> | import("../generated/ast").ElementStyleProperty | undefined): import("../ast").ParsedElementStyle;
167
170
  parseStyleProps(styleProps: Array<import("../generated/ast").StyleProperty> | undefined): import("../ast").ParsedElementStyle;
168
- parseTitleDescriptionTechnology(inlineProps: {
169
- title?: string | undefined;
170
- description?: string | undefined;
171
- technology?: string | undefined;
172
- }, bodyProps: {
171
+ parseBaseProps(props: {
173
172
  title?: import("../generated/ast").MarkdownOrString | undefined;
173
+ summary?: import("../generated/ast").MarkdownOrString | undefined;
174
174
  description?: import("../generated/ast").MarkdownOrString | undefined;
175
175
  technology?: import("../generated/ast").MarkdownOrString | undefined;
176
+ }, override?: {
177
+ title?: string | undefined;
178
+ summary?: string | undefined;
179
+ description?: string | undefined;
180
+ technology?: string | undefined;
176
181
  }): {
177
182
  title?: string;
183
+ summary?: ProjectId;
178
184
  description?: ProjectId;
179
185
  technology?: string;
180
186
  };
@@ -217,16 +223,19 @@ declare const DocumentParserFromMixins: {
217
223
  parseColorLiteral(astNode: import("../generated/ast").ColorLiteral): ProjectId | undefined;
218
224
  parseElementStyle(elementProps: Array<import("../generated/ast").ElementProperty> | import("../generated/ast").ElementStyleProperty | undefined): import("../ast").ParsedElementStyle;
219
225
  parseStyleProps(styleProps: Array<import("../generated/ast").StyleProperty> | undefined): import("../ast").ParsedElementStyle;
220
- parseTitleDescriptionTechnology(inlineProps: {
221
- title?: string | undefined;
222
- description?: string | undefined;
223
- technology?: string | undefined;
224
- }, bodyProps: {
226
+ parseBaseProps(props: {
225
227
  title?: import("../generated/ast").MarkdownOrString | undefined;
228
+ summary?: import("../generated/ast").MarkdownOrString | undefined;
226
229
  description?: import("../generated/ast").MarkdownOrString | undefined;
227
230
  technology?: import("../generated/ast").MarkdownOrString | undefined;
231
+ }, override?: {
232
+ title?: string | undefined;
233
+ summary?: string | undefined;
234
+ description?: string | undefined;
235
+ technology?: string | undefined;
228
236
  }): {
229
237
  title?: string;
238
+ summary?: ProjectId;
230
239
  description?: ProjectId;
231
240
  technology?: string;
232
241
  };
@@ -283,16 +292,19 @@ declare const DocumentParserFromMixins: {
283
292
  parseColorLiteral(astNode: import("../generated/ast").ColorLiteral): ProjectId | undefined;
284
293
  parseElementStyle(elementProps: Array<import("../generated/ast").ElementProperty> | import("../generated/ast").ElementStyleProperty | undefined): import("../ast").ParsedElementStyle;
285
294
  parseStyleProps(styleProps: Array<import("../generated/ast").StyleProperty> | undefined): import("../ast").ParsedElementStyle;
286
- parseTitleDescriptionTechnology(inlineProps: {
287
- title?: string | undefined;
288
- description?: string | undefined;
289
- technology?: string | undefined;
290
- }, bodyProps: {
295
+ parseBaseProps(props: {
291
296
  title?: import("../generated/ast").MarkdownOrString | undefined;
297
+ summary?: import("../generated/ast").MarkdownOrString | undefined;
292
298
  description?: import("../generated/ast").MarkdownOrString | undefined;
293
299
  technology?: import("../generated/ast").MarkdownOrString | undefined;
300
+ }, override?: {
301
+ title?: string | undefined;
302
+ summary?: string | undefined;
303
+ description?: string | undefined;
304
+ technology?: string | undefined;
294
305
  }): {
295
306
  title?: string;
307
+ summary?: ProjectId;
296
308
  description?: ProjectId;
297
309
  technology?: string;
298
310
  };
@@ -342,16 +354,19 @@ declare const DocumentParserFromMixins: {
342
354
  parseColorLiteral(astNode: import("../generated/ast").ColorLiteral): ProjectId | undefined;
343
355
  parseElementStyle(elementProps: Array<import("../generated/ast").ElementProperty> | import("../generated/ast").ElementStyleProperty | undefined): import("../ast").ParsedElementStyle;
344
356
  parseStyleProps(styleProps: Array<import("../generated/ast").StyleProperty> | undefined): import("../ast").ParsedElementStyle;
345
- parseTitleDescriptionTechnology(inlineProps: {
346
- title?: string | undefined;
347
- description?: string | undefined;
348
- technology?: string | undefined;
349
- }, bodyProps: {
357
+ parseBaseProps(props: {
350
358
  title?: import("../generated/ast").MarkdownOrString | undefined;
359
+ summary?: import("../generated/ast").MarkdownOrString | undefined;
351
360
  description?: import("../generated/ast").MarkdownOrString | undefined;
352
361
  technology?: import("../generated/ast").MarkdownOrString | undefined;
362
+ }, override?: {
363
+ title?: string | undefined;
364
+ summary?: string | undefined;
365
+ description?: string | undefined;
366
+ technology?: string | undefined;
353
367
  }): {
354
368
  title?: string;
369
+ summary?: ProjectId;
355
370
  description?: ProjectId;
356
371
  technology?: string;
357
372
  };
@@ -409,16 +424,19 @@ declare const DocumentParserFromMixins: {
409
424
  parseColorLiteral(astNode: import("../generated/ast").ColorLiteral): ProjectId | undefined;
410
425
  parseElementStyle(elementProps: Array<import("../generated/ast").ElementProperty> | import("../generated/ast").ElementStyleProperty | undefined): import("../ast").ParsedElementStyle;
411
426
  parseStyleProps(styleProps: Array<import("../generated/ast").StyleProperty> | undefined): import("../ast").ParsedElementStyle;
412
- parseTitleDescriptionTechnology(inlineProps: {
413
- title?: string | undefined;
414
- description?: string | undefined;
415
- technology?: string | undefined;
416
- }, bodyProps: {
427
+ parseBaseProps(props: {
417
428
  title?: import("../generated/ast").MarkdownOrString | undefined;
429
+ summary?: import("../generated/ast").MarkdownOrString | undefined;
418
430
  description?: import("../generated/ast").MarkdownOrString | undefined;
419
431
  technology?: import("../generated/ast").MarkdownOrString | undefined;
432
+ }, override?: {
433
+ title?: string | undefined;
434
+ summary?: string | undefined;
435
+ description?: string | undefined;
436
+ technology?: string | undefined;
420
437
  }): {
421
438
  title?: string;
439
+ summary?: ProjectId;
422
440
  description?: ProjectId;
423
441
  technology?: string;
424
442
  };
@@ -469,16 +487,19 @@ declare const DocumentParserFromMixins: {
469
487
  parseColorLiteral(astNode: import("../generated/ast").ColorLiteral): ProjectId | undefined;
470
488
  parseElementStyle(elementProps: Array<import("../generated/ast").ElementProperty> | import("../generated/ast").ElementStyleProperty | undefined): import("../ast").ParsedElementStyle;
471
489
  parseStyleProps(styleProps: Array<import("../generated/ast").StyleProperty> | undefined): import("../ast").ParsedElementStyle;
472
- parseTitleDescriptionTechnology(inlineProps: {
473
- title?: string | undefined;
474
- description?: string | undefined;
475
- technology?: string | undefined;
476
- }, bodyProps: {
490
+ parseBaseProps(props: {
477
491
  title?: import("../generated/ast").MarkdownOrString | undefined;
492
+ summary?: import("../generated/ast").MarkdownOrString | undefined;
478
493
  description?: import("../generated/ast").MarkdownOrString | undefined;
479
494
  technology?: import("../generated/ast").MarkdownOrString | undefined;
495
+ }, override?: {
496
+ title?: string | undefined;
497
+ summary?: string | undefined;
498
+ description?: string | undefined;
499
+ technology?: string | undefined;
480
500
  }): {
481
501
  title?: string;
502
+ summary?: ProjectId;
482
503
  description?: ProjectId;
483
504
  technology?: string;
484
505
  };
@@ -509,16 +530,19 @@ declare const DocumentParserFromMixins: {
509
530
  parseColorLiteral(astNode: import("../generated/ast").ColorLiteral): ProjectId | undefined;
510
531
  parseElementStyle(elementProps: Array<import("../generated/ast").ElementProperty> | import("../generated/ast").ElementStyleProperty | undefined): import("../ast").ParsedElementStyle;
511
532
  parseStyleProps(styleProps: Array<import("../generated/ast").StyleProperty> | undefined): import("../ast").ParsedElementStyle;
512
- parseTitleDescriptionTechnology(inlineProps: {
513
- title?: string | undefined;
514
- description?: string | undefined;
515
- technology?: string | undefined;
516
- }, bodyProps: {
533
+ parseBaseProps(props: {
517
534
  title?: import("../generated/ast").MarkdownOrString | undefined;
535
+ summary?: import("../generated/ast").MarkdownOrString | undefined;
518
536
  description?: import("../generated/ast").MarkdownOrString | undefined;
519
537
  technology?: import("../generated/ast").MarkdownOrString | undefined;
538
+ }, override?: {
539
+ title?: string | undefined;
540
+ summary?: string | undefined;
541
+ description?: string | undefined;
542
+ technology?: string | undefined;
520
543
  }): {
521
544
  title?: string;
545
+ summary?: ProjectId;
522
546
  description?: ProjectId;
523
547
  technology?: string;
524
548
  };
@@ -564,16 +588,19 @@ declare const DocumentParserFromMixins: {
564
588
  parseColorLiteral(astNode: import("../generated/ast").ColorLiteral): ProjectId | undefined;
565
589
  parseElementStyle(elementProps: Array<import("../generated/ast").ElementProperty> | import("../generated/ast").ElementStyleProperty | undefined): import("../ast").ParsedElementStyle;
566
590
  parseStyleProps(styleProps: Array<import("../generated/ast").StyleProperty> | undefined): import("../ast").ParsedElementStyle;
567
- parseTitleDescriptionTechnology(inlineProps: {
568
- title?: string | undefined;
569
- description?: string | undefined;
570
- technology?: string | undefined;
571
- }, bodyProps: {
591
+ parseBaseProps(props: {
572
592
  title?: import("../generated/ast").MarkdownOrString | undefined;
593
+ summary?: import("../generated/ast").MarkdownOrString | undefined;
573
594
  description?: import("../generated/ast").MarkdownOrString | undefined;
574
595
  technology?: import("../generated/ast").MarkdownOrString | undefined;
596
+ }, override?: {
597
+ title?: string | undefined;
598
+ summary?: string | undefined;
599
+ description?: string | undefined;
600
+ technology?: string | undefined;
575
601
  }): {
576
602
  title?: string;
603
+ summary?: ProjectId;
577
604
  description?: ProjectId;
578
605
  technology?: string;
579
606
  };
@@ -44,19 +44,25 @@ export declare class BaseParser {
44
44
  parseElementStyle(elementProps: Array<ast.ElementProperty> | ast.ElementStyleProperty | undefined): ParsedElementStyle;
45
45
  parseStyleProps(styleProps: Array<ast.StyleProperty> | undefined): ParsedElementStyle;
46
46
  /**
47
- * Parses title, description and technology
48
- * Inline properties (right on node) have higher priority than body properties (inside '{...}')
47
+ * Parse base properties: title, description and technology
48
+ *
49
+ * @param props - body properties (inside '{...}')
50
+ * @param override - optional, inline properties (right on the node)
51
+ * have higher priority and override body properties
49
52
  */
50
- parseTitleDescriptionTechnology(inlineProps: {
51
- title?: string | undefined;
52
- description?: string | undefined;
53
- technology?: string | undefined;
54
- }, bodyProps: {
53
+ parseBaseProps(props: {
55
54
  title?: ast.MarkdownOrString | undefined;
55
+ summary?: ast.MarkdownOrString | undefined;
56
56
  description?: ast.MarkdownOrString | undefined;
57
57
  technology?: ast.MarkdownOrString | undefined;
58
+ }, override?: {
59
+ title?: string | undefined;
60
+ summary?: string | undefined;
61
+ description?: string | undefined;
62
+ technology?: string | undefined;
58
63
  }): {
59
64
  title?: string;
65
+ summary?: c4.MarkdownOrString;
60
66
  description?: c4.MarkdownOrString;
61
67
  technology?: string;
62
68
  };
@@ -1,4 +1,10 @@
1
- import { GlobalFqn, isNonEmptyArray, nonexhaustive, nonNullable } from "@likec4/core";
1
+ import {
2
+ GlobalFqn,
3
+ isNonEmptyArray,
4
+ nonexhaustive,
5
+ nonNullable,
6
+ omitUndefined
7
+ } from "@likec4/core";
2
8
  import {
3
9
  filter,
4
10
  flatMap,
@@ -23,10 +29,11 @@ import {
23
29
  parseMarkdownAsString,
24
30
  toColor
25
31
  } from "../../ast.mjs";
26
- import { logger } from "../../logger.mjs";
32
+ import { serverLogger } from "../../logger.mjs";
27
33
  import { projectIdFrom } from "../../utils/index.mjs";
28
34
  import { readStrictFqn } from "../../utils/elementRef.mjs";
29
35
  import { checksFromDiagnostics } from "../../validation/index.mjs";
36
+ const logger = serverLogger.getChild("BaseParser");
30
37
  export function toSingleLine(str) {
31
38
  if (str === null || str === void 0) {
32
39
  return void 0;
@@ -104,10 +111,9 @@ export class BaseParser {
104
111
  metadataAstNode.props,
105
112
  map((p) => [p.key, removeIndent(p.value)]),
106
113
  map(([key, value]) => [key, value.md || value.txt]),
107
- filter(([_, value]) => isTruthy(value)),
108
- fromEntries()
114
+ filter(([_, value]) => isTruthy(value))
109
115
  );
110
- return isEmpty(data) ? void 0 : data;
116
+ return data.length > 0 ? fromEntries(data) : void 0;
111
117
  }
112
118
  parseMarkdownOrString(markdownOrString) {
113
119
  if (ast.isMarkdownOrString(markdownOrString)) {
@@ -315,17 +321,22 @@ export class BaseParser {
315
321
  return result;
316
322
  }
317
323
  /**
318
- * Parses title, description and technology
319
- * Inline properties (right on node) have higher priority than body properties (inside '{...}')
324
+ * Parse base properties: title, description and technology
325
+ *
326
+ * @param props - body properties (inside '{...}')
327
+ * @param override - optional, inline properties (right on the node)
328
+ * have higher priority and override body properties
320
329
  */
321
- parseTitleDescriptionTechnology(inlineProps, bodyProps) {
322
- const title = removeIndent(inlineProps.title ?? parseMarkdownAsString(bodyProps.title));
323
- const description = inlineProps.description ? { txt: removeIndent(inlineProps.description) } : this.parseMarkdownOrString(bodyProps.description);
324
- const technology = toSingleLine(inlineProps.technology) ?? removeIndent(parseMarkdownAsString(bodyProps.technology));
325
- return {
326
- ...isTruthy(title) && { title },
327
- ...isTruthy(description) && { description },
328
- ...isTruthy(technology) && { technology }
329
- };
330
+ parseBaseProps(props, override) {
331
+ const title = removeIndent(override?.title ?? parseMarkdownAsString(props.title));
332
+ const description = override?.description ? { txt: removeIndent(override.description) } : this.parseMarkdownOrString(props.description);
333
+ const summary = override?.summary ? { txt: removeIndent(override.summary) } : this.parseMarkdownOrString(props.summary);
334
+ const technology = toSingleLine(override?.technology) ?? removeIndent(parseMarkdownAsString(props.technology));
335
+ return omitUndefined({
336
+ title,
337
+ summary,
338
+ description,
339
+ technology
340
+ });
330
341
  }
331
342
  }
@@ -50,16 +50,19 @@ export declare function DeploymentModelParser<TBase extends WithExpressionV2>(B:
50
50
  parseColorLiteral(astNode: ast.ColorLiteral): c4.ColorLiteral | undefined;
51
51
  parseElementStyle(elementProps: Array<ast.ElementProperty> | ast.ElementStyleProperty | undefined): import("../../ast").ParsedElementStyle;
52
52
  parseStyleProps(styleProps: Array<ast.StyleProperty> | undefined): import("../../ast").ParsedElementStyle;
53
- parseTitleDescriptionTechnology(inlineProps: {
54
- title?: string | undefined;
55
- description?: string | undefined;
56
- technology?: string | undefined;
57
- }, bodyProps: {
53
+ parseBaseProps(props: {
58
54
  title?: ast.MarkdownOrString | undefined;
55
+ summary?: ast.MarkdownOrString | undefined;
59
56
  description?: ast.MarkdownOrString | undefined;
60
57
  technology?: ast.MarkdownOrString | undefined;
58
+ }, override?: {
59
+ title?: string | undefined;
60
+ summary?: string | undefined;
61
+ description?: string | undefined;
62
+ technology?: string | undefined;
61
63
  }): {
62
64
  title?: string;
65
+ summary?: c4.MarkdownOrString;
63
66
  description?: c4.MarkdownOrString;
64
67
  technology?: string;
65
68
  };