@visulima/jsdoc-open-api 2.0.63 → 2.0.65
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 +28 -0
- package/LICENSE.md +27 -0
- package/README.md +4 -4
- package/dist/chunk-GOBAMJAM.mjs +2 -14
- package/dist/chunk-GOBAMJAM.mjs.map +1 -1
- package/dist/chunk-KZEWPZ7N.js +2 -21
- package/dist/chunk-KZEWPZ7N.js.map +1 -1
- package/dist/chunk-LIBKIIBP.mjs +2 -12
- package/dist/chunk-LIBKIIBP.mjs.map +1 -1
- package/dist/chunk-TYWUYJHV.js +2 -27
- package/dist/chunk-TYWUYJHV.js.map +1 -1
- package/dist/cli/commander/index.js +1 -11
- package/dist/cli/commander/index.js.map +1 -1
- package/dist/cli/commander/index.mjs +1 -8
- package/dist/cli/commander/index.mjs.map +1 -1
- package/dist/cli/index.js +1 -16
- package/dist/cli/index.mjs +1 -3
- package/dist/index.js +1 -32
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -11
- package/dist/index.mjs.map +1 -1
- package/package.json +14 -14
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,31 @@
|
|
|
1
|
+
## @visulima/jsdoc-open-api [2.0.65](https://github.com/visulima/visulima/compare/@visulima/jsdoc-open-api@2.0.64...@visulima/jsdoc-open-api@2.0.65) (2024-12-12)
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
|
|
5
|
+
* added missing placeholder variables into LICENSE.md file ([cef32c6](https://github.com/visulima/visulima/commit/cef32c6eb19dc3215a835e848ef12223a8fa05e0))
|
|
6
|
+
* allow node v23 ([8ca929a](https://github.com/visulima/visulima/commit/8ca929af311ce8036cbbfde68b6db05381b860a5))
|
|
7
|
+
* **jsdoc-open-api:** updated yaml to v2.6.1, updated dev-deps, add v23 node support ([93096d2](https://github.com/visulima/visulima/commit/93096d2857fe59603d39f61f38cb5cce5aa37622))
|
|
8
|
+
|
|
9
|
+
### Styles
|
|
10
|
+
|
|
11
|
+
* cs fixes ([46d31e0](https://github.com/visulima/visulima/commit/46d31e082e1865262bf380859c14fabd28ff456d))
|
|
12
|
+
|
|
13
|
+
### Miscellaneous Chores
|
|
14
|
+
|
|
15
|
+
* updated dev dependencies ([a916944](https://github.com/visulima/visulima/commit/a916944b888bb34c34b0c54328b38d29e4399857))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Dependencies
|
|
19
|
+
|
|
20
|
+
* **@visulima/fs:** upgraded to 2.3.1
|
|
21
|
+
|
|
22
|
+
## @visulima/jsdoc-open-api [2.0.64](https://github.com/visulima/visulima/compare/@visulima/jsdoc-open-api@2.0.63...@visulima/jsdoc-open-api@2.0.64) (2024-10-25)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
### Dependencies
|
|
26
|
+
|
|
27
|
+
* **@visulima/fs:** upgraded to 2.3.0
|
|
28
|
+
|
|
1
29
|
## @visulima/jsdoc-open-api [2.0.63](https://github.com/visulima/visulima/compare/@visulima/jsdoc-open-api@2.0.62...@visulima/jsdoc-open-api@2.0.63) (2024-10-05)
|
|
2
30
|
|
|
3
31
|
|
package/LICENSE.md
CHANGED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 visulima
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
<!-- DEPENDENCIES -->
|
|
24
|
+
<!-- /DEPENDENCIES -->
|
|
25
|
+
|
|
26
|
+
<!-- TYPE_DEPENDENCIES -->
|
|
27
|
+
<!-- /TYPE_DEPENDENCIES -->
|
package/README.md
CHANGED
|
@@ -330,10 +330,10 @@ components:
|
|
|
330
330
|
|
|
331
331
|
Supported authentication methods are:
|
|
332
332
|
|
|
333
|
-
-
|
|
334
|
-
-
|
|
335
|
-
-
|
|
336
|
-
-
|
|
333
|
+
- HTTP authentication: Basic, Bearer, and so on.
|
|
334
|
+
- API key as a header or query parameter or in cookies
|
|
335
|
+
- OAuth 2
|
|
336
|
+
- OpenID Connect Discovery
|
|
337
337
|
|
|
338
338
|
For more information, see [Authentication](/docs/short/authentication.md).
|
|
339
339
|
|
package/dist/chunk-GOBAMJAM.mjs
CHANGED
|
@@ -1,13 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { lstat, realpath, mkdir, writeFile } from 'node:fs/promises';
|
|
3
|
-
import { normalize, dirname } from 'node:path';
|
|
4
|
-
import { pathToFileURL } from 'node:url';
|
|
5
|
-
import { collect } from '@visulima/fs';
|
|
6
|
-
import { MultiBar, Presets } from 'cli-progress';
|
|
7
|
-
import { existsSync, realpathSync, writeFileSync } from 'node:fs';
|
|
8
|
-
import N from 'read-pkg-up';
|
|
9
|
-
|
|
10
|
-
var B=async(i,l,e$1)=>{let o={exclude:[],swaggerDefinition:{}};try{let t=await import(pathToFileURL(normalize(e$1.config??i)).href);t?.default&&(t=t.default),o=t;}catch{throw new Error(`No config file found, on: ${e$1.config??".openapirc.js"}
|
|
1
|
+
import {d,f,c,a,e,g}from'./chunk-LIBKIIBP.mjs';import {lstat,realpath,mkdir,writeFile}from'node:fs/promises';import {normalize,dirname}from'node:path';import {pathToFileURL}from'node:url';import {collect}from'@visulima/fs';import {MultiBar,Presets}from'cli-progress';import {existsSync,realpathSync,writeFileSync}from'node:fs';import N from'read-pkg-up';var B=async(i,l,e$1)=>{let o={exclude:[],swaggerDefinition:{}};try{let t=await import(pathToFileURL(normalize(e$1.config??i)).href);t?.default&&(t=t.default),o=t;}catch{throw new Error(`No config file found, on: ${e$1.config??".openapirc.js"}
|
|
11
2
|
`)}let r=new MultiBar({clearOnComplete:!1,format:"{value}/{total} | {bar} | {filename}",hideCursor:!0},Presets.shades_grey),s=new d(o.swaggerDefinition),k=new Set([...f,...o.exclude]);for await(let t of l){(await lstat(t)).isDirectory();let c$1=await realpath(t),n=await collect(c$1,{extensions:o.extensions??[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],followSymlinks:o.followSymlinks??!1,match:o.include,skip:[...k]});(e$1.verbose??e$1.veryVerbose)&&console.log(`
|
|
12
3
|
Found ${n.length} files in ${c$1}`),e$1.veryVerbose&&console.log(n);let j=r.create(n.length,0);n.forEach(m=>{e$1.verbose&&console.log(`Parsing file ${m}`),j.increment(1,{filename:c$1});let x=c(m,a,e$1.verbose);s.addData(x.map(f=>f.spec));let b=c(m,e,e$1.verbose);s.addData(b.map(f=>f.spec));});}e$1.verbose&&console.log("Validating swagger spec"),e$1.veryVerbose&&console.log(JSON.stringify(s,null,2)),await g(JSON.parse(JSON.stringify(s)));let a$1=e$1.output??"swagger.json";r.stop(),e$1.verbose&&console.log(`Written swagger spec to "${a$1}" file`),await mkdir(dirname(a$1),{recursive:!0}),await writeFile(a$1,JSON.stringify(s,null,2)),console.log(`
|
|
13
4
|
Swagger specification is ready, check the "${a$1}" file.`);},Q=B;var R=(i,l=process.cwd())=>{if(existsSync(i))throw new Error("Config file already exists");let e=N.sync({cwd:realpathSync(l)}),o="module.exports =";if(e){let{packageJson:r,path:s}=e;console.info(`Found package.json at "${s}"`),r.type==="module"&&(console.info("Found package.json with type: module, using ES6 as export for the config file"),o="export default");}else console.info("No package.json found");writeFileSync(i,`${o} {
|
|
@@ -44,8 +35,5 @@ Swagger specification is ready, check the "${a$1}" file.`);},Q=B;var R=(i,l=proc
|
|
|
44
35
|
},
|
|
45
36
|
},
|
|
46
37
|
};
|
|
47
|
-
`),console.log(`Created "${i}"`);},se=R;
|
|
48
|
-
|
|
49
|
-
export { Q as a, se as b };
|
|
50
|
-
//# sourceMappingURL=chunk-GOBAMJAM.mjs.map
|
|
38
|
+
`),console.log(`Created "${i}"`);},se=R;export{Q as a,se as b};//# sourceMappingURL=chunk-GOBAMJAM.mjs.map
|
|
51
39
|
//# sourceMappingURL=chunk-GOBAMJAM.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/command/generate-command.ts","../src/cli/command/init-command.ts"],"names":["generateCommand","configName","paths","options","openapiConfig","config","pathToFileURL","normalize","multibar","MultiBar","Presets","spec","spec_builder_default","skip","DEFAULT_EXCLUDE","dir","lstat","realDirectory","realpath","files","collect","bar","file","parsedJsDocumentFile","parse_file_default","comments_to_open_api_default","item","parsedSwaggerJsDocumentFile","validate_default","output","mkdir","dirname","writeFile","generate_command_default","initCommand","packageJsonPath","existsSync","foundPackageJson","readPkgUp","realpathSync","exportTemplate","package_","packagePath","writeFileSync","init_command_default"],"mappings":"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","file":"chunk-GOBAMJAM.mjs","sourcesContent":["import { lstat, mkdir, realpath, writeFile } from \"node:fs/promises\";\nimport { dirname, normalize } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type { WalkOptions } from \"@visulima/fs\";\nimport { collect } from \"@visulima/fs\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { MultiBar, Presets } from \"cli-progress\";\n\nimport { DEFAULT_EXCLUDE } from \"../../constants\";\nimport type { BaseDefinition } from \"../../exported\";\nimport jsDocumentCommentsToOpenApi from \"../../jsdoc/comments-to-open-api\";\nimport parseFile from \"../../parse-file\";\nimport SpecBuilder from \"../../spec-builder\";\nimport swaggerJsDocumentCommentsToOpenApi from \"../../swagger-jsdoc/comments-to-open-api\";\nimport validate from \"../../validate\";\n\nconst generateCommand = async (\n configName: string,\n paths: string[],\n options: {\n config?: string;\n output?: string;\n verbose?: boolean;\n veryVerbose?: boolean;\n },\n // eslint-disable-next-line sonarjs/cognitive-complexity\n): Promise<void> => {\n let openapiConfig: {\n exclude: string[];\n extensions?: string[];\n followSymlinks?: boolean;\n include?: (RegExp | string)[];\n swaggerDefinition: BaseDefinition;\n } = {\n exclude: [],\n swaggerDefinition: {} as BaseDefinition,\n };\n\n try {\n let config = await import(pathToFileURL(normalize(options.config ?? configName)).href);\n\n if (config?.default) {\n config = config.default;\n }\n\n openapiConfig = config;\n } catch {\n throw new Error(`No config file found, on: ${options.config ?? \".openapirc.js\"}\\n`);\n }\n\n const multibar = new MultiBar(\n {\n clearOnComplete: false,\n format: \"{value}/{total} | {bar} | {filename}\",\n hideCursor: true,\n },\n Presets.shades_grey,\n );\n\n const spec = new SpecBuilder(openapiConfig.swaggerDefinition);\n const skip = new Set<RegExp | string>([...DEFAULT_EXCLUDE, ...openapiConfig.exclude]);\n\n // eslint-disable-next-line no-restricted-syntax,unicorn/prevent-abbreviations,no-loops/no-loops\n for await (const dir of paths) {\n // Check if the path is a directory\n // eslint-disable-next-line security/detect-non-literal-fs-filename,unicorn/no-await-expression-member\n (await lstat(dir)).isDirectory();\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n const realDirectory = await realpath(dir);\n\n const files = await collect(realDirectory, {\n extensions: openapiConfig.extensions ?? [\".js\", \".cjs\", \".mjs\", \".ts\", \".tsx\", \".jsx\", \".yaml\", \".yml\"],\n followSymlinks: openapiConfig.followSymlinks ?? false,\n match: openapiConfig.include,\n skip: [...skip],\n } as WalkOptions);\n\n if (options.verbose ?? options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(`\\nFound ${files.length} files in ${realDirectory}`);\n }\n\n if (options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(files);\n }\n\n const bar = multibar.create(files.length, 0);\n\n files.forEach((file) => {\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Parsing file ${file}`);\n }\n\n bar.increment(1, { filename: realDirectory });\n\n const parsedJsDocumentFile = parseFile(file, jsDocumentCommentsToOpenApi, options.verbose);\n\n spec.addData(parsedJsDocumentFile.map((item) => item.spec));\n\n const parsedSwaggerJsDocumentFile = parseFile(file, swaggerJsDocumentCommentsToOpenApi, options.verbose);\n\n spec.addData(parsedSwaggerJsDocumentFile.map((item) => item.spec));\n });\n }\n\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(\"Validating swagger spec\");\n }\n\n if (options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(spec, null, 2));\n }\n\n await validate(JSON.parse(JSON.stringify(spec)) as Record<string, unknown>);\n\n const output = options.output ?? \"swagger.json\";\n\n multibar.stop();\n\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Written swagger spec to \"${output}\" file`);\n }\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n await mkdir(dirname(output), { recursive: true });\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n await writeFile(output, JSON.stringify(spec, null, 2));\n\n // eslint-disable-next-line no-console\n console.log(`\\nSwagger specification is ready, check the \"${output}\" file.`);\n};\n\nexport default generateCommand;\n","import { existsSync, realpathSync, writeFileSync } from \"node:fs\";\n\nimport readPkgUp from \"read-pkg-up\";\n\nconst initCommand = (configName: string, packageJsonPath = process.cwd()): void => {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n if (existsSync(configName)) {\n throw new Error(\"Config file already exists\");\n }\n\n const foundPackageJson = readPkgUp.sync({\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n cwd: realpathSync(packageJsonPath),\n });\n\n let exportTemplate = \"module.exports =\";\n\n if (foundPackageJson) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { packageJson: package_, path: packagePath } = foundPackageJson;\n\n // eslint-disable-next-line no-console\n console.info(`Found package.json at \"${packagePath}\"`);\n\n if (package_.type === \"module\") {\n // eslint-disable-next-line no-console\n console.info(\"Found package.json with type: module, using ES6 as export for the config file\");\n\n exportTemplate = \"export default\";\n }\n } else {\n // eslint-disable-next-line no-console\n console.info(\"No package.json found\");\n }\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n writeFileSync(\n configName,\n `${exportTemplate} {\n exclude: [\n 'coverage/**',\n '.github/**',\n 'packages/*/test{,s}/**',\n '**/*.d.ts',\n 'test{,s}/**',\n 'test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}',\n '**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}',\n '**/__tests__/**',\n '**/{ava,babel,nyc}.config.{js,cjs,mjs}',\n '**/jest.config.{js,cjs,mjs,ts}',\n '**/{karma,rollup,webpack}.config.js',\n '**/.{eslint,mocha}rc.{js,cjs}',\n '**/.{travis,yarnrc}.yml',\n '**/{docker-compose,docker}.yml',\n '**/.yamllint.{yaml,yml}',\n '**/node_modules/**',\n '**/pnpm-lock.yaml',\n '**/pnpm-workspace.yaml',\n '**/{package,package-lock}.json',\n '**/yarn.lock',\n '**/package.json5',\n '**/.next/**',\n ],\n followSymlinks: false,\n swaggerDefinition: {\n openapi: '3.0.0',\n info: {\n title: 'API',\n version: '1.0.0',\n },\n },\n};\n`,\n );\n\n // eslint-disable-next-line no-console\n console.log(`Created \"${configName}\"`);\n};\n\nexport default initCommand;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/command/generate-command.ts","../src/cli/command/init-command.ts"],"names":["generateCommand","configName","paths","options","openapiConfig","config","pathToFileURL","normalize","multibar","MultiBar","Presets","spec","spec_builder_default","skip","DEFAULT_EXCLUDE","dir","lstat","realDirectory","realpath","files","collect","bar","file","parsedJsDocumentFile","parse_file_default","comments_to_open_api_default","item","parsedSwaggerJsDocumentFile","validate_default","output","mkdir","dirname","writeFile","generate_command_default","initCommand","packageJsonPath","existsSync","foundPackageJson","readPkgUp","realpathSync","exportTemplate","package_","packagePath","writeFileSync","init_command_default"],"mappings":"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","file":"chunk-GOBAMJAM.mjs","sourcesContent":["import { lstat, mkdir, realpath, writeFile } from \"node:fs/promises\";\nimport { dirname, normalize } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type { WalkOptions } from \"@visulima/fs\";\nimport { collect } from \"@visulima/fs\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { MultiBar, Presets } from \"cli-progress\";\n\nimport { DEFAULT_EXCLUDE } from \"../../constants\";\nimport type { BaseDefinition } from \"../../exported\";\nimport jsDocumentCommentsToOpenApi from \"../../jsdoc/comments-to-open-api\";\nimport parseFile from \"../../parse-file\";\nimport SpecBuilder from \"../../spec-builder\";\nimport swaggerJsDocumentCommentsToOpenApi from \"../../swagger-jsdoc/comments-to-open-api\";\nimport validate from \"../../validate\";\n\nconst generateCommand = async (\n configName: string,\n paths: string[],\n options: {\n config?: string;\n output?: string;\n verbose?: boolean;\n veryVerbose?: boolean;\n },\n // eslint-disable-next-line sonarjs/cognitive-complexity\n): Promise<void> => {\n let openapiConfig: {\n exclude: string[];\n extensions?: string[];\n followSymlinks?: boolean;\n include?: (RegExp | string)[];\n swaggerDefinition: BaseDefinition;\n } = {\n exclude: [],\n swaggerDefinition: {} as BaseDefinition,\n };\n\n try {\n let config = await import(pathToFileURL(normalize(options.config ?? configName)).href);\n\n if (config?.default) {\n config = config.default;\n }\n\n openapiConfig = config;\n } catch {\n throw new Error(`No config file found, on: ${options.config ?? \".openapirc.js\"}\\n`);\n }\n\n const multibar = new MultiBar(\n {\n clearOnComplete: false,\n format: \"{value}/{total} | {bar} | {filename}\",\n hideCursor: true,\n },\n Presets.shades_grey,\n );\n\n const spec = new SpecBuilder(openapiConfig.swaggerDefinition);\n const skip = new Set<RegExp | string>([...DEFAULT_EXCLUDE, ...openapiConfig.exclude]);\n\n // eslint-disable-next-line no-restricted-syntax,unicorn/prevent-abbreviations,no-loops/no-loops\n for await (const dir of paths) {\n // Check if the path is a directory\n // eslint-disable-next-line security/detect-non-literal-fs-filename,unicorn/no-await-expression-member\n (await lstat(dir)).isDirectory();\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n const realDirectory = await realpath(dir);\n\n const files = await collect(realDirectory, {\n extensions: openapiConfig.extensions ?? [\".js\", \".cjs\", \".mjs\", \".ts\", \".tsx\", \".jsx\", \".yaml\", \".yml\"],\n followSymlinks: openapiConfig.followSymlinks ?? false,\n match: openapiConfig.include,\n skip: [...skip],\n } as WalkOptions);\n\n if (options.verbose ?? options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(`\\nFound ${files.length} files in ${realDirectory}`);\n }\n\n if (options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(files);\n }\n\n const bar = multibar.create(files.length, 0);\n\n files.forEach((file) => {\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Parsing file ${file}`);\n }\n\n bar.increment(1, { filename: realDirectory });\n\n const parsedJsDocumentFile = parseFile(file, jsDocumentCommentsToOpenApi, options.verbose);\n\n spec.addData(parsedJsDocumentFile.map((item) => item.spec));\n\n const parsedSwaggerJsDocumentFile = parseFile(file, swaggerJsDocumentCommentsToOpenApi, options.verbose);\n\n spec.addData(parsedSwaggerJsDocumentFile.map((item) => item.spec));\n });\n }\n\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(\"Validating swagger spec\");\n }\n\n if (options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(spec, null, 2));\n }\n\n await validate(JSON.parse(JSON.stringify(spec)) as Record<string, unknown>);\n\n const output = options.output ?? \"swagger.json\";\n\n multibar.stop();\n\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Written swagger spec to \"${output}\" file`);\n }\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n await mkdir(dirname(output), { recursive: true });\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n await writeFile(output, JSON.stringify(spec, null, 2));\n\n // eslint-disable-next-line no-console\n console.log(`\\nSwagger specification is ready, check the \"${output}\" file.`);\n};\n\nexport default generateCommand;\n","import { existsSync, realpathSync, writeFileSync } from \"node:fs\";\n\nimport readPkgUp from \"read-pkg-up\";\n\nconst initCommand = (configName: string, packageJsonPath = process.cwd()): void => {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n if (existsSync(configName)) {\n throw new Error(\"Config file already exists\");\n }\n\n const foundPackageJson = readPkgUp.sync({\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n cwd: realpathSync(packageJsonPath),\n });\n\n let exportTemplate = \"module.exports =\";\n\n if (foundPackageJson) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { packageJson: package_, path: packagePath } = foundPackageJson;\n\n // eslint-disable-next-line no-console\n console.info(`Found package.json at \"${packagePath}\"`);\n\n if (package_.type === \"module\") {\n // eslint-disable-next-line no-console\n console.info(\"Found package.json with type: module, using ES6 as export for the config file\");\n\n exportTemplate = \"export default\";\n }\n } else {\n // eslint-disable-next-line no-console\n console.info(\"No package.json found\");\n }\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n writeFileSync(\n configName,\n `${exportTemplate} {\n exclude: [\n 'coverage/**',\n '.github/**',\n 'packages/*/test{,s}/**',\n '**/*.d.ts',\n 'test{,s}/**',\n 'test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}',\n '**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}',\n '**/__tests__/**',\n '**/{ava,babel,nyc}.config.{js,cjs,mjs}',\n '**/jest.config.{js,cjs,mjs,ts}',\n '**/{karma,rollup,webpack}.config.js',\n '**/.{eslint,mocha}rc.{js,cjs}',\n '**/.{travis,yarnrc}.yml',\n '**/{docker-compose,docker}.yml',\n '**/.yamllint.{yaml,yml}',\n '**/node_modules/**',\n '**/pnpm-lock.yaml',\n '**/pnpm-workspace.yaml',\n '**/{package,package-lock}.json',\n '**/yarn.lock',\n '**/package.json5',\n '**/.next/**',\n ],\n followSymlinks: false,\n swaggerDefinition: {\n openapi: '3.0.0',\n info: {\n title: 'API',\n version: '1.0.0',\n },\n },\n};\n`,\n );\n\n // eslint-disable-next-line no-console\n console.log(`Created \"${configName}\"`);\n};\n\nexport default initCommand;\n"]}
|
package/dist/chunk-KZEWPZ7N.js
CHANGED
|
@@ -1,19 +1,4 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var chunkTYWUYJHV_js = require('./chunk-TYWUYJHV.js');
|
|
4
|
-
var promises = require('fs/promises');
|
|
5
|
-
var path = require('path');
|
|
6
|
-
var url = require('url');
|
|
7
|
-
var fs = require('@visulima/fs');
|
|
8
|
-
var cliProgress = require('cli-progress');
|
|
9
|
-
var fs$1 = require('fs');
|
|
10
|
-
var A = require('read-pkg-up');
|
|
11
|
-
|
|
12
|
-
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
-
|
|
14
|
-
var A__default = /*#__PURE__*/_interopDefault(A);
|
|
15
|
-
|
|
16
|
-
var P=async(i,l,e)=>{let o={exclude:[],swaggerDefinition:{}};try{let t=await import(url.pathToFileURL(path.normalize(e.config??i)).href);t?.default&&(t=t.default),o=t;}catch{throw new Error(`No config file found, on: ${e.config??".openapirc.js"}
|
|
1
|
+
'use strict';var chunkTYWUYJHV_js=require('./chunk-TYWUYJHV.js'),promises=require('fs/promises'),path=require('path'),url=require('url'),fs=require('@visulima/fs'),cliProgress=require('cli-progress'),fs$1=require('fs'),A=require('read-pkg-up');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var A__default=/*#__PURE__*/_interopDefault(A);var P=async(i,l,e)=>{let o={exclude:[],swaggerDefinition:{}};try{let t=await import(url.pathToFileURL(path.normalize(e.config??i)).href);t?.default&&(t=t.default),o=t;}catch{throw new Error(`No config file found, on: ${e.config??".openapirc.js"}
|
|
17
2
|
`)}let r=new cliProgress.MultiBar({clearOnComplete:!1,format:"{value}/{total} | {bar} | {filename}",hideCursor:!0},cliProgress.Presets.shades_grey),s=new chunkTYWUYJHV_js.d(o.swaggerDefinition),k=new Set([...chunkTYWUYJHV_js.f,...o.exclude]);for await(let t of l){(await promises.lstat(t)).isDirectory();let c=await promises.realpath(t),n=await fs.collect(c,{extensions:o.extensions??[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],followSymlinks:o.followSymlinks??!1,match:o.include,skip:[...k]});(e.verbose??e.veryVerbose)&&console.log(`
|
|
18
3
|
Found ${n.length} files in ${c}`),e.veryVerbose&&console.log(n);let j=r.create(n.length,0);n.forEach(m=>{e.verbose&&console.log(`Parsing file ${m}`),j.increment(1,{filename:c});let x=chunkTYWUYJHV_js.c(m,chunkTYWUYJHV_js.a,e.verbose);s.addData(x.map(f=>f.spec));let b=chunkTYWUYJHV_js.c(m,chunkTYWUYJHV_js.e,e.verbose);s.addData(b.map(f=>f.spec));});}e.verbose&&console.log("Validating swagger spec"),e.veryVerbose&&console.log(JSON.stringify(s,null,2)),await chunkTYWUYJHV_js.g(JSON.parse(JSON.stringify(s)));let a=e.output??"swagger.json";r.stop(),e.verbose&&console.log(`Written swagger spec to "${a}" file`),await promises.mkdir(path.dirname(a),{recursive:!0}),await promises.writeFile(a,JSON.stringify(s,null,2)),console.log(`
|
|
19
4
|
Swagger specification is ready, check the "${a}" file.`);},K=P;var N=(i,l=process.cwd())=>{if(fs$1.existsSync(i))throw new Error("Config file already exists");let e=A__default.default.sync({cwd:fs$1.realpathSync(l)}),o="module.exports =";if(e){let{packageJson:r,path:s}=e;console.info(`Found package.json at "${s}"`),r.type==="module"&&(console.info("Found package.json with type: module, using ES6 as export for the config file"),o="export default");}else console.info("No package.json found");fs$1.writeFileSync(i,`${o} {
|
|
@@ -50,9 +35,5 @@ Swagger specification is ready, check the "${a}" file.`);},K=P;var N=(i,l=proces
|
|
|
50
35
|
},
|
|
51
36
|
},
|
|
52
37
|
};
|
|
53
|
-
`),console.log(`Created "${i}"`);},oe=N;
|
|
54
|
-
|
|
55
|
-
exports.a = K;
|
|
56
|
-
exports.b = oe;
|
|
57
|
-
//# sourceMappingURL=chunk-KZEWPZ7N.js.map
|
|
38
|
+
`),console.log(`Created "${i}"`);},oe=N;exports.a=K;exports.b=oe;//# sourceMappingURL=chunk-KZEWPZ7N.js.map
|
|
58
39
|
//# sourceMappingURL=chunk-KZEWPZ7N.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/command/generate-command.ts","../src/cli/command/init-command.ts"],"names":["generateCommand","configName","paths","options","openapiConfig","config","pathToFileURL","normalize","multibar","MultiBar","Presets","spec","spec_builder_default","skip","DEFAULT_EXCLUDE","dir","lstat","realDirectory","realpath","files","collect","bar","file","parsedJsDocumentFile","parse_file_default","comments_to_open_api_default","item","parsedSwaggerJsDocumentFile","validate_default","output","mkdir","dirname","writeFile","generate_command_default","initCommand","packageJsonPath","existsSync","foundPackageJson","readPkgUp","realpathSync","exportTemplate","package_","packagePath","writeFileSync","init_command_default"],"mappings":"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","file":"chunk-KZEWPZ7N.js","sourcesContent":["import { lstat, mkdir, realpath, writeFile } from \"node:fs/promises\";\nimport { dirname, normalize } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type { WalkOptions } from \"@visulima/fs\";\nimport { collect } from \"@visulima/fs\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { MultiBar, Presets } from \"cli-progress\";\n\nimport { DEFAULT_EXCLUDE } from \"../../constants\";\nimport type { BaseDefinition } from \"../../exported\";\nimport jsDocumentCommentsToOpenApi from \"../../jsdoc/comments-to-open-api\";\nimport parseFile from \"../../parse-file\";\nimport SpecBuilder from \"../../spec-builder\";\nimport swaggerJsDocumentCommentsToOpenApi from \"../../swagger-jsdoc/comments-to-open-api\";\nimport validate from \"../../validate\";\n\nconst generateCommand = async (\n configName: string,\n paths: string[],\n options: {\n config?: string;\n output?: string;\n verbose?: boolean;\n veryVerbose?: boolean;\n },\n // eslint-disable-next-line sonarjs/cognitive-complexity\n): Promise<void> => {\n let openapiConfig: {\n exclude: string[];\n extensions?: string[];\n followSymlinks?: boolean;\n include?: (RegExp | string)[];\n swaggerDefinition: BaseDefinition;\n } = {\n exclude: [],\n swaggerDefinition: {} as BaseDefinition,\n };\n\n try {\n let config = await import(pathToFileURL(normalize(options.config ?? configName)).href);\n\n if (config?.default) {\n config = config.default;\n }\n\n openapiConfig = config;\n } catch {\n throw new Error(`No config file found, on: ${options.config ?? \".openapirc.js\"}\\n`);\n }\n\n const multibar = new MultiBar(\n {\n clearOnComplete: false,\n format: \"{value}/{total} | {bar} | {filename}\",\n hideCursor: true,\n },\n Presets.shades_grey,\n );\n\n const spec = new SpecBuilder(openapiConfig.swaggerDefinition);\n const skip = new Set<RegExp | string>([...DEFAULT_EXCLUDE, ...openapiConfig.exclude]);\n\n // eslint-disable-next-line no-restricted-syntax,unicorn/prevent-abbreviations,no-loops/no-loops\n for await (const dir of paths) {\n // Check if the path is a directory\n // eslint-disable-next-line security/detect-non-literal-fs-filename,unicorn/no-await-expression-member\n (await lstat(dir)).isDirectory();\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n const realDirectory = await realpath(dir);\n\n const files = await collect(realDirectory, {\n extensions: openapiConfig.extensions ?? [\".js\", \".cjs\", \".mjs\", \".ts\", \".tsx\", \".jsx\", \".yaml\", \".yml\"],\n followSymlinks: openapiConfig.followSymlinks ?? false,\n match: openapiConfig.include,\n skip: [...skip],\n } as WalkOptions);\n\n if (options.verbose ?? options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(`\\nFound ${files.length} files in ${realDirectory}`);\n }\n\n if (options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(files);\n }\n\n const bar = multibar.create(files.length, 0);\n\n files.forEach((file) => {\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Parsing file ${file}`);\n }\n\n bar.increment(1, { filename: realDirectory });\n\n const parsedJsDocumentFile = parseFile(file, jsDocumentCommentsToOpenApi, options.verbose);\n\n spec.addData(parsedJsDocumentFile.map((item) => item.spec));\n\n const parsedSwaggerJsDocumentFile = parseFile(file, swaggerJsDocumentCommentsToOpenApi, options.verbose);\n\n spec.addData(parsedSwaggerJsDocumentFile.map((item) => item.spec));\n });\n }\n\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(\"Validating swagger spec\");\n }\n\n if (options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(spec, null, 2));\n }\n\n await validate(JSON.parse(JSON.stringify(spec)) as Record<string, unknown>);\n\n const output = options.output ?? \"swagger.json\";\n\n multibar.stop();\n\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Written swagger spec to \"${output}\" file`);\n }\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n await mkdir(dirname(output), { recursive: true });\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n await writeFile(output, JSON.stringify(spec, null, 2));\n\n // eslint-disable-next-line no-console\n console.log(`\\nSwagger specification is ready, check the \"${output}\" file.`);\n};\n\nexport default generateCommand;\n","import { existsSync, realpathSync, writeFileSync } from \"node:fs\";\n\nimport readPkgUp from \"read-pkg-up\";\n\nconst initCommand = (configName: string, packageJsonPath = process.cwd()): void => {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n if (existsSync(configName)) {\n throw new Error(\"Config file already exists\");\n }\n\n const foundPackageJson = readPkgUp.sync({\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n cwd: realpathSync(packageJsonPath),\n });\n\n let exportTemplate = \"module.exports =\";\n\n if (foundPackageJson) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { packageJson: package_, path: packagePath } = foundPackageJson;\n\n // eslint-disable-next-line no-console\n console.info(`Found package.json at \"${packagePath}\"`);\n\n if (package_.type === \"module\") {\n // eslint-disable-next-line no-console\n console.info(\"Found package.json with type: module, using ES6 as export for the config file\");\n\n exportTemplate = \"export default\";\n }\n } else {\n // eslint-disable-next-line no-console\n console.info(\"No package.json found\");\n }\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n writeFileSync(\n configName,\n `${exportTemplate} {\n exclude: [\n 'coverage/**',\n '.github/**',\n 'packages/*/test{,s}/**',\n '**/*.d.ts',\n 'test{,s}/**',\n 'test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}',\n '**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}',\n '**/__tests__/**',\n '**/{ava,babel,nyc}.config.{js,cjs,mjs}',\n '**/jest.config.{js,cjs,mjs,ts}',\n '**/{karma,rollup,webpack}.config.js',\n '**/.{eslint,mocha}rc.{js,cjs}',\n '**/.{travis,yarnrc}.yml',\n '**/{docker-compose,docker}.yml',\n '**/.yamllint.{yaml,yml}',\n '**/node_modules/**',\n '**/pnpm-lock.yaml',\n '**/pnpm-workspace.yaml',\n '**/{package,package-lock}.json',\n '**/yarn.lock',\n '**/package.json5',\n '**/.next/**',\n ],\n followSymlinks: false,\n swaggerDefinition: {\n openapi: '3.0.0',\n info: {\n title: 'API',\n version: '1.0.0',\n },\n },\n};\n`,\n );\n\n // eslint-disable-next-line no-console\n console.log(`Created \"${configName}\"`);\n};\n\nexport default initCommand;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/command/generate-command.ts","../src/cli/command/init-command.ts"],"names":["generateCommand","configName","paths","options","openapiConfig","config","pathToFileURL","normalize","multibar","MultiBar","Presets","spec","spec_builder_default","skip","DEFAULT_EXCLUDE","dir","lstat","realDirectory","realpath","files","collect","bar","file","parsedJsDocumentFile","parse_file_default","comments_to_open_api_default","item","parsedSwaggerJsDocumentFile","validate_default","output","mkdir","dirname","writeFile","generate_command_default","initCommand","packageJsonPath","existsSync","foundPackageJson","readPkgUp","realpathSync","exportTemplate","package_","packagePath","writeFileSync","init_command_default"],"mappings":"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","file":"chunk-KZEWPZ7N.js","sourcesContent":["import { lstat, mkdir, realpath, writeFile } from \"node:fs/promises\";\nimport { dirname, normalize } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type { WalkOptions } from \"@visulima/fs\";\nimport { collect } from \"@visulima/fs\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { MultiBar, Presets } from \"cli-progress\";\n\nimport { DEFAULT_EXCLUDE } from \"../../constants\";\nimport type { BaseDefinition } from \"../../exported\";\nimport jsDocumentCommentsToOpenApi from \"../../jsdoc/comments-to-open-api\";\nimport parseFile from \"../../parse-file\";\nimport SpecBuilder from \"../../spec-builder\";\nimport swaggerJsDocumentCommentsToOpenApi from \"../../swagger-jsdoc/comments-to-open-api\";\nimport validate from \"../../validate\";\n\nconst generateCommand = async (\n configName: string,\n paths: string[],\n options: {\n config?: string;\n output?: string;\n verbose?: boolean;\n veryVerbose?: boolean;\n },\n // eslint-disable-next-line sonarjs/cognitive-complexity\n): Promise<void> => {\n let openapiConfig: {\n exclude: string[];\n extensions?: string[];\n followSymlinks?: boolean;\n include?: (RegExp | string)[];\n swaggerDefinition: BaseDefinition;\n } = {\n exclude: [],\n swaggerDefinition: {} as BaseDefinition,\n };\n\n try {\n let config = await import(pathToFileURL(normalize(options.config ?? configName)).href);\n\n if (config?.default) {\n config = config.default;\n }\n\n openapiConfig = config;\n } catch {\n throw new Error(`No config file found, on: ${options.config ?? \".openapirc.js\"}\\n`);\n }\n\n const multibar = new MultiBar(\n {\n clearOnComplete: false,\n format: \"{value}/{total} | {bar} | {filename}\",\n hideCursor: true,\n },\n Presets.shades_grey,\n );\n\n const spec = new SpecBuilder(openapiConfig.swaggerDefinition);\n const skip = new Set<RegExp | string>([...DEFAULT_EXCLUDE, ...openapiConfig.exclude]);\n\n // eslint-disable-next-line no-restricted-syntax,unicorn/prevent-abbreviations,no-loops/no-loops\n for await (const dir of paths) {\n // Check if the path is a directory\n // eslint-disable-next-line security/detect-non-literal-fs-filename,unicorn/no-await-expression-member\n (await lstat(dir)).isDirectory();\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n const realDirectory = await realpath(dir);\n\n const files = await collect(realDirectory, {\n extensions: openapiConfig.extensions ?? [\".js\", \".cjs\", \".mjs\", \".ts\", \".tsx\", \".jsx\", \".yaml\", \".yml\"],\n followSymlinks: openapiConfig.followSymlinks ?? false,\n match: openapiConfig.include,\n skip: [...skip],\n } as WalkOptions);\n\n if (options.verbose ?? options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(`\\nFound ${files.length} files in ${realDirectory}`);\n }\n\n if (options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(files);\n }\n\n const bar = multibar.create(files.length, 0);\n\n files.forEach((file) => {\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Parsing file ${file}`);\n }\n\n bar.increment(1, { filename: realDirectory });\n\n const parsedJsDocumentFile = parseFile(file, jsDocumentCommentsToOpenApi, options.verbose);\n\n spec.addData(parsedJsDocumentFile.map((item) => item.spec));\n\n const parsedSwaggerJsDocumentFile = parseFile(file, swaggerJsDocumentCommentsToOpenApi, options.verbose);\n\n spec.addData(parsedSwaggerJsDocumentFile.map((item) => item.spec));\n });\n }\n\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(\"Validating swagger spec\");\n }\n\n if (options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(spec, null, 2));\n }\n\n await validate(JSON.parse(JSON.stringify(spec)) as Record<string, unknown>);\n\n const output = options.output ?? \"swagger.json\";\n\n multibar.stop();\n\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Written swagger spec to \"${output}\" file`);\n }\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n await mkdir(dirname(output), { recursive: true });\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n await writeFile(output, JSON.stringify(spec, null, 2));\n\n // eslint-disable-next-line no-console\n console.log(`\\nSwagger specification is ready, check the \"${output}\" file.`);\n};\n\nexport default generateCommand;\n","import { existsSync, realpathSync, writeFileSync } from \"node:fs\";\n\nimport readPkgUp from \"read-pkg-up\";\n\nconst initCommand = (configName: string, packageJsonPath = process.cwd()): void => {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n if (existsSync(configName)) {\n throw new Error(\"Config file already exists\");\n }\n\n const foundPackageJson = readPkgUp.sync({\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n cwd: realpathSync(packageJsonPath),\n });\n\n let exportTemplate = \"module.exports =\";\n\n if (foundPackageJson) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { packageJson: package_, path: packagePath } = foundPackageJson;\n\n // eslint-disable-next-line no-console\n console.info(`Found package.json at \"${packagePath}\"`);\n\n if (package_.type === \"module\") {\n // eslint-disable-next-line no-console\n console.info(\"Found package.json with type: module, using ES6 as export for the config file\");\n\n exportTemplate = \"export default\";\n }\n } else {\n // eslint-disable-next-line no-console\n console.info(\"No package.json found\");\n }\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n writeFileSync(\n configName,\n `${exportTemplate} {\n exclude: [\n 'coverage/**',\n '.github/**',\n 'packages/*/test{,s}/**',\n '**/*.d.ts',\n 'test{,s}/**',\n 'test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}',\n '**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}',\n '**/__tests__/**',\n '**/{ava,babel,nyc}.config.{js,cjs,mjs}',\n '**/jest.config.{js,cjs,mjs,ts}',\n '**/{karma,rollup,webpack}.config.js',\n '**/.{eslint,mocha}rc.{js,cjs}',\n '**/.{travis,yarnrc}.yml',\n '**/{docker-compose,docker}.yml',\n '**/.yamllint.{yaml,yml}',\n '**/node_modules/**',\n '**/pnpm-lock.yaml',\n '**/pnpm-workspace.yaml',\n '**/{package,package-lock}.json',\n '**/yarn.lock',\n '**/package.json5',\n '**/.next/**',\n ],\n followSymlinks: false,\n swaggerDefinition: {\n openapi: '3.0.0',\n info: {\n title: 'API',\n version: '1.0.0',\n },\n },\n};\n`,\n );\n\n // eslint-disable-next-line no-console\n console.log(`Created \"${configName}\"`);\n};\n\nexport default initCommand;\n"]}
|
package/dist/chunk-LIBKIIBP.mjs
CHANGED
|
@@ -1,19 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import S from 'lodash.mergewith';
|
|
3
|
-
import { readFileSync } from 'node:fs';
|
|
4
|
-
import R from 'node:path';
|
|
5
|
-
import I from 'yaml';
|
|
6
|
-
import U from '@apidevtools/swagger-parser';
|
|
7
|
-
|
|
8
|
-
var v=(t,s)=>{if(Array.isArray(t))return [...t,...s]},l=v;var w=t=>{t.security&&(t.security=Object.keys(t.security).map(s=>({[s]:t.security[s]})));},P=new Set(["integer","number","string","boolean","object","array"]),b={binary:"string",byte:"string",date:"string","date-time":"string",double:"number",float:"number",int32:"integer",int64:"integer",password:"string"},$=t=>{let s=t.type,r=s.endsWith("[]"),e=s.replace(/\[]$/,""),a=P.has(e),n=Object.keys(b).includes(e),o;if(t.default)switch(e){case"integer":case"int32":case"int64":{o=Number.parseInt(t.default,10);break}case"number":case"double":case"float":{o=Number.parseFloat(t.default);break}default:{o=t.default;break}}let c;a?c={default:o,type:e}:n?c={default:o,format:e,type:b[e]}:c={$ref:`#/components/schemas/${e}`};let m=r?{items:{...c},type:"array"}:{...c};e===""&&(m=void 0);let u=t.description.trim().replace(/^- /u,"");return u===""&&(u=void 0),{description:u,name:t.name,rawType:s,required:!t.optional,schema:m}},D=(t,s)=>t.map(r=>{let e=$(r),a="";switch(e.name&&(a+=e.name),e.description&&(a+=` ${e.description.trim()}`),r.tag){case"operationId":case"summary":case"description":return {[r.tag]:a};case"deprecated":return {deprecated:!0};case"externalDocs":return {externalDocs:{description:e.description,url:e.name}};case"server":return {servers:[{description:e.description,url:e.name}]};case"tag":return {tags:[a]};case"cookieParam":case"headerParam":case"queryParam":case"pathParam":return {parameters:[{description:e.description,in:r.tag.replace(/Param$/u,""),name:e.name,required:e.required,schema:e.schema}]};case"bodyContent":return {requestBody:{content:{[e.name.replace("*\\/*","*/*")]:{schema:e.schema}}}};case"bodyExample":{let[n,o]=e.name.split(".");return {requestBody:{content:{[n]:{examples:{[o]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}case"bodyDescription":return {requestBody:{description:a}};case"bodyRequired":return {requestBody:{required:!0}};case"response":return {responses:{[e.name]:{description:e.description}}};case"callback":return {callbacks:{[e.name]:{$ref:`#/components/callbacks/${e.rawType}`}}};case"responseContent":{let[n,o]=e.name.split(".");return {responses:{[n]:{content:{[o]:{schema:e.schema}}}}}}case"responseHeaderComponent":{let[n,o]=e.name.split(".");return {responses:{[n]:{headers:{[o]:{$ref:`#/components/headers/${e.rawType}`}}}}}}case"responseHeader":{let[n,o]=e.name.split(".");return {responses:{[n]:{headers:{[o]:{description:e.description,schema:e.schema}}}}}}case"responseExample":{let[n,o,c]=e.name.split(".");return {responses:{[n]:{content:{[o]:{examples:{[c]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}}case"responseLink":{let[n,o]=e.name.split(".");return {responses:{[n]:{links:{[o]:{$ref:`#/components/links/${e.rawType}`}}}}}}case"bodyComponent":return {requestBody:{$ref:`#/components/requestBodies/${e.rawType}`}};case"responseComponent":return {responses:{[e.name]:{$ref:`#/components/responses/${e.rawType}`}}};case"paramComponent":return {parameters:[{$ref:`#/components/parameters/${e.rawType}`}]};case"security":{let[n,o]=e.name.split("."),c=[];return o&&(c=[o]),{security:{[n]:c}}}default:return {}}}),C=(t,s)=>{let r=/^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \/.*$/;return parse(t,{spacing:"preserve"}).filter(a=>r.test(a.description.trim())).map(a=>{let n=a.tags.length+1,o=S({},...D(a.tags),l);w(o);let[c,m]=a.description.split(" "),u={[m.trim()]:{[c.toLowerCase().trim()]:{...o}}},T=JSON.parse(JSON.stringify({paths:u}));return {loc:n,spec:T}})},ee=C;var L=t=>t.split(/\r\n|\r|\n/u).filter(e=>/^\s*(#\s*(?:\S.*)?)?$/u.test(e)?!1:e.trim().length>0).length,h=L;var j=new Set(["openapi","info","servers","security","tags","externalDocs","components","paths"]),d=class extends Error{filePath},M=(t,s,r)=>{let e=readFileSync(t,{encoding:"utf8"}),a=R.extname(t);if(a===".yaml"||a===".yml"){let n=I.parse(e),o=Object.keys(n).filter(c=>!j.has(c));if(o.length>0){let c=new d(`Unexpected keys: ${o.join(", ")}`);throw c.filePath=t,c}return Object.keys(n).some(c=>j.has(c))?[{loc:h(e),spec:n}]:[]}try{return s(e,r)}catch(n){throw n.filePath=t,n}},pe=M;var Y=(t,s)=>{Object.keys(s).forEach(r=>{t[r]===void 0?t[r]={...s[r]}:Object.keys(s[r]).forEach(e=>{t[r][e]={...t[r][e],...s[r][e]};});});},O=Y;var f=class{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(r=>{let{components:e,paths:a,...n}=r;O(this,{components:e??{},paths:a??{}}),Object.entries(n).forEach(([o,c])=>{this[o]=c;});});}},ye=f;var y=(t,s)=>S({},t,s,(r,e)=>e===null?r:void 0),x=t=>Object.keys(t).map(s=>t[s]).every(s=>typeof s=="object"&&Object.keys(s).every(r=>!(r in s))),g=(t,s)=>s.some(r=>t.name===r.name),E=t=>{switch(t.tag){case"openapi":return "v3";case"asyncapi":return "v4";case"swagger":return "v2";default:return "v2"}};var B=(t,s,r)=>{if(r==="x-webhooks"&&(t[r]=s[r]),r.startsWith("x-"))return;if(["components","consumes","produces","paths","schemas","securityDefinitions","responses","parameters","definitions","channels"].includes(r))Object.keys(s[r]).forEach(a=>{t[r][a]=y(t[r][a],s[r][a]);});else if(r==="tags"){let{tags:a}=s;Array.isArray(a)?a.forEach(n=>{g(n,t.tags)||t.tags.push(n);}):g(a,t.tags)||t.tags.push(a);}else if(r==="security"){let{security:a}=s;t.security=a;}else r.startsWith("/")&&(t.paths[r]=y(t.paths[r],s[r]));},k=B;var z={v2:["paths","definitions","responses","parameters","securityDefinitions"],v3:["paths","definitions","responses","parameters","securityDefinitions","components"],v4:["components","channels"]},J=(t,s)=>t.map(r=>{if((r.tag==="openapi"||r.tag==="swagger"||r.tag==="asyncapi")&&r.description!==""){let e=I.parseDocument(r.description);if(e.errors.length>0){e.errors.map(c=>{let m=c;return m.annotation=r.description,m});let o="Error parsing YAML in @openapi spec:";throw o+=s?e.errors.map(c=>`${c.toString()}
|
|
1
|
+
import {parse}from'comment-parser';import S from'lodash.mergewith';import {readFileSync}from'node:fs';import R from'node:path';import I from'yaml';import U from'@apidevtools/swagger-parser';var v=(t,s)=>{if(Array.isArray(t))return [...t,...s]},l=v;var w=t=>{t.security&&(t.security=Object.keys(t.security).map(s=>({[s]:t.security[s]})));},P=new Set(["integer","number","string","boolean","object","array"]),b={binary:"string",byte:"string",date:"string","date-time":"string",double:"number",float:"number",int32:"integer",int64:"integer",password:"string"},$=t=>{let s=t.type,r=s.endsWith("[]"),e=s.replace(/\[]$/,""),a=P.has(e),n=Object.keys(b).includes(e),o;if(t.default)switch(e){case"integer":case"int32":case"int64":{o=Number.parseInt(t.default,10);break}case"number":case"double":case"float":{o=Number.parseFloat(t.default);break}default:{o=t.default;break}}let c;a?c={default:o,type:e}:n?c={default:o,format:e,type:b[e]}:c={$ref:`#/components/schemas/${e}`};let m=r?{items:{...c},type:"array"}:{...c};e===""&&(m=void 0);let u=t.description.trim().replace(/^- /u,"");return u===""&&(u=void 0),{description:u,name:t.name,rawType:s,required:!t.optional,schema:m}},D=(t,s)=>t.map(r=>{let e=$(r),a="";switch(e.name&&(a+=e.name),e.description&&(a+=` ${e.description.trim()}`),r.tag){case"operationId":case"summary":case"description":return {[r.tag]:a};case"deprecated":return {deprecated:!0};case"externalDocs":return {externalDocs:{description:e.description,url:e.name}};case"server":return {servers:[{description:e.description,url:e.name}]};case"tag":return {tags:[a]};case"cookieParam":case"headerParam":case"queryParam":case"pathParam":return {parameters:[{description:e.description,in:r.tag.replace(/Param$/u,""),name:e.name,required:e.required,schema:e.schema}]};case"bodyContent":return {requestBody:{content:{[e.name.replace("*\\/*","*/*")]:{schema:e.schema}}}};case"bodyExample":{let[n,o]=e.name.split(".");return {requestBody:{content:{[n]:{examples:{[o]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}case"bodyDescription":return {requestBody:{description:a}};case"bodyRequired":return {requestBody:{required:!0}};case"response":return {responses:{[e.name]:{description:e.description}}};case"callback":return {callbacks:{[e.name]:{$ref:`#/components/callbacks/${e.rawType}`}}};case"responseContent":{let[n,o]=e.name.split(".");return {responses:{[n]:{content:{[o]:{schema:e.schema}}}}}}case"responseHeaderComponent":{let[n,o]=e.name.split(".");return {responses:{[n]:{headers:{[o]:{$ref:`#/components/headers/${e.rawType}`}}}}}}case"responseHeader":{let[n,o]=e.name.split(".");return {responses:{[n]:{headers:{[o]:{description:e.description,schema:e.schema}}}}}}case"responseExample":{let[n,o,c]=e.name.split(".");return {responses:{[n]:{content:{[o]:{examples:{[c]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}}case"responseLink":{let[n,o]=e.name.split(".");return {responses:{[n]:{links:{[o]:{$ref:`#/components/links/${e.rawType}`}}}}}}case"bodyComponent":return {requestBody:{$ref:`#/components/requestBodies/${e.rawType}`}};case"responseComponent":return {responses:{[e.name]:{$ref:`#/components/responses/${e.rawType}`}}};case"paramComponent":return {parameters:[{$ref:`#/components/parameters/${e.rawType}`}]};case"security":{let[n,o]=e.name.split("."),c=[];return o&&(c=[o]),{security:{[n]:c}}}default:return {}}}),C=(t,s)=>{let r=/^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \/.*$/;return parse(t,{spacing:"preserve"}).filter(a=>r.test(a.description.trim())).map(a=>{let n=a.tags.length+1,o=S({},...D(a.tags),l);w(o);let[c,m]=a.description.split(" "),u={[m.trim()]:{[c.toLowerCase().trim()]:{...o}}},T=JSON.parse(JSON.stringify({paths:u}));return {loc:n,spec:T}})},ee=C;var L=t=>t.split(/\r\n|\r|\n/u).filter(e=>/^\s*(#\s*(?:\S.*)?)?$/u.test(e)?!1:e.trim().length>0).length,h=L;var j=new Set(["openapi","info","servers","security","tags","externalDocs","components","paths"]),d=class extends Error{filePath},M=(t,s,r)=>{let e=readFileSync(t,{encoding:"utf8"}),a=R.extname(t);if(a===".yaml"||a===".yml"){let n=I.parse(e),o=Object.keys(n).filter(c=>!j.has(c));if(o.length>0){let c=new d(`Unexpected keys: ${o.join(", ")}`);throw c.filePath=t,c}return Object.keys(n).some(c=>j.has(c))?[{loc:h(e),spec:n}]:[]}try{return s(e,r)}catch(n){throw n.filePath=t,n}},pe=M;var Y=(t,s)=>{Object.keys(s).forEach(r=>{t[r]===void 0?t[r]={...s[r]}:Object.keys(s[r]).forEach(e=>{t[r][e]={...t[r][e],...s[r][e]};});});},O=Y;var f=class{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(r=>{let{components:e,paths:a,...n}=r;O(this,{components:e??{},paths:a??{}}),Object.entries(n).forEach(([o,c])=>{this[o]=c;});});}},ye=f;var y=(t,s)=>S({},t,s,(r,e)=>e===null?r:void 0),x=t=>Object.keys(t).map(s=>t[s]).every(s=>typeof s=="object"&&Object.keys(s).every(r=>!(r in s))),g=(t,s)=>s.some(r=>t.name===r.name),E=t=>{switch(t.tag){case"openapi":return "v3";case"asyncapi":return "v4";case"swagger":return "v2";default:return "v2"}};var B=(t,s,r)=>{if(r==="x-webhooks"&&(t[r]=s[r]),r.startsWith("x-"))return;if(["components","consumes","produces","paths","schemas","securityDefinitions","responses","parameters","definitions","channels"].includes(r))Object.keys(s[r]).forEach(a=>{t[r][a]=y(t[r][a],s[r][a]);});else if(r==="tags"){let{tags:a}=s;Array.isArray(a)?a.forEach(n=>{g(n,t.tags)||t.tags.push(n);}):g(a,t.tags)||t.tags.push(a);}else if(r==="security"){let{security:a}=s;t.security=a;}else r.startsWith("/")&&(t.paths[r]=y(t.paths[r],s[r]));},k=B;var z={v2:["paths","definitions","responses","parameters","securityDefinitions"],v3:["paths","definitions","responses","parameters","securityDefinitions","components"],v4:["components","channels"]},J=(t,s)=>t.map(r=>{if((r.tag==="openapi"||r.tag==="swagger"||r.tag==="asyncapi")&&r.description!==""){let e=I.parseDocument(r.description);if(e.errors.length>0){e.errors.map(c=>{let m=c;return m.annotation=r.description,m});let o="Error parsing YAML in @openapi spec:";throw o+=s?e.errors.map(c=>`${c.toString()}
|
|
9
2
|
Imbedded within:
|
|
10
3
|
\`\`\`
|
|
11
4
|
${c.annotation?.replace(/\n/gu,`
|
|
12
5
|
`)}
|
|
13
6
|
\`\`\``).join(`
|
|
14
7
|
`):e.errors.map(c=>c.toString()).join(`
|
|
15
|
-
`),new Error(o)}let a=e.toJSON(),n={tags:[]};return z[E(r)].forEach(o=>{n[o]=n[o]||{};}),Object.keys(a).forEach(o=>{k(n,a,o);}),n}return {}}),H=(t,s)=>parse(t,{spacing:"preserve"}).map(e=>{let a=e.tags.length+1,n=S({},...J(e.tags,s),l);["definitions","responses","parameters","securityDefinitions","components","tags"].forEach(c=>{n[c]!==void 0&&x(n[c])&&delete n[c];});let o=JSON.parse(JSON.stringify(n));return {loc:a,spec:o}}),$e=H;var Le=["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 V=async t=>{await U.validate(t);},Me=V;
|
|
16
|
-
|
|
17
|
-
export { ee as a, h as b, pe as c, ye as d, $e as e, Le as f, Me as g };
|
|
18
|
-
//# sourceMappingURL=chunk-LIBKIIBP.mjs.map
|
|
8
|
+
`),new Error(o)}let a=e.toJSON(),n={tags:[]};return z[E(r)].forEach(o=>{n[o]=n[o]||{};}),Object.keys(a).forEach(o=>{k(n,a,o);}),n}return {}}),H=(t,s)=>parse(t,{spacing:"preserve"}).map(e=>{let a=e.tags.length+1,n=S({},...J(e.tags,s),l);["definitions","responses","parameters","securityDefinitions","components","tags"].forEach(c=>{n[c]!==void 0&&x(n[c])&&delete n[c];});let o=JSON.parse(JSON.stringify(n));return {loc:a,spec:o}}),$e=H;var Le=["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 V=async t=>{await U.validate(t);},Me=V;export{ee as a,h as b,pe as c,ye as d,$e as e,Le as f,Me as g};//# sourceMappingURL=chunk-LIBKIIBP.mjs.map
|
|
19
9
|
//# sourceMappingURL=chunk-LIBKIIBP.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/util/customizer.ts","../src/jsdoc/comments-to-open-api.ts","../src/util/yaml-loc.ts","../src/parse-file.ts","../src/util/object-merge.ts","../src/spec-builder.ts","../src/swagger-jsdoc/utils.ts","../src/swagger-jsdoc/organize-swagger-object.ts","../src/swagger-jsdoc/comments-to-open-api.ts","../src/constants.ts","../src/validate.ts"],"names":["customizer","objectValue","sourceValue","customizer_default","fixSecurityObject","thing","primitiveTypes","formatMap","parseDescription","tag","rawType","isArray","parsedType","isPrimitive","isFormat","defaultValue","rootType","schema","description","tagsToObjects","tags","verbose","parsedResponse","nameAndDescription","contentType","example","status","header","link","security","scopeItem","scope","commentsToOpenApi","fileContents","openAPIRegex","parseComments","comment","loc","result","mergeWith","method","path","pathsObject","spec","comments_to_open_api_default","yamlLoc","string","line","yaml_loc_default","ALLOWED_KEYS","ParseError","parseFile","file","fileContent","readFileSync","extension","yaml","invalidKeys","key","error","parse_file_default","objectMerge","a","b","subKey","object_merge_default","SpecBuilder","baseDefinition","parsedFile","components","paths","rest","value","spec_builder_default","mergeDeep","first","second","hasEmptyProperty","object","keyObject","isTagPresentInTags","targetTag","getSwaggerVersionFromSpec","organizeSwaggerObject","swaggerObject","annotation","property","definition","organize_swagger_object_default","specificationTemplate","specs","parsed","newError","errorString","parsedDocument","specification","DEFAULT_EXCLUDE","validate","SwaggerParser","validate_default"],"mappings":"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","file":"chunk-LIBKIIBP.mjs","sourcesContent":["const customizer = (objectValue: unknown, sourceValue: unknown[]): unknown[] | undefined => {\n if (Array.isArray(objectValue)) {\n return [...objectValue, ...sourceValue] as unknown[];\n }\n\n return undefined;\n};\n\nexport default customizer;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\n// eslint-disable-next-line no-restricted-imports\nimport mergeWith from \"lodash.mergewith\";\n\nimport type { OpenApiObject, PathsObject } from \"../exported\";\nimport customizer from \"../util/customizer\";\n\n// The security object has a bizare setup...\nconst fixSecurityObject = (thing: any) => {\n if (thing.security) {\n // eslint-disable-next-line no-param-reassign\n thing.security = Object.keys(thing.security).map((s) => {\n return {\n [s]: thing.security[s],\n };\n });\n }\n};\n\nconst primitiveTypes = new Set([\"integer\", \"number\", \"string\", \"boolean\", \"object\", \"array\"]);\n\nconst formatMap: Record<string, string> = {\n binary: \"string\",\n byte: \"string\",\n date: \"string\",\n \"date-time\": \"string\",\n double: \"number\",\n float: \"number\",\n int32: \"integer\",\n int64: \"integer\",\n password: \"string\",\n};\n\nconst parseDescription = (tag: Spec): { description: string | undefined; name: string; rawType: string; required: boolean; schema: object | undefined } => {\n const rawType = tag.type;\n const isArray = rawType.endsWith(\"[]\");\n // eslint-disable-next-line regexp/strict\n const parsedType = rawType.replace(/\\[]$/, \"\");\n\n const isPrimitive = primitiveTypes.has(parsedType);\n const isFormat = Object.keys(formatMap).includes(parsedType);\n\n let defaultValue;\n\n if (tag.default) {\n switch (parsedType) {\n case \"integer\":\n case \"int32\":\n case \"int64\": {\n defaultValue = Number.parseInt(tag.default, 10);\n break;\n }\n case \"number\":\n case \"double\":\n case \"float\": {\n defaultValue = Number.parseFloat(tag.default);\n break;\n }\n default: {\n defaultValue = tag.default;\n break;\n }\n }\n }\n\n let rootType;\n\n if (isPrimitive) {\n rootType = { default: defaultValue, type: parsedType };\n } else if (isFormat) {\n rootType = {\n default: defaultValue,\n format: parsedType,\n type: formatMap[parsedType],\n };\n } else {\n rootType = { $ref: `#/components/schemas/${parsedType}` };\n }\n\n let schema: object | undefined = isArray\n ? {\n items: {\n ...rootType,\n },\n type: \"array\",\n }\n : {\n ...rootType,\n };\n\n if (parsedType === \"\") {\n schema = undefined;\n }\n\n // remove the optional dash from the description.\n let description: string | undefined = tag.description.trim().replace(/^- /u, \"\");\n\n if (description === \"\") {\n description = undefined;\n }\n\n return {\n description,\n name: tag.name,\n rawType,\n required: !tag.optional,\n schema,\n };\n};\n\n// @ts-expect-error\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst tagsToObjects = (tags: Spec[], verbose?: boolean) =>\n tags.map((tag) => {\n const parsedResponse = parseDescription(tag);\n\n // Some ops only have a `description`, merge `name` and `description`\n // for these.\n let nameAndDescription = \"\";\n\n if (parsedResponse.name) {\n nameAndDescription += parsedResponse.name;\n }\n\n if (parsedResponse.description) {\n nameAndDescription += ` ${parsedResponse.description.trim()}`;\n }\n\n switch (tag.tag) {\n case \"operationId\":\n case \"summary\":\n case \"description\": {\n return { [tag.tag]: nameAndDescription };\n }\n\n case \"deprecated\": {\n return { deprecated: true };\n }\n\n case \"externalDocs\": {\n return {\n externalDocs: {\n description: parsedResponse.description,\n url: parsedResponse.name,\n },\n };\n }\n\n case \"server\": {\n return {\n servers: [\n {\n description: parsedResponse.description,\n url: parsedResponse.name,\n },\n ],\n };\n }\n\n case \"tag\": {\n return { tags: [nameAndDescription] };\n }\n\n case \"cookieParam\":\n case \"headerParam\":\n case \"queryParam\":\n case \"pathParam\": {\n return {\n parameters: [\n {\n description: parsedResponse.description,\n in: tag.tag.replace(/Param$/u, \"\"),\n name: parsedResponse.name,\n required: parsedResponse.required,\n schema: parsedResponse.schema,\n },\n ],\n };\n }\n\n case \"bodyContent\": {\n return {\n requestBody: {\n content: {\n [parsedResponse.name.replace(\"*\\\\/*\", \"*/*\")]: {\n schema: parsedResponse.schema,\n },\n },\n },\n };\n }\n\n case \"bodyExample\": {\n const [contentType, example] = parsedResponse.name.split(\".\");\n\n return {\n requestBody: {\n content: {\n [contentType as string]: {\n examples: {\n [example as string]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n };\n }\n\n case \"bodyDescription\": {\n return { requestBody: { description: nameAndDescription } };\n }\n\n case \"bodyRequired\": {\n return { requestBody: { required: true } };\n }\n\n case \"response\": {\n return {\n responses: {\n [parsedResponse.name]: {\n description: parsedResponse.description,\n },\n },\n };\n }\n\n case \"callback\": {\n return {\n callbacks: {\n [parsedResponse.name]: {\n $ref: `#/components/callbacks/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"responseContent\": {\n const [status, contentType] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n content: {\n [contentType as string]: {\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeaderComponent\": {\n const [status, header] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n headers: {\n [header as string]: {\n $ref: `#/components/headers/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeader\": {\n const [status, header] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n headers: {\n [header as string]: {\n description: parsedResponse.description,\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseExample\": {\n const [status, contentType, example] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n content: {\n [contentType as string]: {\n examples: {\n [example as string]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n },\n };\n }\n\n case \"responseLink\": {\n const [status, link] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n links: {\n [link as string]: {\n $ref: `#/components/links/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"bodyComponent\": {\n return {\n requestBody: {\n $ref: `#/components/requestBodies/${parsedResponse.rawType}`,\n },\n };\n }\n\n case \"responseComponent\": {\n return {\n responses: {\n [parsedResponse.name]: {\n $ref: `#/components/responses/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"paramComponent\": {\n return {\n parameters: [{ $ref: `#/components/parameters/${parsedResponse.rawType}` }],\n };\n }\n\n case \"security\": {\n const [security, scopeItem] = parsedResponse.name.split(\".\");\n\n let scope: string[] = [];\n\n if (scopeItem) {\n scope = [scopeItem];\n }\n\n return {\n security: { [security as string]: scope },\n };\n }\n\n default: {\n return {};\n }\n }\n });\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { loc: number; spec: OpenApiObject }[] => {\n // eslint-disable-next-line regexp/no-unused-capturing-group\n const openAPIRegex = /^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \\/.*$/;\n\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return jsDocumentComments\n .filter((comment) => openAPIRegex.test(comment.description.trim()))\n .map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n fixSecurityObject(result);\n\n const [method, path]: string[] = comment.description.split(\" \");\n\n const pathsObject: PathsObject = {\n [(path as string).trim()]: {\n [(method as string).toLowerCase().trim()]: {\n ...result,\n },\n },\n };\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify({ paths: pathsObject }));\n\n return {\n loc,\n spec,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","const yamlLoc = (string: string): number => {\n // Break string into lines.\n const split = string.split(/\\r\\n|\\r|\\n/u);\n\n const filtered = split.filter((line) => {\n // Remove comments.\n // eslint-disable-next-line security/detect-unsafe-regex,regexp/no-unused-capturing-group\n if (/^\\s*(#\\s*(?:\\S.*)?)?$/u.test(line)) {\n return false;\n }\n // Remove empty lines.\n return line.trim().length > 0;\n });\n\n return filtered.length;\n};\n\nexport default yamlLoc;\n","import { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nimport yaml from \"yaml\";\n\nimport type { OpenApiObject } from \"./exported\";\nimport yamlLoc from \"./util/yaml-loc\";\n\nconst ALLOWED_KEYS = new Set([\"openapi\", \"info\", \"servers\", \"security\", \"tags\", \"externalDocs\", \"components\", \"paths\"]);\n\nclass ParseError extends Error {\n public filePath?: string;\n}\n\nconst parseFile = (\n file: string,\n commentsToOpenApi: (fileContent: string, verbose?: boolean) => { loc: number; spec: OpenApiObject }[],\n verbose?: boolean,\n): { loc: number; spec: OpenApiObject }[] => {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n const fileContent = readFileSync(file, { encoding: \"utf8\" });\n const extension = path.extname(file);\n\n if (extension === \".yaml\" || extension === \".yml\") {\n const spec = yaml.parse(fileContent);\n const invalidKeys = Object.keys(spec).filter((key) => !ALLOWED_KEYS.has(key));\n\n if (invalidKeys.length > 0) {\n const error = new ParseError(`Unexpected keys: ${invalidKeys.join(\", \")}`);\n\n error.filePath = file;\n\n throw error;\n }\n\n if (Object.keys(spec).some((key) => ALLOWED_KEYS.has(key))) {\n const loc = yamlLoc(fileContent);\n\n return [{ loc, spec }];\n }\n\n return [];\n }\n\n try {\n return commentsToOpenApi(fileContent, verbose);\n } catch (error: any) {\n error.filePath = file;\n\n throw error;\n }\n};\n\nexport default parseFile;\n","const objectMerge = <T>(a: T, b: T): void => {\n Object.keys(b as object).forEach((key) => {\n if (a[key as keyof typeof b] === undefined) {\n // eslint-disable-next-line no-param-reassign\n a[key as keyof typeof b] = {\n ...b[key as keyof typeof b],\n };\n } else {\n Object.keys(b[key as keyof typeof b] as object).forEach((subKey) => {\n // eslint-disable-next-line no-param-reassign\n (a[key as keyof typeof b] as Record<string, object>)[subKey] = {\n ...(a[key as keyof typeof b] as Record<string, object>)[subKey],\n ...(b[key as keyof typeof b] as Record<string, object>)[subKey],\n };\n });\n }\n });\n};\n\nexport default objectMerge;\n","import type {\n BaseDefinition,\n ComponentsObject,\n ExternalDocumentationObject,\n InfoObject,\n OpenApiObject,\n PathsObject,\n SecurityRequirementObject,\n ServerObject,\n TagObject,\n} from \"./exported\";\nimport objectMerge from \"./util/object-merge\";\n\nclass SpecBuilder implements OpenApiObject {\n public components?: ComponentsObject;\n\n public externalDocs?: ExternalDocumentationObject;\n\n public info: InfoObject;\n\n public openapi: string;\n\n public paths: PathsObject;\n\n public security?: SecurityRequirementObject[];\n\n public servers?: ServerObject[];\n\n public tags?: TagObject[];\n\n public constructor(baseDefinition: BaseDefinition) {\n this.openapi = baseDefinition.openapi;\n this.info = baseDefinition.info;\n this.paths = baseDefinition.paths ?? {};\n\n if (baseDefinition.servers) {\n this.servers = baseDefinition.servers;\n }\n if (baseDefinition.components) {\n this.components = baseDefinition.components;\n }\n\n if (baseDefinition.security) {\n this.security = baseDefinition.security;\n }\n\n if (baseDefinition.tags) {\n this.tags = baseDefinition.tags;\n }\n\n if (baseDefinition.externalDocs) {\n this.externalDocs = baseDefinition.externalDocs;\n }\n }\n\n public addData(parsedFile: OpenApiObject[]): void {\n parsedFile.forEach((file) => {\n const { components, paths, ...rest } = file;\n\n // only merge paths and components\n objectMerge(this, {\n components: components ?? {},\n paths: paths ?? {},\n } as OpenApiObject);\n\n // overwrite everything else:\n Object.entries(rest).forEach(([key, value]) => {\n // @ts-expect-error\n this[key as keyof OpenApiObject] = value;\n });\n });\n }\n}\n\nexport default SpecBuilder;\n","import type { Spec } from \"comment-parser\";\n// eslint-disable-next-line no-restricted-imports\nimport mergeWith from \"lodash.mergewith\";\n\n/**\n * A recursive deep-merge that ignores null values when merging.\n * This returns the merged object and does not mutate.\n * @param {object} first the first object to get merged\n * @param {object} second the second object to get merged\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-return\nexport const mergeDeep = (first?: object, second?: object): object => mergeWith({}, first, second, (a, b) => (b === null ? a : undefined));\n\n/**\n * Checks if there is any properties of the input object which are an empty object\n * @param {object} object - the object to check\n * @returns boolean\n */\nexport const hasEmptyProperty = (object: Record<string, any>): boolean =>\n Object.keys(object)\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n .map((key) => object[key])\n .every((keyObject) => typeof keyObject === \"object\" && Object.keys(keyObject).every((key) => !(key in keyObject)));\n\n/**\n * @param {object} tag\n * @param {array} tags\n * @returns boolean\n */\nexport const isTagPresentInTags = (tag: Spec, tags: Spec[]): boolean => tags.some((targetTag) => tag.name === targetTag.name);\n\nexport const getSwaggerVersionFromSpec = (tag: Spec): \"v2\" | \"v3\" | \"v4\" => {\n switch (tag.tag) {\n case \"openapi\": {\n return \"v3\";\n }\n case \"asyncapi\": {\n return \"v4\";\n }\n case \"swagger\": {\n return \"v2\";\n }\n default: {\n return \"v2\";\n }\n }\n};\n","import { isTagPresentInTags, mergeDeep } from \"./utils\";\n\n/**\n * @param {object} swaggerObject\n * @param {object} annotation\n * @param {string} property\n */\n\nconst organizeSwaggerObject = (swaggerObject: Record<string, any>, annotation: Record<string, any>, property: string): void => {\n // Root property on purpose.\n // eslint-disable-next-line no-secrets/no-secrets\n // @see https://github.com/OAI/OpenAPI-Specification/blob/master/proposals/002_Webhooks.md#proposed-solution\n if (property === \"x-webhooks\") {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property] = annotation[property];\n }\n\n // Other extensions can be in varying places depending on different vendors and opinions.\n // The following return makes it so that they are not put in `paths` in the last case.\n // New specific extensions will need to be handled on case-by-case if to be included in `paths`.\n if (property.startsWith(\"x-\")) {\n return;\n }\n\n const commonProperties = [\n \"components\",\n \"consumes\",\n \"produces\",\n \"paths\",\n \"schemas\",\n \"securityDefinitions\",\n \"responses\",\n \"parameters\",\n \"definitions\",\n \"channels\",\n ];\n\n if (commonProperties.includes(property)) {\n Object.keys(annotation[property]).forEach((definition) => {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property][definition] = mergeDeep(swaggerObject[property][definition], annotation[property][definition]);\n });\n } else if (property === \"tags\") {\n const { tags } = annotation;\n\n if (Array.isArray(tags)) {\n tags.forEach((tag) => {\n if (!isTagPresentInTags(tag, swaggerObject.tags)) {\n swaggerObject.tags.push(tag);\n }\n });\n } else if (!isTagPresentInTags(tags, swaggerObject.tags)) {\n swaggerObject.tags.push(tags);\n }\n } else if (property === \"security\") {\n const { security } = annotation;\n\n // eslint-disable-next-line no-param-reassign\n swaggerObject.security = security;\n } else if (property.startsWith(\"/\")) {\n // Paths which are not defined as \"paths\" property, starting with a slash \"/\"\n // eslint-disable-next-line no-param-reassign\n swaggerObject.paths[property] = mergeDeep(swaggerObject.paths[property], annotation[property]);\n }\n};\n\nexport default organizeSwaggerObject;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\n// eslint-disable-next-line no-restricted-imports\nimport mergeWith from \"lodash.mergewith\";\nimport type { YAMLError } from \"yaml\";\nimport yaml from \"yaml\";\n\nimport type { OpenApiObject } from \"../exported\";\nimport customizer from \"../util/customizer\";\nimport organizeSwaggerObject from \"./organize-swagger-object\";\nimport { getSwaggerVersionFromSpec, hasEmptyProperty } from \"./utils\";\n\nconst specificationTemplate = {\n v2: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\"],\n v3: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\"],\n v4: [\"components\", \"channels\"],\n};\n\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\ntype ExtendedYAMLError = YAMLError & { annotation?: string };\n\nconst tagsToObjects = (specs: Spec[], verbose?: boolean) =>\n specs.map((spec: Spec) => {\n if ((spec.tag === \"openapi\" || spec.tag === \"swagger\" || spec.tag === \"asyncapi\") && spec.description !== \"\") {\n const parsed = yaml.parseDocument(spec.description);\n\n if (parsed.errors.length > 0) {\n parsed.errors.map<ExtendedYAMLError>((error) => {\n const newError: ExtendedYAMLError = error;\n\n newError.annotation = spec.description;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return newError as ExtendedYAMLError;\n });\n\n let errorString = \"Error parsing YAML in @openapi spec:\";\n\n errorString += verbose\n ? (parsed.errors as ExtendedYAMLError[])\n\n .map((error) => `${error.toString()}\\nImbedded within:\\n\\`\\`\\`\\n ${error.annotation?.replace(/\\n/gu, \"\\n \")}\\n\\`\\`\\``)\n .join(\"\\n\")\n : // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n parsed.errors.map((error) => error.toString()).join(\"\\n\");\n\n throw new Error(errorString);\n }\n\n const parsedDocument = parsed.toJSON();\n const specification: Record<string, any> = {\n tags: [],\n };\n\n specificationTemplate[getSwaggerVersionFromSpec(spec)].forEach((property) => {\n specification[property] = specification[property] || {};\n });\n\n Object.keys(parsedDocument).forEach((property) => {\n organizeSwaggerObject(specification, parsedDocument, property);\n });\n\n return specification;\n }\n\n return {};\n });\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { loc: number; spec: OpenApiObject }[] => {\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return jsDocumentComments.map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n [\"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\", \"tags\"].forEach((property) => {\n if (result[property] !== undefined && hasEmptyProperty(result[property])) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete result[property];\n }\n });\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify(result));\n\n return {\n loc,\n spec,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","// eslint-disable-next-line import/prefer-default-export\nexport const DEFAULT_EXCLUDE = [\n \"coverage/**\",\n \".github/**\",\n \"**/*.d.ts\",\n \"**/test{,s}/**\",\n \"**/test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}\",\n \"**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}\",\n \"**/__tests__/**\",\n \"**/{ava,babel,nyc}.config.{js,cjs,mjs}\",\n \"**/jest.config.{js,cjs,mjs,ts}\",\n \"**/{karma,rollup,webpack}.config.js\",\n \"**/.{eslint,mocha}rc.{js,cjs}\",\n \"**/.{travis,yarnrc}.yml\",\n \"**/{docker-compose,docker}.yml\",\n \"**/.yamllint.{yaml,yml}\",\n \"**/node_modules/**\",\n \"**/{pnpm-workspace,pnpm-lock}.yaml\",\n \"**/{package,package-lock}.json\",\n \"**/yarn.lock\",\n \"**/package.json5\",\n \"**/.next/**\",\n];\n","import SwaggerParser from \"@apidevtools/swagger-parser\";\n// eslint-disable-next-line import/no-named-as-default\nimport type OpenAPI from \"openapi-types\";\n\nconst validate = async (spec: Record<string, unknown>): Promise<void> => {\n await SwaggerParser.validate(spec as OpenAPI.OpenAPI.Document);\n};\n\nexport default validate;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/util/customizer.ts","../src/jsdoc/comments-to-open-api.ts","../src/util/yaml-loc.ts","../src/parse-file.ts","../src/util/object-merge.ts","../src/spec-builder.ts","../src/swagger-jsdoc/utils.ts","../src/swagger-jsdoc/organize-swagger-object.ts","../src/swagger-jsdoc/comments-to-open-api.ts","../src/constants.ts","../src/validate.ts"],"names":["customizer","objectValue","sourceValue","customizer_default","fixSecurityObject","thing","primitiveTypes","formatMap","parseDescription","tag","rawType","isArray","parsedType","isPrimitive","isFormat","defaultValue","rootType","schema","description","tagsToObjects","tags","verbose","parsedResponse","nameAndDescription","contentType","example","status","header","link","security","scopeItem","scope","commentsToOpenApi","fileContents","openAPIRegex","parseComments","comment","loc","result","mergeWith","method","path","pathsObject","spec","comments_to_open_api_default","yamlLoc","string","line","yaml_loc_default","ALLOWED_KEYS","ParseError","parseFile","file","fileContent","readFileSync","extension","yaml","invalidKeys","key","error","parse_file_default","objectMerge","a","b","subKey","object_merge_default","SpecBuilder","baseDefinition","parsedFile","components","paths","rest","value","spec_builder_default","mergeDeep","first","second","hasEmptyProperty","object","keyObject","isTagPresentInTags","targetTag","getSwaggerVersionFromSpec","organizeSwaggerObject","swaggerObject","annotation","property","definition","organize_swagger_object_default","specificationTemplate","specs","parsed","newError","errorString","parsedDocument","specification","DEFAULT_EXCLUDE","validate","SwaggerParser","validate_default"],"mappings":"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","file":"chunk-LIBKIIBP.mjs","sourcesContent":["const customizer = (objectValue: unknown, sourceValue: unknown[]): unknown[] | undefined => {\n if (Array.isArray(objectValue)) {\n return [...objectValue, ...sourceValue] as unknown[];\n }\n\n return undefined;\n};\n\nexport default customizer;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\n// eslint-disable-next-line no-restricted-imports\nimport mergeWith from \"lodash.mergewith\";\n\nimport type { OpenApiObject, PathsObject } from \"../exported\";\nimport customizer from \"../util/customizer\";\n\n// The security object has a bizare setup...\nconst fixSecurityObject = (thing: any) => {\n if (thing.security) {\n // eslint-disable-next-line no-param-reassign\n thing.security = Object.keys(thing.security).map((s) => {\n return {\n [s]: thing.security[s],\n };\n });\n }\n};\n\nconst primitiveTypes = new Set([\"integer\", \"number\", \"string\", \"boolean\", \"object\", \"array\"]);\n\nconst formatMap: Record<string, string> = {\n binary: \"string\",\n byte: \"string\",\n date: \"string\",\n \"date-time\": \"string\",\n double: \"number\",\n float: \"number\",\n int32: \"integer\",\n int64: \"integer\",\n password: \"string\",\n};\n\nconst parseDescription = (tag: Spec): { description: string | undefined; name: string; rawType: string; required: boolean; schema: object | undefined } => {\n const rawType = tag.type;\n const isArray = rawType.endsWith(\"[]\");\n // eslint-disable-next-line regexp/strict\n const parsedType = rawType.replace(/\\[]$/, \"\");\n\n const isPrimitive = primitiveTypes.has(parsedType);\n const isFormat = Object.keys(formatMap).includes(parsedType);\n\n let defaultValue;\n\n if (tag.default) {\n switch (parsedType) {\n case \"integer\":\n case \"int32\":\n case \"int64\": {\n defaultValue = Number.parseInt(tag.default, 10);\n break;\n }\n case \"number\":\n case \"double\":\n case \"float\": {\n defaultValue = Number.parseFloat(tag.default);\n break;\n }\n default: {\n defaultValue = tag.default;\n break;\n }\n }\n }\n\n let rootType;\n\n if (isPrimitive) {\n rootType = { default: defaultValue, type: parsedType };\n } else if (isFormat) {\n rootType = {\n default: defaultValue,\n format: parsedType,\n type: formatMap[parsedType],\n };\n } else {\n rootType = { $ref: `#/components/schemas/${parsedType}` };\n }\n\n let schema: object | undefined = isArray\n ? {\n items: {\n ...rootType,\n },\n type: \"array\",\n }\n : {\n ...rootType,\n };\n\n if (parsedType === \"\") {\n schema = undefined;\n }\n\n // remove the optional dash from the description.\n let description: string | undefined = tag.description.trim().replace(/^- /u, \"\");\n\n if (description === \"\") {\n description = undefined;\n }\n\n return {\n description,\n name: tag.name,\n rawType,\n required: !tag.optional,\n schema,\n };\n};\n\n// @ts-expect-error\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst tagsToObjects = (tags: Spec[], verbose?: boolean) =>\n tags.map((tag) => {\n const parsedResponse = parseDescription(tag);\n\n // Some ops only have a `description`, merge `name` and `description`\n // for these.\n let nameAndDescription = \"\";\n\n if (parsedResponse.name) {\n nameAndDescription += parsedResponse.name;\n }\n\n if (parsedResponse.description) {\n nameAndDescription += ` ${parsedResponse.description.trim()}`;\n }\n\n switch (tag.tag) {\n case \"operationId\":\n case \"summary\":\n case \"description\": {\n return { [tag.tag]: nameAndDescription };\n }\n\n case \"deprecated\": {\n return { deprecated: true };\n }\n\n case \"externalDocs\": {\n return {\n externalDocs: {\n description: parsedResponse.description,\n url: parsedResponse.name,\n },\n };\n }\n\n case \"server\": {\n return {\n servers: [\n {\n description: parsedResponse.description,\n url: parsedResponse.name,\n },\n ],\n };\n }\n\n case \"tag\": {\n return { tags: [nameAndDescription] };\n }\n\n case \"cookieParam\":\n case \"headerParam\":\n case \"queryParam\":\n case \"pathParam\": {\n return {\n parameters: [\n {\n description: parsedResponse.description,\n in: tag.tag.replace(/Param$/u, \"\"),\n name: parsedResponse.name,\n required: parsedResponse.required,\n schema: parsedResponse.schema,\n },\n ],\n };\n }\n\n case \"bodyContent\": {\n return {\n requestBody: {\n content: {\n [parsedResponse.name.replace(\"*\\\\/*\", \"*/*\")]: {\n schema: parsedResponse.schema,\n },\n },\n },\n };\n }\n\n case \"bodyExample\": {\n const [contentType, example] = parsedResponse.name.split(\".\");\n\n return {\n requestBody: {\n content: {\n [contentType as string]: {\n examples: {\n [example as string]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n };\n }\n\n case \"bodyDescription\": {\n return { requestBody: { description: nameAndDescription } };\n }\n\n case \"bodyRequired\": {\n return { requestBody: { required: true } };\n }\n\n case \"response\": {\n return {\n responses: {\n [parsedResponse.name]: {\n description: parsedResponse.description,\n },\n },\n };\n }\n\n case \"callback\": {\n return {\n callbacks: {\n [parsedResponse.name]: {\n $ref: `#/components/callbacks/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"responseContent\": {\n const [status, contentType] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n content: {\n [contentType as string]: {\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeaderComponent\": {\n const [status, header] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n headers: {\n [header as string]: {\n $ref: `#/components/headers/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeader\": {\n const [status, header] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n headers: {\n [header as string]: {\n description: parsedResponse.description,\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseExample\": {\n const [status, contentType, example] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n content: {\n [contentType as string]: {\n examples: {\n [example as string]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n },\n };\n }\n\n case \"responseLink\": {\n const [status, link] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status as string]: {\n links: {\n [link as string]: {\n $ref: `#/components/links/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"bodyComponent\": {\n return {\n requestBody: {\n $ref: `#/components/requestBodies/${parsedResponse.rawType}`,\n },\n };\n }\n\n case \"responseComponent\": {\n return {\n responses: {\n [parsedResponse.name]: {\n $ref: `#/components/responses/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"paramComponent\": {\n return {\n parameters: [{ $ref: `#/components/parameters/${parsedResponse.rawType}` }],\n };\n }\n\n case \"security\": {\n const [security, scopeItem] = parsedResponse.name.split(\".\");\n\n let scope: string[] = [];\n\n if (scopeItem) {\n scope = [scopeItem];\n }\n\n return {\n security: { [security as string]: scope },\n };\n }\n\n default: {\n return {};\n }\n }\n });\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { loc: number; spec: OpenApiObject }[] => {\n // eslint-disable-next-line regexp/no-unused-capturing-group\n const openAPIRegex = /^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \\/.*$/;\n\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return jsDocumentComments\n .filter((comment) => openAPIRegex.test(comment.description.trim()))\n .map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n fixSecurityObject(result);\n\n const [method, path]: string[] = comment.description.split(\" \");\n\n const pathsObject: PathsObject = {\n [(path as string).trim()]: {\n [(method as string).toLowerCase().trim()]: {\n ...result,\n },\n },\n };\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify({ paths: pathsObject }));\n\n return {\n loc,\n spec,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","const yamlLoc = (string: string): number => {\n // Break string into lines.\n const split = string.split(/\\r\\n|\\r|\\n/u);\n\n const filtered = split.filter((line) => {\n // Remove comments.\n // eslint-disable-next-line security/detect-unsafe-regex,regexp/no-unused-capturing-group\n if (/^\\s*(#\\s*(?:\\S.*)?)?$/u.test(line)) {\n return false;\n }\n // Remove empty lines.\n return line.trim().length > 0;\n });\n\n return filtered.length;\n};\n\nexport default yamlLoc;\n","import { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nimport yaml from \"yaml\";\n\nimport type { OpenApiObject } from \"./exported\";\nimport yamlLoc from \"./util/yaml-loc\";\n\nconst ALLOWED_KEYS = new Set([\"openapi\", \"info\", \"servers\", \"security\", \"tags\", \"externalDocs\", \"components\", \"paths\"]);\n\nclass ParseError extends Error {\n public filePath?: string;\n}\n\nconst parseFile = (\n file: string,\n commentsToOpenApi: (fileContent: string, verbose?: boolean) => { loc: number; spec: OpenApiObject }[],\n verbose?: boolean,\n): { loc: number; spec: OpenApiObject }[] => {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n const fileContent = readFileSync(file, { encoding: \"utf8\" });\n const extension = path.extname(file);\n\n if (extension === \".yaml\" || extension === \".yml\") {\n const spec = yaml.parse(fileContent);\n const invalidKeys = Object.keys(spec).filter((key) => !ALLOWED_KEYS.has(key));\n\n if (invalidKeys.length > 0) {\n const error = new ParseError(`Unexpected keys: ${invalidKeys.join(\", \")}`);\n\n error.filePath = file;\n\n throw error;\n }\n\n if (Object.keys(spec).some((key) => ALLOWED_KEYS.has(key))) {\n const loc = yamlLoc(fileContent);\n\n return [{ loc, spec }];\n }\n\n return [];\n }\n\n try {\n return commentsToOpenApi(fileContent, verbose);\n } catch (error: any) {\n error.filePath = file;\n\n throw error;\n }\n};\n\nexport default parseFile;\n","const objectMerge = <T>(a: T, b: T): void => {\n Object.keys(b as object).forEach((key) => {\n if (a[key as keyof typeof b] === undefined) {\n // eslint-disable-next-line no-param-reassign\n a[key as keyof typeof b] = {\n ...b[key as keyof typeof b],\n };\n } else {\n Object.keys(b[key as keyof typeof b] as object).forEach((subKey) => {\n // eslint-disable-next-line no-param-reassign\n (a[key as keyof typeof b] as Record<string, object>)[subKey] = {\n ...(a[key as keyof typeof b] as Record<string, object>)[subKey],\n ...(b[key as keyof typeof b] as Record<string, object>)[subKey],\n };\n });\n }\n });\n};\n\nexport default objectMerge;\n","import type {\n BaseDefinition,\n ComponentsObject,\n ExternalDocumentationObject,\n InfoObject,\n OpenApiObject,\n PathsObject,\n SecurityRequirementObject,\n ServerObject,\n TagObject,\n} from \"./exported\";\nimport objectMerge from \"./util/object-merge\";\n\nclass SpecBuilder implements OpenApiObject {\n public components?: ComponentsObject;\n\n public externalDocs?: ExternalDocumentationObject;\n\n public info: InfoObject;\n\n public openapi: string;\n\n public paths: PathsObject;\n\n public security?: SecurityRequirementObject[];\n\n public servers?: ServerObject[];\n\n public tags?: TagObject[];\n\n public constructor(baseDefinition: BaseDefinition) {\n this.openapi = baseDefinition.openapi;\n this.info = baseDefinition.info;\n this.paths = baseDefinition.paths ?? {};\n\n if (baseDefinition.servers) {\n this.servers = baseDefinition.servers;\n }\n if (baseDefinition.components) {\n this.components = baseDefinition.components;\n }\n\n if (baseDefinition.security) {\n this.security = baseDefinition.security;\n }\n\n if (baseDefinition.tags) {\n this.tags = baseDefinition.tags;\n }\n\n if (baseDefinition.externalDocs) {\n this.externalDocs = baseDefinition.externalDocs;\n }\n }\n\n public addData(parsedFile: OpenApiObject[]): void {\n parsedFile.forEach((file) => {\n const { components, paths, ...rest } = file;\n\n // only merge paths and components\n objectMerge(this, {\n components: components ?? {},\n paths: paths ?? {},\n } as OpenApiObject);\n\n // overwrite everything else:\n Object.entries(rest).forEach(([key, value]) => {\n // @ts-expect-error\n this[key as keyof OpenApiObject] = value;\n });\n });\n }\n}\n\nexport default SpecBuilder;\n","import type { Spec } from \"comment-parser\";\n// eslint-disable-next-line no-restricted-imports\nimport mergeWith from \"lodash.mergewith\";\n\n/**\n * A recursive deep-merge that ignores null values when merging.\n * This returns the merged object and does not mutate.\n * @param {object} first the first object to get merged\n * @param {object} second the second object to get merged\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-return\nexport const mergeDeep = (first?: object, second?: object): object => mergeWith({}, first, second, (a, b) => (b === null ? a : undefined));\n\n/**\n * Checks if there is any properties of the input object which are an empty object\n * @param {object} object - the object to check\n * @returns boolean\n */\nexport const hasEmptyProperty = (object: Record<string, any>): boolean =>\n Object.keys(object)\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n .map((key) => object[key])\n .every((keyObject) => typeof keyObject === \"object\" && Object.keys(keyObject).every((key) => !(key in keyObject)));\n\n/**\n * @param {object} tag\n * @param {array} tags\n * @returns boolean\n */\nexport const isTagPresentInTags = (tag: Spec, tags: Spec[]): boolean => tags.some((targetTag) => tag.name === targetTag.name);\n\nexport const getSwaggerVersionFromSpec = (tag: Spec): \"v2\" | \"v3\" | \"v4\" => {\n switch (tag.tag) {\n case \"openapi\": {\n return \"v3\";\n }\n case \"asyncapi\": {\n return \"v4\";\n }\n case \"swagger\": {\n return \"v2\";\n }\n default: {\n return \"v2\";\n }\n }\n};\n","import { isTagPresentInTags, mergeDeep } from \"./utils\";\n\n/**\n * @param {object} swaggerObject\n * @param {object} annotation\n * @param {string} property\n */\n\nconst organizeSwaggerObject = (swaggerObject: Record<string, any>, annotation: Record<string, any>, property: string): void => {\n // Root property on purpose.\n // eslint-disable-next-line no-secrets/no-secrets\n // @see https://github.com/OAI/OpenAPI-Specification/blob/master/proposals/002_Webhooks.md#proposed-solution\n if (property === \"x-webhooks\") {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property] = annotation[property];\n }\n\n // Other extensions can be in varying places depending on different vendors and opinions.\n // The following return makes it so that they are not put in `paths` in the last case.\n // New specific extensions will need to be handled on case-by-case if to be included in `paths`.\n if (property.startsWith(\"x-\")) {\n return;\n }\n\n const commonProperties = [\n \"components\",\n \"consumes\",\n \"produces\",\n \"paths\",\n \"schemas\",\n \"securityDefinitions\",\n \"responses\",\n \"parameters\",\n \"definitions\",\n \"channels\",\n ];\n\n if (commonProperties.includes(property)) {\n Object.keys(annotation[property]).forEach((definition) => {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property][definition] = mergeDeep(swaggerObject[property][definition], annotation[property][definition]);\n });\n } else if (property === \"tags\") {\n const { tags } = annotation;\n\n if (Array.isArray(tags)) {\n tags.forEach((tag) => {\n if (!isTagPresentInTags(tag, swaggerObject.tags)) {\n swaggerObject.tags.push(tag);\n }\n });\n } else if (!isTagPresentInTags(tags, swaggerObject.tags)) {\n swaggerObject.tags.push(tags);\n }\n } else if (property === \"security\") {\n const { security } = annotation;\n\n // eslint-disable-next-line no-param-reassign\n swaggerObject.security = security;\n } else if (property.startsWith(\"/\")) {\n // Paths which are not defined as \"paths\" property, starting with a slash \"/\"\n // eslint-disable-next-line no-param-reassign\n swaggerObject.paths[property] = mergeDeep(swaggerObject.paths[property], annotation[property]);\n }\n};\n\nexport default organizeSwaggerObject;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\n// eslint-disable-next-line no-restricted-imports\nimport mergeWith from \"lodash.mergewith\";\nimport type { YAMLError } from \"yaml\";\nimport yaml from \"yaml\";\n\nimport type { OpenApiObject } from \"../exported\";\nimport customizer from \"../util/customizer\";\nimport organizeSwaggerObject from \"./organize-swagger-object\";\nimport { getSwaggerVersionFromSpec, hasEmptyProperty } from \"./utils\";\n\nconst specificationTemplate = {\n v2: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\"],\n v3: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\"],\n v4: [\"components\", \"channels\"],\n};\n\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\ntype ExtendedYAMLError = YAMLError & { annotation?: string };\n\nconst tagsToObjects = (specs: Spec[], verbose?: boolean) =>\n specs.map((spec: Spec) => {\n if ((spec.tag === \"openapi\" || spec.tag === \"swagger\" || spec.tag === \"asyncapi\") && spec.description !== \"\") {\n const parsed = yaml.parseDocument(spec.description);\n\n if (parsed.errors.length > 0) {\n parsed.errors.map<ExtendedYAMLError>((error) => {\n const newError: ExtendedYAMLError = error;\n\n newError.annotation = spec.description;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return newError as ExtendedYAMLError;\n });\n\n let errorString = \"Error parsing YAML in @openapi spec:\";\n\n errorString += verbose\n ? (parsed.errors as ExtendedYAMLError[])\n\n .map((error) => `${error.toString()}\\nImbedded within:\\n\\`\\`\\`\\n ${error.annotation?.replace(/\\n/gu, \"\\n \")}\\n\\`\\`\\``)\n .join(\"\\n\")\n : // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n parsed.errors.map((error) => error.toString()).join(\"\\n\");\n\n throw new Error(errorString);\n }\n\n const parsedDocument = parsed.toJSON();\n const specification: Record<string, any> = {\n tags: [],\n };\n\n specificationTemplate[getSwaggerVersionFromSpec(spec)].forEach((property) => {\n specification[property] = specification[property] || {};\n });\n\n Object.keys(parsedDocument).forEach((property) => {\n organizeSwaggerObject(specification, parsedDocument, property);\n });\n\n return specification;\n }\n\n return {};\n });\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { loc: number; spec: OpenApiObject }[] => {\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return jsDocumentComments.map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n [\"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\", \"tags\"].forEach((property) => {\n if (result[property] !== undefined && hasEmptyProperty(result[property])) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete result[property];\n }\n });\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify(result));\n\n return {\n loc,\n spec,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","// eslint-disable-next-line import/prefer-default-export\nexport const DEFAULT_EXCLUDE = [\n \"coverage/**\",\n \".github/**\",\n \"**/*.d.ts\",\n \"**/test{,s}/**\",\n \"**/test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}\",\n \"**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}\",\n \"**/__tests__/**\",\n \"**/{ava,babel,nyc}.config.{js,cjs,mjs}\",\n \"**/jest.config.{js,cjs,mjs,ts}\",\n \"**/{karma,rollup,webpack}.config.js\",\n \"**/.{eslint,mocha}rc.{js,cjs}\",\n \"**/.{travis,yarnrc}.yml\",\n \"**/{docker-compose,docker}.yml\",\n \"**/.yamllint.{yaml,yml}\",\n \"**/node_modules/**\",\n \"**/{pnpm-workspace,pnpm-lock}.yaml\",\n \"**/{package,package-lock}.json\",\n \"**/yarn.lock\",\n \"**/package.json5\",\n \"**/.next/**\",\n];\n","import SwaggerParser from \"@apidevtools/swagger-parser\";\n// eslint-disable-next-line import/no-named-as-default\nimport type OpenAPI from \"openapi-types\";\n\nconst validate = async (spec: Record<string, unknown>): Promise<void> => {\n await SwaggerParser.validate(spec as OpenAPI.OpenAPI.Document);\n};\n\nexport default validate;\n"]}
|