@redpanda-data/docs-extensions-and-macros 4.15.7 → 4.15.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redpanda-data/docs-extensions-and-macros",
3
- "version": "4.15.7",
3
+ "version": "4.15.8",
4
4
  "description": "Antora extensions and macros developed for Redpanda documentation.",
5
5
  "keywords": [
6
6
  "antora",
@@ -472,6 +472,28 @@ async function generateRpcnConnectorDocs(options) {
472
472
  if (!Array.isArray(items)) continue;
473
473
  const outRoot = path.join(outputRoot, folder);
474
474
  fs.mkdirSync(outRoot, { recursive: true });
475
+
476
+ // Get current item names
477
+ const currentNames = new Set(items.filter(fn => fn.name).map(fn => fn.name));
478
+
479
+ // Delete partials that no longer exist in the data
480
+ if (fs.existsSync(outRoot)) {
481
+ const existingFiles = fs.readdirSync(outRoot).filter(f => f.endsWith('.adoc'));
482
+ for (const file of existingFiles) {
483
+ const name = file.replace('.adoc', '');
484
+ // Skip hand-authored files (by convention, start with underscore)
485
+ if (name.startsWith('_')) {
486
+ console.log(`Skipping hand-authored file: ${file}`);
487
+ continue;
488
+ }
489
+ if (!currentNames.has(name)) {
490
+ const filePath = path.join(outRoot, file);
491
+ fs.unlinkSync(filePath);
492
+ console.log(`Deleted removed ${folder} partial: ${file}`);
493
+ }
494
+ }
495
+ }
496
+
475
497
  // Use custom or default template
476
498
  const bloblangTemplatePath = templateBloblang || path.resolve(__dirname, './templates/bloblang-function.hbs');
477
499
  const bloblangTemplate = handlebars.compile(fs.readFileSync(bloblangTemplatePath, 'utf8'));
@@ -484,6 +506,71 @@ async function generateRpcnConnectorDocs(options) {
484
506
  partialFiles.push(path.relative(process.cwd(), outPath));
485
507
  }
486
508
  }
509
+
510
+ // Generate overview pages for Bloblang methods and functions
511
+ const guidesRoot = path.join(process.cwd(), 'modules/guides/pages/bloblang');
512
+ fs.mkdirSync(guidesRoot, { recursive: true });
513
+
514
+ // Generate methods.adoc with categorized methods
515
+ if (dataObj['bloblang-methods']) {
516
+ const methodsData = dataObj['bloblang-methods'];
517
+ const categoriesMap = new Map();
518
+
519
+ // Extract categories and their methods
520
+ for (const method of methodsData) {
521
+ if (!method.name || !method.categories || !Array.isArray(method.categories)) continue;
522
+
523
+ for (const cat of method.categories) {
524
+ const categoryName = cat.Category;
525
+ if (!categoryName) continue;
526
+
527
+ if (!categoriesMap.has(categoryName)) {
528
+ categoriesMap.set(categoryName, []);
529
+ }
530
+ categoriesMap.get(categoryName).push(method.name);
531
+ }
532
+ }
533
+
534
+ // Sort categories and prepare data for template
535
+ const categories = Array.from(categoriesMap.entries())
536
+ .map(([name, methods]) => ({
537
+ name,
538
+ methods: methods.sort()
539
+ }))
540
+ .sort((a, b) => {
541
+ // Special ordering: General first, Deprecated last
542
+ if (a.name === 'General') return -1;
543
+ if (b.name === 'General') return 1;
544
+ if (a.name === 'Deprecated') return 1;
545
+ if (b.name === 'Deprecated') return -1;
546
+ return a.name.localeCompare(b.name);
547
+ });
548
+
549
+ const methodsTemplatePath = path.resolve(__dirname, './templates/bloblang-methods-overview.hbs');
550
+ const methodsTemplate = handlebars.compile(fs.readFileSync(methodsTemplatePath, 'utf8'));
551
+ const methodsAdoc = methodsTemplate({ categories });
552
+ const methodsOutPath = path.join(guidesRoot, 'methods.adoc');
553
+ fs.writeFileSync(methodsOutPath, methodsAdoc, 'utf8');
554
+ console.log('Generated methods.adoc overview page');
555
+ partialFiles.push(path.relative(process.cwd(), methodsOutPath));
556
+ }
557
+
558
+ // Generate functions.adoc with all functions
559
+ if (dataObj['bloblang-functions']) {
560
+ const functionsData = dataObj['bloblang-functions'];
561
+ const functionNames = functionsData
562
+ .filter(fn => fn.name)
563
+ .map(fn => fn.name)
564
+ .sort();
565
+
566
+ const functionsTemplatePath = path.resolve(__dirname, './templates/bloblang-functions-overview.hbs');
567
+ const functionsTemplate = handlebars.compile(fs.readFileSync(functionsTemplatePath, 'utf8'));
568
+ const functionsAdoc = functionsTemplate({ functions: functionNames });
569
+ const functionsOutPath = path.join(guidesRoot, 'functions.adoc');
570
+ fs.writeFileSync(functionsOutPath, functionsAdoc, 'utf8');
571
+ console.log('Generated functions.adoc overview page');
572
+ partialFiles.push(path.relative(process.cwd(), functionsOutPath));
573
+ }
487
574
  }
488
575
 
489
576
  // Common/Advanced config snippet YAMLs in modules/components/examples
@@ -1,10 +1,30 @@
1
1
  // Bloblang example formatting helper for Handlebars
