@visulima/jsdoc-open-api 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## @visulima/jsdoc-open-api [1.0.2](https://github.com/visulima/visulima/compare/@visulima/jsdoc-open-api@1.0.1...@visulima/jsdoc-open-api@1.0.2) (2022-10-27)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **jsdoc-open-api:** fixed found errors with empty data, writing swagger file to a not existing folder, added more error returns ([8cef566](https://github.com/visulima/visulima/commit/8cef566b998d37a5c0f5c32acabf8e336510ec81))
7
+ * **jsdoc-open-api:** fixed wrong options for minimatchOptions and added default exclude for the webpack plugin ([e6cba73](https://github.com/visulima/visulima/commit/e6cba73a5add43042249e0caff0d6d605f694274))
8
+
1
9
  ## @visulima/jsdoc-open-api [1.0.1](https://github.com/visulima/visulima/compare/@visulima/jsdoc-open-api@1.0.0...@visulima/jsdoc-open-api@1.0.1) (2022-10-26)
2
10
 
3
11
 
package/bin/index.js CHANGED
@@ -4,6 +4,8 @@ const path = require("node:path");
4
4
  // eslint-disable-next-line unicorn/prefer-module
5
5
  const fs = require("node:fs");
6
6
  // eslint-disable-next-line unicorn/prefer-module
7
+ const { exit } = require("node:process");
8
+ // eslint-disable-next-line unicorn/prefer-module
7
9
  const { Command } = require("commander");
8
10
  // eslint-disable-next-line unicorn/prefer-module
9
11
  const SwaggerParser = require("@apidevtools/swagger-parser");
@@ -13,8 +15,11 @@ const { collect } = require("@visulima/readdir");
13
15
  const cliProgress = require("cli-progress");
14
16
 
15
17
  const {
16
- jsDocumentCommentsToOpenApi, parseFile, SpecBuilder, swaggerJsDocumentCommentsToOpenApi,
17
- // eslint-disable-next-line unicorn/prefer-module
18
+ jsDocumentCommentsToOpenApi,
19
+ parseFile,
20
+ SpecBuilder,
21
+ swaggerJsDocumentCommentsToOpenApi,
22
+ // eslint-disable-next-line unicorn/prefer-module
18
23
  } = require("../dist/index.js");
19
24
 
20
25
  // eslint-disable-next-line unicorn/prefer-module,no-underscore-dangle
@@ -32,8 +37,7 @@ program
32
37
  if (fs.existsSync(defaultConfigName)) {
33
38
  // eslint-disable-next-line no-console
34
39
  console.error("Config file already exists");
35
- // eslint-disable-next-line no-undef
36
- process.exit(1);
40
+ exit(1);
37
41
  }
38
42
 
39
43
  fs.writeFileSync(
@@ -58,9 +62,8 @@ program
58
62
  '**/node_modules/**',
59
63
  '**/pnpm-lock.yaml',
60
64
  '**/pnpm-workspace.yaml',
61
- '**/package-lock.json',
65
+ '**/{package,package-lock}.json',
62
66
  '**/yarn.lock',
63
- '**/package.json',
64
67
  '**/package.json5',
65
68
  '**/.next/**',
66
69
  ],
@@ -101,8 +104,7 @@ program
101
104
  console.log("No config file found, on:", options.config || ".openapirc.js\n");
102
105
  // eslint-disable-next-line no-console
103
106
  console.error(error);
104
- // eslint-disable-next-line no-undef
105
- process.exit(1);
107
+ exit(1);
106
108
  }
107
109
 
108
110
  const multibar = new cliProgress.MultiBar(
@@ -117,6 +119,9 @@ program
117
119
 
118
120
  // eslint-disable-next-line no-restricted-syntax,unicorn/prevent-abbreviations
119
121
  for await (const dir of paths) {
122
+ // Check if the path is a directory
123
+ fs.lstatSync(dir).isDirectory();
124
+
120
125
  const files = await collect(dir, {
121
126
  // eslint-disable-next-line @rushstack/security/no-unsafe-regexp
122
127
  skip: [...openapiConfig.exclude, "node_modules/**"],
@@ -124,8 +129,14 @@ program
124
129
  followSymlinks: openapiConfig.followSymlinks || false,
125
130
  match: openapiConfig.include,
126
131
  minimatchOptions: {
127
- debug: options.verbose,
128
- matchBase: true,
132
+ match: {
133
+ debug: options.verbose,
134
+ matchBase: true,
135
+ },
136
+ skip: {
137
+ debug: options.verbose,
138
+ matchBase: true,
139
+ },
129
140
  },
130
141
  });
131
142
 
@@ -149,30 +160,65 @@ program
149
160
 
150
161
  bar.increment(1, { filename: dir });
151
162
 
152
- const parsedJsDocumentFile = parseFile(file, jsDocumentCommentsToOpenApi, this.verbose);
163
+ try {
164
+ const parsedJsDocumentFile = parseFile(file, jsDocumentCommentsToOpenApi, this.verbose);
153
165
 
154
- spec.addData(parsedJsDocumentFile.map((item) => item.spec));
166
+ spec.addData(parsedJsDocumentFile.map((item) => item.spec));
155
167
 
156
- const parsedSwaggerJsDocumentFile = parseFile(file, swaggerJsDocumentCommentsToOpenApi, this.verbose);
168
+ const parsedSwaggerJsDocumentFile = parseFile(file, swaggerJsDocumentCommentsToOpenApi, this.verbose);
157
169
 
158
- spec.addData(parsedSwaggerJsDocumentFile.map((item) => item.spec));
170
+ spec.addData(parsedSwaggerJsDocumentFile.map((item) => item.spec));
171
+ } catch (error) {
172
+ // eslint-disable-next-line no-console
173
+ console.error(error);
174
+ exit(1);
175
+ }
159
176
  });
160
177
  }
161
178
 
162
179
  try {
180
+ if (options.verbose) {
181
+ // eslint-disable-next-line no-console
182
+ console.log("Validating swagger spec");
183
+ }
184
+
185
+ if (options.veryVerbose) {
186
+ // eslint-disable-next-line no-console
187
+ console.log(JSON.stringify(spec, null, 2));
188
+ }
189
+
163
190
  await SwaggerParser.validate(JSON.parse(JSON.stringify(spec)));
164
191
  } catch (error) {
165
192
  // eslint-disable-next-line no-console
166
193
  console.error(error.toJSON());
167
- // eslint-disable-next-line no-undef
168
- process.exit();
194
+ exit(1);
169
195
  }
170
196
 
171
197
  const output = options.output || "swagger.json";
172
198
 
173
199
  multibar.stop();
174
200
 
175
- fs.writeFileSync(output, JSON.stringify(spec, null, 2));
201
+ if (options.verbose) {
202
+ // eslint-disable-next-line no-console
203
+ console.log(`Written swagger spec to "${output}" file`);
204
+ }
205
+
206
+ const errorHandler = (error) => {
207
+ if (error) {
208
+ // eslint-disable-next-line no-console
209
+ console.error(error);
210
+ exit(1);
211
+ }
212
+ };
213
+
214
+ // eslint-disable-next-line consistent-return
215
+ fs.mkdir(path.dirname(output), { recursive: true }, (error) => {
216
+ if (error) {
217
+ errorHandler(error);
218
+ }
219
+
220
+ fs.writeFile(output, JSON.stringify(spec, null, 2), errorHandler);
221
+ });
176
222
 
177
223
  // eslint-disable-next-line no-console
178
224
  console.log(`\nSwagger specification is ready, check the${output}file.`);
@@ -183,6 +229,5 @@ program.parse(process.argv);
183
229
  // eslint-disable-next-line no-undef
184
230
  if (process.argv.slice(2).length === 0) {
185
231
  program.help();
186
- // eslint-disable-next-line no-undef
187
- process.exit();
232
+ exit(1);
188
233
  }
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Configuration } from 'webpack';
1
+ import { Compiler } from 'webpack';
2
2
 
