@visulima/jsdoc-open-api 2.0.0 → 2.0.1

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/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ ## @visulima/jsdoc-open-api [2.0.1](https://github.com/visulima/visulima/compare/@visulima/jsdoc-open-api@2.0.0...@visulima/jsdoc-open-api@2.0.1) (2023-08-29)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * fixed wrong settings for node 18+ in typescript ([ac6711f](https://github.com/visulima/visulima/commit/ac6711fd2b4fdc5506b03e3a6ae25bb983aa6ea3))
7
+ * remove unused files and refactor imports and typings ([ba2ab03](https://github.com/visulima/visulima/commit/ba2ab03d2d7aff5f49c4d6714a61b99706778f19))
8
+ * updated various package dependencies and optimized code formatting. ([5d71d91](https://github.com/visulima/visulima/commit/5d71d913e857b71a7b741abe848780aaa22d679f))
9
+
10
+
11
+
12
+ ### Dependencies
13
+
14
+ * **@visulima/readdir:** upgraded to 2.0.1
15
+
1
16
  ## @visulima/jsdoc-open-api [2.0.0](https://github.com/visulima/visulima/compare/@visulima/jsdoc-open-api@1.3.12...@visulima/jsdoc-open-api@2.0.0) (2023-08-28)
2
17
 
3
18
 
@@ -1,22 +1,22 @@
1
1
  'use strict';
2
2
 
3
- var chunkD7VYGB4A_js = require('./chunk-D7VYGB4A.js');
3
+ var chunkVNK4L5RV_js = require('./chunk-VNK4L5RV.js');
4
4
  var fs = require('fs');
5
5
  var path = require('path');
6
6
  var url = require('url');
7
7
  var y = require('cli-progress');
8
8
  var readdir = require('@visulima/readdir');
9
- var P = require('read-pkg-up');
9
+ var _ = require('read-pkg-up');
10
10
 
11
11
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
12
12
 
13
13
  var y__default = /*#__PURE__*/_interopDefault(y);
14
- var P__default = /*#__PURE__*/_interopDefault(P);
14
+ var ___default = /*#__PURE__*/_interopDefault(_);
15
15
 
16
- var F=async(r,l,e)=>{let o={exclude:[],swaggerDefinition:{}};try{let s=await import(url.pathToFileURL(path.normalize(e.config??r)).href);s?.default&&(s=s.default),o=s;}catch{throw new Error(`No config file found, on: ${e.config??".openapirc.js"}
17
- `)}let n=new y__default.default.MultiBar({clearOnComplete:!1,format:"{value}/{total} | {bar} | {filename}",hideCursor:!0},y__default.default.Presets.shades_grey),t=new chunkD7VYGB4A_js.d(o.swaggerDefinition);for await(let s of l){fs.lstatSync(s).isDirectory();let a=await readdir.collect(s,{extensions:o.extensions??[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],followSymlinks:o.followSymlinks??!1,match:o.include,minimatchOptions:{match:{debug:e.verbose,matchBase:!0},skip:{debug:e.verbose,matchBase:!0}},skip:[...o.exclude,"node_modules/**"]});(e.verbose??e.veryVerbose)&&console.log(`
18
- Found ${a.length} files in ${s}`),e.veryVerbose&&console.log(a);let w=n.create(a.length,0);a.forEach(c=>{e.verbose&&console.log(`Parsing file ${c}`),w.increment(1,{filename:s});let j=chunkD7VYGB4A_js.c(c,chunkD7VYGB4A_js.a,e.verbose);t.addData(j.map(m=>m.spec));let k=chunkD7VYGB4A_js.c(c,chunkD7VYGB4A_js.e,e.verbose);t.addData(k.map(m=>m.spec));});}e.verbose&&console.log("Validating swagger spec"),e.veryVerbose&&console.log(JSON.stringify(t,null,2)),await chunkD7VYGB4A_js.f(JSON.parse(JSON.stringify(t)));let i=e.output??"swagger.json";n.stop(),e.verbose&&console.log(`Written swagger spec to "${i}" file`),fs.mkdirSync(path.dirname(i),{recursive:!0}),fs.writeFileSync(i,JSON.stringify(t,null,2)),console.log(`
19
- Swagger specification is ready, check the "${i}" file.`);},L=F;var _=(r,l=process.cwd())=>{if(fs.existsSync(r))throw new Error("Config file already exists");let e=P__default.default.sync({cwd:fs.realpathSync(l)}),o="module.exports =";if(e){let{packageJson:n,path:t}=e;console.info(`Found package.json at "${t}"`),n.type==="module"&&(console.info("Found package.json with type: module, using ES6 as export for the config file"),o="export default");}else console.info("No package.json found");fs.writeFileSync(r,`${o} {
16
+ var J=async(r,l,e)=>{let o={exclude:[],swaggerDefinition:{}};try{let s=await import(url.pathToFileURL(path.normalize(e.config??r)).href);s?.default&&(s=s.default),o=s;}catch{throw new Error(`No config file found, on: ${e.config??".openapirc.js"}
17
+ `)}let n=new y__default.default.MultiBar({clearOnComplete:!1,format:"{value}/{total} | {bar} | {filename}",hideCursor:!0},y__default.default.Presets.shades_grey),t=new chunkVNK4L5RV_js.d(o.swaggerDefinition);for await(let s of l){fs.lstatSync(s).isDirectory();let a=await readdir.collect(s,{extensions:o.extensions??[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],followSymlinks:o.followSymlinks??!1,match:o.include,minimatchOptions:{match:{debug:e.verbose,matchBase:!0},skip:{debug:e.verbose,matchBase:!0}},skip:[...o.exclude,"node_modules/**"]});(e.verbose??e.veryVerbose)&&console.log(`
18
+ Found ${a.length} files in ${s}`),e.veryVerbose&&console.log(a);let w=n.create(a.length,0);a.forEach(c=>{e.verbose&&console.log(`Parsing file ${c}`),w.increment(1,{filename:s});let j=chunkVNK4L5RV_js.c(c,chunkVNK4L5RV_js.a,e.verbose);t.addData(j.map(m=>m.spec));let k=chunkVNK4L5RV_js.c(c,chunkVNK4L5RV_js.e,e.verbose);t.addData(k.map(m=>m.spec));});}e.verbose&&console.log("Validating swagger spec"),e.veryVerbose&&console.log(JSON.stringify(t,null,2)),await chunkVNK4L5RV_js.f(JSON.parse(JSON.stringify(t)));let i=e.output??"swagger.json";n.stop(),e.verbose&&console.log(`Written swagger spec to "${i}" file`),fs.mkdirSync(path.dirname(i),{recursive:!0}),fs.writeFileSync(i,JSON.stringify(t,null,2)),console.log(`
19
+ Swagger specification is ready, check the "${i}" file.`);},M=J;var B=(r,l=process.cwd())=>{if(fs.existsSync(r))throw new Error("Config file already exists");let e=___default.default.sync({cwd:fs.realpathSync(l)}),o="module.exports =";if(e){let{packageJson:n,path:t}=e;console.info(`Found package.json at "${t}"`),n.type==="module"&&(console.info("Found package.json with type: module, using ES6 as export for the config file"),o="export default");}else console.info("No package.json found");fs.writeFileSync(r,`${o} {
20
20
  exclude: [
21
21
  'coverage/**',
22
22
  '.github/**',
@@ -50,9 +50,9 @@ Swagger specification is ready, check the "${i}" file.`);},L=F;var _=(r,l=proces
50
50
  },
51
51
  },
52
52
  };
53
- `),console.log(`Created "${r}"`);},G=_;
53
+ `),console.log(`Created "${r}"`);},K=B;
54
54
 
55
- exports.a = L;
56
- exports.b = G;
55
+ exports.a = M;
56
+ exports.b = K;
57
57
  //# sourceMappingURL=out.js.map
58
- //# sourceMappingURL=chunk-GBW65CGH.js.map
58
+ //# sourceMappingURL=chunk-MXORJ2KC.js.map
@@ -1,15 +1,15 @@
1
- import { d, c, a, e, f } from './chunk-WHYPHVY6.mjs';
1
+ import { d, c, a, e, f } from './chunk-YQIJE75F.mjs';
2
2
  import { lstatSync, mkdirSync, writeFileSync, existsSync, realpathSync } from 'fs';
3
3
  import { normalize, dirname } from 'path';
4
4
  import { pathToFileURL } from 'url';
5
5
  import y from 'cli-progress';
6
6
  import { collect } from '@visulima/readdir';
7
- import P from 'read-pkg-up';
7
+ import B from 'read-pkg-up';
8
8
 
9
- var F=async(r,l,e$1)=>{let o={exclude:[],swaggerDefinition:{}};try{let s=await import(pathToFileURL(normalize(e$1.config??r)).href);s?.default&&(s=s.default),o=s;}catch{throw new Error(`No config file found, on: ${e$1.config??".openapirc.js"}
9
+ var $=async(r,l,e$1)=>{let o={exclude:[],swaggerDefinition:{}};try{let s=await import(pathToFileURL(normalize(e$1.config??r)).href);s?.default&&(s=s.default),o=s;}catch{throw new Error(`No config file found, on: ${e$1.config??".openapirc.js"}
10
10
  `)}let n=new y.MultiBar({clearOnComplete:!1,format:"{value}/{total} | {bar} | {filename}",hideCursor:!0},y.Presets.shades_grey),t=new d(o.swaggerDefinition);for await(let s of l){lstatSync(s).isDirectory();let a$1=await collect(s,{extensions:o.extensions??[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],followSymlinks:o.followSymlinks??!1,match:o.include,minimatchOptions:{match:{debug:e$1.verbose,matchBase:!0},skip:{debug:e$1.verbose,matchBase:!0}},skip:[...o.exclude,"node_modules/**"]});(e$1.verbose??e$1.veryVerbose)&&console.log(`
11
11
  Found ${a$1.length} files in ${s}`),e$1.veryVerbose&&console.log(a$1);let w=n.create(a$1.length,0);a$1.forEach(c$1=>{e$1.verbose&&console.log(`Parsing file ${c$1}`),w.increment(1,{filename:s});let j=c(c$1,a,e$1.verbose);t.addData(j.map(m=>m.spec));let k=c(c$1,e,e$1.verbose);t.addData(k.map(m=>m.spec));});}e$1.verbose&&console.log("Validating swagger spec"),e$1.veryVerbose&&console.log(JSON.stringify(t,null,2)),await f(JSON.parse(JSON.stringify(t)));let i=e$1.output??"swagger.json";n.stop(),e$1.verbose&&console.log(`Written swagger spec to "${i}" file`),mkdirSync(dirname(i),{recursive:!0}),writeFileSync(i,JSON.stringify(t,null,2)),console.log(`
12
- Swagger specification is ready, check the "${i}" file.`);},L=F;var _=(r,l=process.cwd())=>{if(existsSync(r))throw new Error("Config file already exists");let e=P.sync({cwd:realpathSync(l)}),o="module.exports =";if(e){let{packageJson:n,path:t}=e;console.info(`Found package.json at "${t}"`),n.type==="module"&&(console.info("Found package.json with type: module, using ES6 as export for the config file"),o="export default");}else console.info("No package.json found");writeFileSync(r,`${o} {
12
+ Swagger specification is ready, check the "${i}" file.`);},W=$;var V=(r,l=process.cwd())=>{if(existsSync(r))throw new Error("Config file already exists");let e=B.sync({cwd:realpathSync(l)}),o="module.exports =";if(e){let{packageJson:n,path:t}=e;console.info(`Found package.json at "${t}"`),n.type==="module"&&(console.info("Found package.json with type: module, using ES6 as export for the config file"),o="export default");}else console.info("No package.json found");writeFileSync(r,`${o} {
13
13
  exclude: [
14
14
  'coverage/**',
15
15
  '.github/**',
@@ -43,8 +43,8 @@ Swagger specification is ready, check the "${i}" file.`);},L=F;var _=(r,l=proces
43
43
  },
44
44
  },
45
45
  };
46
- `),console.log(`Created "${r}"`);},G=_;
46
+ `),console.log(`Created "${r}"`);},Q=V;
47
47
 
48
- export { L as a, G as b };
48
+ export { W as a, Q as b };
49
49
  //# sourceMappingURL=out.js.map
50
- //# sourceMappingURL=chunk-W7GBDROK.mjs.map
50
+ //# sourceMappingURL=chunk-NGEOD27G.mjs.map
@@ -1,33 +1,33 @@
1
1
  'use strict';
2
2
 
3
3
  var commentParser = require('comment-parser');
4
- var A = require('lodash.mergewith');
4
+ var v = require('lodash.mergewith');
5
5
  var fs = require('fs');
6
- var q = require('path');
7
- var R = require('yaml');
8
- var H = require('@apidevtools/swagger-parser');
6
+ var R = require('path');
7
+ var L = require('yaml');
8
+ var U = require('@apidevtools/swagger-parser');
9
9
 
10
10
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
11
 
12
- var A__default = /*#__PURE__*/_interopDefault(A);
13
- var q__default = /*#__PURE__*/_interopDefault(q);
12
+ var v__default = /*#__PURE__*/_interopDefault(v);
14
13
  var R__default = /*#__PURE__*/_interopDefault(R);
15
- var H__default = /*#__PURE__*/_interopDefault(H);
14
+ var L__default = /*#__PURE__*/_interopDefault(L);
15
+ var U__default = /*#__PURE__*/_interopDefault(U);
16
16
 
17
- var E=(t,s)=>{if(Array.isArray(t))return [...t,...s]},m=E;var v=t=>{t.security&&(t.security=Object.keys(t.security).map(s=>({[s]:t.security[s]})));},w=new Set(["integer","number","string","boolean","object","array"]),y={binary:"string",byte:"string",date:"string","date-time":"string",double:"number",float:"number",int32:"integer",int64:"integer",password:"string"},k=t=>{let s=t.type,r=s.endsWith("[]"),e=s.replace(/\[]$/,""),a=w.has(e),n=Object.keys(y).includes(e),o;if(t.default)switch(e){case"integer":case"int32":case"int64":{o=Number.parseInt(t.default,10);break}case"number":case"double":case"float":{o=Number.parseFloat(t.default);break}default:{o=t.default;break}}let i;a?i={default:o,type:e}:n?i={default:o,format:e,type:y[e]}:i={$ref:`#/components/schemas/${e}`};let c=r?{items:{...i},type:"array"}:{...i};e===""&&(c=void 0);let p=t.description.trim().replace(/^- /,"");return p===""&&(p=void 0),{description:p,name:t.name,rawType:s,required:!t.optional,schema:c}},P=(t,s)=>t.map(r=>{let e=k(r),a="";switch(e.name&&(a+=e.name),e.description&&(a+=` ${e.description.trim()}`),r.tag){case"operationId":case"summary":case"description":return {[r.tag]:a};case"deprecated":return {deprecated:!0};case"externalDocs":return {externalDocs:{description:e.description,url:e.name}};case"server":return {servers:[{description:e.description,url:e.name}]};case"tag":return {tags:[a]};case"cookieParam":case"headerParam":case"queryParam":case"pathParam":return {parameters:[{description:e.description,in:r.tag.replace(/Param$/,""),name:e.name,required:e.required,schema:e.schema}]};case"bodyContent":return {requestBody:{content:{[e.name.replace("*\\/*","*/*")]:{schema:e.schema}}}};case"bodyExample":{let[n,o]=e.name.split(".");return {requestBody:{content:{[n]:{examples:{[o]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}case"bodyDescription":return {requestBody:{description:a}};case"bodyRequired":return {requestBody:{required:!0}};case"response":return {responses:{[e.name]:{description:e.description}}};case"callback":return {callbacks:{[e.name]:{$ref:`#/components/callbacks/${e.rawType}`}}};case"responseContent":{let[n,o]=e.name.split(".");return {responses:{[n]:{content:{[o]:{schema:e.schema}}}}}}case"responseHeaderComponent":{let[n,o]=e.name.split(".");return {responses:{[n]:{headers:{[o]:{$ref:`#/components/headers/${e.rawType}`}}}}}}case"responseHeader":{let[n,o]=e.name.split(".");return {responses:{[n]:{headers:{[o]:{description:e.description,schema:e.schema}}}}}}case"responseExample":{let[n,o,i]=e.name.split(".");return {responses:{[n]:{content:{[o]:{examples:{[i]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}}case"responseLink":{let[n,o]=e.name.split(".");return {responses:{[n]:{links:{[o]:{$ref:`#/components/links/${e.rawType}`}}}}}}case"bodyComponent":return {requestBody:{$ref:`#/components/requestBodies/${e.rawType}`}};case"responseComponent":return {responses:{[e.name]:{$ref:`#/components/responses/${e.rawType}`}}};case"paramComponent":return {parameters:[{$ref:`#/components/parameters/${e.rawType}`}]};case"security":{let[n,o]=e.name.split("."),i=[];return o&&(i=[o]),{security:{[n]:i}}}default:return {}}}),$=(t,s)=>{let r=/^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \/.*$/;return commentParser.parse(t,{spacing:"preserve"}).filter(a=>r.test(a.description.trim())).map(a=>{let n=a.tags.length+1,o=A__default.default({},...P(a.tags),m);v(o);let[i,c]=a.description.split(" "),p={[c.trim()]:{[i.toLowerCase().trim()]:{...o}}},T=JSON.parse(JSON.stringify({paths:p}));return {loc:n,spec:T}})},Q=$;var D=t=>t.split(/\r\n|\r|\n/).filter(e=>/^\s*(#\s*(?:\S.*)?)?$/.test(e)?!1:e.trim().length>0).length,g=D;var b=new Set(["openapi","info","servers","security","tags","externalDocs","components","paths"]),u=class extends Error{},L=(t,s,r)=>{let e=fs.readFileSync(t,{encoding:"utf8"}),a=q__default.default.extname(t);if(a===".yaml"||a===".yml"){let n=R__default.default.parse(e),o=Object.keys(n).filter(i=>!b.has(i));if(o.length>0){let i=new u(`Unexpected keys: ${o.join(", ")}`);throw i.filePath=t,i}return Object.keys(n).some(i=>b.has(i))?[{loc:g(e),spec:n}]:[]}try{return s(e,r)}catch(n){throw n.filePath=t,n}},ne=L;var I=(t,s)=>{Object.keys(s).forEach(r=>{t[r]===void 0?t[r]={...s[r]}:Object.keys(s[r]).forEach(e=>{t[r][e]={...t[r][e],...s[r][e]};});});},h=I;var d=class{constructor(s){this.openapi=s.openapi,this.info=s.info,this.servers=s.servers,this.paths=s.paths??{},this.components=s.components,this.security=s.security,this.tags=s.tags,this.externalDocs=s.externalDocs;}addData(s){s.forEach(r=>{let{components:e,paths:a,...n}=r;h(this,{components:e??{},paths:a??{}}),Object.entries(n).forEach(([o,i])=>{this[o]=i;});});}},ce=d;var l=(t,s)=>A__default.default({},t,s,(r,e)=>e===null?r:void 0),O=t=>Object.keys(t).map(s=>t[s]).every(s=>typeof s=="object"&&Object.keys(s).every(r=>!(r in s))),f=(t,s)=>s.some(r=>t.name===r.name),j=t=>{switch(t.tag){case"openapi":return "v3";case"asyncapi":return "v4";case"swagger":return "v2";default:return "v2"}};var N=(t,s,r)=>{if(r==="x-webhooks"&&(t[r]=s[r]),r.startsWith("x-"))return;if(["components","consumes","produces","paths","schemas","securityDefinitions","responses","parameters","definitions","channels"].includes(r))Object.keys(s[r]).forEach(a=>{t[r][a]=l(t[r][a],s[r][a]);});else if(r==="tags"){let{tags:a}=s;Array.isArray(a)?a.forEach(n=>{f(n,t.tags)||t.tags.push(n);}):f(a,t.tags)||t.tags.push(a);}else if(r==="security"){let{security:a}=s;t.security=a;}else r.startsWith("/")&&(t.paths[r]=l(t.paths[r],s[r]));},x=N;var F={v2:["paths","definitions","responses","parameters","securityDefinitions"],v3:["paths","definitions","responses","parameters","securityDefinitions","components"],v4:["components","channels"]},z=(t,s)=>t.map(r=>{if((r.tag==="openapi"||r.tag==="swagger"||r.tag==="asyncapi")&&r.description!==""){let e=R__default.default.parseDocument(r.description);if(e.errors.length>0){e.errors.map(i=>{let c=i;return c.annotation=r.description,c});let o="Error parsing YAML in @openapi spec:";throw o+=s?e.errors.map(i=>`${i.toString()}
17
+ var S=(t,s)=>{if(Array.isArray(t))return [...t,...s]},u=S;var w=t=>{t.security&&(t.security=Object.keys(t.security).map(s=>({[s]:t.security[s]})));},k=new Set(["integer","number","string","boolean","object","array"]),g={binary:"string",byte:"string",date:"string","date-time":"string",double:"number",float:"number",int32:"integer",int64:"integer",password:"string"},P=t=>{let s=t.type,r=s.endsWith("[]"),e=s.replace(/\[]$/,""),a=k.has(e),n=Object.keys(g).includes(e),o;if(t.default)switch(e){case"integer":case"int32":case"int64":{o=Number.parseInt(t.default,10);break}case"number":case"double":case"float":{o=Number.parseFloat(t.default);break}default:{o=t.default;break}}let i;a?i={default:o,type:e}:n?i={default:o,format:e,type:g[e]}:i={$ref:`#/components/schemas/${e}`};let p=r?{items:{...i},type:"array"}:{...i};e===""&&(p=void 0);let m=t.description.trim().replace(/^- /,"");return m===""&&(m=void 0),{description:m,name:t.name,rawType:s,required:!t.optional,schema:p}},$=(t,s)=>t.map(r=>{let e=P(r),a="";switch(e.name&&(a+=e.name),e.description&&(a+=` ${e.description.trim()}`),r.tag){case"operationId":case"summary":case"description":return {[r.tag]:a};case"deprecated":return {deprecated:!0};case"externalDocs":return {externalDocs:{description:e.description,url:e.name}};case"server":return {servers:[{description:e.description,url:e.name}]};case"tag":return {tags:[a]};case"cookieParam":case"headerParam":case"queryParam":case"pathParam":return {parameters:[{description:e.description,in:r.tag.replace(/Param$/,""),name:e.name,required:e.required,schema:e.schema}]};case"bodyContent":return {requestBody:{content:{[e.name.replace("*\\/*","*/*")]:{schema:e.schema}}}};case"bodyExample":{let[n,o]=e.name.split(".");return {requestBody:{content:{[n]:{examples:{[o]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}case"bodyDescription":return {requestBody:{description:a}};case"bodyRequired":return {requestBody:{required:!0}};case"response":return {responses:{[e.name]:{description:e.description}}};case"callback":return {callbacks:{[e.name]:{$ref:`#/components/callbacks/${e.rawType}`}}};case"responseContent":{let[n,o]=e.name.split(".");return {responses:{[n]:{content:{[o]:{schema:e.schema}}}}}}case"responseHeaderComponent":{let[n,o]=e.name.split(".");return {responses:{[n]:{headers:{[o]:{$ref:`#/components/headers/${e.rawType}`}}}}}}case"responseHeader":{let[n,o]=e.name.split(".");return {responses:{[n]:{headers:{[o]:{description:e.description,schema:e.schema}}}}}}case"responseExample":{let[n,o,i]=e.name.split(".");return {responses:{[n]:{content:{[o]:{examples:{[i]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}}case"responseLink":{let[n,o]=e.name.split(".");return {responses:{[n]:{links:{[o]:{$ref:`#/components/links/${e.rawType}`}}}}}}case"bodyComponent":return {requestBody:{$ref:`#/components/requestBodies/${e.rawType}`}};case"responseComponent":return {responses:{[e.name]:{$ref:`#/components/responses/${e.rawType}`}}};case"paramComponent":return {parameters:[{$ref:`#/components/parameters/${e.rawType}`}]};case"security":{let[n,o]=e.name.split("."),i=[];return o&&(i=[o]),{security:{[n]:i}}}default:return {}}}),D=(t,s)=>{let r=/^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \/.*$/;return commentParser.parse(t,{spacing:"preserve"}).filter(a=>r.test(a.description.trim())).map(a=>{let n=a.tags.length+1,o=v__default.default({},...$(a.tags),u);w(o);let[i,p]=a.description.split(" "),m={[p.trim()]:{[i.toLowerCase().trim()]:{...o}}},E=JSON.parse(JSON.stringify({paths:m}));return {loc:n,spec:E}})},Z=D;var C=t=>t.split(/\r\n|\r|\n/).filter(e=>/^\s*(#\s*(?:\S.*)?)?$/.test(e)?!1:e.trim().length>0).length,b=C;var h=new Set(["openapi","info","servers","security","tags","externalDocs","components","paths"]),d=class extends Error{},I=(t,s,r)=>{let e=fs.readFileSync(t,{encoding:"utf8"}),a=R__default.default.extname(t);if(a===".yaml"||a===".yml"){let n=L__default.default.parse(e),o=Object.keys(n).filter(i=>!h.has(i));if(o.length>0){let i=new d(`Unexpected keys: ${o.join(", ")}`);throw i.filePath=t,i}return Object.keys(n).some(i=>h.has(i))?[{loc:b(e),spec:n}]:[]}try{return s(e,r)}catch(n){throw n.filePath=t,n}},ce=I;var M=(t,s)=>{Object.keys(s).forEach(r=>{t[r]===void 0?t[r]={...s[r]}:Object.keys(s[r]).forEach(e=>{t[r][e]={...t[r][e],...s[r][e]};});});},O=M;var l=class{constructor(s){this.openapi=s.openapi,this.info=s.info,this.servers=s.servers,this.paths=s.paths??{},this.components=s.components,this.security=s.security,this.tags=s.tags,this.externalDocs=s.externalDocs;}addData(s){s.forEach(r=>{let{components:e,paths:a,...n}=r;O(this,{components:e??{},paths:a??{}}),Object.entries(n).forEach(([o,i])=>{this[o]=i;});});}},fe=l;var f=(t,s)=>v__default.default({},t,s,(r,e)=>e===null?r:void 0),j=t=>Object.keys(t).map(s=>t[s]).every(s=>typeof s=="object"&&Object.keys(s).every(r=>!(r in s))),y=(t,s)=>s.some(r=>t.name===r.name),x=t=>{switch(t.tag){case"openapi":return "v3";case"asyncapi":return "v4";case"swagger":return "v2";default:return "v2"}};var Y=(t,s,r)=>{if(r==="x-webhooks"&&(t[r]=s[r]),r.startsWith("x-"))return;if(["components","consumes","produces","paths","schemas","securityDefinitions","responses","parameters","definitions","channels"].includes(r))Object.keys(s[r]).forEach(a=>{t[r][a]=f(t[r][a],s[r][a]);});else if(r==="tags"){let{tags:a}=s;Array.isArray(a)?a.forEach(n=>{y(n,t.tags)||t.tags.push(n);}):y(a,t.tags)||t.tags.push(a);}else if(r==="security"){let{security:a}=s;t.security=a;}else r.startsWith("/")&&(t.paths[r]=f(t.paths[r],s[r]));},T=Y;var z={v2:["paths","definitions","responses","parameters","securityDefinitions"],v3:["paths","definitions","responses","parameters","securityDefinitions","components"],v4:["components","channels"]},J=(t,s)=>t.map(r=>{if((r.tag==="openapi"||r.tag==="swagger"||r.tag==="asyncapi")&&r.description!==""){let e=L__default.default.parseDocument(r.description);if(e.errors.length>0){e.errors.map(i=>{let p=i;return p.annotation=r.description,p});let o="Error parsing YAML in @openapi spec:";throw o+=s?e.errors.map(i=>`${i.toString()}
18
18
  Imbedded within:
19
19
  \`\`\`
20
20
  ${i.annotation?.replace(/\n/g,`
21
21
  `)}
22
22
  \`\`\``).join(`
23
23
  `):e.errors.map(i=>i.toString()).join(`
24
- `),new Error(o)}let a=e.toJSON(),n={tags:[]};return F[j(r)].forEach(o=>{n[o]=n[o]||{};}),Object.keys(a).forEach(o=>{x(n,a,o);}),n}return {}}),J=(t,s)=>commentParser.parse(t,{spacing:"preserve"}).map(e=>{let a=e.tags.length+1,n=A__default.default({},...z(e.tags,s),m);["definitions","responses","parameters","securityDefinitions","components","tags"].forEach(i=>{n[i]!==void 0&&O(n[i])&&delete n[i];});let o=JSON.parse(JSON.stringify(n));return {loc:a,spec:o}}),je=J;var U=async t=>{await H__default.default.validate(t);},Ee=U;
24
+ `),new Error(o)}let a=e.toJSON(),n={tags:[]};return z[x(r)].forEach(o=>{n[o]=n[o]||{};}),Object.keys(a).forEach(o=>{T(n,a,o);}),n}return {}}),H=(t,s)=>commentParser.parse(t,{spacing:"preserve"}).map(e=>{let a=e.tags.length+1,n=v__default.default({},...J(e.tags,s),u);["definitions","responses","parameters","securityDefinitions","components","tags"].forEach(i=>{n[i]!==void 0&&j(n[i])&&delete n[i];});let o=JSON.parse(JSON.stringify(n));return {loc:a,spec:o}}),Pe=H;var V=async t=>{await U__default.default.validate(t);},qe=V;
25
25
 
26
- exports.a = Q;
27
- exports.b = g;
28
- exports.c = ne;
29
- exports.d = ce;
30
- exports.e = je;
31
- exports.f = Ee;
26
+ exports.a = Z;
27
+ exports.b = b;
28
+ exports.c = ce;
29
+ exports.d = fe;
30
+ exports.e = Pe;
31
+ exports.f = qe;
32
32
  //# sourceMappingURL=out.js.map
33
- //# sourceMappingURL=chunk-D7VYGB4A.js.map
33
+ //# sourceMappingURL=chunk-VNK4L5RV.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/jsdoc/comments-to-open-api.ts","../src/util/customizer.ts","../src/util/yaml-loc.ts","../src/parse-file.ts","../src/util/object-merge.ts","../src/spec-builder.ts","../src/swagger-jsdoc/comments-to-open-api.ts","../src/swagger-jsdoc/utils.ts","../src/swagger-jsdoc/organize-swagger-object.ts","../src/validate.ts"],"names":["parseComments","mergeWith","customizer","objectValue","sourceValue","customizer_default","fixSecurityObject","thing","primitiveTypes","formatMap","parseDescription","tag","rawType","isArray","parsedType","isPrimitive","isFormat","defaultValue","rootType","schema","description","tagsToObjects","tags","verbose","parsedResponse","nameAndDescription","contentType","example","status","header","link","security","scopeItem","scope","commentsToOpenApi","fileContents","openAPIRegex","comment","loc","result","method","path","pathsObject","spec","comments_to_open_api_default","yamlLoc","string","line","yaml_loc_default","readFileSync","yaml","ALLOWED_KEYS","ParseError","parseFile","file","fileContent","extension","invalidKeys","key","error","parse_file_default","objectMerge","a","b","subKey","object_merge_default","SpecBuilder","baseDefinition","parsedFile","components","paths","rest","value","spec_builder_default","mergeDeep","first","second","hasEmptyProperty","object","keyObject","isTagPresentInTags","targetTag","getSwaggerVersionFromSpec","organizeSwaggerObject","swaggerObject","annotation","property","definition","organize_swagger_object_default","specificationTemplate","specs","parsed","newError","errorString","parsedDocument","specification","SwaggerParser","validate","validate_default"],"mappings":"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","sourcesContent":["import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\n// eslint-disable-next-line no-restricted-imports\nimport mergeWith from \"lodash.mergewith\";\n\nimport type { OpenApiObject, PathsObject } from \"../exported.d\";\nimport customizer from \"../util/customizer\";\n\n// The security object has a bizare setup...\nconst fixSecurityObject = (thing: any) => {\n if (thing.security) {\n // eslint-disable-next-line no-param-reassign\n thing.security = Object.keys(thing.security).map((s) => {\n return {\n [s]: thing.security[s],\n };\n });\n }\n};\n\nconst primitiveTypes = new Set([\"integer\", \"number\", \"string\", \"boolean\", \"object\", \"array\"]);\n\nconst formatMap: Record<string, string> = {\n binary: \"string\",\n byte: \"string\",\n date: \"string\",\n \"date-time\": \"string\",\n double: \"number\",\n float: \"number\",\n int32: \"integer\",\n int64: \"integer\",\n password: \"string\",\n};\n\nconst parseDescription = (tag: Spec): { description: string | undefined; name: string; rawType: string; required: boolean; schema: object | undefined } => {\n const rawType = tag.type;\n const isArray = rawType.endsWith(\"[]\");\n // eslint-disable-next-line regexp/strict\n const parsedType = rawType.replace(/\\[]$/, \"\");\n\n const isPrimitive = primitiveTypes.has(parsedType);\n const isFormat = Object.keys(formatMap).includes(parsedType);\n\n let defaultValue;\n\n if (tag.default) {\n switch (parsedType) {\n case \"integer\":\n case \"int32\":\n case \"int64\": {\n defaultValue = Number.parseInt(tag.default, 10);\n break;\n }\n case \"number\":\n case \"double\":\n case \"float\": {\n defaultValue = Number.parseFloat(tag.default);\n break;\n }\n default: {\n defaultValue = tag.default;\n break;\n }\n }\n }\n\n let rootType;\n\n if (isPrimitive) {\n rootType = { default: defaultValue, type: parsedType };\n } else if (isFormat) {\n rootType = {\n default: defaultValue,\n format: parsedType,\n type: formatMap[parsedType],\n };\n } else {\n rootType = { $ref: `#/components/schemas/${parsedType}` };\n }\n\n let schema: object | undefined = isArray\n ? {\n items: {\n ...rootType,\n },\n type: \"array\",\n }\n : {\n ...rootType,\n };\n\n if (parsedType === \"\") {\n schema = undefined;\n }\n\n // remove the optional dash from the description.\n let description: string | undefined = tag.description.trim().replace(/^- /, \"\");\n\n if (description === \"\") {\n description = undefined;\n }\n\n return {\n description,\n name: tag.name,\n rawType,\n required: !tag.optional,\n schema,\n };\n};\n\n// @ts-expect-error\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst tagsToObjects = (tags: Spec[], verbose?: boolean) =>\n tags.map((tag) => {\n const parsedResponse = parseDescription(tag);\n\n // Some ops only have a `description`, merge `name` and `description`\n // for these.\n let nameAndDescription = \"\";\n\n if (parsedResponse.name) {\n nameAndDescription += parsedResponse.name;\n }\n\n if (parsedResponse.description) {\n nameAndDescription += ` ${parsedResponse.description.trim()}`;\n }\n\n switch (tag.tag) {\n case \"operationId\":\n case \"summary\":\n case \"description\": {\n return { [tag.tag]: nameAndDescription };\n }\n\n case \"deprecated\": {\n return { deprecated: true };\n }\n\n case \"externalDocs\": {\n return {\n externalDocs: {\n description: parsedResponse.description,\n url: parsedResponse.name,\n },\n };\n }\n\n case \"server\": {\n return {\n servers: [\n {\n description: parsedResponse.description,\n url: parsedResponse.name,\n },\n ],\n };\n }\n\n case \"tag\": {\n return { tags: [nameAndDescription] };\n }\n\n case \"cookieParam\":\n case \"headerParam\":\n case \"queryParam\":\n case \"pathParam\": {\n return {\n parameters: [\n {\n description: parsedResponse.description,\n in: tag.tag.replace(/Param$/, \"\"),\n name: parsedResponse.name,\n required: parsedResponse.required,\n schema: parsedResponse.schema,\n },\n ],\n };\n }\n\n case \"bodyContent\": {\n return {\n requestBody: {\n content: {\n [parsedResponse.name.replace(\"*\\\\/*\", \"*/*\")]: {\n schema: parsedResponse.schema,\n },\n },\n },\n };\n }\n\n case \"bodyExample\": {\n const [contentType, example] = parsedResponse.name.split(\".\");\n\n return {\n requestBody: {\n content: {\n [contentType as string]: {\n examples: {\n [example as string]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n };\n }\n\n case \"bodyDescription\": {\n return { requestBody: { description: nameAndDescription } };\n }\n\n case \"bodyRequired\": {\n return { requestBody: { required: true } };\n }\n\n case \"response\": {\n return {\n responses: {\n [parsedResponse.name]: {\n description: parsedResponse.description,\n },\n },\n };\n }\n\n case \"callback\": {\n return {\n callbacks: {\n [parsedResponse.name]: {\n $ref: `#/components/callbacks/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"responseContent\": {\n const [status, contentType] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n content: {\n [contentType as string]: {\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeaderComponent\": {\n const [status, header] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n headers: {\n [header as string]: {\n $ref: `#/components/headers/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeader\": {\n const [status, header] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n headers: {\n [header as string]: {\n description: parsedResponse.description,\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseExample\": {\n const [status, contentType, example] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n content: {\n [contentType as string]: {\n examples: {\n [example as string]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n },\n };\n }\n\n case \"responseLink\": {\n const [status, link] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n links: {\n [link as string]: {\n $ref: `#/components/links/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"bodyComponent\": {\n return {\n requestBody: {\n $ref: `#/components/requestBodies/${parsedResponse.rawType}`,\n },\n };\n }\n\n case \"responseComponent\": {\n return {\n responses: {\n [parsedResponse.name]: {\n $ref: `#/components/responses/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"paramComponent\": {\n return {\n parameters: [{ $ref: `#/components/parameters/${parsedResponse.rawType}` }],\n };\n }\n\n case \"security\": {\n const [security, scopeItem] = parsedResponse.name.split(\".\");\n\n let scope: string[] = [];\n\n if (scopeItem) {\n scope = [scopeItem];\n }\n\n return {\n security: { [security as string]: scope },\n };\n }\n\n default: {\n return {};\n }\n }\n });\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { loc: number; spec: OpenApiObject }[] => {\n // eslint-disable-next-line regexp/no-unused-capturing-group\n const openAPIRegex = /^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \\/.*$/;\n\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments\n .filter((comment) => openAPIRegex.test(comment.description.trim()))\n .map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n fixSecurityObject(result);\n\n const [method, path]: string[] = comment.description.split(\" \");\n\n const pathsObject: PathsObject = {\n [(path as string).trim()]: {\n [(method as string).toLowerCase().trim()]: {\n ...result,\n },\n },\n };\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify({ paths: pathsObject }));\n\n return {\n loc,\n spec,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","const customizer = (objectValue: unknown, sourceValue: unknown[]): unknown[] | undefined => {\n if (Array.isArray(objectValue)) {\n return [...objectValue, ...sourceValue] as unknown[];\n }\n\n return undefined;\n};\n\nexport default customizer;\n","const yamlLoc = (string: string): number => {\n // Break string into lines.\n const split = string.split(/\\r\\n|\\r|\\n/);\n\n const filtered = split.filter((line) => {\n // Remove comments.\n // eslint-disable-next-line security/detect-unsafe-regex,regexp/no-unused-capturing-group\n if (/^\\s*(#\\s*(?:\\S.*)?)?$/.test(line)) {\n return false;\n }\n // Remove empty lines.\n return line.trim().length > 0;\n });\n\n return filtered.length;\n};\n\nexport default yamlLoc;\n","import { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport yaml from \"yaml\";\n\nimport type { OpenApiObject } from \"./exported.d\";\nimport yamlLoc from \"./util/yaml-loc\";\n\nconst ALLOWED_KEYS = new Set([\"openapi\", \"info\", \"servers\", \"security\", \"tags\", \"externalDocs\", \"components\", \"paths\"]);\n\nclass ParseError extends Error {\n public filePath?: string;\n}\n\nconst parseFile = (\n file: string,\n commentsToOpenApi: (fileContent: string, verbose?: boolean) => { loc: number; spec: OpenApiObject }[],\n verbose?: boolean,\n): { loc: number; spec: OpenApiObject }[] => {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n const fileContent = readFileSync(file, { encoding: \"utf8\" });\n const extension = path.extname(file);\n\n if (extension === \".yaml\" || extension === \".yml\") {\n const spec = yaml.parse(fileContent);\n const invalidKeys = Object.keys(spec).filter((key) => !ALLOWED_KEYS.has(key));\n\n if (invalidKeys.length > 0) {\n const error = new ParseError(`Unexpected keys: ${invalidKeys.join(\", \")}`);\n\n error.filePath = file;\n\n throw error;\n }\n\n if (Object.keys(spec).some((key) => ALLOWED_KEYS.has(key))) {\n const loc = yamlLoc(fileContent);\n\n return [{ loc, spec }];\n }\n\n return [];\n }\n\n try {\n return commentsToOpenApi(fileContent, verbose);\n } catch (error: any) {\n error.filePath = file;\n\n throw error;\n }\n};\n\nexport default parseFile;\n","const objectMerge = <T>(a: T, b: T): void => {\n Object.keys(b as object).forEach((key) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (a[key as keyof typeof b] === undefined) {\n // eslint-disable-next-line no-param-reassign\n a[key as keyof typeof b] = {\n ...b[key as keyof typeof b],\n };\n } else {\n Object.keys(b[key as keyof typeof b] as object).forEach((subKey) => {\n // eslint-disable-next-line no-param-reassign\n (a[key as keyof typeof b] as Record<string, object>)[subKey] = {\n ...(a[key as keyof typeof b] as Record<string, object>)[subKey],\n ...(b[key as keyof typeof b] as Record<string, object>)[subKey],\n };\n });\n }\n });\n};\n\nexport default objectMerge;\n","import type {\n BaseDefinition,\n ComponentsObject,\n ExternalDocumentationObject,\n InfoObject,\n OpenApiObject,\n PathsObject,\n SecurityRequirementObject,\n ServerObject,\n TagObject,\n} from \"./exported.d\";\nimport objectMerge from \"./util/object-merge\";\n\nclass SpecBuilder implements OpenApiObject {\n public components?: ComponentsObject;\n\n public externalDocs?: ExternalDocumentationObject;\n\n public info: InfoObject;\n\n public openapi: string;\n\n public paths: PathsObject;\n\n public security?: SecurityRequirementObject[];\n\n public servers?: ServerObject[];\n\n public tags?: TagObject[];\n\n public constructor(baseDefinition: BaseDefinition) {\n this.openapi = baseDefinition.openapi;\n this.info = baseDefinition.info;\n this.servers = baseDefinition.servers;\n this.paths = baseDefinition.paths ?? {};\n this.components = baseDefinition.components;\n this.security = baseDefinition.security;\n this.tags = baseDefinition.tags;\n this.externalDocs = baseDefinition.externalDocs;\n }\n\n public addData(parsedFile: OpenApiObject[]): void {\n parsedFile.forEach((file) => {\n const { components, paths, ...rest } = file;\n\n // only merge paths and components\n objectMerge(this, {\n components: components ?? {},\n paths: paths ?? {},\n } as OpenApiObject);\n\n // overwrite everything else:\n Object.entries(rest).forEach(([key, value]) => {\n // @ts-expect-error\n this[key as keyof OpenApiObject] = value;\n });\n });\n }\n}\n\nexport default SpecBuilder;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\n// eslint-disable-next-line no-restricted-imports\nimport mergeWith from \"lodash.mergewith\";\nimport type { YAMLError } from \"yaml\";\nimport yaml from \"yaml\";\n\nimport type { OpenApiObject } from \"../exported.d\";\nimport customizer from \"../util/customizer\";\nimport organizeSwaggerObject from \"./organize-swagger-object\";\nimport { getSwaggerVersionFromSpec, hasEmptyProperty } from \"./utils\";\n\nconst specificationTemplate = {\n v2: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\"],\n v3: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\"],\n v4: [\"components\", \"channels\"],\n};\n\ntype ExtendedYAMLError = YAMLError & { annotation?: string };\n\nconst tagsToObjects = (specs: Spec[], verbose?: boolean) =>\n specs.map((spec: Spec) => {\n if ((spec.tag === \"openapi\" || spec.tag === \"swagger\" || spec.tag === \"asyncapi\") && spec.description !== \"\") {\n const parsed = yaml.parseDocument(spec.description);\n\n if (parsed.errors.length > 0) {\n parsed.errors.map<ExtendedYAMLError>((error) => {\n const newError: ExtendedYAMLError = error;\n\n newError.annotation = spec.description;\n\n return newError;\n });\n\n let errorString = \"Error parsing YAML in @openapi spec:\";\n\n errorString += verbose\n ? (parsed.errors as ExtendedYAMLError[])\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n .map((error) => `${error.toString()}\\nImbedded within:\\n\\`\\`\\`\\n ${error.annotation?.replace(/\\n/g, \"\\n \")}\\n\\`\\`\\``)\n .join(\"\\n\")\n : // eslint-disable-next-line @typescript-eslint/no-base-to-string\n parsed.errors.map((error) => error.toString()).join(\"\\n\");\n\n throw new Error(errorString);\n }\n\n const parsedDocument = parsed.toJSON();\n const specification: Record<string, any> = {\n tags: [],\n };\n\n specificationTemplate[getSwaggerVersionFromSpec(spec)].forEach((property) => {\n specification[property] = specification[property] || {};\n });\n\n Object.keys(parsedDocument).forEach((property) => {\n organizeSwaggerObject(specification, parsedDocument, property);\n });\n\n return specification;\n }\n\n return {};\n });\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { loc: number; spec: OpenApiObject }[] => {\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments.map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n [\"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\", \"tags\"].forEach((property) => {\n if (result[property] !== undefined && hasEmptyProperty(result[property])) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete result[property];\n }\n });\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify(result));\n\n return {\n loc,\n spec,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","import type { Spec } from \"comment-parser\";\n// eslint-disable-next-line no-restricted-imports\nimport mergeWith from \"lodash.mergewith\";\n\n/**\n * A recursive deep-merge that ignores null values when merging.\n * This returns the merged object and does not mutate.\n * @param {object} first the first object to get merged\n * @param {object} second the second object to get merged\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-return\nexport const mergeDeep = (first?: object, second?: object): object => mergeWith({}, first, second, (a, b) => (b === null ? a : undefined));\n\n/**\n * Checks if there is any properties of the input object which are an empty object\n * @param {object} object - the object to check\n * @returns boolean\n */\nexport const hasEmptyProperty = (object: Record<string, any>): boolean =>\n Object.keys(object)\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n .map((key) => object[key])\n .every((keyObject) => typeof keyObject === \"object\" && Object.keys(keyObject).every((key) => !(key in keyObject)));\n\n/**\n * @param {object} tag\n * @param {array} tags\n * @returns boolean\n */\nexport const isTagPresentInTags = (tag: Spec, tags: Spec[]): boolean => tags.some((targetTag) => tag.name === targetTag.name);\n\nexport const getSwaggerVersionFromSpec = (tag: Spec): \"v2\" | \"v3\" | \"v4\" => {\n switch (tag.tag) {\n case \"openapi\": {\n return \"v3\";\n }\n case \"asyncapi\": {\n return \"v4\";\n }\n case \"swagger\": {\n return \"v2\";\n }\n default: {\n return \"v2\";\n }\n }\n};\n","import { isTagPresentInTags, mergeDeep } from \"./utils\";\n\n/**\n * @param {object} swaggerObject\n * @param {object} annotation\n * @param {string} property\n */\n\nconst organizeSwaggerObject = (swaggerObject: Record<string, any>, annotation: Record<string, any>, property: string): void => {\n // Root property on purpose.\n // eslint-disable-next-line no-secrets/no-secrets\n // @see https://github.com/OAI/OpenAPI-Specification/blob/master/proposals/002_Webhooks.md#proposed-solution\n if (property === \"x-webhooks\") {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property] = annotation[property];\n }\n\n // Other extensions can be in varying places depending on different vendors and opinions.\n // The following return makes it so that they are not put in `paths` in the last case.\n // New specific extensions will need to be handled on case-by-case if to be included in `paths`.\n if (property.startsWith(\"x-\")) {\n return;\n }\n\n const commonProperties = [\n \"components\",\n \"consumes\",\n \"produces\",\n \"paths\",\n \"schemas\",\n \"securityDefinitions\",\n \"responses\",\n \"parameters\",\n \"definitions\",\n \"channels\",\n ];\n\n if (commonProperties.includes(property)) {\n Object.keys(annotation[property]).forEach((definition) => {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property][definition] = mergeDeep(swaggerObject[property][definition], annotation[property][definition]);\n });\n } else if (property === \"tags\") {\n const { tags } = annotation;\n\n if (Array.isArray(tags)) {\n tags.forEach((tag) => {\n if (!isTagPresentInTags(tag, swaggerObject[\"tags\"])) {\n swaggerObject[\"tags\"].push(tag);\n }\n });\n } else if (!isTagPresentInTags(tags, swaggerObject[\"tags\"])) {\n swaggerObject[\"tags\"].push(tags);\n }\n } else if (property === \"security\") {\n const { security } = annotation;\n\n // eslint-disable-next-line no-param-reassign\n swaggerObject[\"security\"] = security;\n } else if (property.startsWith(\"/\")) {\n // Paths which are not defined as \"paths\" property, starting with a slash \"/\"\n // eslint-disable-next-line no-param-reassign\n swaggerObject[\"paths\"][property] = mergeDeep(swaggerObject[\"paths\"][property], annotation[property]);\n }\n};\n\nexport default organizeSwaggerObject;\n","import SwaggerParser from \"@apidevtools/swagger-parser\";\nimport type OpenAPI from \"openapi-types\";\n\nconst validate = async (spec: Record<string, unknown>): Promise<void> => {\n await SwaggerParser.validate(spec as OpenAPI.OpenAPI.Document);\n};\n\nexport default validate;\n"]}
1
+ {"version":3,"sources":["../src/jsdoc/comments-to-open-api.ts","../src/util/customizer.ts","../src/util/yaml-loc.ts","../src/parse-file.ts","../src/util/object-merge.ts","../src/spec-builder.ts","../src/swagger-jsdoc/comments-to-open-api.ts","../src/swagger-jsdoc/utils.ts","../src/swagger-jsdoc/organize-swagger-object.ts","../src/validate.ts"],"names":["parseComments","mergeWith","customizer","objectValue","sourceValue","customizer_default","fixSecurityObject","thing","primitiveTypes","formatMap","parseDescription","tag","rawType","isArray","parsedType","isPrimitive","isFormat","defaultValue","rootType","schema","description","tagsToObjects","tags","verbose","parsedResponse","nameAndDescription","contentType","example","status","header","link","security","scopeItem","scope","commentsToOpenApi","fileContents","openAPIRegex","comment","loc","result","method","path","pathsObject","spec","comments_to_open_api_default","yamlLoc","string","line","yaml_loc_default","readFileSync","yaml","ALLOWED_KEYS","ParseError","parseFile","file","fileContent","extension","invalidKeys","key","error","parse_file_default","objectMerge","a","b","subKey","object_merge_default","SpecBuilder","baseDefinition","parsedFile","components","paths","rest","value","spec_builder_default","mergeDeep","first","second","hasEmptyProperty","object","keyObject","isTagPresentInTags","targetTag","getSwaggerVersionFromSpec","organizeSwaggerObject","swaggerObject","annotation","property","definition","organize_swagger_object_default","specificationTemplate","specs","parsed","newError","errorString","parsedDocument","specification","SwaggerParser","validate","validate_default"],"mappings":"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","sourcesContent":["import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\n// eslint-disable-next-line no-restricted-imports\nimport mergeWith from \"lodash.mergewith\";\n\nimport type { OpenApiObject, PathsObject } from \"../exported.d\";\nimport customizer from \"../util/customizer\";\n\n// The security object has a bizare setup...\nconst fixSecurityObject = (thing: any) => {\n if (thing.security) {\n // eslint-disable-next-line no-param-reassign\n thing.security = Object.keys(thing.security).map((s) => {\n return {\n [s]: thing.security[s],\n };\n });\n }\n};\n\nconst primitiveTypes = new Set([\"integer\", \"number\", \"string\", \"boolean\", \"object\", \"array\"]);\n\nconst formatMap: Record<string, string> = {\n binary: \"string\",\n byte: \"string\",\n date: \"string\",\n \"date-time\": \"string\",\n double: \"number\",\n float: \"number\",\n int32: \"integer\",\n int64: \"integer\",\n password: \"string\",\n};\n\nconst parseDescription = (tag: Spec): { description: string | undefined; name: string; rawType: string; required: boolean; schema: object | undefined } => {\n const rawType = tag.type;\n const isArray = rawType.endsWith(\"[]\");\n // eslint-disable-next-line regexp/strict\n const parsedType = rawType.replace(/\\[]$/, \"\");\n\n const isPrimitive = primitiveTypes.has(parsedType);\n const isFormat = Object.keys(formatMap).includes(parsedType);\n\n let defaultValue;\n\n if (tag.default) {\n switch (parsedType) {\n case \"integer\":\n case \"int32\":\n case \"int64\": {\n defaultValue = Number.parseInt(tag.default, 10);\n break;\n }\n case \"number\":\n case \"double\":\n case \"float\": {\n defaultValue = Number.parseFloat(tag.default);\n break;\n }\n default: {\n defaultValue = tag.default;\n break;\n }\n }\n }\n\n let rootType;\n\n if (isPrimitive) {\n rootType = { default: defaultValue, type: parsedType };\n } else if (isFormat) {\n rootType = {\n default: defaultValue,\n format: parsedType,\n type: formatMap[parsedType],\n };\n } else {\n rootType = { $ref: `#/components/schemas/${parsedType}` };\n }\n\n let schema: object | undefined = isArray\n ? {\n items: {\n ...rootType,\n },\n type: \"array\",\n }\n : {\n ...rootType,\n };\n\n if (parsedType === \"\") {\n schema = undefined;\n }\n\n // remove the optional dash from the description.\n let description: string | undefined = tag.description.trim().replace(/^- /, \"\");\n\n if (description === \"\") {\n description = undefined;\n }\n\n return {\n description,\n name: tag.name,\n rawType,\n required: !tag.optional,\n schema,\n };\n};\n\n// @ts-expect-error\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst tagsToObjects = (tags: Spec[], verbose?: boolean) =>\n tags.map((tag) => {\n const parsedResponse = parseDescription(tag);\n\n // Some ops only have a `description`, merge `name` and `description`\n // for these.\n let nameAndDescription = \"\";\n\n if (parsedResponse.name) {\n nameAndDescription += parsedResponse.name;\n }\n\n if (parsedResponse.description) {\n nameAndDescription += ` ${parsedResponse.description.trim()}`;\n }\n\n switch (tag.tag) {\n case \"operationId\":\n case \"summary\":\n case \"description\": {\n return { [tag.tag]: nameAndDescription };\n }\n\n case \"deprecated\": {\n return { deprecated: true };\n }\n\n case \"externalDocs\": {\n return {\n externalDocs: {\n description: parsedResponse.description,\n url: parsedResponse.name,\n },\n };\n }\n\n case \"server\": {\n return {\n servers: [\n {\n description: parsedResponse.description,\n url: parsedResponse.name,\n },\n ],\n };\n }\n\n case \"tag\": {\n return { tags: [nameAndDescription] };\n }\n\n case \"cookieParam\":\n case \"headerParam\":\n case \"queryParam\":\n case \"pathParam\": {\n return {\n parameters: [\n {\n description: parsedResponse.description,\n in: tag.tag.replace(/Param$/, \"\"),\n name: parsedResponse.name,\n required: parsedResponse.required,\n schema: parsedResponse.schema,\n },\n ],\n };\n }\n\n case \"bodyContent\": {\n return {\n requestBody: {\n content: {\n [parsedResponse.name.replace(\"*\\\\/*\", \"*/*\")]: {\n schema: parsedResponse.schema,\n },\n },\n },\n };\n }\n\n case \"bodyExample\": {\n const [contentType, example] = parsedResponse.name.split(\".\");\n\n return {\n requestBody: {\n content: {\n [contentType as string]: {\n examples: {\n [example as string]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n };\n }\n\n case \"bodyDescription\": {\n return { requestBody: { description: nameAndDescription } };\n }\n\n case \"bodyRequired\": {\n return { requestBody: { required: true } };\n }\n\n case \"response\": {\n return {\n responses: {\n [parsedResponse.name]: {\n description: parsedResponse.description,\n },\n },\n };\n }\n\n case \"callback\": {\n return {\n callbacks: {\n [parsedResponse.name]: {\n $ref: `#/components/callbacks/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"responseContent\": {\n const [status, contentType] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n content: {\n [contentType as string]: {\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeaderComponent\": {\n const [status, header] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n headers: {\n [header as string]: {\n $ref: `#/components/headers/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeader\": {\n const [status, header] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n headers: {\n [header as string]: {\n description: parsedResponse.description,\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseExample\": {\n const [status, contentType, example] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n content: {\n [contentType as string]: {\n examples: {\n [example as string]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n },\n };\n }\n\n case \"responseLink\": {\n const [status, link] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n links: {\n [link as string]: {\n $ref: `#/components/links/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"bodyComponent\": {\n return {\n requestBody: {\n $ref: `#/components/requestBodies/${parsedResponse.rawType}`,\n },\n };\n }\n\n case \"responseComponent\": {\n return {\n responses: {\n [parsedResponse.name]: {\n $ref: `#/components/responses/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"paramComponent\": {\n return {\n parameters: [{ $ref: `#/components/parameters/${parsedResponse.rawType}` }],\n };\n }\n\n case \"security\": {\n const [security, scopeItem] = parsedResponse.name.split(\".\");\n\n let scope: string[] = [];\n\n if (scopeItem) {\n scope = [scopeItem];\n }\n\n return {\n security: { [security as string]: scope },\n };\n }\n\n default: {\n return {};\n }\n }\n });\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { loc: number; spec: OpenApiObject }[] => {\n // eslint-disable-next-line regexp/no-unused-capturing-group\n const openAPIRegex = /^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \\/.*$/;\n\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return jsDocumentComments\n .filter((comment) => openAPIRegex.test(comment.description.trim()))\n .map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n fixSecurityObject(result);\n\n const [method, path]: string[] = comment.description.split(\" \");\n\n const pathsObject: PathsObject = {\n [(path as string).trim()]: {\n [(method as string).toLowerCase().trim()]: {\n ...result,\n },\n },\n };\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify({ paths: pathsObject }));\n\n return {\n loc,\n spec,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","const customizer = (objectValue: unknown, sourceValue: unknown[]): unknown[] | undefined => {\n if (Array.isArray(objectValue)) {\n return [...objectValue, ...sourceValue] as unknown[];\n }\n\n return undefined;\n};\n\nexport default customizer;\n","const yamlLoc = (string: string): number => {\n // Break string into lines.\n const split = string.split(/\\r\\n|\\r|\\n/);\n\n const filtered = split.filter((line) => {\n // Remove comments.\n // eslint-disable-next-line security/detect-unsafe-regex,regexp/no-unused-capturing-group\n if (/^\\s*(#\\s*(?:\\S.*)?)?$/.test(line)) {\n return false;\n }\n // Remove empty lines.\n return line.trim().length > 0;\n });\n\n return filtered.length;\n};\n\nexport default yamlLoc;\n","import { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport yaml from \"yaml\";\n\nimport type { OpenApiObject } from \"./exported.d\";\nimport yamlLoc from \"./util/yaml-loc\";\n\nconst ALLOWED_KEYS = new Set([\"openapi\", \"info\", \"servers\", \"security\", \"tags\", \"externalDocs\", \"components\", \"paths\"]);\n\nclass ParseError extends Error {\n public filePath?: string;\n}\n\nconst parseFile = (\n file: string,\n commentsToOpenApi: (fileContent: string, verbose?: boolean) => { loc: number; spec: OpenApiObject }[],\n verbose?: boolean,\n): { loc: number; spec: OpenApiObject }[] => {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n const fileContent = readFileSync(file, { encoding: \"utf8\" });\n const extension = path.extname(file);\n\n if (extension === \".yaml\" || extension === \".yml\") {\n const spec = yaml.parse(fileContent);\n const invalidKeys = Object.keys(spec).filter((key) => !ALLOWED_KEYS.has(key));\n\n if (invalidKeys.length > 0) {\n const error = new ParseError(`Unexpected keys: ${invalidKeys.join(\", \")}`);\n\n error.filePath = file;\n\n throw error;\n }\n\n if (Object.keys(spec).some((key) => ALLOWED_KEYS.has(key))) {\n const loc = yamlLoc(fileContent);\n\n return [{ loc, spec }];\n }\n\n return [];\n }\n\n try {\n return commentsToOpenApi(fileContent, verbose);\n } catch (error: any) {\n error.filePath = file;\n\n throw error;\n }\n};\n\nexport default parseFile;\n","const objectMerge = <T>(a: T, b: T): void => {\n Object.keys(b as object).forEach((key) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (a[key as keyof typeof b] === undefined) {\n // eslint-disable-next-line no-param-reassign\n a[key as keyof typeof b] = {\n ...b[key as keyof typeof b],\n };\n } else {\n Object.keys(b[key as keyof typeof b] as object).forEach((subKey) => {\n // eslint-disable-next-line no-param-reassign\n (a[key as keyof typeof b] as Record<string, object>)[subKey] = {\n ...(a[key as keyof typeof b] as Record<string, object>)[subKey],\n ...(b[key as keyof typeof b] as Record<string, object>)[subKey],\n };\n });\n }\n });\n};\n\nexport default objectMerge;\n","import type {\n BaseDefinition,\n ComponentsObject,\n ExternalDocumentationObject,\n InfoObject,\n OpenApiObject,\n PathsObject,\n SecurityRequirementObject,\n ServerObject,\n TagObject,\n} from \"./exported.d\";\nimport objectMerge from \"./util/object-merge\";\n\nclass SpecBuilder implements OpenApiObject {\n public components?: ComponentsObject;\n\n public externalDocs?: ExternalDocumentationObject;\n\n public info: InfoObject;\n\n public openapi: string;\n\n public paths: PathsObject;\n\n public security?: SecurityRequirementObject[];\n\n public servers?: ServerObject[];\n\n public tags?: TagObject[];\n\n public constructor(baseDefinition: BaseDefinition) {\n this.openapi = baseDefinition.openapi;\n this.info = baseDefinition.info;\n this.servers = baseDefinition.servers;\n this.paths = baseDefinition.paths ?? {};\n this.components = baseDefinition.components;\n this.security = baseDefinition.security;\n this.tags = baseDefinition.tags;\n this.externalDocs = baseDefinition.externalDocs;\n }\n\n public addData(parsedFile: OpenApiObject[]): void {\n parsedFile.forEach((file) => {\n const { components, paths, ...rest } = file;\n\n // only merge paths and components\n objectMerge(this, {\n components: components ?? {},\n paths: paths ?? {},\n } as OpenApiObject);\n\n // overwrite everything else:\n Object.entries(rest).forEach(([key, value]) => {\n // @ts-expect-error\n this[key as keyof OpenApiObject] = value;\n });\n });\n }\n}\n\nexport default SpecBuilder;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\n// eslint-disable-next-line no-restricted-imports\nimport mergeWith from \"lodash.mergewith\";\nimport type { YAMLError } from \"yaml\";\nimport yaml from \"yaml\";\n\nimport type { OpenApiObject } from \"../exported.d\";\nimport customizer from \"../util/customizer\";\nimport organizeSwaggerObject from \"./organize-swagger-object\";\nimport { getSwaggerVersionFromSpec, hasEmptyProperty } from \"./utils\";\n\nconst specificationTemplate = {\n v2: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\"],\n v3: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\"],\n v4: [\"components\", \"channels\"],\n};\n\ntype ExtendedYAMLError = YAMLError & { annotation?: string };\n\nconst tagsToObjects = (specs: Spec[], verbose?: boolean) =>\n specs.map((spec: Spec) => {\n if ((spec.tag === \"openapi\" || spec.tag === \"swagger\" || spec.tag === \"asyncapi\") && spec.description !== \"\") {\n const parsed = yaml.parseDocument(spec.description);\n\n if (parsed.errors.length > 0) {\n parsed.errors.map<ExtendedYAMLError>((error) => {\n const newError: ExtendedYAMLError = error;\n\n newError.annotation = spec.description;\n\n return newError;\n });\n\n let errorString = \"Error parsing YAML in @openapi spec:\";\n\n errorString += verbose\n ? (parsed.errors as ExtendedYAMLError[])\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n .map((error) => `${error.toString()}\\nImbedded within:\\n\\`\\`\\`\\n ${error.annotation?.replace(/\\n/g, \"\\n \")}\\n\\`\\`\\``)\n .join(\"\\n\")\n : // eslint-disable-next-line @typescript-eslint/no-base-to-string\n parsed.errors.map((error) => error.toString()).join(\"\\n\");\n\n throw new Error(errorString);\n }\n\n const parsedDocument = parsed.toJSON();\n const specification: Record<string, any> = {\n tags: [],\n };\n\n specificationTemplate[getSwaggerVersionFromSpec(spec)].forEach((property) => {\n specification[property] = specification[property] || {};\n });\n\n Object.keys(parsedDocument).forEach((property) => {\n organizeSwaggerObject(specification, parsedDocument, property);\n });\n\n return specification;\n }\n\n return {};\n });\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { loc: number; spec: OpenApiObject }[] => {\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return jsDocumentComments.map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n [\"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\", \"tags\"].forEach((property) => {\n if (result[property] !== undefined && hasEmptyProperty(result[property])) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete result[property];\n }\n });\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify(result));\n\n return {\n loc,\n spec,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","import type { Spec } from \"comment-parser\";\n// eslint-disable-next-line no-restricted-imports\nimport mergeWith from \"lodash.mergewith\";\n\n/**\n * A recursive deep-merge that ignores null values when merging.\n * This returns the merged object and does not mutate.\n * @param {object} first the first object to get merged\n * @param {object} second the second object to get merged\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-return\nexport const mergeDeep = (first?: object, second?: object): object => mergeWith({}, first, second, (a, b) => (b === null ? a : undefined));\n\n/**\n * Checks if there is any properties of the input object which are an empty object\n * @param {object} object - the object to check\n * @returns boolean\n */\nexport const hasEmptyProperty = (object: Record<string, any>): boolean =>\n Object.keys(object)\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n .map((key) => object[key])\n .every((keyObject) => typeof keyObject === \"object\" && Object.keys(keyObject).every((key) => !(key in keyObject)));\n\n/**\n * @param {object} tag\n * @param {array} tags\n * @returns boolean\n */\nexport const isTagPresentInTags = (tag: Spec, tags: Spec[]): boolean => tags.some((targetTag) => tag.name === targetTag.name);\n\nexport const getSwaggerVersionFromSpec = (tag: Spec): \"v2\" | \"v3\" | \"v4\" => {\n switch (tag.tag) {\n case \"openapi\": {\n return \"v3\";\n }\n case \"asyncapi\": {\n return \"v4\";\n }\n case \"swagger\": {\n return \"v2\";\n }\n default: {\n return \"v2\";\n }\n }\n};\n","import { isTagPresentInTags, mergeDeep } from \"./utils\";\n\n/**\n * @param {object} swaggerObject\n * @param {object} annotation\n * @param {string} property\n */\n\nconst organizeSwaggerObject = (swaggerObject: Record<string, any>, annotation: Record<string, any>, property: string): void => {\n // Root property on purpose.\n // eslint-disable-next-line no-secrets/no-secrets\n // @see https://github.com/OAI/OpenAPI-Specification/blob/master/proposals/002_Webhooks.md#proposed-solution\n if (property === \"x-webhooks\") {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property] = annotation[property];\n }\n\n // Other extensions can be in varying places depending on different vendors and opinions.\n // The following return makes it so that they are not put in `paths` in the last case.\n // New specific extensions will need to be handled on case-by-case if to be included in `paths`.\n if (property.startsWith(\"x-\")) {\n return;\n }\n\n const commonProperties = [\n \"components\",\n \"consumes\",\n \"produces\",\n \"paths\",\n \"schemas\",\n \"securityDefinitions\",\n \"responses\",\n \"parameters\",\n \"definitions\",\n \"channels\",\n ];\n\n if (commonProperties.includes(property)) {\n Object.keys(annotation[property]).forEach((definition) => {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property][definition] = mergeDeep(swaggerObject[property][definition], annotation[property][definition]);\n });\n } else if (property === \"tags\") {\n const { tags } = annotation;\n\n if (Array.isArray(tags)) {\n tags.forEach((tag) => {\n if (!isTagPresentInTags(tag, swaggerObject[\"tags\"])) {\n swaggerObject[\"tags\"].push(tag);\n }\n });\n } else if (!isTagPresentInTags(tags, swaggerObject[\"tags\"])) {\n swaggerObject[\"tags\"].push(tags);\n }\n } else if (property === \"security\") {\n const { security } = annotation;\n\n // eslint-disable-next-line no-param-reassign\n swaggerObject[\"security\"] = security;\n } else if (property.startsWith(\"/\")) {\n // Paths which are not defined as \"paths\" property, starting with a slash \"/\"\n // eslint-disable-next-line no-param-reassign\n swaggerObject[\"paths\"][property] = mergeDeep(swaggerObject[\"paths\"][property], annotation[property]);\n }\n};\n\nexport default organizeSwaggerObject;\n","import SwaggerParser from \"@apidevtools/swagger-parser\";\nimport type OpenAPI from \"openapi-types\";\n\nconst validate = async (spec: Record<string, unknown>): Promise<void> => {\n await SwaggerParser.validate(spec as OpenAPI.OpenAPI.Document);\n};\n\nexport default validate;\n"]}
@@ -0,0 +1,19 @@
1
+ import { parse } from 'comment-parser';
2
+ import w from 'lodash.mergewith';
3
+ import { readFileSync } from 'fs';
4
+ import L from 'path';
5
+ import I from 'yaml';
6
+ import V from '@apidevtools/swagger-parser';
7
+
8
+ var A=(t,s)=>{if(Array.isArray(t))return [...t,...s]},d=A;var k=t=>{t.security&&(t.security=Object.keys(t.security).map(s=>({[s]:t.security[s]})));},P=new Set(["integer","number","string","boolean","object","array"]),b={binary:"string",byte:"string",date:"string","date-time":"string",double:"number",float:"number",int32:"integer",int64:"integer",password:"string"},$=t=>{let s=t.type,r=s.endsWith("[]"),e=s.replace(/\[]$/,""),a=P.has(e),n=Object.keys(b).includes(e),o;if(t.default)switch(e){case"integer":case"int32":case"int64":{o=Number.parseInt(t.default,10);break}case"number":case"double":case"float":{o=Number.parseFloat(t.default);break}default:{o=t.default;break}}let i;a?i={default:o,type:e}:n?i={default:o,format:e,type:b[e]}:i={$ref:`#/components/schemas/${e}`};let m=r?{items:{...i},type:"array"}:{...i};e===""&&(m=void 0);let u=t.description.trim().replace(/^- /,"");return u===""&&(u=void 0),{description:u,name:t.name,rawType:s,required:!t.optional,schema:m}},D=(t,s)=>t.map(r=>{let e=$(r),a="";switch(e.name&&(a+=e.name),e.description&&(a+=` ${e.description.trim()}`),r.tag){case"operationId":case"summary":case"description":return {[r.tag]:a};case"deprecated":return {deprecated:!0};case"externalDocs":return {externalDocs:{description:e.description,url:e.name}};case"server":return {servers:[{description:e.description,url:e.name}]};case"tag":return {tags:[a]};case"cookieParam":case"headerParam":case"queryParam":case"pathParam":return {parameters:[{description:e.description,in:r.tag.replace(/Param$/,""),name:e.name,required:e.required,schema:e.schema}]};case"bodyContent":return {requestBody:{content:{[e.name.replace("*\\/*","*/*")]:{schema:e.schema}}}};case"bodyExample":{let[n,o]=e.name.split(".");return {requestBody:{content:{[n]:{examples:{[o]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}case"bodyDescription":return {requestBody:{description:a}};case"bodyRequired":return {requestBody:{required:!0}};case"response":return {responses:{[e.name]:{description:e.description}}};case"callback":return {callbacks:{[e.name]:{$ref:`#/components/callbacks/${e.rawType}`}}};case"responseContent":{let[n,o]=e.name.split(".");return {responses:{[n]:{content:{[o]:{schema:e.schema}}}}}}case"responseHeaderComponent":{let[n,o]=e.name.split(".");return {responses:{[n]:{headers:{[o]:{$ref:`#/components/headers/${e.rawType}`}}}}}}case"responseHeader":{let[n,o]=e.name.split(".");return {responses:{[n]:{headers:{[o]:{description:e.description,schema:e.schema}}}}}}case"responseExample":{let[n,o,i]=e.name.split(".");return {responses:{[n]:{content:{[o]:{examples:{[i]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}}case"responseLink":{let[n,o]=e.name.split(".");return {responses:{[n]:{links:{[o]:{$ref:`#/components/links/${e.rawType}`}}}}}}case"bodyComponent":return {requestBody:{$ref:`#/components/requestBodies/${e.rawType}`}};case"responseComponent":return {responses:{[e.name]:{$ref:`#/components/responses/${e.rawType}`}}};case"paramComponent":return {parameters:[{$ref:`#/components/parameters/${e.rawType}`}]};case"security":{let[n,o]=e.name.split("."),i=[];return o&&(i=[o]),{security:{[n]:i}}}default:return {}}}),C=(t,s)=>{let r=/^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \/.*$/;return parse(t,{spacing:"preserve"}).filter(a=>r.test(a.description.trim())).map(a=>{let n=a.tags.length+1,o=w({},...D(a.tags),d);k(o);let[i,m]=a.description.split(" "),u={[m.trim()]:{[i.toLowerCase().trim()]:{...o}}},S=JSON.parse(JSON.stringify({paths:u}));return {loc:n,spec:S}})},ee=C;var q=t=>t.split(/\r\n|\r|\n/).filter(e=>/^\s*(#\s*(?:\S.*)?)?$/.test(e)?!1:e.trim().length>0).length,h=q;var O=new Set(["openapi","info","servers","security","tags","externalDocs","components","paths"]),l=class extends Error{},M=(t,s,r)=>{let e=readFileSync(t,{encoding:"utf8"}),a=L.extname(t);if(a===".yaml"||a===".yml"){let n=I.parse(e),o=Object.keys(n).filter(i=>!O.has(i));if(o.length>0){let i=new l(`Unexpected keys: ${o.join(", ")}`);throw i.filePath=t,i}return Object.keys(n).some(i=>O.has(i))?[{loc:h(e),spec:n}]:[]}try{return s(e,r)}catch(n){throw n.filePath=t,n}},pe=M;var N=(t,s)=>{Object.keys(s).forEach(r=>{t[r]===void 0?t[r]={...s[r]}:Object.keys(s[r]).forEach(e=>{t[r][e]={...t[r][e],...s[r][e]};});});},j=N;var f=class{constructor(s){this.openapi=s.openapi,this.info=s.info,this.servers=s.servers,this.paths=s.paths??{},this.components=s.components,this.security=s.security,this.tags=s.tags,this.externalDocs=s.externalDocs;}addData(s){s.forEach(r=>{let{components:e,paths:a,...n}=r;j(this,{components:e??{},paths:a??{}}),Object.entries(n).forEach(([o,i])=>{this[o]=i;});});}},ye=f;var y=(t,s)=>w({},t,s,(r,e)=>e===null?r:void 0),x=t=>Object.keys(t).map(s=>t[s]).every(s=>typeof s=="object"&&Object.keys(s).every(r=>!(r in s))),g=(t,s)=>s.some(r=>t.name===r.name),T=t=>{switch(t.tag){case"openapi":return "v3";case"asyncapi":return "v4";case"swagger":return "v2";default:return "v2"}};var B=(t,s,r)=>{if(r==="x-webhooks"&&(t[r]=s[r]),r.startsWith("x-"))return;if(["components","consumes","produces","paths","schemas","securityDefinitions","responses","parameters","definitions","channels"].includes(r))Object.keys(s[r]).forEach(a=>{t[r][a]=y(t[r][a],s[r][a]);});else if(r==="tags"){let{tags:a}=s;Array.isArray(a)?a.forEach(n=>{g(n,t.tags)||t.tags.push(n);}):g(a,t.tags)||t.tags.push(a);}else if(r==="security"){let{security:a}=s;t.security=a;}else r.startsWith("/")&&(t.paths[r]=y(t.paths[r],s[r]));},E=B;var J={v2:["paths","definitions","responses","parameters","securityDefinitions"],v3:["paths","definitions","responses","parameters","securityDefinitions","components"],v4:["components","channels"]},H=(t,s)=>t.map(r=>{if((r.tag==="openapi"||r.tag==="swagger"||r.tag==="asyncapi")&&r.description!==""){let e=I.parseDocument(r.description);if(e.errors.length>0){e.errors.map(i=>{let m=i;return m.annotation=r.description,m});let o="Error parsing YAML in @openapi spec:";throw o+=s?e.errors.map(i=>`${i.toString()}
9
+ Imbedded within:
10
+ \`\`\`
11
+ ${i.annotation?.replace(/\n/g,`
12
+ `)}
13
+ \`\`\``).join(`
14
+ `):e.errors.map(i=>i.toString()).join(`
15
+ `),new Error(o)}let a=e.toJSON(),n={tags:[]};return J[T(r)].forEach(o=>{n[o]=n[o]||{};}),Object.keys(a).forEach(o=>{E(n,a,o);}),n}return {}}),U=(t,s)=>parse(t,{spacing:"preserve"}).map(e=>{let a=e.tags.length+1,n=w({},...H(e.tags,s),d);["definitions","responses","parameters","securityDefinitions","components","tags"].forEach(i=>{n[i]!==void 0&&x(n[i])&&delete n[i];});let o=JSON.parse(JSON.stringify(n));return {loc:a,spec:o}}),$e=U;var G=async t=>{await V.validate(t);},Re=G;
16
+
17
+ export { ee as a, h as b, pe as c, ye as d, $e as e, Re as f };
18
+ //# sourceMappingURL=out.js.map
19
+ //# sourceMappingURL=chunk-YQIJE75F.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/jsdoc/comments-to-open-api.ts","../src/util/customizer.ts","../src/util/yaml-loc.ts","../src/parse-file.ts","../src/util/object-merge.ts","../src/spec-builder.ts","../src/swagger-jsdoc/comments-to-open-api.ts","../src/swagger-jsdoc/utils.ts","../src/swagger-jsdoc/organize-swagger-object.ts","../src/validate.ts"],"names":["parseComments","mergeWith","customizer","objectValue","sourceValue","customizer_default","fixSecurityObject","thing","primitiveTypes","formatMap","parseDescription","tag","rawType","isArray","parsedType","isPrimitive","isFormat","defaultValue","rootType","schema","description","tagsToObjects","tags","verbose","parsedResponse","nameAndDescription","contentType","example","status","header","link","security","scopeItem","scope","commentsToOpenApi","fileContents","openAPIRegex","comment","loc","result","method","path","pathsObject","spec","comments_to_open_api_default","yamlLoc","string","line","yaml_loc_default","readFileSync","yaml","ALLOWED_KEYS","ParseError","parseFile","file","fileContent","extension","invalidKeys","key","error","parse_file_default","objectMerge","a","b","subKey","object_merge_default","SpecBuilder","baseDefinition","parsedFile","components","paths","rest","value","spec_builder_default","mergeDeep","first","second","hasEmptyProperty","object","keyObject","isTagPresentInTags","targetTag","getSwaggerVersionFromSpec","organizeSwaggerObject","swaggerObject","annotation","property","definition","organize_swagger_object_default","specificationTemplate","specs","parsed","newError","errorString","parsedDocument","specification","SwaggerParser","validate","validate_default"],"mappings":"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","sourcesContent":["import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\n// eslint-disable-next-line no-restricted-imports\nimport mergeWith from \"lodash.mergewith\";\n\nimport type { OpenApiObject, PathsObject } from \"../exported.d\";\nimport customizer from \"../util/customizer\";\n\n// The security object has a bizare setup...\nconst fixSecurityObject = (thing: any) => {\n if (thing.security) {\n // eslint-disable-next-line no-param-reassign\n thing.security = Object.keys(thing.security).map((s) => {\n return {\n [s]: thing.security[s],\n };\n });\n }\n};\n\nconst primitiveTypes = new Set([\"integer\", \"number\", \"string\", \"boolean\", \"object\", \"array\"]);\n\nconst formatMap: Record<string, string> = {\n binary: \"string\",\n byte: \"string\",\n date: \"string\",\n \"date-time\": \"string\",\n double: \"number\",\n float: \"number\",\n int32: \"integer\",\n int64: \"integer\",\n password: \"string\",\n};\n\nconst parseDescription = (tag: Spec): { description: string | undefined; name: string; rawType: string; required: boolean; schema: object | undefined } => {\n const rawType = tag.type;\n const isArray = rawType.endsWith(\"[]\");\n // eslint-disable-next-line regexp/strict\n const parsedType = rawType.replace(/\\[]$/, \"\");\n\n const isPrimitive = primitiveTypes.has(parsedType);\n const isFormat = Object.keys(formatMap).includes(parsedType);\n\n let defaultValue;\n\n if (tag.default) {\n switch (parsedType) {\n case \"integer\":\n case \"int32\":\n case \"int64\": {\n defaultValue = Number.parseInt(tag.default, 10);\n break;\n }\n case \"number\":\n case \"double\":\n case \"float\": {\n defaultValue = Number.parseFloat(tag.default);\n break;\n }\n default: {\n defaultValue = tag.default;\n break;\n }\n }\n }\n\n let rootType;\n\n if (isPrimitive) {\n rootType = { default: defaultValue, type: parsedType };\n } else if (isFormat) {\n rootType = {\n default: defaultValue,\n format: parsedType,\n type: formatMap[parsedType],\n };\n } else {\n rootType = { $ref: `#/components/schemas/${parsedType}` };\n }\n\n let schema: object | undefined = isArray\n ? {\n items: {\n ...rootType,\n },\n type: \"array\",\n }\n : {\n ...rootType,\n };\n\n if (parsedType === \"\") {\n schema = undefined;\n }\n\n // remove the optional dash from the description.\n let description: string | undefined = tag.description.trim().replace(/^- /, \"\");\n\n if (description === \"\") {\n description = undefined;\n }\n\n return {\n description,\n name: tag.name,\n rawType,\n required: !tag.optional,\n schema,\n };\n};\n\n// @ts-expect-error\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst tagsToObjects = (tags: Spec[], verbose?: boolean) =>\n tags.map((tag) => {\n const parsedResponse = parseDescription(tag);\n\n // Some ops only have a `description`, merge `name` and `description`\n // for these.\n let nameAndDescription = \"\";\n\n if (parsedResponse.name) {\n nameAndDescription += parsedResponse.name;\n }\n\n if (parsedResponse.description) {\n nameAndDescription += ` ${parsedResponse.description.trim()}`;\n }\n\n switch (tag.tag) {\n case \"operationId\":\n case \"summary\":\n case \"description\": {\n return { [tag.tag]: nameAndDescription };\n }\n\n case \"deprecated\": {\n return { deprecated: true };\n }\n\n case \"externalDocs\": {\n return {\n externalDocs: {\n description: parsedResponse.description,\n url: parsedResponse.name,\n },\n };\n }\n\n case \"server\": {\n return {\n servers: [\n {\n description: parsedResponse.description,\n url: parsedResponse.name,\n },\n ],\n };\n }\n\n case \"tag\": {\n return { tags: [nameAndDescription] };\n }\n\n case \"cookieParam\":\n case \"headerParam\":\n case \"queryParam\":\n case \"pathParam\": {\n return {\n parameters: [\n {\n description: parsedResponse.description,\n in: tag.tag.replace(/Param$/, \"\"),\n name: parsedResponse.name,\n required: parsedResponse.required,\n schema: parsedResponse.schema,\n },\n ],\n };\n }\n\n case \"bodyContent\": {\n return {\n requestBody: {\n content: {\n [parsedResponse.name.replace(\"*\\\\/*\", \"*/*\")]: {\n schema: parsedResponse.schema,\n },\n },\n },\n };\n }\n\n case \"bodyExample\": {\n const [contentType, example] = parsedResponse.name.split(\".\");\n\n return {\n requestBody: {\n content: {\n [contentType as string]: {\n examples: {\n [example as string]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n };\n }\n\n case \"bodyDescription\": {\n return { requestBody: { description: nameAndDescription } };\n }\n\n case \"bodyRequired\": {\n return { requestBody: { required: true } };\n }\n\n case \"response\": {\n return {\n responses: {\n [parsedResponse.name]: {\n description: parsedResponse.description,\n },\n },\n };\n }\n\n case \"callback\": {\n return {\n callbacks: {\n [parsedResponse.name]: {\n $ref: `#/components/callbacks/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"responseContent\": {\n const [status, contentType] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n content: {\n [contentType as string]: {\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeaderComponent\": {\n const [status, header] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n headers: {\n [header as string]: {\n $ref: `#/components/headers/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeader\": {\n const [status, header] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n headers: {\n [header as string]: {\n description: parsedResponse.description,\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseExample\": {\n const [status, contentType, example] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n content: {\n [contentType as string]: {\n examples: {\n [example as string]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n },\n };\n }\n\n case \"responseLink\": {\n const [status, link] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n links: {\n [link as string]: {\n $ref: `#/components/links/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"bodyComponent\": {\n return {\n requestBody: {\n $ref: `#/components/requestBodies/${parsedResponse.rawType}`,\n },\n };\n }\n\n case \"responseComponent\": {\n return {\n responses: {\n [parsedResponse.name]: {\n $ref: `#/components/responses/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"paramComponent\": {\n return {\n parameters: [{ $ref: `#/components/parameters/${parsedResponse.rawType}` }],\n };\n }\n\n case \"security\": {\n const [security, scopeItem] = parsedResponse.name.split(\".\");\n\n let scope: string[] = [];\n\n if (scopeItem) {\n scope = [scopeItem];\n }\n\n return {\n security: { [security as string]: scope },\n };\n }\n\n default: {\n return {};\n }\n }\n });\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { loc: number; spec: OpenApiObject }[] => {\n // eslint-disable-next-line regexp/no-unused-capturing-group\n const openAPIRegex = /^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \\/.*$/;\n\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments\n .filter((comment) => openAPIRegex.test(comment.description.trim()))\n .map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n fixSecurityObject(result);\n\n const [method, path]: string[] = comment.description.split(\" \");\n\n const pathsObject: PathsObject = {\n [(path as string).trim()]: {\n [(method as string).toLowerCase().trim()]: {\n ...result,\n },\n },\n };\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify({ paths: pathsObject }));\n\n return {\n loc,\n spec,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","const customizer = (objectValue: unknown, sourceValue: unknown[]): unknown[] | undefined => {\n if (Array.isArray(objectValue)) {\n return [...objectValue, ...sourceValue] as unknown[];\n }\n\n return undefined;\n};\n\nexport default customizer;\n","const yamlLoc = (string: string): number => {\n // Break string into lines.\n const split = string.split(/\\r\\n|\\r|\\n/);\n\n const filtered = split.filter((line) => {\n // Remove comments.\n // eslint-disable-next-line security/detect-unsafe-regex,regexp/no-unused-capturing-group\n if (/^\\s*(#\\s*(?:\\S.*)?)?$/.test(line)) {\n return false;\n }\n // Remove empty lines.\n return line.trim().length > 0;\n });\n\n return filtered.length;\n};\n\nexport default yamlLoc;\n","import { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport yaml from \"yaml\";\n\nimport type { OpenApiObject } from \"./exported.d\";\nimport yamlLoc from \"./util/yaml-loc\";\n\nconst ALLOWED_KEYS = new Set([\"openapi\", \"info\", \"servers\", \"security\", \"tags\", \"externalDocs\", \"components\", \"paths\"]);\n\nclass ParseError extends Error {\n public filePath?: string;\n}\n\nconst parseFile = (\n file: string,\n commentsToOpenApi: (fileContent: string, verbose?: boolean) => { loc: number; spec: OpenApiObject }[],\n verbose?: boolean,\n): { loc: number; spec: OpenApiObject }[] => {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n const fileContent = readFileSync(file, { encoding: \"utf8\" });\n const extension = path.extname(file);\n\n if (extension === \".yaml\" || extension === \".yml\") {\n const spec = yaml.parse(fileContent);\n const invalidKeys = Object.keys(spec).filter((key) => !ALLOWED_KEYS.has(key));\n\n if (invalidKeys.length > 0) {\n const error = new ParseError(`Unexpected keys: ${invalidKeys.join(\", \")}`);\n\n error.filePath = file;\n\n throw error;\n }\n\n if (Object.keys(spec).some((key) => ALLOWED_KEYS.has(key))) {\n const loc = yamlLoc(fileContent);\n\n return [{ loc, spec }];\n }\n\n return [];\n }\n\n try {\n return commentsToOpenApi(fileContent, verbose);\n } catch (error: any) {\n error.filePath = file;\n\n throw error;\n }\n};\n\nexport default parseFile;\n","const objectMerge = <T>(a: T, b: T): void => {\n Object.keys(b as object).forEach((key) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (a[key as keyof typeof b] === undefined) {\n // eslint-disable-next-line no-param-reassign\n a[key as keyof typeof b] = {\n ...b[key as keyof typeof b],\n };\n } else {\n Object.keys(b[key as keyof typeof b] as object).forEach((subKey) => {\n // eslint-disable-next-line no-param-reassign\n (a[key as keyof typeof b] as Record<string, object>)[subKey] = {\n ...(a[key as keyof typeof b] as Record<string, object>)[subKey],\n ...(b[key as keyof typeof b] as Record<string, object>)[subKey],\n };\n });\n }\n });\n};\n\nexport default objectMerge;\n","import type {\n BaseDefinition,\n ComponentsObject,\n ExternalDocumentationObject,\n InfoObject,\n OpenApiObject,\n PathsObject,\n SecurityRequirementObject,\n ServerObject,\n TagObject,\n} from \"./exported.d\";\nimport objectMerge from \"./util/object-merge\";\n\nclass SpecBuilder implements OpenApiObject {\n public components?: ComponentsObject;\n\n public externalDocs?: ExternalDocumentationObject;\n\n public info: InfoObject;\n\n public openapi: string;\n\n public paths: PathsObject;\n\n public security?: SecurityRequirementObject[];\n\n public servers?: ServerObject[];\n\n public tags?: TagObject[];\n\n public constructor(baseDefinition: BaseDefinition) {\n this.openapi = baseDefinition.openapi;\n this.info = baseDefinition.info;\n this.servers = baseDefinition.servers;\n this.paths = baseDefinition.paths ?? {};\n this.components = baseDefinition.components;\n this.security = baseDefinition.security;\n this.tags = baseDefinition.tags;\n this.externalDocs = baseDefinition.externalDocs;\n }\n\n public addData(parsedFile: OpenApiObject[]): void {\n parsedFile.forEach((file) => {\n const { components, paths, ...rest } = file;\n\n // only merge paths and components\n objectMerge(this, {\n components: components ?? {},\n paths: paths ?? {},\n } as OpenApiObject);\n\n // overwrite everything else:\n Object.entries(rest).forEach(([key, value]) => {\n // @ts-expect-error\n this[key as keyof OpenApiObject] = value;\n });\n });\n }\n}\n\nexport default SpecBuilder;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\n// eslint-disable-next-line no-restricted-imports\nimport mergeWith from \"lodash.mergewith\";\nimport type { YAMLError } from \"yaml\";\nimport yaml from \"yaml\";\n\nimport type { OpenApiObject } from \"../exported.d\";\nimport customizer from \"../util/customizer\";\nimport organizeSwaggerObject from \"./organize-swagger-object\";\nimport { getSwaggerVersionFromSpec, hasEmptyProperty } from \"./utils\";\n\nconst specificationTemplate = {\n v2: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\"],\n v3: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\"],\n v4: [\"components\", \"channels\"],\n};\n\ntype ExtendedYAMLError = YAMLError & { annotation?: string };\n\nconst tagsToObjects = (specs: Spec[], verbose?: boolean) =>\n specs.map((spec: Spec) => {\n if ((spec.tag === \"openapi\" || spec.tag === \"swagger\" || spec.tag === \"asyncapi\") && spec.description !== \"\") {\n const parsed = yaml.parseDocument(spec.description);\n\n if (parsed.errors.length > 0) {\n parsed.errors.map<ExtendedYAMLError>((error) => {\n const newError: ExtendedYAMLError = error;\n\n newError.annotation = spec.description;\n\n return newError;\n });\n\n let errorString = \"Error parsing YAML in @openapi spec:\";\n\n errorString += verbose\n ? (parsed.errors as ExtendedYAMLError[])\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n .map((error) => `${error.toString()}\\nImbedded within:\\n\\`\\`\\`\\n ${error.annotation?.replace(/\\n/g, \"\\n \")}\\n\\`\\`\\``)\n .join(\"\\n\")\n : // eslint-disable-next-line @typescript-eslint/no-base-to-string\n parsed.errors.map((error) => error.toString()).join(\"\\n\");\n\n throw new Error(errorString);\n }\n\n const parsedDocument = parsed.toJSON();\n const specification: Record<string, any> = {\n tags: [],\n };\n\n specificationTemplate[getSwaggerVersionFromSpec(spec)].forEach((property) => {\n specification[property] = specification[property] || {};\n });\n\n Object.keys(parsedDocument).forEach((property) => {\n organizeSwaggerObject(specification, parsedDocument, property);\n });\n\n return specification;\n }\n\n return {};\n });\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { loc: number; spec: OpenApiObject }[] => {\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments.map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n [\"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\", \"tags\"].forEach((property) => {\n if (result[property] !== undefined && hasEmptyProperty(result[property])) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete result[property];\n }\n });\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify(result));\n\n return {\n loc,\n spec,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","import type { Spec } from \"comment-parser\";\n// eslint-disable-next-line no-restricted-imports\nimport mergeWith from \"lodash.mergewith\";\n\n/**\n * A recursive deep-merge that ignores null values when merging.\n * This returns the merged object and does not mutate.\n * @param {object} first the first object to get merged\n * @param {object} second the second object to get merged\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-return\nexport const mergeDeep = (first?: object, second?: object): object => mergeWith({}, first, second, (a, b) => (b === null ? a : undefined));\n\n/**\n * Checks if there is any properties of the input object which are an empty object\n * @param {object} object - the object to check\n * @returns boolean\n */\nexport const hasEmptyProperty = (object: Record<string, any>): boolean =>\n Object.keys(object)\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n .map((key) => object[key])\n .every((keyObject) => typeof keyObject === \"object\" && Object.keys(keyObject).every((key) => !(key in keyObject)));\n\n/**\n * @param {object} tag\n * @param {array} tags\n * @returns boolean\n */\nexport const isTagPresentInTags = (tag: Spec, tags: Spec[]): boolean => tags.some((targetTag) => tag.name === targetTag.name);\n\nexport const getSwaggerVersionFromSpec = (tag: Spec): \"v2\" | \"v3\" | \"v4\" => {\n switch (tag.tag) {\n case \"openapi\": {\n return \"v3\";\n }\n case \"asyncapi\": {\n return \"v4\";\n }\n case \"swagger\": {\n return \"v2\";\n }\n default: {\n return \"v2\";\n }\n }\n};\n","import { isTagPresentInTags, mergeDeep } from \"./utils\";\n\n/**\n * @param {object} swaggerObject\n * @param {object} annotation\n * @param {string} property\n */\n\nconst organizeSwaggerObject = (swaggerObject: Record<string, any>, annotation: Record<string, any>, property: string): void => {\n // Root property on purpose.\n // eslint-disable-next-line no-secrets/no-secrets\n // @see https://github.com/OAI/OpenAPI-Specification/blob/master/proposals/002_Webhooks.md#proposed-solution\n if (property === \"x-webhooks\") {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property] = annotation[property];\n }\n\n // Other extensions can be in varying places depending on different vendors and opinions.\n // The following return makes it so that they are not put in `paths` in the last case.\n // New specific extensions will need to be handled on case-by-case if to be included in `paths`.\n if (property.startsWith(\"x-\")) {\n return;\n }\n\n const commonProperties = [\n \"components\",\n \"consumes\",\n \"produces\",\n \"paths\",\n \"schemas\",\n \"securityDefinitions\",\n \"responses\",\n \"parameters\",\n \"definitions\",\n \"channels\",\n ];\n\n if (commonProperties.includes(property)) {\n Object.keys(annotation[property]).forEach((definition) => {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property][definition] = mergeDeep(swaggerObject[property][definition], annotation[property][definition]);\n });\n } else if (property === \"tags\") {\n const { tags } = annotation;\n\n if (Array.isArray(tags)) {\n tags.forEach((tag) => {\n if (!isTagPresentInTags(tag, swaggerObject[\"tags\"])) {\n swaggerObject[\"tags\"].push(tag);\n }\n });\n } else if (!isTagPresentInTags(tags, swaggerObject[\"tags\"])) {\n swaggerObject[\"tags\"].push(tags);\n }\n } else if (property === \"security\") {\n const { security } = annotation;\n\n // eslint-disable-next-line no-param-reassign\n swaggerObject[\"security\"] = security;\n } else if (property.startsWith(\"/\")) {\n // Paths which are not defined as \"paths\" property, starting with a slash \"/\"\n // eslint-disable-next-line no-param-reassign\n swaggerObject[\"paths\"][property] = mergeDeep(swaggerObject[\"paths\"][property], annotation[property]);\n }\n};\n\nexport default organizeSwaggerObject;\n","import SwaggerParser from \"@apidevtools/swagger-parser\";\nimport type OpenAPI from \"openapi-types\";\n\nconst validate = async (spec: Record<string, unknown>): Promise<void> => {\n await SwaggerParser.validate(spec as OpenAPI.OpenAPI.Document);\n};\n\nexport default validate;\n"]}
1
+ {"version":3,"sources":["../src/jsdoc/comments-to-open-api.ts","../src/util/customizer.ts","../src/util/yaml-loc.ts","../src/parse-file.ts","../src/util/object-merge.ts","../src/spec-builder.ts","../src/swagger-jsdoc/comments-to-open-api.ts","../src/swagger-jsdoc/utils.ts","../src/swagger-jsdoc/organize-swagger-object.ts","../src/validate.ts"],"names":["parseComments","mergeWith","customizer","objectValue","sourceValue","customizer_default","fixSecurityObject","thing","primitiveTypes","formatMap","parseDescription","tag","rawType","isArray","parsedType","isPrimitive","isFormat","defaultValue","rootType","schema","description","tagsToObjects","tags","verbose","parsedResponse","nameAndDescription","contentType","example","status","header","link","security","scopeItem","scope","commentsToOpenApi","fileContents","openAPIRegex","comment","loc","result","method","path","pathsObject","spec","comments_to_open_api_default","yamlLoc","string","line","yaml_loc_default","readFileSync","yaml","ALLOWED_KEYS","ParseError","parseFile","file","fileContent","extension","invalidKeys","key","error","parse_file_default","objectMerge","a","b","subKey","object_merge_default","SpecBuilder","baseDefinition","parsedFile","components","paths","rest","value","spec_builder_default","mergeDeep","first","second","hasEmptyProperty","object","keyObject","isTagPresentInTags","targetTag","getSwaggerVersionFromSpec","organizeSwaggerObject","swaggerObject","annotation","property","definition","organize_swagger_object_default","specificationTemplate","specs","parsed","newError","errorString","parsedDocument","specification","SwaggerParser","validate","validate_default"],"mappings":"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","sourcesContent":["import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\n// eslint-disable-next-line no-restricted-imports\nimport mergeWith from \"lodash.mergewith\";\n\nimport type { OpenApiObject, PathsObject } from \"../exported.d\";\nimport customizer from \"../util/customizer\";\n\n// The security object has a bizare setup...\nconst fixSecurityObject = (thing: any) => {\n if (thing.security) {\n // eslint-disable-next-line no-param-reassign\n thing.security = Object.keys(thing.security).map((s) => {\n return {\n [s]: thing.security[s],\n };\n });\n }\n};\n\nconst primitiveTypes = new Set([\"integer\", \"number\", \"string\", \"boolean\", \"object\", \"array\"]);\n\nconst formatMap: Record<string, string> = {\n binary: \"string\",\n byte: \"string\",\n date: \"string\",\n \"date-time\": \"string\",\n double: \"number\",\n float: \"number\",\n int32: \"integer\",\n int64: \"integer\",\n password: \"string\",\n};\n\nconst parseDescription = (tag: Spec): { description: string | undefined; name: string; rawType: string; required: boolean; schema: object | undefined } => {\n const rawType = tag.type;\n const isArray = rawType.endsWith(\"[]\");\n // eslint-disable-next-line regexp/strict\n const parsedType = rawType.replace(/\\[]$/, \"\");\n\n const isPrimitive = primitiveTypes.has(parsedType);\n const isFormat = Object.keys(formatMap).includes(parsedType);\n\n let defaultValue;\n\n if (tag.default) {\n switch (parsedType) {\n case \"integer\":\n case \"int32\":\n case \"int64\": {\n defaultValue = Number.parseInt(tag.default, 10);\n break;\n }\n case \"number\":\n case \"double\":\n case \"float\": {\n defaultValue = Number.parseFloat(tag.default);\n break;\n }\n default: {\n defaultValue = tag.default;\n break;\n }\n }\n }\n\n let rootType;\n\n if (isPrimitive) {\n rootType = { default: defaultValue, type: parsedType };\n } else if (isFormat) {\n rootType = {\n default: defaultValue,\n format: parsedType,\n type: formatMap[parsedType],\n };\n } else {\n rootType = { $ref: `#/components/schemas/${parsedType}` };\n }\n\n let schema: object | undefined = isArray\n ? {\n items: {\n ...rootType,\n },\n type: \"array\",\n }\n : {\n ...rootType,\n };\n\n if (parsedType === \"\") {\n schema = undefined;\n }\n\n // remove the optional dash from the description.\n let description: string | undefined = tag.description.trim().replace(/^- /, \"\");\n\n if (description === \"\") {\n description = undefined;\n }\n\n return {\n description,\n name: tag.name,\n rawType,\n required: !tag.optional,\n schema,\n };\n};\n\n// @ts-expect-error\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst tagsToObjects = (tags: Spec[], verbose?: boolean) =>\n tags.map((tag) => {\n const parsedResponse = parseDescription(tag);\n\n // Some ops only have a `description`, merge `name` and `description`\n // for these.\n let nameAndDescription = \"\";\n\n if (parsedResponse.name) {\n nameAndDescription += parsedResponse.name;\n }\n\n if (parsedResponse.description) {\n nameAndDescription += ` ${parsedResponse.description.trim()}`;\n }\n\n switch (tag.tag) {\n case \"operationId\":\n case \"summary\":\n case \"description\": {\n return { [tag.tag]: nameAndDescription };\n }\n\n case \"deprecated\": {\n return { deprecated: true };\n }\n\n case \"externalDocs\": {\n return {\n externalDocs: {\n description: parsedResponse.description,\n url: parsedResponse.name,\n },\n };\n }\n\n case \"server\": {\n return {\n servers: [\n {\n description: parsedResponse.description,\n url: parsedResponse.name,\n },\n ],\n };\n }\n\n case \"tag\": {\n return { tags: [nameAndDescription] };\n }\n\n case \"cookieParam\":\n case \"headerParam\":\n case \"queryParam\":\n case \"pathParam\": {\n return {\n parameters: [\n {\n description: parsedResponse.description,\n in: tag.tag.replace(/Param$/, \"\"),\n name: parsedResponse.name,\n required: parsedResponse.required,\n schema: parsedResponse.schema,\n },\n ],\n };\n }\n\n case \"bodyContent\": {\n return {\n requestBody: {\n content: {\n [parsedResponse.name.replace(\"*\\\\/*\", \"*/*\")]: {\n schema: parsedResponse.schema,\n },\n },\n },\n };\n }\n\n case \"bodyExample\": {\n const [contentType, example] = parsedResponse.name.split(\".\");\n\n return {\n requestBody: {\n content: {\n [contentType as string]: {\n examples: {\n [example as string]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n };\n }\n\n case \"bodyDescription\": {\n return { requestBody: { description: nameAndDescription } };\n }\n\n case \"bodyRequired\": {\n return { requestBody: { required: true } };\n }\n\n case \"response\": {\n return {\n responses: {\n [parsedResponse.name]: {\n description: parsedResponse.description,\n },\n },\n };\n }\n\n case \"callback\": {\n return {\n callbacks: {\n [parsedResponse.name]: {\n $ref: `#/components/callbacks/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"responseContent\": {\n const [status, contentType] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n content: {\n [contentType as string]: {\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeaderComponent\": {\n const [status, header] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n headers: {\n [header as string]: {\n $ref: `#/components/headers/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeader\": {\n const [status, header] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n headers: {\n [header as string]: {\n description: parsedResponse.description,\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseExample\": {\n const [status, contentType, example] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n content: {\n [contentType as string]: {\n examples: {\n [example as string]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n },\n };\n }\n\n case \"responseLink\": {\n const [status, link] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n links: {\n [link as string]: {\n $ref: `#/components/links/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"bodyComponent\": {\n return {\n requestBody: {\n $ref: `#/components/requestBodies/${parsedResponse.rawType}`,\n },\n };\n }\n\n case \"responseComponent\": {\n return {\n responses: {\n [parsedResponse.name]: {\n $ref: `#/components/responses/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"paramComponent\": {\n return {\n parameters: [{ $ref: `#/components/parameters/${parsedResponse.rawType}` }],\n };\n }\n\n case \"security\": {\n const [security, scopeItem] = parsedResponse.name.split(\".\");\n\n let scope: string[] = [];\n\n if (scopeItem) {\n scope = [scopeItem];\n }\n\n return {\n security: { [security as string]: scope },\n };\n }\n\n default: {\n return {};\n }\n }\n });\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { loc: number; spec: OpenApiObject }[] => {\n // eslint-disable-next-line regexp/no-unused-capturing-group\n const openAPIRegex = /^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \\/.*$/;\n\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return jsDocumentComments\n .filter((comment) => openAPIRegex.test(comment.description.trim()))\n .map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n fixSecurityObject(result);\n\n const [method, path]: string[] = comment.description.split(\" \");\n\n const pathsObject: PathsObject = {\n [(path as string).trim()]: {\n [(method as string).toLowerCase().trim()]: {\n ...result,\n },\n },\n };\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify({ paths: pathsObject }));\n\n return {\n loc,\n spec,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","const customizer = (objectValue: unknown, sourceValue: unknown[]): unknown[] | undefined => {\n if (Array.isArray(objectValue)) {\n return [...objectValue, ...sourceValue] as unknown[];\n }\n\n return undefined;\n};\n\nexport default customizer;\n","const yamlLoc = (string: string): number => {\n // Break string into lines.\n const split = string.split(/\\r\\n|\\r|\\n/);\n\n const filtered = split.filter((line) => {\n // Remove comments.\n // eslint-disable-next-line security/detect-unsafe-regex,regexp/no-unused-capturing-group\n if (/^\\s*(#\\s*(?:\\S.*)?)?$/.test(line)) {\n return false;\n }\n // Remove empty lines.\n return line.trim().length > 0;\n });\n\n return filtered.length;\n};\n\nexport default yamlLoc;\n","import { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport yaml from \"yaml\";\n\nimport type { OpenApiObject } from \"./exported.d\";\nimport yamlLoc from \"./util/yaml-loc\";\n\nconst ALLOWED_KEYS = new Set([\"openapi\", \"info\", \"servers\", \"security\", \"tags\", \"externalDocs\", \"components\", \"paths\"]);\n\nclass ParseError extends Error {\n public filePath?: string;\n}\n\nconst parseFile = (\n file: string,\n commentsToOpenApi: (fileContent: string, verbose?: boolean) => { loc: number; spec: OpenApiObject }[],\n verbose?: boolean,\n): { loc: number; spec: OpenApiObject }[] => {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n const fileContent = readFileSync(file, { encoding: \"utf8\" });\n const extension = path.extname(file);\n\n if (extension === \".yaml\" || extension === \".yml\") {\n const spec = yaml.parse(fileContent);\n const invalidKeys = Object.keys(spec).filter((key) => !ALLOWED_KEYS.has(key));\n\n if (invalidKeys.length > 0) {\n const error = new ParseError(`Unexpected keys: ${invalidKeys.join(\", \")}`);\n\n error.filePath = file;\n\n throw error;\n }\n\n if (Object.keys(spec).some((key) => ALLOWED_KEYS.has(key))) {\n const loc = yamlLoc(fileContent);\n\n return [{ loc, spec }];\n }\n\n return [];\n }\n\n try {\n return commentsToOpenApi(fileContent, verbose);\n } catch (error: any) {\n error.filePath = file;\n\n throw error;\n }\n};\n\nexport default parseFile;\n","const objectMerge = <T>(a: T, b: T): void => {\n Object.keys(b as object).forEach((key) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (a[key as keyof typeof b] === undefined) {\n // eslint-disable-next-line no-param-reassign\n a[key as keyof typeof b] = {\n ...b[key as keyof typeof b],\n };\n } else {\n Object.keys(b[key as keyof typeof b] as object).forEach((subKey) => {\n // eslint-disable-next-line no-param-reassign\n (a[key as keyof typeof b] as Record<string, object>)[subKey] = {\n ...(a[key as keyof typeof b] as Record<string, object>)[subKey],\n ...(b[key as keyof typeof b] as Record<string, object>)[subKey],\n };\n });\n }\n });\n};\n\nexport default objectMerge;\n","import type {\n BaseDefinition,\n ComponentsObject,\n ExternalDocumentationObject,\n InfoObject,\n OpenApiObject,\n PathsObject,\n SecurityRequirementObject,\n ServerObject,\n TagObject,\n} from \"./exported.d\";\nimport objectMerge from \"./util/object-merge\";\n\nclass SpecBuilder implements OpenApiObject {\n public components?: ComponentsObject;\n\n public externalDocs?: ExternalDocumentationObject;\n\n public info: InfoObject;\n\n public openapi: string;\n\n public paths: PathsObject;\n\n public security?: SecurityRequirementObject[];\n\n public servers?: ServerObject[];\n\n public tags?: TagObject[];\n\n public constructor(baseDefinition: BaseDefinition) {\n this.openapi = baseDefinition.openapi;\n this.info = baseDefinition.info;\n this.servers = baseDefinition.servers;\n this.paths = baseDefinition.paths ?? {};\n this.components = baseDefinition.components;\n this.security = baseDefinition.security;\n this.tags = baseDefinition.tags;\n this.externalDocs = baseDefinition.externalDocs;\n }\n\n public addData(parsedFile: OpenApiObject[]): void {\n parsedFile.forEach((file) => {\n const { components, paths, ...rest } = file;\n\n // only merge paths and components\n objectMerge(this, {\n components: components ?? {},\n paths: paths ?? {},\n } as OpenApiObject);\n\n // overwrite everything else:\n Object.entries(rest).forEach(([key, value]) => {\n // @ts-expect-error\n this[key as keyof OpenApiObject] = value;\n });\n });\n }\n}\n\nexport default SpecBuilder;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\n// eslint-disable-next-line no-restricted-imports\nimport mergeWith from \"lodash.mergewith\";\nimport type { YAMLError } from \"yaml\";\nimport yaml from \"yaml\";\n\nimport type { OpenApiObject } from \"../exported.d\";\nimport customizer from \"../util/customizer\";\nimport organizeSwaggerObject from \"./organize-swagger-object\";\nimport { getSwaggerVersionFromSpec, hasEmptyProperty } from \"./utils\";\n\nconst specificationTemplate = {\n v2: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\"],\n v3: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\"],\n v4: [\"components\", \"channels\"],\n};\n\ntype ExtendedYAMLError = YAMLError & { annotation?: string };\n\nconst tagsToObjects = (specs: Spec[], verbose?: boolean) =>\n specs.map((spec: Spec) => {\n if ((spec.tag === \"openapi\" || spec.tag === \"swagger\" || spec.tag === \"asyncapi\") && spec.description !== \"\") {\n const parsed = yaml.parseDocument(spec.description);\n\n if (parsed.errors.length > 0) {\n parsed.errors.map<ExtendedYAMLError>((error) => {\n const newError: ExtendedYAMLError = error;\n\n newError.annotation = spec.description;\n\n return newError;\n });\n\n let errorString = \"Error parsing YAML in @openapi spec:\";\n\n errorString += verbose\n ? (parsed.errors as ExtendedYAMLError[])\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n .map((error) => `${error.toString()}\\nImbedded within:\\n\\`\\`\\`\\n ${error.annotation?.replace(/\\n/g, \"\\n \")}\\n\\`\\`\\``)\n .join(\"\\n\")\n : // eslint-disable-next-line @typescript-eslint/no-base-to-string\n parsed.errors.map((error) => error.toString()).join(\"\\n\");\n\n throw new Error(errorString);\n }\n\n const parsedDocument = parsed.toJSON();\n const specification: Record<string, any> = {\n tags: [],\n };\n\n specificationTemplate[getSwaggerVersionFromSpec(spec)].forEach((property) => {\n specification[property] = specification[property] || {};\n });\n\n Object.keys(parsedDocument).forEach((property) => {\n organizeSwaggerObject(specification, parsedDocument, property);\n });\n\n return specification;\n }\n\n return {};\n });\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { loc: number; spec: OpenApiObject }[] => {\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return jsDocumentComments.map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n [\"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\", \"tags\"].forEach((property) => {\n if (result[property] !== undefined && hasEmptyProperty(result[property])) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete result[property];\n }\n });\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify(result));\n\n return {\n loc,\n spec,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","import type { Spec } from \"comment-parser\";\n// eslint-disable-next-line no-restricted-imports\nimport mergeWith from \"lodash.mergewith\";\n\n/**\n * A recursive deep-merge that ignores null values when merging.\n * This returns the merged object and does not mutate.\n * @param {object} first the first object to get merged\n * @param {object} second the second object to get merged\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-return\nexport const mergeDeep = (first?: object, second?: object): object => mergeWith({}, first, second, (a, b) => (b === null ? a : undefined));\n\n/**\n * Checks if there is any properties of the input object which are an empty object\n * @param {object} object - the object to check\n * @returns boolean\n */\nexport const hasEmptyProperty = (object: Record<string, any>): boolean =>\n Object.keys(object)\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n .map((key) => object[key])\n .every((keyObject) => typeof keyObject === \"object\" && Object.keys(keyObject).every((key) => !(key in keyObject)));\n\n/**\n * @param {object} tag\n * @param {array} tags\n * @returns boolean\n */\nexport const isTagPresentInTags = (tag: Spec, tags: Spec[]): boolean => tags.some((targetTag) => tag.name === targetTag.name);\n\nexport const getSwaggerVersionFromSpec = (tag: Spec): \"v2\" | \"v3\" | \"v4\" => {\n switch (tag.tag) {\n case \"openapi\": {\n return \"v3\";\n }\n case \"asyncapi\": {\n return \"v4\";\n }\n case \"swagger\": {\n return \"v2\";\n }\n default: {\n return \"v2\";\n }\n }\n};\n","import { isTagPresentInTags, mergeDeep } from \"./utils\";\n\n/**\n * @param {object} swaggerObject\n * @param {object} annotation\n * @param {string} property\n */\n\nconst organizeSwaggerObject = (swaggerObject: Record<string, any>, annotation: Record<string, any>, property: string): void => {\n // Root property on purpose.\n // eslint-disable-next-line no-secrets/no-secrets\n // @see https://github.com/OAI/OpenAPI-Specification/blob/master/proposals/002_Webhooks.md#proposed-solution\n if (property === \"x-webhooks\") {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property] = annotation[property];\n }\n\n // Other extensions can be in varying places depending on different vendors and opinions.\n // The following return makes it so that they are not put in `paths` in the last case.\n // New specific extensions will need to be handled on case-by-case if to be included in `paths`.\n if (property.startsWith(\"x-\")) {\n return;\n }\n\n const commonProperties = [\n \"components\",\n \"consumes\",\n \"produces\",\n \"paths\",\n \"schemas\",\n \"securityDefinitions\",\n \"responses\",\n \"parameters\",\n \"definitions\",\n \"channels\",\n ];\n\n if (commonProperties.includes(property)) {\n Object.keys(annotation[property]).forEach((definition) => {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property][definition] = mergeDeep(swaggerObject[property][definition], annotation[property][definition]);\n });\n } else if (property === \"tags\") {\n const { tags } = annotation;\n\n if (Array.isArray(tags)) {\n tags.forEach((tag) => {\n if (!isTagPresentInTags(tag, swaggerObject[\"tags\"])) {\n swaggerObject[\"tags\"].push(tag);\n }\n });\n } else if (!isTagPresentInTags(tags, swaggerObject[\"tags\"])) {\n swaggerObject[\"tags\"].push(tags);\n }\n } else if (property === \"security\") {\n const { security } = annotation;\n\n // eslint-disable-next-line no-param-reassign\n swaggerObject[\"security\"] = security;\n } else if (property.startsWith(\"/\")) {\n // Paths which are not defined as \"paths\" property, starting with a slash \"/\"\n // eslint-disable-next-line no-param-reassign\n swaggerObject[\"paths\"][property] = mergeDeep(swaggerObject[\"paths\"][property], annotation[property]);\n }\n};\n\nexport default organizeSwaggerObject;\n","import SwaggerParser from \"@apidevtools/swagger-parser\";\nimport type OpenAPI from \"openapi-types\";\n\nconst validate = async (spec: Record<string, unknown>): Promise<void> => {\n await SwaggerParser.validate(spec as OpenAPI.OpenAPI.Document);\n};\n\nexport default validate;\n"]}
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var chunkGBW65CGH_js = require('../../chunk-GBW65CGH.js');
4
- require('../../chunk-D7VYGB4A.js');
3
+ var chunkMXORJ2KC_js = require('../../chunk-MXORJ2KC.js');
4
+ require('../../chunk-VNK4L5RV.js');
5
5
  var process = require('process');
6
6
 
7
- var s=(o,e="generate",t=".openapirc.js")=>{o.command(e).description("Generates OpenAPI (Swagger) documentation from JSDoc's").usage("[options] <path ...>").argument("[path ...]","Paths to files or directories to parse").option("-c, --config [.openapirc.js]","@visulima/jsdoc-open-api config file path.").option("-o, --output [swaggerSpec.json]","Output swagger specification.").option("-v, --verbose","Verbose output.").option("-vv, --very-verbose","Very verbose output.").action(async(r,a)=>{try{await chunkGBW65CGH_js.a(t,r,a);}catch(m){console.error(m),process.exit(1);}});},c=s;var f=(o,e="init",t="Inits a pre-configured @visulima/jsdoc-open-api config file.",r=".openapirc.js")=>{o.command(e).description(t).action(()=>{try{chunkGBW65CGH_js.b(r);}catch(a){console.error(a),process.exit(1);}});},u=f;
7
+ var c=(o,e="generate",t=".openapirc.js")=>{o.command(e).description("Generates OpenAPI (Swagger) documentation from JSDoc's").usage("[options] <path ...>").argument("[path ...]","Paths to files or directories to parse").option("-c, --config [.openapirc.js]","@visulima/jsdoc-open-api config file path.").option("-o, --output [swaggerSpec.json]","Output swagger specification.").option("-v, --verbose","Verbose output.").option("-vv, --very-verbose","Very verbose output.").action(async(r,a)=>{try{await chunkMXORJ2KC_js.a(t,r,a);}catch(p){console.error(p),process.exit(1);}});},d=c;var u=(o,e="init",t="Inits a pre-configured @visulima/jsdoc-open-api config file.",r=".openapirc.js")=>{o.command(e).description(t).action(()=>{try{chunkMXORJ2KC_js.b(r);}catch(a){console.error(a),process.exit(1);}});},g=u;
8
8
 
9
- exports.generateCommand = c;
10
- exports.initCommand = u;
9
+ exports.generateCommand = d;
10
+ exports.initCommand = g;
11
11
  //# sourceMappingURL=out.js.map
12
12
  //# sourceMappingURL=index.js.map
@@ -1,9 +1,9 @@
1
- import { a, b } from '../../chunk-W7GBDROK.mjs';
2
- import '../../chunk-WHYPHVY6.mjs';
1
+ import { a, b } from '../../chunk-NGEOD27G.mjs';
2
+ import '../../chunk-YQIJE75F.mjs';
3
3
  import { exit } from 'process';
4
4
 
5
- var s=(o,e="generate",t=".openapirc.js")=>{o.command(e).description("Generates OpenAPI (Swagger) documentation from JSDoc's").usage("[options] <path ...>").argument("[path ...]","Paths to files or directories to parse").option("-c, --config [.openapirc.js]","@visulima/jsdoc-open-api config file path.").option("-o, --output [swaggerSpec.json]","Output swagger specification.").option("-v, --verbose","Verbose output.").option("-vv, --very-verbose","Very verbose output.").action(async(r,a$1)=>{try{await a(t,r,a$1);}catch(m){console.error(m),exit(1);}});},c=s;var f=(o,e="init",t="Inits a pre-configured @visulima/jsdoc-open-api config file.",r=".openapirc.js")=>{o.command(e).description(t).action(()=>{try{b(r);}catch(a){console.error(a),exit(1);}});},u=f;
5
+ var d=(o,e="generate",t=".openapirc.js")=>{o.command(e).description("Generates OpenAPI (Swagger) documentation from JSDoc's").usage("[options] <path ...>").argument("[path ...]","Paths to files or directories to parse").option("-c, --config [.openapirc.js]","@visulima/jsdoc-open-api config file path.").option("-o, --output [swaggerSpec.json]","Output swagger specification.").option("-v, --verbose","Verbose output.").option("-vv, --very-verbose","Very verbose output.").action(async(r,a$1)=>{try{await a(t,r,a$1);}catch(s){console.error(s),exit(1);}});},f=d;var g=(o,e="init",t="Inits a pre-configured @visulima/jsdoc-open-api config file.",r=".openapirc.js")=>{o.command(e).description(t).action(()=>{try{b(r);}catch(a){console.error(a),exit(1);}});},l=g;
6
6
 
7
- export { c as generateCommand, u as initCommand };
7
+ export { f as generateCommand, l as initCommand };
8
8
  //# sourceMappingURL=out.js.map
9
9
  //# sourceMappingURL=index.mjs.map
package/dist/cli/index.js CHANGED
@@ -1,17 +1,17 @@
1
1
  'use strict';
2
2
 
3
- var chunkGBW65CGH_js = require('../chunk-GBW65CGH.js');
4
- require('../chunk-D7VYGB4A.js');
3
+ var chunkMXORJ2KC_js = require('../chunk-MXORJ2KC.js');
4
+ require('../chunk-VNK4L5RV.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, 'generateCommand', {
9
9
  enumerable: true,
10
- get: function () { return chunkGBW65CGH_js.a; }
10
+ get: function () { return chunkMXORJ2KC_js.a; }
11
11
  });
12
12
  Object.defineProperty(exports, 'initCommand', {
13
13
  enumerable: true,
14
- get: function () { return chunkGBW65CGH_js.b; }
14
+ get: function () { return chunkMXORJ2KC_js.b; }
15
15
  });
16
16
  //# sourceMappingURL=out.js.map
17
17
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- export { a as generateCommand, b as initCommand } from '../chunk-W7GBDROK.mjs';
2
- import '../chunk-WHYPHVY6.mjs';
1
+ export { a as generateCommand, b as initCommand } from '../chunk-NGEOD27G.mjs';
2
+ import '../chunk-YQIJE75F.mjs';
3
3
  //# sourceMappingURL=out.js.map
4
4
  //# sourceMappingURL=index.mjs.map
package/dist/index.js CHANGED
@@ -1,33 +1,33 @@
1
1
  'use strict';
2
2
 
3
- var chunkD7VYGB4A_js = require('./chunk-D7VYGB4A.js');
3
+ var chunkVNK4L5RV_js = require('./chunk-VNK4L5RV.js');
4
4
  var fs = require('fs');
5
5
  var path = require('path');
6
6
  var process = require('process');
7
7
  var readdir = require('@visulima/readdir');
8
8
 
9
- var O=["coverage/**",".github/**","packages/*/test{,s}/**","**/*.d.ts","test{,s}/**","test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}","**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}","**/__tests__/**","**/{ava,babel,nyc}.config.{js,cjs,mjs}","**/jest.config.{js,cjs,mjs,ts}","**/{karma,rollup,webpack}.config.js","**/.{eslint,mocha}rc.{js,cjs}","**/.{travis,yarnrc}.yml","**/{docker-compose,docker}.yml","**/.yamllint.{yaml,yml}","**/node_modules/**","**/pnpm-lock.yaml","**/pnpm-workspace.yaml","**/{package,package-lock}.json","**/yarn.lock","**/package.json5","**/.next/**"],b=t=>{t&&(console.error(t),process.exit(1));},d=class{constructor(r,u,i,e){this.assetsPath=r,this.swaggerDefinition=i,this.sources=u,this.verbose=e.verbose??!1,this.ignore=e.ignore??[];}apply(r){r.hooks.make.tapAsync("SwaggerCompilerPlugin",async(u,i)=>{console.log("Build paused, switching to swagger build");let e=new chunkD7VYGB4A_js.d(this.swaggerDefinition);for await(let s of this.sources){let a=await readdir.collect(s,{extensions:[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],includeDirs:!1,minimatchOptions:{match:{debug:this.verbose,matchBase:!0},skip:{debug:this.verbose,matchBase:!0}},skip:[...this.ignore,...O]});this.verbose&&(console.log(`Found ${a.length} files in ${s}`),console.log(a)),a.forEach(n=>{this.verbose&&console.log(`Parsing file ${n}`);try{let l=chunkD7VYGB4A_js.c(n,chunkD7VYGB4A_js.a,this.verbose);e.addData(l.map(c=>c.spec));let j=chunkD7VYGB4A_js.c(n,chunkD7VYGB4A_js.e,this.verbose);e.addData(j.map(c=>c.spec));}catch(l){console.error(l),process.exit(1);}});}try{this.verbose&&(console.log("Validating swagger spec"),console.log(JSON.stringify(e,null,2))),await chunkD7VYGB4A_js.f(JSON.parse(JSON.stringify(e)));}catch(s){console.error(s.toJSON()),process.exit(1);}let{assetsPath:y}=this;fs.mkdir(path.dirname(y),{recursive:!0},s=>{s&&b(s),fs.writeFile(y,JSON.stringify(e,null,2),b);}),this.verbose&&console.log(`Written swagger spec to "${this.assetsPath}" file`),console.log("switching back to normal build"),i();});}},B=d;
9
+ var B=["coverage/**",".github/**","packages/*/test{,s}/**","**/*.d.ts","test{,s}/**","test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}","**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}","**/__tests__/**","**/{ava,babel,nyc}.config.{js,cjs,mjs}","**/jest.config.{js,cjs,mjs,ts}","**/{karma,rollup,webpack}.config.js","**/.{eslint,mocha}rc.{js,cjs}","**/.{travis,yarnrc}.yml","**/{docker-compose,docker}.yml","**/.yamllint.{yaml,yml}","**/node_modules/**","**/pnpm-lock.yaml","**/pnpm-workspace.yaml","**/{package,package-lock}.json","**/yarn.lock","**/package.json5","**/.next/**"],b=t=>{t&&(console.error(t),process.exit(1));},d=class{constructor(r,u,i,e){this.assetsPath=r,this.swaggerDefinition=i,this.sources=u,this.verbose=e.verbose??!1,this.ignore=e.ignore??[];}apply(r){r.hooks.make.tapAsync("SwaggerCompilerPlugin",async(u,i)=>{console.log("Build paused, switching to swagger build");let e=new chunkVNK4L5RV_js.d(this.swaggerDefinition);for await(let s of this.sources){let a=await readdir.collect(s,{extensions:[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],includeDirs:!1,minimatchOptions:{match:{debug:this.verbose,matchBase:!0},skip:{debug:this.verbose,matchBase:!0}},skip:[...this.ignore,...B]});this.verbose&&(console.log(`Found ${a.length} files in ${s}`),console.log(a)),a.forEach(n=>{this.verbose&&console.log(`Parsing file ${n}`);try{let l=chunkVNK4L5RV_js.c(n,chunkVNK4L5RV_js.a,this.verbose);e.addData(l.map(c=>c.spec));let j=chunkVNK4L5RV_js.c(n,chunkVNK4L5RV_js.e,this.verbose);e.addData(j.map(c=>c.spec));}catch(l){console.error(l),process.exit(1);}});}try{this.verbose&&(console.log("Validating swagger spec"),console.log(JSON.stringify(e,null,2))),await chunkVNK4L5RV_js.f(JSON.parse(JSON.stringify(e)));}catch(s){console.error(s.toJSON()),process.exit(1);}let{assetsPath:y}=this;fs.mkdir(path.dirname(y),{recursive:!0},s=>{s&&b(s),fs.writeFile(y,JSON.stringify(e,null,2),b);}),this.verbose&&console.log(`Written swagger spec to "${this.assetsPath}" file`),console.log("switching back to normal build"),i();});}},J=d;
10
10
 
11
11
  Object.defineProperty(exports, 'SpecBuilder', {
12
12
  enumerable: true,
13
- get: function () { return chunkD7VYGB4A_js.d; }
13
+ get: function () { return chunkVNK4L5RV_js.d; }
14
14
  });
15
15
  Object.defineProperty(exports, 'jsDocumentCommentsToOpenApi', {
16
16
  enumerable: true,
17
- get: function () { return chunkD7VYGB4A_js.a; }
17
+ get: function () { return chunkVNK4L5RV_js.a; }
18
18
  });
19
19
  Object.defineProperty(exports, 'parseFile', {
20
20
  enumerable: true,
21
- get: function () { return chunkD7VYGB4A_js.c; }
21
+ get: function () { return chunkVNK4L5RV_js.c; }
22
22
  });
23
23
  Object.defineProperty(exports, 'swaggerJsDocumentCommentsToOpenApi', {
24
24
  enumerable: true,
25
- get: function () { return chunkD7VYGB4A_js.e; }
25
+ get: function () { return chunkVNK4L5RV_js.e; }
26
26
  });
27
27
  Object.defineProperty(exports, 'yamlLoc', {
28
28
  enumerable: true,
29
- get: function () { return chunkD7VYGB4A_js.b; }
29
+ get: function () { return chunkVNK4L5RV_js.b; }
30
30
  });
31
- exports.SwaggerCompilerPlugin = B;
31
+ exports.SwaggerCompilerPlugin = J;
32
32
  //# sourceMappingURL=out.js.map
33
33
  //# sourceMappingURL=index.js.map
package/dist/index.mjs CHANGED
@@ -1,12 +1,12 @@
1
- import { d as d$1, c, a, e, f } from './chunk-WHYPHVY6.mjs';
2
- export { d as SpecBuilder, a as jsDocumentCommentsToOpenApi, c as parseFile, e as swaggerJsDocumentCommentsToOpenApi, b as yamlLoc } from './chunk-WHYPHVY6.mjs';
1
+ import { d as d$1, c, a, e, f } from './chunk-YQIJE75F.mjs';
2
+ export { d as SpecBuilder, a as jsDocumentCommentsToOpenApi, c as parseFile, e as swaggerJsDocumentCommentsToOpenApi, b as yamlLoc } from './chunk-YQIJE75F.mjs';
3
3
  import { mkdir, writeFile } from 'fs';
4
4
  import { dirname } from 'path';
5
5
  import { exit } from 'process';
6
6
  import { collect } from '@visulima/readdir';
7
7
 
8
- var O=["coverage/**",".github/**","packages/*/test{,s}/**","**/*.d.ts","test{,s}/**","test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}","**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}","**/__tests__/**","**/{ava,babel,nyc}.config.{js,cjs,mjs}","**/jest.config.{js,cjs,mjs,ts}","**/{karma,rollup,webpack}.config.js","**/.{eslint,mocha}rc.{js,cjs}","**/.{travis,yarnrc}.yml","**/{docker-compose,docker}.yml","**/.yamllint.{yaml,yml}","**/node_modules/**","**/pnpm-lock.yaml","**/pnpm-workspace.yaml","**/{package,package-lock}.json","**/yarn.lock","**/package.json5","**/.next/**"],b=t=>{t&&(console.error(t),exit(1));},d=class{constructor(r,u,i,e){this.assetsPath=r,this.swaggerDefinition=i,this.sources=u,this.verbose=e.verbose??!1,this.ignore=e.ignore??[];}apply(r){r.hooks.make.tapAsync("SwaggerCompilerPlugin",async(u,i)=>{console.log("Build paused, switching to swagger build");let e$1=new d$1(this.swaggerDefinition);for await(let s of this.sources){let a$1=await collect(s,{extensions:[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],includeDirs:!1,minimatchOptions:{match:{debug:this.verbose,matchBase:!0},skip:{debug:this.verbose,matchBase:!0}},skip:[...this.ignore,...O]});this.verbose&&(console.log(`Found ${a$1.length} files in ${s}`),console.log(a$1)),a$1.forEach(n=>{this.verbose&&console.log(`Parsing file ${n}`);try{let l=c(n,a,this.verbose);e$1.addData(l.map(c=>c.spec));let j=c(n,e,this.verbose);e$1.addData(j.map(c=>c.spec));}catch(l){console.error(l),exit(1);}});}try{this.verbose&&(console.log("Validating swagger spec"),console.log(JSON.stringify(e$1,null,2))),await f(JSON.parse(JSON.stringify(e$1)));}catch(s){console.error(s.toJSON()),exit(1);}let{assetsPath:y}=this;mkdir(dirname(y),{recursive:!0},s=>{s&&b(s),writeFile(y,JSON.stringify(e$1,null,2),b);}),this.verbose&&console.log(`Written swagger spec to "${this.assetsPath}" file`),console.log("switching back to normal build"),i();});}},B=d;
8
+ var J=["coverage/**",".github/**","packages/*/test{,s}/**","**/*.d.ts","test{,s}/**","test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}","**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}","**/__tests__/**","**/{ava,babel,nyc}.config.{js,cjs,mjs}","**/jest.config.{js,cjs,mjs,ts}","**/{karma,rollup,webpack}.config.js","**/.{eslint,mocha}rc.{js,cjs}","**/.{travis,yarnrc}.yml","**/{docker-compose,docker}.yml","**/.yamllint.{yaml,yml}","**/node_modules/**","**/pnpm-lock.yaml","**/pnpm-workspace.yaml","**/{package,package-lock}.json","**/yarn.lock","**/package.json5","**/.next/**"],b=t=>{t&&(console.error(t),exit(1));},d=class{constructor(r,u,i,e){this.assetsPath=r,this.swaggerDefinition=i,this.sources=u,this.verbose=e.verbose??!1,this.ignore=e.ignore??[];}apply(r){r.hooks.make.tapAsync("SwaggerCompilerPlugin",async(u,i)=>{console.log("Build paused, switching to swagger build");let e$1=new d$1(this.swaggerDefinition);for await(let s of this.sources){let a$1=await collect(s,{extensions:[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],includeDirs:!1,minimatchOptions:{match:{debug:this.verbose,matchBase:!0},skip:{debug:this.verbose,matchBase:!0}},skip:[...this.ignore,...J]});this.verbose&&(console.log(`Found ${a$1.length} files in ${s}`),console.log(a$1)),a$1.forEach(n=>{this.verbose&&console.log(`Parsing file ${n}`);try{let l=c(n,a,this.verbose);e$1.addData(l.map(c=>c.spec));let j=c(n,e,this.verbose);e$1.addData(j.map(c=>c.spec));}catch(l){console.error(l),exit(1);}});}try{this.verbose&&(console.log("Validating swagger spec"),console.log(JSON.stringify(e$1,null,2))),await f(JSON.parse(JSON.stringify(e$1)));}catch(s){console.error(s.toJSON()),exit(1);}let{assetsPath:y}=this;mkdir(dirname(y),{recursive:!0},s=>{s&&b(s),writeFile(y,JSON.stringify(e$1,null,2),b);}),this.verbose&&console.log(`Written swagger spec to "${this.assetsPath}" file`),console.log("switching back to normal build"),i();});}},S=d;
9
9
 
10
- export { B as SwaggerCompilerPlugin };
10
+ export { S as SwaggerCompilerPlugin };
11
11
  //# sourceMappingURL=out.js.map
12
12
  //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visulima/jsdoc-open-api",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "Generates swagger doc based on JSDoc.",
5
5
  "keywords": [
6
6
  "visulima",
@@ -42,18 +42,36 @@
42
42
  "exports": {
43
43
  ".": {
44
44
  "types": "./dist/index.d.ts",
45
- "require": "./dist/index.js",
46
- "import": "./dist/index.mjs"
45
+ "require": {
46
+ "types": "./dist/index.d.ts",
47
+ "default": "./dist/index.js"
48
+ },
49
+ "import": {
50
+ "types": "./dist/index.d.mts",
51
+ "default": "./dist/index.mjs"
52
+ }
47
53
  },
48
54
  "./cli": {
49
55
  "types": "./dist/cli/index.d.ts",
50
- "require": "./dist/cli/index.js",
51
- "import": "./dist/cli/index.mjs"
56
+ "require": {
57
+ "types": "./dist/cli/index.d.ts",
58
+ "default": "./dist/cli/index.js"
59
+ },
60
+ "import": {
61
+ "types": "./dist/cli/index.d.mts",
62
+ "default": "./dist/cli/index.mjs"
63
+ }
52
64
  },
53
65
  "./cli/commander": {
54
66
  "types": "./dist/cli/commander/index.d.ts",
55
- "require": "./dist/cli/commander/index.js",
56
- "import": "./dist/cli/commander/index.mjs"
67
+ "require": {
68
+ "types": "./dist/cli/commander/index.d.ts",
69
+ "default": "./dist/cli/commander/index.js"
70
+ },
71
+ "import": {
72
+ "types": "./dist/cli/commander/index.d.mts",
73
+ "default": "./dist/cli/commander/index.mjs"
74
+ }
57
75
  },
58
76
  "./package.json": "./package.json"
59
77
  },
@@ -77,7 +95,7 @@
77
95
  "clean": "rimraf node_modules dist .eslintcache",
78
96
  "coverage": "vitest run --coverage",
79
97
  "dev": "pnpm run build --watch",
80
- "lint:eslint": "eslint . --ext js,jsx,ts,tsx --max-warnings=0 --config .eslintrc.js --cache --cache-strategy content .",
98
+ "lint:eslint": "eslint . --ext js,cjs,mjs,jsx,ts,tsx,json,yaml,yml,md,mdx --max-warnings=0 --config .eslintrc.js",
81
99
  "lint:eslint:fix": "pnpm run lint:eslint --fix",
82
100
  "lint:prettier": "prettier --config=.prettierrc.js --check .",
83
101
  "lint:prettier:fix": "prettier --config=.prettierrc.js --write .",
@@ -87,7 +105,7 @@
87
105
  },
88
106
  "dependencies": {
89
107
  "@apidevtools/swagger-parser": "^10.1.0",
90
- "@visulima/readdir": "2.0.0",
108
+ "@visulima/readdir": "2.0.1",
91
109
  "comment-parser": "^1.4.0",
92
110
  "lodash.mergewith": "^4.6.2",
93
111
  "read-pkg-up": "^7.0.1",
@@ -117,6 +135,7 @@
117
135
  "prettier": "^3.0.2",
118
136
  "rimraf": "^5.0.1",
119
137
  "semantic-release": "^21.1.1",
138
+ "sort-package-json": "^2.5.1",
120
139
  "tsup": "^7.2.0",
121
140
  "typescript": "^5.2.2",
122
141
  "vitest": "^0.34.3",
@@ -1,19 +0,0 @@
1
- import { parse } from 'comment-parser';
2
- import A from 'lodash.mergewith';
3
- import { readFileSync } from 'fs';
4
- import q from 'path';
5
- import R from 'yaml';
6
- import H from '@apidevtools/swagger-parser';
7
-
8
- var E=(t,s)=>{if(Array.isArray(t))return [...t,...s]},m=E;var v=t=>{t.security&&(t.security=Object.keys(t.security).map(s=>({[s]:t.security[s]})));},w=new Set(["integer","number","string","boolean","object","array"]),y={binary:"string",byte:"string",date:"string","date-time":"string",double:"number",float:"number",int32:"integer",int64:"integer",password:"string"},k=t=>{let s=t.type,r=s.endsWith("[]"),e=s.replace(/\[]$/,""),a=w.has(e),n=Object.keys(y).includes(e),o;if(t.default)switch(e){case"integer":case"int32":case"int64":{o=Number.parseInt(t.default,10);break}case"number":case"double":case"float":{o=Number.parseFloat(t.default);break}default:{o=t.default;break}}let i;a?i={default:o,type:e}:n?i={default:o,format:e,type:y[e]}:i={$ref:`#/components/schemas/${e}`};let c=r?{items:{...i},type:"array"}:{...i};e===""&&(c=void 0);let p=t.description.trim().replace(/^- /,"");return p===""&&(p=void 0),{description:p,name:t.name,rawType:s,required:!t.optional,schema:c}},P=(t,s)=>t.map(r=>{let e=k(r),a="";switch(e.name&&(a+=e.name),e.description&&(a+=` ${e.description.trim()}`),r.tag){case"operationId":case"summary":case"description":return {[r.tag]:a};case"deprecated":return {deprecated:!0};case"externalDocs":return {externalDocs:{description:e.description,url:e.name}};case"server":return {servers:[{description:e.description,url:e.name}]};case"tag":return {tags:[a]};case"cookieParam":case"headerParam":case"queryParam":case"pathParam":return {parameters:[{description:e.description,in:r.tag.replace(/Param$/,""),name:e.name,required:e.required,schema:e.schema}]};case"bodyContent":return {requestBody:{content:{[e.name.replace("*\\/*","*/*")]:{schema:e.schema}}}};case"bodyExample":{let[n,o]=e.name.split(".");return {requestBody:{content:{[n]:{examples:{[o]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}case"bodyDescription":return {requestBody:{description:a}};case"bodyRequired":return {requestBody:{required:!0}};case"response":return {responses:{[e.name]:{description:e.description}}};case"callback":return {callbacks:{[e.name]:{$ref:`#/components/callbacks/${e.rawType}`}}};case"responseContent":{let[n,o]=e.name.split(".");return {responses:{[n]:{content:{[o]:{schema:e.schema}}}}}}case"responseHeaderComponent":{let[n,o]=e.name.split(".");return {responses:{[n]:{headers:{[o]:{$ref:`#/components/headers/${e.rawType}`}}}}}}case"responseHeader":{let[n,o]=e.name.split(".");return {responses:{[n]:{headers:{[o]:{description:e.description,schema:e.schema}}}}}}case"responseExample":{let[n,o,i]=e.name.split(".");return {responses:{[n]:{content:{[o]:{examples:{[i]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}}case"responseLink":{let[n,o]=e.name.split(".");return {responses:{[n]:{links:{[o]:{$ref:`#/components/links/${e.rawType}`}}}}}}case"bodyComponent":return {requestBody:{$ref:`#/components/requestBodies/${e.rawType}`}};case"responseComponent":return {responses:{[e.name]:{$ref:`#/components/responses/${e.rawType}`}}};case"paramComponent":return {parameters:[{$ref:`#/components/parameters/${e.rawType}`}]};case"security":{let[n,o]=e.name.split("."),i=[];return o&&(i=[o]),{security:{[n]:i}}}default:return {}}}),$=(t,s)=>{let r=/^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \/.*$/;return parse(t,{spacing:"preserve"}).filter(a=>r.test(a.description.trim())).map(a=>{let n=a.tags.length+1,o=A({},...P(a.tags),m);v(o);let[i,c]=a.description.split(" "),p={[c.trim()]:{[i.toLowerCase().trim()]:{...o}}},T=JSON.parse(JSON.stringify({paths:p}));return {loc:n,spec:T}})},Q=$;var D=t=>t.split(/\r\n|\r|\n/).filter(e=>/^\s*(#\s*(?:\S.*)?)?$/.test(e)?!1:e.trim().length>0).length,g=D;var b=new Set(["openapi","info","servers","security","tags","externalDocs","components","paths"]),u=class extends Error{},L=(t,s,r)=>{let e=readFileSync(t,{encoding:"utf8"}),a=q.extname(t);if(a===".yaml"||a===".yml"){let n=R.parse(e),o=Object.keys(n).filter(i=>!b.has(i));if(o.length>0){let i=new u(`Unexpected keys: ${o.join(", ")}`);throw i.filePath=t,i}return Object.keys(n).some(i=>b.has(i))?[{loc:g(e),spec:n}]:[]}try{return s(e,r)}catch(n){throw n.filePath=t,n}},ne=L;var I=(t,s)=>{Object.keys(s).forEach(r=>{t[r]===void 0?t[r]={...s[r]}:Object.keys(s[r]).forEach(e=>{t[r][e]={...t[r][e],...s[r][e]};});});},h=I;var d=class{constructor(s){this.openapi=s.openapi,this.info=s.info,this.servers=s.servers,this.paths=s.paths??{},this.components=s.components,this.security=s.security,this.tags=s.tags,this.externalDocs=s.externalDocs;}addData(s){s.forEach(r=>{let{components:e,paths:a,...n}=r;h(this,{components:e??{},paths:a??{}}),Object.entries(n).forEach(([o,i])=>{this[o]=i;});});}},ce=d;var l=(t,s)=>A({},t,s,(r,e)=>e===null?r:void 0),O=t=>Object.keys(t).map(s=>t[s]).every(s=>typeof s=="object"&&Object.keys(s).every(r=>!(r in s))),f=(t,s)=>s.some(r=>t.name===r.name),j=t=>{switch(t.tag){case"openapi":return "v3";case"asyncapi":return "v4";case"swagger":return "v2";default:return "v2"}};var N=(t,s,r)=>{if(r==="x-webhooks"&&(t[r]=s[r]),r.startsWith("x-"))return;if(["components","consumes","produces","paths","schemas","securityDefinitions","responses","parameters","definitions","channels"].includes(r))Object.keys(s[r]).forEach(a=>{t[r][a]=l(t[r][a],s[r][a]);});else if(r==="tags"){let{tags:a}=s;Array.isArray(a)?a.forEach(n=>{f(n,t.tags)||t.tags.push(n);}):f(a,t.tags)||t.tags.push(a);}else if(r==="security"){let{security:a}=s;t.security=a;}else r.startsWith("/")&&(t.paths[r]=l(t.paths[r],s[r]));},x=N;var F={v2:["paths","definitions","responses","parameters","securityDefinitions"],v3:["paths","definitions","responses","parameters","securityDefinitions","components"],v4:["components","channels"]},z=(t,s)=>t.map(r=>{if((r.tag==="openapi"||r.tag==="swagger"||r.tag==="asyncapi")&&r.description!==""){let e=R.parseDocument(r.description);if(e.errors.length>0){e.errors.map(i=>{let c=i;return c.annotation=r.description,c});let o="Error parsing YAML in @openapi spec:";throw o+=s?e.errors.map(i=>`${i.toString()}
9
- Imbedded within:
10
- \`\`\`
11
- ${i.annotation?.replace(/\n/g,`
12
- `)}
13
- \`\`\``).join(`
14
- `):e.errors.map(i=>i.toString()).join(`
15
- `),new Error(o)}let a=e.toJSON(),n={tags:[]};return F[j(r)].forEach(o=>{n[o]=n[o]||{};}),Object.keys(a).forEach(o=>{x(n,a,o);}),n}return {}}),J=(t,s)=>parse(t,{spacing:"preserve"}).map(e=>{let a=e.tags.length+1,n=A({},...z(e.tags,s),m);["definitions","responses","parameters","securityDefinitions","components","tags"].forEach(i=>{n[i]!==void 0&&O(n[i])&&delete n[i];});let o=JSON.parse(JSON.stringify(n));return {loc:a,spec:o}}),je=J;var U=async t=>{await H.validate(t);},Ee=U;
16
-
17
- export { Q as a, g as b, ne as c, ce as d, je as e, Ee as f };
18
- //# sourceMappingURL=out.js.map
19
- //# sourceMappingURL=chunk-WHYPHVY6.mjs.map