Skip to content

Commit dc3c94c

Browse files
committed
Enhance OpenAPI generation by adding dynamic tag handling and updating version to 1.2.0 #4
1 parent 4dbe7a2 commit dc3c94c

File tree

4 files changed

+35
-20
lines changed

4 files changed

+35
-20
lines changed

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2019 Deni Baskovsky
3+
Copyright (c) 2019 Denis Baskovsky
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

index.js

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ async function openapiJsonrpcJsdoc({ files, securitySchemes = {}, packageUrl, se
1313
dictionaries: ['jsdoc'],
1414
hierarchy: true,
1515
});
16+
const tags = [];
1617
const temporaryDocument = {
1718
'x-send-defaults': true,
1819
'openapi': '3.0.0',
@@ -21,7 +22,7 @@ async function openapiJsonrpcJsdoc({ files, securitySchemes = {}, packageUrl, se
2122
'x-explorer-enabled': true,
2223
'x-proxy-enabled': true,
2324
'x-samples-enabled': true,
24-
'x-samples-languages': ['curl', 'node', 'javascript'],
25+
'x-samples-languages': ['node', 'javascript'],
2526
'info': {
2627
version: package_.version,
2728
title: package_.name,
@@ -58,17 +59,25 @@ async function openapiJsonrpcJsdoc({ files, securitySchemes = {}, packageUrl, se
5859
BasicAuth: [],
5960
},
6061
],
61-
'tags': [],
62+
'tags': tags,
6263
};
64+
const requiredSchema = ['method', 'id', 'jsonrpc'];
6365
for (const module of documents) {
6466
const apiName = module.meta.filename.replace(/.js$/, '');
67+
68+
if (module.tags && Array.isArray(module.tags)) {
69+
for (const tag of module.tags) {
70+
tags.push(...new Set(tag.value.split(',').map(t => t.trim())));
71+
}
72+
}
73+
6574
const schema = {
6675
post: {
6776
operationId: `${module.meta.filename}`,
6877
deprecated: module.deprecated || false,
6978
summary: `/${apiName}`,
7079
description: module.description,
71-
tags: ['JSONRPC'],
80+
tags: tags,
7281
parameters: [],
7382
responses: {
7483
'200': {
@@ -97,7 +106,7 @@ async function openapiJsonrpcJsdoc({ files, securitySchemes = {}, packageUrl, se
97106
'application/json': {
98107
schema: {
99108
type: 'object',
100-
required: ['method', 'id', 'jsonrpc'],
109+
required: requiredSchema,
101110
properties: {
102111
method: {
103112
type: 'string',
@@ -114,7 +123,7 @@ async function openapiJsonrpcJsdoc({ files, securitySchemes = {}, packageUrl, se
114123
jsonrpc: {
115124
type: 'string',
116125
default: '2.0',
117-
description: 'JSON-RPC Version (2.0)',
126+
description: 'JSON-RPC 2.0 protocol',
118127
},
119128
},
120129
},
@@ -124,10 +133,15 @@ async function openapiJsonrpcJsdoc({ files, securitySchemes = {}, packageUrl, se
124133
},
125134
};
126135
if (module.params) {
136+
let exampleJSON = null;
137+
if (module.examples?.length) {
138+
exampleJSON = JSON.parse(module.examples[0]);
139+
}
140+
127141
const propertiesParameters = module.params.reduce(
128142
(accumulator, parameter) => {
129143
if (!parameter.type) {
130-
throw new Error('JSDOC parameter error: ' + apiName);
144+
throw new Error('JSDoc parameter error: ' + apiName);
131145
}
132146
// todo поддержать не только object поле в аргументе функции
133147
if (parameter.type.names[0] === 'object') {
@@ -141,7 +155,9 @@ async function openapiJsonrpcJsdoc({ files, securitySchemes = {}, packageUrl, se
141155
} catch {
142156
name = parameter.name;
143157
}
144-
accumulator.required.push(name);
158+
if (!parameter.optional) {
159+
accumulator.required.push(name);
160+
}
145161
accumulator.properties = {
146162
...accumulator.properties,
147163
[name]: {
@@ -154,17 +170,14 @@ async function openapiJsonrpcJsdoc({ files, securitySchemes = {}, packageUrl, se
154170
{
155171
title: 'Parameters',
156172
type: 'object',
157-
'default': module.examples?.length ? JSON.parse(module.examples[0]) : null,
158-
required: ['method', 'id', 'jsonrpc'],
173+
'default': exampleJSON,
174+
required: requiredSchema,
159175
properties: {},
160176
},
161177
);
162-
schema.post.requestBody.content['application/json'].schema.required.push(
163-
'params',
164-
);
165-
schema.post.requestBody.content[
166-
'application/json'
167-
].schema.properties.params = propertiesParameters;
178+
const schemaPostJsdoc = schema.post.requestBody.content['application/json'].schema;
179+
schemaPostJsdoc.required.push('params');
180+
schemaPostJsdoc.properties.params = propertiesParameters;
168181
}
169182
temporaryDocument.paths[`${api}${apiName}`] = schema;
170183
}

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "openapi-jsonrpc-jsdoc",
3-
"version": "1.1.2",
4-
"description": "OpenAPI generator",
3+
"version": "1.2.0",
4+
"description": "Transform JSDoc-annotated JSON-RPC 2.0 methods into OpenAPI 3.0 specifications. Auto-generates REST API documentation with complete schemas, parameters, and endpoint definitions.",
55
"main": "index.js",
66
"scripts": {
77
"test": "NODE_NO_WARNINGS=1 ava test/*.test.js"
@@ -33,9 +33,9 @@
3333
"devDependencies": {
3434
"ava": "~3.15.0",
3535
"express": "~5.1.0",
36-
"express-openapi-validator": "~5.5.3"
36+
"express-openapi-validator": "~5.6.0"
3737
},
3838
"engines": {
39-
"node": ">= 16"
39+
"node": ">= 18"
4040
}
4141
}

test/api/v1.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
* @description Название API
33
* @param {object} parameters - params
44
* @param {string} parameters.id - id
5+
* @param {string} [parameters.test] - test
6+
* @tags api, api-v1, api
57
* @example
68
* {
79
* "@context": "https://www.w3.org/ns/activitystreams",

0 commit comments

Comments
 (0)