@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.
- package/CHANGELOG.md +23 -0
- package/README.md +44 -33
- package/dist/cli/commander/index.cjs +1 -1
- package/dist/cli/commander/index.d.cts +3 -3
- package/dist/cli/commander/index.d.mts +3 -3
- package/dist/cli/commander/index.d.ts +3 -3
- package/dist/cli/commander/index.mjs +1 -1
- package/dist/cli/index.cjs +1 -1
- package/dist/cli/index.d.cts +1 -0
- package/dist/cli/index.d.mts +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.mjs +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +24 -5
- package/dist/index.d.mts +24 -5
- package/dist/index.d.ts +24 -5
- package/dist/index.mjs +1 -1
- package/dist/packem_shared/DEFAULT_OPTIONS-C7o6qjwP.mjs +1 -0
- package/dist/packem_shared/DEFAULT_OPTIONS-CP1lNs-k.cjs +1 -0
- package/dist/packem_shared/SpecBuilder-C_KcIxW-.cjs +1 -0
- package/dist/packem_shared/SpecBuilder-Vbq42UbW.mjs +1 -0
- package/dist/packem_shared/SwaggerCompilerPlugin-Bd9L4Djt.cjs +1 -0
- package/dist/packem_shared/SwaggerCompilerPlugin-wRdVpHJS.mjs +1 -0
- package/dist/packem_shared/constants-CdEv9ZcD.mjs +1 -0
- package/dist/packem_shared/constants-DnbfJ7Id.cjs +1 -0
- package/dist/packem_shared/customizer-BXFVpImq.mjs +1 -0
- package/dist/packem_shared/customizer-Bo8QD_ti.cjs +1 -0
- package/dist/packem_shared/generateCommand-CEP0sWth.cjs +5 -0
- package/dist/packem_shared/generateCommand-CkcShFNr.mjs +5 -0
- package/dist/packem_shared/generateCommand-CmoN8jyY.cjs +1 -0
- package/dist/packem_shared/generateCommand-DEhmHbRZ.mjs +1 -0
- package/dist/packem_shared/initCommand-1O6IuWJv.mjs +1 -0
- package/dist/packem_shared/initCommand-C8s0kkim.cjs +1 -0
- package/dist/packem_shared/{initCommand-CiV7G3q4.cjs → initCommand-Ca1hGdYS.mjs} +2 -2
- package/dist/packem_shared/{initCommand-CwoPwelm.mjs → initCommand-DvNH61Z4.cjs} +2 -2
- package/dist/packem_shared/jsDocumentCommentsToOpenApi-BEQrWgpQ.mjs +1 -0
- package/dist/packem_shared/jsDocumentCommentsToOpenApi-CMbdb0uR.cjs +1 -0
- package/dist/packem_shared/loadDefinition-7r9qpfuE.mjs +1 -0
- package/dist/packem_shared/loadDefinition-ah20Zy-G.cjs +1 -0
- package/dist/packem_shared/parseFile-CPb-Kglh.cjs +1 -0
- package/dist/packem_shared/parseFile-Wxs3O0wy.mjs +1 -0
- package/dist/packem_shared/swaggerJsDocumentCommentsToOpenApi-BnPWbZoe.mjs +10 -0
- package/dist/packem_shared/swaggerJsDocumentCommentsToOpenApi-rMEaS4lg.cjs +10 -0
- package/dist/packem_shared/validate-9Rwe2A3r.mjs +1 -0
- package/dist/packem_shared/validate-DLmCjOPl.cjs +1 -0
- package/dist/packem_shared/yamlLoc-DC_7PYVS.cjs +1 -0
- package/dist/packem_shared/yamlLoc-DPq-xUM4.mjs +1 -0
- package/package.json +6 -6
- package/dist/packem_shared/SpecBuilder-CR4EZk93.cjs +0 -1
- package/dist/packem_shared/SpecBuilder-DjnDJFpv.mjs +0 -1
- package/dist/packem_shared/SwaggerCompilerPlugin-Dz_h2XB7.cjs +0 -1
- package/dist/packem_shared/SwaggerCompilerPlugin-HasoKKtw.mjs +0 -1
- package/dist/packem_shared/customizer-COfd-Xr1.mjs +0 -1
- package/dist/packem_shared/customizer-DUz3nxAJ.cjs +0 -1
- package/dist/packem_shared/generateCommand-C8cnfcN7.cjs +0 -4
- package/dist/packem_shared/generateCommand-CsPJY2UQ.mjs +0 -1
- package/dist/packem_shared/generateCommand-DjMBmVdl.mjs +0 -4
- package/dist/packem_shared/generateCommand-Djp2aFKo.cjs +0 -1
- package/dist/packem_shared/initCommand-Bm4veOwd.mjs +0 -1
- package/dist/packem_shared/initCommand-DAcI_ilX.cjs +0 -1
- package/dist/packem_shared/jsDocumentCommentsToOpenApi-CkXyEORi.cjs +0 -1
- package/dist/packem_shared/jsDocumentCommentsToOpenApi-CsKVtvW4.mjs +0 -1
- package/dist/packem_shared/parseFile-B7dCmwpU.cjs +0 -1
- package/dist/packem_shared/parseFile-C7DRmTDf.mjs +0 -1
- package/dist/packem_shared/swaggerJsDocumentCommentsToOpenApi-CPuUxW0D.cjs +0 -10
- package/dist/packem_shared/swaggerJsDocumentCommentsToOpenApi-Dy8pOPTp.mjs +0 -10
- package/dist/packem_shared/validate-_k84qawx.mjs +0 -1
- package/dist/packem_shared/validate-tZa-jyuN.cjs +0 -1
- package/dist/packem_shared/yamlLoc-C2tVIYaz.mjs +0 -1
- 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 -
|
|
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
|
-
- `-
|
|
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
|
-
-
|
|
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
|
|
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
|
-
|
|
168
|
-
const __dirname = path.dirname(__filename);
|
|
187
|
+
import { SpecBuilder, parseFileMulti, jsDocumentCommentsToOpenApi, swaggerJsDocumentCommentsToOpenApi, validate } from "@visulima/jsdoc-open-api";
|
|
169
188
|
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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
|
-
|
|
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-
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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-
|
|
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};
|
package/dist/cli/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("../packem_shared/generateCommand-
|
|
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;
|
package/dist/cli/index.d.cts
CHANGED
package/dist/cli/index.d.mts
CHANGED
package/dist/cli/index.d.ts
CHANGED
package/dist/cli/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{default as m}from"../packem_shared/generateCommand-
|
|
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
|
|
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
|
|
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
|
-
}[]
|
|
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
|
|
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
|
-
}[]
|
|
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
|
|
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
|
-
}[]
|
|
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
|
|
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
|
-
|
|
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}"`)}
|
|
35
|
+
`),console.log(`Created "${e}"`)};export{j as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
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}"`)}
|
|
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.
|
|
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.
|
|
103
|
-
"comment-parser": "1.4.
|
|
104
|
-
"es-toolkit": "^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": "^
|
|
110
|
-
"webpack": "^5.
|
|
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;
|