@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stackql/provider-utils",
3
- "version": "0.5.6",
3
+ "version": "0.5.7",
4
4
  "description": "Utilities for building StackQL providers from OpenAPI specifications.",
5
5
  "type": "module",
6
6
  "main": "./src/index.js",
@@ -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
 
@@ -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}`;