3
3
  interface BaseDefinition {
4
4
  openapi: string;
@@ -281,13 +281,13 @@ declare class SwaggerCompilerPlugin {
281
281
  private readonly swaggerDefinition;
282
282
  private readonly sources;
283
283
  private readonly verbose;
284
- private ignore;
284
+ private readonly ignore;
285
285
  assetsPath: string;
286
286
  constructor(assetsPath: string, sources: string[], swaggerDefinition: BaseDefinition, options: {
287
287
  verbose?: boolean;
288
288
  ignore?: string | ReadonlyArray<string>;
289
289
  });
290
- apply(compiler: Configuration): void;
290
+ apply(compiler: Compiler): void;
291
291
  }
292
292
 
293
293
  declare const commentsToOpenApi$1: (fileContents: string, verbose?: boolean) => {
package/dist/index.js CHANGED
@@ -33,8 +33,8 @@ var SpecBuilder = class {
33
33
  parsedFile.forEach((file) => {
34
34
  const { paths, components, ...rest } = file;
35
35
  object_merge_default(this, {
36
- paths,
37
- components
36
+ paths: paths || {},
37
+ components: components || {}
38
38
  });
39
39
  Object.entries(rest).forEach(([key, value]) => {
40
40
  this[key] = value;
@@ -95,7 +95,8 @@ var parse_file_default = parseFile;
95
95
  // src/webpack/swagger-compiler-plugin.ts
96
96
  var _swaggerparser = require('@apidevtools/swagger-parser'); var _swaggerparser2 = _interopRequireDefault(_swaggerparser);
97
97
  var _readdir = require('@visulima/readdir');
98
- var _debug2 = require('debug'); var _debug3 = _interopRequireDefault(_debug2);
98
+
99
+
99
100
  var _process = require('process');
100
101
 
101
102
  // src/jsdoc/comments-to-open-api.ts
@@ -572,7 +573,36 @@ var commentsToOpenApi2 = (fileContents, verbose) => {
572
573
  var comments_to_open_api_default2 = commentsToOpenApi2;
573
574
 
574
575
  // src/webpack/swagger-compiler-plugin.ts
575
- var debug = _debug3.default.call(void 0, "visulima:jsdoc-open-api:swagger-compiler-plugin");
576
+ var exclude = [
577
+ "coverage/**",
578
+ ".github/**",
579
+ "packages/*/test{,s}/**",
580
+ "**/*.d.ts",
581
+ "test{,s}/**",
582
+ "test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}",
583
+ "**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}",
584
+ "**/__tests__/**",
585
+ "**/{ava,babel,nyc}.config.{js,cjs,mjs}",
586
+ "**/jest.config.{js,cjs,mjs,ts}",
587
+ "**/{karma,rollup,webpack}.config.js",
588
+ "**/.{eslint,mocha}rc.{js,cjs}",
589
+ "**/.{travis,yarnrc}.yml",
590
+ "**/{docker-compose,docker}.yml",
591
+ "**/.yamllint.{yaml,yml}",
592
+ "**/node_modules/**",
593
+ "**/pnpm-lock.yaml",
594
+ "**/pnpm-workspace.yaml",
595
+ "**/{package,package-lock}.json",
596
+ "**/yarn.lock",
597
+ "**/package.json5",
598
+ "**/.next/**"
599
+ ];
600
+ var errorHandler = (error) => {
601
+ if (error) {
602
+ console.error(error);
603
+ _process.exit.call(void 0, 1);
604
+ }
605
+ };
576
606
  var SwaggerCompilerPlugin = class {
577
607
  constructor(assetsPath, sources, swaggerDefinition, options) {
578
608
  this.assetsPath = assetsPath;
@@ -582,40 +612,63 @@ var SwaggerCompilerPlugin = class {
582
612
  this.ignore = options.ignore || [];
583
613
  }
584
614
  apply(compiler) {
585
- compiler.hooks.make.tapAsync("SwaggerCompilerPlugin", async (compilation, callback) => {
586
- console.log("Build paused");
587
- console.log("switching to swagger build");
615
+ compiler.hooks.make.tapAsync("SwaggerCompilerPlugin", async (_, callback) => {
616
+ console.log("Build paused, switching to swagger build");
588
617
  const spec = new spec_builder_default(this.swaggerDefinition);
589
618
  for await (const dir of this.sources) {
590
619
  const files = await _readdir.collect.call(void 0, dir, {
591
- skip: [...this.ignore, "node_modules/**"]
620
+ skip: [...this.ignore, ...exclude],
621
+ extensions: [".js", ".cjs", ".mjs", ".ts", ".tsx", ".jsx", ".yaml", ".yml"],
622
+ minimatchOptions: {
623
+ match: {
624
+ debug: this.verbose,
625
+ matchBase: true
626
+ },
627
+ skip: {
628
+ debug: this.verbose,
629
+ matchBase: true
630
+ }
631
+ }
592
632
  });
593
633
  if (this.verbose) {
594
634
  console.log(`Found ${files.length} files in ${dir}`);
595
635
  console.log(files);
596
636
  }
597
637
  files.forEach((file) => {
598
- debug(`Parsing file ${file}`);
599
- const parsedJsDocumentFile = parse_file_default(file, comments_to_open_api_default, this.verbose);
600
- spec.addData(parsedJsDocumentFile.map((item) => item.spec));
601
- const parsedSwaggerJsDocumentFile = parse_file_default(file, comments_to_open_api_default2, this.verbose);
602
- spec.addData(parsedSwaggerJsDocumentFile.map((item) => item.spec));
638
+ if (this.verbose) {
639
+ console.log(`Parsing file ${file}`);
640
+ }
641
+ try {
642
+ const parsedJsDocumentFile = parse_file_default(file, comments_to_open_api_default, this.verbose);
643
+ spec.addData(parsedJsDocumentFile.map((item) => item.spec));
644
+ const parsedSwaggerJsDocumentFile = parse_file_default(file, comments_to_open_api_default2, this.verbose);
645
+ spec.addData(parsedSwaggerJsDocumentFile.map((item) => item.spec));
646
+ } catch (error) {
647
+ console.error(error);
648
+ _process.exit.call(void 0, 1);
649
+ }
603
650
  });
604
651
  }
605
652
  try {
653
+ if (this.verbose) {
654
+ console.log("Validating swagger spec");
655
+ console.log(JSON.stringify(spec, null, 2));
656
+ }
606
657
  await _swaggerparser2.default.validate(JSON.parse(JSON.stringify(spec)));
607
658
  } catch (error) {
608
659
  console.error(error.toJSON());
609
660
  _process.exit.call(void 0, 1);
610
661
  }
611
- compilation.assets[this.assetsPath] = {
612
- source() {
613
- return JSON.stringify(spec, null, 2);
614
- },
615
- size() {
616
- return Object.keys(spec).length;
662
+ const { assetsPath } = this;
663
+ _fs2.default.mkdir(_path.dirname.call(void 0, assetsPath), { recursive: true }, (error) => {
664
+ if (error) {
665
+ errorHandler(error);
617
666
  }
618
- };
667
+ _fs2.default.writeFile(assetsPath, JSON.stringify(spec, null, 2), errorHandler);
668
+ });
669
+ if (this.verbose) {
670
+ console.log(`Written swagger spec to "${this.assetsPath}" file`);
671
+ }
619
672
  console.log("switching back to normal build");
620
673
  callback();
621
674
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/util/object-merge.ts","../src/spec-builder.ts","../src/parse-file.ts","../src/util/yaml-loc.ts","../src/webpack/swagger-compiler-plugin.ts","../src/jsdoc/comments-to-open-api.ts","../src/util/customizer.ts","../src/swagger-jsdoc/comments-to-open-api.ts","../src/swagger-jsdoc/utils.ts","../src/swagger-jsdoc/organize-swagger-object.ts"],"names":["commentsToOpenApi","path","parseComments","mergeWith","yaml","tagsToObjects","comments_to_open_api_default"],"mappings":"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","sourcesContent":["function objectMerge<T>(a: T, b: T) {\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 { [key: string]: object })[subKey] = {\n ...(a[key as keyof typeof b] as { [key: string]: object })[subKey],\n ...(b[key as keyof typeof b] as { [key: string]: object })[subKey],\n };\n });\n }\n });\n}\n\nexport default objectMerge;\n","import {\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 openapi: string;\n\n info: InfoObject;\n\n servers?: ServerObject[];\n\n paths: PathsObject;\n\n components?: ComponentsObject;\n\n security?: SecurityRequirementObject[];\n\n tags?: TagObject[];\n\n externalDocs?: ExternalDocumentationObject;\n\n constructor(baseDefinition: BaseDefinition) {\n this.openapi = baseDefinition.openapi;\n this.info = baseDefinition.info;\n this.servers = baseDefinition.servers;\n this.paths = baseDefinition.paths || {};\n this.components = baseDefinition.components;\n this.security = baseDefinition.security;\n this.tags = baseDefinition.tags;\n this.externalDocs = baseDefinition.externalDocs;\n }\n\n addData(parsedFile: OpenApiObject[]) {\n parsedFile.forEach((file) => {\n const { paths, components, ...rest } = file;\n\n // only merge paths and components\n objectMerge(this, {\n paths,\n components,\n } as OpenApiObject);\n\n // overwrite everthing else:\n Object.entries(rest).forEach(([key, value]) => {\n // @ts-ignore\n this[key as keyof OpenApiObject] = value;\n });\n });\n }\n}\n\nexport default SpecBuilder;\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport yaml from \"yaml\";\n\nimport { 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 filePath?: string;\n}\n\nconst parseFile = (\n file: string,\n commentsToOpenApi: (fileContent: string, verbose?: boolean) => { spec: OpenApiObject; loc: number }[],\n verbose?: boolean,\n): { spec: OpenApiObject; loc: number }[] => {\n const fileContent = fs.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 [{ spec, loc }];\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","function yamlLoc(string: string): number {\n // Break string into lines.\n const split = string.split(/\\r\\n|\\r|\\n/);\n\n const filtered = split.filter((line) => {\n // Remove comments.\n if (/^\\s*(#\\s*.*)?$/.test(line)) {\n return false;\n }\n // Remove empty lines.\n return line.trim().length > 0;\n });\n\n return filtered.length;\n}\n\nexport default yamlLoc;\n","import SwaggerParser from \"@apidevtools/swagger-parser\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { collect } from \"@visulima/readdir\";\nimport _debug from \"debug\";\nimport { exit } from \"node:process\";\nimport type { Configuration } from \"webpack\";\n\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\";\n\nconst debug = _debug(\"visulima:jsdoc-open-api:swagger-compiler-plugin\");\n\nclass SwaggerCompilerPlugin {\n private readonly swaggerDefinition: BaseDefinition;\n\n private readonly sources: string[];\n\n private readonly verbose: boolean;\n\n private ignore: string | ReadonlyArray<string>;\n\n assetsPath: string;\n\n constructor(\n assetsPath: string,\n sources: string[],\n swaggerDefinition: BaseDefinition,\n options: {\n verbose?: boolean;\n ignore?: string | ReadonlyArray<string>;\n },\n ) {\n this.assetsPath = assetsPath;\n this.swaggerDefinition = swaggerDefinition;\n this.sources = sources;\n this.verbose = options.verbose || false;\n this.ignore = options.ignore || [];\n }\n\n apply(compiler: Configuration) {\n // @ts-ignore\n compiler.hooks.make.tapAsync(\"SwaggerCompilerPlugin\", async (compilation, callback: VoidFunction) => {\n // eslint-disable-next-line no-console\n console.log(\"Build paused\");\n // eslint-disable-next-line no-console\n console.log(\"switching to swagger build\");\n\n const spec = new SpecBuilder(this.swaggerDefinition);\n\n // eslint-disable-next-line no-restricted-syntax,unicorn/prevent-abbreviations\n for await (const dir of this.sources) {\n const files = await collect(dir, {\n // eslint-disable-next-line @rushstack/security/no-unsafe-regexp\n skip: [...this.ignore, \"node_modules/**\"],\n });\n\n if (this.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Found ${files.length} files in ${dir}`);\n // eslint-disable-next-line no-console\n console.log(files);\n }\n\n files.forEach((file) => {\n // eslint-disable-next-line testing-library/no-debugging-utils\n debug(`Parsing file ${file}`);\n\n const parsedJsDocumentFile = parseFile(file, jsDocumentCommentsToOpenApi, this.verbose);\n\n spec.addData(parsedJsDocumentFile.map((item) => item.spec));\n\n const parsedSwaggerJsDocumentFile = parseFile(file, swaggerJsDocumentCommentsToOpenApi, this.verbose);\n\n spec.addData(parsedSwaggerJsDocumentFile.map((item) => item.spec));\n });\n }\n\n try {\n await SwaggerParser.validate(JSON.parse(JSON.stringify(spec)));\n } catch (error) {\n // @ts-ignore\n // eslint-disable-next-line no-console\n console.error(error.toJSON());\n exit(1);\n }\n\n // eslint-disable-next-line no-param-reassign\n compilation.assets[this.assetsPath] = {\n source() {\n return JSON.stringify(spec, null, 2);\n },\n size() {\n return Object.keys(spec).length;\n },\n };\n\n // eslint-disable-next-line no-console\n console.log(\"switching back to normal build\");\n\n callback();\n });\n }\n}\n\nexport default SwaggerCompilerPlugin;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\n\nimport { OpenApiObject, PathsObject } from \"../exported\";\nimport customizer from \"../util/customizer\";\n\n// The security object has a bizare setup...\nfunction 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: { [key: string]: string } = {\n int32: \"integer\",\n int64: \"integer\",\n float: \"number\",\n double: \"number\",\n date: \"string\",\n \"date-time\": \"string\",\n password: \"string\",\n byte: \"string\",\n binary: \"string\",\n};\n\nfunction parseDescription(tag: any) {\n const rawType = tag.type;\n const isArray = rawType && rawType.endsWith(\"[]\");\n\n let parsedType;\n\n if (rawType) {\n parsedType = rawType.replace(/\\[]$/, \"\");\n }\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 = { type: parsedType, default: defaultValue };\n } else if (isFormat) {\n rootType = {\n type: formatMap[parsedType],\n format: parsedType,\n default: defaultValue,\n };\n } else {\n rootType = { $ref: `#/components/schemas/${parsedType}` };\n }\n\n let schema: undefined | object = isArray\n ? {\n type: \"array\",\n items: {\n ...rootType,\n },\n }\n : {\n ...rootType,\n };\n\n if (parsedType === undefined) {\n schema = undefined;\n }\n\n // remove the optional dash from the description.\n let description = tag.description.trim().replace(/^- /, \"\");\n\n if (description === \"\") {\n description = undefined;\n }\n\n return {\n name: tag.name,\n description,\n required: !tag.optional,\n schema,\n rawType,\n };\n}\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction tagsToObjects(tags: Spec[], verbose?: boolean) {\n return 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 url: parsedResponse.name,\n description: parsedResponse.description,\n },\n };\n }\n\n case \"server\": {\n return {\n servers: [\n {\n url: parsedResponse.name,\n description: parsedResponse.description,\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 name: parsedResponse.name,\n in: tag.tag.replace(/Param$/, \"\"),\n description: parsedResponse.description,\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 return {\n requestBody: {\n content: {\n [contentType]: {\n examples: {\n [example]: {\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]: {\n content: {\n [contentType]: {\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeaderComponent\": {\n const [status, header] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n headers: {\n [header]: {\n $ref: `#/components/headers/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeader\": {\n const [status, header] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n headers: {\n [header]: {\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 return {\n responses: {\n [status]: {\n content: {\n [contentType]: {\n examples: {\n [example]: {\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 return {\n responses: {\n [status]: {\n links: {\n [link]: {\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 let scope: string[] = [];\n if (scopeItem) {\n scope = [scopeItem];\n }\n return {\n security: { [security]: scope },\n };\n }\n\n default: {\n return {};\n }\n }\n });\n}\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { spec: OpenApiObject; loc: number }[] => {\n const openAPIRegex = /^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \\/.*$/;\n\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments\n .filter((comment) => openAPIRegex.test(comment.description.trim()))\n .map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n fixSecurityObject(result);\n\n const [method, path]: string[] = comment.description.split(\" \");\n\n const pathsObject: PathsObject = {\n [(path as string).trim()]: {\n [(method as string).toLowerCase().trim()]: {\n ...result,\n },\n },\n };\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify({ paths: pathsObject }));\n\n return {\n spec,\n loc,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","const customizer = (objectValue: any, sourceValue: any) => {\n if (Array.isArray(objectValue)) {\n return [...objectValue, ...sourceValue];\n }\n // eslint-disable-next-line unicorn/no-useless-undefined\n return undefined;\n};\n\nexport default customizer;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\nimport yaml, { YAMLError } from \"yaml\";\n\nimport { 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\ntype ExtendedYAMLError = YAMLError & { annotation?: string };\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst tagsToObjects = (specs: Spec[], verbose?: boolean) => 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 && parsed.errors.length > 0) {\n parsed.errors.map<ExtendedYAMLError>((error) => {\n const newError: ExtendedYAMLError = error;\n\n newError.annotation = spec.description;\n\n return newError;\n });\n\n let errorString = \"Error parsing YAML in @openapi spec:\";\n\n errorString += verbose\n ? (parsed.errors as ExtendedYAMLError[])\n .map((error) => `${error.toString()}\\nImbedded within:\\n\\`\\`\\`\\n ${error?.annotation?.replace(/\\n/g, \"\\n \")}\\n\\`\\`\\``)\n .join(\"\\n\")\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): { spec: OpenApiObject; loc: number }[] => {\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments.map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n [\"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\", \"tags\"].forEach((property) => {\n if (typeof result[property] !== \"undefined\" && hasEmptyProperty(result[property])) {\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 spec,\n loc,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","import type { Spec } from \"comment-parser\";\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 */\nexport const mergeDeep = (first?: object, second?: 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 => Object.keys(object)\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[]) => tags.some((targetTag) => tag.name === targetTag.name);\n\nexport const getSwaggerVersionFromSpec = (tag: Spec) => {\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// eslint-disable-next-line radar/no-duplicate-string\nconst organizeSwaggerObject = (swaggerObject: Record<string, any>, annotation: Record<string, any>, property: string) => {\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 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"]}
1
+ {"version":3,"sources":["../src/util/object-merge.ts","../src/spec-builder.ts","../src/parse-file.ts","../src/util/yaml-loc.ts","../src/webpack/swagger-compiler-plugin.ts","../src/jsdoc/comments-to-open-api.ts","../src/util/customizer.ts","../src/swagger-jsdoc/comments-to-open-api.ts","../src/swagger-jsdoc/utils.ts","../src/swagger-jsdoc/organize-swagger-object.ts"],"names":["commentsToOpenApi","fs","path","parseComments","mergeWith","yaml","tagsToObjects","comments_to_open_api_default"],"mappings":"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","sourcesContent":["function objectMerge<T>(a: T, b: T) {\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 { [key: string]: object })[subKey] = {\n ...(a[key as keyof typeof b] as { [key: string]: object })[subKey],\n ...(b[key as keyof typeof b] as { [key: string]: object })[subKey],\n };\n });\n }\n });\n}\n\nexport default objectMerge;\n","import {\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 openapi: string;\n\n info: InfoObject;\n\n servers?: ServerObject[];\n\n paths: PathsObject;\n\n components?: ComponentsObject;\n\n security?: SecurityRequirementObject[];\n\n tags?: TagObject[];\n\n externalDocs?: ExternalDocumentationObject;\n\n constructor(baseDefinition: BaseDefinition) {\n this.openapi = baseDefinition.openapi;\n this.info = baseDefinition.info;\n this.servers = baseDefinition.servers;\n this.paths = baseDefinition.paths || {};\n this.components = baseDefinition.components;\n this.security = baseDefinition.security;\n this.tags = baseDefinition.tags;\n this.externalDocs = baseDefinition.externalDocs;\n }\n\n addData(parsedFile: OpenApiObject[]) {\n parsedFile.forEach((file) => {\n const { paths, components, ...rest } = file;\n\n // only merge paths and components\n objectMerge(this, {\n paths: paths || {},\n components: components || {},\n } as OpenApiObject);\n\n // overwrite everything else:\n Object.entries(rest).forEach(([key, value]) => {\n // @ts-ignore\n this[key as keyof OpenApiObject] = value;\n });\n });\n }\n}\n\nexport default SpecBuilder;\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport yaml from \"yaml\";\n\nimport { 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 filePath?: string;\n}\n\nconst parseFile = (\n file: string,\n commentsToOpenApi: (fileContent: string, verbose?: boolean) => { spec: OpenApiObject; loc: number }[],\n verbose?: boolean,\n): { spec: OpenApiObject; loc: number }[] => {\n const fileContent = fs.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 [{ spec, loc }];\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","function yamlLoc(string: string): number {\n // Break string into lines.\n const split = string.split(/\\r\\n|\\r|\\n/);\n\n const filtered = split.filter((line) => {\n // Remove comments.\n if (/^\\s*(#\\s*.*)?$/.test(line)) {\n return false;\n }\n // Remove empty lines.\n return line.trim().length > 0;\n });\n\n return filtered.length;\n}\n\nexport default yamlLoc;\n","import SwaggerParser from \"@apidevtools/swagger-parser\";\nimport { collect } from \"@visulima/readdir\";\nimport fs from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { exit } from \"node:process\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { Compiler } from \"webpack\";\n\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\";\n\nconst 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\nconst errorHandler = (error: any) => {\n if (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n exit(1);\n }\n};\n\nclass SwaggerCompilerPlugin {\n private readonly swaggerDefinition: BaseDefinition;\n\n private readonly sources: string[];\n\n private readonly verbose: boolean;\n\n private readonly ignore: string | ReadonlyArray<string>;\n\n assetsPath: string;\n\n constructor(\n assetsPath: string,\n sources: string[],\n swaggerDefinition: BaseDefinition,\n options: {\n verbose?: boolean;\n ignore?: string | ReadonlyArray<string>;\n },\n ) {\n this.assetsPath = assetsPath;\n this.swaggerDefinition = swaggerDefinition;\n this.sources = sources;\n this.verbose = options.verbose || false;\n this.ignore = options.ignore || [];\n }\n\n apply(compiler: Compiler) {\n compiler.hooks.make.tapAsync(\"SwaggerCompilerPlugin\", async (_, callback: VoidFunction) => {\n // eslint-disable-next-line no-console\n console.log(\"Build paused, switching to swagger build\");\n\n const spec = new SpecBuilder(this.swaggerDefinition);\n\n // eslint-disable-next-line no-restricted-syntax,unicorn/prevent-abbreviations\n for await (const dir of this.sources) {\n const files = await collect(dir, {\n // eslint-disable-next-line @rushstack/security/no-unsafe-regexp\n skip: [...this.ignore, ...exclude],\n extensions: [\".js\", \".cjs\", \".mjs\", \".ts\", \".tsx\", \".jsx\", \".yaml\", \".yml\"],\n minimatchOptions: {\n match: {\n debug: this.verbose,\n matchBase: true,\n },\n skip: {\n debug: this.verbose,\n matchBase: true,\n },\n },\n });\n\n if (this.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Found ${files.length} files in ${dir}`);\n // eslint-disable-next-line no-console\n console.log(files);\n }\n\n files.forEach((file) => {\n if (this.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Parsing file ${file}`);\n }\n\n try {\n const parsedJsDocumentFile = parseFile(file, jsDocumentCommentsToOpenApi, this.verbose);\n\n spec.addData(parsedJsDocumentFile.map((item) => item.spec));\n\n const parsedSwaggerJsDocumentFile = parseFile(file, swaggerJsDocumentCommentsToOpenApi, this.verbose);\n\n spec.addData(parsedSwaggerJsDocumentFile.map((item) => item.spec));\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n exit(1);\n }\n });\n }\n\n try {\n if (this.verbose) {\n // eslint-disable-next-line no-console\n console.log(\"Validating swagger spec\");\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(spec, null, 2));\n }\n\n await SwaggerParser.validate(JSON.parse(JSON.stringify(spec)));\n } catch (error: any) {\n // eslint-disable-next-line no-console\n console.error(error.toJSON());\n exit(1);\n }\n\n const { assetsPath } = this;\n\n fs.mkdir(dirname(assetsPath), { recursive: true }, (error) => {\n if (error) {\n errorHandler(error);\n }\n\n fs.writeFile(assetsPath, JSON.stringify(spec, null, 2), errorHandler);\n });\n\n // eslint-disable-next-line unicorn/consistent-destructuring\n if (this.verbose) {\n // eslint-disable-next-line no-console,unicorn/consistent-destructuring\n console.log(`Written swagger spec to \"${this.assetsPath}\" file`);\n }\n\n // eslint-disable-next-line no-console\n console.log(\"switching back to normal build\");\n\n callback();\n });\n }\n}\n\nexport default SwaggerCompilerPlugin;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\n\nimport { OpenApiObject, PathsObject } from \"../exported\";\nimport customizer from \"../util/customizer\";\n\n// The security object has a bizare setup...\nfunction 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: { [key: string]: string } = {\n int32: \"integer\",\n int64: \"integer\",\n float: \"number\",\n double: \"number\",\n date: \"string\",\n \"date-time\": \"string\",\n password: \"string\",\n byte: \"string\",\n binary: \"string\",\n};\n\nfunction parseDescription(tag: any) {\n const rawType = tag.type;\n const isArray = rawType && rawType.endsWith(\"[]\");\n\n let parsedType;\n\n if (rawType) {\n parsedType = rawType.replace(/\\[]$/, \"\");\n }\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 = { type: parsedType, default: defaultValue };\n } else if (isFormat) {\n rootType = {\n type: formatMap[parsedType],\n format: parsedType,\n default: defaultValue,\n };\n } else {\n rootType = { $ref: `#/components/schemas/${parsedType}` };\n }\n\n let schema: undefined | object = isArray\n ? {\n type: \"array\",\n items: {\n ...rootType,\n },\n }\n : {\n ...rootType,\n };\n\n if (parsedType === undefined) {\n schema = undefined;\n }\n\n // remove the optional dash from the description.\n let description = tag.description.trim().replace(/^- /, \"\");\n\n if (description === \"\") {\n description = undefined;\n }\n\n return {\n name: tag.name,\n description,\n required: !tag.optional,\n schema,\n rawType,\n };\n}\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction tagsToObjects(tags: Spec[], verbose?: boolean) {\n return 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 url: parsedResponse.name,\n description: parsedResponse.description,\n },\n };\n }\n\n case \"server\": {\n return {\n servers: [\n {\n url: parsedResponse.name,\n description: parsedResponse.description,\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 name: parsedResponse.name,\n in: tag.tag.replace(/Param$/, \"\"),\n description: parsedResponse.description,\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 return {\n requestBody: {\n content: {\n [contentType]: {\n examples: {\n [example]: {\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]: {\n content: {\n [contentType]: {\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeaderComponent\": {\n const [status, header] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n headers: {\n [header]: {\n $ref: `#/components/headers/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeader\": {\n const [status, header] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n headers: {\n [header]: {\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 return {\n responses: {\n [status]: {\n content: {\n [contentType]: {\n examples: {\n [example]: {\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 return {\n responses: {\n [status]: {\n links: {\n [link]: {\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 let scope: string[] = [];\n if (scopeItem) {\n scope = [scopeItem];\n }\n return {\n security: { [security]: scope },\n };\n }\n\n default: {\n return {};\n }\n }\n });\n}\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { spec: OpenApiObject; loc: number }[] => {\n const openAPIRegex = /^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \\/.*$/;\n\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments\n .filter((comment) => openAPIRegex.test(comment.description.trim()))\n .map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n fixSecurityObject(result);\n\n const [method, path]: string[] = comment.description.split(\" \");\n\n const pathsObject: PathsObject = {\n [(path as string).trim()]: {\n [(method as string).toLowerCase().trim()]: {\n ...result,\n },\n },\n };\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify({ paths: pathsObject }));\n\n return {\n spec,\n loc,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","const customizer = (objectValue: any, sourceValue: any) => {\n if (Array.isArray(objectValue)) {\n return [...objectValue, ...sourceValue];\n }\n // eslint-disable-next-line unicorn/no-useless-undefined\n return undefined;\n};\n\nexport default customizer;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\nimport yaml, { YAMLError } from \"yaml\";\n\nimport { 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\ntype ExtendedYAMLError = YAMLError & { annotation?: string };\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst tagsToObjects = (specs: Spec[], verbose?: boolean) => 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 && parsed.errors.length > 0) {\n parsed.errors.map<ExtendedYAMLError>((error) => {\n const newError: ExtendedYAMLError = error;\n\n newError.annotation = spec.description;\n\n return newError;\n });\n\n let errorString = \"Error parsing YAML in @openapi spec:\";\n\n errorString += verbose\n ? (parsed.errors as ExtendedYAMLError[])\n .map((error) => `${error.toString()}\\nImbedded within:\\n\\`\\`\\`\\n ${error?.annotation?.replace(/\\n/g, \"\\n \")}\\n\\`\\`\\``)\n .join(\"\\n\")\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): { spec: OpenApiObject; loc: number }[] => {\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments.map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n [\"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\", \"tags\"].forEach((property) => {\n if (typeof result[property] !== \"undefined\" && hasEmptyProperty(result[property])) {\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 spec,\n loc,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","import type { Spec } from \"comment-parser\";\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 */\nexport const mergeDeep = (first?: object, second?: 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 => Object.keys(object)\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[]) => tags.some((targetTag) => tag.name === targetTag.name);\n\nexport const getSwaggerVersionFromSpec = (tag: Spec) => {\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// eslint-disable-next-line radar/no-duplicate-string\nconst organizeSwaggerObject = (swaggerObject: Record<string, any>, annotation: Record<string, any>, property: string) => {\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 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"]}
package/dist/index.mjs CHANGED
@@ -33,8 +33,8 @@ var SpecBuilder = class {
33
33
  parsedFile.forEach((file) => {
34
34
  const { paths, components, ...rest } = file;
35
35
  object_merge_default(this, {
36
- paths,
37
- components
36
+ paths: paths || {},
37
+ components: components || {}
38
38
  });
39
39
  Object.entries(rest).forEach(([key, value]) => {
40
40
  this[key] = value;
@@ -95,7 +95,8 @@ var parse_file_default = parseFile;
95
95
  // src/webpack/swagger-compiler-plugin.ts
96
96
  import SwaggerParser from "@apidevtools/swagger-parser";
97
97
  import { collect } from "@visulima/readdir";
98
- import _debug from "debug";
98
+ import fs2 from "fs";
99
+ import { dirname } from "path";
99
100
  import { exit } from "process";
100
101
 
101
102
  // src/jsdoc/comments-to-open-api.ts
@@ -572,7 +573,36 @@ var commentsToOpenApi2 = (fileContents, verbose) => {
572
573
  var comments_to_open_api_default2 = commentsToOpenApi2;
573
574
 
574
575
  // src/webpack/swagger-compiler-plugin.ts
575
- var debug = _debug("visulima:jsdoc-open-api:swagger-compiler-plugin");
576
+ var exclude = [
577
+ "coverage/**",
578
+ ".github/**",
579
+ "packages/*/test{,s}/**",
580
+ "**/*.d.ts",
581
+ "test{,s}/**",
582
+ "test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}",
583
+ "**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}",
584
+ "**/__tests__/**",
585
+ "**/{ava,babel,nyc}.config.{js,cjs,mjs}",
586
+ "**/jest.config.{js,cjs,mjs,ts}",
587
+ "**/{karma,rollup,webpack}.config.js",
588
+ "**/.{eslint,mocha}rc.{js,cjs}",
589
+ "**/.{travis,yarnrc}.yml",
590
+ "**/{docker-compose,docker}.yml",
591
+ "**/.yamllint.{yaml,yml}",
592
+ "**/node_modules/**",
593
+ "**/pnpm-lock.yaml",
594
+ "**/pnpm-workspace.yaml",
595
+ "**/{package,package-lock}.json",
596
+ "**/yarn.lock",
597
+ "**/package.json5",
598
+ "**/.next/**"
599
+ ];
600
+ var errorHandler = (error) => {
601
+ if (error) {
602
+ console.error(error);
603
+ exit(1);
604
+ }
605
+ };
576
606
  var SwaggerCompilerPlugin = class {
577
607
  constructor(assetsPath, sources, swaggerDefinition, options) {
578
608
  this.assetsPath = assetsPath;
@@ -582,40 +612,63 @@ var SwaggerCompilerPlugin = class {
582
612
  this.ignore = options.ignore || [];
583
613
  }
584
614
  apply(compiler) {
585
- compiler.hooks.make.tapAsync("SwaggerCompilerPlugin", async (compilation, callback) => {
586
- console.log("Build paused");
587
- console.log("switching to swagger build");
615
+ compiler.hooks.make.tapAsync("SwaggerCompilerPlugin", async (_, callback) => {
616
+ console.log("Build paused, switching to swagger build");
588
617
  const spec = new spec_builder_default(this.swaggerDefinition);
589
618
  for await (const dir of this.sources) {
590
619
  const files = await collect(dir, {
591
- skip: [...this.ignore, "node_modules/**"]
620
+ skip: [...this.ignore, ...exclude],
621
+ extensions: [".js", ".cjs", ".mjs", ".ts", ".tsx", ".jsx", ".yaml", ".yml"],
622
+ minimatchOptions: {
623
+ match: {
624
+ debug: this.verbose,
625
+ matchBase: true
626
+ },
627
+ skip: {
628
+ debug: this.verbose,
629
+ matchBase: true
630
+ }
631
+ }
592
632
  });
593
633
  if (this.verbose) {
594
634
  console.log(`Found ${files.length} files in ${dir}`);
595
635
  console.log(files);
596
636
  }
597
637
  files.forEach((file) => {
598
- debug(`Parsing file ${file}`);
599
- const parsedJsDocumentFile = parse_file_default(file, comments_to_open_api_default, this.verbose);
600
- spec.addData(parsedJsDocumentFile.map((item) => item.spec));
601
- const parsedSwaggerJsDocumentFile = parse_file_default(file, comments_to_open_api_default2, this.verbose);
602
- spec.addData(parsedSwaggerJsDocumentFile.map((item) => item.spec));
638
+ if (this.verbose) {
639
+ console.log(`Parsing file ${file}`);
640
+ }
641
+ try {
642
+ const parsedJsDocumentFile = parse_file_default(file, comments_to_open_api_default, this.verbose);
643
+ spec.addData(parsedJsDocumentFile.map((item) => item.spec));
644
+ const parsedSwaggerJsDocumentFile = parse_file_default(file, comments_to_open_api_default2, this.verbose);
645
+ spec.addData(parsedSwaggerJsDocumentFile.map((item) => item.spec));
646
+ } catch (error) {
647
+ console.error(error);
648
+ exit(1);
649
+ }
603
650
  });
604
651
  }
605
652
  try {
653
+ if (this.verbose) {
654
+ console.log("Validating swagger spec");
655
+ console.log(JSON.stringify(spec, null, 2));
656
+ }
606
657
  await SwaggerParser.validate(JSON.parse(JSON.stringify(spec)));
607
658
  } catch (error) {
608
659
  console.error(error.toJSON());
609
660
  exit(1);
610
661
  }
611
- compilation.assets[this.assetsPath] = {
612
- source() {
613
- return JSON.stringify(spec, null, 2);
614
- },
615
- size() {
616
- return Object.keys(spec).length;
662
+ const { assetsPath } = this;
663
+ fs2.mkdir(dirname(assetsPath), { recursive: true }, (error) => {
664
+ if (error) {
665
+ errorHandler(error);
617
666
  }
618
- };
667
+ fs2.writeFile(assetsPath, JSON.stringify(spec, null, 2), errorHandler);
668
+ });
669
+ if (this.verbose) {
670
+ console.log(`Written swagger spec to "${this.assetsPath}" file`);
671
+ }
619
672
  console.log("switching back to normal build");
620
673
  callback();
621
674
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/util/object-merge.ts","../src/spec-builder.ts","../src/parse-file.ts","../src/util/yaml-loc.ts","../src/webpack/swagger-compiler-plugin.ts","../src/jsdoc/comments-to-open-api.ts","../src/util/customizer.ts","../src/swagger-jsdoc/comments-to-open-api.ts","../src/swagger-jsdoc/utils.ts","../src/swagger-jsdoc/organize-swagger-object.ts"],"sourcesContent":["function objectMerge<T>(a: T, b: T) {\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 { [key: string]: object })[subKey] = {\n ...(a[key as keyof typeof b] as { [key: string]: object })[subKey],\n ...(b[key as keyof typeof b] as { [key: string]: object })[subKey],\n };\n });\n }\n });\n}\n\nexport default objectMerge;\n","import {\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 openapi: string;\n\n info: InfoObject;\n\n servers?: ServerObject[];\n\n paths: PathsObject;\n\n components?: ComponentsObject;\n\n security?: SecurityRequirementObject[];\n\n tags?: TagObject[];\n\n externalDocs?: ExternalDocumentationObject;\n\n constructor(baseDefinition: BaseDefinition) {\n this.openapi = baseDefinition.openapi;\n this.info = baseDefinition.info;\n this.servers = baseDefinition.servers;\n this.paths = baseDefinition.paths || {};\n this.components = baseDefinition.components;\n this.security = baseDefinition.security;\n this.tags = baseDefinition.tags;\n this.externalDocs = baseDefinition.externalDocs;\n }\n\n addData(parsedFile: OpenApiObject[]) {\n parsedFile.forEach((file) => {\n const { paths, components, ...rest } = file;\n\n // only merge paths and components\n objectMerge(this, {\n paths,\n components,\n } as OpenApiObject);\n\n // overwrite everthing else:\n Object.entries(rest).forEach(([key, value]) => {\n // @ts-ignore\n this[key as keyof OpenApiObject] = value;\n });\n });\n }\n}\n\nexport default SpecBuilder;\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport yaml from \"yaml\";\n\nimport { 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 filePath?: string;\n}\n\nconst parseFile = (\n file: string,\n commentsToOpenApi: (fileContent: string, verbose?: boolean) => { spec: OpenApiObject; loc: number }[],\n verbose?: boolean,\n): { spec: OpenApiObject; loc: number }[] => {\n const fileContent = fs.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 [{ spec, loc }];\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","function yamlLoc(string: string): number {\n // Break string into lines.\n const split = string.split(/\\r\\n|\\r|\\n/);\n\n const filtered = split.filter((line) => {\n // Remove comments.\n if (/^\\s*(#\\s*.*)?$/.test(line)) {\n return false;\n }\n // Remove empty lines.\n return line.trim().length > 0;\n });\n\n return filtered.length;\n}\n\nexport default yamlLoc;\n","import SwaggerParser from \"@apidevtools/swagger-parser\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { collect } from \"@visulima/readdir\";\nimport _debug from \"debug\";\nimport { exit } from \"node:process\";\nimport type { Configuration } from \"webpack\";\n\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\";\n\nconst debug = _debug(\"visulima:jsdoc-open-api:swagger-compiler-plugin\");\n\nclass SwaggerCompilerPlugin {\n private readonly swaggerDefinition: BaseDefinition;\n\n private readonly sources: string[];\n\n private readonly verbose: boolean;\n\n private ignore: string | ReadonlyArray<string>;\n\n assetsPath: string;\n\n constructor(\n assetsPath: string,\n sources: string[],\n swaggerDefinition: BaseDefinition,\n options: {\n verbose?: boolean;\n ignore?: string | ReadonlyArray<string>;\n },\n ) {\n this.assetsPath = assetsPath;\n this.swaggerDefinition = swaggerDefinition;\n this.sources = sources;\n this.verbose = options.verbose || false;\n this.ignore = options.ignore || [];\n }\n\n apply(compiler: Configuration) {\n // @ts-ignore\n compiler.hooks.make.tapAsync(\"SwaggerCompilerPlugin\", async (compilation, callback: VoidFunction) => {\n // eslint-disable-next-line no-console\n console.log(\"Build paused\");\n // eslint-disable-next-line no-console\n console.log(\"switching to swagger build\");\n\n const spec = new SpecBuilder(this.swaggerDefinition);\n\n // eslint-disable-next-line no-restricted-syntax,unicorn/prevent-abbreviations\n for await (const dir of this.sources) {\n const files = await collect(dir, {\n // eslint-disable-next-line @rushstack/security/no-unsafe-regexp\n skip: [...this.ignore, \"node_modules/**\"],\n });\n\n if (this.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Found ${files.length} files in ${dir}`);\n // eslint-disable-next-line no-console\n console.log(files);\n }\n\n files.forEach((file) => {\n // eslint-disable-next-line testing-library/no-debugging-utils\n debug(`Parsing file ${file}`);\n\n const parsedJsDocumentFile = parseFile(file, jsDocumentCommentsToOpenApi, this.verbose);\n\n spec.addData(parsedJsDocumentFile.map((item) => item.spec));\n\n const parsedSwaggerJsDocumentFile = parseFile(file, swaggerJsDocumentCommentsToOpenApi, this.verbose);\n\n spec.addData(parsedSwaggerJsDocumentFile.map((item) => item.spec));\n });\n }\n\n try {\n await SwaggerParser.validate(JSON.parse(JSON.stringify(spec)));\n } catch (error) {\n // @ts-ignore\n // eslint-disable-next-line no-console\n console.error(error.toJSON());\n exit(1);\n }\n\n // eslint-disable-next-line no-param-reassign\n compilation.assets[this.assetsPath] = {\n source() {\n return JSON.stringify(spec, null, 2);\n },\n size() {\n return Object.keys(spec).length;\n },\n };\n\n // eslint-disable-next-line no-console\n console.log(\"switching back to normal build\");\n\n callback();\n });\n }\n}\n\nexport default SwaggerCompilerPlugin;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\n\nimport { OpenApiObject, PathsObject } from \"../exported\";\nimport customizer from \"../util/customizer\";\n\n// The security object has a bizare setup...\nfunction 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: { [key: string]: string } = {\n int32: \"integer\",\n int64: \"integer\",\n float: \"number\",\n double: \"number\",\n date: \"string\",\n \"date-time\": \"string\",\n password: \"string\",\n byte: \"string\",\n binary: \"string\",\n};\n\nfunction parseDescription(tag: any) {\n const rawType = tag.type;\n const isArray = rawType && rawType.endsWith(\"[]\");\n\n let parsedType;\n\n if (rawType) {\n parsedType = rawType.replace(/\\[]$/, \"\");\n }\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 = { type: parsedType, default: defaultValue };\n } else if (isFormat) {\n rootType = {\n type: formatMap[parsedType],\n format: parsedType,\n default: defaultValue,\n };\n } else {\n rootType = { $ref: `#/components/schemas/${parsedType}` };\n }\n\n let schema: undefined | object = isArray\n ? {\n type: \"array\",\n items: {\n ...rootType,\n },\n }\n : {\n ...rootType,\n };\n\n if (parsedType === undefined) {\n schema = undefined;\n }\n\n // remove the optional dash from the description.\n let description = tag.description.trim().replace(/^- /, \"\");\n\n if (description === \"\") {\n description = undefined;\n }\n\n return {\n name: tag.name,\n description,\n required: !tag.optional,\n schema,\n rawType,\n };\n}\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction tagsToObjects(tags: Spec[], verbose?: boolean) {\n return 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 url: parsedResponse.name,\n description: parsedResponse.description,\n },\n };\n }\n\n case \"server\": {\n return {\n servers: [\n {\n url: parsedResponse.name,\n description: parsedResponse.description,\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 name: parsedResponse.name,\n in: tag.tag.replace(/Param$/, \"\"),\n description: parsedResponse.description,\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 return {\n requestBody: {\n content: {\n [contentType]: {\n examples: {\n [example]: {\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]: {\n content: {\n [contentType]: {\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeaderComponent\": {\n const [status, header] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n headers: {\n [header]: {\n $ref: `#/components/headers/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeader\": {\n const [status, header] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n headers: {\n [header]: {\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 return {\n responses: {\n [status]: {\n content: {\n [contentType]: {\n examples: {\n [example]: {\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 return {\n responses: {\n [status]: {\n links: {\n [link]: {\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 let scope: string[] = [];\n if (scopeItem) {\n scope = [scopeItem];\n }\n return {\n security: { [security]: scope },\n };\n }\n\n default: {\n return {};\n }\n }\n });\n}\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { spec: OpenApiObject; loc: number }[] => {\n const openAPIRegex = /^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \\/.*$/;\n\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments\n .filter((comment) => openAPIRegex.test(comment.description.trim()))\n .map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n fixSecurityObject(result);\n\n const [method, path]: string[] = comment.description.split(\" \");\n\n const pathsObject: PathsObject = {\n [(path as string).trim()]: {\n [(method as string).toLowerCase().trim()]: {\n ...result,\n },\n },\n };\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify({ paths: pathsObject }));\n\n return {\n spec,\n loc,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","const customizer = (objectValue: any, sourceValue: any) => {\n if (Array.isArray(objectValue)) {\n return [...objectValue, ...sourceValue];\n }\n // eslint-disable-next-line unicorn/no-useless-undefined\n return undefined;\n};\n\nexport default customizer;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\nimport yaml, { YAMLError } from \"yaml\";\n\nimport { 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\ntype ExtendedYAMLError = YAMLError & { annotation?: string };\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst tagsToObjects = (specs: Spec[], verbose?: boolean) => 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 && parsed.errors.length > 0) {\n parsed.errors.map<ExtendedYAMLError>((error) => {\n const newError: ExtendedYAMLError = error;\n\n newError.annotation = spec.description;\n\n return newError;\n });\n\n let errorString = \"Error parsing YAML in @openapi spec:\";\n\n errorString += verbose\n ? (parsed.errors as ExtendedYAMLError[])\n .map((error) => `${error.toString()}\\nImbedded within:\\n\\`\\`\\`\\n ${error?.annotation?.replace(/\\n/g, \"\\n \")}\\n\\`\\`\\``)\n .join(\"\\n\")\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): { spec: OpenApiObject; loc: number }[] => {\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments.map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n [\"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\", \"tags\"].forEach((property) => {\n if (typeof result[property] !== \"undefined\" && hasEmptyProperty(result[property])) {\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 spec,\n loc,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","import type { Spec } from \"comment-parser\";\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 */\nexport const mergeDeep = (first?: object, second?: 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 => Object.keys(object)\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[]) => tags.some((targetTag) => tag.name === targetTag.name);\n\nexport const getSwaggerVersionFromSpec = (tag: Spec) => {\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// eslint-disable-next-line radar/no-duplicate-string\nconst organizeSwaggerObject = (swaggerObject: Record<string, any>, annotation: Record<string, any>, property: string) => {\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 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"],"mappings":"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","names":["commentsToOpenApi","path","parseComments","mergeWith","yaml","mergeWith","tagsToObjects","yaml","commentsToOpenApi","parseComments","mergeWith","comments_to_open_api_default","comments_to_open_api_default"]}
1
+ {"version":3,"sources":["../src/util/object-merge.ts","../src/spec-builder.ts","../src/parse-file.ts","../src/util/yaml-loc.ts","../src/webpack/swagger-compiler-plugin.ts","../src/jsdoc/comments-to-open-api.ts","../src/util/customizer.ts","../src/swagger-jsdoc/comments-to-open-api.ts","../src/swagger-jsdoc/utils.ts","../src/swagger-jsdoc/organize-swagger-object.ts"],"sourcesContent":["function objectMerge<T>(a: T, b: T) {\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 { [key: string]: object })[subKey] = {\n ...(a[key as keyof typeof b] as { [key: string]: object })[subKey],\n ...(b[key as keyof typeof b] as { [key: string]: object })[subKey],\n };\n });\n }\n });\n}\n\nexport default objectMerge;\n","import {\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 openapi: string;\n\n info: InfoObject;\n\n servers?: ServerObject[];\n\n paths: PathsObject;\n\n components?: ComponentsObject;\n\n security?: SecurityRequirementObject[];\n\n tags?: TagObject[];\n\n externalDocs?: ExternalDocumentationObject;\n\n constructor(baseDefinition: BaseDefinition) {\n this.openapi = baseDefinition.openapi;\n this.info = baseDefinition.info;\n this.servers = baseDefinition.servers;\n this.paths = baseDefinition.paths || {};\n this.components = baseDefinition.components;\n this.security = baseDefinition.security;\n this.tags = baseDefinition.tags;\n this.externalDocs = baseDefinition.externalDocs;\n }\n\n addData(parsedFile: OpenApiObject[]) {\n parsedFile.forEach((file) => {\n const { paths, components, ...rest } = file;\n\n // only merge paths and components\n objectMerge(this, {\n paths: paths || {},\n components: components || {},\n } as OpenApiObject);\n\n // overwrite everything else:\n Object.entries(rest).forEach(([key, value]) => {\n // @ts-ignore\n this[key as keyof OpenApiObject] = value;\n });\n });\n }\n}\n\nexport default SpecBuilder;\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport yaml from \"yaml\";\n\nimport { 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 filePath?: string;\n}\n\nconst parseFile = (\n file: string,\n commentsToOpenApi: (fileContent: string, verbose?: boolean) => { spec: OpenApiObject; loc: number }[],\n verbose?: boolean,\n): { spec: OpenApiObject; loc: number }[] => {\n const fileContent = fs.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 [{ spec, loc }];\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","function yamlLoc(string: string): number {\n // Break string into lines.\n const split = string.split(/\\r\\n|\\r|\\n/);\n\n const filtered = split.filter((line) => {\n // Remove comments.\n if (/^\\s*(#\\s*.*)?$/.test(line)) {\n return false;\n }\n // Remove empty lines.\n return line.trim().length > 0;\n });\n\n return filtered.length;\n}\n\nexport default yamlLoc;\n","import SwaggerParser from \"@apidevtools/swagger-parser\";\nimport { collect } from \"@visulima/readdir\";\nimport fs from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { exit } from \"node:process\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { Compiler } from \"webpack\";\n\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\";\n\nconst 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\nconst errorHandler = (error: any) => {\n if (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n exit(1);\n }\n};\n\nclass SwaggerCompilerPlugin {\n private readonly swaggerDefinition: BaseDefinition;\n\n private readonly sources: string[];\n\n private readonly verbose: boolean;\n\n private readonly ignore: string | ReadonlyArray<string>;\n\n assetsPath: string;\n\n constructor(\n assetsPath: string,\n sources: string[],\n swaggerDefinition: BaseDefinition,\n options: {\n verbose?: boolean;\n ignore?: string | ReadonlyArray<string>;\n },\n ) {\n this.assetsPath = assetsPath;\n this.swaggerDefinition = swaggerDefinition;\n this.sources = sources;\n this.verbose = options.verbose || false;\n this.ignore = options.ignore || [];\n }\n\n apply(compiler: Compiler) {\n compiler.hooks.make.tapAsync(\"SwaggerCompilerPlugin\", async (_, callback: VoidFunction) => {\n // eslint-disable-next-line no-console\n console.log(\"Build paused, switching to swagger build\");\n\n const spec = new SpecBuilder(this.swaggerDefinition);\n\n // eslint-disable-next-line no-restricted-syntax,unicorn/prevent-abbreviations\n for await (const dir of this.sources) {\n const files = await collect(dir, {\n // eslint-disable-next-line @rushstack/security/no-unsafe-regexp\n skip: [...this.ignore, ...exclude],\n extensions: [\".js\", \".cjs\", \".mjs\", \".ts\", \".tsx\", \".jsx\", \".yaml\", \".yml\"],\n minimatchOptions: {\n match: {\n debug: this.verbose,\n matchBase: true,\n },\n skip: {\n debug: this.verbose,\n matchBase: true,\n },\n },\n });\n\n if (this.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Found ${files.length} files in ${dir}`);\n // eslint-disable-next-line no-console\n console.log(files);\n }\n\n files.forEach((file) => {\n if (this.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Parsing file ${file}`);\n }\n\n try {\n const parsedJsDocumentFile = parseFile(file, jsDocumentCommentsToOpenApi, this.verbose);\n\n spec.addData(parsedJsDocumentFile.map((item) => item.spec));\n\n const parsedSwaggerJsDocumentFile = parseFile(file, swaggerJsDocumentCommentsToOpenApi, this.verbose);\n\n spec.addData(parsedSwaggerJsDocumentFile.map((item) => item.spec));\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n exit(1);\n }\n });\n }\n\n try {\n if (this.verbose) {\n // eslint-disable-next-line no-console\n console.log(\"Validating swagger spec\");\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(spec, null, 2));\n }\n\n await SwaggerParser.validate(JSON.parse(JSON.stringify(spec)));\n } catch (error: any) {\n // eslint-disable-next-line no-console\n console.error(error.toJSON());\n exit(1);\n }\n\n const { assetsPath } = this;\n\n fs.mkdir(dirname(assetsPath), { recursive: true }, (error) => {\n if (error) {\n errorHandler(error);\n }\n\n fs.writeFile(assetsPath, JSON.stringify(spec, null, 2), errorHandler);\n });\n\n // eslint-disable-next-line unicorn/consistent-destructuring\n if (this.verbose) {\n // eslint-disable-next-line no-console,unicorn/consistent-destructuring\n console.log(`Written swagger spec to \"${this.assetsPath}\" file`);\n }\n\n // eslint-disable-next-line no-console\n console.log(\"switching back to normal build\");\n\n callback();\n });\n }\n}\n\nexport default SwaggerCompilerPlugin;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\n\nimport { OpenApiObject, PathsObject } from \"../exported\";\nimport customizer from \"../util/customizer\";\n\n// The security object has a bizare setup...\nfunction 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: { [key: string]: string } = {\n int32: \"integer\",\n int64: \"integer\",\n float: \"number\",\n double: \"number\",\n date: \"string\",\n \"date-time\": \"string\",\n password: \"string\",\n byte: \"string\",\n binary: \"string\",\n};\n\nfunction parseDescription(tag: any) {\n const rawType = tag.type;\n const isArray = rawType && rawType.endsWith(\"[]\");\n\n let parsedType;\n\n if (rawType) {\n parsedType = rawType.replace(/\\[]$/, \"\");\n }\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 = { type: parsedType, default: defaultValue };\n } else if (isFormat) {\n rootType = {\n type: formatMap[parsedType],\n format: parsedType,\n default: defaultValue,\n };\n } else {\n rootType = { $ref: `#/components/schemas/${parsedType}` };\n }\n\n let schema: undefined | object = isArray\n ? {\n type: \"array\",\n items: {\n ...rootType,\n },\n }\n : {\n ...rootType,\n };\n\n if (parsedType === undefined) {\n schema = undefined;\n }\n\n // remove the optional dash from the description.\n let description = tag.description.trim().replace(/^- /, \"\");\n\n if (description === \"\") {\n description = undefined;\n }\n\n return {\n name: tag.name,\n description,\n required: !tag.optional,\n schema,\n rawType,\n };\n}\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction tagsToObjects(tags: Spec[], verbose?: boolean) {\n return 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 url: parsedResponse.name,\n description: parsedResponse.description,\n },\n };\n }\n\n case \"server\": {\n return {\n servers: [\n {\n url: parsedResponse.name,\n description: parsedResponse.description,\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 name: parsedResponse.name,\n in: tag.tag.replace(/Param$/, \"\"),\n description: parsedResponse.description,\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 return {\n requestBody: {\n content: {\n [contentType]: {\n examples: {\n [example]: {\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]: {\n content: {\n [contentType]: {\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeaderComponent\": {\n const [status, header] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n headers: {\n [header]: {\n $ref: `#/components/headers/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeader\": {\n const [status, header] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n headers: {\n [header]: {\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 return {\n responses: {\n [status]: {\n content: {\n [contentType]: {\n examples: {\n [example]: {\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 return {\n responses: {\n [status]: {\n links: {\n [link]: {\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 let scope: string[] = [];\n if (scopeItem) {\n scope = [scopeItem];\n }\n return {\n security: { [security]: scope },\n };\n }\n\n default: {\n return {};\n }\n }\n });\n}\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { spec: OpenApiObject; loc: number }[] => {\n const openAPIRegex = /^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \\/.*$/;\n\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments\n .filter((comment) => openAPIRegex.test(comment.description.trim()))\n .map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n fixSecurityObject(result);\n\n const [method, path]: string[] = comment.description.split(\" \");\n\n const pathsObject: PathsObject = {\n [(path as string).trim()]: {\n [(method as string).toLowerCase().trim()]: {\n ...result,\n },\n },\n };\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify({ paths: pathsObject }));\n\n return {\n spec,\n loc,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","const customizer = (objectValue: any, sourceValue: any) => {\n if (Array.isArray(objectValue)) {\n return [...objectValue, ...sourceValue];\n }\n // eslint-disable-next-line unicorn/no-useless-undefined\n return undefined;\n};\n\nexport default customizer;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\nimport yaml, { YAMLError } from \"yaml\";\n\nimport { 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\ntype ExtendedYAMLError = YAMLError & { annotation?: string };\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst tagsToObjects = (specs: Spec[], verbose?: boolean) => 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 && parsed.errors.length > 0) {\n parsed.errors.map<ExtendedYAMLError>((error) => {\n const newError: ExtendedYAMLError = error;\n\n newError.annotation = spec.description;\n\n return newError;\n });\n\n let errorString = \"Error parsing YAML in @openapi spec:\";\n\n errorString += verbose\n ? (parsed.errors as ExtendedYAMLError[])\n .map((error) => `${error.toString()}\\nImbedded within:\\n\\`\\`\\`\\n ${error?.annotation?.replace(/\\n/g, \"\\n \")}\\n\\`\\`\\``)\n .join(\"\\n\")\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): { spec: OpenApiObject; loc: number }[] => {\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments.map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n [\"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\", \"tags\"].forEach((property) => {\n if (typeof result[property] !== \"undefined\" && hasEmptyProperty(result[property])) {\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 spec,\n loc,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","import type { Spec } from \"comment-parser\";\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 */\nexport const mergeDeep = (first?: object, second?: 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 => Object.keys(object)\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[]) => tags.some((targetTag) => tag.name === targetTag.name);\n\nexport const getSwaggerVersionFromSpec = (tag: Spec) => {\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// eslint-disable-next-line radar/no-duplicate-string\nconst organizeSwaggerObject = (swaggerObject: Record<string, any>, annotation: Record<string, any>, property: string) => {\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 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"],"mappings":"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","names":["commentsToOpenApi","fs","path","parseComments","mergeWith","yaml","mergeWith","tagsToObjects","yaml","commentsToOpenApi","parseComments","mergeWith","comments_to_open_api_default","comments_to_open_api_default","fs"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visulima/jsdoc-open-api",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Generates swagger doc based on JSDoc.",
5
5
  "keywords": [
6
6
  "visulima",
@@ -74,7 +74,6 @@
74
74
  "cli-progress": "^3.11.2",
75
75
  "commander": "^9.4.1",
76
76
  "comment-parser": "^1.3.1",
77
- "debug": "^4.3.4",
78
77
  "lodash.mergewith": "^4.6.2",
79
78
  "yaml": "^2.1.3"
80
79
  },