@eventcatalog/core 4.10.13 → 4.10.14

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 (160) hide show
  1. package/dist/analytics/analytics.cjs +1 -1
  2. package/dist/analytics/analytics.js +2 -2
  3. package/dist/analytics/log-build.cjs +1 -1
  4. package/dist/analytics/log-build.js +3 -3
  5. package/dist/{chunk-SSSN5FXC.js → chunk-HERAHLM2.js} +1 -1
  6. package/dist/{chunk-IIECZFXN.js → chunk-LITOQH56.js} +1 -1
  7. package/dist/{chunk-34RMFKFB.js → chunk-LUW6RDA7.js} +1 -1
  8. package/dist/{chunk-JHUICVBT.js → chunk-ONDFEA5R.js} +1 -1
  9. package/dist/{chunk-PADMH2RJ.js → chunk-V2SKOQYF.js} +1 -1
  10. package/dist/constants.cjs +1 -1
  11. package/dist/constants.js +1 -1
  12. package/dist/docs/api/02-config.md +55 -1
  13. package/dist/docs/development/authentication/providers/03-setting-up-github.md +29 -0
  14. package/dist/docs/development/bring-your-own-documentation/custom-pages/02-adding-custom-docs.md +2 -2
  15. package/dist/docs/development/bring-your-own-documentation/custom-pages/03-components.md +17 -0
  16. package/dist/docs/development/components/07-resource-references.md +7 -1
  17. package/dist/docs/development/components/components/05-architecture-graph.md +65 -0
  18. package/dist/docs/development/components/components/{05-attachments.md → 06-attachments.md} +1 -1
  19. package/dist/docs/development/components/components/{06-channel-information.md → 07-channel-information.md} +1 -1
  20. package/dist/docs/development/components/components/{07-custom-properties.md → 08-custom-properties.md} +1 -1
  21. package/dist/docs/development/components/components/{08-design.md → 09-design.md} +1 -1
  22. package/dist/docs/development/components/components/{09-entitymap.md → 10-entitymap.md} +1 -1
  23. package/dist/docs/development/components/components/{10-flow.md → 11-flow.md} +1 -1
  24. package/dist/docs/development/components/components/{11-link.md → 12-link.md} +1 -1
  25. package/dist/docs/development/components/components/{12-mermaid-file-loader.md → 13-mermaid-file-loader.md} +1 -1
  26. package/dist/docs/development/components/components/{13-message-table.md → 14-message-table.md} +1 -1
  27. package/dist/docs/development/components/components/{14-nodegraph.md → 15-nodegraph.md} +1 -1
  28. package/dist/docs/development/components/components/{15-openapi.md → 16-openapi.md} +1 -1
  29. package/dist/docs/development/components/components/{16-prompt.md → 17-prompt.md} +1 -1
  30. package/dist/docs/development/components/components/{17-remote-schema.md → 18-remote-schema.md} +1 -1
  31. package/dist/docs/development/components/components/{18-resource-group-table.md → 19-resource-group-table.md} +1 -1
  32. package/dist/docs/development/components/components/{19-resource-link.md → 20-resource-link.md} +1 -1
  33. package/dist/docs/development/components/components/{20-schema.md → 21-schema.md} +1 -1
  34. package/dist/docs/development/components/components/{21-schema-viewer.md → 22-schema-viewer.md} +1 -1
  35. package/dist/docs/development/components/components/{22-steps.md → 23-steps.md} +1 -1
  36. package/dist/docs/development/components/components/{23-tabs.md → 24-tabs.md} +1 -1
  37. package/dist/docs/development/components/components/{24-tiles.md → 25-tiles.md} +1 -1
  38. package/dist/docs/development/components/components/{25-visibility.md → 26-visibility.md} +1 -1
  39. package/dist/docs/development/customization/04-documentation-sidebar.md +3 -3
  40. package/dist/docs/development/customization/05-resource-sidebar.md +235 -0
  41. package/dist/docs/development/customization/09-embed-eventcatalog.md +179 -0
  42. package/dist/docs/development/customization/_category_.json +1 -1
  43. package/dist/docs/development/deployment/build-and-deploy.md +4 -0
  44. package/dist/docs/development/deployment/hosting-options.md +1 -1
  45. package/dist/docs/development/deployment/link-validation.md +105 -0
  46. package/dist/docs/development/developer-tools/eventcatalog-linter/00-overview.md +76 -0
  47. package/dist/docs/development/developer-tools/eventcatalog-linter/01-setup.md +144 -0
  48. package/dist/docs/development/developer-tools/eventcatalog-linter/_category_.json +10 -0
  49. package/dist/docs/development/developer-tools/eventcatalog-linter/how-to/01-configure-rules.md +130 -0
  50. package/dist/docs/development/developer-tools/eventcatalog-linter/how-to/02-run-in-ci.md +93 -0
  51. package/dist/docs/development/developer-tools/eventcatalog-linter/how-to/03-use-custom-frontmatter.md +81 -0
  52. package/dist/docs/development/developer-tools/eventcatalog-linter/how-to/04-reference-external-catalogs.md +51 -0
  53. package/dist/docs/development/developer-tools/eventcatalog-linter/how-to/05-fix-common-problems.md +120 -0
  54. package/dist/docs/development/developer-tools/eventcatalog-linter/how-to/_category_.json +12 -0
  55. package/dist/docs/development/developer-tools/eventcatalog-linter/reference/01-cli.md +109 -0
  56. package/dist/docs/development/developer-tools/eventcatalog-linter/reference/02-configuration.md +120 -0
  57. package/dist/docs/development/developer-tools/eventcatalog-linter/reference/03-rules.md +287 -0
  58. package/dist/docs/development/developer-tools/eventcatalog-linter/reference/04-versions.md +77 -0
  59. package/dist/docs/development/developer-tools/eventcatalog-linter/reference/05-supported-resources.md +75 -0
  60. package/dist/docs/development/developer-tools/eventcatalog-linter/reference/_category_.json +12 -0
  61. package/dist/docs/development/guides/97-architecture-graph.md +78 -0
  62. package/dist/docs/development/guides/domains/02-create-domain.md +1 -1
  63. package/dist/docs/development/guides/domains/03-ownership-and-language/02-adding-ubiquitous-language.md +29 -0
  64. package/dist/docs/development/guides/domains/09-reference.md +10 -0
  65. package/dist/docs/development/guides/resources/messages/04-message-channels/02-adding-channels.md +2 -2
  66. package/dist/docs/development/guides/resources/messages/04-message-channels/04-adding-messages-to-services.md +8 -0
  67. package/dist/docs/development/guides/resources/schemas/03-add-specifications-to-services/01-add-openapi-specifications.md +2 -2
  68. package/dist/docs/development/guides/resources/schemas/03-add-specifications-to-services/02-add-asyncapi-specifications.md +3 -3
  69. package/dist/docs/development/guides/systems/05-system-context-maps.md +2 -0
  70. package/dist/docs/development/license-keys/license-validation.md +7 -3
  71. package/dist/docs/development/license-keys/overview.md +7 -3
  72. package/dist/docs/development/upgrading/upgrading.md +3 -3
  73. package/dist/docs/development/upgrading/v2.md +3 -3
  74. package/dist/docs/federation/00-overview.md +158 -0
  75. package/dist/docs/federation/01-first-federation.md +199 -0
  76. package/dist/docs/federation/_category_.json +12 -0
  77. package/dist/docs/federation/explanation/_category_.json +12 -0
  78. package/dist/docs/federation/explanation/how-it-works.md +129 -0
  79. package/dist/docs/federation/explanation/lockfile-and-cache.md +134 -0
  80. package/dist/docs/federation/explanation/mvp-status-and-feedback.md +86 -0
  81. package/dist/docs/federation/explanation/ownership-and-references.md +134 -0
  82. package/dist/docs/federation/how-to/_category_.json +12 -0
  83. package/dist/docs/federation/how-to/configure-github-sources.md +156 -0
  84. package/dist/docs/federation/how-to/configure-validation-rules.md +127 -0
  85. package/dist/docs/federation/how-to/run-in-ci.md +138 -0
  86. package/dist/docs/federation/how-to/share-assets-and-components.md +125 -0
  87. package/dist/docs/federation/how-to/use-local-sources.md +138 -0
  88. package/dist/docs/{plugins/eventcatalog-federation → federation/legacy-federation}/00-introduction.md +11 -2
  89. package/dist/docs/{plugins/eventcatalog-federation → federation/legacy-federation}/01-installation.md +11 -3
  90. package/dist/docs/{plugins/eventcatalog-federation → federation/legacy-federation}/02-plugin-configuration.md +11 -2
  91. package/dist/docs/{plugins/eventcatalog-federation → federation/legacy-federation}/03-examples.md +11 -1
  92. package/dist/docs/{plugins/eventcatalog-federation → federation/legacy-federation}/04-configuration.md +11 -1
  93. package/dist/docs/{plugins/eventcatalog-federation → federation/legacy-federation}/05-setup-team-catalog.md +11 -2
  94. package/dist/docs/federation/legacy-federation/_category_.json +12 -0
  95. package/dist/docs/federation/reference/_category_.json +12 -0
  96. package/dist/docs/federation/reference/cli.md +122 -0
  97. package/dist/docs/federation/reference/configuration.md +192 -0
  98. package/dist/docs/federation/reference/diagnostic-rules.md +173 -0
  99. package/dist/docs/federation/reference/generated-output.md +118 -0
  100. package/dist/docs/federation/reference/supported-content.md +86 -0
  101. package/dist/docs/federation/reference/troubleshooting.md +208 -0
  102. package/dist/docs/plugins/01-intro.md +3 -3
  103. package/dist/docs/plugins/03-all-plugins.md +2 -2
  104. package/dist/docs/plugins/asyncapi/00-intro.md +4 -4
  105. package/dist/docs/plugins/asyncapi/02-plugin-configuration.md +4 -4
  106. package/dist/docs/plugins/backstage/00-overview.md +53 -0
  107. package/dist/docs/plugins/backstage/01-get-started.md +95 -0
  108. package/dist/docs/plugins/backstage/02-embed-entity-tabs.md +109 -0
  109. package/dist/docs/plugins/backstage/03-add-overview-cards.md +79 -0
  110. package/dist/docs/plugins/backstage/04-control-theme-and-size.md +54 -0
  111. package/dist/docs/plugins/backstage/05-migrate-to-annotations.md +49 -0
  112. package/dist/docs/plugins/backstage/06-configuration.md +85 -0
  113. package/dist/docs/plugins/backstage/07-components.md +129 -0
  114. package/dist/docs/plugins/backstage/08-how-embeds-work.md +52 -0
  115. package/dist/docs/plugins/backstage/_category_.json +4 -3
  116. package/dist/docs/plugins/eventbridge/00-intro.md +5 -5
  117. package/dist/docs/plugins/eventbridge/03-api.md +3 -3
  118. package/dist/docs/plugins/graphql/00-intro.md +2 -2
  119. package/dist/docs/plugins/graphql/02-plugin-configuration.md +2 -2
  120. package/dist/docs/plugins/hookdeck/01-intro.md +1 -1
  121. package/dist/docs/plugins/openapi/00-intro.md +1 -1
  122. package/dist/eventcatalog.cjs +1 -1
  123. package/dist/eventcatalog.js +5 -5
  124. package/dist/generate.cjs +1 -1
  125. package/dist/generate.js +3 -3
  126. package/dist/utils/cli-logger.cjs +1 -1
  127. package/dist/utils/cli-logger.js +2 -2
  128. package/eventcatalog/src/components/SchemaExplorer/AvroSchemaViewer.tsx +21 -19
  129. package/eventcatalog/src/components/SchemaExplorer/JSONSchemaViewer.tsx +79 -77
  130. package/eventcatalog/src/components/SchemaExplorer/ProtobufSchemaViewer.test.tsx +91 -0
  131. package/eventcatalog/src/components/SchemaExplorer/ProtobufSchemaViewer.tsx +115 -33
  132. package/eventcatalog/src/components/SchemaExplorer/SchemaViewerHover.test.tsx +33 -0
  133. package/eventcatalog/src/components/SchemaExplorer/protobuf-validation.test.ts +84 -0
  134. package/eventcatalog/src/components/SchemaExplorer/protobuf-validation.ts +149 -0
  135. package/eventcatalog/src/utils/protobuf-schema.ts +211 -16
  136. package/package.json +3 -3
  137. package/dist/docs/cli/channels.md +0 -180
  138. package/dist/docs/cli/commands.md +0 -183
  139. package/dist/docs/cli/custom-docs.md +0 -78
  140. package/dist/docs/cli/data-products.md +0 -177
  141. package/dist/docs/cli/data-stores.md +0 -166
  142. package/dist/docs/cli/diagrams.md +0 -147
  143. package/dist/docs/cli/domains.md +0 -280
  144. package/dist/docs/cli/entities.md +0 -138
  145. package/dist/docs/cli/events.md +0 -186
  146. package/dist/docs/cli/export.md +0 -27
  147. package/dist/docs/cli/governance.md +0 -24
  148. package/dist/docs/cli/messages.md +0 -69
  149. package/dist/docs/cli/queries.md +0 -183
  150. package/dist/docs/cli/services.md +0 -266
  151. package/dist/docs/cli/snapshots.md +0 -44
  152. package/dist/docs/cli/teams.md +0 -75
  153. package/dist/docs/cli/users.md +0 -75
  154. package/dist/docs/cli/utilities.md +0 -43
  155. package/dist/docs/development/developer-tools/eventcatalog-linter.md +0 -732
  156. package/dist/docs/plugins/backstage/00-intro.md +0 -67
  157. package/dist/docs/plugins/backstage/01-installation.md +0 -242
  158. package/dist/docs/plugins/backstage/02-api.md +0 -51
  159. package/dist/docs/plugins/backstage/03-examples.md +0 -12
  160. package/dist/docs/plugins/eventcatalog-federation/_category_.json +0 -11
