@redpanda-data/docs-extensions-and-macros 4.5.0 → 4.6.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 (29) hide show
  1. package/README.adoc +0 -163
  2. package/bin/doc-tools.js +491 -286
  3. package/cli-utils/antora-utils.js +127 -0
  4. package/cli-utils/self-managed-docs-branch.js +2 -1
  5. package/package.json +6 -5
  6. package/tools/redpanda-connect/generate-rpcn-connector-docs.js +205 -0
  7. package/tools/redpanda-connect/helpers/advancedConfig.js +17 -0
  8. package/tools/redpanda-connect/helpers/buildConfigYaml.js +53 -0
  9. package/tools/redpanda-connect/helpers/commonConfig.js +31 -0
  10. package/tools/redpanda-connect/helpers/eq.js +10 -0
  11. package/tools/redpanda-connect/helpers/index.js +19 -0
  12. package/tools/redpanda-connect/helpers/isObject.js +1 -0
  13. package/tools/redpanda-connect/helpers/join.js +6 -0
  14. package/tools/redpanda-connect/helpers/ne.js +10 -0
  15. package/tools/redpanda-connect/helpers/or.js +4 -0
  16. package/tools/redpanda-connect/helpers/renderConnectExamples.js +37 -0
  17. package/tools/redpanda-connect/helpers/renderConnectFields.js +146 -0
  18. package/tools/redpanda-connect/helpers/renderLeafField.js +64 -0
  19. package/tools/redpanda-connect/helpers/renderObjectField.js +41 -0
  20. package/tools/redpanda-connect/helpers/renderYamlList.js +24 -0
  21. package/tools/redpanda-connect/helpers/toYaml.js +11 -0
  22. package/tools/redpanda-connect/helpers/uppercase.js +9 -0
  23. package/tools/redpanda-connect/parse-csv-connectors.js +63 -0
  24. package/tools/redpanda-connect/report-delta.js +152 -0
  25. package/tools/redpanda-connect/templates/connector.hbs +20 -0
  26. package/tools/redpanda-connect/templates/examples-partials.hbs +7 -0
  27. package/tools/redpanda-connect/templates/fields-partials.hbs +13 -0
  28. package/tools/redpanda-connect/templates/intro.hbs +35 -0
  29. package/macros/data-template.js +0 -591
