@visulima/jsdoc-open-api 3.0.0-alpha.29 → 3.0.0-alpha.30

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.
Files changed (70) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +44 -33
  3. package/dist/cli/commander/index.cjs +1 -1
  4. package/dist/cli/commander/index.d.cts +3 -3
  5. package/dist/cli/commander/index.d.mts +3 -3
  6. package/dist/cli/commander/index.d.ts +3 -3
  7. package/dist/cli/commander/index.mjs +1 -1
  8. package/dist/cli/index.cjs +1 -1
  9. package/dist/cli/index.d.cts +1 -0
  10. package/dist/cli/index.d.mts +1 -0
  11. package/dist/cli/index.d.ts +1 -0
  12. package/dist/cli/index.mjs +1 -1
  13. package/dist/index.cjs +1 -1
  14. package/dist/index.d.cts +24 -5
  15. package/dist/index.d.mts +24 -5
  16. package/dist/index.d.ts +24 -5
  17. package/dist/index.mjs +1 -1
  18. package/dist/packem_shared/DEFAULT_OPTIONS-C7o6qjwP.mjs +1 -0
  19. package/dist/packem_shared/DEFAULT_OPTIONS-CP1lNs-k.cjs +1 -0
  20. package/dist/packem_shared/SpecBuilder-C_KcIxW-.cjs +1 -0
  21. package/dist/packem_shared/SpecBuilder-Vbq42UbW.mjs +1 -0
  22. package/dist/packem_shared/SwaggerCompilerPlugin-Bd9L4Djt.cjs +1 -0
  23. package/dist/packem_shared/SwaggerCompilerPlugin-wRdVpHJS.mjs +1 -0
  24. package/dist/packem_shared/constants-CdEv9ZcD.mjs +1 -0
  25. package/dist/packem_shared/constants-DnbfJ7Id.cjs +1 -0
  26. package/dist/packem_shared/customizer-BXFVpImq.mjs +1 -0
  27. package/dist/packem_shared/customizer-Bo8QD_ti.cjs +1 -0
  28. package/dist/packem_shared/generateCommand-CEP0sWth.cjs +5 -0
  29. package/dist/packem_shared/generateCommand-CkcShFNr.mjs +5 -0
  30. package/dist/packem_shared/generateCommand-CmoN8jyY.cjs +1 -0
  31. package/dist/packem_shared/generateCommand-DEhmHbRZ.mjs +1 -0
  32. package/dist/packem_shared/initCommand-1O6IuWJv.mjs +1 -0
  33. package/dist/packem_shared/initCommand-C8s0kkim.cjs +1 -0
  34. package/dist/packem_shared/{initCommand-CiV7G3q4.cjs → initCommand-Ca1hGdYS.mjs} +2 -2
  35. package/dist/packem_shared/{initCommand-CwoPwelm.mjs → initCommand-DvNH61Z4.cjs} +2 -2
  36. package/dist/packem_shared/jsDocumentCommentsToOpenApi-BEQrWgpQ.mjs +1 -0
  37. package/dist/packem_shared/jsDocumentCommentsToOpenApi-CMbdb0uR.cjs +1 -0
  38. package/dist/packem_shared/loadDefinition-7r9qpfuE.mjs +1 -0
  39. package/dist/packem_shared/loadDefinition-ah20Zy-G.cjs +1 -0
  40. package/dist/packem_shared/parseFile-CPb-Kglh.cjs +1 -0
  41. package/dist/packem_shared/parseFile-Wxs3O0wy.mjs +1 -0
  42. package/dist/packem_shared/swaggerJsDocumentCommentsToOpenApi-BnPWbZoe.mjs +10 -0
  43. package/dist/packem_shared/swaggerJsDocumentCommentsToOpenApi-rMEaS4lg.cjs +10 -0
  44. package/dist/packem_shared/validate-9Rwe2A3r.mjs +1 -0
  45. package/dist/packem_shared/validate-DLmCjOPl.cjs +1 -0
  46. package/dist/packem_shared/yamlLoc-DC_7PYVS.cjs +1 -0
  47. package/dist/packem_shared/yamlLoc-DPq-xUM4.mjs +1 -0
  48. package/package.json +6 -6
  49. package/dist/packem_shared/SpecBuilder-CR4EZk93.cjs +0 -1
  50. package/dist/packem_shared/SpecBuilder-DjnDJFpv.mjs +0 -1
  51. package/dist/packem_shared/SwaggerCompilerPlugin-Dz_h2XB7.cjs +0 -1
  52. package/dist/packem_shared/SwaggerCompilerPlugin-HasoKKtw.mjs +0 -1
  53. package/dist/packem_shared/customizer-COfd-Xr1.mjs +0 -1
  54. package/dist/packem_shared/customizer-DUz3nxAJ.cjs +0 -1
  55. package/dist/packem_shared/generateCommand-C8cnfcN7.cjs +0 -4
  56. package/dist/packem_shared/generateCommand-CsPJY2UQ.mjs +0 -1
  57. package/dist/packem_shared/generateCommand-DjMBmVdl.mjs +0 -4
  58. package/dist/packem_shared/generateCommand-Djp2aFKo.cjs +0 -1
  59. package/dist/packem_shared/initCommand-Bm4veOwd.mjs +0 -1
  60. package/dist/packem_shared/initCommand-DAcI_ilX.cjs +0 -1
  61. package/dist/packem_shared/jsDocumentCommentsToOpenApi-CkXyEORi.cjs +0 -1
  62. package/dist/packem_shared/jsDocumentCommentsToOpenApi-CsKVtvW4.mjs +0 -1
  63. package/dist/packem_shared/parseFile-B7dCmwpU.cjs +0 -1
  64. package/dist/packem_shared/parseFile-C7DRmTDf.mjs +0 -1
  65. package/dist/packem_shared/swaggerJsDocumentCommentsToOpenApi-CPuUxW0D.cjs +0 -10
  66. package/dist/packem_shared/swaggerJsDocumentCommentsToOpenApi-Dy8pOPTp.mjs +0 -10
  67. package/dist/packem_shared/validate-_k84qawx.mjs +0 -1
  68. package/dist/packem_shared/validate-tZa-jyuN.cjs +0 -1
  69. package/dist/packem_shared/yamlLoc-C2tVIYaz.mjs +0 -1
  70. package/dist/packem_shared/yamlLoc-DyGcp8YC.cjs +0 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,26 @@