@@ -17,6 +17,14 @@ export interface ProtobufField {
17
17
  map?: { keyType: string; valueType: string };
18
18
  oneof?: string;
19
19
  doc?: string;
20
+ options?: ProtobufOption[];
21
+ }
22
+
23
+ export type ProtobufOptionValue = string | number | boolean | ProtobufOptionValue[] | { [key: string]: ProtobufOptionValue };
24
+
25
+ export interface ProtobufOption {
26
+ name: string;
27
+ value: ProtobufOptionValue;
20
28
  }
21
29
 
22
30
  export interface ProtobufEnumValue {
@@ -60,6 +68,81 @@ const isIdentifierChar = (char: string) => /[A-Za-z0-9_.]/.test(char);
60
68
  const isNumberStart = (char: string) => /[0-9-]/.test(char);
61
69
  const isNumberChar = (char: string) => /[0-9a-fA-FxX.+-]/.test(char);
62
70
 
71
+ const UTF8_ENCODER = new TextEncoder();
72
+ const UTF8_DECODER = new TextDecoder('utf-8', { fatal: true });
73
+
74
+ const SIMPLE_STRING_ESCAPES: Record<string, number> = {
75
+ a: 0x07,
76
+ b: 0x08,
77
+ f: 0x0c,
78
+ n: 0x0a,
79
+ r: 0x0d,
80
+ t: 0x09,
81
+ v: 0x0b,
82
+ '?': 0x3f,
83
+ '\\': 0x5c,
84
+ "'": 0x27,
85
+ '"': 0x22,
86
+ };
87
+
88
+ function decodeStringEscape(content: string, start: number, line: number): { bytes: number[]; nextIndex: number } {
89
+ const escapeType = content[start + 1];
90
+ if (!escapeType) throw new Error(`Unterminated string escape at line ${line}`);
91
+
92
+ if (escapeType in SIMPLE_STRING_ESCAPES) {
93
+ return { bytes: [SIMPLE_STRING_ESCAPES[escapeType]], nextIndex: start + 2 };
94
+ }
95
+
96
+ if (escapeType === 'x' || escapeType === 'X') {
97
+ const digits = content.slice(start + 2).match(/^[0-9a-fA-F]{1,2}/)?.[0];
98
+ if (!digits) throw new Error(`Invalid hexadecimal string escape at line ${line}`);
99
+ return { bytes: [Number.parseInt(digits, 16)], nextIndex: start + 2 + digits.length };
100
+ }
101
+
102
+ if (/[0-7]/.test(escapeType)) {
103
+ const digits = content.slice(start + 1).match(/^[0-7]{1,3}/)![0];
104
+ const byte = Number.parseInt(digits, 8);
105
+ if (byte > 0xff) throw new Error(`Octal string escape is out of byte range at line ${line}`);
106
+ return { bytes: [byte], nextIndex: start + 1 + digits.length };
107
+ }
108
+
109
+ if (escapeType === 'u' || escapeType === 'U') {
110
+ const digitCount = escapeType === 'u' ? 4 : 8;
111
+ const digits = content.slice(start + 2, start + 2 + digitCount);
112
+ if (digits.length !== digitCount || !/^[0-9a-fA-F]+$/.test(digits)) {
113
+ throw new Error(`Invalid Unicode string escape at line ${line}`);
114
+ }
115
+
116
+ const codePoint = Number.parseInt(digits, 16);
117
+ if (codePoint > 0x10ffff || (codePoint >= 0xd800 && codePoint <= 0xdfff)) {
118
+ throw new Error(`Unicode string escape is out of range at line ${line}`);
119
+ }
120
+ return { bytes: [...UTF8_ENCODER.encode(String.fromCodePoint(codePoint))], nextIndex: start + 2 + digitCount };
121
+ }
122
+
123
+ throw new Error(`Invalid string escape "\\${escapeType}" at line ${line}`);
124
+ }
125
+
126
+ function parseIntegerOptionValue(value: string): number | string | undefined {
127
+ const sign = value.startsWith('-') ? -1n : 1n;
128
+ const unsignedValue = value.startsWith('-') || value.startsWith('+') ? value.slice(1) : value;
129
+ let magnitude: bigint;
130
+
131
+ if (/^0[xX][0-9a-fA-F]+$/.test(unsignedValue)) {
132
+ magnitude = BigInt(unsignedValue);
133
+ } else if (/^0[0-7]*$/.test(unsignedValue)) {
134
+ magnitude = BigInt(`0o${unsignedValue.slice(1) || '0'}`);
135
+ } else if (/^[1-9][0-9]*$/.test(unsignedValue)) {
136
+ magnitude = BigInt(unsignedValue);
137
+ } else {
138
+ return undefined;
139
+ }
140
+
141
+ const parsedValue = sign * magnitude;
142
+ if (parsedValue < BigInt(Number.MIN_SAFE_INTEGER) || parsedValue > BigInt(Number.MAX_SAFE_INTEGER)) return value;
143
+ return Number(parsedValue);
144
+ }
145
+
63
146
  function tokenize(content: string): { tokens: Token[]; trailingComments: Map<number, string> } {
64
147
  const tokens: Token[] = [];
65
148
  const trailingComments = new Map<number, string>();
@@ -128,18 +211,31 @@ function tokenize(content: string): { tokens: Token[]; trailingComments: Map<num
128
211
  // String literal
129
212
  if (char === '"' || char === "'") {
130
213
  const quote = char;
131
- let value = '';
214
+ const bytes: number[] = [];
132
215
  i++;
216
+ const rawValueStart = i;
217
+ let plainTextStart = i;
133
218
  while (i < content.length && content[i] !== quote) {
134
219
  if (content[i] === '\\') {
135
- value += content[i + 1];
136
- i += 2;
220
+ bytes.push(...UTF8_ENCODER.encode(content.slice(plainTextStart, i)));
221
+ const decodedEscape = decodeStringEscape(content, i, line);
222
+ bytes.push(...decodedEscape.bytes);
223
+ i = decodedEscape.nextIndex;
224
+ plainTextStart = i;
137
225
  continue;
138
226
  }
139
227
  if (content[i] === '\n') line++;
140
- value += content[i];
141
228
  i++;
142
229
  }
230
+ bytes.push(...UTF8_ENCODER.encode(content.slice(plainTextStart, i)));
231
+ if (i >= content.length) throw new Error(`Unterminated string literal at line ${line}`);
232
+ const rawValue = content.slice(rawValueStart, i);
233
+ let value: string;
234
+ try {
235
+ value = UTF8_DECODER.decode(Uint8Array.from(bytes));
236
+ } catch {
237
+ value = rawValue;
238
+ }
143
239
  i++;
144
240
  pushToken({ value, line, isString: true });
145
241
  continue;
@@ -164,6 +260,18 @@ function tokenize(content: string): { tokens: Token[]; trailingComments: Map<num
164
260
  continue;
165
261
  }
166
262
 
263
+ // Signed symbolic floating-point values used by protobuf options (for example +inf).
264
+ if ((char === '+' || char === '-') && isIdentifierStart(content[i + 1] || '')) {
265
+ let value = char;
266
+ i++;
267
+ while (i < content.length && isIdentifierChar(content[i])) {
268
+ value += content[i];
269
+ i++;
270
+ }
271
+ pushToken({ value, line });
272
+ continue;
273
+ }
274
+
167
275
  if (isNumberStart(char)) {
168
276
  let value = content[i];
169
277
  i++;
@@ -232,16 +340,101 @@ class ProtobufParser {
232
340
  }
233
341
  }
234
342
 
235
- // Skip field options like [deprecated = true, (custom) = "value"]
236
- private skipFieldOptions() {
237
- if (this.peek()?.value !== '[') return;
238
- let depth = 0;
239
- while (this.pos < this.tokens.length) {
240
- const token = this.next();
241
- if (token.value === '[') depth++;
242
- if (token.value === ']') depth--;
243
- if (depth === 0) return;
343
+ private parseAggregateOptionKey(): string {
344
+ if (this.peek()?.value !== '[') return this.next().value;
345
+
346
+ this.next();
347
+ const nameParts: string[] = [];
348
+ while (this.peek() && this.peek()!.value !== ']') nameParts.push(this.next().value);
349
+ this.expect(']');
350
+ return `[${nameParts.join('')}]`;
351
+ }
352
+
353
+ private parseOptionValue(): ProtobufOptionValue {
354
+ const token = this.peek();
355
+ if (!token) throw new Error('Unexpected end of protobuf option');
356
+
357
+ if (token.value === '{' || token.value === '<') {
358
+ const openingToken = this.next().value;
359
+ const closingToken = openingToken === '{' ? '}' : '>';
360
+ const value: { [key: string]: ProtobufOptionValue } = {};
361
+
362
+ while (this.peek() && this.peek()!.value !== closingToken) {
363
+ if (this.peek()!.value === ',' || this.peek()!.value === ';') {
364
+ this.next();
365
+ continue;
366
+ }
367
+
368
+ const key = this.parseAggregateOptionKey();
369
+ if (this.peek()?.value === ':') this.next();
370
+ const entryValue = this.parseOptionValue();
371
+ const existingValue = value[key];
372
+ value[key] =
373
+ existingValue === undefined
374
+ ? entryValue
375
+ : Array.isArray(existingValue)
376
+ ? [...existingValue, entryValue]
377
+ : [existingValue, entryValue];
378
+ }
379
+
380
+ this.expect(closingToken);
381
+ return value;
244
382
  }
383
+
384
+ if (token.value === '[') {
385
+ this.next();
386
+ const values: ProtobufOptionValue[] = [];
387
+
388
+ while (this.peek() && this.peek()!.value !== ']') {
389
+ if (this.peek()!.value === ',' || this.peek()!.value === ';') {
390
+ this.next();
391
+ continue;
392
+ }
393
+ values.push(this.parseOptionValue());
394
+ }
395
+
396
+ this.expect(']');
397
+ return values;
398
+ }
399
+
400
+ const valueToken = this.next();
401
+ if (valueToken.isString) {
402
+ let value = valueToken.value;
403
+ while (this.peek()?.isString) value += this.next().value;
404
+ return value;
405
+ }
406
+ if (valueToken.value === 'true') return true;
407
+ if (valueToken.value === 'false') return false;
408
+
409
+ const integerValue = parseIntegerOptionValue(valueToken.value);
410
+ if (integerValue !== undefined) return integerValue;
411
+
412
+ const numericValue = Number(valueToken.value);
413
+ if (Number.isNaN(numericValue)) return valueToken.value;
414
+ if (Number.isInteger(numericValue) && !Number.isSafeInteger(numericValue)) return valueToken.value;
415
+ return numericValue;
416
+ }
417
+
418
+ private parseFieldOptions(): ProtobufOption[] {
419
+ if (this.peek()?.value !== '[') return [];
420
+
421
+ this.next();
422
+ const options: ProtobufOption[] = [];
423
+
424
+ while (this.peek() && this.peek()!.value !== ']') {
425
+ if (this.peek()!.value === ',') {
426
+ this.next();
427
+ continue;
428
+ }
429
+
430
+ const nameParts: string[] = [];
431
+ while (this.peek() && this.peek()!.value !== '=') nameParts.push(this.next().value);
432
+ this.expect('=');
433
+ options.push({ name: nameParts.join(''), value: this.parseOptionValue() });
434
+ }
435
+
436
+ this.expect(']');
437
+ return options;
245
438
  }
246
439
 
247
440
  private getTrailingDoc(line: number): string | undefined {
@@ -384,7 +577,7 @@ class ProtobufParser {
384
577
  const name = this.next().value;
385
578
  this.expect('=');
386
579
  const numberToken = this.next();
387
- this.skipFieldOptions();
580
+ const options = this.parseFieldOptions();
388
581
  const terminator = this.expect(';');
389
582
 
390
583
  const parsedNumber = Number.parseInt(numberToken.value, 10);
@@ -396,6 +589,7 @@ class ProtobufParser {
396
589
  label,
397
590
  oneof,
398
591
  doc: firstToken.doc || typeToken.doc || this.getTrailingDoc(terminator.line),
592
+ ...(options.length > 0 ? { options } : {}),
399
593
  };
400
594
  }
401
595
 
@@ -409,7 +603,7 @@ class ProtobufParser {
409
603
  const name = this.next().value;
410
604
  this.expect('=');
411
605
  const numberToken = this.next();
412
- this.skipFieldOptions();
606
+ const options = this.parseFieldOptions();
413
607
  const terminator = this.expect(';');
414
608
 
415
609
  const parsedNumber = Number.parseInt(numberToken.value, 10);
@@ -420,6 +614,7 @@ class ProtobufParser {
420
614
  map: { keyType, valueType },
421
615
  number: Number.isNaN(parsedNumber) ? undefined : parsedNumber,
422
616
  doc: keyword.doc || this.getTrailingDoc(terminator.line),
617
+ ...(options.length > 0 ? { options } : {}),
423
618
  };
424
619
  }
425
620
 
@@ -452,7 +647,7 @@ class ProtobufParser {
452
647
  const valueToken = this.next();
453
648
  this.expect('=');
454
649
  const numberToken = this.next();
455
- this.skipFieldOptions();
650
+ this.parseFieldOptions();
456
651
  const terminator = this.expect(';');
457
652
 
458
653
  const parsedNumber = Number.parseInt(numberToken.value, 10);
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "license": "SEE LICENSE IN LICENSE",
9
9
  "type": "module",
10
- "version": "4.10.13",
10
+ "version": "4.10.14",
11
11
  "publishConfig": {
12
12
  "access": "public"
13
13
  },
@@ -119,9 +119,9 @@
119
119
  "update-notifier": "^7.3.1",
120
120
  "uuid": "^11.1.1",
121
121
  "zod": "^4.3.6",
122
- "@eventcatalog/linter": "1.1.19",
122
+ "@eventcatalog/sdk": "2.29.0",
123
123
  "@eventcatalog/visualiser": "^4.1.4",
124
- "@eventcatalog/sdk": "2.29.0"
124
+ "@eventcatalog/linter": "1.1.19"
125
125
  },
126
126
  "devDependencies": {
127
127
  "@astrojs/check": "^0.9.10",
@@ -1,180 +0,0 @@
1
- ---
2
- id: cli-channels
3
- title: Channels
4
- sidebar_label: Channels
5
- sidebar_position: 7
6
- ---
7
-
8
- # Channels CLI Commands
9
-
10
- Manage channels in your EventCatalog from the command line.
11
-
12
- ## getChannel
13
-
14
- Returns a channel from EventCatalog by its ID
15
-
16
- **Arguments:**
17
- | Name | Type | Required | Description |
18
- |------|------|----------|-------------|
19
- | id | string | Yes | The ID of the channel to retrieve |
20
- | version | string | No | Specific version to retrieve |
21
-
22
- **Examples:**
23
-
24
- ```bash
25
- # Get the latest channel
26
- npx @eventcatalog/cli getChannel "orders.events"
27
-
28
- # Get a specific version
29
- npx @eventcatalog/cli getChannel "orders.events" "1.0.0"
30
- ```
31
-
32
- ---
33
-
34
- ## getChannels
35
-
36
- Returns all channels from EventCatalog
37
-
38
- **Arguments:**
39
- | Name | Type | Required | Description |
40
- |------|------|----------|-------------|
41
- | options | json | No | Options: &#123;latestOnly?&#125; |
42
-
43
- **Examples:**
44
-
45
- ```bash
46
- # Get all channels
47
- npx @eventcatalog/cli getChannels
48
- ```
49
-
50
- ---
51
-
52
- ## writeChannel
53
-
54
- Writes a channel to EventCatalog
55
-
56
- **Arguments:**
57
- | Name | Type | Required | Description |
58
- |------|------|----------|-------------|
59
- | channel | json | Yes | Channel object with id, name, version, and markdown |
60
- | options | json | No | Options: &#123;path?, override?&#125; |
61
-
62
-
63
-
64
- ---
65
-
66
- ## rmChannel
67
-
68
- Removes a channel by its path
69
-
70
- **Arguments:**
71
- | Name | Type | Required | Description |
72
- |------|------|----------|-------------|
73
- | path | string | Yes | Path to the channel |
74
-
75
- **Examples:**
76
-
77
- ```bash
78
- # Remove a channel
79
- npx @eventcatalog/cli rmChannel "/orders.events"
80
- ```
81
-
82
- ---
83
-
84
- ## rmChannelById
85
-
86
- Removes a channel by its ID
87
-
88
- **Arguments:**
89
- | Name | Type | Required | Description |
90
- |------|------|----------|-------------|
91
- | id | string | Yes | The ID of the channel to remove |
92
- | version | string | No | Specific version to remove |
93
-
94
- **Examples:**
95
-
96
- ```bash
97
- # Remove a channel
98
- npx @eventcatalog/cli rmChannelById "orders.events"
99
- ```
100
-
101
- ---
102
-
103
- ## versionChannel
104
-
105
- Moves the current channel to a versioned directory
106
-
107
- **Arguments:**
108
- | Name | Type | Required | Description |
109
- |------|------|----------|-------------|
110
- | id | string | Yes | The ID of the channel to version |
111
-
112
- **Examples:**
113
-
114
- ```bash
115
- # Version a channel
116
- npx @eventcatalog/cli versionChannel "orders.events"
117
- ```
118
-
119
- ---
120
-
121
- ## addEventToChannel
122
-
123
- Adds an event to a channel
124
-
125
- **Arguments:**
126
- | Name | Type | Required | Description |
127
- |------|------|----------|-------------|
128
- | channelId | string | Yes | The ID of the channel |
129
- | event | json | Yes | Event reference: &#123;id, version, parameters?&#125; |
130
-
131
-
132
-
133
- ---
134
-
135
- ## addCommandToChannel
136
-
137
- Adds a command to a channel
138
-
139
- **Arguments:**
140
- | Name | Type | Required | Description |
141
- |------|------|----------|-------------|
142
- | channelId | string | Yes | The ID of the channel |
143
- | command | json | Yes | Command reference: &#123;id, version, parameters?&#125; |
144
-
145
-
146
-
147
- ---
148
-
149
- ## addQueryToChannel
150
-
151
- Adds a query to a channel
152
-
153
- **Arguments:**
154
- | Name | Type | Required | Description |
155
- |------|------|----------|-------------|
156
- | channelId | string | Yes | The ID of the channel |
157
- | query | json | Yes | Query reference: &#123;id, version, parameters?&#125; |
158
-
159
-
160
-
161
- ---
162
-
163
- ## channelHasVersion
164
-
165
- Checks if a specific version of a channel exists
166
-
167
- **Arguments:**
168
- | Name | Type | Required | Description |
169
- |------|------|----------|-------------|
170
- | id | string | Yes | The ID of the channel |
171
- | version | string | Yes | Version to check |
172
-
173
- **Examples:**
174
-
175
- ```bash
176
- # Check if version exists
177
- npx @eventcatalog/cli channelHasVersion "orders.events" "1.0.0"
178
- ```
179
-
180
- ---
@@ -1,183 +0,0 @@
1
- ---
2
- id: cli-commands
3
- title: Commands
4
- sidebar_label: Commands
5
- sidebar_position: 3
6
- ---
7
-
8
- # Commands CLI Commands
9
-
10
- Manage commands in your EventCatalog from the command line.
11
-
12
- ## getCommand
13
-
14
- Returns a command from EventCatalog by its ID
15
-
16
- **Arguments:**
17
- | Name | Type | Required | Description |
18
- |------|------|----------|-------------|
19
- | id | string | Yes | The ID of the command to retrieve |
20
- | version | string | No | Specific version to retrieve (supports semver) |
21
-
22
- **Examples:**
23
-
24
- ```bash
25
- # Get the latest command
26
- npx @eventcatalog/cli getCommand "CreateOrder"
27
-
28
- # Get a specific version
29
- npx @eventcatalog/cli getCommand "CreateOrder" "1.0.0"
30
- ```
31
-
32
- ---
33
-
34
- ## getCommands
35
-
36
- Returns all commands from EventCatalog
37
-
38
- **Arguments:**
39
- | Name | Type | Required | Description |
40
- |------|------|----------|-------------|
41
- | options | json | No | Options: &#123;latestOnly?, attachSchema?&#125; |
42
-
43
- **Examples:**
44
-
45
- ```bash
46
- # Get all commands
47
- npx @eventcatalog/cli getCommands
48
- ```
49
-
50
- ---
51
-
52
- ## writeCommand
53
-
54
- Writes a command to EventCatalog
55
-
56
- **Arguments:**
57
- | Name | Type | Required | Description |
58
- |------|------|----------|-------------|
59
- | command | json | Yes | Command object with id, name, version, and markdown |
60
- | options | json | No | Options: &#123;path?, override?, versionExistingContent?&#125; |
61
-
62
-
63
-
64
- ---
65
-
66
- ## writeCommandToService
67
-
68
- Writes a command to a specific service
69
-
70
- **Arguments:**
71
- | Name | Type | Required | Description |
72
- |------|------|----------|-------------|
73
- | command | json | Yes | Command object |
74
- | service | json | Yes | Service reference: &#123;id, version?&#125; |
75
- | options | json | No | Options: &#123;path?, format?, override?&#125; |
76
-
77
-
78
-
79
- ---
80
-
81
- ## rmCommand
82
-
83
- Removes a command by its path
84
-
85
- **Arguments:**
86
- | Name | Type | Required | Description |
87
- |------|------|----------|-------------|
88
- | path | string | Yes | Path to the command |
89
-
90
- **Examples:**
91
-
92
- ```bash
93
- # Remove a command
94
- npx @eventcatalog/cli rmCommand "/CreateOrder"
95
- ```
96
-
97
- ---
98
-
99
- ## rmCommandById
100
-
101
- Removes a command by its ID
102
-
103
- **Arguments:**
104
- | Name | Type | Required | Description |
105
- |------|------|----------|-------------|
106
- | id | string | Yes | The ID of the command to remove |
107
- | version | string | No | Specific version to remove |
108
-
109
- **Examples:**
110
-
111
- ```bash
112
- # Remove a command
113
- npx @eventcatalog/cli rmCommandById "CreateOrder"
114
- ```
115
-
116
- ---
117
-
118
- ## versionCommand
119
-
120
- Moves the current command to a versioned directory
121
-
122
- **Arguments:**
123
- | Name | Type | Required | Description |
124
- |------|------|----------|-------------|
125
- | id | string | Yes | The ID of the command to version |
126
-
127
- **Examples:**
128
-
129
- ```bash
130
- # Version a command
131
- npx @eventcatalog/cli versionCommand "CreateOrder"
132
- ```
133
-
134
- ---
135
-
136
- ## addFileToCommand
137
-
138
- Adds a file to a command
139
-
140
- **Arguments:**
141
- | Name | Type | Required | Description |
142
- |------|------|----------|-------------|
143
- | id | string | Yes | The ID of the command |
144
- | file | json | Yes | File object: &#123;content, fileName&#125; |
145
- | version | string | No | Specific version |
146
-
147
-
148
-
149
- ---
150
-
151
- ## addSchemaToCommand
152
-
153
- Adds a schema to a command
154
-
155
- **Arguments:**
156
- | Name | Type | Required | Description |
157
- |------|------|----------|-------------|
158
- | id | string | Yes | The ID of the command |
159
- | schema | json | Yes | Schema object: &#123;schema, fileName&#125; |
160
- | version | string | No | Specific version |
161
-
162
-
163
-
164
- ---
165
-
166
- ## commandHasVersion
167
-
168
- Checks if a specific version of a command exists
169
-
170
- **Arguments:**
171
- | Name | Type | Required | Description |
172
- |------|------|----------|-------------|
173
- | id | string | Yes | The ID of the command |
174
- | version | string | Yes | Version to check |
175
-
176
- **Examples:**
177
-
178
- ```bash
179
- # Check if version exists
180
- npx @eventcatalog/cli commandHasVersion "CreateOrder" "1.0.0"
181
- ```
182
-
183
- ---