2
2
  function bloblangExample(example) {
3
3
  if (typeof example === 'object' && example !== null && example.mapping) {
4
+ let leadIn = '';
4
5
  let codeBlock = '';
6
+
7
+ // Extract summary as lead-in prose (not a comment in code)
5
8
  if (example.summary && example.summary.trim()) {
6
- codeBlock += `# ${example.summary.trim().replace(/\n/g, '\n# ')}\n\n`;
9
+ let summary = example.summary.trim();
10
+
11
+ // Convert Markdown headings to AsciiDoc
12
+ // ##### Heading -> ==== Heading (H5 -> H4 in AsciiDoc)
13
+ summary = summary.replace(/^#####\s+(.+)$/gm, '==== $1');
14
+ // #### Heading -> === Heading (H4 -> H3 in AsciiDoc)
15
+ summary = summary.replace(/^####\s+(.+)$/gm, '=== $1');
16
+ // ### Heading -> == Heading (H3 -> H2 in AsciiDoc)
17
+ summary = summary.replace(/^###\s+(.+)$/gm, '== $1');
18
+
19
+ // Ensure lead-in ends with a colon (replace period/exclamation/question mark if present)
20
+ if (summary.endsWith('.') || summary.endsWith('!') || summary.endsWith('?')) {
21
+ summary = summary.slice(0, -1) + ':';
22
+ } else if (!summary.endsWith(':')) {
23
+ summary += ':';
24
+ }
25
+ leadIn = summary + '\n\n';
7
26
  }
27
+
8
28
  if (typeof example.mapping === 'string') {
9
29
  codeBlock += example.mapping.trim() + '\n';
10
30
  }
@@ -15,7 +35,7 @@ function bloblangExample(example) {
15
35
  }
16
36
  }
17
37
  }
18
- return `[,coffeescript]\n----\n${codeBlock.trim()}\n----\n`;
38
+ return `${leadIn}[,bloblang]\n----\n${codeBlock.trim()}\n----\n`;
19
39
  } else {
20
40
  let exStr = '';
21
41
  if (typeof example === 'string') {
@@ -35,7 +55,7 @@ function bloblangExample(example) {
35
55
  } else {
36
56
  exStr = String(example);
37
57
  }
38
- return `[source,coffeescript]\n----\n${exStr}\n----\n`;
58
+ return `[source,bloblang]\n----\n${exStr}\n----\n`;
39
59
  }
40
60
  }
41
61
 
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Ensures a text string ends with a period (or other terminal punctuation).
3
+ * Used for normalizing Bloblang descriptions.
4
+ *
5
+ * @param {string} text - The text to process
6
+ * @returns {string} Text ending with appropriate punctuation
7
+ */
8
+ function ensurePeriod(text) {
9
+ if (!text || typeof text !== 'string') {
10
+ return text;
11
+ }
12
+
13
+ const trimmed = text.trim();
14
+ if (!trimmed) {
15
+ return text;
16
+ }
17
+
18
+ // Check if already ends with terminal punctuation
19
+ if (trimmed.endsWith('.') || trimmed.endsWith('!') || trimmed.endsWith('?')) {
20
+ return text;
21
+ }
22
+
23
+ // Add period
24
+ return text.trim() + '.';
25
+ }
26
+
27
+ module.exports = ensurePeriod;
@@ -0,0 +1,7 @@
1
+ // Check if any parameters are optional
2
+ function hasOptionalParams(params) {
3
+ if (!Array.isArray(params)) return false;
4
+ return params.some(param => param.is_optional);
5
+ }
6
+
7
+ module.exports = hasOptionalParams;
@@ -17,4 +17,7 @@ module.exports = {
17
17
  commonConfig: require('./commonConfig.js'),
18
18
  advancedConfig: require('./advancedConfig.js'),
19
19
  bloblangExample: require('./bloblangExample.js'),
20
+ hasOptionalParams: require('./hasOptionalParams.js'),
21
+ ensurePeriod: require('./ensurePeriod.js'),
22
+ toSentenceCase: require('./toSentenceCase.js'),
20
23
  };
@@ -0,0 +1,69 @@
1
+ 'use strict'
2
+
3
+ /**
4
+ * Convert a string to sentence case, preserving acronyms and proper nouns
5
+ * @param {string} text - The text to convert
6
+ * @returns {string} The text in sentence case
7
+ */
8
+ function toSentenceCase(text) {
9
+ if (!text) return ''
10
+
11
+ // Map of exact word matches to preserve (case-sensitive)
12
+ const exactPreserve = new Map([
13
+ ['geoip', 'GeoIP'],
14
+ ['GEOIP', 'GeoIP'],
15
+ ['GeoIP', 'GeoIP']
16
+ ])
17
+
18
+ // List of acronyms to preserve (will be uppercased)
19
+ const preserveWords = new Set([
20
+ 'SQL',
21
+ 'JSON',
22
+ 'JWT',
23
+ 'XML',
24
+ 'HTML',
25
+ 'URL',
26
+ 'URI',
27
+ 'HTTP',
28
+ 'HTTPS',
29
+ 'TLS',
30
+ 'SSL',
31
+ 'AWS',
32
+ 'GCP',
33
+ 'API',
34
+ 'ID',
35
+ 'UUID',
36
+ 'CSV'
37
+ ])
38
+
39
+ // Split into words
40
+ const words = text.split(/\s+/)
41
+
42
+ return words.map((word, index) => {
43
+ // Check if word is in exact preserve map first
44
+ if (exactPreserve.has(word) || exactPreserve.has(word.toLowerCase()) || exactPreserve.has(word.toUpperCase())) {
45
+ const key = exactPreserve.has(word) ? word : (exactPreserve.has(word.toLowerCase()) ? word.toLowerCase() : word.toUpperCase())
46
+ return exactPreserve.get(key)
47
+ }
48
+
49
+ // Check if word is in preserve list (case-insensitive check)
50
+ if (preserveWords.has(word.toUpperCase())) {
51
+ return word.toUpperCase()
52
+ }
53
+
54
+ // Check if word contains special characters like &
55
+ if (word === '&') {
56
+ return word
57
+ }
58
+
59
+ // First word: capitalize first letter, lowercase rest
60
+ if (index === 0) {
61
+ return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()
62
+ }
63
+
64
+ // Subsequent words: lowercase
65
+ return word.toLowerCase()
66
+ }).join(' ')
67
+ }
68
+
69
+ module.exports = toSentenceCase
@@ -3,6 +3,118 @@
3
3
  * Outputs a console-parseable format for GitHub Actions
4
4
  */
5
5
 
6
+ /**
7
+ * Render Bloblang changes section for PR summary
8
+ * @param {object} data - Bloblang change data
9
+ * @param {array} data.newMethods - Array of new methods (with .name and optional .version)
10
+ * @param {array} data.newFunctions - Array of new functions (with .name and optional .version)
11
+ * @param {array} data.removedMethods - Array of removed methods
12
+ * @param {array} data.removedFunctions - Array of removed functions
13
+ * @param {array} data.deprecatedMethods - Array of deprecated methods
14
+ * @param {array} data.deprecatedFunctions - Array of deprecated functions
15
+ * @param {boolean} includeVersion - Whether to include version info in output
16
+ * @returns {array} Array of lines to add to the summary
17
+ */
18
+ function renderBloblangChanges(data, includeVersion = false) {
19
+ const lines = [];
20
+ const {
21
+ newMethods = [],
22
+ newFunctions = [],
23
+ removedMethods = [],
24
+ removedFunctions = [],
25
+ deprecatedMethods = [],
26
+ deprecatedFunctions = []
27
+ } = data;
28
+
29
+ const hasChanges = newMethods.length > 0 || newFunctions.length > 0 ||
30
+ removedMethods.length > 0 || removedFunctions.length > 0 ||
31
+ deprecatedMethods.length > 0 || deprecatedFunctions.length > 0;
32
+
33
+ if (!hasChanges) {
34
+ return lines;
35
+ }
36
+
37
+ lines.push('**Update Bloblang Guide Pages:**');
38
+ lines.push('');
39
+
40
+ if (newMethods.length > 0) {
41
+ lines.push(`New methods to add to \`modules/guides/pages/bloblang/methods.adoc\` (${newMethods.length}):`);
42
+ newMethods.forEach(method => {
43
+ const versionInfo = includeVersion && method.version ? ` — introduced in **${method.version}**` : '';
44
+ const name = typeof method === 'string' ? method : method.name;
45
+ lines.push(`- [ ] \`${name}\`${versionInfo}`);
46
+ });
47
+ lines.push('');
48
+ }
49
+
50
+ if (newFunctions.length > 0) {
51
+ lines.push(`New functions to add to \`modules/guides/pages/bloblang/functions.adoc\` (${newFunctions.length}):`);
52
+ newFunctions.forEach(func => {
53
+ const versionInfo = includeVersion && func.version ? ` — introduced in **${func.version}**` : '';
54
+ const name = typeof func === 'string' ? func : func.name;
55
+ lines.push(`- [ ] \`${name}\`${versionInfo}`);
56
+ });
57
+ lines.push('');
58
+ }
59
+
60
+ if (removedMethods.length > 0) {
61
+ lines.push(`Removed methods to delete from \`modules/guides/pages/bloblang/methods.adoc\` (${removedMethods.length}):`);
62
+ removedMethods.forEach(method => {
63
+ const versionInfo = includeVersion && method.version ? ` — removed in **${method.version}**` : '';
64
+ const name = typeof method === 'string' ? method : method.name;
65
+ lines.push(`- [ ] \`${name}\`${versionInfo}`);
66
+ });
67
+ lines.push('');
68
+ }
69
+
70
+ if (removedFunctions.length > 0) {
71
+ lines.push(`Removed functions to delete from \`modules/guides/pages/bloblang/functions.adoc\` (${removedFunctions.length}):`);
72
+ removedFunctions.forEach(func => {
73
+ const versionInfo = includeVersion && func.version ? ` — removed in **${func.version}**` : '';
74
+ const name = typeof func === 'string' ? func : func.name;
75
+ lines.push(`- [ ] \`${name}\`${versionInfo}`);
76
+ });
77
+ lines.push('');
78
+ }
79
+
80
+ if (deprecatedMethods.length > 0) {
81
+ lines.push(`Deprecated methods - add deprecation notice to \`modules/guides/pages/bloblang/methods.adoc\` (${deprecatedMethods.length}):`);
82
+ deprecatedMethods.forEach(method => {
83
+ const versionInfo = includeVersion && method.version ? ` — deprecated in **${method.version}**` : '';
84
+ const name = typeof method === 'string' ? method : method.name;
85
+ lines.push(`- [ ] \`${name}\`${versionInfo}`);
86
+ });
87
+ lines.push('');
88
+ }
89
+
90
+ if (deprecatedFunctions.length > 0) {
91
+ lines.push(`Deprecated functions - add deprecation notice to \`modules/guides/pages/bloblang/functions.adoc\` (${deprecatedFunctions.length}):`);
92
+ deprecatedFunctions.forEach(func => {
93
+ const versionInfo = includeVersion && func.version ? ` — deprecated in **${func.version}**` : '';
94
+ const name = typeof func === 'string' ? func : func.name;
95
+ lines.push(`- [ ] \`${name}\`${versionInfo}`);
96
+ });
97
+ lines.push('');
98
+ }
99
+
100
+ lines.push('**How to add includes:**');
101
+ lines.push('');
102
+ lines.push('For methods, find the appropriate category section in `methods.adoc` and add:');
103
+ lines.push('```asciidoc');
104
+ lines.push('include::redpanda-connect:partial$bloblang-methods/method_name.adoc[leveloffset=+2]');
105
+ lines.push('```');
106
+ lines.push('');
107
+ lines.push('For functions, add to the Functions section in `functions.adoc`:');
108
+ lines.push('```asciidoc');
109
+ lines.push('include::redpanda-connect:partial$bloblang-functions/function_name.adoc[leveloffset=+2]');
110
+ lines.push('```');
111
+ lines.push('');
112
+ lines.push('**Note:** Partials are auto-generated. Includes must be added manually in alphabetical order within their section.');
113
+ lines.push('');
114
+
115
+ return lines;
116
+ }
117
+
6
118
  /**
7
119
  * Generate PR summary for multiple releases
8
120
  * @param {object} masterDiff - Master diff with releases array
@@ -21,9 +133,9 @@ function generateMultiVersionPRSummary(masterDiff, binaryAnalysis = null, drafte
21
133
 
22
134
  lines.push('<!-- PR_SUMMARY_START -->');
23
135
  lines.push('');
24
- lines.push('## 📊 Redpanda Connect Documentation Update');
136
+ lines.push('## Redpanda Connect Documentation Update');
25
137
  lines.push('');
26
- lines.push(`**📦 Multi-Release Update:** ${startVersion} → ${endVersion}`);
138
+ lines.push(`**Multi-Release Update:** ${startVersion} → ${endVersion}`);
27
139
  lines.push(`**Releases Processed:** ${processedReleases}`);
28
140
 
29
141
  if (binaryAnalysis) {
@@ -44,10 +156,10 @@ function generateMultiVersionPRSummary(masterDiff, binaryAnalysis = null, drafte
44
156
  lines.push(`- **${total.newFields}** new fields across ${total.releaseCount || 0} release(s)`);
45
157
  }
46
158
  if (total.removedComponents > 0) {
47
- lines.push(`- **${total.removedComponents}** removed connectors ⚠️`);
159
+ lines.push(`- **${total.removedComponents}** removed connectors`);
48
160
  }
49
161
  if (total.removedFields > 0) {
50
- lines.push(`- **${total.removedFields}** removed fields ⚠️`);
162
+ lines.push(`- **${total.removedFields}** removed fields`);
51
163
  }
52
164
  if (total.deprecatedComponents > 0) {
53
165
  lines.push(`- **${total.deprecatedComponents}** deprecated connectors`);
@@ -56,7 +168,19 @@ function generateMultiVersionPRSummary(masterDiff, binaryAnalysis = null, drafte
56
168
  lines.push(`- **${total.deprecatedFields}** deprecated fields`);
57
169
  }
58
170
  if (total.changedDefaults > 0) {
59
- lines.push(`- **${total.changedDefaults}** changed default values ⚠️`);
171
+ lines.push(`- **${total.changedDefaults}** changed default values`);
172
+ }
173
+ if (total.newBloblangMethods > 0) {
174
+ lines.push(`- **${total.newBloblangMethods}** new Bloblang methods`);
175
+ }
176
+ if (total.removedBloblangMethods > 0) {
177
+ lines.push(`- **${total.removedBloblangMethods}** removed Bloblang methods`);
178
+ }
179
+ if (total.newBloblangFunctions > 0) {
180
+ lines.push(`- **${total.newBloblangFunctions}** new Bloblang functions`);
181
+ }
182
+ if (total.removedBloblangFunctions > 0) {
183
+ lines.push(`- **${total.removedBloblangFunctions}** removed Bloblang functions`);
60
184
  }
61
185
 
62
186
  lines.push('');
@@ -76,7 +200,7 @@ function generateMultiVersionPRSummary(masterDiff, binaryAnalysis = null, drafte
76
200
 
77
201
  for (const release of releases) {
78
202
  const releaseNotesUrl = `https://github.com/redpanda-data/connect/releases/tag/v${release.toVersion}`;
79
- lines.push(`#### 🔖 Version ${release.toVersion}`);
203
+ lines.push(`#### Version ${release.toVersion}`);
80
204
  lines.push(`> [Release notes](${releaseNotesUrl})`);
81
205
  lines.push('');
82
206
 
@@ -140,7 +264,7 @@ function generateMultiVersionPRSummary(masterDiff, binaryAnalysis = null, drafte
140
264
  // Removed components
141
265
  const removedComponents = details.removedComponents || [];
142
266
  if (summary.removedComponents > 0 && removedComponents.length > 0) {
143
- lines.push(`**⚠️ Removed Connectors (${summary.removedComponents}):**`);
267
+ lines.push(`**Removed Connectors (${summary.removedComponents}):**`);
144
268
  lines.push('');
145
269
  removedComponents.forEach(comp => {
146
270
  lines.push(`- \`${comp.name}\` (${comp.type})`);
@@ -151,7 +275,7 @@ function generateMultiVersionPRSummary(masterDiff, binaryAnalysis = null, drafte
151
275
  // Removed fields
152
276
  const removedFields = details.removedFields || [];
153
277
  if (summary.removedFields > 0 && removedFields.length > 0) {
154
- lines.push(`**⚠️ Removed Fields (${summary.removedFields}):**`);
278
+ lines.push(`**Removed Fields (${summary.removedFields}):**`);
155
279
  lines.push('');
156
280
  lines.push('| Component | Field |');
157
281
  lines.push('|-----------|-------|');
@@ -176,7 +300,7 @@ function generateMultiVersionPRSummary(masterDiff, binaryAnalysis = null, drafte
176
300
  // Changed defaults
177
301
  const changedDefaults = details.changedDefaults || [];
178
302
  if (summary.changedDefaults > 0 && changedDefaults.length > 0) {
179
- lines.push(`**⚠️ Changed Defaults (${summary.changedDefaults}):**`);
303
+ lines.push(`**Changed Defaults (${summary.changedDefaults}):**`);
180
304
  lines.push('');
181
305
  lines.push('| Component | Field | Old Default | New Default |');
182
306
  lines.push('|-----------|-------|-------------|-------------|');
@@ -192,7 +316,7 @@ function generateMultiVersionPRSummary(masterDiff, binaryAnalysis = null, drafte
192
316
  // Writer action items (aggregate)
193
317
  lines.push('---');
194
318
  lines.push('');
195
- lines.push('### ✍️ Writer Action Items');
319
+ lines.push('### Writer Action Items');
196
320
  lines.push('');
197
321
 
198
322
  // Collect all new connectors across all releases with full details
@@ -200,6 +324,12 @@ function generateMultiVersionPRSummary(masterDiff, binaryAnalysis = null, drafte
200
324
  const allRemovedConnectors = [];
201
325
  const allDeprecatedFields = [];
202
326
  const allChangedDefaults = [];
327
+ const allNewBloblangMethods = [];
328
+ const allRemovedBloblangMethods = [];
329
+ const allNewBloblangFunctions = [];
330
+ const allRemovedBloblangFunctions = [];
331
+ const allDeprecatedBloblangMethods = [];
332
+ const allDeprecatedBloblangFunctions = [];
203
333
 
204
334
  releases.forEach(release => {
205
335
  const details = release.details || {};
@@ -253,6 +383,48 @@ function generateMultiVersionPRSummary(masterDiff, binaryAnalysis = null, drafte
253
383
  version: release.toVersion
254
384
  });
255
385
  });
386
+
387
+ // New/removed Bloblang methods
388
+ (details.newBloblangMethods || []).forEach(methodName => {
389
+ allNewBloblangMethods.push({
390
+ name: methodName,
391
+ version: release.toVersion
392
+ });
393
+ });
394
+ (details.removedBloblangMethods || []).forEach(methodName => {
395
+ allRemovedBloblangMethods.push({
396
+ name: methodName,
397
+ version: release.toVersion
398
+ });
399
+ });
400
+
401
+ // New/removed Bloblang functions
402
+ (details.newBloblangFunctions || []).forEach(funcName => {
403
+ allNewBloblangFunctions.push({
404
+ name: funcName,
405
+ version: release.toVersion
406
+ });
407
+ });
408
+ (details.removedBloblangFunctions || []).forEach(funcName => {
409
+ allRemovedBloblangFunctions.push({
410
+ name: funcName,
411
+ version: release.toVersion
412
+ });
413
+ });
414
+
415
+ // Deprecated Bloblang methods/functions
416
+ (details.deprecatedBloblangMethods || []).forEach(methodName => {
417
+ allDeprecatedBloblangMethods.push({
418
+ name: methodName,
419
+ version: release.toVersion
420
+ });
421
+ });
422
+ (details.deprecatedBloblangFunctions || []).forEach(funcName => {
423
+ allDeprecatedBloblangFunctions.push({
424
+ name: funcName,
425
+ version: release.toVersion
426
+ });
427
+ });
256
428
  });
257
429
 
258
430
  // Priority 1: New connectors needing documentation
@@ -292,7 +464,7 @@ function generateMultiVersionPRSummary(masterDiff, binaryAnalysis = null, drafte
292
464
 
293
465
  // Priority 2: Removed connectors needing migration docs
294
466
  if (allRemovedConnectors.length > 0) {
295
- lines.push('**⚠️ Update Migration Guide for Removed Connectors:**');
467
+ lines.push('**Update Migration Guide for Removed Connectors:**');
296
468
  lines.push('');
297
469
  allRemovedConnectors.forEach(conn => {
298
470
  lines.push(`- [ ] \`${conn.name}\` ${conn.type} — removed in **${conn.version}**`);
@@ -302,7 +474,7 @@ function generateMultiVersionPRSummary(masterDiff, binaryAnalysis = null, drafte
302
474
 
303
475
  // Priority 3: Deprecated fields needing docs update
304
476
  if (allDeprecatedFields.length > 0) {
305
- lines.push('**📋 Update Docs for Deprecated Fields:**');
477
+ lines.push('**Update Docs for Deprecated Fields:**');
306
478
  lines.push('');
307
479
  allDeprecatedFields.forEach(field => {
308
480
  const guidance = field.description ? ` (${truncateToSentence(field.description, 1)})` : '';
@@ -313,7 +485,7 @@ function generateMultiVersionPRSummary(masterDiff, binaryAnalysis = null, drafte
313
485
 
314
486
  // Priority 4: Changed defaults that may affect users
315
487
  if (allChangedDefaults.length > 0) {
316
- lines.push('**⚠️ Review Changed Defaults for Breaking Changes:**');
488
+ lines.push('**Review Changed Defaults for Breaking Changes:**');
317
489
  lines.push('');
318
490
  allChangedDefaults.forEach(change => {
319
491
  const oldVal = change.oldDefault !== undefined ? JSON.stringify(change.oldDefault) : 'none';
@@ -323,6 +495,17 @@ function generateMultiVersionPRSummary(masterDiff, binaryAnalysis = null, drafte
323
495
  lines.push('');
324
496
  }
325
497
 
498
+ // Bloblang methods and functions
499
+ const bloblangLines = renderBloblangChanges({
500
+ newMethods: allNewBloblangMethods,
501
+ newFunctions: allNewBloblangFunctions,
502
+ removedMethods: allRemovedBloblangMethods,
503
+ removedFunctions: allRemovedBloblangFunctions,
504
+ deprecatedMethods: allDeprecatedBloblangMethods,
505
+ deprecatedFunctions: allDeprecatedBloblangFunctions
506
+ }, true); // includeVersion = true for multi-version summaries
507
+ lines.push(...bloblangLines);
508
+
326
509
  // Add commercial name reminder if there are new connectors
327
510
  if (allNewConnectors.length > 0) {
328
511
  lines.push('---');
@@ -368,7 +551,7 @@ function generatePRSummary(diffData, binaryAnalysis = null, draftedConnectors =
368
551
 
369
552
  // Single version format (original logic)
370
553
  // Quick Summary Section
371
- lines.push('## 📊 Redpanda Connect Documentation Update');
554
+ lines.push('## Redpanda Connect Documentation Update');
372
555
  lines.push('');
373
556
  lines.push(`**OSS Version:** ${diffData.comparison.oldVersion} → ${diffData.comparison.newVersion}`);
374
557
 
@@ -383,7 +566,7 @@ function generatePRSummary(diffData, binaryAnalysis = null, draftedConnectors =
383
566
  const hasChanges = Object.values(stats).some(v => v > 0) || (draftedConnectors && draftedConnectors.length > 0);
384
567
 
385
568
  if (!hasChanges) {
386
- lines.push('**No changes detected** - Documentation is up to date');
569
+ lines.push('**No changes detected** - Documentation is up to date');
387
570
  lines.push('');
388
571
  lines.push('<!-- PR_SUMMARY_END -->');
389
572
  return lines.join('\n');
@@ -418,11 +601,11 @@ function generatePRSummary(diffData, binaryAnalysis = null, draftedConnectors =
418
601
  }
419
602
 
420
603
  if (stats.removedComponents > 0) {
421
- lines.push(`- **${stats.removedComponents}** removed connector${stats.removedComponents !== 1 ? 's' : ''} ⚠️`);
604
+ lines.push(`- **${stats.removedComponents}** removed connector${stats.removedComponents !== 1 ? 's' : ''}`);
422
605
  }
423
606
 
424
607
  if (stats.removedFields > 0) {
425
- lines.push(`- **${stats.removedFields}** removed field${stats.removedFields !== 1 ? 's' : ''} ⚠️`);
608
+ lines.push(`- **${stats.removedFields}** removed field${stats.removedFields !== 1 ? 's' : ''}`);
426
609
  }
427
610
 
428
611
  if (stats.deprecatedComponents > 0) {
@@ -433,15 +616,39 @@ function generatePRSummary(diffData, binaryAnalysis = null, draftedConnectors =
433
616
  lines.push(`- **${stats.deprecatedFields}** deprecated field${stats.deprecatedFields !== 1 ? 's' : ''}`);
434
617
  }
435
618
 
619
+ if (stats.newBloblangMethods > 0) {
620
+ lines.push(`- **${stats.newBloblangMethods}** new Bloblang method${stats.newBloblangMethods !== 1 ? 's' : ''}`);
621
+ }
622
+
623
+ if (stats.newBloblangFunctions > 0) {
624
+ lines.push(`- **${stats.newBloblangFunctions}** new Bloblang function${stats.newBloblangFunctions !== 1 ? 's' : ''}`);
625
+ }
626
+
627
+ if (stats.removedBloblangMethods > 0) {
628
+ lines.push(`- **${stats.removedBloblangMethods}** removed Bloblang method${stats.removedBloblangMethods !== 1 ? 's' : ''}`);
629
+ }
630
+
631
+ if (stats.removedBloblangFunctions > 0) {
632
+ lines.push(`- **${stats.removedBloblangFunctions}** removed Bloblang function${stats.removedBloblangFunctions !== 1 ? 's' : ''}`);
633
+ }
634
+
635
+ if (stats.deprecatedBloblangMethods > 0) {
636
+ lines.push(`- **${stats.deprecatedBloblangMethods}** deprecated Bloblang method${stats.deprecatedBloblangMethods !== 1 ? 's' : ''}`);
637
+ }
638
+
639
+ if (stats.deprecatedBloblangFunctions > 0) {
640
+ lines.push(`- **${stats.deprecatedBloblangFunctions}** deprecated Bloblang function${stats.deprecatedBloblangFunctions !== 1 ? 's' : ''}`);
641
+ }
642
+
436
643
  if (stats.changedDefaults > 0) {
437
- lines.push(`- **${stats.changedDefaults}** default value change${stats.changedDefaults !== 1 ? 's' : ''} ⚠️`);
644
+ lines.push(`- **${stats.changedDefaults}** default value change${stats.changedDefaults !== 1 ? 's' : ''}`);
438
645
  }
439
646
 
440
647
  lines.push('');
441
648
 
442
649
  // Writer Reminder for Commercial Names
443
650
  if (stats.newComponents > 0) {
444
- lines.push('### ✍️ Writer Action Required');
651
+ lines.push('### Writer Action Required');
445
652
  lines.push('');
446
653
  lines.push('For each new connector, add the `:page-commercial-names:` attribute to the frontmatter:');
447
654
  lines.push('');
@@ -524,7 +731,7 @@ function generatePRSummary(diffData, binaryAnalysis = null, draftedConnectors =
524
731
  if (stats.changedDefaults > 0) breakingChanges.push('changed defaults');
525
732
 
526
733
  if (breakingChanges.length > 0) {
527
- lines.push('### ⚠️ Breaking Changes Detected');
734
+ lines.push('### Breaking Changes Detected');
528
735
  lines.push('');
529
736
  lines.push(`This update includes **${breakingChanges.join(', ')}** that may affect existing configurations.`);
530
737
  lines.push('');
@@ -598,7 +805,7 @@ function generatePRSummary(diffData, binaryAnalysis = null, draftedConnectors =
598
805
  }
599
806
 
600
807
  if (missingDescriptions.length > 0) {
601
- lines.push('### ⚠️ Missing Descriptions');
808
+ lines.push('### Missing Descriptions');
602
809
  lines.push('');
603
810
  lines.push(`**${missingDescriptions.length}** item${missingDescriptions.length !== 1 ? 's' : ''} missing descriptions - these need writer attention:`);
604
811
  lines.push('');
@@ -643,7 +850,7 @@ function generatePRSummary(diffData, binaryAnalysis = null, draftedConnectors =
643
850
  if (missingDescriptions.length > 0) {
644
851
  actionItems.push({
645
852
  priority: 0,
646
- text: `⚠️ Add descriptions for ${missingDescriptions.length} component${missingDescriptions.length !== 1 ? 's' : ''}/field${missingDescriptions.length !== 1 ? 's' : ''} (see Missing Descriptions section)`
853
+ text: `Add descriptions for ${missingDescriptions.length} component${missingDescriptions.length !== 1 ? 's' : ''}/field${missingDescriptions.length !== 1 ? 's' : ''} (see Missing Descriptions section)`
647
854
  });
648
855
  }
649
856
 
@@ -721,9 +928,20 @@ function generatePRSummary(diffData, binaryAnalysis = null, draftedConnectors =
721
928
 
722
929
  lines.push('');
723
930
 
931
+ // Bloblang methods and functions
932
+ const bloblangLines = renderBloblangChanges({
933
+ newMethods: diffData.details.newBloblangMethods || [],
934
+ newFunctions: diffData.details.newBloblangFunctions || [],
935
+ removedMethods: diffData.details.removedBloblangMethods || [],
936
+ removedFunctions: diffData.details.removedBloblangFunctions || [],
937
+ deprecatedMethods: diffData.details.deprecatedBloblangMethods || [],
938
+ deprecatedFunctions: diffData.details.deprecatedBloblangFunctions || []
939
+ }, false); // includeVersion = false for single-version summaries
940
+ lines.push(...bloblangLines);
941
+
724
942
  // Detailed breakdown (expandable)
725
943
  lines.push('<details>');
726
- lines.push('<summary><strong>📋 Detailed Changes</strong> (click to expand)</summary>');
944
+ lines.push('<summary><strong>Detailed Changes</strong> (click to expand)</summary>');
727
945
  lines.push('');
728
946
 
729
947
  // New Connectors
@@ -861,7 +1079,7 @@ function generatePRSummary(diffData, binaryAnalysis = null, draftedConnectors =
861
1079
 
862
1080
  // Removed Connectors
863
1081
  if (stats.removedComponents > 0) {
864
- lines.push('#### ⚠️ Removed Connectors');
1082
+ lines.push('#### Removed Connectors');
865
1083
  lines.push('');
866
1084
  diffData.details.removedComponents.forEach(c => {
867
1085
  lines.push(`- **${c.name}** (${c.type})`);
@@ -871,7 +1089,7 @@ function generatePRSummary(diffData, binaryAnalysis = null, draftedConnectors =
871
1089
 
872
1090
  // Removed Fields
873
1091
  if (stats.removedFields > 0) {
874
- lines.push('#### ⚠️ Removed Fields');
1092
+ lines.push('#### Removed Fields');
875
1093
  lines.push('');
876
1094
 
877
1095
  const fieldsByComponent = {};
@@ -927,7 +1145,7 @@ function generatePRSummary(diffData, binaryAnalysis = null, draftedConnectors =
927
1145
 
928
1146
  // Changed Defaults
929
1147
  if (stats.changedDefaults > 0) {
930
- lines.push('#### ⚠️ Changed Default Values');
1148
+ lines.push('#### Changed Default Values');
931
1149
  lines.push('');
932
1150
 
933
1151
  const changesByComponent = {};
@@ -950,6 +1168,66 @@ function generatePRSummary(diffData, binaryAnalysis = null, draftedConnectors =
950
1168
  });
951
1169
  }
952
1170
 
1171
+ // New Bloblang Methods
1172
+ if (stats.newBloblangMethods > 0 && diffData.details.newBloblangMethods) {
1173
+ lines.push('#### New Bloblang Methods');
1174
+ lines.push('');
1175
+ diffData.details.newBloblangMethods.forEach(methodName => {
1176
+ lines.push(`- \`${methodName}\``);
1177
+ });
1178
+ lines.push('');
1179
+ }
1180
+
1181
+ // New Bloblang Functions
1182
+ if (stats.newBloblangFunctions > 0 && diffData.details.newBloblangFunctions) {
1183
+ lines.push('#### New Bloblang Functions');
1184
+ lines.push('');
1185
+ diffData.details.newBloblangFunctions.forEach(funcName => {
1186
+ lines.push(`- \`${funcName}\``);
1187
+ });
1188
+ lines.push('');
1189
+ }
1190
+
1191
+ // Removed Bloblang Methods
1192
+ if (stats.removedBloblangMethods > 0 && diffData.details.removedBloblangMethods) {
1193
+ lines.push('#### Removed Bloblang Methods');
1194
+ lines.push('');
1195
+ diffData.details.removedBloblangMethods.forEach(methodName => {
1196
+ lines.push(`- \`${methodName}\``);
1197
+ });
1198
+ lines.push('');
1199
+ }
1200
+
1201
+ // Removed Bloblang Functions
1202
+ if (stats.removedBloblangFunctions > 0 && diffData.details.removedBloblangFunctions) {
1203
+ lines.push('#### Removed Bloblang Functions');
1204
+ lines.push('');
1205
+ diffData.details.removedBloblangFunctions.forEach(funcName => {
1206
+ lines.push(`- \`${funcName}\``);
1207
+ });
1208
+ lines.push('');
1209
+ }
1210
+
1211
+ // Deprecated Bloblang Methods
1212
+ if (stats.deprecatedBloblangMethods > 0 && diffData.details.deprecatedBloblangMethods) {
1213
+ lines.push('#### Deprecated Bloblang Methods');
1214
+ lines.push('');
1215
+ diffData.details.deprecatedBloblangMethods.forEach(methodName => {
1216
+ lines.push(`- \`${methodName}\``);
1217
+ });
1218
+ lines.push('');
1219
+ }
1220
+
1221
+ // Deprecated Bloblang Functions
1222
+ if (stats.deprecatedBloblangFunctions > 0 && diffData.details.deprecatedBloblangFunctions) {
1223
+ lines.push('#### Deprecated Bloblang Functions');
1224
+ lines.push('');
1225
+ diffData.details.deprecatedBloblangFunctions.forEach(funcName => {
1226
+ lines.push(`- \`${funcName}\``);
1227
+ });
1228
+ lines.push('');
1229
+ }
1230
+
953
1231
  // Cloud Support Gap Analysis
954
1232
  if (binaryAnalysis && binaryAnalysis.comparison.notInCloud.length > 0) {
955
1233
  lines.push('#### 🔍 Cloud Support Gap Analysis');
@@ -163,6 +163,50 @@ function generateConnectorDiffJson(oldIndex, newIndex, opts = {}) {
163
163
  });
164
164
  });
165
165
 
166
+ // Detect new/removed Bloblang methods and functions
167
+ const oldMethods = new Set((oldIndex['bloblang-methods'] || []).filter(Boolean).map(m => m.name).filter(Boolean));
168
+ const newMethods = new Set((newIndex['bloblang-methods'] || []).filter(Boolean).map(m => m.name).filter(Boolean));
169
+ const oldFunctions = new Set((oldIndex['bloblang-functions'] || []).filter(Boolean).map(f => f.name).filter(Boolean));
170
+ const newFunctions = new Set((newIndex['bloblang-functions'] || []).filter(Boolean).map(f => f.name).filter(Boolean));
171
+
172
+ const newBloblangMethods = Array.from(newMethods).filter(m => !oldMethods.has(m)).sort();
173
+ const removedBloblangMethods = Array.from(oldMethods).filter(m => !newMethods.has(m)).sort();
174
+ const newBloblangFunctions = Array.from(newFunctions).filter(f => !oldFunctions.has(f)).sort();
175
+ const removedBloblangFunctions = Array.from(oldFunctions).filter(f => !newFunctions.has(f)).sort();
176
+
177
+ // Detect deprecated Bloblang methods and functions
178
+ const deprecatedBloblangMethods = [];
179
+ const deprecatedBloblangFunctions = [];
180
+
181
+ const oldMethodsMap = new Map((oldIndex['bloblang-methods'] || []).filter(Boolean).filter(m => m.name).map(m => [m.name, m]));
182
+ const newMethodsMap = new Map((newIndex['bloblang-methods'] || []).filter(Boolean).filter(m => m.name).map(m => [m.name, m]));
183
+ const oldFunctionsMap = new Map((oldIndex['bloblang-functions'] || []).filter(Boolean).filter(f => f.name).map(f => [f.name, f]));
184
+ const newFunctionsMap = new Map((newIndex['bloblang-functions'] || []).filter(Boolean).filter(f => f.name).map(f => [f.name, f]));
185
+
186
+ // Check methods for newly deprecated status
187
+ newMethodsMap.forEach((newMethod, name) => {
188
+ const oldMethod = oldMethodsMap.get(name);
189
+ if (oldMethod) {
190
+ const oldStatus = (oldMethod.status || '').toLowerCase();
191
+ const newStatus = (newMethod.status || '').toLowerCase();
192
+ if (oldStatus !== 'deprecated' && newStatus === 'deprecated') {
193
+ deprecatedBloblangMethods.push(name);
194
+ }
195
+ }
196
+ });
197
+
198
+ // Check functions for newly deprecated status
199
+ newFunctionsMap.forEach((newFunction, name) => {
200
+ const oldFunction = oldFunctionsMap.get(name);
201
+ if (oldFunction) {
202
+ const oldStatus = (oldFunction.status || '').toLowerCase();
203
+ const newStatus = (newFunction.status || '').toLowerCase();
204
+ if (oldStatus !== 'deprecated' && newStatus === 'deprecated') {
205
+ deprecatedBloblangFunctions.push(name);
206
+ }
207
+ }
208
+ });
209
+
166
210
  const result = {
167
211
  comparison: {
168
212
  oldVersion: opts.oldVersion || '',
@@ -176,7 +220,13 @@ function generateConnectorDiffJson(oldIndex, newIndex, opts = {}) {
176
220
  removedFields: removedFields.length,
177
221
  deprecatedComponents: deprecatedComponents.length,
178
222
  deprecatedFields: deprecatedFields.length,
179
- changedDefaults: changedDefaults.length
223
+ changedDefaults: changedDefaults.length,
224
+ newBloblangMethods: newBloblangMethods.length,
225
+ removedBloblangMethods: removedBloblangMethods.length,
226
+ newBloblangFunctions: newBloblangFunctions.length,
227
+ removedBloblangFunctions: removedBloblangFunctions.length,
228
+ deprecatedBloblangMethods: deprecatedBloblangMethods.length,
229
+ deprecatedBloblangFunctions: deprecatedBloblangFunctions.length
180
230
  },
181
231
  details: {
182
232
  newComponents,
@@ -185,7 +235,13 @@ function generateConnectorDiffJson(oldIndex, newIndex, opts = {}) {
185
235
  removedFields,
186
236
  deprecatedComponents,
187
237
  deprecatedFields,
188
- changedDefaults
238
+ changedDefaults,
239
+ newBloblangMethods,
240
+ removedBloblangMethods,
241
+ newBloblangFunctions,
242
+ removedBloblangFunctions,
243
+ deprecatedBloblangMethods,
244
+ deprecatedBloblangFunctions
189
245
  }
190
246
  };
191
247
 
@@ -1,15 +1,41 @@
1
1
  // This content is autogenerated. Do not edit manually. To override descriptions, use the doc-tools CLI with the --overrides option: https://redpandadata.atlassian.net/wiki/spaces/DOC/pages/1247543314/Generate+reference+docs+for+Redpanda+Connect
2
2
 
3
3
  = {{name}}
4
-
5
4
  {{#if signature}}
5
+
6
6
  *Signature*: `{{signature}}`
7
7
  {{/if}}
8
+ {{#if (eq status "deprecated")}}
8
9
 
10
+ [WARNING]
11
+ ====
12
+ This {{#if signature}}function{{else}}method{{/if}} is deprecated and will be removed in a future version.
13
+ ====
14
+ {{/if}}
9
15
  {{#if description}}
10
- {{description}}
16
+
17
+ {{{ensurePeriod description}}}
11
18
  {{/if}}
12
19
 
20
+ {{#if params}}
21
+ {{#if params.named}}
22
+
23
+ == Parameters
24
+
25
+ [cols="1,1,3"]
26
+ |===
27
+ | Name | Type | Description
28
+
29
+ {{#each params.named}}
30
+ | `{{name}}`{{#if is_optional}} (optional){{/if}}
31
+ | `{{type}}`
32
+ | {{{description}}}
33
+
34
+ {{/each}}
35
+ |===
36
+
37
+ {{/if}}
38
+ {{/if}}
13
39
 
14
40
  {{#if examples}}
15
41
  == Examples
@@ -0,0 +1,29 @@
1
+ = Bloblang Functions
2
+ // tag::single-source[]
3
+ :description: A list of Bloblang functions
4
+
5
+ // © 2024 Redpanda Data Inc.
6
+
7
+
8
+ Functions can be placed anywhere and allow you to extract information from your environment, generate values, or access data from the underlying message being mapped:
9
+
10
+ ```bloblang
11
+ root.doc.id = uuid_v4()
12
+ root.doc.received_at = now()
13
+ root.doc.host = hostname()
14
+ ```
15
+
16
+ Functions support both named and nameless style arguments:
17
+
18
+ ```bloblang
19
+ root.values_one = range(start: 0, stop: this.max, step: 2)
20
+ root.values_two = range(0, this.max, 2)
21
+
22
+ # In: {"max":10}
23
+ ```
24
+ {{#each functions}}
25
+
26
+ include::redpanda-connect:components:partial$bloblang-functions/{{this}}.adoc[leveloffset=+1]
27
+ {{/each}}
28
+
29
+ // end::single-source[]
@@ -0,0 +1,39 @@
1
+ = Bloblang Methods
2
+ // tag::single-source[]
3
+ :description: A list of Bloblang methods
4
+
5
+ // © 2024 Redpanda Data Inc.
6
+
7
+
8
+ Methods provide most of the power in Bloblang as they allow you to augment values and can be added to any expression (including other methods):
9
+
10
+ ```bloblang
11
+ root.doc.id = this.thing.id.string().catch(uuid_v4())
12
+ root.doc.reduced_nums = this.thing.nums.map_each(num -> if num < 10 {
13
+ deleted()
14
+ } else {
15
+ num - 10
16
+ })
17
+ root.has_good_taste = ["pikachu","mewtwo","magmar"].contains(this.user.fav_pokemon)
18
+
19
+ # In: {"thing":{"id":123,"nums":[5,12,18,7,25]},"user":{"fav_pokemon":"pikachu"}}
20
+ ```
21
+
22
+ Methods support both named and nameless style arguments:
23
+
24
+ ```bloblang
25
+ root.foo_one = this.(bar | baz).trim().replace_all(old: "dog", new: "cat")
26
+ root.foo_two = this.(bar | baz).trim().replace_all("dog", "cat")
27
+
28
+ # In: {"bar":" I love my dog "}
29
+ ```
30
+ {{#each categories}}
31
+
32
+ == {{{toSentenceCase this.name}}}
33
+ {{#each this.methods}}
34
+
35
+ include::redpanda-connect:components:partial$bloblang-methods/{{this}}.adoc[leveloffset=+2]
36
+ {{/each}}
37
+ {{/each}}
38
+
39
+ // end::single-source[]
@@ -1,10 +1,9 @@
1
1
  = {{{name}}}
2
2
  // tag::single-source[]
3
3
  :type: {{type}}
4
- :status: {{status}}
5
4
  {{#if support}}:support: {{support}}{{/if}}
6
5
  :categories: [{{join categories ", "}}]
7
- :description: {{#if summary}}{{{summary}}}{{else if description}}{{description}}{{else}}TODO: Missing description. Add a description in the overrides file or source data.{{/if}}
6
+ :description: {{#if summary}}{{{summary}}}{{else if description}}{{description}}{{else}}// TODO: Missing description. Add a description in the overrides file or source data.{{/if}}
8
7
 
9
8
  component_type_dropdown::[]
10
9
 
@@ -9,5 +9,5 @@ endif::[]
9
9
  {{#if description}}
10
10
  {{{description}}}
11
11
  {{else}}
12
- TODO: Missing description. Add a description in the overrides file or source data.
12
+ // TODO: Missing description. Add a description in the overrides file or source data.
13
13
  {{/if}}