@visulima/jsdoc-open-api 3.0.11 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## @visulima/jsdoc-open-api [4.0.0](https://github.com/visulima/visulima/compare/%40visulima%2Fjsdoc-open-api%403.0.11...%40visulima%2Fjsdoc-open-api%404.0.0) (2026-08-08)
2
+
3
+
4
+ ### Dependencies
5
+
6
+ * **@visulima/fs:** upgraded to 6.0.0
7
+ * **@visulima/yaml:** upgraded to 1.0.0
8
+
1
9
  ## @visulima/jsdoc-open-api [3.0.11](https://github.com/visulima/visulima/compare/%40visulima%2Fjsdoc-open-api%403.0.10...%40visulima%2Fjsdoc-open-api%403.0.11) (2026-08-02)
2
10
 
3
11
 
@@ -1 +1 @@
1
- import{default as m}from"../../packem_shared/generateCommand-D0Veh_ij.js";import{default as t}from"../../packem_shared/initCommand-TixxsVQU.js";export{m as generateCommand,t as initCommand};
1
+ import{default as m}from"../../packem_shared/generateCommand-q_aBpnih.js";import{default as t}from"../../packem_shared/initCommand-TixxsVQU.js";export{m as generateCommand,t as initCommand};
package/dist/cli/index.js CHANGED
@@ -1 +1 @@
1
- import{default as m}from"../packem_shared/generateCommand-BWWxeINy.js";import{default as t}from"../packem_shared/initCommand-Ca1hGdYS.js";export{m as generateCommand,t as initCommand};
1
+ import{default as m}from"../packem_shared/generateCommand-C3riX6Is.js";import{default as t}from"../packem_shared/initCommand-Ca1hGdYS.js";export{m as generateCommand,t as initCommand};
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{default as a}from"./packem_shared/jsDocumentCommentsToOpenApi-CuIbZppP.js";import{default as r}from"./packem_shared/DEFAULT_OPTIONS-QnOdktWv.js";import{default as l,parseFileMulti as m}from"./packem_shared/parseFile-RDlR4tEF.js";import{default as s}from"./packem_shared/SpecBuilder-Vbq42UbW.js";import{default as d}from"./packem_shared/swaggerJsDocumentCommentsToOpenApi-DOyTa91M.js";import{default as n}from"./packem_shared/loadDefinition-7r9qpfuE.js";import{default as g}from"./packem_shared/yamlLoc-DPq-xUM4.js";import{default as D}from"./packem_shared/validate-9Rwe2A3r.js";import{default as T}from"./packem_shared/SwaggerCompilerPlugin-CdaguiSi.js";export{r as DEFAULT_OPTIONS,s as SpecBuilder,T as SwaggerCompilerPlugin,a as jsDocumentCommentsToOpenApi,n as loadDefinition,l as parseFile,m as parseFileMulti,d as swaggerJsDocumentCommentsToOpenApi,D as validate,g as yamlLoc};
1
+ import{default as a}from"./packem_shared/jsDocumentCommentsToOpenApi-CuIbZppP.js";import{default as r}from"./packem_shared/DEFAULT_OPTIONS-QnOdktWv.js";import{default as l,parseFileMulti as m}from"./packem_shared/parseFile-Dtv-2qq3.js";import{default as s}from"./packem_shared/SpecBuilder-Vbq42UbW.js";import{default as d}from"./packem_shared/swaggerJsDocumentCommentsToOpenApi-CWeEk_r1.js";import{default as n}from"./packem_shared/loadDefinition-Cfj2-XHF.js";import{default as g}from"./packem_shared/yamlLoc-DPq-xUM4.js";import{default as D}from"./packem_shared/validate-9Rwe2A3r.js";import{default as T}from"./packem_shared/SwaggerCompilerPlugin-vT9UJGnF.js";export{r as DEFAULT_OPTIONS,s as SpecBuilder,T as SwaggerCompilerPlugin,a as jsDocumentCommentsToOpenApi,n as loadDefinition,l as parseFile,m as parseFileMulti,d as swaggerJsDocumentCommentsToOpenApi,D as validate,g as yamlLoc};
@@ -1 +1 @@
1
- import{mkdir as c,writeFile as m}from"node:fs/promises";import{dirname as f}from"node:path";import{collect as p}from"@visulima/fs";import{D as u}from"./constants-CdEv9ZcD.js";import w from"./jsDocumentCommentsToOpenApi-CuIbZppP.js";import{parseFileMulti as d}from"./parseFile-RDlR4tEF.js";import b from"./SpecBuilder-Vbq42UbW.js";import v from"./swaggerJsDocumentCommentsToOpenApi-DOyTa91M.js";import y from"./validate-9Rwe2A3r.js";const D=[w,v],S=r=>r instanceof Error?r:new Error(String(r));class J{assetsPath;ignore;silent;sources;swaggerDefinition;verbose;constructor(t,n,o,s){this.assetsPath=t,this.swaggerDefinition=o,this.sources=n,this.verbose=s.verbose??!1,this.silent=s.silent??!1,this.ignore=s.ignore??[]}apply(t){const n=new Set([...u,...this.ignore]);t.hooks.make.tapAsync("SwaggerCompilerPlugin",async(o,s)=>{this.log("Build paused, switching to swagger build");const e=new b(this.swaggerDefinition);try{for(const i of this.sources){const l=await p(i,{extensions:[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],includeDirs:!1,skip:[...n]});this.verbose&&(this.log(`Found ${String(l.length)} files in ${i}`),this.log(JSON.stringify(l))),l.forEach(g=>{this.verbose&&this.log(`Parsing file ${g}`),e.addData(d(g,D,this.verbose).map(h=>h.spec))})}this.verbose&&(this.log("Validating swagger spec"),this.log(JSON.stringify(e,void 0,2))),await y(structuredClone(e));const{assetsPath:a}=this;await c(f(a),{recursive:!0}),await m(a,JSON.stringify(e,void 0,2)),this.verbose&&this.log(`Written swagger spec to "${this.assetsPath}" file`)}catch(a){const i=S(a);Array.isArray(o.errors)&&o.errors.push(i),s(i);return}this.log("switching back to normal build"),s()})}log(t){this.silent||console.log(t)}}export{J as default};
1
+ import{mkdir as c,writeFile as m}from"node:fs/promises";import{dirname as f}from"node:path";import{collect as p}from"@visulima/fs";import{D as u}from"./constants-CdEv9ZcD.js";import w from"./jsDocumentCommentsToOpenApi-CuIbZppP.js";import{parseFileMulti as d}from"./parseFile-Dtv-2qq3.js";import b from"./SpecBuilder-Vbq42UbW.js";import v from"./swaggerJsDocumentCommentsToOpenApi-CWeEk_r1.js";import y from"./validate-9Rwe2A3r.js";const D=[w,v],S=r=>r instanceof Error?r:new Error(String(r));class J{assetsPath;ignore;silent;sources;swaggerDefinition;verbose;constructor(t,n,o,s){this.assetsPath=t,this.swaggerDefinition=o,this.sources=n,this.verbose=s.verbose??!1,this.silent=s.silent??!1,this.ignore=s.ignore??[]}apply(t){const n=new Set([...u,...this.ignore]);t.hooks.make.tapAsync("SwaggerCompilerPlugin",async(o,s)=>{this.log("Build paused, switching to swagger build");const e=new b(this.swaggerDefinition);try{for(const i of this.sources){const l=await p(i,{extensions:[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],includeDirs:!1,skip:[...n]});this.verbose&&(this.log(`Found ${String(l.length)} files in ${i}`),this.log(JSON.stringify(l))),l.forEach(g=>{this.verbose&&this.log(`Parsing file ${g}`),e.addData(d(g,D,this.verbose).map(h=>h.spec))})}this.verbose&&(this.log("Validating swagger spec"),this.log(JSON.stringify(e,void 0,2))),await y(structuredClone(e));const{assetsPath:a}=this;await c(f(a),{recursive:!0}),await m(a,JSON.stringify(e,void 0,2)),this.verbose&&this.log(`Written swagger spec to "${this.assetsPath}" file`)}catch(a){const i=S(a);Array.isArray(o.errors)&&o.errors.push(i),s(i);return}this.log("switching back to normal build"),s()})}log(t){this.silent||console.log(t)}}export{J as default};
@@ -1,5 +1,5 @@
1
- import{mkdir as b,writeFile as D,stat as E,realpath as O}from"node:fs/promises";import{dirname as S,extname as $,normalize as _}from"node:path";import{stdout as j}from"node:process";import{pathToFileURL as F}from"node:url";import{collect as U}from"@visulima/fs";import{MultiBar as x,Presets as L}from"cli-progress";import N from"yaml";import{D as R}from"./constants-CdEv9ZcD.js";import k from"./jsDocumentCommentsToOpenApi-CuIbZppP.js";import{parseFileMulti as g}from"./parseFile-RDlR4tEF.js";import C from"./SpecBuilder-Vbq42UbW.js";import M from"./swaggerJsDocumentCommentsToOpenApi-DOyTa91M.js";import T from"./loadDefinition-7r9qpfuE.js";import V from"./validate-9Rwe2A3r.js";const A=new Set([".yaml",".yml"]),u="-",d=[k,M],J=async t=>{try{let e=await import(F(_(t)).href);return e?.default&&(e=e.default),e}catch(e){if(e?.code==="ERR_MODULE_NOT_FOUND"||e?.code==="MODULE_NOT_FOUND"||e?.code==="ERR_LOAD_URL")throw new Error(`No config file found, on: ${t}
2
- `,{cause:e});const o=e instanceof Error?e.message:String(e);throw new Error(`Failed to load config file "${t}": ${o}`,{cause:e})}},P=async(t,e,o)=>{const r=await J(o.config??t),i=o.definition??r.definition;let{swaggerDefinition:n}=r;if(i&&(n={...T(i),...n}),n===null||typeof n!="object")throw new TypeError(`Invalid config "${o.config??t}": missing "swaggerDefinition" object. Provide it in the config or pass a base definition file via -d/--definition.`);const f=o.output===u?void 0:new x({clearOnComplete:!1,format:"{value}/{total} | {bar} | {filename}",hideCursor:!0},L.shades_grey),s=new C(n),w=new Set([...R,...r.exclude??[]]);try{for(const m of e){const y=(await E(m)).isDirectory(),a=await O(m);if(!y){s.addData(g(a,d,o.verbose).map(c=>c.spec));continue}const l=await U(a,{extensions:r.extensions??[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],followSymlinks:r.followSymlinks??!1,match:r.include,skip:[...w]});(o.verbose??o.veryVerbose)&&console.log(`
3
- Found ${String(l.length)} files in ${a}`),o.veryVerbose&&console.log(l);const h=f?.create(l.length,0);l.forEach(c=>{o.verbose&&console.log(`Parsing file ${c}`),h?.increment(1,{filename:a}),s.addData(g(c,d,o.verbose).map(v=>v.spec))})}o.verbose&&console.log("Validating swagger spec"),o.veryVerbose&&console.log(JSON.stringify(s,void 0,2)),await V(structuredClone(s))}finally{f?.stop()}return s},p=(t,e)=>A.has($(e))?N.stringify(structuredClone(t)):JSON.stringify(t,void 0,2),te=async(t,e,o)=>{const r=await P(t,e,o),i=o.output??"swagger.json";if(i===u){j.write(`${p(r,"swagger.json")}
1
+ import{mkdir as b,writeFile as D,stat as E,realpath as O}from"node:fs/promises";import{dirname as S,extname as $,normalize as _}from"node:path";import{stdout as j}from"node:process";import{pathToFileURL as F}from"node:url";import{collect as U}from"@visulima/fs";import{stringify as x}from"@visulima/yaml";import{MultiBar as L,Presets as N}from"cli-progress";import{D as R}from"./constants-CdEv9ZcD.js";import k from"./jsDocumentCommentsToOpenApi-CuIbZppP.js";import{parseFileMulti as g}from"./parseFile-Dtv-2qq3.js";import C from"./SpecBuilder-Vbq42UbW.js";import M from"./swaggerJsDocumentCommentsToOpenApi-CWeEk_r1.js";import T from"./loadDefinition-Cfj2-XHF.js";import V from"./validate-9Rwe2A3r.js";const A=new Set([".yaml",".yml"]),u="-",d=[k,M],J=async t=>{try{let e=await import(F(_(t)).href);return e?.default&&(e=e.default),e}catch(e){if(e?.code==="ERR_MODULE_NOT_FOUND"||e?.code==="MODULE_NOT_FOUND"||e?.code==="ERR_LOAD_URL")throw new Error(`No config file found, on: ${t}
2
+ `,{cause:e});const o=e instanceof Error?e.message:String(e);throw new Error(`Failed to load config file "${t}": ${o}`,{cause:e})}},P=async(t,e,o)=>{const r=await J(o.config??t),i=o.definition??r.definition;let{swaggerDefinition:n}=r;if(i&&(n={...T(i),...n}),n===null||typeof n!="object")throw new TypeError(`Invalid config "${o.config??t}": missing "swaggerDefinition" object. Provide it in the config or pass a base definition file via -d/--definition.`);const f=o.output===u?void 0:new L({clearOnComplete:!1,format:"{value}/{total} | {bar} | {filename}",hideCursor:!0},N.shades_grey),s=new C(n),w=new Set([...R,...r.exclude??[]]);try{for(const m of e){const y=(await E(m)).isDirectory(),a=await O(m);if(!y){s.addData(g(a,d,o.verbose).map(c=>c.spec));continue}const l=await U(a,{extensions:r.extensions??[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],followSymlinks:r.followSymlinks??!1,match:r.include,skip:[...w]});(o.verbose??o.veryVerbose)&&console.log(`
3
+ Found ${String(l.length)} files in ${a}`),o.veryVerbose&&console.log(l);const h=f?.create(l.length,0);l.forEach(c=>{o.verbose&&console.log(`Parsing file ${c}`),h?.increment(1,{filename:a}),s.addData(g(c,d,o.verbose).map(v=>v.spec))})}o.verbose&&console.log("Validating swagger spec"),o.veryVerbose&&console.log(JSON.stringify(s,void 0,2)),await V(structuredClone(s))}finally{f?.stop()}return s},p=(t,e)=>A.has($(e))?x(structuredClone(t)):JSON.stringify(t,void 0,2),te=async(t,e,o)=>{const r=await P(t,e,o),i=o.output??"swagger.json";if(i===u){j.write(`${p(r,"swagger.json")}
4
4
  `);return}o.verbose&&console.log(`Written swagger spec to "${i}" file`),await b(S(i),{recursive:!0}),await D(i,p(r,i)),console.log(`
5
5
  Swagger specification is ready, check the "${i}" file.`)};export{te as default};
@@ -1 +1 @@
1
- import{watch as y}from"node:fs";import{resolve as f}from"node:path";import l,{exit as h}from"node:process";import m from"./generateCommand-BWWxeINy.js";const v=200,c=i=>{console.error(i)},S=async(i,s,r)=>{let t=!1,e=!1;const n=async()=>{if(t){e=!0;return}t=!0;try{await m(i,s,r)}catch(a){c(a)}finally{t=!1,e&&(e=!1,n().catch(c))}},g=f(r.output??"swagger.json");let o;const w=()=>{o&&clearTimeout(o),o=setTimeout(()=>{o=void 0,n().catch(c)},v)},d=s.map(a=>y(a,{recursive:!0},(b,u)=>{u!==null&&f(a,u)===g||w()})),p=()=>{o&&clearTimeout(o),d.forEach(a=>{a.close()}),h(0)};l.once("SIGINT",p),l.once("SIGTERM",p),await n(),console.log("Watching for changes... (press Ctrl+C to exit)")},G=(i,s="generate",r=".openapirc.js")=>{i.command(s).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("-d, --definition [definition.yaml]","Base OpenAPI definition file (YAML/JSON) to seed info/servers/components.").option("-o, --output [swaggerSpec.json]",'Output swagger specification. Use "-" to write to stdout, or a .yaml/.yml path for YAML output.').option("-w, --watch","Re-generate the specification whenever a watched path changes.").option("-v, --verbose","Verbose output.").option("--very-verbose","Very verbose output.").action(async(t,e)=>{try{if(e.watch){await S(r,t,e);return}await m(r,t,e)}catch(n){c(n),h(1)}})};export{G as default};
1
+ import{watch as y}from"node:fs";import{resolve as f}from"node:path";import l,{exit as h}from"node:process";import m from"./generateCommand-C3riX6Is.js";const v=200,c=i=>{console.error(i)},S=async(i,s,r)=>{let t=!1,e=!1;const n=async()=>{if(t){e=!0;return}t=!0;try{await m(i,s,r)}catch(a){c(a)}finally{t=!1,e&&(e=!1,n().catch(c))}},g=f(r.output??"swagger.json");let o;const w=()=>{o&&clearTimeout(o),o=setTimeout(()=>{o=void 0,n().catch(c)},v)},d=s.map(a=>y(a,{recursive:!0},(b,u)=>{u!==null&&f(a,u)===g||w()})),p=()=>{o&&clearTimeout(o),d.forEach(a=>{a.close()}),h(0)};l.once("SIGINT",p),l.once("SIGTERM",p),await n(),console.log("Watching for changes... (press Ctrl+C to exit)")},G=(i,s="generate",r=".openapirc.js")=>{i.command(s).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("-d, --definition [definition.yaml]","Base OpenAPI definition file (YAML/JSON) to seed info/servers/components.").option("-o, --output [swaggerSpec.json]",'Output swagger specification. Use "-" to write to stdout, or a .yaml/.yml path for YAML output.').option("-w, --watch","Re-generate the specification whenever a watched path changes.").option("-v, --verbose","Verbose output.").option("--very-verbose","Very verbose output.").action(async(t,e)=>{try{if(e.watch){await S(r,t,e);return}await m(r,t,e)}catch(n){c(n),h(1)}})};export{G as default};
@@ -0,0 +1 @@
1
+ import{readFileSync as n}from"node:fs";import t from"node:path";import{parse as m}from"@visulima/yaml";const s=o=>{const r=t.extname(o);if(r!==".yaml"&&r!==".yml"&&r!==".json")throw new Error("OpenAPI definition path must be YAML or JSON.");const e=n(o,{encoding:"utf8"});return r===".yaml"||r===".yml"?m(e):JSON.parse(e)};export{s as default};
@@ -0,0 +1 @@
1
+ import{readFileSync as f}from"node:fs";import p from"node:path";import{parse as u}from"@visulima/yaml";import{parse as y}from"comment-parser";import d from"./yamlLoc-DPq-xUM4.js";const i=new Set(["components","externalDocs","info","openapi","paths","security","servers","tags"]);class w extends Error{filePath}const l=new Set([".yaml",".yml"]),m=(t,s)=>{const r=u(s);if(r===null||typeof r!="object")return[];const o=Object.keys(r).filter(e=>!i.has(e));if(o.length>0){const e=new w(`Unexpected keys: ${o.join(", ")}`);throw e.filePath=t,e}return Object.keys(r).some(e=>i.has(e))?[{loc:d(s),spec:r}]:[]},k=(t,s,r)=>{const o=f(t,{encoding:"utf8"}),e=p.extname(t);if(l.has(e))return m(t,o);try{return s(o,r)}catch(n){throw n.filePath=t,n}},O=(t,s,r)=>{const o=f(t,{encoding:"utf8"}),e=p.extname(t);if(l.has(e))return m(t,o);const n=y(o,{spacing:"preserve"}),c=[];for(const h of s)try{c.push(...h(o,r,n))}catch(a){throw a.filePath=t,a}return c};export{k as default,O as parseFileMulti};
@@ -0,0 +1,10 @@
1
+ import{parseDocument as f}from"@visulima/yaml";import{parse as y}from"comment-parser";import{mergeWith as m}from"es-toolkit";import{u as l}from"./customizer-BXFVpImq.js";const g=(s,t)=>{if(t===null)return s},h=(s,t)=>{const e=m({},s??{},g);return m(e,t??{},g)},d=s=>Object.keys(s).map(t=>s[t]).every(t=>typeof t=="object"&&Object.keys(t).every(e=>!(e in t))),u=(s,t)=>t.some(e=>s.name===e.name),v=s=>{switch(s.tag){case"asyncapi":return"v4";case"openapi":return"v3";case"swagger":return"v2";default:return"v2"}},w=(s,t,e)=>{if(e==="x-webhooks"&&(s[e]=t[e]),!e.startsWith("x-"))if(["components","consumes","produces","paths","schemas","securityDefinitions","responses","parameters","definitions","channels"].includes(e)){const r=t[e];r!=null&&(s[e]??={},Object.keys(r).forEach(n=>{s[e][n]=h(s[e][n],r[n])}))}else if(e==="tags"){const{tags:r}=t;Array.isArray(r)?r.forEach(n=>{u(n,s.tags)||s.tags.push(n)}):u(r,s.tags)||s.tags.push(r)}else if(e==="security"){const{security:r}=t;s.security=r}else e.startsWith("/")&&(s.paths[e]=h(s.paths[e],t[e]))},E={v2:["paths","definitions","responses","parameters","securityDefinitions"],v3:["paths","definitions","responses","parameters","securityDefinitions","components"],v4:["components","channels"]},S=(s,t)=>s.map(e=>{const r=e.description!==""||e.name.startsWith("/")||e.name.endsWith(":");if((e.tag==="openapi"||e.tag==="swagger"||e.tag==="asyncapi")&&r){let n=e.description;(e.name.startsWith("/")||e.name.endsWith(":"))&&(n=n.trim()===""?e.name:`${e.name}
2
+ ${n}`);const a=f(n);if(a.errors.length>0){a.errors.forEach(c=>{c.annotation=n});let i="Error parsing YAML in @openapi spec:";throw i+=t?a.errors.map(c=>`${c.toString()}
3
+ Imbedded within:
4
+ \`\`\`
5
+ ${c.annotation?.replaceAll(`
6
+ `,`
7
+ `)}
8
+ \`\`\``).join(`
9
+ `):a.errors.map(c=>c.toString()).join(`
10
+ `),new Error(i)}const p=a.toJSON(),o={tags:[]};return E[v(e)].forEach(i=>{o[i]=o[i]??{}}),Object.keys(p).forEach(i=>{w(o,p,i)}),o}return{}}),b=new Set(["asyncapi","openapi","swagger"]),k=(s,t,e)=>(e??y(s,{spacing:"preserve"})).filter(r=>r.tags.some(n=>b.has(n.tag))).map(r=>{const n=r.tags.length+1,a={};for(const o of S(r.tags,t))m(a,o,l);["definitions","responses","parameters","securityDefinitions","components","tags"].forEach(o=>{a[o]!==void 0&&d(a[o])&&delete a[o]});const p=JSON.parse(JSON.stringify(a));return{loc:n,spec:p}});export{k as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visulima/jsdoc-open-api",
3
- "version": "3.0.11",
3
+ "version": "4.0.0",
4
4
  "description": "Generates swagger doc based on JSDoc.",
5
5
  "keywords": [
6
6
  "api",
@@ -90,10 +90,10 @@
90
90
  },
91
91
  "dependencies": {
92
92
  "@apidevtools/swagger-parser": "^12.1.0",
93
- "@visulima/fs": "5.1.0",
93
+ "@visulima/fs": "6.0.0",
94
+ "@visulima/yaml": "1.0.0",
94
95
  "comment-parser": "1.4.7",
95
- "es-toolkit": "^1.49.0",
96
- "yaml": "2.9.0"
96
+ "es-toolkit": "^1.49.0"
97
97
  },
98
98
  "optionalDependencies": {
99
99
  "cli-progress": "^3.12.0",
@@ -1 +0,0 @@
1
- import{readFileSync as n}from"node:fs";import t from"node:path";import m from"yaml";const s=o=>{const r=t.extname(o);if(r!==".yaml"&&r!==".yml"&&r!==".json")throw new Error("OpenAPI definition path must be YAML or JSON.");const e=n(o,{encoding:"utf8"});return r===".yaml"||r===".yml"?m.parse(e):JSON.parse(e)};export{s as default};
@@ -1 +0,0 @@
1
- import{readFileSync as f}from"node:fs";import p from"node:path";import{parse as u}from"comment-parser";import y from"yaml";import d from"./yamlLoc-DPq-xUM4.js";const i=new Set(["components","externalDocs","info","openapi","paths","security","servers","tags"]);class g extends Error{filePath}const l=new Set([".yaml",".yml"]),h=(t,o)=>{const r=y.parse(o);if(r===null||typeof r!="object")return[];const n=Object.keys(r).filter(e=>!i.has(e));if(n.length>0){const e=new g(`Unexpected keys: ${n.join(", ")}`);throw e.filePath=t,e}return Object.keys(r).some(e=>i.has(e))?[{loc:d(o),spec:r}]:[]},k=(t,o,r)=>{const n=f(t,{encoding:"utf8"}),e=p.extname(t);if(l.has(e))return h(t,n);try{return o(n,r)}catch(s){throw s.filePath=t,s}},O=(t,o,r)=>{const n=f(t,{encoding:"utf8"}),e=p.extname(t);if(l.has(e))return h(t,n);const s=u(n,{spacing:"preserve"}),c=[];for(const m of o)try{c.push(...m(n,r,s))}catch(a){throw a.filePath=t,a}return c};export{k as default,O as parseFileMulti};
@@ -1,10 +0,0 @@
1
- import{parse as u}from"comment-parser";import{mergeWith as m}from"es-toolkit";import y from"yaml";import{u as l}from"./customizer-BXFVpImq.js";const g=(s,t)=>{if(t===null)return s},f=(s,t)=>{const e=m({},s??{},g);return m(e,t??{},g)},d=s=>Object.keys(s).map(t=>s[t]).every(t=>typeof t=="object"&&Object.keys(t).every(e=>!(e in t))),h=(s,t)=>t.some(e=>s.name===e.name),v=s=>{switch(s.tag){case"asyncapi":return"v4";case"openapi":return"v3";case"swagger":return"v2";default:return"v2"}},w=(s,t,e)=>{if(e==="x-webhooks"&&(s[e]=t[e]),!e.startsWith("x-"))if(["components","consumes","produces","paths","schemas","securityDefinitions","responses","parameters","definitions","channels"].includes(e)){const r=t[e];r!=null&&(s[e]??={},Object.keys(r).forEach(n=>{s[e][n]=f(s[e][n],r[n])}))}else if(e==="tags"){const{tags:r}=t;Array.isArray(r)?r.forEach(n=>{h(n,s.tags)||s.tags.push(n)}):h(r,s.tags)||s.tags.push(r)}else if(e==="security"){const{security:r}=t;s.security=r}else e.startsWith("/")&&(s.paths[e]=f(s.paths[e],t[e]))},E={v2:["paths","definitions","responses","parameters","securityDefinitions"],v3:["paths","definitions","responses","parameters","securityDefinitions","components"],v4:["components","channels"]},S=(s,t)=>s.map(e=>{const r=e.description!==""||e.name.startsWith("/")||e.name.endsWith(":");if((e.tag==="openapi"||e.tag==="swagger"||e.tag==="asyncapi")&&r){let n=e.description;(e.name.startsWith("/")||e.name.endsWith(":"))&&(n=n.trim()===""?e.name:`${e.name}
2
- ${n}`);const a=y.parseDocument(n);if(a.errors.length>0){a.errors.forEach(p=>{p.annotation=n});let i="Error parsing YAML in @openapi spec:";throw i+=t?a.errors.map(p=>`${p.toString()}
3
- Imbedded within:
4
- \`\`\`
5
- ${p.annotation?.replaceAll(`
6
- `,`
7
- `)}
8
- \`\`\``).join(`
9
- `):a.errors.map(p=>p.toString()).join(`
10
- `),new Error(i)}const c=a.toJSON(),o={tags:[]};return E[v(e)].forEach(i=>{o[i]=o[i]??{}}),Object.keys(c).forEach(i=>{w(o,c,i)}),o}return{}}),O=new Set(["asyncapi","openapi","swagger"]),k=(s,t,e)=>(e??u(s,{spacing:"preserve"})).filter(r=>r.tags.some(n=>O.has(n.tag))).map(r=>{const n=r.tags.length+1,a={};for(const o of S(r.tags,t))m(a,o,l);["definitions","responses","parameters","securityDefinitions","components","tags"].forEach(o=>{a[o]!==void 0&&d(a[o])&&delete a[o]});const c=JSON.parse(JSON.stringify(a));return{loc:n,spec:c}});export{k as default};