1
+ ## @visulima/jsdoc-open-api [3.0.0-alpha.30](https://github.com/visulima/visulima/compare/@visulima/jsdoc-open-api@3.0.0-alpha.29...@visulima/jsdoc-open-api@3.0.0-alpha.30) (2026-06-13)
2
+
3
+ ### Features
4
+
5
+ * **jsdoc-open-api:** harden merge, fix error paths, add yaml/stdout/watch output ([abd6a1a](https://github.com/visulima/visulima/commit/abd6a1ae6be8060515f8a61a1469b8ae652bf58a))
6
+
7
+ ### Bug Fixes
8
+
9
+ * **jsdoc-open-api:** use String.raw for mime-type backslash literal ([e55977d](https://github.com/visulima/visulima/commit/e55977d804ec2cb26b077f51bd2ce9cc6677d5ac))
10
+
11
+ ### Tests
12
+
13
+ * **jsdoc-open-api:** assert each file is parsed once ([b285496](https://github.com/visulima/visulima/commit/b28549623e984cc65a8c645a149406c546461e93))
14
+
15
+ ### Build System
16
+
17
+ * regenerate bundled-license manifests and types ordering ([af26588](https://github.com/visulima/visulima/commit/af26588d75aaa937fd4862800560bd4070a4878c))
18
+
19
+
20
+ ### Dependencies
21
+
22
+ * **@visulima/fs:** upgraded to 5.0.0-alpha.32
23
+
1
24
  ## @visulima/jsdoc-open-api [3.0.0-alpha.29](https://github.com/visulima/visulima/compare/@visulima/jsdoc-open-api@3.0.0-alpha.28...@visulima/jsdoc-open-api@3.0.0-alpha.29) (2026-06-04)
2
25
 
3
26
 
package/README.md CHANGED
@@ -134,11 +134,23 @@ jsdoc-open-api generate src/routes/**/*.js src/controllers/
134
134
  # Specify output file
135
135
  jsdoc-open-api generate -o ./public/swagger.json src/
136
136
 
137
+ # Emit YAML instead of JSON (format is inferred from the extension)
138
+ jsdoc-open-api generate -o ./openapi.yaml src/
139
+
140
+ # Write the spec to stdout (useful for piping into other tools)
141
+ jsdoc-open-api generate -o - src/
142
+
143
+ # Seed info/servers/components from a standalone base-definition file
144
+ jsdoc-open-api generate -d ./definition.yaml src/
145
+
146
+ # Re-generate automatically whenever a watched path changes
147
+ jsdoc-open-api generate --watch src/
148
+
137
149
  # Use verbose output
138
150
  jsdoc-open-api generate -v src/
139
151
 
140
152
  # Use very verbose output for debugging
141
- jsdoc-open-api generate -d src/
153
+ jsdoc-open-api generate --very-verbose src/
142
154
  ```
143
155
 
144
156
  ### `generate` Command Options:
@@ -149,54 +161,53 @@ jsdoc-open-api generate [options] [path ...]
149
161
 
150
162
  - `[path ...]` : Paths to files or directories to parse (optional, uses configuration if not provided).
151
163
  - `-c, --config [.openapirc.js]` : Specify the configuration file path. Defaults to `.openapirc.js`.
152
- - `-o, --output [swaggerSpec.json]` : Specify the output file for the OpenAPI specification. Defaults to `swaggerSpec.json`.
164
+ - `-d, --definition [definition.yaml]` : Base OpenAPI definition file (YAML or JSON) used to seed `info`/`servers`/`components`. The config's `swaggerDefinition` takes precedence over the file.
165
+ - `-o, --output [swaggerSpec.json]` : Specify the output file for the OpenAPI specification. Defaults to `swagger.json`. Use a `.yaml`/`.yml` extension to emit YAML, or `-` to write to stdout.
166
+ - `-w, --watch` : Re-generate the specification whenever one of the watched paths changes (press Ctrl+C to exit).
153
167
  - `-v, --verbose` : Enable verbose output during generation.
154
- - `-d, --very-verbose` : Enable _very_ verbose output for detailed debugging.
168
+ - `--very-verbose` : Enable _very_ verbose output for detailed debugging.
155
169
 
156
170
  ---
157
171
 
158
172
  ## Programmatic Usage
159
173
 
160
- You can integrate the generation process directly into your Node.js scripts.
174
+ You can assemble a specification directly in your Node.js scripts. The package
175
+ exposes the building blocks rather than a single all-in-one function:
176
+
177
+ - `SpecBuilder` — merges per-file results into a single OpenAPI document.
178
+ - `parseFile` / `parseFileMulti` — read a file and run one (or several) comment translators over it. `parseFileMulti` reads + parses the comments only once when you need both dialects.
179
+ - `jsDocumentCommentsToOpenApi` / `swaggerJsDocumentCommentsToOpenApi` — the two JSDoc dialect translators.
180
+ - `validate` — validate the assembled document with `@apidevtools/swagger-parser` (the same check the CLI runs).
181
+ - `loadDefinition` — load a standalone base-definition file (YAML or JSON).
161
182
 
162
183
  ```javascript
163
184
  import path from "node:path";
164
185
  import { fileURLToPath } from "node:url";
165
- import jsdocOpenApi from "@visulima/jsdoc-open-api"; // Adjust import based on your module system (require vs import)
166
186
 
167
- const __filename = fileURLToPath(import.meta.url);
168
- const __dirname = path.dirname(__filename);
187
+ import { SpecBuilder, parseFileMulti, jsDocumentCommentsToOpenApi, swaggerJsDocumentCommentsToOpenApi, validate } from "@visulima/jsdoc-open-api";
169
188
 
170
- const options = {
171
- definition: {
172
- openapi: "3.0.0",
173
- info: {
174
- title: "My Programmatic API",
175
- version: "1.0.0",
176
- description: "API documentation generated programmatically",
177
- },
178
- // Add other base OpenAPI definition properties here
189
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
190
+
191
+ const spec = new SpecBuilder({
192
+ openapi: "3.0.0",
193
+ info: {
194
+ title: "My Programmatic API",
195
+ version: "1.0.0",
196
+ description: "API documentation generated programmatically",
179
197
  },
180
- // Glob patterns pointing to your source files with JSDoc comments
181
- sources: [path.join(__dirname, "src/routes/**/*.js")],
182
- // Optional: Specify output path (defaults to 'swaggerSpec.json' in current dir)
183
- // output: path.join(__dirname, 'public/api-docs.json'),
184
- // Optional: Enable verbose logging
185
- // verbose: true,
186
- };
198
+ });
199
+
200
+ const translators = [jsDocumentCommentsToOpenApi, swaggerJsDocumentCommentsToOpenApi];
187
201
 
188
- async function generateDocs() {
189
- try {
190
- const specification = await jsdocOpenApi(options);
191
- console.log("OpenAPI specification generated successfully:");
192
- // The specification object is returned, and also written to the output file if specified.
193
- // console.log(JSON.stringify(specification, null, 2));
194
- } catch (error) {
195
- console.error("Error generating OpenAPI specification:", error);
196
- }
202
+ // Feed each source file through both dialects (single read + single comment parse).
203
+ for (const file of [path.join(__dirname, "src/routes/users.js")]) {
204
+ spec.addData(parseFileMulti(file, translators).map((entry) => entry.spec));
197
205
  }
198
206
 
199
- generateDocs();
207
+ // Re-use the exact validation the CLI performs.
208
+ await validate(structuredClone(spec));
209
+
210
+ console.log(JSON.stringify(spec, null, 2));
200
211
  ```
201
212
 
202
213
  ---
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("../../packem_shared/generateCommand-Djp2aFKo.cjs"),t=require("../../packem_shared/initCommand-DAcI_ilX.cjs");exports.generateCommand=e;exports.initCommand=t;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("../../packem_shared/generateCommand-CmoN8jyY.cjs"),t=require("../../packem_shared/initCommand-C8s0kkim.cjs");exports.generateCommand=e;exports.initCommand=t;
@@ -854,13 +854,13 @@ declare class Command {
854
854
 
855
855
  /**
856
856
  * Set the name of the command from script filename, such as process.argv[1],
857
- * or require.main.filename, or __filename.
857
+ * or import.meta.filename.
858
858
  *
859
859
  * (Used internally and public although not documented in README.)
860
860
  *
861
861
  * @example
862
862
  * ```ts
863
- * program.nameFromFilename(require.main.filename);
863
+ * program.nameFromFilename(import.meta.filename);
864
864
  * ```
865
865
  *
866
866
  * @returns `this` command for chaining
@@ -872,7 +872,7 @@ declare class Command {
872
872
  *
873
873
  * @example
874
874
  * ```ts
875
- * program.executableDir(__dirname);
875
+ * program.executableDir(import.meta.dirname);
876
876
  * // or
877
877
  * program.executableDir('subcommands');
878
878
  * ```
@@ -854,13 +854,13 @@ declare class Command {
854
854
 
855
855
  /**
856
856
  * Set the name of the command from script filename, such as process.argv[1],
857
- * or require.main.filename, or __filename.
857
+ * or import.meta.filename.
858
858
  *
859
859
  * (Used internally and public although not documented in README.)
860
860
  *
861
861
  * @example
862
862
  * ```ts
863
- * program.nameFromFilename(require.main.filename);
863
+ * program.nameFromFilename(import.meta.filename);
864
864
  * ```
865
865
  *
866
866
  * @returns `this` command for chaining
@@ -872,7 +872,7 @@ declare class Command {
872
872
  *
873
873
  * @example
874
874
  * ```ts
875
- * program.executableDir(__dirname);
875
+ * program.executableDir(import.meta.dirname);
876
876
  * // or
877
877
  * program.executableDir('subcommands');
878
878
  * ```
@@ -854,13 +854,13 @@ declare class Command {
854
854
 
855
855
  /**
856
856
  * Set the name of the command from script filename, such as process.argv[1],
857
- * or require.main.filename, or __filename.
857
+ * or import.meta.filename.
858
858
  *
859
859
  * (Used internally and public although not documented in README.)
860
860
  *
861
861
  * @example
862
862
  * ```ts
863
- * program.nameFromFilename(require.main.filename);
863
+ * program.nameFromFilename(import.meta.filename);
864
864
  * ```
865
865
  *
866
866
  * @returns `this` command for chaining
@@ -872,7 +872,7 @@ declare class Command {
872
872
  *
873
873
  * @example
874
874
  * ```ts
875
- * program.executableDir(__dirname);
875
+ * program.executableDir(import.meta.dirname);
876
876
  * // or
877
877
  * program.executableDir('subcommands');
878
878
  * ```
@@ -1 +1 @@
1
- import{default as m}from"../../packem_shared/generateCommand-CsPJY2UQ.mjs";import{default as t}from"../../packem_shared/initCommand-Bm4veOwd.mjs";export{m as generateCommand,t as initCommand};
1
+ import{default as m}from"../../packem_shared/generateCommand-DEhmHbRZ.mjs";import{default as t}from"../../packem_shared/initCommand-1O6IuWJv.mjs";export{m as generateCommand,t as initCommand};
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("../packem_shared/generateCommand-C8cnfcN7.cjs"),t=require("../packem_shared/initCommand-CiV7G3q4.cjs");exports.generateCommand=e;exports.initCommand=t;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("../packem_shared/generateCommand-CEP0sWth.cjs"),t=require("../packem_shared/initCommand-DvNH61Z4.cjs");exports.generateCommand=e;exports.initCommand=t;
@@ -1,5 +1,6 @@
1
1
  declare const generateCommand: (configName: string, paths: string[], options: {
2
2
  config?: string;
3
+ definition?: string;
3
4
  output?: string;
4
5
  verbose?: boolean;
5
6
  veryVerbose?: boolean;
@@ -1,5 +1,6 @@
1
1
  declare const generateCommand: (configName: string, paths: string[], options: {
2
2
  config?: string;
3
+ definition?: string;
3
4
  output?: string;
4
5
  verbose?: boolean;
5
6
  veryVerbose?: boolean;
@@ -1,5 +1,6 @@
1
1
  declare const generateCommand: (configName: string, paths: string[], options: {
2
2
  config?: string;
3
+ definition?: string;
3
4
  output?: string;
4
5
  verbose?: boolean;
5
6
  veryVerbose?: boolean;
@@ -1 +1 @@
1
- import{default as m}from"../packem_shared/generateCommand-DjMBmVdl.mjs";import{default as t}from"../packem_shared/initCommand-CwoPwelm.mjs";export{m as generateCommand,t as initCommand};
1
+ import{default as m}from"../packem_shared/generateCommand-CkcShFNr.mjs";import{default as t}from"../packem_shared/initCommand-Ca1hGdYS.mjs";export{m as generateCommand,t as initCommand};
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./packem_shared/jsDocumentCommentsToOpenApi-CkXyEORi.cjs"),r=require("./packem_shared/parseFile-B7dCmwpU.cjs"),i=require("./packem_shared/SpecBuilder-CR4EZk93.cjs"),o=require("./packem_shared/swaggerJsDocumentCommentsToOpenApi-CPuUxW0D.cjs"),u=require("./packem_shared/yamlLoc-DyGcp8YC.cjs"),m=require("./packem_shared/SwaggerCompilerPlugin-Dz_h2XB7.cjs");exports.jsDocumentCommentsToOpenApi=e;exports.parseFile=r;exports.SpecBuilder=i;exports.swaggerJsDocumentCommentsToOpenApi=o;exports.yamlLoc=u;exports.SwaggerCompilerPlugin=m;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const i=require("./packem_shared/jsDocumentCommentsToOpenApi-CMbdb0uR.cjs"),r=require("./packem_shared/DEFAULT_OPTIONS-CP1lNs-k.cjs"),e=require("./packem_shared/parseFile-CPb-Kglh.cjs"),o=require("./packem_shared/SpecBuilder-C_KcIxW-.cjs"),u=require("./packem_shared/swaggerJsDocumentCommentsToOpenApi-rMEaS4lg.cjs"),l=require("./packem_shared/loadDefinition-ah20Zy-G.cjs"),t=require("./packem_shared/yamlLoc-DC_7PYVS.cjs"),n=require("./packem_shared/validate-DLmCjOPl.cjs"),a=require("./packem_shared/SwaggerCompilerPlugin-Bd9L4Djt.cjs");exports.jsDocumentCommentsToOpenApi=i;exports.DEFAULT_OPTIONS=r;exports.parseFile=e.default;exports.parseFileMulti=e.parseFileMulti;exports.SpecBuilder=o;exports.swaggerJsDocumentCommentsToOpenApi=u;exports.loadDefinition=l;exports.yamlLoc=t;exports.validate=n;exports.SwaggerCompilerPlugin=a;
package/dist/index.d.cts CHANGED
@@ -1,3 +1,4 @@
1
+ import { Block } from 'comment-parser';
1
2
  import 'buffer';
2
3
  import 'http';
3
4
  import 'https';
@@ -203,14 +204,27 @@ interface OAuthFlowObject {
203
204
  }
204
205
  type SecurityRequirementObject = Record<string, string[]>;
205
206
  type Map<T> = Record<string, T>;
206
- declare const commentsToOpenApi$1: (fileContents: string, verbose?: boolean) => {
207
+ declare const commentsToOpenApi$1: (fileContents: string, verbose?: boolean, comments?: Block[]) => {
207
208
  loc: number;
208
209
  spec: OpenApiObject;
209
210
  }[];
210
- declare const parseFile: (file: string, commentsToOpenApi: (fileContent: string, verbose?: boolean) => {
211
+ declare const DEFAULT_OPTIONS: {
212
+ cwd: undefined;
213
+ exclude: string[];
214
+ excludeNodeModules: boolean;
215
+ extension: string[];
216
+ include: string[];
217
+ verbose: boolean;
218
+ };
219
+ type CommentsToOpenApi = (fileContent: string, verbose?: boolean, comments?: Block[]) => {
211
220
  loc: number;
212
221
  spec: OpenApiObject;
213
- }[], verbose?: boolean) => {
222
+ }[];
223
+ declare const parseFile$1: (file: string, commentsToOpenApi: CommentsToOpenApi, verbose?: boolean) => {
224
+ loc: number;
225
+ spec: OpenApiObject;
226
+ }[];
227
+ declare const parseFileMulti: (file: string, translators: CommentsToOpenApi[], verbose?: boolean) => {
214
228
  loc: number;
215
229
  spec: OpenApiObject;
216
230
  }[];
@@ -226,22 +240,27 @@ declare class SpecBuilder implements OpenApiObject {
226
240
  constructor(baseDefinition: BaseDefinition);
227
241
  addData(parsedFile: OpenApiObject[]): void;
228
242
  }
229
- declare const commentsToOpenApi: (fileContents: string, verbose?: boolean) => {
243
+ declare const commentsToOpenApi: (fileContents: string, verbose?: boolean, comments?: Block[]) => {
230
244
  loc: number;
231
245
  spec: OpenApiObject;
232
246
  }[];
247
+ declare const parseFile: (file: string) => BaseDefinition;
233
248
  declare const yamlLoc: (string: string) => number;
249
+ declare const validate: (spec: Record<string, unknown>) => Promise<void>;
234
250
  type WebpackCompiler = undefined;
235
251
  declare class SwaggerCompilerPlugin {
236
252
  private readonly assetsPath;
237
253
  private readonly ignore;
254
+ private readonly silent;
238
255
  private readonly sources;
239
256
  private readonly swaggerDefinition;
240
257
  private readonly verbose;
241
258
  constructor(assetsPath: string, sources: string[], swaggerDefinition: BaseDefinition, options: {
242
259
  ignore?: (RegExp | string)[];
260
+ silent?: boolean;
243
261
  verbose?: boolean;
244
262
  });
245
263
  apply(compiler: WebpackCompiler): void;
264
+ private log;
246
265
  }
247
- export { type BaseDefinition, type OpenApiObject, SpecBuilder, SwaggerCompilerPlugin, commentsToOpenApi$1 as jsDocumentCommentsToOpenApi, parseFile, commentsToOpenApi as swaggerJsDocumentCommentsToOpenApi, yamlLoc };
266
+ export { type BaseDefinition, type CommentsToOpenApi, DEFAULT_OPTIONS, type OpenApiObject, SpecBuilder, SwaggerCompilerPlugin, commentsToOpenApi$1 as jsDocumentCommentsToOpenApi, parseFile as loadDefinition, parseFile$1 as parseFile, parseFileMulti, commentsToOpenApi as swaggerJsDocumentCommentsToOpenApi, validate, yamlLoc };
package/dist/index.d.mts CHANGED
@@ -1,3 +1,4 @@
1
+ import { Block } from 'comment-parser';
1
2
  import 'buffer';
2
3
  import 'http';
3
4
  import 'https';
@@ -203,14 +204,27 @@ interface OAuthFlowObject {
203
204
  }
204
205
  type SecurityRequirementObject = Record<string, string[]>;
205
206
  type Map<T> = Record<string, T>;
206
- declare const commentsToOpenApi$1: (fileContents: string, verbose?: boolean) => {
207
+ declare const commentsToOpenApi$1: (fileContents: string, verbose?: boolean, comments?: Block[]) => {
207
208
  loc: number;
208
209
  spec: OpenApiObject;
209
210
  }[];
210
- declare const parseFile: (file: string, commentsToOpenApi: (fileContent: string, verbose?: boolean) => {
211
+ declare const DEFAULT_OPTIONS: {
212
+ cwd: undefined;
213
+ exclude: string[];
214
+ excludeNodeModules: boolean;
215
+ extension: string[];
216
+ include: string[];
217
+ verbose: boolean;
218
+ };
219
+ type CommentsToOpenApi = (fileContent: string, verbose?: boolean, comments?: Block[]) => {
211
220
  loc: number;
212
221
  spec: OpenApiObject;
213
- }[], verbose?: boolean) => {
222
+ }[];
223
+ declare const parseFile$1: (file: string, commentsToOpenApi: CommentsToOpenApi, verbose?: boolean) => {
224
+ loc: number;
225
+ spec: OpenApiObject;
226
+ }[];
227
+ declare const parseFileMulti: (file: string, translators: CommentsToOpenApi[], verbose?: boolean) => {
214
228
  loc: number;
215
229
  spec: OpenApiObject;
216
230
  }[];
@@ -226,22 +240,27 @@ declare class SpecBuilder implements OpenApiObject {
226
240
  constructor(baseDefinition: BaseDefinition);
227
241
  addData(parsedFile: OpenApiObject[]): void;
228
242
  }
229
- declare const commentsToOpenApi: (fileContents: string, verbose?: boolean) => {
243
+ declare const commentsToOpenApi: (fileContents: string, verbose?: boolean, comments?: Block[]) => {
230
244
  loc: number;
231
245
  spec: OpenApiObject;
232
246
  }[];
247
+ declare const parseFile: (file: string) => BaseDefinition;
233
248
  declare const yamlLoc: (string: string) => number;
249
+ declare const validate: (spec: Record<string, unknown>) => Promise<void>;
234
250
  type WebpackCompiler = undefined;
235
251
  declare class SwaggerCompilerPlugin {
236
252
  private readonly assetsPath;
237
253
  private readonly ignore;
254
+ private readonly silent;
238
255
  private readonly sources;
239
256
  private readonly swaggerDefinition;
240
257
  private readonly verbose;
241
258
  constructor(assetsPath: string, sources: string[], swaggerDefinition: BaseDefinition, options: {
242
259
  ignore?: (RegExp | string)[];
260
+ silent?: boolean;
243
261
  verbose?: boolean;
244
262
  });
245
263
  apply(compiler: WebpackCompiler): void;
264
+ private log;
246
265
  }
247
- export { type BaseDefinition, type OpenApiObject, SpecBuilder, SwaggerCompilerPlugin, commentsToOpenApi$1 as jsDocumentCommentsToOpenApi, parseFile, commentsToOpenApi as swaggerJsDocumentCommentsToOpenApi, yamlLoc };
266
+ export { type BaseDefinition, type CommentsToOpenApi, DEFAULT_OPTIONS, type OpenApiObject, SpecBuilder, SwaggerCompilerPlugin, commentsToOpenApi$1 as jsDocumentCommentsToOpenApi, parseFile as loadDefinition, parseFile$1 as parseFile, parseFileMulti, commentsToOpenApi as swaggerJsDocumentCommentsToOpenApi, validate, yamlLoc };
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { Block } from 'comment-parser';
1
2
  import 'buffer';
2
3
  import 'http';
3
4
  import 'https';
@@ -203,14 +204,27 @@ interface OAuthFlowObject {
203
204
  }
204
205
  type SecurityRequirementObject = Record<string, string[]>;
205
206
  type Map<T> = Record<string, T>;
206
- declare const commentsToOpenApi$1: (fileContents: string, verbose?: boolean) => {
207
+ declare const commentsToOpenApi$1: (fileContents: string, verbose?: boolean, comments?: Block[]) => {
207
208
  loc: number;
208
209
  spec: OpenApiObject;
209
210
  }[];
210
- declare const parseFile: (file: string, commentsToOpenApi: (fileContent: string, verbose?: boolean) => {
211
+ declare const DEFAULT_OPTIONS: {
212
+ cwd: undefined;
213
+ exclude: string[];
214
+ excludeNodeModules: boolean;
215
+ extension: string[];
216
+ include: string[];
217
+ verbose: boolean;
218
+ };
219
+ type CommentsToOpenApi = (fileContent: string, verbose?: boolean, comments?: Block[]) => {
211
220
  loc: number;
212
221
  spec: OpenApiObject;
213
- }[], verbose?: boolean) => {
222
+ }[];
223
+ declare const parseFile$1: (file: string, commentsToOpenApi: CommentsToOpenApi, verbose?: boolean) => {
224
+ loc: number;
225
+ spec: OpenApiObject;
226
+ }[];
227
+ declare const parseFileMulti: (file: string, translators: CommentsToOpenApi[], verbose?: boolean) => {
214
228
  loc: number;
215
229
  spec: OpenApiObject;
216
230
  }[];
@@ -226,22 +240,27 @@ declare class SpecBuilder implements OpenApiObject {
226
240
  constructor(baseDefinition: BaseDefinition);
227
241
  addData(parsedFile: OpenApiObject[]): void;
228
242
  }
229
- declare const commentsToOpenApi: (fileContents: string, verbose?: boolean) => {
243
+ declare const commentsToOpenApi: (fileContents: string, verbose?: boolean, comments?: Block[]) => {
230
244
  loc: number;
231
245
  spec: OpenApiObject;
232
246
  }[];
247
+ declare const parseFile: (file: string) => BaseDefinition;
233
248
  declare const yamlLoc: (string: string) => number;
249
+ declare const validate: (spec: Record<string, unknown>) => Promise<void>;
234
250
  type WebpackCompiler = undefined;
235
251
  declare class SwaggerCompilerPlugin {
236
252
  private readonly assetsPath;
237
253
  private readonly ignore;
254
+ private readonly silent;
238
255
  private readonly sources;
239
256
  private readonly swaggerDefinition;
240
257
  private readonly verbose;
241
258
  constructor(assetsPath: string, sources: string[], swaggerDefinition: BaseDefinition, options: {
242
259
  ignore?: (RegExp | string)[];
260
+ silent?: boolean;
243
261
  verbose?: boolean;
244
262
  });
245
263
  apply(compiler: WebpackCompiler): void;
264
+ private log;
246
265
  }
247
- export { type BaseDefinition, type OpenApiObject, SpecBuilder, SwaggerCompilerPlugin, commentsToOpenApi$1 as jsDocumentCommentsToOpenApi, parseFile, commentsToOpenApi as swaggerJsDocumentCommentsToOpenApi, yamlLoc };
266
+ export { type BaseDefinition, type CommentsToOpenApi, DEFAULT_OPTIONS, type OpenApiObject, SpecBuilder, SwaggerCompilerPlugin, commentsToOpenApi$1 as jsDocumentCommentsToOpenApi, parseFile as loadDefinition, parseFile$1 as parseFile, parseFileMulti, commentsToOpenApi as swaggerJsDocumentCommentsToOpenApi, validate, yamlLoc };
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{default as r}from"./packem_shared/jsDocumentCommentsToOpenApi-CsKVtvW4.mjs";import{default as t}from"./packem_shared/parseFile-C7DRmTDf.mjs";import{default as p}from"./packem_shared/SpecBuilder-DjnDJFpv.mjs";import{default as s}from"./packem_shared/swaggerJsDocumentCommentsToOpenApi-Dy8pOPTp.mjs";import{default as u}from"./packem_shared/yamlLoc-C2tVIYaz.mjs";import{default as n}from"./packem_shared/SwaggerCompilerPlugin-HasoKKtw.mjs";export{p as SpecBuilder,n as SwaggerCompilerPlugin,r as jsDocumentCommentsToOpenApi,t as parseFile,s as swaggerJsDocumentCommentsToOpenApi,u as yamlLoc};
1
+ import{default as a}from"./packem_shared/jsDocumentCommentsToOpenApi-BEQrWgpQ.mjs";import{default as r}from"./packem_shared/DEFAULT_OPTIONS-C7o6qjwP.mjs";import{default as l,parseFileMulti as m}from"./packem_shared/parseFile-Wxs3O0wy.mjs";import{default as s}from"./packem_shared/SpecBuilder-Vbq42UbW.mjs";import{default as d}from"./packem_shared/swaggerJsDocumentCommentsToOpenApi-BnPWbZoe.mjs";import{default as n}from"./packem_shared/loadDefinition-7r9qpfuE.mjs";import{default as g}from"./packem_shared/yamlLoc-DPq-xUM4.mjs";import{default as D}from"./packem_shared/validate-9Rwe2A3r.mjs";import{default as T}from"./packem_shared/SwaggerCompilerPlugin-wRdVpHJS.mjs";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};
@@ -0,0 +1 @@
1
+ const s={cwd:void 0,exclude:["coverage/**","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}.yml"],excludeNodeModules:!0,extension:[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],include:["**"],verbose:!0};export{s as default};
@@ -0,0 +1 @@
1
+ "use strict";const s={cwd:void 0,exclude:["coverage/**","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}.yml"],excludeNodeModules:!0,extension:[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],include:["**"],verbose:!0};module.exports=s;
@@ -0,0 +1 @@
1
+ "use strict";const c=new Set(["__proto__","constructor","prototype"]),i=(o,s)=>{Object.keys(s).forEach(t=>{c.has(t)||(o[t]===void 0?o[t]={...s[t]}:Object.keys(s[t]).forEach(e=>{c.has(e)||(o[t][e]={...o[t][e],...s[t][e]})}))})},h=new Set(["__proto__","constructor","prototype"]);class u{components;externalDocs;info;openapi;paths;security;servers;tags;constructor(s){this.openapi=s.openapi,this.info=s.info,this.paths=s.paths??{},s.servers&&(this.servers=s.servers),s.components&&(this.components=s.components),s.security&&(this.security=s.security),s.tags&&(this.tags=s.tags),s.externalDocs&&(this.externalDocs=s.externalDocs)}addData(s){s.forEach(t=>{const{components:e,paths:n,...a}=t;i(this,{components:e??{},paths:n??{}}),Object.entries(a).forEach(([r,p])=>{h.has(r)||(this[r]=p)})})}}module.exports=u;
@@ -0,0 +1 @@
1
+ const c=new Set(["__proto__","constructor","prototype"]),h=(o,s)=>{Object.keys(s).forEach(t=>{c.has(t)||(o[t]===void 0?o[t]={...s[t]}:Object.keys(s[t]).forEach(e=>{c.has(e)||(o[t][e]={...o[t][e],...s[t][e]})}))})},i=new Set(["__proto__","constructor","prototype"]);class u{components;externalDocs;info;openapi;paths;security;servers;tags;constructor(s){this.openapi=s.openapi,this.info=s.info,this.paths=s.paths??{},s.servers&&(this.servers=s.servers),s.components&&(this.components=s.components),s.security&&(this.security=s.security),s.tags&&(this.tags=s.tags),s.externalDocs&&(this.externalDocs=s.externalDocs)}addData(s){s.forEach(t=>{const{components:e,paths:n,...a}=t;h(this,{components:e??{},paths:n??{}}),Object.entries(a).forEach(([r,p])=>{i.has(r)||(this[r]=p)})})}}export{u as default};
@@ -0,0 +1 @@
1
+ "use strict";const c=require("node:fs/promises"),u=require("node:path"),p=require("@visulima/fs"),w=require("./constants-DnbfJ7Id.cjs"),f=require("./jsDocumentCommentsToOpenApi-CMbdb0uR.cjs"),m=require("./parseFile-CPb-Kglh.cjs"),d=require("./SpecBuilder-C_KcIxW-.cjs"),v=require("./swaggerJsDocumentCommentsToOpenApi-rMEaS4lg.cjs"),b=require("./validate-DLmCjOPl.cjs"),y=[f,v],q=t=>t instanceof Error?t:new Error(String(t));class D{assetsPath;ignore;silent;sources;swaggerDefinition;verbose;constructor(e,a,r,s){this.assetsPath=e,this.swaggerDefinition=r,this.sources=a,this.verbose=s.verbose??!1,this.silent=s.silent??!1,this.ignore=s.ignore??[]}apply(e){const a=new Set([...w.D,...this.ignore]);e.hooks.make.tapAsync("SwaggerCompilerPlugin",async(r,s)=>{this.log("Build paused, switching to swagger build");const o=new d(this.swaggerDefinition);try{for(const i of this.sources){const l=await p.collect(i,{extensions:[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],includeDirs:!1,skip:[...a]});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}`),o.addData(m.parseFileMulti(g,y,this.verbose).map(h=>h.spec))})}this.verbose&&(this.log("Validating swagger spec"),this.log(JSON.stringify(o,void 0,2))),await b(structuredClone(o));const{assetsPath:n}=this;await c.mkdir(u.dirname(n),{recursive:!0}),await c.writeFile(n,JSON.stringify(o,void 0,2)),this.verbose&&this.log(`Written swagger spec to "${this.assetsPath}" file`)}catch(n){const i=q(n);Array.isArray(r.errors)&&r.errors.push(i),s(i);return}this.log("switching back to normal build"),s()})}log(e){this.silent||console.log(e)}}module.exports=D;
@@ -0,0 +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.mjs";import w from"./jsDocumentCommentsToOpenApi-BEQrWgpQ.mjs";import{parseFileMulti as d}from"./parseFile-Wxs3O0wy.mjs";import b from"./SpecBuilder-Vbq42UbW.mjs";import v from"./swaggerJsDocumentCommentsToOpenApi-BnPWbZoe.mjs";import y from"./validate-9Rwe2A3r.mjs";const D=[w,v],E=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=E(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};
@@ -0,0 +1 @@
1
+ const s=["coverage/**",".github/**","**/*.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-workspace,pnpm-lock}.yaml","**/{package,package-lock}.json","**/yarn.lock","**/package.json5","**/.next/**"];export{s as D};
@@ -0,0 +1 @@
1
+ "use strict";const s=["coverage/**",".github/**","**/*.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-workspace,pnpm-lock}.yaml","**/{package,package-lock}.json","**/yarn.lock","**/package.json5","**/.next/**"];exports.D=s;
@@ -0,0 +1 @@
1
+ const a=(r,t)=>{if(Array.isArray(r))return[...r,...t]};export{a as u};
@@ -0,0 +1 @@
1
+ "use strict";const t=(r,s)=>{if(Array.isArray(r))return[...r,...s]};exports.u=t;
@@ -0,0 +1,5 @@
1
+ "use strict";const c=require("node:fs/promises"),f=require("node:path"),b=require("node:process"),_=require("node:url"),S=require("@visulima/fs"),m=require("cli-progress"),F=require("yaml"),$=require("./constants-DnbfJ7Id.cjs"),j=require("./jsDocumentCommentsToOpenApi-CMbdb0uR.cjs"),p=require("./parseFile-CPb-Kglh.cjs"),E=require("./SpecBuilder-C_KcIxW-.cjs"),x=require("./swaggerJsDocumentCommentsToOpenApi-rMEaS4lg.cjs"),C=require("./loadDefinition-ah20Zy-G.cjs"),N=require("./validate-DLmCjOPl.cjs"),M=t=>t&&typeof t=="object"&&"default"in t?t.default:t,R=M(F),U=new Set([".yaml",".yml"]),h="-",w=[j,x],k=async t=>{try{let e=await import(_.pathToFileURL(f.normalize(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 r=e instanceof Error?e.message:String(e);throw new Error(`Failed to load config file "${t}": ${r}`,{cause:e})}},L=async(t,e,r)=>{const i=await k(r.config??t),o=r.definition??i.definition;let{swaggerDefinition:u}=i;o&&(u={...C(o),...u});const d=r.output===h?void 0:new m.MultiBar({clearOnComplete:!1,format:"{value}/{total} | {bar} | {filename}",hideCursor:!0},m.Presets.shades_grey),s=new E(u),v=new Set([...$.D,...i.exclude]);for(const g of e){const q=(await c.lstat(g)).isDirectory(),n=await c.realpath(g);if(!q){s.addData(p.parseFileMulti(n,w,r.verbose).map(l=>l.spec));continue}const a=await S.collect(n,{extensions:i.extensions??[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],followSymlinks:i.followSymlinks??!1,match:i.include,skip:[...v]});(r.verbose??r.veryVerbose)&&console.log(`
3
+ Found ${String(a.length)} files in ${n}`),r.veryVerbose&&console.log(a);const D=d?.create(a.length,0);a.forEach(l=>{r.verbose&&console.log(`Parsing file ${l}`),D?.increment(1,{filename:n}),s.addData(p.parseFileMulti(l,w,r.verbose).map(O=>O.spec))})}return r.verbose&&console.log("Validating swagger spec"),r.veryVerbose&&console.log(JSON.stringify(s,void 0,2)),await N(structuredClone(s)),d?.stop(),s},y=(t,e)=>U.has(f.extname(e))?R.stringify(structuredClone(t)):JSON.stringify(t,void 0,2),T=async(t,e,r)=>{const i=await L(t,e,r),o=r.output??"swagger.json";if(o===h){b.stdout.write(`${y(i,"swagger.json")}
4
+ `);return}r.verbose&&console.log(`Written swagger spec to "${o}" file`),await c.mkdir(f.dirname(o),{recursive:!0}),await c.writeFile(o,y(i,o)),console.log(`
5
+ Swagger specification is ready, check the "${o}" file.`)};module.exports=T;
@@ -0,0 +1,5 @@
1
+ import{mkdir as D,writeFile as b,lstat as E,realpath as O}from"node:fs/promises";import{dirname as S,extname as _,normalize as F}from"node:path";import{stdout as U}from"node:process";import{pathToFileURL as x}from"node:url";import{collect as L}from"@visulima/fs";import{MultiBar as N,Presets as j}from"cli-progress";import R from"yaml";import{D as k}from"./constants-CdEv9ZcD.mjs";import C from"./jsDocumentCommentsToOpenApi-BEQrWgpQ.mjs";import{parseFileMulti as g}from"./parseFile-Wxs3O0wy.mjs";import M from"./SpecBuilder-Vbq42UbW.mjs";import V from"./swaggerJsDocumentCommentsToOpenApi-BnPWbZoe.mjs";import P from"./loadDefinition-7r9qpfuE.mjs";import T from"./validate-9Rwe2A3r.mjs";const A=new Set([".yaml",".yml"]),u="-",p=[C,V],J=async t=>{try{let e=await import(x(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})}},z=async(t,e,o)=>{const r=await J(o.config??t),i=o.definition??r.definition;let{swaggerDefinition:c}=r;i&&(c={...P(i),...c});const f=o.output===u?void 0:new N({clearOnComplete:!1,format:"{value}/{total} | {bar} | {filename}",hideCursor:!0},j.shades_grey),s=new M(c),w=new Set([...k,...r.exclude]);for(const m of e){const y=(await E(m)).isDirectory(),a=await O(m);if(!y){s.addData(g(a,p,o.verbose).map(l=>l.spec));continue}const n=await L(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(n.length)} files in ${a}`),o.veryVerbose&&console.log(n);const h=f?.create(n.length,0);n.forEach(l=>{o.verbose&&console.log(`Parsing file ${l}`),h?.increment(1,{filename:a}),s.addData(g(l,p,o.verbose).map(v=>v.spec))})}return o.verbose&&console.log("Validating swagger spec"),o.veryVerbose&&console.log(JSON.stringify(s,void 0,2)),await T(structuredClone(s)),f?.stop(),s},d=(t,e)=>A.has(_(e))?R.stringify(structuredClone(t)):JSON.stringify(t,void 0,2),te=async(t,e,o)=>{const r=await z(t,e,o),i=o.output??"swagger.json";if(i===u){U.write(`${d(r,"swagger.json")}
4
+ `);return}o.verbose&&console.log(`Written swagger spec to "${i}" file`),await D(S(i),{recursive:!0}),await b(i,d(r,i)),console.log(`
5
+ Swagger specification is ready, check the "${i}" file.`)};export{te as default};
@@ -0,0 +1 @@
1
+ "use strict";const f=require("node:fs"),s=require("node:process"),u=require("./generateCommand-CEP0sWth.cjs"),h=e=>e&&typeof e=="object"&&"default"in e?e.default:e,p=h(s),c=e=>{console.error(e)},d=async(e,i,n)=>{const t=async()=>{await u(e,i,n)},o=i.map(a=>f.watch(a,{recursive:!0},()=>{t().catch(c)})),r=()=>{o.forEach(a=>{a.close()}),s.exit(0)};p.once("SIGINT",r),p.once("SIGTERM",r);try{await t()}catch(a){c(a)}console.log("Watching for changes... (press Ctrl+C to exit)")},g=(e,i="generate",n=".openapirc.js")=>{e.command(i).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,o)=>{if(o.watch){await d(n,t,o);return}try{await u(n,t,o)}catch(r){c(r),s.exit(1)}})};module.exports=g;
@@ -0,0 +1 @@
1
+ import{watch as u}from"node:fs";import s,{exit as p}from"node:process";import f from"./generateCommand-CkcShFNr.mjs";const c=o=>{console.error(o)},h=async(o,a,r)=>{const e=async()=>{await f(o,a,r)},t=a.map(i=>u(i,{recursive:!0},()=>{e().catch(c)})),n=()=>{t.forEach(i=>{i.close()}),p(0)};s.once("SIGINT",n),s.once("SIGTERM",n);try{await e()}catch(i){c(i)}console.log("Watching for changes... (press Ctrl+C to exit)")},d=(o,a="generate",r=".openapirc.js")=>{o.command(a).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(e,t)=>{if(t.watch){await h(r,e,t);return}try{await f(r,e,t)}catch(n){c(n),p(1)}})};export{d as default};
@@ -0,0 +1 @@
1
+ import{exit as c}from"node:process";import e from"./initCommand-Ca1hGdYS.mjs";const s=(o,i="init",r="Inits a pre-configured @visulima/jsdoc-open-api config file.",n=".openapirc.js")=>{o.command(i).description(r).action(()=>{try{e(n)}catch(t){console.error(t),c(1)}})};export{s as default};
@@ -0,0 +1 @@
1
+ "use strict";const r=require("node:process"),t=require("./initCommand-DvNH61Z4.cjs"),s=(i,e="init",n="Inits a pre-configured @visulima/jsdoc-open-api config file.",o=".openapirc.js")=>{i.command(e).description(n).action(()=>{try{t(o)}catch(c){console.error(c),r.exit(1)}})};module.exports=s;
@@ -1,4 +1,4 @@
1
- "use strict";var r=Object.defineProperty;var t=(e,s)=>r(e,"name",{value:s,configurable:!0});const n=require("node:fs"),c=require("@visulima/fs");var i=Object.defineProperty,m=t((e,s)=>i(e,"name",{value:s,configurable:!0}),"a");const p=m((e,s=process.cwd())=>{if(n.existsSync(e))throw new Error("Config file already exists");const o=c.findUpSync("package.json",{cwd:n.realpathSync(s)});let a="module.exports =";if(o){const l=c.readJsonSync(o);console.info(`Found package.json at "${o}"`),l.type==="module"&&(console.info("Found package.json with type: module, using ES6 as export for the config file"),a="export default")}else console.info("No package.json found");n.writeFileSync(e,`${a} {
1
+ import{existsSync as t,realpathSync as c,writeFileSync as l}from"node:fs";import{findUpSync as i,readJsonSync as r}from"@visulima/fs";const j=(e,a=process.cwd())=>{if(t(e))throw new Error("Config file already exists");const o=i("package.json",{cwd:c(a)});let s="module.exports =";if(o){const n=r(o);console.info(`Found package.json at "${o}"`),n.type==="module"&&(console.info("Found package.json with type: module, using ES6 as export for the config file"),s="export default")}else console.info("No package.json found");l(e,`${s} {
2
2
  exclude: [
3
3
  'coverage/**',
4
4
  '.github/**',
@@ -32,4 +32,4 @@
32
32
  },
33
33
  },
34
34
  };
35
- `),console.log(`Created "${e}"`)},"initCommand");module.exports=p;
35
+ `),console.log(`Created "${e}"`)};export{j as default};
@@ -1,4 +1,4 @@
1
- var c=Object.defineProperty;var n=(e,o)=>c(e,"name",{value:o,configurable:!0});import{existsSync as l,realpathSync as r,writeFileSync as i}from"node:fs";import{findUpSync as m,readJsonSync as p}from"@visulima/fs";var j=Object.defineProperty,f=n((e,o)=>j(e,"name",{value:o,configurable:!0}),"a");const k=f((e,o=process.cwd())=>{if(l(e))throw new Error("Config file already exists");const s=m("package.json",{cwd:r(o)});let a="module.exports =";if(s){const t=p(s);console.info(`Found package.json at "${s}"`),t.type==="module"&&(console.info("Found package.json with type: module, using ES6 as export for the config file"),a="export default")}else console.info("No package.json found");i(e,`${a} {
1
+ "use strict";const o=require("node:fs"),c=require("@visulima/fs"),l=(e,t=process.cwd())=>{if(o.existsSync(e))throw new Error("Config file already exists");const s=c.findUpSync("package.json",{cwd:o.realpathSync(t)});let n="module.exports =";if(s){const a=c.readJsonSync(s);console.info(`Found package.json at "${s}"`),a.type==="module"&&(console.info("Found package.json with type: module, using ES6 as export for the config file"),n="export default")}else console.info("No package.json found");o.writeFileSync(e,`${n} {
2
2
  exclude: [
3
3
  'coverage/**',
4
4
  '.github/**',
@@ -32,4 +32,4 @@ var c=Object.defineProperty;var n=(e,o)=>c(e,"name",{value:o,configurable:!0});i
32
32
  },
33
33
  },
34
34
  };
35
- `),console.log(`Created "${e}"`)},"initCommand");export{k as default};
35
+ `),console.log(`Created "${e}"`)};module.exports=l;
@@ -0,0 +1 @@
1
+ import{parse as d}from"comment-parser";import{mergeWith as l}from"es-toolkit";import{u as y}from"./customizer-BXFVpImq.mjs";const f=/\[\]$/,b=/^- /u,$=/Param$/u,g=/^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \/.*$/,h=t=>{t.security&&(t.security=Object.keys(t.security).map(o=>({[o]:t.security[o]})))},T=new Set(["array","boolean","integer","number","object","string"]),m={binary:"string",byte:"string",date:"string","date-time":"string",double:"number",float:"number",int32:"integer",int64:"integer",password:"string"},w=t=>{const o=t.type,c=o.endsWith("[]"),e=o.replace(f,""),n=T.has(e),r=Object.keys(m).includes(e);let s;if(t.default)switch(e){case"double":case"float":case"number":{s=Number.parseFloat(t.default);break}case"int32":case"int64":case"integer":{s=Number.parseInt(t.default,10);break}default:{s=t.default;break}}let a;n?a={default:s,type:e}:r?a={default:s,format:e,type:m[e]}:a={$ref:`#/components/schemas/${e}`};let p=c?{items:{...a},type:"array"}:{...a};e===""&&(p=void 0);let i=t.description.trim().replace(b,"");return i===""&&(i=void 0),{description:i,name:t.name,rawType:o,required:!t.optional,schema:p}},k=(t,o)=>t.map(c=>{const e=w(c);let n="";switch(e.name&&(n+=e.name),e.description&&(n+=` ${e.description.trim()}`),c.tag){case"bodyComponent":return{requestBody:{$ref:`#/components/requestBodies/${e.rawType}`}};case"bodyContent":return{requestBody:{content:{[e.name.replaceAll(String.raw`*\/*`,"*/*")]:{schema:e.schema}}}};case"bodyDescription":return{requestBody:{description:n}};case"bodyExample":{const[r,s]=e.name.split(".");return{requestBody:{content:{[r]:{examples:{[s]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}case"bodyRequired":return{requestBody:{required:!0}};case"callback":return{callbacks:{[e.name]:{$ref:`#/components/callbacks/${e.rawType}`}}};case"cookieParam":case"headerParam":case"pathParam":case"queryParam":return{parameters:[{description:e.description,in:c.tag.replace($,""),name:e.name,required:e.required,schema:e.schema}]};case"deprecated":return{deprecated:!0};case"description":case"operationId":case"summary":return{[c.tag]:n};case"externalDocs":return{externalDocs:{description:e.description,url:e.name}};case"paramComponent":return{parameters:[{$ref:`#/components/parameters/${e.rawType}`}]};case"response":return{responses:{[e.name]:{description:e.description}}};case"responseComponent":return{responses:{[e.name]:{$ref:`#/components/responses/${e.rawType}`}}};case"responseContent":{const[r,s]=e.name.split(".");return{responses:{[r]:{content:{[s]:{schema:e.schema}}}}}}case"responseExample":{const[r,s,a]=e.name.split(".");return{responses:{[r]:{content:{[s]:{examples:{[a]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}}case"responseHeader":{const[r,s]=e.name.split(".");return{responses:{[r]:{headers:{[s]:{description:e.description,schema:e.schema}}}}}}case"responseHeaderComponent":{const[r,s]=e.name.split(".");return{responses:{[r]:{headers:{[s]:{$ref:`#/components/headers/${e.rawType}`}}}}}}case"responseLink":{const[r,s]=e.name.split(".");return{responses:{[r]:{links:{[s]:{$ref:`#/components/links/${e.rawType}`}}}}}}case"security":{const[r,s]=e.name.split(".");let a=[];return s&&(a=[s]),{security:{[r]:a}}}case"server":return{servers:[{description:e.description,url:e.name}]};case"tag":return{tags:[n]};default:return{}}}),C=(t,o,c)=>(c??d(t,{spacing:"preserve"})).filter(e=>g.test(e.description.trim())).map(e=>{const n=e.tags.length+1,r={};for(const u of k(e.tags))l(r,u,y);h(r);const[s,a]=e.description.split(" "),p={[a.trim()]:{[s.toLowerCase().trim()]:{...r}}},i=JSON.parse(JSON.stringify({paths:p}));return{loc:n,spec:i}});export{C as default};
@@ -0,0 +1 @@
1
+ "use strict";const d=require("comment-parser"),l=require("es-toolkit"),y=require("./customizer-Bo8QD_ti.cjs"),b=/\[\]$/,f=/^- /u,g=/Param$/u,h=/^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \/.*$/,$=t=>{t.security&&(t.security=Object.keys(t.security).map(o=>({[o]:t.security[o]})))},T=new Set(["array","boolean","integer","number","object","string"]),m={binary:"string",byte:"string",date:"string","date-time":"string",double:"number",float:"number",int32:"integer",int64:"integer",password:"string"},w=t=>{const o=t.type,c=o.endsWith("[]"),e=o.replace(b,""),n=T.has(e),r=Object.keys(m).includes(e);let s;if(t.default)switch(e){case"double":case"float":case"number":{s=Number.parseFloat(t.default);break}case"int32":case"int64":case"integer":{s=Number.parseInt(t.default,10);break}default:{s=t.default;break}}let a;n?a={default:s,type:e}:r?a={default:s,format:e,type:m[e]}:a={$ref:`#/components/schemas/${e}`};let p=c?{items:{...a},type:"array"}:{...a};e===""&&(p=void 0);let i=t.description.trim().replace(f,"");return i===""&&(i=void 0),{description:i,name:t.name,rawType:o,required:!t.optional,schema:p}},q=(t,o)=>t.map(c=>{const e=w(c);let n="";switch(e.name&&(n+=e.name),e.description&&(n+=` ${e.description.trim()}`),c.tag){case"bodyComponent":return{requestBody:{$ref:`#/components/requestBodies/${e.rawType}`}};case"bodyContent":return{requestBody:{content:{[e.name.replaceAll(String.raw`*\/*`,"*/*")]:{schema:e.schema}}}};case"bodyDescription":return{requestBody:{description:n}};case"bodyExample":{const[r,s]=e.name.split(".");return{requestBody:{content:{[r]:{examples:{[s]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}case"bodyRequired":return{requestBody:{required:!0}};case"callback":return{callbacks:{[e.name]:{$ref:`#/components/callbacks/${e.rawType}`}}};case"cookieParam":case"headerParam":case"pathParam":case"queryParam":return{parameters:[{description:e.description,in:c.tag.replace(g,""),name:e.name,required:e.required,schema:e.schema}]};case"deprecated":return{deprecated:!0};case"description":case"operationId":case"summary":return{[c.tag]:n};case"externalDocs":return{externalDocs:{description:e.description,url:e.name}};case"paramComponent":return{parameters:[{$ref:`#/components/parameters/${e.rawType}`}]};case"response":return{responses:{[e.name]:{description:e.description}}};case"responseComponent":return{responses:{[e.name]:{$ref:`#/components/responses/${e.rawType}`}}};case"responseContent":{const[r,s]=e.name.split(".");return{responses:{[r]:{content:{[s]:{schema:e.schema}}}}}}case"responseExample":{const[r,s,a]=e.name.split(".");return{responses:{[r]:{content:{[s]:{examples:{[a]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}}case"responseHeader":{const[r,s]=e.name.split(".");return{responses:{[r]:{headers:{[s]:{description:e.description,schema:e.schema}}}}}}case"responseHeaderComponent":{const[r,s]=e.name.split(".");return{responses:{[r]:{headers:{[s]:{$ref:`#/components/headers/${e.rawType}`}}}}}}case"responseLink":{const[r,s]=e.name.split(".");return{responses:{[r]:{links:{[s]:{$ref:`#/components/links/${e.rawType}`}}}}}}case"security":{const[r,s]=e.name.split(".");let a=[];return s&&(a=[s]),{security:{[r]:a}}}case"server":return{servers:[{description:e.description,url:e.name}]};case"tag":return{tags:[n]};default:return{}}}),k=(t,o,c)=>(c??d.parse(t,{spacing:"preserve"})).filter(e=>h.test(e.description.trim())).map(e=>{const n=e.tags.length+1,r={};for(const u of q(e.tags))l.mergeWith(r,u,y.u);$(r);const[s,a]=e.description.split(" "),p={[a.trim()]:{[s.toLowerCase().trim()]:{...r}}},i=JSON.parse(JSON.stringify({paths:p}));return{loc:n,spec:i}});module.exports=k;
@@ -0,0 +1 @@
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};
@@ -0,0 +1 @@
1
+ "use strict";const r=require("node:fs"),s=require("node:path"),a=require("yaml"),o=e=>e&&typeof e=="object"&&"default"in e?e.default:e,i=o(s),u=o(a),c=e=>{const t=i.extname(e);if(t!==".yaml"&&t!==".yml"&&t!==".json")throw new Error("OpenAPI definition path must be YAML or JSON.");const n=r.readFileSync(e,{encoding:"utf8"});return t===".yaml"||t===".yml"?u.parse(n):JSON.parse(n)};module.exports=c;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const l=require("node:fs"),y=require("node:path"),m=require("comment-parser"),g=require("yaml"),_=require("./yamlLoc-DC_7PYVS.cjs"),u=e=>e&&typeof e=="object"&&"default"in e?e.default:e,f=u(y),b=u(g),i=new Set(["components","externalDocs","info","openapi","paths","security","servers","tags"]);class j extends Error{filePath}const p=new Set([".yaml",".yml"]),h=(e,s)=>{const n=b.parse(s);if(n===null||typeof n!="object")return[];const r=Object.keys(n).filter(t=>!i.has(t));if(r.length>0){const t=new j(`Unexpected keys: ${r.join(", ")}`);throw t.filePath=e,t}return Object.keys(n).some(t=>i.has(t))?[{loc:_(s),spec:n}]:[]},w=(e,s,n)=>{const r=l.readFileSync(e,{encoding:"utf8"}),t=f.extname(e);if(p.has(t))return h(e,r);try{return s(r,n)}catch(o){throw o.filePath=e,o}},P=(e,s,n)=>{const r=l.readFileSync(e,{encoding:"utf8"}),t=f.extname(e);if(p.has(t))return h(e,r);const o=m.parse(r,{spacing:"preserve"}),c=[];for(const d of s)try{c.push(...d(r,n,o))}catch(a){throw a.filePath=e,a}return c};exports.default=w;exports.parseFileMulti=P;
@@ -0,0 +1 @@
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.mjs";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};
@@ -0,0 +1,10 @@
1
+ import{parse as f}from"comment-parser";import{mergeWith as m}from"es-toolkit";import y from"yaml";import{u as l}from"./customizer-BXFVpImq.mjs";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))Object.keys(t[e]).forEach(r=>{s[e][r]=h(s[e][r],t[e][r])});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=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??f(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};
@@ -0,0 +1,10 @@
1
+ "use strict";const f=require("comment-parser"),g=require("es-toolkit"),l=require("yaml"),y=require("./customizer-Bo8QD_ti.cjs"),d=t=>t&&typeof t=="object"&&"default"in t?t.default:t,v=d(l),m=(t,s)=>{if(s===null)return t},u=(t,s)=>{const e=g.mergeWith({},t??{},m);return g.mergeWith(e,s??{},m)},w=t=>Object.keys(t).map(s=>t[s]).every(s=>typeof s=="object"&&Object.keys(s).every(e=>!(e in s))),h=(t,s)=>s.some(e=>t.name===e.name),E=t=>{switch(t.tag){case"asyncapi":return"v4";case"openapi":return"v3";case"swagger":return"v2";default:return"v2"}},O=(t,s,e)=>{if(e==="x-webhooks"&&(t[e]=s[e]),!e.startsWith("x-"))if(["components","consumes","produces","paths","schemas","securityDefinitions","responses","parameters","definitions","channels"].includes(e))Object.keys(s[e]).forEach(r=>{t[e][r]=u(t[e][r],s[e][r])});else if(e==="tags"){const{tags:r}=s;Array.isArray(r)?r.forEach(n=>{h(n,t.tags)||t.tags.push(n)}):h(r,t.tags)||t.tags.push(r)}else if(e==="security"){const{security:r}=s;t.security=r}else e.startsWith("/")&&(t.paths[e]=u(t.paths[e],s[e]))},S={v2:["paths","definitions","responses","parameters","securityDefinitions"],v3:["paths","definitions","responses","parameters","securityDefinitions","components"],v4:["components","channels"]},W=(t,s)=>t.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=v.parseDocument(n);if(a.errors.length>0){a.errors.forEach(c=>{c.annotation=n});let i="Error parsing YAML in @openapi spec:";throw i+=s?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 S[E(e)].forEach(i=>{o[i]=o[i]??{}}),Object.keys(p).forEach(i=>{O(o,p,i)}),o}return{}}),b=new Set(["asyncapi","openapi","swagger"]),j=(t,s,e)=>(e??f.parse(t,{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 W(r.tags,s))g.mergeWith(a,o,y.u);["definitions","responses","parameters","securityDefinitions","components","tags"].forEach(o=>{a[o]!==void 0&&w(a[o])&&delete a[o]});const p=JSON.parse(JSON.stringify(a));return{loc:n,spec:p}});module.exports=j;
@@ -0,0 +1 @@
1
+ import t from"@apidevtools/swagger-parser";const e=async a=>{await t.validate(a)};export{e as default};
@@ -0,0 +1 @@
1
+ "use strict";const a=require("@apidevtools/swagger-parser"),o=t=>t&&typeof t=="object"&&"default"in t?t.default:t,e=o(a),s=async t=>{await e.validate(t)};module.exports=s;
@@ -0,0 +1 @@
1
+ "use strict";const e=/\r\n|\r|\n/u,n=/^\s*(#\s*(?:\S.*)?)?$/u,r=t=>t.split(e).filter(s=>n.test(s)?!1:s.trim().length>0).length;module.exports=r;
@@ -0,0 +1 @@
1
+ const s=/\r\n|\r|\n/u,l=/^\s*(#\s*(?:\S.*)?)?$/u,n=e=>e.split(s).filter(t=>l.test(t)?!1:t.trim().length>0).length;export{n as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visulima/jsdoc-open-api",
3
- "version": "3.0.0-alpha.29",
3
+ "version": "3.0.0-alpha.30",
4
4
  "description": "Generates swagger doc based on JSDoc.",
5
5
  "keywords": [
6
6
  "api",
@@ -99,15 +99,15 @@
99
99
  ],
100
100
  "dependencies": {
101
101
  "@apidevtools/swagger-parser": "^12.1.0",
102
- "@visulima/fs": "5.0.0-alpha.31",
103
- "comment-parser": "1.4.6",
104
- "es-toolkit": "^1.46.1",
102
+ "@visulima/fs": "5.0.0-alpha.32",
103
+ "comment-parser": "1.4.7",
104
+ "es-toolkit": "^1.47.0",
105
105
  "yaml": "2.9.0"
106
106
  },
107
107
  "optionalDependencies": {
108
108
  "cli-progress": "^3.12.0",
109
- "commander": "^14.0.3",
110
- "webpack": "^5.106.2"
109
+ "commander": "^15.0.0",
110
+ "webpack": "^5.107.2"
111
111
  },
112
112
  "engines": {
113
113
  "node": "^22.14.0 || >=24.10.0"
@@ -1 +0,0 @@
1
- "use strict";var p=Object.defineProperty;var a=(s,e)=>p(s,"name",{value:e,configurable:!0});var h=Object.defineProperty,u=a((s,e)=>h(s,"name",{value:e,configurable:!0}),"s");const v=u((s,e)=>{Object.keys(e).forEach(r=>{s[r]===void 0?s[r]={...e[r]}:Object.keys(e[r]).forEach(t=>{s[r][t]={...s[r][t],...e[r][t]}})})},"objectMerge");var l=Object.defineProperty,f=a((s,e)=>l(s,"name",{value:e,configurable:!0}),"c");class b{static{a(this,"u")}static{f(this,"SpecBuilder")}components;externalDocs;info;openapi;paths;security;servers;tags;constructor(e){this.openapi=e.openapi,this.info=e.info,this.paths=e.paths??{},e.servers&&(this.servers=e.servers),e.components&&(this.components=e.components),e.security&&(this.security=e.security),e.tags&&(this.tags=e.tags),e.externalDocs&&(this.externalDocs=e.externalDocs)}addData(e){e.forEach(r=>{const{components:t,paths:c,...n}=r;v(this,{components:t??{},paths:c??{}}),Object.entries(n).forEach(([o,i])=>{this[o]=i})})}}module.exports=b;
@@ -1 +0,0 @@
1
- var p=Object.defineProperty;var t=(s,e)=>p(s,"name",{value:e,configurable:!0});var h=Object.defineProperty,u=t((s,e)=>h(s,"name",{value:e,configurable:!0}),"s");const l=u((s,e)=>{Object.keys(e).forEach(a=>{s[a]===void 0?s[a]={...e[a]}:Object.keys(e[a]).forEach(r=>{s[a][r]={...s[a][r],...e[a][r]}})})},"objectMerge");var v=Object.defineProperty,f=t((s,e)=>v(s,"name",{value:e,configurable:!0}),"c");class m{static{t(this,"u")}static{f(this,"SpecBuilder")}components;externalDocs;info;openapi;paths;security;servers;tags;constructor(e){this.openapi=e.openapi,this.info=e.info,this.paths=e.paths??{},e.servers&&(this.servers=e.servers),e.components&&(this.components=e.components),e.security&&(this.security=e.security),e.tags&&(this.tags=e.tags),e.externalDocs&&(this.externalDocs=e.externalDocs)}addData(e){e.forEach(a=>{const{components:r,paths:c,...n}=a;l(this,{components:r??{},paths:c??{}}),Object.entries(n).forEach(([o,i])=>{this[o]=i})})}}export{m as default};
@@ -1 +0,0 @@
1
- "use strict";var b=Object.defineProperty;var g=(e,s)=>b(e,"name",{value:s,configurable:!0});const d=require("node:fs/promises"),y=require("node:path"),u=require("node:process"),q=require("@visulima/fs"),m=require("./validate-tZa-jyuN.cjs"),D=require("./jsDocumentCommentsToOpenApi-CkXyEORi.cjs"),w=require("./parseFile-B7dCmwpU.cjs"),P=require("./SpecBuilder-CR4EZk93.cjs"),S=require("./swaggerJsDocumentCommentsToOpenApi-CPuUxW0D.cjs");var x=Object.defineProperty,f=g((e,s)=>x(e,"name",{value:s,configurable:!0}),"g");const j=f(e=>{e&&(console.error(e),u.exit(1))},"errorHandler");class O{static{g(this,"E")}static{f(this,"SwaggerCompilerPlugin")}assetsPath;ignore;sources;swaggerDefinition;verbose;constructor(s,t,h,i){this.assetsPath=s,this.swaggerDefinition=h,this.sources=t,this.verbose=i.verbose??!1,this.ignore=i.ignore??[]}apply(s){const t=new Set([...m.D,...this.ignore]);s.hooks.make.tapAsync("SwaggerCompilerPlugin",async(h,i)=>{console.log("Build paused, switching to swagger build");const r=new P(this.swaggerDefinition);for(const o of this.sources){const n=await q.collect(o,{extensions:[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],includeDirs:!1,skip:[...t]});this.verbose&&(console.log(`Found ${String(n.length)} files in ${o}`),console.log(n)),n.forEach(a=>{this.verbose&&console.log(`Parsing file ${a}`);try{const c=w(a,D,this.verbose);r.addData(c.map(l=>l.spec));const v=w(a,S,this.verbose);r.addData(v.map(l=>l.spec))}catch(c){console.error(c),u.exit(1)}})}try{this.verbose&&(console.log("Validating swagger spec"),console.log(JSON.stringify(r,void 0,2))),await m.r(structuredClone(r))}catch(o){console.error(o.toJSON()),u.exit(1)}const{assetsPath:p}=this;try{await d.mkdir(y.dirname(p),{recursive:!0}),await d.writeFile(p,JSON.stringify(r,void 0,2))}catch(o){j(o)}this.verbose&&console.log(`Written swagger spec to "${this.assetsPath}" file`),console.log("switching back to normal build"),i()})}}module.exports=O;
@@ -1 +0,0 @@
1
- var w=Object.defineProperty;var g=(s,o)=>w(s,"name",{value:o,configurable:!0});import{mkdir as v,writeFile as b}from"node:fs/promises";import{dirname as y}from"node:path";import{exit as m}from"node:process";import{collect as D}from"@visulima/fs";import{r as P,D as S}from"./validate-_k84qawx.mjs";import $ from"./jsDocumentCommentsToOpenApi-CsKVtvW4.mjs";import p from"./parseFile-C7DRmTDf.mjs";import j from"./SpecBuilder-DjnDJFpv.mjs";import k from"./swaggerJsDocumentCommentsToOpenApi-Dy8pOPTp.mjs";var x=Object.defineProperty,u=g((s,o)=>x(s,"name",{value:o,configurable:!0}),"g");const E=u(s=>{s&&(console.error(s),m(1))},"errorHandler");class T{static{g(this,"E")}static{u(this,"SwaggerCompilerPlugin")}assetsPath;ignore;sources;swaggerDefinition;verbose;constructor(o,i,h,r){this.assetsPath=o,this.swaggerDefinition=h,this.sources=i,this.verbose=r.verbose??!1,this.ignore=r.ignore??[]}apply(o){const i=new Set([...S,...this.ignore]);o.hooks.make.tapAsync("SwaggerCompilerPlugin",async(h,r)=>{console.log("Build paused, switching to swagger build");const t=new j(this.swaggerDefinition);for(const e of this.sources){const a=await D(e,{extensions:[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],includeDirs:!1,skip:[...i]});this.verbose&&(console.log(`Found ${String(a.length)} files in ${e}`),console.log(a)),a.forEach(n=>{this.verbose&&console.log(`Parsing file ${n}`);try{const c=p(n,$,this.verbose);t.addData(c.map(l=>l.spec));const d=p(n,k,this.verbose);t.addData(d.map(l=>l.spec))}catch(c){console.error(c),m(1)}})}try{this.verbose&&(console.log("Validating swagger spec"),console.log(JSON.stringify(t,void 0,2))),await P(structuredClone(t))}catch(e){console.error(e.toJSON()),m(1)}const{assetsPath:f}=this;try{await v(y(f),{recursive:!0}),await b(f,JSON.stringify(t,void 0,2))}catch(e){E(e)}this.verbose&&console.log(`Written swagger spec to "${this.assetsPath}" file`),console.log("switching back to normal build"),r()})}}export{T as default};
@@ -1 +0,0 @@
1
- var t=Object.defineProperty;var a=(r,e)=>t(r,"name",{value:e,configurable:!0});var o=Object.defineProperty,u=a((r,e)=>o(r,"name",{value:e,configurable:!0}),"u");const c=u((r,e)=>{if(Array.isArray(r))return[...r,...e]},"customizer");export{c as o};
@@ -1 +0,0 @@
1
- "use strict";var a=Object.defineProperty;var t=(r,e)=>a(r,"name",{value:e,configurable:!0});var u=Object.defineProperty,i=t((r,e)=>u(r,"name",{value:e,configurable:!0}),"u");const o=i((r,e)=>{if(Array.isArray(r))return[...r,...e]},"customizer");exports.o=o;
@@ -1,4 +0,0 @@
1
- "use strict";var x=Object.defineProperty;var w=(t,i)=>x(t,"name",{value:i,configurable:!0});const g=require("node:fs/promises"),v=require("node:path"),C=require("node:url"),O=require("@visulima/fs"),b=require("cli-progress"),y=require("./validate-tZa-jyuN.cjs"),h=require("./jsDocumentCommentsToOpenApi-CkXyEORi.cjs"),f=require("./parseFile-B7dCmwpU.cjs"),$=require("./SpecBuilder-CR4EZk93.cjs"),q=require("./swaggerJsDocumentCommentsToOpenApi-CPuUxW0D.cjs");var k=Object.defineProperty,F=w((t,i)=>k(t,"name",{value:i,configurable:!0}),"u");const P=F(async(t,i,e)=>{let s;try{let o=await import(C.pathToFileURL(v.normalize(e.config??t)).href);o?.default&&(o=o.default),s=o}catch{throw new Error(`No config file found, on: ${e.config??".openapirc.js"}
2
- `)}const p=new b.MultiBar({clearOnComplete:!1,format:"{value}/{total} | {bar} | {filename}",hideCursor:!0},b.Presets.shades_grey),r=new $(s.swaggerDefinition),D=new Set([...y.D,...s.exclude]);for(const o of i){const j=(await g.lstat(o)).isDirectory(),a=await g.realpath(o);if(!j){const n=f(a,h,e.verbose);r.addData(n.map(l=>l.spec));const d=f(a,q,e.verbose);r.addData(d.map(l=>l.spec));continue}const u=await O.collect(a,{extensions:s.extensions??[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],followSymlinks:s.followSymlinks??!1,match:s.include,skip:[...D]});(e.verbose??e.veryVerbose)&&console.log(`
3
- Found ${String(u.length)} files in ${a}`),e.veryVerbose&&console.log(u);const S=p.create(u.length,0);u.forEach(n=>{e.verbose&&console.log(`Parsing file ${n}`),S.increment(1,{filename:a});const d=f(n,h,e.verbose);r.addData(d.map(m=>m.spec));const l=f(n,q,e.verbose);r.addData(l.map(m=>m.spec))})}e.verbose&&console.log("Validating swagger spec"),e.veryVerbose&&console.log(JSON.stringify(r,void 0,2)),await y.r(structuredClone(r));const c=e.output??"swagger.json";p.stop(),e.verbose&&console.log(`Written swagger spec to "${c}" file`),await g.mkdir(v.dirname(c),{recursive:!0}),await g.writeFile(c,JSON.stringify(r,void 0,2)),console.log(`
4
- Swagger specification is ready, check the "${c}" file.`)},"generateCommand");module.exports=P;
@@ -1 +0,0 @@
1
- var p=Object.defineProperty;var t=(e,o)=>p(e,"name",{value:o,configurable:!0});import{exit as s}from"node:process";import c from"./generateCommand-DjMBmVdl.mjs";var u=Object.defineProperty,g=t((e,o)=>u(e,"name",{value:o,configurable:!0}),"t");const v=g((e,o="generate",r=".openapirc.js")=>{e.command(o).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("-d, --very-verbose","Very verbose output.").action(async(a,i)=>{try{await c(r,a,i)}catch(n){console.error(n),s(1)}})},"generateCommand");export{v as default};
@@ -1,4 +0,0 @@
1
- var D=Object.defineProperty;var u=(a,s)=>D(a,"name",{value:s,configurable:!0});import{lstat as $,realpath as j,mkdir as S,writeFile as x}from"node:fs/promises";import{normalize as k,dirname as C}from"node:path";import{pathToFileURL as E}from"node:url";import{collect as F}from"@visulima/fs";import{MultiBar as O,Presets as V}from"cli-progress";import{r as A,D as L}from"./validate-_k84qawx.mjs";import w from"./jsDocumentCommentsToOpenApi-CsKVtvW4.mjs";import f from"./parseFile-C7DRmTDf.mjs";import N from"./SpecBuilder-DjnDJFpv.mjs";import v from"./swaggerJsDocumentCommentsToOpenApi-Dy8pOPTp.mjs";var P=Object.defineProperty,U=u((a,s)=>P(a,"name",{value:s,configurable:!0}),"u");const H=U(async(a,s,e)=>{let t;try{let r=await import(E(k(e.config??a)).href);r?.default&&(r=r.default),t=r}catch{throw new Error(`No config file found, on: ${e.config??".openapirc.js"}
2
- `)}const d=new O({clearOnComplete:!1,format:"{value}/{total} | {bar} | {filename}",hideCursor:!0},V.shades_grey),o=new N(t.swaggerDefinition),b=new Set([...L,...t.exclude]);for(const r of s){const y=(await $(r)).isDirectory(),i=await j(r);if(!y){const n=f(i,w,e.verbose);o.addData(n.map(l=>l.spec));const g=f(i,v,e.verbose);o.addData(g.map(l=>l.spec));continue}const m=await F(i,{extensions:t.extensions??[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],followSymlinks:t.followSymlinks??!1,match:t.include,skip:[...b]});(e.verbose??e.veryVerbose)&&console.log(`
3
- Found ${String(m.length)} files in ${i}`),e.veryVerbose&&console.log(m);const h=d.create(m.length,0);m.forEach(n=>{e.verbose&&console.log(`Parsing file ${n}`),h.increment(1,{filename:i});const g=f(n,w,e.verbose);o.addData(g.map(p=>p.spec));const l=f(n,v,e.verbose);o.addData(l.map(p=>p.spec))})}e.verbose&&console.log("Validating swagger spec"),e.veryVerbose&&console.log(JSON.stringify(o,void 0,2)),await A(structuredClone(o));const c=e.output??"swagger.json";d.stop(),e.verbose&&console.log(`Written swagger spec to "${c}" file`),await S(C(c),{recursive:!0}),await x(c,JSON.stringify(o,void 0,2)),console.log(`
4
- Swagger specification is ready, check the "${c}" file.`)},"generateCommand");export{H as default};
@@ -1 +0,0 @@
1
- "use strict";var s=Object.defineProperty;var t=(e,o)=>s(e,"name",{value:o,configurable:!0});const p=require("node:process"),c=require("./generateCommand-C8cnfcN7.cjs");var u=Object.defineProperty,g=t((e,o)=>u(e,"name",{value:o,configurable:!0}),"t");const m=g((e,o="generate",r=".openapirc.js")=>{e.command(o).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("-d, --very-verbose","Very verbose output.").action(async(a,n)=>{try{await c(r,a,n)}catch(i){console.error(i),p.exit(1)}})},"generateCommand");module.exports=m;
@@ -1 +0,0 @@
1
- var a=Object.defineProperty;var o=(e,i)=>a(e,"name",{value:i,configurable:!0});import{exit as c}from"node:process";import m from"./initCommand-CwoPwelm.mjs";var p=Object.defineProperty,d=o((e,i)=>p(e,"name",{value:i,configurable:!0}),"m");const u=d((e,i="init",r="Inits a pre-configured @visulima/jsdoc-open-api config file.",t=".openapirc.js")=>{e.command(i).description(r).action(()=>{try{m(t)}catch(n){console.error(n),c(1)}})},"initCommand");export{u as default};
@@ -1 +0,0 @@
1
- "use strict";var c=Object.defineProperty;var r=(e,i)=>c(e,"name",{value:i,configurable:!0});const a=require("node:process"),s=require("./initCommand-CiV7G3q4.cjs");var d=Object.defineProperty,m=r((e,i)=>d(e,"name",{value:i,configurable:!0}),"m");const p=m((e,i="init",n="Inits a pre-configured @visulima/jsdoc-open-api config file.",o=".openapirc.js")=>{e.command(i).description(n).action(()=>{try{s(o)}catch(t){console.error(t),a.exit(1)}})},"initCommand");module.exports=p;
@@ -1 +0,0 @@
1
- "use strict";var l=Object.defineProperty;var u=(s,n)=>l(s,"name",{value:n,configurable:!0});const y=require("comment-parser"),b=require("es-toolkit"),f=require("./customizer-DUz3nxAJ.cjs");var g=Object.defineProperty,m=u((s,n)=>g(s,"name",{value:n,configurable:!0}),"p");const h=/\[\]$/,$=/^- /u,T=/Param$/u,q=/^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \/.*$/,w=m(s=>{s.security&&(s.security=Object.keys(s.security).map(n=>({[n]:s.security[n]})))},"fixSecurityObject"),k=new Set(["array","boolean","integer","number","object","string"]),d={binary:"string",byte:"string",date:"string","date-time":"string",double:"number",float:"number",int32:"integer",int64:"integer",password:"string"},O=m(s=>{const n=s.type,a=n.endsWith("[]"),e=n.replace(h,""),c=k.has(e),t=Object.keys(d).includes(e);let r;if(s.default)switch(e){case"double":case"float":case"number":{r=Number.parseFloat(s.default);break}case"int32":case"int64":case"integer":{r=Number.parseInt(s.default,10);break}default:{r=s.default;break}}let o;c?o={default:r,type:e}:t?o={default:r,format:e,type:d[e]}:o={$ref:`#/components/schemas/${e}`};let p=a?{items:{...o},type:"array"}:{...o};e===""&&(p=void 0);let i=s.description.trim().replace($,"");return i===""&&(i=void 0),{description:i,name:s.name,rawType:n,required:!s.optional,schema:p}},"parseDescription"),P=m((s,n)=>s.map(a=>{const e=O(a);let c="";switch(e.name&&(c+=e.name),e.description&&(c+=` ${e.description.trim()}`),a.tag){case"bodyComponent":return{requestBody:{$ref:`#/components/requestBodies/${e.rawType}`}};case"bodyContent":return{requestBody:{content:{[e.name.replaceAll("*\\/*","*/*")]:{schema:e.schema}}}};case"bodyDescription":return{requestBody:{description:c}};case"bodyExample":{const[t,r]=e.name.split(".");return{requestBody:{content:{[t]:{examples:{[r]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}case"bodyRequired":return{requestBody:{required:!0}};case"callback":return{callbacks:{[e.name]:{$ref:`#/components/callbacks/${e.rawType}`}}};case"cookieParam":case"headerParam":case"pathParam":case"queryParam":return{parameters:[{description:e.description,in:a.tag.replace(T,""),name:e.name,required:e.required,schema:e.schema}]};case"deprecated":return{deprecated:!0};case"description":case"operationId":case"summary":return{[a.tag]:c};case"externalDocs":return{externalDocs:{description:e.description,url:e.name}};case"paramComponent":return{parameters:[{$ref:`#/components/parameters/${e.rawType}`}]};case"response":return{responses:{[e.name]:{description:e.description}}};case"responseComponent":return{responses:{[e.name]:{$ref:`#/components/responses/${e.rawType}`}}};case"responseContent":{const[t,r]=e.name.split(".");return{responses:{[t]:{content:{[r]:{schema:e.schema}}}}}}case"responseExample":{const[t,r,o]=e.name.split(".");return{responses:{[t]:{content:{[r]:{examples:{[o]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}}case"responseHeader":{const[t,r]=e.name.split(".");return{responses:{[t]:{headers:{[r]:{description:e.description,schema:e.schema}}}}}}case"responseHeaderComponent":{const[t,r]=e.name.split(".");return{responses:{[t]:{headers:{[r]:{$ref:`#/components/headers/${e.rawType}`}}}}}}case"responseLink":{const[t,r]=e.name.split(".");return{responses:{[t]:{links:{[r]:{$ref:`#/components/links/${e.rawType}`}}}}}}case"security":{const[t,r]=e.name.split(".");let o=[];return r&&(o=[r]),{security:{[t]:o}}}case"server":return{servers:[{description:e.description,url:e.name}]};case"tag":return{tags:[c]};default:return{}}}),"tagsToObjects"),x=m((s,n)=>y.parse(s,{spacing:"preserve"}).filter(a=>q.test(a.description.trim())).map(a=>{const e=a.tags.length+1,c={};for(const i of P(a.tags,n))b.mergeWith(c,i,f.o);w(c);const[t,r]=a.description.split(" "),o={[r.trim()]:{[t.toLowerCase().trim()]:{...c}}},p=JSON.parse(JSON.stringify({paths:o}));return{loc:e,spec:p}}),"commentsToOpenApi");module.exports=x;
@@ -1 +0,0 @@
1
- var l=Object.defineProperty;var u=(s,n)=>l(s,"name",{value:n,configurable:!0});import{parse as y}from"comment-parser";import{mergeWith as f}from"es-toolkit";import{o as b}from"./customizer-COfd-Xr1.mjs";var g=Object.defineProperty,m=u((s,n)=>g(s,"name",{value:n,configurable:!0}),"p");const $=/\[\]$/,h=/^- /u,T=/Param$/u,w=/^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \/.*$/,k=m(s=>{s.security&&(s.security=Object.keys(s.security).map(n=>({[n]:s.security[n]})))},"fixSecurityObject"),q=new Set(["array","boolean","integer","number","object","string"]),d={binary:"string",byte:"string",date:"string","date-time":"string",double:"number",float:"number",int32:"integer",int64:"integer",password:"string"},O=m(s=>{const n=s.type,a=n.endsWith("[]"),e=n.replace($,""),c=q.has(e),t=Object.keys(d).includes(e);let r;if(s.default)switch(e){case"double":case"float":case"number":{r=Number.parseFloat(s.default);break}case"int32":case"int64":case"integer":{r=Number.parseInt(s.default,10);break}default:{r=s.default;break}}let o;c?o={default:r,type:e}:t?o={default:r,format:e,type:d[e]}:o={$ref:`#/components/schemas/${e}`};let p=a?{items:{...o},type:"array"}:{...o};e===""&&(p=void 0);let i=s.description.trim().replace(h,"");return i===""&&(i=void 0),{description:i,name:s.name,rawType:n,required:!s.optional,schema:p}},"parseDescription"),P=m((s,n)=>s.map(a=>{const e=O(a);let c="";switch(e.name&&(c+=e.name),e.description&&(c+=` ${e.description.trim()}`),a.tag){case"bodyComponent":return{requestBody:{$ref:`#/components/requestBodies/${e.rawType}`}};case"bodyContent":return{requestBody:{content:{[e.name.replaceAll("*\\/*","*/*")]:{schema:e.schema}}}};case"bodyDescription":return{requestBody:{description:c}};case"bodyExample":{const[t,r]=e.name.split(".");return{requestBody:{content:{[t]:{examples:{[r]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}case"bodyRequired":return{requestBody:{required:!0}};case"callback":return{callbacks:{[e.name]:{$ref:`#/components/callbacks/${e.rawType}`}}};case"cookieParam":case"headerParam":case"pathParam":case"queryParam":return{parameters:[{description:e.description,in:a.tag.replace(T,""),name:e.name,required:e.required,schema:e.schema}]};case"deprecated":return{deprecated:!0};case"description":case"operationId":case"summary":return{[a.tag]:c};case"externalDocs":return{externalDocs:{description:e.description,url:e.name}};case"paramComponent":return{parameters:[{$ref:`#/components/parameters/${e.rawType}`}]};case"response":return{responses:{[e.name]:{description:e.description}}};case"responseComponent":return{responses:{[e.name]:{$ref:`#/components/responses/${e.rawType}`}}};case"responseContent":{const[t,r]=e.name.split(".");return{responses:{[t]:{content:{[r]:{schema:e.schema}}}}}}case"responseExample":{const[t,r,o]=e.name.split(".");return{responses:{[t]:{content:{[r]:{examples:{[o]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}}case"responseHeader":{const[t,r]=e.name.split(".");return{responses:{[t]:{headers:{[r]:{description:e.description,schema:e.schema}}}}}}case"responseHeaderComponent":{const[t,r]=e.name.split(".");return{responses:{[t]:{headers:{[r]:{$ref:`#/components/headers/${e.rawType}`}}}}}}case"responseLink":{const[t,r]=e.name.split(".");return{responses:{[t]:{links:{[r]:{$ref:`#/components/links/${e.rawType}`}}}}}}case"security":{const[t,r]=e.name.split(".");let o=[];return r&&(o=[r]),{security:{[t]:o}}}case"server":return{servers:[{description:e.description,url:e.name}]};case"tag":return{tags:[c]};default:return{}}}),"tagsToObjects"),j=m((s,n)=>y(s,{spacing:"preserve"}).filter(a=>w.test(a.description.trim())).map(a=>{const e=a.tags.length+1,c={};for(const i of P(a.tags,n))f(c,i,b);k(c);const[t,r]=a.description.split(" "),o={[r.trim()]:{[t.toLowerCase().trim()]:{...c}}},p=JSON.parse(JSON.stringify({paths:o}));return{loc:e,spec:p}}),"commentsToOpenApi");export{j as default};
@@ -1 +0,0 @@
1
- "use strict";var p=Object.defineProperty;var n=(e,s)=>p(e,"name",{value:s,configurable:!0});const y=require("node:fs"),h=require("node:path"),d=require("yaml"),m=require("./yamlLoc-DyGcp8YC.cjs"),l=n(e=>e&&typeof e=="object"&&"default"in e?e.default:e,"_interopDefaultCompat"),b=l(h),j=l(d);var _=Object.defineProperty,f=n((e,s)=>_(e,"name",{value:s,configurable:!0}),"s");const i=new Set(["components","externalDocs","info","openapi","paths","security","servers","tags"]);class x extends Error{static{n(this,"h")}static{f(this,"ParseError")}filePath}const P=f((e,s,u)=>{const o=y.readFileSync(e,{encoding:"utf8"}),c=b.extname(e);if(c===".yaml"||c===".yml"){const t=j.parse(o);if(t===null||typeof t!="object")return[];const a=Object.keys(t).filter(r=>!i.has(r));if(a.length>0){const r=new x(`Unexpected keys: ${a.join(", ")}`);throw r.filePath=e,r}return Object.keys(t).some(r=>i.has(r))?[{loc:m(o),spec:t}]:[]}try{return s(o,u)}catch(t){throw t.filePath=e,t}},"parseFile");module.exports=P;
@@ -1 +0,0 @@
1
- var p=Object.defineProperty;var n=(e,o)=>p(e,"name",{value:o,configurable:!0});import{readFileSync as m}from"node:fs";import h from"node:path";import u from"yaml";import y from"./yamlLoc-C2tVIYaz.mjs";var d=Object.defineProperty,f=n((e,o)=>d(e,"name",{value:o,configurable:!0}),"s");const i=new Set(["components","externalDocs","info","openapi","paths","security","servers","tags"]);class b extends Error{static{n(this,"h")}static{f(this,"ParseError")}filePath}const w=f((e,o,l)=>{const s=m(e,{encoding:"utf8"}),a=h.extname(e);if(a===".yaml"||a===".yml"){const t=u.parse(s);if(t===null||typeof t!="object")return[];const c=Object.keys(t).filter(r=>!i.has(r));if(c.length>0){const r=new b(`Unexpected keys: ${c.join(", ")}`);throw r.filePath=e,r}return Object.keys(t).some(r=>i.has(r))?[{loc:y(s),spec:t}]:[]}try{return o(s,l)}catch(t){throw t.filePath=e,t}},"parseFile");export{w as default};
@@ -1,10 +0,0 @@
1
- "use strict";var d=Object.defineProperty;var p=(e,t)=>d(e,"name",{value:t,configurable:!0});const v=require("comment-parser"),u=require("es-toolkit"),b=require("yaml"),O=require("./customizer-DUz3nxAJ.cjs"),j=p(e=>e&&typeof e=="object"&&"default"in e?e.default:e,"_interopDefaultCompat"),S=j(b);var w=Object.defineProperty,g=p((e,t)=>w(e,"name",{value:t,configurable:!0}),"n$1");const f=g((e,t)=>{if(t===null)return e},"ignoreNullCustomizer"),h=g((e,t)=>{const r=u.mergeWith({},e??{},f);return u.mergeWith(r,t??{},f)},"mergeDeep"),E=g(e=>Object.keys(e).map(t=>e[t]).every(t=>typeof t=="object"&&Object.keys(t).every(r=>!(r in t))),"hasEmptyProperty"),l=g((e,t)=>t.some(r=>e.name===r.name),"isTagPresentInTags"),W=g(e=>{switch(e.tag){case"asyncapi":return"v4";case"openapi":return"v3";case"swagger":return"v2";default:return"v2"}},"getSwaggerVersionFromSpec");var D=Object.defineProperty,P=p((e,t)=>D(e,"name",{value:t,configurable:!0}),"e");const T=P((e,t,r)=>{if(r==="x-webhooks"&&(e[r]=t[r]),!r.startsWith("x-"))if(["components","consumes","produces","paths","schemas","securityDefinitions","responses","parameters","definitions","channels"].includes(r))Object.keys(t[r]).forEach(s=>{e[r][s]=h(e[r][s],t[r][s])});else if(r==="tags"){const{tags:s}=t;Array.isArray(s)?s.forEach(n=>{l(n,e.tags)||e.tags.push(n)}):l(s,e.tags)||e.tags.push(s)}else if(r==="security"){const{security:s}=t;e.security=s}else r.startsWith("/")&&(e.paths[r]=h(e.paths[r],t[r]))},"organizeSwaggerObject");var k=Object.defineProperty,y=p((e,t)=>k(e,"name",{value:t,configurable:!0}),"c");const A={v2:["paths","definitions","responses","parameters","securityDefinitions"],v3:["paths","definitions","responses","parameters","securityDefinitions","components"],v4:["components","channels"]},$=y((e,t)=>e.map(r=>{const s=r.description!==""||r.name.startsWith("/")||r.name.endsWith(":");if((r.tag==="openapi"||r.tag==="swagger"||r.tag==="asyncapi")&&s){let n=r.description;(r.name.startsWith("/")||r.name.endsWith(":"))&&(n=n.trim()===""?r.name:`${r.name}
2
- ${n}`);const o=S.parseDocument(n);if(o.errors.length>0){o.errors.forEach(c=>{c.annotation=n});let i="Error parsing YAML in @openapi spec:";throw i+=t?o.errors.map(c=>`${c.toString()}
3
- Imbedded within:
4
- \`\`\`
5
- ${c.annotation?.replaceAll(`
6
- `,`
7
- `)}
8
- \`\`\``).join(`
9
- `):o.errors.map(c=>c.toString()).join(`
10
- `),new Error(i)}const a=o.toJSON(),m={tags:[]};return A[W(r)].forEach(i=>{m[i]=m[i]??{}}),Object.keys(a).forEach(i=>{T(m,a,i)}),m}return{}}),"tagsToObjects"),q=y((e,t)=>v.parse(e,{spacing:"preserve"}).map(r=>{const s=r.tags.length+1,n={};for(const a of $(r.tags,t))u.mergeWith(n,a,O.o);["definitions","responses","parameters","securityDefinitions","components","tags"].forEach(a=>{n[a]!==void 0&&E(n[a])&&delete n[a]});const o=JSON.parse(JSON.stringify(n));return{loc:s,spec:o}}),"commentsToOpenApi");module.exports=q;
@@ -1,10 +0,0 @@
1
- var d=Object.defineProperty;var g=(r,t)=>d(r,"name",{value:t,configurable:!0});import{parse as v}from"comment-parser";import{mergeWith as u}from"es-toolkit";import b from"yaml";import{o as O}from"./customizer-COfd-Xr1.mjs";var j=Object.defineProperty,p=g((r,t)=>j(r,"name",{value:t,configurable:!0}),"n$1");const f=p((r,t)=>{if(t===null)return r},"ignoreNullCustomizer"),h=p((r,t)=>{const e=u({},r??{},f);return u(e,t??{},f)},"mergeDeep"),S=p(r=>Object.keys(r).map(t=>r[t]).every(t=>typeof t=="object"&&Object.keys(t).every(e=>!(e in t))),"hasEmptyProperty"),l=p((r,t)=>t.some(e=>r.name===e.name),"isTagPresentInTags"),w=p(r=>{switch(r.tag){case"asyncapi":return"v4";case"openapi":return"v3";case"swagger":return"v2";default:return"v2"}},"getSwaggerVersionFromSpec");var E=Object.defineProperty,D=g((r,t)=>E(r,"name",{value:t,configurable:!0}),"e");const P=D((r,t,e)=>{if(e==="x-webhooks"&&(r[e]=t[e]),!e.startsWith("x-"))if(["components","consumes","produces","paths","schemas","securityDefinitions","responses","parameters","definitions","channels"].includes(e))Object.keys(t[e]).forEach(n=>{r[e][n]=h(r[e][n],t[e][n])});else if(e==="tags"){const{tags:n}=t;Array.isArray(n)?n.forEach(s=>{l(s,r.tags)||r.tags.push(s)}):l(n,r.tags)||r.tags.push(n)}else if(e==="security"){const{security:n}=t;r.security=n}else e.startsWith("/")&&(r.paths[e]=h(r.paths[e],t[e]))},"organizeSwaggerObject");var W=Object.defineProperty,y=g((r,t)=>W(r,"name",{value:t,configurable:!0}),"c");const A={v2:["paths","definitions","responses","parameters","securityDefinitions"],v3:["paths","definitions","responses","parameters","securityDefinitions","components"],v4:["components","channels"]},T=y((r,t)=>r.map(e=>{const n=e.description!==""||e.name.startsWith("/")||e.name.endsWith(":");if((e.tag==="openapi"||e.tag==="swagger"||e.tag==="asyncapi")&&n){let s=e.description;(e.name.startsWith("/")||e.name.endsWith(":"))&&(s=s.trim()===""?e.name:`${e.name}
2
- ${s}`);const o=b.parseDocument(s);if(o.errors.length>0){o.errors.forEach(c=>{c.annotation=s});let i="Error parsing YAML in @openapi spec:";throw i+=t?o.errors.map(c=>`${c.toString()}
3
- Imbedded within:
4
- \`\`\`
5
- ${c.annotation?.replaceAll(`
6
- `,`
7
- `)}
8
- \`\`\``).join(`
9
- `):o.errors.map(c=>c.toString()).join(`
10
- `),new Error(i)}const a=o.toJSON(),m={tags:[]};return A[w(e)].forEach(i=>{m[i]=m[i]??{}}),Object.keys(a).forEach(i=>{P(m,a,i)}),m}return{}}),"tagsToObjects"),J=y((r,t)=>v(r,{spacing:"preserve"}).map(e=>{const n=e.tags.length+1,s={};for(const a of T(e.tags,t))u(s,a,O);["definitions","responses","parameters","securityDefinitions","components","tags"].forEach(a=>{s[a]!==void 0&&S(s[a])&&delete s[a]});const o=JSON.parse(JSON.stringify(s));return{loc:n,spec:o}}),"commentsToOpenApi");export{J as default};
@@ -1 +0,0 @@
1
- var t=Object.defineProperty;var e=(s,a)=>t(s,"name",{value:a,configurable:!0});import c from"@apidevtools/swagger-parser";const n=["coverage/**",".github/**","**/*.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-workspace,pnpm-lock}.yaml","**/{package,package-lock}.json","**/yarn.lock","**/package.json5","**/.next/**"];var o=Object.defineProperty,l=e((s,a)=>o(s,"name",{value:a,configurable:!0}),"a");const r=l(async s=>{await c.validate(s)},"validate");export{n as D,r};
@@ -1 +0,0 @@
1
- "use strict";var e=Object.defineProperty;var a=(s,t)=>e(s,"name",{value:t,configurable:!0});const c=require("@apidevtools/swagger-parser"),o=a(s=>s&&typeof s=="object"&&"default"in s?s.default:s,"_interopDefaultCompat"),l=o(c),n=["coverage/**",".github/**","**/*.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-workspace,pnpm-lock}.yaml","**/{package,package-lock}.json","**/yarn.lock","**/package.json5","**/.next/**"];var r=Object.defineProperty,j=a((s,t)=>r(s,"name",{value:t,configurable:!0}),"a");const m=j(async s=>{await l.validate(s)},"validate");exports.D=n;exports.r=m;
@@ -1 +0,0 @@
1
- var l=Object.defineProperty;var r=(t,e)=>l(t,"name",{value:e,configurable:!0});var a=Object.defineProperty,n=r((t,e)=>a(t,"name",{value:e,configurable:!0}),"n");const s=/\r\n|\r|\n/u,i=/^\s*(#\s*(?:\S.*)?)?$/u,u=n(t=>t.split(s).filter(e=>i.test(e)?!1:e.trim().length>0).length,"yamlLoc");export{u as default};
@@ -1 +0,0 @@
1
- "use strict";var s=Object.defineProperty;var r=(t,e)=>s(t,"name",{value:e,configurable:!0});var l=Object.defineProperty,n=r((t,e)=>l(t,"name",{value:e,configurable:!0}),"n");const a=/\r\n|\r|\n/u,i=/^\s*(#\s*(?:\S.*)?)?$/u,o=n(t=>t.split(a).filter(e=>i.test(e)?!1:e.trim().length>0).length,"yamlLoc");module.exports=o;