@stackql/provider-utils 0.5.6 → 0.5.7
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 +1 -1
- package/src/docgen/generator.js +7 -5
- package/src/docgen/helpers.js +11 -5
- package/src/docgen/resource/examples/delete-example.js +2 -2
- package/src/docgen/resource/examples/exec-example.js +2 -2
- package/src/docgen/resource/examples/insert-example.js +2 -3
- package/src/docgen/resource/examples/select-example.js +2 -2
- package/src/docgen/resource/examples/update-example.js +2 -4
- package/src/docgen/resource/examples.js +10 -10
- package/src/docgen/resource/methods.js +2 -2
- package/src/docgen/resource-content.js +3 -2
package/package.json
CHANGED
package/src/docgen/generator.js
CHANGED
|
@@ -291,6 +291,7 @@ export async function generateDocsv2(options) {
|
|
|
291
291
|
outputDir, // e.g., 'website'
|
|
292
292
|
providerDataDir, // e.g., 'config/provider-data'
|
|
293
293
|
dereferenced = false,
|
|
294
|
+
succinct = false, // use summary instead of description for method/example descriptions
|
|
294
295
|
} = options;
|
|
295
296
|
|
|
296
297
|
console.log(`documenting ${providerName} (v2)...`);
|
|
@@ -338,7 +339,7 @@ export async function generateDocsv2(options) {
|
|
|
338
339
|
const filePath = path.join(serviceDir, file);
|
|
339
340
|
totalServicesCount++;
|
|
340
341
|
const serviceFolder = `${servicesDir}/${serviceName}`;
|
|
341
|
-
await createDocsForServicev2(filePath, providerName, serviceName, serviceFolder, dereferenced);
|
|
342
|
+
await createDocsForServicev2(filePath, providerName, serviceName, serviceFolder, dereferenced, succinct);
|
|
342
343
|
}
|
|
343
344
|
|
|
344
345
|
console.log(`Processed ${totalServicesCount} services`);
|
|
@@ -394,7 +395,7 @@ ${servicesToMarkdown(providerName, secondColumnServices)}
|
|
|
394
395
|
}
|
|
395
396
|
|
|
396
397
|
// v2 service processing - uses SchemaTable for collapsible nested fields
|
|
397
|
-
async function createDocsForServicev2(yamlFilePath, providerName, serviceName, serviceFolder, dereferenced = false) {
|
|
398
|
+
async function createDocsForServicev2(yamlFilePath, providerName, serviceName, serviceFolder, dereferenced = false, succinct = false) {
|
|
398
399
|
|
|
399
400
|
const data = yaml.load(fs.readFileSync(yamlFilePath, 'utf8'));
|
|
400
401
|
|
|
@@ -467,18 +468,18 @@ async function createDocsForServicev2(yamlFilePath, providerName, serviceName, s
|
|
|
467
468
|
|
|
468
469
|
// Process each resource in first column
|
|
469
470
|
for (const resource of firstColumn) {
|
|
470
|
-
await processResourcev2(providerName, serviceFolder, serviceName, resource);
|
|
471
|
+
await processResourcev2(providerName, serviceFolder, serviceName, resource, succinct);
|
|
471
472
|
}
|
|
472
473
|
|
|
473
474
|
// Process each resource in second column
|
|
474
475
|
for (const resource of secondColumn) {
|
|
475
|
-
await processResourcev2(providerName, serviceFolder, serviceName, resource);
|
|
476
|
+
await processResourcev2(providerName, serviceFolder, serviceName, resource, succinct);
|
|
476
477
|
}
|
|
477
478
|
|
|
478
479
|
console.log(`Generated documentation (v2) for ${serviceName}`);
|
|
479
480
|
}
|
|
480
481
|
|
|
481
|
-
async function processResourcev2(providerName, serviceFolder, serviceName, resource) {
|
|
482
|
+
async function processResourcev2(providerName, serviceFolder, serviceName, resource, succinct = false) {
|
|
482
483
|
console.log(`Processing resource (v2): ${resource.name}`);
|
|
483
484
|
|
|
484
485
|
const resourceFolder = path.join(serviceFolder, resource.name);
|
|
@@ -491,6 +492,7 @@ async function processResourcev2(providerName, serviceFolder, serviceName, resou
|
|
|
491
492
|
providerName,
|
|
492
493
|
serviceName,
|
|
493
494
|
resource,
|
|
495
|
+
succinct,
|
|
494
496
|
);
|
|
495
497
|
fs.writeFileSync(resourceIndexPath, resourceIndexContent);
|
|
496
498
|
|
package/src/docgen/helpers.js
CHANGED
|
@@ -134,7 +134,7 @@ export function getSqlMethodsWithOrderedFields(resourceData, dereferencedAPI, sq
|
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
// Get response and params using the same function as for SQL verbs
|
|
137
|
-
const { respProps, respDescription, opDescription, requestBody } = getHttpOperationInfo(
|
|
137
|
+
const { respProps, respDescription, opDescription, opSummary, requestBody } = getHttpOperationInfo(
|
|
138
138
|
dereferencedAPI,
|
|
139
139
|
resolvedPath,
|
|
140
140
|
resolvedVerb,
|
|
@@ -152,6 +152,7 @@ export function getSqlMethodsWithOrderedFields(resourceData, dereferencedAPI, sq
|
|
|
152
152
|
// Initialize the method with the same structure as SQL methods
|
|
153
153
|
methods[methodName] = {
|
|
154
154
|
opDescription,
|
|
155
|
+
opSummary,
|
|
155
156
|
respDescription,
|
|
156
157
|
properties: {},
|
|
157
158
|
requiredParams: requiredParams || {},
|
|
@@ -177,12 +178,13 @@ export function getSqlMethodsWithOrderedFields(resourceData, dereferencedAPI, sq
|
|
|
177
178
|
|
|
178
179
|
for (const thisMethod of resourceData.sqlVerbs[sqlVerb]) {
|
|
179
180
|
const {path, httpVerb, mediaType, openAPIDocKey, objectKey, methodName} = getHttpOperationForSqlVerb(thisMethod.$ref, resourceData);
|
|
180
|
-
const {respProps, respDescription, opDescription, requestBody} = getHttpOperationInfo(dereferencedAPI, path, httpVerb, mediaType, openAPIDocKey, objectKey);
|
|
181
|
+
const {respProps, respDescription, opDescription, opSummary, requestBody} = getHttpOperationInfo(dereferencedAPI, path, httpVerb, mediaType, openAPIDocKey, objectKey);
|
|
181
182
|
const {requiredParams, optionalParams} = getHttpOperationParams(dereferencedAPI, path, httpVerb);
|
|
182
183
|
|
|
183
184
|
// Initialize the method object with description and params
|
|
184
185
|
methods[methodName] = {
|
|
185
186
|
opDescription,
|
|
187
|
+
opSummary,
|
|
186
188
|
respDescription,
|
|
187
189
|
properties: {},
|
|
188
190
|
requiredParams: requiredParams || {},
|
|
@@ -383,8 +385,9 @@ function getHttpOperationInfo(dereferencedAPI, path, httpVerb, mediaType, openAP
|
|
|
383
385
|
throw new Error(`HTTP verb '${httpVerb}' not found for path '${path}'`);
|
|
384
386
|
}
|
|
385
387
|
|
|
386
|
-
// Get operation description
|
|
388
|
+
// Get operation description and summary
|
|
387
389
|
const opDescription = (dereferencedAPI.paths[path][httpVerb].description || '');
|
|
390
|
+
const opSummary = (dereferencedAPI.paths[path][httpVerb].summary || '');
|
|
388
391
|
|
|
389
392
|
// Extract request body if it exists
|
|
390
393
|
let requestBody = {};
|
|
@@ -474,19 +477,21 @@ function getHttpOperationInfo(dereferencedAPI, path, httpVerb, mediaType, openAP
|
|
|
474
477
|
respProps: {},
|
|
475
478
|
respDescription: '',
|
|
476
479
|
opDescription,
|
|
480
|
+
opSummary,
|
|
477
481
|
requestBody
|
|
478
482
|
};
|
|
479
483
|
}
|
|
480
|
-
|
|
484
|
+
|
|
481
485
|
// Check if there's a content section with the mediaType
|
|
482
486
|
const responseObj = dereferencedAPI.paths[path][httpVerb].responses[openAPIDocKey];
|
|
483
|
-
|
|
487
|
+
|
|
484
488
|
// If no content or no mediaType in the response, return empty properties
|
|
485
489
|
if (!responseObj.content || !mediaType || !responseObj.content[mediaType] || !responseObj.content[mediaType].schema) {
|
|
486
490
|
return {
|
|
487
491
|
respProps: {},
|
|
488
492
|
respDescription: responseObj.description || '',
|
|
489
493
|
opDescription,
|
|
494
|
+
opSummary,
|
|
490
495
|
requestBody
|
|
491
496
|
};
|
|
492
497
|
}
|
|
@@ -499,6 +504,7 @@ function getHttpOperationInfo(dereferencedAPI, path, httpVerb, mediaType, openAP
|
|
|
499
504
|
respProps,
|
|
500
505
|
respDescription: responseObj.description ? responseObj.description : respDescription,
|
|
501
506
|
opDescription,
|
|
507
|
+
opSummary,
|
|
502
508
|
requestBody
|
|
503
509
|
};
|
|
504
510
|
}
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
sanitizeHtml,
|
|
5
5
|
} from '../../helpers.js';
|
|
6
6
|
|
|
7
|
-
export function createDeleteExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI) {
|
|
7
|
+
export function createDeleteExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI, succinct = false) {
|
|
8
8
|
const deleteMethods = getSqlMethodsWithOrderedFields(resourceData, dereferencedAPI, 'delete');
|
|
9
9
|
|
|
10
10
|
// if there are no delete methods, return empty content
|
|
@@ -30,7 +30,7 @@ export function createDeleteExamples(providerName, serviceName, resourceName, re
|
|
|
30
30
|
content += '<TabItem value="' + methodName + '">\n\n';
|
|
31
31
|
|
|
32
32
|
// Add method description
|
|
33
|
-
const opDescription = methodDetails.opDescription || 'No description available.';
|
|
33
|
+
const opDescription = (succinct && methodDetails.opSummary) ? methodDetails.opSummary : (methodDetails.opDescription || 'No description available.');
|
|
34
34
|
content += sanitizeHtml(opDescription);
|
|
35
35
|
|
|
36
36
|
// Create SQL example
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
sanitizeHtml
|
|
5
5
|
} from '../../helpers.js';
|
|
6
6
|
|
|
7
|
-
export function createExecExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI) {
|
|
7
|
+
export function createExecExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI, succinct = false) {
|
|
8
8
|
const execMethods = getSqlMethodsWithOrderedFields(resourceData, dereferencedAPI, 'exec');
|
|
9
9
|
|
|
10
10
|
// if there are no exec methods, return empty content
|
|
@@ -30,7 +30,7 @@ export function createExecExamples(providerName, serviceName, resourceName, reso
|
|
|
30
30
|
content += '<TabItem value="' + methodName + '">\n\n';
|
|
31
31
|
|
|
32
32
|
// Add method description
|
|
33
|
-
const opDescription = methodDetails.opDescription || methodDetails.respDescription || 'No description available.';
|
|
33
|
+
const opDescription = (succinct && methodDetails.opSummary) ? methodDetails.opSummary : (methodDetails.opDescription || methodDetails.respDescription || 'No description available.');
|
|
34
34
|
content += sanitizeHtml(opDescription);
|
|
35
35
|
|
|
36
36
|
// Create SQL example
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
sanitizeHtml
|
|
5
5
|
} from '../../helpers.js';
|
|
6
6
|
|
|
7
|
-
export function createInsertExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI) {
|
|
7
|
+
export function createInsertExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI, succinct = false) {
|
|
8
8
|
const insertMethods = getSqlMethodsWithOrderedFields(resourceData, dereferencedAPI, 'insert');
|
|
9
9
|
|
|
10
10
|
// if there are no insert methods, return empty content
|
|
@@ -34,9 +34,8 @@ export function createInsertExamples(providerName, serviceName, resourceName, re
|
|
|
34
34
|
content += '<TabItem value="' + methodName + '">\n\n';
|
|
35
35
|
|
|
36
36
|
// Add method description
|
|
37
|
-
const opDescription = methodDetails.opDescription || 'No description available.';
|
|
37
|
+
const opDescription = (succinct && methodDetails.opSummary) ? methodDetails.opSummary : (methodDetails.opDescription || 'No description available.');
|
|
38
38
|
content += sanitizeHtml(opDescription);
|
|
39
|
-
// content += methodDetails.opDescription || 'No description available.';
|
|
40
39
|
|
|
41
40
|
// Create SQL example
|
|
42
41
|
content += '\n\n```sql\nINSERT INTO ' + providerName + '.' + serviceName + '.' + resourceName + ' (\n';
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
sanitizeHtml
|
|
5
5
|
} from '../../helpers.js';
|
|
6
6
|
|
|
7
|
-
export function createSelectExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI) {
|
|
7
|
+
export function createSelectExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI, succinct = false) {
|
|
8
8
|
const selectMethods = getSqlMethodsWithOrderedFields(resourceData, dereferencedAPI, 'select');
|
|
9
9
|
|
|
10
10
|
// if there are no select methods, return empty content
|
|
@@ -30,7 +30,7 @@ export function createSelectExamples(providerName, serviceName, resourceName, re
|
|
|
30
30
|
content += '<TabItem value="' + methodName + '">\n\n';
|
|
31
31
|
// content += methodDetails.opDescription || 'No description available.';
|
|
32
32
|
// Add method description
|
|
33
|
-
const opDescription = methodDetails.opDescription || methodDetails.respDescription || 'No description available.';
|
|
33
|
+
const opDescription = (succinct && methodDetails.opSummary) ? methodDetails.opSummary : (methodDetails.opDescription || methodDetails.respDescription || 'No description available.');
|
|
34
34
|
content += sanitizeHtml(opDescription);
|
|
35
35
|
|
|
36
36
|
// Create SQL example
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
sanitizeHtml
|
|
5
5
|
} from '../../helpers.js';
|
|
6
6
|
|
|
7
|
-
export function createUpdateExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI, isReplace = false) {
|
|
7
|
+
export function createUpdateExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI, isReplace = false, succinct = false) {
|
|
8
8
|
const updateMethods = getSqlMethodsWithOrderedFields(resourceData, dereferencedAPI, isReplace ? 'replace' : 'update');
|
|
9
9
|
|
|
10
10
|
// if there are no update methods, return empty content
|
|
@@ -34,10 +34,8 @@ export function createUpdateExamples(providerName, serviceName, resourceName, re
|
|
|
34
34
|
Object.entries(updateMethods).forEach(([methodName, methodDetails]) => {
|
|
35
35
|
content += '<TabItem value="' + methodName + '">\n\n';
|
|
36
36
|
|
|
37
|
-
// // Add method description
|
|
38
|
-
// content += methodDetails.opDescription || methodDetails.respDescription || 'No description available.';
|
|
39
37
|
// Add method description
|
|
40
|
-
const opDescription = methodDetails.opDescription || 'No description available.';
|
|
38
|
+
const opDescription = (succinct && methodDetails.opSummary) ? methodDetails.opSummary : (methodDetails.opDescription || 'No description available.');
|
|
41
39
|
content += sanitizeHtml(opDescription);
|
|
42
40
|
|
|
43
41
|
// Create SQL example
|
|
@@ -6,26 +6,26 @@ import { createUpdateExamples } from './examples/update-example.js';
|
|
|
6
6
|
import { createDeleteExamples } from './examples/delete-example.js';
|
|
7
7
|
import { createExecExamples } from './examples/exec-example.js';
|
|
8
8
|
|
|
9
|
-
export function createExamplesSection(providerName, serviceName, resourceName, resourceData, dereferencedAPI) {
|
|
9
|
+
export function createExamplesSection(providerName, serviceName, resourceName, resourceData, dereferencedAPI, succinct = false) {
|
|
10
10
|
let content = '';
|
|
11
|
-
|
|
11
|
+
|
|
12
12
|
// Add SELECT examples
|
|
13
|
-
content += createSelectExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI);
|
|
13
|
+
content += createSelectExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI, succinct);
|
|
14
14
|
|
|
15
15
|
// Add INSERT examples
|
|
16
|
-
content += createInsertExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI);
|
|
17
|
-
|
|
16
|
+
content += createInsertExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI, succinct);
|
|
17
|
+
|
|
18
18
|
// Add UPDATE examples
|
|
19
|
-
content += createUpdateExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI, false);
|
|
20
|
-
|
|
19
|
+
content += createUpdateExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI, false, succinct);
|
|
20
|
+
|
|
21
21
|
// Add REPLACE examples
|
|
22
|
-
content += createUpdateExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI, true);
|
|
22
|
+
content += createUpdateExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI, true, succinct);
|
|
23
23
|
|
|
24
24
|
// Add DELETE examples
|
|
25
|
-
content += createDeleteExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI);
|
|
25
|
+
content += createDeleteExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI, succinct);
|
|
26
26
|
|
|
27
27
|
// Add EXEC examples
|
|
28
|
-
content += createExecExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI);
|
|
28
|
+
content += createExecExamples(providerName, serviceName, resourceName, resourceData, dereferencedAPI, succinct);
|
|
29
29
|
|
|
30
30
|
return content;
|
|
31
31
|
}
|
|
@@ -22,7 +22,7 @@ const getRequiredBodyParams = (methodDetails, accessType) => {
|
|
|
22
22
|
}
|
|
23
23
|
};
|
|
24
24
|
|
|
25
|
-
export function createMethodsSection(resourceData, dereferencedAPI) {
|
|
25
|
+
export function createMethodsSection(resourceData, dereferencedAPI, succinct = false) {
|
|
26
26
|
|
|
27
27
|
let content = `\n## Methods\n\n`;
|
|
28
28
|
|
|
@@ -80,7 +80,7 @@ export function createMethodsSection(resourceData, dereferencedAPI) {
|
|
|
80
80
|
<td><CopyableCode code="${accessType}" /></td>
|
|
81
81
|
<td>${requiredParamsStr}</td>
|
|
82
82
|
<td>${optionalParamsStr}</td>
|
|
83
|
-
<td>${sanitizeHtml(methodDetails.opDescription)}</td>
|
|
83
|
+
<td>${sanitizeHtml(succinct && methodDetails.opSummary ? methodDetails.opSummary : methodDetails.opDescription)}</td>
|
|
84
84
|
</tr>`;
|
|
85
85
|
}
|
|
86
86
|
};
|
|
@@ -26,13 +26,14 @@ export async function createResourceIndexContentv2(
|
|
|
26
26
|
providerName,
|
|
27
27
|
serviceName,
|
|
28
28
|
resource,
|
|
29
|
+
succinct = false,
|
|
29
30
|
) {
|
|
30
31
|
// Generate each section of the documentation (v2 uses SchemaTable for fields)
|
|
31
32
|
const overviewContent = createOverviewSectionv2(resource.name, resource.type, resource.description, providerName, serviceName);
|
|
32
33
|
const fieldsContent = createFieldsSectionv2(resource.type, resource.resourceData, resource.dereferencedAPI);
|
|
33
|
-
const methodsContent = resource.type === 'Resource' ? createMethodsSection(resource.resourceData, resource.dereferencedAPI) : '';
|
|
34
|
+
const methodsContent = resource.type === 'Resource' ? createMethodsSection(resource.resourceData, resource.dereferencedAPI, succinct) : '';
|
|
34
35
|
const paramsContent = resource.type === 'Resource' ? createParamsSection(resource.resourceData, resource.dereferencedAPI) : '';
|
|
35
|
-
const examplesContent = resource.type === 'Resource' ? createExamplesSection(providerName, serviceName, resource.name, resource.resourceData, resource.dereferencedAPI) : '';
|
|
36
|
+
const examplesContent = resource.type === 'Resource' ? createExamplesSection(providerName, serviceName, resource.name, resource.resourceData, resource.dereferencedAPI, succinct) : '';
|
|
36
37
|
|
|
37
38
|
// Combine all sections into the final content
|
|
38
39
|
return `${overviewContent}${fieldsContent}${methodsContent}${paramsContent}${examplesContent}`;
|