@@ -0,0 +1,146 @@
1
+ 'use strict';
2
+
3
+ const yaml = require('yaml');
4
+ const renderYamlList = require('./renderYamlList');
5
+ const handlebars = require('handlebars');
6
+
7
+
8
+ /**
9
+ * Renders the children of a configuration object into AsciiDoc.
10
+ *
11
+ * @param {Array<Object>} children - An array of child objects.
12
+ * @param {string} [prefix=''] - The prefix path for nested fields.
13
+ * @returns {handlebars.SafeString} The rendered SafeString containing the configuration details.
14
+ */
15
+ module.exports = function renderConnectFields(children, prefix = '') {
16
+ if (!children || !Array.isArray(children) || children.length === 0) {
17
+ return '';
18
+ }
19
+
20
+ const sorted = [...children].sort((a, b) => {
21
+ const an = a.name || '';
22
+ const bn = b.name || '';
23
+ return an.localeCompare(bn, undefined, { sensitivity: 'base' });
24
+ });
25
+
26
+ let output = '';
27
+ prefix = typeof prefix === 'string' ? prefix : '';
28
+
29
+ sorted.forEach(child => {
30
+ if (child.is_deprecated) {
31
+ return;
32
+ }
33
+ const isArray = child.kind === 'array';
34
+ if (!child.name) return;
35
+ const currentPath = prefix
36
+ ? `${prefix}.${child.name}${isArray ? '[]' : ''}`
37
+ : `${child.name}${isArray ? '[]' : ''}`;
38
+
39
+ output += `=== \`${currentPath}\`\n\n`;
40
+
41
+ if (child.description) {
42
+ output += `${child.description}\n\n`;
43
+ }
44
+
45
+ if (child.is_secret === true) {
46
+ output += `include::redpanda-connect:components:partial$secret_warning.adoc[]\n\n`;
47
+ }
48
+
49
+ if (child.version) {
50
+ output += `ifndef::env-cloud[]\nRequires version ${child.version} or later.\nendif::[]\n\n`;
51
+ }
52
+
53
+ output += `*Type*: \`${child.type}\`\n\n`;
54
+
55
+ if (child.type !== 'object' && child.default !== undefined) {
56
+ if (typeof child.default !== 'object') {
57
+ const display = child.default === '' ? '""' : String(child.default);
58
+ output += `*Default*: \`${display}\`\n\n`;
59
+ } else {
60
+ const defYaml = yaml.stringify(child.default).trim();
61
+ output += `*Default*:\n[source,yaml]\n----\n${defYaml}\n----\n\n`;
62
+ }
63
+ }
64
+
65
+ if (
66
+ child.annotated_options &&
67
+ Array.isArray(child.annotated_options) &&
68
+ child.annotated_options.length > 0
69
+ ) {
70
+ output += '[cols="1m,2a"]\n';
71
+ output += '|===\n';
72
+ output += '|Option |Summary\n\n';
73
+ child.annotated_options.forEach(optionPair => {
74
+ if (Array.isArray(optionPair) && optionPair.length >= 2) {
75
+ output += `|${optionPair[0]}\n|${optionPair[1]}\n\n`;
76
+ }
77
+ });
78
+ output += '|===\n\n';
79
+ }
80
+
81
+ if (child.options && Array.isArray(child.options) && child.options.length > 0) {
82
+ output += `*Options*: ${child.options.map(opt => `\`${opt}\``).join(', ')}\n\n`;
83
+ }
84
+
85
+ if (child.examples && child.examples.length) {
86
+ output += '[source,yaml]\n----\n';
87
+ output += '# Examples:\n';
88
+
89
+ if (child.type === 'string') {
90
+ if (child.kind === 'array') {
91
+ output += renderYamlList(child.name, child.examples);
92
+ } else {
93
+ child.examples.forEach(example => {
94
+ if (typeof example === 'string' && example.includes('\n')) {
95
+ output += `${child.name}: |-\n`;
96
+ const indentedLines = example.split('\n').map(line => ' ' + line).join('\n');
97
+ output += `${indentedLines}\n`;
98
+ } else {
99
+ output += `${child.name}: ${example}\n`;
100
+ }
101
+ });
102
+ output += '\n';
103
+ }
104
+ } else if (child.type === 'processor') {
105
+ if (child.kind === 'array') {
106
+ output += renderYamlList(child.name, child.examples);
107
+ } else {
108
+ child.examples.forEach(example => {
109
+ output += `${child.name}: ${example}\n`;
110
+ });
111
+ output += '\n';
112
+ }
113
+ } else if (child.type === 'object') {
114
+ if (child.kind === 'array') {
115
+ output += renderYamlList(child.name, child.examples);
116
+ } else {
117
+ child.examples.forEach(example => {
118
+ if (typeof example === 'object') {
119
+ const snippet = yaml.stringify(example).trim();
120
+ const lines = snippet.split('\n');
121
+ // Prefix two spaces to every line
122
+ const formattedLines = lines.map(line => ' ' + line).join('\n');
123
+ output += `${child.name}:\n${formattedLines}\n`;
124
+ } else {
125
+ output += `${child.name}: ${example}\n`;
126
+ }
127
+ });
128
+ output += '\n';
129
+ }
130
+ } else {
131
+ child.examples.forEach(example => {
132
+ output += `${child.name}: ${example}\n`;
133
+ });
134
+ output += '\n';
135
+ }
136
+
137
+ output += '----\n\n';
138
+ }
139
+
140
+ if (child.children && Array.isArray(child.children) && child.children.length > 0) {
141
+ output += renderConnectFields(child.children, currentPath);
142
+ }
143
+ });
144
+
145
+ return new handlebars.SafeString(output);
146
+ }
@@ -0,0 +1,64 @@
1
+ const yaml = require('yaml');
2
+
3
+ /**
4
+ * Renders a single ā€œleafā€ field (scalar or array) at the given indentation.
5
+ * If `field.default` is present, prints that. Otherwise prints an empty-string
6
+ * or empty-array plus an inline comment (# No default (optional/required)).
7
+ *
8
+ * @param {Object} field – one field object from ā€œchildrenā€
9
+ * @param {number} indentLevel – number of spaces to indent
10
+ * @returns {string} – one line, including comment if needed
11
+ */
12
+ module.exports = function renderLeafField(field, indentLevel) {
13
+ if (!field || typeof field !== 'object') {
14
+ throw new Error('renderLeafField: field must be an object');
15
+ }
16
+ if (typeof indentLevel !== 'number' || indentLevel < 0) {
17
+ throw new Error('renderLeafField: indentLevel must be a non-negative number');
18
+ }
19
+ if (!field.name || typeof field.name !== 'string') {
20
+ throw new Error('renderLeafField: field.name must be a non-empty string');
21
+ }
22
+
23
+ const indent = ' '.repeat(indentLevel);
24
+ const name = field.name;
25
+
26
+ // Decide whether optional or required
27
+ const optional = Boolean(field.is_optional);
28
+ const comment = optional
29
+ ? '# No default (optional)'
30
+ : '# No default (required)';
31
+
32
+ // If a default is provided, use it:
33
+ if (field.default !== undefined) {
34
+ // If default is itself an object or array → dump as YAML block
35
+ if (typeof field.default === 'object') {
36
+ try {
37
+ // Turn the object/array into a YAML string. We also need to indent that block
38
+ const rawYaml = yaml.stringify(field.default).trim();
39
+ // Indent each line of rawYaml by (indentLevel + 2) spaces:
40
+ const indentedYaml = rawYaml
41
+ .split('\n')
42
+ .map(line => ' '.repeat(indentLevel + 2) + line)
43
+ .join('\n');
44
+ return `${indent}${name}:\n${indentedYaml}`;
45
+ } catch (error) {
46
+ console.warn(`Failed to serialize default value for field ${field.name}:`, error);
47
+ return `${indent}${name}: {} # Error serializing default value`;
48
+ }
49
+ }
50
+
51
+ // Otherwise, default is a primitive (string/number/bool)
52
+ if (field.type === 'string') {
53
+ return `${indent}${name}: ${yaml.stringify(field.default)}`;
54
+ }
55
+ return `${indent}${name}: ${field.default}`;
56
+ }
57
+
58
+ // No default → choose representation based on kind
59
+ if (field.kind === 'array') {
60
+ return `${indent}${name}: [] ${comment}`;
61
+ } else {
62
+ return `${indent}${name}: "" ${comment}`;
63
+ }
64
+ }
@@ -0,0 +1,41 @@
1
+ const renderLeafField = require('./renderLeafField');
2
+
3
+ /**
4
+ * Recursively renders an object‐typed field ( has .children[]) at the given indentation.
5
+ * Skips any sub-field with is_deprecated=true. Even if the parent has no default,
6
+ * the parent node itself is printed without a value (just a ā€œkey:ā€), then children.
7
+ *
8
+ * @param {Object} field – one field object of type==="object"
9
+ * @param {number} indentLevel – number of spaces to indent the ā€œkey:ā€
10
+ * @returns {string[]} – an array of lines (parent + children)
11
+ */
12
+ module.exports = function renderObjectField(field, indentLevel) {
13
+ if (!field || !field.name || !Array.isArray(field.children)) {
14
+ throw new Error('renderObjectField requires a field object with name and children array');
15
+ }
16
+ if (typeof indentLevel !== 'number' || indentLevel < 0) {
17
+ throw new Error('indentLevel must be a non-negative number');
18
+ }
19
+ const lines = [];
20
+ const indent = ' '.repeat(indentLevel);
21
+
22
+ // Print the parent heading (no default comment here, because parent is just a namespace)
23
+ lines.push(`${indent}${field.name}:`);
24
+
25
+ // Recurse into children at indentLevel + 2
26
+ const childIndent = indentLevel + 2;
27
+ field.children.forEach(child => {
28
+ if (child.is_deprecated) {
29
+ return; // skip entirely
30
+ }
31
+ if (Array.isArray(child.children) && child.children.length > 0) {
32
+ // Nested object → recurse
33
+ lines.push(...renderObjectField(child, childIndent));
34
+ } else {
35
+ // Leaf → render via renderLeafField
36
+ lines.push(renderLeafField(child, childIndent));
37
+ }
38
+ });
39
+
40
+ return lines;
41
+ }
@@ -0,0 +1,24 @@
1
+ const yaml = require('yaml');
2
+
3
+ /**
4
+ * Renders a list of objects or scalar items as a YAML list
5
+ *
6
+ * @param {string} name - The field name to use as the YAML key.
7
+ * @param {Array<Object|string|Array>} exampleGroups - An array of example groups.
8
+ * @returns {string} The rendered YAML list string.
9
+ */
10
+ module.exports = function renderYamlList(name, exampleGroups) {
11
+ let out = `${name}:\n`;
12
+ exampleGroups.forEach(group => {
13
+ const items = Array.isArray(group) ? group : [group];
14
+ items.forEach(item => {
15
+ const snippet = yaml.stringify(item).trim();
16
+ const lines = snippet.split('\n');
17
+ out += lines
18
+ .map((line, idx) => (idx === 0 ? ` - ${line}` : ` ${line}`))
19
+ .join('\n') + '\n';
20
+ });
21
+ out += '\n';
22
+ });
23
+ return out;
24
+ }
@@ -0,0 +1,11 @@
1
+ const yaml = require('yaml');
2
+
3
+ /**
4
+ * Converts an object to a YAML string.
5
+ *
6
+ * @param {Object} obj - The object to convert.
7
+ * @returns {string} The YAML representation of the object, trimmed.
8
+ */
9
+ module.exports = function toYaml(obj) {
10
+ return yaml.stringify(obj).trim();
11
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Converts a string to uppercase.
3
+ *
4
+ * @param {string} str - The string to convert.
5
+ * @returns {string} The uppercase version of the input string.
6
+ */
7
+ module.exports = function uppercase(str) {
8
+ return String(str).toUpperCase();
9
+ }
@@ -0,0 +1,63 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+ const os = require('os');
4
+ const Papa = require('papaparse');
5
+ const fetchFromGithub = require('../fetch-from-github.js');
6
+
7
+ const CSV_PATH = 'internal/plugins/info.csv';
8
+ const GITHUB = { owner: 'redpanda-data', repo: 'connect', remotePath: CSV_PATH };
9
+
10
+ async function parseCSVConnectors(localCsvPath, logger) {
11
+ logger = logger || console;
12
+ let csvText;
13
+
14
+ try {
15
+ if (localCsvPath && fs.existsSync(localCsvPath) && path.extname(localCsvPath) === '.csv') {
16
+ logger.info(`šŸ“„ Loading CSV from local file: ${localCsvPath}`);
17
+ csvText = fs.readFileSync(localCsvPath, 'utf8');
18
+ } else {
19
+ const tmpDir = path.join(os.tmpdir(), 'redpanda-connect-csv');
20
+ await fetchFromGithub(GITHUB.owner, GITHUB.repo, GITHUB.remotePath, tmpDir);
21
+ const downloaded = path.join(tmpDir, path.basename(GITHUB.remotePath));
22
+ if (!fs.existsSync(downloaded)) {
23
+ throw new Error(`Expected CSV at ${downloaded} but did not find it`);
24
+ }
25
+ logger.info(`šŸ“„ Loaded CSV from GitHub into: ${downloaded}`);
26
+ csvText = fs.readFileSync(downloaded, 'utf8');
27
+ fs.rmSync(tmpDir, { recursive: true, force: true });
28
+ }
29
+
30
+ const parsed = Papa.parse(csvText, {
31
+ header: true,
32
+ skipEmptyLines: true,
33
+ transformHeader: h => h.trim()
34
+ });
35
+
36
+ if (!parsed.meta.fields.includes('name') || !parsed.meta.fields.includes('type')) {
37
+ throw new Error('CSV is missing required headers: name and type');
38
+ }
39
+
40
+ const cleaned = parsed.data
41
+ .map(row => {
42
+ const trimmed = Object.fromEntries(
43
+ Object.entries(row).map(([k, v]) => [k.trim(), (v || '').trim()])
44
+ );
45
+
46
+ if (!trimmed.name || !trimmed.type) return null;
47
+
48
+ return {
49
+ name: trimmed.name,
50
+ type: trimmed.type,
51
+ is_cloud_supported: (trimmed.cloud || '').toLowerCase() === 'y' ? 'y' : 'n'
52
+ };
53
+ })
54
+ .filter(Boolean);
55
+
56
+ logger.info(`āœ… Parsed ${cleaned.length} connector records.`);
57
+ return cleaned;
58
+ } catch (err) {
59
+ throw new Error(`CSV parsing failed: ${err.message}`);
60
+ }
61
+ }
62
+
63
+ module.exports = parseCSVConnectors;
@@ -0,0 +1,152 @@
1
+ // tools/redpanda-connect/report-delta.js
2
+ 'use strict';
3
+
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+ const yaml = require('yaml');
7
+ const { execSync } = require('child_process');
8
+
9
+ function discoverComponentKeys(obj) {
10
+ return Object.keys(obj).filter(key => Array.isArray(obj[key]));
11
+ }
12
+
13
+ function buildComponentMap(indexObj) {
14
+ const map = {};
15
+ const types = discoverComponentKeys(indexObj);
16
+
17
+ types.forEach(type => {
18
+ (indexObj[type] || []).forEach(component => {
19
+ const name = component.name;
20
+ if (!name) return;
21
+
22
+ const lookupKey = `${type}:${name}`;
23
+ let childArray = [];
24
+
25
+ if (type === 'config') {
26
+ if (Array.isArray(component.children)) {
27
+ childArray = component.children;
28
+ }
29
+ } else {
30
+ if (component.config && Array.isArray(component.config.children)) {
31
+ childArray = component.config.children;
32
+ }
33
+ }
34
+
35
+ const fieldNames = childArray.map(f => f.name);
36
+ map[lookupKey] = { raw: component, fields: fieldNames };
37
+ });
38
+ });
39
+
40
+ return map;
41
+ }
42
+
43
+ function getRpkConnectVersion() {
44
+ try {
45
+ // Make sure the connect plugin is upgraded first (silent)
46
+ execSync('rpk connect upgrade', { stdio: 'ignore' });
47
+
48
+ // Now capture the --version output
49
+ const raw = execSync('rpk connect --version', {
50
+ stdio: ['ignore', 'pipe', 'ignore'],
51
+ })
52
+ .toString()
53
+ .trim();
54
+
55
+ // raw looks like:
56
+ // Version: 4.53.0
57
+ // Date: 2025-04-18T17:49:53Z
58
+ // We want to extract ā€œ4.53.0ā€
59
+ const match = raw.match(/^Version:\s*(.+)$/m);
60
+ if (!match) {
61
+ throw new Error(`Unexpected format from "rpk connect --version":\n${raw}`);
62
+ }
63
+ return match[1];
64
+ } catch (err) {
65
+ throw new Error(`Unable to run "rpk connect --version": ${err.message}`);
66
+ }
67
+ }
68
+
69
+ /**
70
+ * Given two ā€œindex objectsā€ (parsed from connect.json), produce a console summary of:
71
+ * • which connectors/components are brand-new
72
+ * • which new fields appeared under existing connectors (including ā€œconfigā€ entries)
73
+ * • for each new component/field, if the raw object contains ā€œversionā€ or ā€œintroducedInVersionā€ or ā€œrequiresVersionā€ metadata, print it
74
+ */
75
+ function printDeltaReport(oldIndex, newIndex) {
76
+ const oldMap = buildComponentMap(oldIndex);
77
+ const newMap = buildComponentMap(newIndex);
78
+
79
+ // 1) brand-new components
80
+ const newComponentKeys = Object.keys(newMap).filter(k => !(k in oldMap));
81
+
82
+ // 2) brand-new fields under shared components
83
+ const newFields = [];
84
+ Object.keys(newMap).forEach(cKey => {
85
+ if (!(cKey in oldMap)) return; // skip brand-new components here
86
+ const oldFields = new Set(oldMap[cKey].fields || []);
87
+ const newFieldsArr = newMap[cKey].fields || [];
88
+ newFieldsArr.forEach(fName => {
89
+ if (!oldFields.has(fName)) {
90
+ // fetch raw field metadata if available
91
+ const [type, compName] = cKey.split(':');
92
+ let rawFieldObj = null;
93
+ if (type === 'config') {
94
+ rawFieldObj = (newMap[cKey].raw.children || []).find(f => f.name === fName);
95
+ } else {
96
+ rawFieldObj = (newMap[cKey].raw.config?.children || []).find(f => f.name === fName);
97
+ }
98
+
99
+ let introducedIn = rawFieldObj && (rawFieldObj.introducedInVersion || rawFieldObj.version);
100
+ let requiresVer = rawFieldObj && rawFieldObj.requiresVersion;
101
+
102
+ newFields.push({
103
+ component: cKey,
104
+ field: fName,
105
+ introducedIn,
106
+ requiresVersion: requiresVer,
107
+ });
108
+ }
109
+ });
110
+ });
111
+
112
+ console.log('\nšŸ“‹ RPCN Connector Delta Report\n');
113
+
114
+ if (newComponentKeys.length) {
115
+ console.log('āž¤ Newly added components:');
116
+ newComponentKeys.forEach(key => {
117
+ const [type, name] = key.split(':');
118
+ const raw = newMap[key].raw;
119
+ const status = raw.status || raw.type || '';
120
+ const version = raw.version || raw.introducedInVersion || '';
121
+ console.log(
122
+ ` • ${type}/${name}${
123
+ status ? ` (${status})` : ''
124
+ }${version ? ` — introduced in ${version}` : ''}`
125
+ );
126
+ });
127
+ console.log('');
128
+ } else {
129
+ console.log('āž¤ No newly added components.\n');
130
+ }
131
+
132
+ if (newFields.length) {
133
+ console.log('āž¤ Newly added fields:');
134
+ newFields.forEach(entry => {
135
+ const { component, field, introducedIn, requiresVersion } = entry;
136
+ process.stdout.write(` • ${component} → ${field}`);
137
+ if (introducedIn) process.stdout.write(` (introducedIn: ${introducedIn})`);
138
+ if (requiresVersion) process.stdout.write(` (requiresVersion: ${requiresVersion})`);
139
+ console.log('');
140
+ });
141
+ console.log('');
142
+ } else {
143
+ console.log('āž¤ No newly added fields.\n');
144
+ }
145
+ }
146
+
147
+ module.exports = {
148
+ discoverComponentKeys,
149
+ buildComponentMap,
150
+ getRpkConnectVersion,
151
+ printDeltaReport,
152
+ };
@@ -0,0 +1,20 @@
1
+ = {{{name}}}
2
+ // tag::single-source[]
3
+ :type: {{type}}
4
+ :status: {{status}}
5
+ :categories: [{{join categories ", "}}]
6
+ :description: {{#if summary}}{{{summary}}}{{else if description}}{{description}}{{else}}TODO: Missing description. Add a description in the overrides file or source data.{{/if}}
7
+
8
+ component_type_dropdown::[]
9
+
10
+ {{> intro}}
11
+
12
+ {{#if (or this.config.children children)}}
13
+ include::redpanda-connect:components:partial$fields/{{type}}s/{{name}}.adoc[]
14
+ {{/if}}
15
+
16
+ {{#if this.examples}}
17
+ include::redpanda-connect:components:partial$examples/{{type}}s/{{name}}.adoc[]
18
+ {{/if}}
19
+
20
+ // end::single-source[]
@@ -0,0 +1,7 @@
1
+ {{#with examples}}
2
+ // This content is autogenerated. Do not edit manually.
3
+
4
+ == Examples
5
+
6
+ {{{renderConnectExamples this}}}
7
+ {{/with}}
@@ -0,0 +1,13 @@
1
+ {{#if this.config.children}}
2
+ // 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
3
+
4
+ == Fields
5
+
6
+ {{{renderConnectFields this.config.children}}}
7
+ {{else if this.children}}
8
+ // 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
9
+
10
+ == Fields
11
+
12
+ {{{renderConnectFields this.children}}}
13
+ {{/if}}
@@ -0,0 +1,35 @@
1
+ // This content is autogenerated. Do not edit manually. To override descriptions or summaries, 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
+
3
+ {{{summary}}}
4
+
5
+ {{#if version}}
6
+ ifndef::env-cloud[]
7
+ Introduced in version {{version}}.
8
+ endif::[]
9
+ {{/if}}
10
+
11
+ {{#if this.config.children}}
12
+ [tabs]
13
+ ======
14
+ Common::
15
+ +
16
+ --
17
+ ```yaml
18
+ {{{commonConfig this.type this.name this.config.children}}}
19
+ ```
20
+ --
21
+ Advanced::
22
+ +
23
+ --
24
+ ```yaml
25
+ {{{advancedConfig this.type this.name this.config.children}}}
26
+ ```
27
+ --
28
+ ======
29
+ {{/if}}
30
+
31
+ {{#if description}}
32
+ {{{description}}}
33
+ {{else}}
34
+ TODO: Missing description. Add a description in the overrides file or source data.
35
+ {{/if}}