@visulima/jsdoc-open-api 1.3.0 → 1.3.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/dist/index.d.ts CHANGED
@@ -12,7 +12,7 @@ interface BaseDefinition {
12
12
  }
13
13
 
14
14
  interface OpenApiObject extends BaseDefinition {
15
- paths: PathsObject;
15
+ paths?: PathsObject;
16
16
  }
17
17
 
18
18
  interface InfoObject {
@@ -48,11 +48,11 @@ interface ServerVariable {
48
48
  }
49
49
 
50
50
  interface ComponentsObject {
51
- schemas?: Map<SchemaObject | ReferenceObject>;
52
- responses?: Map<ResponseObject | ReferenceObject>;
51
+ schemas?: Map<ReferenceObject | SchemaObject>;
52
+ responses?: Map<ReferenceObject | ResponseObject>;
53
53
  parameters?: Map<ParameterObject | ReferenceObject>;
54
54
  examples?: Map<ExampleObject | ReferenceObject>;
55
- requestBodies?: Map<RequestBodyObject | ReferenceObject>;
55
+ requestBodies?: Map<ReferenceObject | RequestBodyObject>;
56
56
  headers?: Map<HeaderObject | ReferenceObject>;
57
57
  securitySchemes?: Map<
58
58
  ApiKeySecuritySchemeObject | HttpSecuritySchemeObject | Oauth2SecuritySchemeObject | OpenIdConnectSecuritySchemeObject | ReferenceObject
@@ -89,7 +89,7 @@ interface OperationObject {
89
89
  externalDocs?: ExternalDocumentationObject;
90
90
  operationId?: string;
91
91
  parameters?: (ParameterObject | ReferenceObject)[];
92
- requestBody?: RequestBodyObject | ReferenceObject;
92
+ requestBody?: ReferenceObject | RequestBodyObject;
93
93
  callbacks?: Map<CallbackObject | ReferenceObject>;
94
94
  deprecated?: boolean;
95
95
  security?: SecurityRequirementObject[];
@@ -112,7 +112,7 @@ interface ParameterObject {
112
112
  style?: string;
113
113
  explode?: string;
114
114
  allowReserved?: boolean;
115
- schema?: SchemaObject | ReferenceObject;
115
+ schema?: ReferenceObject | SchemaObject;
116
116
  example?: any;
117
117
  examples?: Map<ExampleObject | ReferenceObject>;
118
118
  //
@@ -128,7 +128,7 @@ interface RequestBodyObject {
128
128
  }
129
129
 
130
130
  interface MediaTypeObject {
131
- schema?: SchemaObject | ReferenceObject;
131
+ schema?: ReferenceObject | SchemaObject;
132
132
  example?: any;
133
133
  examples?: Map<ExampleObject | ReferenceObject>;
134
134
  encoding?: Map<EncodingObject>;
@@ -143,7 +143,7 @@ interface EncodingObject {
143
143
  }
144
144
 
145
145
  interface ResponsesObject {
146
- [code: string]: ResponseObject | ReferenceObject;
146
+ [code: string]: ReferenceObject | ResponseObject;
147
147
  }
148
148
 
149
149
  interface ResponseObject {
@@ -182,7 +182,7 @@ interface HeaderObject {
182
182
  style?: string;
183
183
  explode?: string;
184
184
  allowReserved?: boolean;
185
- schema?: SchemaObject | ReferenceObject;
185
+ schema?: ReferenceObject | SchemaObject;
186
186
  example?: any;
187
187
  examples?: Map<ExampleObject | ReferenceObject>;
188
188
  //
@@ -282,10 +282,10 @@ declare class SwaggerCompilerPlugin {
282
282
  private readonly sources;
283
283
  private readonly verbose;
284
284
  private readonly ignore;
285
- assetsPath: string;
285
+ private readonly assetsPath;
286
286
  constructor(assetsPath: string, sources: string[], swaggerDefinition: BaseDefinition, options: {
287
287
  verbose?: boolean;
288
- ignore?: string | ReadonlyArray<string>;
288
+ ignore?: ReadonlyArray<string> | string;
289
289
  });
290
290
  apply(compiler: Compiler): void;
291
291
  }
package/dist/index.js CHANGED
@@ -1,2 +1,34 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _chunk7NWDLEC5js = require('./chunk-7NWDLEC5.js');var _swaggerparser = require('@apidevtools/swagger-parser'); var _swaggerparser2 = _interopRequireDefault(_swaggerparser);var _readdir = require('@visulima/readdir');var _fs = require('fs');var _path = require('path');var _process = require('process');var O=["coverage/**",".github/**","packages/*/test{,s}/**","**/*.d.ts","test{,s}/**","test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}","**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}","**/__tests__/**","**/{ava,babel,nyc}.config.{js,cjs,mjs}","**/jest.config.{js,cjs,mjs,ts}","**/{karma,rollup,webpack}.config.js","**/.{eslint,mocha}rc.{js,cjs}","**/.{travis,yarnrc}.yml","**/{docker-compose,docker}.yml","**/.yamllint.{yaml,yml}","**/node_modules/**","**/pnpm-lock.yaml","**/pnpm-workspace.yaml","**/{package,package-lock}.json","**/yarn.lock","**/package.json5","**/.next/**"],h=t=>{t&&(console.error(t),_process.exit.call(void 0, 1))},d=class{constructor(r,u,i,e){this.assetsPath=r,this.swaggerDefinition=i,this.sources=u,this.verbose=e.verbose||!1,this.ignore=e.ignore||[]}apply(r){r.hooks.make.tapAsync("SwaggerCompilerPlugin",async(u,i)=>{console.log("Build paused, switching to swagger build");let e=new (0, _chunk7NWDLEC5js.a)(this.swaggerDefinition);for await(let s of this.sources){let a=await _readdir.collect.call(void 0, s,{skip:[...this.ignore,...O],extensions:[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],includeDirs:!1,minimatchOptions:{match:{debug:this.verbose,matchBase:!0},skip:{debug:this.verbose,matchBase:!0}}});this.verbose&&(console.log(`Found ${a.length} files in ${s}`),console.log(a)),a.forEach(n=>{this.verbose&&console.log(`Parsing file ${n}`);try{let l=_chunk7NWDLEC5js.c.call(void 0, n,_chunk7NWDLEC5js.d,this.verbose);e.addData(l.map(c=>c.spec));let j=_chunk7NWDLEC5js.c.call(void 0, n,_chunk7NWDLEC5js.e,this.verbose);e.addData(j.map(c=>c.spec))}catch(l){console.error(l),_process.exit.call(void 0, 1)}})}try{this.verbose&&(console.log("Validating swagger spec"),console.log(JSON.stringify(e,null,2))),await _swaggerparser2.default.validate(JSON.parse(JSON.stringify(e)))}catch(s){console.error(s.toJSON()),_process.exit.call(void 0, 1)}let{assetsPath:y}=this;_fs.mkdir.call(void 0, _path.dirname.call(void 0, y),{recursive:!0},s=>{s&&h(s),_fs.writeFile.call(void 0, y,JSON.stringify(e,null,2),h)}),this.verbose&&console.log(`Written swagger spec to "${this.assetsPath}" file`),console.log("switching back to normal build"),i()})}},S= exports.SwaggerCompilerPlugin =d;exports.SpecBuilder = _chunk7NWDLEC5js.a; exports.SwaggerCompilerPlugin = S; exports.jsDocumentCommentsToOpenApi = _chunk7NWDLEC5js.d; exports.parseFile = _chunk7NWDLEC5js.c; exports.swaggerJsDocumentCommentsToOpenApi = _chunk7NWDLEC5js.e; exports.yamlLoc = _chunk7NWDLEC5js.b;
1
+ 'use strict';
2
+
3
+ var chunkEN36WZ4R_js = require('./chunk-EN36WZ4R.js');
4
+ var v = require('@apidevtools/swagger-parser');
5
+ var readdir = require('@visulima/readdir');
6
+ var fs = require('fs');
7
+ var path = require('path');
8
+ var process = require('process');
9
+
10
+ var O=["coverage/**",".github/**","packages/*/test{,s}/**","**/*.d.ts","test{,s}/**","test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}","**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}","**/__tests__/**","**/{ava,babel,nyc}.config.{js,cjs,mjs}","**/jest.config.{js,cjs,mjs,ts}","**/{karma,rollup,webpack}.config.js","**/.{eslint,mocha}rc.{js,cjs}","**/.{travis,yarnrc}.yml","**/{docker-compose,docker}.yml","**/.yamllint.{yaml,yml}","**/node_modules/**","**/pnpm-lock.yaml","**/pnpm-workspace.yaml","**/{package,package-lock}.json","**/yarn.lock","**/package.json5","**/.next/**"],h=t=>{t&&(console.error(t),process.exit(1));},d=class{constructor(r,u,i,e){this.assetsPath=r,this.swaggerDefinition=i,this.sources=u,this.verbose=e.verbose??!1,this.ignore=e.ignore??[];}apply(r){r.hooks.make.tapAsync("SwaggerCompilerPlugin",async(u,i)=>{console.log("Build paused, switching to swagger build");let e=new chunkEN36WZ4R_js.a(this.swaggerDefinition);for await(let s of this.sources){let a=await readdir.collect(s,{skip:[...this.ignore,...O],extensions:[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],includeDirs:!1,minimatchOptions:{match:{debug:this.verbose,matchBase:!0},skip:{debug:this.verbose,matchBase:!0}}});this.verbose&&(console.log(`Found ${a.length} files in ${s}`),console.log(a)),a.forEach(n=>{this.verbose&&console.log(`Parsing file ${n}`);try{let l=chunkEN36WZ4R_js.c(n,chunkEN36WZ4R_js.d,this.verbose);e.addData(l.map(c=>c.spec));let b=chunkEN36WZ4R_js.c(n,chunkEN36WZ4R_js.e,this.verbose);e.addData(b.map(c=>c.spec));}catch(l){console.error(l),process.exit(1);}});}try{this.verbose&&(console.log("Validating swagger spec"),console.log(JSON.stringify(e,null,2))),await v.validate(JSON.parse(JSON.stringify(e)));}catch(s){console.error(s.toJSON()),process.exit(1);}let{assetsPath:y}=this;fs.mkdir(path.dirname(y),{recursive:!0},s=>{s&&h(s),fs.writeFile(y,JSON.stringify(e,null,2),h);}),this.verbose&&console.log(`Written swagger spec to "${this.assetsPath}" file`),console.log("switching back to normal build"),i();});}},S=d;
11
+
12
+ Object.defineProperty(exports, 'SpecBuilder', {
13
+ enumerable: true,
14
+ get: function () { return chunkEN36WZ4R_js.a; }
15
+ });
16
+ Object.defineProperty(exports, 'jsDocumentCommentsToOpenApi', {
17
+ enumerable: true,
18
+ get: function () { return chunkEN36WZ4R_js.d; }
19
+ });
20
+ Object.defineProperty(exports, 'parseFile', {
21
+ enumerable: true,
22
+ get: function () { return chunkEN36WZ4R_js.c; }
23
+ });
24
+ Object.defineProperty(exports, 'swaggerJsDocumentCommentsToOpenApi', {
25
+ enumerable: true,
26
+ get: function () { return chunkEN36WZ4R_js.e; }
27
+ });
28
+ Object.defineProperty(exports, 'yamlLoc', {
29
+ enumerable: true,
30
+ get: function () { return chunkEN36WZ4R_js.b; }
31
+ });
32
+ exports.SwaggerCompilerPlugin = S;
33
+ //# sourceMappingURL=out.js.map
2
34
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/webpack/swagger-compiler-plugin.ts"],"names":["SwaggerParser","collect","mkdir","writeFile","dirname","exit","exclude","errorHandler","error","SwaggerCompilerPlugin","assetsPath","sources","swaggerDefinition","options","compiler","_","callback","spec","spec_builder_default","dir","files","file","parsedJsDocumentFile","parse_file_default","comments_to_open_api_default","item","parsedSwaggerJsDocumentFile","swagger_compiler_plugin_default"],"mappings":"+DAAA,OAAOA,MAAmB,8BAC1B,OAAS,WAAAC,MAAe,oBACxB,OAAS,SAAAC,EAAO,aAAAC,MAAiB,KACjC,OAAS,WAAAC,MAAe,OACxB,OAAS,QAAAC,MAAY,UAUrB,IAAMC,EAAU,CACZ,cACA,aACA,yBACA,YACA,cACA,6CACA,iDACA,kBACA,yCACA,iCACA,sCACA,gCACA,0BACA,iCACA,0BACA,qBACA,oBACA,yBACA,iCACA,eACA,mBACA,aACJ,EAEMC,EAAgBC,GAAe,CAC7BA,IAEA,QAAQ,MAAMA,CAAK,EACnBH,EAAK,CAAC,EAEd,EAEMI,EAAN,KAA4B,CAWxB,YACIC,EACAC,EACAC,EACAC,EAIF,CACE,KAAK,WAAaH,EAClB,KAAK,kBAAoBE,EACzB,KAAK,QAAUD,EACf,KAAK,QAAUE,EAAQ,SAAW,GAClC,KAAK,OAASA,EAAQ,QAAU,CAAC,CACrC,CAEA,MAAMC,EAAoB,CACtBA,EAAS,MAAM,KAAK,SAAS,wBAAyB,MAAOC,EAAGC,IAA2B,CAEvF,QAAQ,IAAI,0CAA0C,EAEtD,IAAMC,EAAO,IAAIC,EAAY,KAAK,iBAAiB,EAGnD,cAAiBC,KAAO,KAAK,QAAS,CAClC,IAAMC,EAAQ,MAAMnB,EAAQkB,EAAK,CAE7B,KAAM,CAAC,GAAG,KAAK,OAAQ,GAAGb,CAAO,EACjC,WAAY,CAAC,MAAO,OAAQ,OAAQ,MAAO,OAAQ,OAAQ,QAAS,MAAM,EAC1E,YAAa,GACb,iBAAkB,CACd,MAAO,CACH,MAAO,KAAK,QACZ,UAAW,EACf,EACA,KAAM,CACF,MAAO,KAAK,QACZ,UAAW,EACf,CACJ,CACJ,CAAC,EAEG,KAAK,UAEL,QAAQ,IAAI,SAASc,EAAM,mBAAmBD,GAAK,EAEnD,QAAQ,IAAIC,CAAK,GAGrBA,EAAM,QAASC,GAAS,CAChB,KAAK,SAEL,QAAQ,IAAI,gBAAgBA,GAAM,EAGtC,GAAI,CACA,IAAMC,EAAuBC,EAAUF,EAAMG,EAA6B,KAAK,OAAO,EAEtFP,EAAK,QAAQK,EAAqB,IAAKG,GAASA,EAAK,IAAI,CAAC,EAE1D,IAAMC,EAA8BH,EAAUF,EAAMG,EAAoC,KAAK,OAAO,EAEpGP,EAAK,QAAQS,EAA4B,IAAKD,GAASA,EAAK,IAAI,CAAC,CACrE,OAASjB,EAAP,CAEE,QAAQ,MAAMA,CAAK,EACnBH,EAAK,CAAC,CACV,CACJ,CAAC,CACL,CAEA,GAAI,CACI,KAAK,UAEL,QAAQ,IAAI,yBAAyB,EAErC,QAAQ,IAAI,KAAK,UAAUY,EAAM,KAAM,CAAC,CAAC,GAG7C,MAAMjB,EAAc,SAAS,KAAK,MAAM,KAAK,UAAUiB,CAAI,CAAC,CAAC,CACjE,OAAST,EAAP,CAEE,QAAQ,MAAMA,EAAM,OAAO,CAAC,EAC5BH,EAAK,CAAC,CACV,CAEA,GAAM,CAAE,WAAAK,CAAW,EAAI,KAEvBR,EAAME,EAAQM,CAAU,EAAG,CAAE,UAAW,EAAK,EAAIF,GAAU,CACnDA,GACAD,EAAaC,CAAK,EAGtBL,EAAUO,EAAY,KAAK,UAAUO,EAAM,KAAM,CAAC,EAAGV,CAAY,CACrE,CAAC,EAGG,KAAK,SAEL,QAAQ,IAAI,4BAA4B,KAAK,kBAAkB,EAInE,QAAQ,IAAI,gCAAgC,EAE5CS,EAAS,CACb,CAAC,CACL,CACJ,EAEOW,EAAQlB","sourcesContent":["import SwaggerParser from \"@apidevtools/swagger-parser\";\nimport { collect } from \"@visulima/readdir\";\nimport { mkdir, writeFile } 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 includeDirs: false,\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 mkdir(dirname(assetsPath), { recursive: true }, (error) => {\n if (error) {\n errorHandler(error);\n }\n\n 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"]}
1
+ {"version":3,"sources":["../src/webpack/swagger-compiler-plugin.ts"],"names":["SwaggerParser","collect","mkdir","writeFile","dirname","exit","exclude","errorHandler","error","SwaggerCompilerPlugin","assetsPath","sources","swaggerDefinition","options","compiler","_","callback","spec","spec_builder_default","dir","files","file","parsedJsDocumentFile","parse_file_default","comments_to_open_api_default","item","parsedSwaggerJsDocumentFile","swagger_compiler_plugin_default"],"mappings":"oEAAA,OAAOA,MAAmB,8BAC1B,OAAS,WAAAC,MAAe,oBACxB,OAAS,SAAAC,EAAO,aAAAC,MAAiB,KACjC,OAAS,WAAAC,MAAe,OACxB,OAAS,QAAAC,MAAY,UAUrB,IAAMC,EAAU,CACZ,cACA,aACA,yBACA,YACA,cACA,6CACA,iDACA,kBACA,yCACA,iCACA,sCACA,gCACA,0BACA,iCACA,0BACA,qBACA,oBACA,yBACA,iCACA,eACA,mBACA,aACJ,EAEMC,EAAgBC,GAAe,CAC7BA,IAEA,QAAQ,MAAMA,CAAK,EACnBH,EAAK,CAAC,EAEd,EAEMI,EAAN,KAA4B,CAWjB,YACHC,EACAC,EACAC,EACAC,EAIF,CACE,KAAK,WAAaH,EAClB,KAAK,kBAAoBE,EACzB,KAAK,QAAUD,EACf,KAAK,QAAUE,EAAQ,SAAW,GAClC,KAAK,OAASA,EAAQ,QAAU,CAAC,CACrC,CAEO,MAAMC,EAA0B,CAEnCA,EAAS,MAAM,KAAK,SAAS,wBAAyB,MAAOC,EAAGC,IAA0C,CAEtG,QAAQ,IAAI,0CAA0C,EAEtD,IAAMC,EAAO,IAAIC,EAAY,KAAK,iBAAiB,EAGnD,cAAiBC,KAAO,KAAK,QAAS,CAClC,IAAMC,EAAQ,MAAMnB,EAAQkB,EAAK,CAE7B,KAAM,CAAC,GAAG,KAAK,OAAQ,GAAGb,CAAO,EACjC,WAAY,CAAC,MAAO,OAAQ,OAAQ,MAAO,OAAQ,OAAQ,QAAS,MAAM,EAC1E,YAAa,GACb,iBAAkB,CACd,MAAO,CACH,MAAO,KAAK,QACZ,UAAW,EACf,EACA,KAAM,CACF,MAAO,KAAK,QACZ,UAAW,EACf,CACJ,CACJ,CAAC,EAEG,KAAK,UAEL,QAAQ,IAAI,SAASc,EAAM,mBAAmBD,GAAK,EAEnD,QAAQ,IAAIC,CAAK,GAGrBA,EAAM,QAASC,GAAS,CAChB,KAAK,SAEL,QAAQ,IAAI,gBAAgBA,GAAM,EAGtC,GAAI,CACA,IAAMC,EAAuBC,EAAUF,EAAMG,EAA6B,KAAK,OAAO,EAEtFP,EAAK,QAAQK,EAAqB,IAAKG,GAASA,EAAK,IAAI,CAAC,EAE1D,IAAMC,EAA8BH,EAAUF,EAAMG,EAAoC,KAAK,OAAO,EAEpGP,EAAK,QAAQS,EAA4B,IAAKD,GAASA,EAAK,IAAI,CAAC,CACrE,OAASjB,EAAP,CAEE,QAAQ,MAAMA,CAAK,EACnBH,EAAK,CAAC,CACV,CACJ,CAAC,CACL,CAEA,GAAI,CACI,KAAK,UAEL,QAAQ,IAAI,yBAAyB,EAErC,QAAQ,IAAI,KAAK,UAAUY,EAAM,KAAM,CAAC,CAAC,GAG7C,MAAMjB,EAAc,SAAS,KAAK,MAAM,KAAK,UAAUiB,CAAI,CAAC,CAAC,CACjE,OAAST,EAAP,CAEE,QAAQ,MAAMA,EAAM,OAAO,CAAC,EAC5BH,EAAK,CAAC,CACV,CAEA,GAAM,CAAE,WAAAK,CAAW,EAAI,KAEvBR,EAAME,EAAQM,CAAU,EAAG,CAAE,UAAW,EAAK,EAAIF,GAAU,CACnDA,GACAD,EAAaC,CAAK,EAGtBL,EAAUO,EAAY,KAAK,UAAUO,EAAM,KAAM,CAAC,EAAGV,CAAY,CACrE,CAAC,EAGG,KAAK,SAEL,QAAQ,IAAI,4BAA4B,KAAK,kBAAkB,EAInE,QAAQ,IAAI,gCAAgC,EAE5CS,EAAS,CACb,CAAC,CACL,CACJ,EAEOW,EAAQlB","sourcesContent":["import SwaggerParser from \"@apidevtools/swagger-parser\";\nimport { collect } from \"@visulima/readdir\";\nimport { mkdir, writeFile } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { exit } from \"node:process\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport type { Compiler } from \"webpack\";\n\nimport type { BaseDefinition } from \"../exported.d\";\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: ReadonlyArray<string> | string;\n\n private readonly assetsPath: string;\n\n public constructor(\n assetsPath: string,\n sources: string[],\n swaggerDefinition: BaseDefinition,\n options: {\n verbose?: boolean;\n ignore?: ReadonlyArray<string> | 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 public apply(compiler: Compiler): void {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n compiler.hooks.make.tapAsync(\"SwaggerCompilerPlugin\", async (_, callback: VoidFunction): Promise<void> => {\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 includeDirs: false,\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 mkdir(dirname(assetsPath), { recursive: true }, (error) => {\n if (error) {\n errorHandler(error);\n }\n\n 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"]}
package/dist/index.mjs CHANGED
@@ -1,2 +1,13 @@
1
- import{a as m,b,c as o,d as p,e as g}from"./chunk-PLANANJA.mjs";import v from"@apidevtools/swagger-parser";import{collect as w}from"@visulima/readdir";import{mkdir as x,writeFile as k}from"fs";import{dirname as D}from"path";import{exit as f}from"process";var O=["coverage/**",".github/**","packages/*/test{,s}/**","**/*.d.ts","test{,s}/**","test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}","**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}","**/__tests__/**","**/{ava,babel,nyc}.config.{js,cjs,mjs}","**/jest.config.{js,cjs,mjs,ts}","**/{karma,rollup,webpack}.config.js","**/.{eslint,mocha}rc.{js,cjs}","**/.{travis,yarnrc}.yml","**/{docker-compose,docker}.yml","**/.yamllint.{yaml,yml}","**/node_modules/**","**/pnpm-lock.yaml","**/pnpm-workspace.yaml","**/{package,package-lock}.json","**/yarn.lock","**/package.json5","**/.next/**"],h=t=>{t&&(console.error(t),f(1))},d=class{constructor(r,u,i,e){this.assetsPath=r,this.swaggerDefinition=i,this.sources=u,this.verbose=e.verbose||!1,this.ignore=e.ignore||[]}apply(r){r.hooks.make.tapAsync("SwaggerCompilerPlugin",async(u,i)=>{console.log("Build paused, switching to swagger build");let e=new m(this.swaggerDefinition);for await(let s of this.sources){let a=await w(s,{skip:[...this.ignore,...O],extensions:[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],includeDirs:!1,minimatchOptions:{match:{debug:this.verbose,matchBase:!0},skip:{debug:this.verbose,matchBase:!0}}});this.verbose&&(console.log(`Found ${a.length} files in ${s}`),console.log(a)),a.forEach(n=>{this.verbose&&console.log(`Parsing file ${n}`);try{let l=o(n,p,this.verbose);e.addData(l.map(c=>c.spec));let j=o(n,g,this.verbose);e.addData(j.map(c=>c.spec))}catch(l){console.error(l),f(1)}})}try{this.verbose&&(console.log("Validating swagger spec"),console.log(JSON.stringify(e,null,2))),await v.validate(JSON.parse(JSON.stringify(e)))}catch(s){console.error(s.toJSON()),f(1)}let{assetsPath:y}=this;x(D(y),{recursive:!0},s=>{s&&h(s),k(y,JSON.stringify(e,null,2),h)}),this.verbose&&console.log(`Written swagger spec to "${this.assetsPath}" file`),console.log("switching back to normal build"),i()})}},S=d;export{m as SpecBuilder,S as SwaggerCompilerPlugin,p as jsDocumentCommentsToOpenApi,o as parseFile,g as swaggerJsDocumentCommentsToOpenApi,b as yamlLoc};
1
+ import { a, c, d as d$1, e } from './chunk-Z6YPVMB5.mjs';
2
+ export { a as SpecBuilder, d as jsDocumentCommentsToOpenApi, c as parseFile, e as swaggerJsDocumentCommentsToOpenApi, b as yamlLoc } from './chunk-Z6YPVMB5.mjs';
3
+ import v from '@apidevtools/swagger-parser';
4
+ import { collect } from '@visulima/readdir';
5
+ import { mkdir, writeFile } from 'fs';
6
+ import { dirname } from 'path';
7
+ import { exit } from 'process';
8
+
9
+ var O=["coverage/**",".github/**","packages/*/test{,s}/**","**/*.d.ts","test{,s}/**","test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}","**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}","**/__tests__/**","**/{ava,babel,nyc}.config.{js,cjs,mjs}","**/jest.config.{js,cjs,mjs,ts}","**/{karma,rollup,webpack}.config.js","**/.{eslint,mocha}rc.{js,cjs}","**/.{travis,yarnrc}.yml","**/{docker-compose,docker}.yml","**/.yamllint.{yaml,yml}","**/node_modules/**","**/pnpm-lock.yaml","**/pnpm-workspace.yaml","**/{package,package-lock}.json","**/yarn.lock","**/package.json5","**/.next/**"],h=t=>{t&&(console.error(t),exit(1));},d=class{constructor(r,u,i,e){this.assetsPath=r,this.swaggerDefinition=i,this.sources=u,this.verbose=e.verbose??!1,this.ignore=e.ignore??[];}apply(r){r.hooks.make.tapAsync("SwaggerCompilerPlugin",async(u,i)=>{console.log("Build paused, switching to swagger build");let e$1=new a(this.swaggerDefinition);for await(let s of this.sources){let a=await collect(s,{skip:[...this.ignore,...O],extensions:[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],includeDirs:!1,minimatchOptions:{match:{debug:this.verbose,matchBase:!0},skip:{debug:this.verbose,matchBase:!0}}});this.verbose&&(console.log(`Found ${a.length} files in ${s}`),console.log(a)),a.forEach(n=>{this.verbose&&console.log(`Parsing file ${n}`);try{let l=c(n,d$1,this.verbose);e$1.addData(l.map(c=>c.spec));let b=c(n,e,this.verbose);e$1.addData(b.map(c=>c.spec));}catch(l){console.error(l),exit(1);}});}try{this.verbose&&(console.log("Validating swagger spec"),console.log(JSON.stringify(e$1,null,2))),await v.validate(JSON.parse(JSON.stringify(e$1)));}catch(s){console.error(s.toJSON()),exit(1);}let{assetsPath:y}=this;mkdir(dirname(y),{recursive:!0},s=>{s&&h(s),writeFile(y,JSON.stringify(e$1,null,2),h);}),this.verbose&&console.log(`Written swagger spec to "${this.assetsPath}" file`),console.log("switching back to normal build"),i();});}},S=d;
10
+
11
+ export { S as SwaggerCompilerPlugin };
12
+ //# sourceMappingURL=out.js.map
2
13
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/webpack/swagger-compiler-plugin.ts"],"sourcesContent":["import SwaggerParser from \"@apidevtools/swagger-parser\";\nimport { collect } from \"@visulima/readdir\";\nimport { mkdir, writeFile } 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 includeDirs: false,\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 mkdir(dirname(assetsPath), { recursive: true }, (error) => {\n if (error) {\n errorHandler(error);\n }\n\n 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"],"mappings":"gEAAA,OAAOA,MAAmB,8BAC1B,OAAS,WAAAC,MAAe,oBACxB,OAAS,SAAAC,EAAO,aAAAC,MAAiB,KACjC,OAAS,WAAAC,MAAe,OACxB,OAAS,QAAAC,MAAY,UAUrB,IAAMC,EAAU,CACZ,cACA,aACA,yBACA,YACA,cACA,6CACA,iDACA,kBACA,yCACA,iCACA,sCACA,gCACA,0BACA,iCACA,0BACA,qBACA,oBACA,yBACA,iCACA,eACA,mBACA,aACJ,EAEMC,EAAgBC,GAAe,CAC7BA,IAEA,QAAQ,MAAMA,CAAK,EACnBC,EAAK,CAAC,EAEd,EAEMC,EAAN,KAA4B,CAWxB,YACIC,EACAC,EACAC,EACAC,EAIF,CACE,KAAK,WAAaH,EAClB,KAAK,kBAAoBE,EACzB,KAAK,QAAUD,EACf,KAAK,QAAUE,EAAQ,SAAW,GAClC,KAAK,OAASA,EAAQ,QAAU,CAAC,CACrC,CAEA,MAAMC,EAAoB,CACtBA,EAAS,MAAM,KAAK,SAAS,wBAAyB,MAAOC,EAAGC,IAA2B,CAEvF,QAAQ,IAAI,0CAA0C,EAEtD,IAAMC,EAAO,IAAIC,EAAY,KAAK,iBAAiB,EAGnD,cAAiBC,KAAO,KAAK,QAAS,CAClC,IAAMC,EAAQ,MAAMC,EAAQF,EAAK,CAE7B,KAAM,CAAC,GAAG,KAAK,OAAQ,GAAGd,CAAO,EACjC,WAAY,CAAC,MAAO,OAAQ,OAAQ,MAAO,OAAQ,OAAQ,QAAS,MAAM,EAC1E,YAAa,GACb,iBAAkB,CACd,MAAO,CACH,MAAO,KAAK,QACZ,UAAW,EACf,EACA,KAAM,CACF,MAAO,KAAK,QACZ,UAAW,EACf,CACJ,CACJ,CAAC,EAEG,KAAK,UAEL,QAAQ,IAAI,SAASe,EAAM,mBAAmBD,GAAK,EAEnD,QAAQ,IAAIC,CAAK,GAGrBA,EAAM,QAASE,GAAS,CAChB,KAAK,SAEL,QAAQ,IAAI,gBAAgBA,GAAM,EAGtC,GAAI,CACA,IAAMC,EAAuBC,EAAUF,EAAMG,EAA6B,KAAK,OAAO,EAEtFR,EAAK,QAAQM,EAAqB,IAAKG,GAASA,EAAK,IAAI,CAAC,EAE1D,IAAMC,EAA8BH,EAAUF,EAAMG,EAAoC,KAAK,OAAO,EAEpGR,EAAK,QAAQU,EAA4B,IAAKD,GAASA,EAAK,IAAI,CAAC,CACrE,OAASnB,EAAP,CAEE,QAAQ,MAAMA,CAAK,EACnBC,EAAK,CAAC,CACV,CACJ,CAAC,CACL,CAEA,GAAI,CACI,KAAK,UAEL,QAAQ,IAAI,yBAAyB,EAErC,QAAQ,IAAI,KAAK,UAAUS,EAAM,KAAM,CAAC,CAAC,GAG7C,MAAMW,EAAc,SAAS,KAAK,MAAM,KAAK,UAAUX,CAAI,CAAC,CAAC,CACjE,OAASV,EAAP,CAEE,QAAQ,MAAMA,EAAM,OAAO,CAAC,EAC5BC,EAAK,CAAC,CACV,CAEA,GAAM,CAAE,WAAAE,CAAW,EAAI,KAEvBmB,EAAMC,EAAQpB,CAAU,EAAG,CAAE,UAAW,EAAK,EAAIH,GAAU,CACnDA,GACAD,EAAaC,CAAK,EAGtBwB,EAAUrB,EAAY,KAAK,UAAUO,EAAM,KAAM,CAAC,EAAGX,CAAY,CACrE,CAAC,EAGG,KAAK,SAEL,QAAQ,IAAI,4BAA4B,KAAK,kBAAkB,EAInE,QAAQ,IAAI,gCAAgC,EAE5CU,EAAS,CACb,CAAC,CACL,CACJ,EAEOgB,EAAQvB","names":["SwaggerParser","collect","mkdir","writeFile","dirname","exit","exclude","errorHandler","error","exit","SwaggerCompilerPlugin","assetsPath","sources","swaggerDefinition","options","compiler","_","callback","spec","spec_builder_default","dir","files","collect","file","parsedJsDocumentFile","parse_file_default","comments_to_open_api_default","item","parsedSwaggerJsDocumentFile","SwaggerParser","mkdir","dirname","writeFile","swagger_compiler_plugin_default"]}
1
+ {"version":3,"sources":["../src/webpack/swagger-compiler-plugin.ts"],"names":["SwaggerParser","collect","mkdir","writeFile","dirname","exit","exclude","errorHandler","error","SwaggerCompilerPlugin","assetsPath","sources","swaggerDefinition","options","compiler","_","callback","spec","spec_builder_default","dir","files","file","parsedJsDocumentFile","parse_file_default","comments_to_open_api_default","item","parsedSwaggerJsDocumentFile","swagger_compiler_plugin_default"],"mappings":"qEAAA,OAAOA,MAAmB,8BAC1B,OAAS,WAAAC,MAAe,oBACxB,OAAS,SAAAC,EAAO,aAAAC,MAAiB,KACjC,OAAS,WAAAC,MAAe,OACxB,OAAS,QAAAC,MAAY,UAUrB,IAAMC,EAAU,CACZ,cACA,aACA,yBACA,YACA,cACA,6CACA,iDACA,kBACA,yCACA,iCACA,sCACA,gCACA,0BACA,iCACA,0BACA,qBACA,oBACA,yBACA,iCACA,eACA,mBACA,aACJ,EAEMC,EAAgBC,GAAe,CAC7BA,IAEA,QAAQ,MAAMA,CAAK,EACnBH,EAAK,CAAC,EAEd,EAEMI,EAAN,KAA4B,CAWjB,YACHC,EACAC,EACAC,EACAC,EAIF,CACE,KAAK,WAAaH,EAClB,KAAK,kBAAoBE,EACzB,KAAK,QAAUD,EACf,KAAK,QAAUE,EAAQ,SAAW,GAClC,KAAK,OAASA,EAAQ,QAAU,CAAC,CACrC,CAEO,MAAMC,EAA0B,CAEnCA,EAAS,MAAM,KAAK,SAAS,wBAAyB,MAAOC,EAAGC,IAA0C,CAEtG,QAAQ,IAAI,0CAA0C,EAEtD,IAAMC,EAAO,IAAIC,EAAY,KAAK,iBAAiB,EAGnD,cAAiBC,KAAO,KAAK,QAAS,CAClC,IAAMC,EAAQ,MAAMnB,EAAQkB,EAAK,CAE7B,KAAM,CAAC,GAAG,KAAK,OAAQ,GAAGb,CAAO,EACjC,WAAY,CAAC,MAAO,OAAQ,OAAQ,MAAO,OAAQ,OAAQ,QAAS,MAAM,EAC1E,YAAa,GACb,iBAAkB,CACd,MAAO,CACH,MAAO,KAAK,QACZ,UAAW,EACf,EACA,KAAM,CACF,MAAO,KAAK,QACZ,UAAW,EACf,CACJ,CACJ,CAAC,EAEG,KAAK,UAEL,QAAQ,IAAI,SAASc,EAAM,mBAAmBD,GAAK,EAEnD,QAAQ,IAAIC,CAAK,GAGrBA,EAAM,QAASC,GAAS,CAChB,KAAK,SAEL,QAAQ,IAAI,gBAAgBA,GAAM,EAGtC,GAAI,CACA,IAAMC,EAAuBC,EAAUF,EAAMG,EAA6B,KAAK,OAAO,EAEtFP,EAAK,QAAQK,EAAqB,IAAKG,GAASA,EAAK,IAAI,CAAC,EAE1D,IAAMC,EAA8BH,EAAUF,EAAMG,EAAoC,KAAK,OAAO,EAEpGP,EAAK,QAAQS,EAA4B,IAAKD,GAASA,EAAK,IAAI,CAAC,CACrE,OAASjB,EAAP,CAEE,QAAQ,MAAMA,CAAK,EACnBH,EAAK,CAAC,CACV,CACJ,CAAC,CACL,CAEA,GAAI,CACI,KAAK,UAEL,QAAQ,IAAI,yBAAyB,EAErC,QAAQ,IAAI,KAAK,UAAUY,EAAM,KAAM,CAAC,CAAC,GAG7C,MAAMjB,EAAc,SAAS,KAAK,MAAM,KAAK,UAAUiB,CAAI,CAAC,CAAC,CACjE,OAAST,EAAP,CAEE,QAAQ,MAAMA,EAAM,OAAO,CAAC,EAC5BH,EAAK,CAAC,CACV,CAEA,GAAM,CAAE,WAAAK,CAAW,EAAI,KAEvBR,EAAME,EAAQM,CAAU,EAAG,CAAE,UAAW,EAAK,EAAIF,GAAU,CACnDA,GACAD,EAAaC,CAAK,EAGtBL,EAAUO,EAAY,KAAK,UAAUO,EAAM,KAAM,CAAC,EAAGV,CAAY,CACrE,CAAC,EAGG,KAAK,SAEL,QAAQ,IAAI,4BAA4B,KAAK,kBAAkB,EAInE,QAAQ,IAAI,gCAAgC,EAE5CS,EAAS,CACb,CAAC,CACL,CACJ,EAEOW,EAAQlB","sourcesContent":["import SwaggerParser from \"@apidevtools/swagger-parser\";\nimport { collect } from \"@visulima/readdir\";\nimport { mkdir, writeFile } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { exit } from \"node:process\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport type { Compiler } from \"webpack\";\n\nimport type { BaseDefinition } from \"../exported.d\";\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: ReadonlyArray<string> | string;\n\n private readonly assetsPath: string;\n\n public constructor(\n assetsPath: string,\n sources: string[],\n swaggerDefinition: BaseDefinition,\n options: {\n verbose?: boolean;\n ignore?: ReadonlyArray<string> | 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 public apply(compiler: Compiler): void {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n compiler.hooks.make.tapAsync(\"SwaggerCompilerPlugin\", async (_, callback: VoidFunction): Promise<void> => {\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 includeDirs: false,\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 mkdir(dirname(assetsPath), { recursive: true }, (error) => {\n if (error) {\n errorHandler(error);\n }\n\n 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visulima/jsdoc-open-api",
3
- "version": "1.3.0",
3
+ "version": "1.3.2",
4
4
  "description": "Generates swagger doc based on JSDoc.",
5
5
  "keywords": [
6
6
  "visulima",
@@ -59,11 +59,6 @@
59
59
  },
60
60
  "main": "dist/index.js",
61
61
  "module": "dist/index.mjs",
62
- "sources": [
63
- "src/index.ts",
64
- "src/cli/index.ts",
65
- "src/cli/commander/index.ts"
66
- ],
67
62
  "types": "dist/index.d.ts",
68
63
  "bin": {
69
64
  "jsdoc-open-api": "./bin/index.js"
@@ -79,75 +74,81 @@
79
74
  "scripts": {
80
75
  "build": "cross-env NODE_ENV=development tsup",
81
76
  "build:prod": "cross-env NODE_ENV=production tsup",
82
- "clean": "rimraf node_modules dist",
77
+ "clean": "rimraf node_modules dist .eslintcache",
83
78
  "coverage": "vitest run --coverage",
84
79
  "dev": "pnpm predev && pnpm run build --watch",
85
80
  "lint:eslint": "cross-env NO_LOGS=true eslint . --ext js,jsx,ts,tsx --max-warnings=0 --config .eslintrc.cjs --cache --cache-strategy content .",
86
81
  "lint:eslint:fix": "pnpm run lint:eslint --fix",
87
- "test": "vitest"
82
+ "test": "vitest run",
83
+ "test:watch": "vitest"
88
84
  },
89
85
  "dependencies": {
90
86
  "@apidevtools/swagger-parser": "^10.1.0",
91
- "@visulima/readdir": "1.3.2",
87
+ "@visulima/readdir": "1.3.4",
92
88
  "comment-parser": "^1.3.1",
93
89
  "lodash.mergewith": "^4.6.2",
94
- "yaml": "^2.1.3"
90
+ "yaml": "^2.2.1"
95
91
  },
96
92
  "devDependencies": {
97
- "cli-progress": "^3.11.2",
98
- "@types/cli-progress": "^3.11.0",
99
- "commander": "^9.4.1",
100
- "@anolilab/eslint-config": "^4.0.9",
101
- "@anolilab/semantic-release-preset": "^2.0.7",
93
+ "@anolilab/eslint-config": "^5.0.2",
94
+ "@anolilab/semantic-release-preset": "^2.2.0",
102
95
  "@rushstack/eslint-plugin-security": "^0.5.0",
103
- "@types/http-errors": "^2.0.0",
96
+ "@types/cli-progress": "^3.11.0",
97
+ "@types/http-errors": "^2.0.1",
104
98
  "@types/lodash.mergewith": "^4.6.7",
105
- "@types/node": "^18.8.4",
99
+ "@types/node": "^18.11.18",
106
100
  "@types/webpack": "^5.28.0",
107
- "@typescript-eslint/eslint-plugin": "^5.40.0",
108
- "@typescript-eslint/parser": "^5.40.0",
101
+ "@typescript-eslint/eslint-plugin": "^5.49.0",
102
+ "@typescript-eslint/parser": "^5.49.0",
109
103
  "c8": "^7.12.0",
104
+ "cli-progress": "^3.11.2",
105
+ "commander": "^10.0.0",
110
106
  "cross-env": "^7.0.3",
111
- "eslint": "^8.25.0",
107
+ "eslint": "^8.32.0",
112
108
  "eslint-plugin-compat": "^4.0.2",
113
109
  "eslint-plugin-eslint-comments": "^3.2.0",
114
- "eslint-plugin-import": "^2.26.0",
110
+ "eslint-plugin-import": "^2.27.5",
115
111
  "eslint-plugin-json": "^3.1.0",
116
- "eslint-plugin-jsonc": "^2.5.0",
117
- "eslint-plugin-jsx-a11y": "^6.6.1",
112
+ "eslint-plugin-jsonc": "^2.6.0",
113
+ "eslint-plugin-jsx-a11y": "^6.7.1",
118
114
  "eslint-plugin-markdown": "^3.0.0",
119
115
  "eslint-plugin-material-ui": "^1.0.1",
120
116
  "eslint-plugin-no-loops": "^0.3.0",
121
117
  "eslint-plugin-no-secrets": "^0.8.9",
122
118
  "eslint-plugin-node": "^11.1.0",
123
119
  "eslint-plugin-optimize-regex": "^1.2.1",
124
- "eslint-plugin-promise": "^6.0.1",
120
+ "eslint-plugin-promise": "^6.1.1",
125
121
  "eslint-plugin-radar": "^0.2.1",
126
- "eslint-plugin-simple-import-sort": "^8.0.0",
122
+ "eslint-plugin-simple-import-sort": "^9.0.0",
127
123
  "eslint-plugin-sort-keys-fix": "^1.1.2",
128
- "eslint-plugin-testing-library": "^5.7.2",
129
- "eslint-plugin-unicorn": "^45.0.0",
124
+ "eslint-plugin-testing-library": "^5.10.0",
125
+ "eslint-plugin-unicorn": "^45.0.2",
130
126
  "eslint-plugin-you-dont-need-lodash-underscore": "^6.12.0",
131
127
  "eslint-plugin-you-dont-need-momentjs": "^1.6.0",
132
- "openapi-types": "^12.0.2",
133
- "prettier": "^2.7.1",
128
+ "openapi-types": "^12.1.0",
129
+ "prettier": "^2.8.3",
134
130
  "read-pkg": "^7.1.0",
135
- "rimraf": "^3.0.2",
136
- "semantic-release": "^19.0.5",
137
- "tsup": "^6.2.3",
138
- "typescript": "^4.8.4",
139
- "vitest": "^0.26.1",
140
- "webpack": "^5.74.0"
131
+ "rimraf": "^4.1.2",
132
+ "semantic-release": "^20.1.0",
133
+ "tsup": "^6.5.0",
134
+ "typescript": "^4.9.4",
135
+ "vitest": "^0.28.2",
136
+ "webpack": "^5.75.0"
141
137
  },
142
138
  "optionalDependencies": {
143
139
  "cli-progress": "^3.11.2",
144
- "commander": "^9.4.1",
145
- "webpack": "^5.74.0"
140
+ "commander": "^10.0.0",
141
+ "webpack": "^5.75.0"
146
142
  },
147
143
  "engines": {
148
- "node": ">=16"
144
+ "node": ">=16.18.0 <=19.*"
149
145
  },
150
146
  "publishConfig": {
151
147
  "access": "public"
152
- }
148
+ },
149
+ "sources": [
150
+ "src/index.ts",
151
+ "src/cli/index.ts",
152
+ "src/cli/commander/index.ts"
153
+ ]
153
154
  }
@@ -1,39 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _chunk7NWDLEC5js = require('./chunk-7NWDLEC5.js');var _fs = require('fs');var k=o=>{if(_fs.existsSync.call(void 0, o))throw new Error("Config file already exists");_fs.writeFileSync.call(void 0, o,`module.exports = {
2
- exclude: [
3
- 'coverage/**',
4
- '.github/**',
5
- 'packages/*/test{,s}/**',
6
- '**/*.d.ts',
7
- 'test{,s}/**',
8
- 'test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}',
9
- '**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}',
10
- '**/__tests__/**',
11
- '**/{ava,babel,nyc}.config.{js,cjs,mjs}',
12
- '**/jest.config.{js,cjs,mjs,ts}',
13
- '**/{karma,rollup,webpack}.config.js',
14
- '**/.{eslint,mocha}rc.{js,cjs}',
15
- '**/.{travis,yarnrc}.yml',
16
- '**/{docker-compose,docker}.yml',
17
- '**/.yamllint.{yaml,yml}',
18
- '**/node_modules/**',
19
- '**/pnpm-lock.yaml',
20
- '**/pnpm-workspace.yaml',
21
- '**/{package,package-lock}.json',
22
- '**/yarn.lock',
23
- '**/package.json5',
24
- '**/.next/**',
25
- ],
26
- followSymlinks: false,
27
- swaggerDefinition: {
28
- openapi: '3.0.0',
29
- info: {
30
- title: 'API',
31
- version: '1.0.0',
32
- },
33
- },
34
- };
35
- `),console.log(`Created "${o}"`)},$= exports.a =k;var _swaggerparser = require('@apidevtools/swagger-parser'); var _swaggerparser2 = _interopRequireDefault(_swaggerparser);var _readdir = require('@visulima/readdir');var _cliprogress = require('cli-progress'); var _cliprogress2 = _interopRequireDefault(_cliprogress);var _path = require('path');var J=async(o,y,e)=>{let s={exclude:[],swaggerDefinition:{}};try{s=await Promise.resolve().then(() => require(_path.resolve.call(void 0, e.config||o)))}catch (e2){throw new Error(`No config file found, on: ${e.config||".openapirc.js"}
36
- `)}let m=new _cliprogress2.default.MultiBar({clearOnComplete:!1,hideCursor:!0,format:"{value}/{total} | {bar} | {filename}"},_cliprogress2.default.Presets.shades_grey),r=new (0, _chunk7NWDLEC5js.a)(s.swaggerDefinition);for await(let i of y){_fs.lstatSync.call(void 0, i).isDirectory();let n=await _readdir.collect.call(void 0, i,{skip:[...s.exclude,"node_modules/**"],extensions:s.extensions||[".js",".cjs",".mjs",".ts",".tsx",".jsx",".yaml",".yml"],followSymlinks:s.followSymlinks||!1,match:s.include,minimatchOptions:{match:{debug:e.verbose,matchBase:!0},skip:{debug:e.verbose,matchBase:!0}}});(e.verbose||e.veryVerbose)&&console.log(`
37
- Found ${n.length} files in ${i}`),e.veryVerbose&&console.log(n);let u=m.create(n.length,0);n.forEach(a=>{e.verbose&&console.log(`Parsing file ${a}`),u.increment(1,{filename:i});let w=_chunk7NWDLEC5js.c.call(void 0, a,_chunk7NWDLEC5js.d,e.verbose);r.addData(w.map(l=>l.spec));let j=_chunk7NWDLEC5js.c.call(void 0, a,_chunk7NWDLEC5js.e,e.verbose);r.addData(j.map(l=>l.spec))})}e.verbose&&console.log("Validating swagger spec"),e.veryVerbose&&console.log(JSON.stringify(r,null,2)),await _swaggerparser2.default.validate(JSON.parse(JSON.stringify(r)));let t=e.output||"swagger.json";m.stop(),e.verbose&&console.log(`Written swagger spec to "${t}" file`),_fs.mkdirSync.call(void 0, _path.dirname.call(void 0, t),{recursive:!0}),_fs.writeFileSync.call(void 0, t,JSON.stringify(r,null,2)),console.log(`
38
- Swagger specification is ready, check the${t}file.`)},q= exports.b =J;exports.a = $; exports.b = q;
39
- //# sourceMappingURL=chunk-5JAJAHLD.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/command/init-command.ts","../src/cli/command/generate-command.ts"],"names":["existsSync","writeFileSync","initCommand","configName","init_command_default","SwaggerParser","collect","cliProgress","lstatSync","mkdirSync","dirname","resolve","generateCommand","paths","options","openapiConfig","multibar","spec","spec_builder_default","dir","files","bar","file","parsedJsDocumentFile","parse_file_default","comments_to_open_api_default","item","parsedSwaggerJsDocumentFile","output","generate_command_default"],"mappings":"wDAAA,OAAS,cAAAA,EAAY,iBAAAC,MAAqB,KAE1C,IAAMC,EAAeC,GAAuB,CACxC,GAAIH,EAAWG,CAAU,EACrB,MAAM,IAAI,MAAM,4BAA4B,EAGhDF,EACIE,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAmCJ,EAGA,QAAQ,IAAI,YAAYA,IAAa,CACzC,EAEOC,EAAQF,EClDf,OAAOG,MAAmB,8BAC1B,OAAS,WAAAC,MAAe,oBAExB,OAAOC,MAAiB,eACxB,OAAS,aAAAC,EAAW,aAAAC,EAAW,iBAAAR,MAAqB,KACpD,OAAS,WAAAS,EAAS,WAAAC,MAAe,OAQjC,IAAMC,EAAkB,MAAOT,EAAoBU,EAAiBC,IAM9D,CACF,IAAIC,EAMA,CACA,QAAS,CAAC,EACV,kBAAmB,CAAC,CACxB,EAEA,GAAI,CAEAA,EAAgB,MAAM,OAAOJ,EAAQG,EAAQ,QAAUX,CAAU,EACrE,MAAE,CACE,MAAM,IAAI,MAAM,6BAA6BW,EAAQ,QAAU;AAAA,CAAmB,CACtF,CAEA,IAAME,EAAW,IAAIT,EAAY,SAC7B,CACI,gBAAiB,GACjB,WAAY,GACZ,OAAQ,sCACZ,EACAA,EAAY,QAAQ,WACxB,EACMU,EAAO,IAAIC,EAAYH,EAAc,iBAAiB,EAG5D,cAAiBI,KAAON,EAAO,CAE3BL,EAAUW,CAAG,EAAE,YAAY,EAE3B,IAAMC,EAAQ,MAAMd,EAAQa,EAAK,CAE7B,KAAM,CAAC,GAAGJ,EAAc,QAAS,iBAAiB,EAClD,WAAYA,EAAc,YAAc,CAAC,MAAO,OAAQ,OAAQ,MAAO,OAAQ,OAAQ,QAAS,MAAM,EACtG,eAAgBA,EAAc,gBAAkB,GAChD,MAAOA,EAAc,QACrB,iBAAkB,CACd,MAAO,CACH,MAAOD,EAAQ,QACf,UAAW,EACf,EACA,KAAM,CACF,MAAOA,EAAQ,QACf,UAAW,EACf,CACJ,CACJ,CAAC,GAEGA,EAAQ,SAAWA,EAAQ,cAE3B,QAAQ,IAAI;AAAA,QAAWM,EAAM,mBAAmBD,GAAK,EAGrDL,EAAQ,aAER,QAAQ,IAAIM,CAAK,EAGrB,IAAMC,EAAML,EAAS,OAAOI,EAAM,OAAQ,CAAC,EAE3CA,EAAM,QAASE,GAAS,CAChBR,EAAQ,SAER,QAAQ,IAAI,gBAAgBQ,GAAM,EAGtCD,EAAI,UAAU,EAAG,CAAE,SAAUF,CAAI,CAAC,EAElC,IAAMI,EAAuBC,EAAUF,EAAMG,EAA6BX,EAAQ,OAAO,EAEzFG,EAAK,QAAQM,EAAqB,IAAKG,GAASA,EAAK,IAAI,CAAC,EAE1D,IAAMC,EAA8BH,EAAUF,EAAMG,EAAoCX,EAAQ,OAAO,EAEvGG,EAAK,QAAQU,EAA4B,IAAKD,GAASA,EAAK,IAAI,CAAC,CACrE,CAAC,CACL,CAEIZ,EAAQ,SAER,QAAQ,IAAI,yBAAyB,EAGrCA,EAAQ,aAER,QAAQ,IAAI,KAAK,UAAUG,EAAM,KAAM,CAAC,CAAC,EAG7C,MAAMZ,EAAc,SAAS,KAAK,MAAM,KAAK,UAAUY,CAAI,CAAC,CAAC,EAE7D,IAAMW,EAASd,EAAQ,QAAU,eAEjCE,EAAS,KAAK,EAEVF,EAAQ,SAER,QAAQ,IAAI,4BAA4Bc,SAAc,EAI1DnB,EAAUC,EAAQkB,CAAM,EAAG,CAAE,UAAW,EAAK,CAAC,EAC9C3B,EAAc2B,EAAQ,KAAK,UAAUX,EAAM,KAAM,CAAC,CAAC,EAGnD,QAAQ,IAAI;AAAA,2CAA8CW,QAAa,CAC3E,EAEOC,EAAQjB","sourcesContent":["import { existsSync, writeFileSync } from \"node:fs\";\n\nconst initCommand = (configName: string) => {\n if (existsSync(configName)) {\n throw new Error(\"Config file already exists\");\n }\n\n writeFileSync(\n configName,\n `module.exports = {\n exclude: [\n 'coverage/**',\n '.github/**',\n 'packages/*/test{,s}/**',\n '**/*.d.ts',\n 'test{,s}/**',\n 'test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}',\n '**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}',\n '**/__tests__/**',\n '**/{ava,babel,nyc}.config.{js,cjs,mjs}',\n '**/jest.config.{js,cjs,mjs,ts}',\n '**/{karma,rollup,webpack}.config.js',\n '**/.{eslint,mocha}rc.{js,cjs}',\n '**/.{travis,yarnrc}.yml',\n '**/{docker-compose,docker}.yml',\n '**/.yamllint.{yaml,yml}',\n '**/node_modules/**',\n '**/pnpm-lock.yaml',\n '**/pnpm-workspace.yaml',\n '**/{package,package-lock}.json',\n '**/yarn.lock',\n '**/package.json5',\n '**/.next/**',\n ],\n followSymlinks: false,\n swaggerDefinition: {\n openapi: '3.0.0',\n info: {\n title: 'API',\n version: '1.0.0',\n },\n },\n};\n`,\n );\n\n // eslint-disable-next-line no-console\n console.log(`Created \"${configName}\"`);\n};\n\nexport default initCommand;\n","import SwaggerParser from \"@apidevtools/swagger-parser\";\nimport { collect } from \"@visulima/readdir\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport cliProgress from \"cli-progress\";\nimport { lstatSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\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 generateCommand = async (configName: string, paths: string[], options: {\n config?: string;\n output?: string;\n verbose?: boolean;\n veryVerbose?: boolean;\n // eslint-disable-next-line radar/cognitive-complexity\n}) => {\n let openapiConfig: {\n exclude: string[];\n followSymlinks?: boolean;\n swaggerDefinition: BaseDefinition;\n extensions?: string[];\n include?: string | readonly string[];\n } = {\n exclude: [],\n swaggerDefinition: {} as BaseDefinition,\n };\n\n try {\n // eslint-disable-next-line unicorn/prefer-module,import/no-dynamic-require\n openapiConfig = await import(resolve(options.config || configName));\n } catch {\n throw new Error(`No config file found, on: ${options.config || \".openapirc.js\"}\\n`);\n }\n\n const multibar = new cliProgress.MultiBar(\n {\n clearOnComplete: false,\n hideCursor: true,\n format: \"{value}/{total} | {bar} | {filename}\",\n },\n cliProgress.Presets.shades_grey,\n );\n const spec = new SpecBuilder(openapiConfig.swaggerDefinition);\n\n // eslint-disable-next-line no-restricted-syntax,unicorn/prevent-abbreviations\n for await (const dir of paths) {\n // Check if the path is a directory\n lstatSync(dir).isDirectory();\n\n const files = await collect(dir, {\n // eslint-disable-next-line @rushstack/security/no-unsafe-regexp\n skip: [...openapiConfig.exclude, \"node_modules/**\"],\n extensions: openapiConfig.extensions || [\".js\", \".cjs\", \".mjs\", \".ts\", \".tsx\", \".jsx\", \".yaml\", \".yml\"],\n followSymlinks: openapiConfig.followSymlinks || false,\n match: openapiConfig.include,\n minimatchOptions: {\n match: {\n debug: options.verbose,\n matchBase: true,\n },\n skip: {\n debug: options.verbose,\n matchBase: true,\n },\n },\n });\n\n if (options.verbose || options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(`\\nFound ${files.length} files in ${dir}`);\n }\n\n if (options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(files);\n }\n\n const bar = multibar.create(files.length, 0);\n\n files.forEach((file) => {\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Parsing file ${file}`);\n }\n\n bar.increment(1, { filename: dir });\n\n const parsedJsDocumentFile = parseFile(file, jsDocumentCommentsToOpenApi, options.verbose);\n\n spec.addData(parsedJsDocumentFile.map((item) => item.spec));\n\n const parsedSwaggerJsDocumentFile = parseFile(file, swaggerJsDocumentCommentsToOpenApi, options.verbose);\n\n spec.addData(parsedSwaggerJsDocumentFile.map((item) => item.spec));\n });\n }\n\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(\"Validating swagger spec\");\n }\n\n if (options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(spec, null, 2));\n }\n\n await SwaggerParser.validate(JSON.parse(JSON.stringify(spec)));\n\n const output = options.output || \"swagger.json\";\n\n multibar.stop();\n\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Written swagger spec to \"${output}\" file`);\n }\n\n // eslint-disable-next-line consistent-return\n mkdirSync(dirname(output), { recursive: true });\n writeFileSync(output, JSON.stringify(spec, null, 2));\n\n // eslint-disable-next-line no-console\n console.log(`\\nSwagger specification is ready, check the${output}file.`);\n};\n\nexport default generateCommand;\n"]}
@@ -1,9 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }function E(t,s){Object.keys(s).forEach(r=>{t[r]===void 0?t[r]={...s[r]}:Object.keys(s[r]).forEach(e=>{t[r][e]={...t[r][e],...s[r][e]}})})}var y=E;var u=class{constructor(s){this.openapi=s.openapi,this.info=s.info,this.servers=s.servers,this.paths=s.paths||{},this.components=s.components,this.security=s.security,this.tags=s.tags,this.externalDocs=s.externalDocs}addData(s){s.forEach(r=>{let{paths:e,components:c,...n}=r;y(this,{paths:e||{},components:c||{}}),Object.entries(n).forEach(([o,a])=>{this[o]=a})})}},V= exports.a =u;function T(t){return t.split(/\r\n|\r|\n/).filter(e=>/^\s*(#\s*.*)?$/.test(e)?!1:e.trim().length>0).length}var h=T;var _fs = require('fs');var _path = require('path'); var _path2 = _interopRequireDefault(_path);var _yaml = require('yaml'); var _yaml2 = _interopRequireDefault(_yaml);var b=new Set(["openapi","info","servers","security","tags","externalDocs","components","paths"]),f=class extends Error{},$=(t,s,r)=>{let e=_fs.readFileSync.call(void 0, t,{encoding:"utf8"}),c=_path2.default.extname(t);if(c===".yaml"||c===".yml"){let n=_yaml2.default.parse(e),o=Object.keys(n).filter(a=>!b.has(a));if(o.length>0){let a=new f(`Unexpected keys: ${o.join(", ")}`);throw a.filePath=t,a}if(Object.keys(n).some(a=>b.has(a))){let a=h(e);return[{spec:n,loc:a}]}return[]}try{return s(e,r)}catch(n){throw n.filePath=t,n}},ee= exports.c =$;var _commentparser = require('comment-parser');var _lodashmergewith = require('lodash.mergewith'); var _lodashmergewith2 = _interopRequireDefault(_lodashmergewith);var v=(t,s)=>{if(Array.isArray(t))return[...t,...s]},m=v;function w(t){t.security&&(t.security=Object.keys(t.security).map(s=>({[s]:t.security[s]})))}var C=new Set(["integer","number","string","boolean","object","array"]),g={int32:"integer",int64:"integer",float:"number",double:"number",date:"string","date-time":"string",password:"string",byte:"string",binary:"string"};function q(t){let s=t.type,r=s&&s.endsWith("[]"),e;s&&(e=s.replace(/\[]$/,""));let c=C.has(e),n=Object.keys(g).includes(e),o;if(t.default)switch(e){case"integer":case"int32":case"int64":{o=Number.parseInt(t.default,10);break}case"number":case"double":case"float":{o=Number.parseFloat(t.default);break}default:{o=t.default;break}}let a;c?a={type:e,default:o}:n?a={type:g[e],format:e,default:o}:a={$ref:`#/components/schemas/${e}`};let i=r?{type:"array",items:{...a}}:{...a};e===void 0&&(i=void 0);let p=t.description.trim().replace(/^- /,"");return p===""&&(p=void 0),{name:t.name,description:p,required:!t.optional,schema:i,rawType:s}}function L(t,s){return t.map(r=>{let e=q(r),c="";switch(e.name&&(c+=e.name),e.description&&(c+=` ${e.description.trim()}`),r.tag){case"operationId":case"summary":case"description":return{[r.tag]:c};case"deprecated":return{deprecated:!0};case"externalDocs":return{externalDocs:{url:e.name,description:e.description}};case"server":return{servers:[{url:e.name,description:e.description}]};case"tag":return{tags:[c]};case"cookieParam":case"headerParam":case"queryParam":case"pathParam":return{parameters:[{name:e.name,in:r.tag.replace(/Param$/,""),description:e.description,required:e.required,schema:e.schema}]};case"bodyContent":return{requestBody:{content:{[e.name.replace("*\\/*","*/*")]:{schema:e.schema}}}};case"bodyExample":{let[n,o]=e.name.split(".");return{requestBody:{content:{[n]:{examples:{[o]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}case"bodyDescription":return{requestBody:{description:c}};case"bodyRequired":return{requestBody:{required:!0}};case"response":return{responses:{[e.name]:{description:e.description}}};case"callback":return{callbacks:{[e.name]:{$ref:`#/components/callbacks/${e.rawType}`}}};case"responseContent":{let[n,o]=e.name.split(".");return{responses:{[n]:{content:{[o]:{schema:e.schema}}}}}}case"responseHeaderComponent":{let[n,o]=e.name.split(".");return{responses:{[n]:{headers:{[o]:{$ref:`#/components/headers/${e.rawType}`}}}}}}case"responseHeader":{let[n,o]=e.name.split(".");return{responses:{[n]:{headers:{[o]:{description:e.description,schema:e.schema}}}}}}case"responseExample":{let[n,o,a]=e.name.split(".");return{responses:{[n]:{content:{[o]:{examples:{[a]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}}case"responseLink":{let[n,o]=e.name.split(".");return{responses:{[n]:{links:{[o]:{$ref:`#/components/links/${e.rawType}`}}}}}}case"bodyComponent":return{requestBody:{$ref:`#/components/requestBodies/${e.rawType}`}};case"responseComponent":return{responses:{[e.name]:{$ref:`#/components/responses/${e.rawType}`}}};case"paramComponent":return{parameters:[{$ref:`#/components/parameters/${e.rawType}`}]};case"security":{let[n,o]=e.name.split("."),a=[];return o&&(a=[o]),{security:{[n]:a}}}default:return{}}})}var I=(t,s)=>{let r=/^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \/.*$/;return _commentparser.parse.call(void 0, t,{spacing:"preserve"}).filter(c=>r.test(c.description.trim())).map(c=>{let n=c.tags.length+1,o=_lodashmergewith2.default.call(void 0, {},...L(c.tags,s),m);w(o);let[a,i]=c.description.split(" "),p={[i.trim()]:{[a.toLowerCase().trim()]:{...o}}};return{spec:JSON.parse(JSON.stringify({paths:p})),loc:n}})},ae= exports.d =I;var l=(t,s)=>_lodashmergewith2.default.call(void 0, {},t,s,(r,e)=>e===null?r:void 0),O=t=>Object.keys(t).map(s=>t[s]).every(s=>typeof s=="object"&&Object.keys(s).every(r=>!(r in s))),d=(t,s)=>s.some(r=>t.name===r.name),j=t=>{switch(t.tag){case"openapi":return"v3";case"asyncapi":return"v4";case"swagger":return"v2";default:return"v2"}};var R=(t,s,r)=>{if(r==="x-webhooks"&&(t[r]=s[r]),r.startsWith("x-"))return;if(["components","consumes","produces","paths","schemas","securityDefinitions","responses","parameters","definitions","channels"].includes(r))Object.keys(s[r]).forEach(c=>{t[r][c]=l(t[r][c],s[r][c])});else if(r==="tags"){let{tags:c}=s;Array.isArray(c)?c.forEach(n=>{d(n,t.tags)||t.tags.push(n)}):d(c,t.tags)||t.tags.push(c)}else if(r==="security"){let{security:c}=s;t.security=c}else r.startsWith("/")&&(t.paths[r]=l(t.paths[r],s[r]))},x=R;var W={v2:["paths","definitions","responses","parameters","securityDefinitions"],v3:["paths","definitions","responses","parameters","securityDefinitions","components"],v4:["components","channels"]},F=(t,s)=>t.map(r=>{if((r.tag==="openapi"||r.tag==="swagger"||r.tag==="asyncapi")&&r.description!==""){let e=_yaml2.default.parseDocument(r.description);if(e.errors&&e.errors.length>0){e.errors.map(a=>{let i=a;return i.annotation=r.description,i});let o="Error parsing YAML in @openapi spec:";throw o+=s?e.errors.map(a=>{var i;return`${a.toString()}
2
- Imbedded within:
3
- \`\`\`
4
- ${(i=a==null?void 0:a.annotation)==null?void 0:i.replace(/\n/g,`
5
- `)}
6
- \`\`\``}).join(`
7
- `):e.errors.map(a=>a.toString()).join(`
8
- `),new Error(o)}let c=e.toJSON(),n={tags:[]};return W[j(r)].forEach(o=>{n[o]=n[o]||{}}),Object.keys(c).forEach(o=>{x(n,c,o)}),n}return{}}),z=(t,s)=>_commentparser.parse.call(void 0, t,{spacing:"preserve"}).map(e=>{let c=e.tags.length+1,n=_lodashmergewith2.default.call(void 0, {},...F(e.tags,s),m);return["definitions","responses","parameters","securityDefinitions","components","tags"].forEach(a=>{n[a]!==void 0&&O(n[a])&&delete n[a]}),{spec:JSON.parse(JSON.stringify(n)),loc:c}}),Oe= exports.e =z;exports.a = V; exports.b = h; exports.c = ee; exports.d = ae; exports.e = Oe;
9
- //# sourceMappingURL=chunk-7NWDLEC5.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/util/object-merge.ts","../src/spec-builder.ts","../src/util/yaml-loc.ts","../src/parse-file.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":["objectMerge","a","b","key","subKey","object_merge_default","SpecBuilder","baseDefinition","parsedFile","file","paths","components","rest","value","spec_builder_default","yamlLoc","string","line","yaml_loc_default","readFileSync","path","yaml","ALLOWED_KEYS","ParseError","parseFile","commentsToOpenApi","verbose","fileContent","extension","spec","invalidKeys","error","loc","parse_file_default","parseComments","mergeWith","customizer","objectValue","sourceValue","customizer_default","fixSecurityObject","thing","primitiveTypes","formatMap","parseDescription","tag","rawType","isArray","parsedType","isPrimitive","isFormat","defaultValue","rootType","schema","description","tagsToObjects","tags","parsedResponse","nameAndDescription","contentType","example","status","header","link","security","scopeItem","scope","fileContents","openAPIRegex","comment","result","method","pathsObject","comments_to_open_api_default","mergeDeep","first","second","hasEmptyProperty","object","keyObject","isTagPresentInTags","targetTag","getSwaggerVersionFromSpec","organizeSwaggerObject","swaggerObject","annotation","property","definition","organize_swagger_object_default","specificationTemplate","specs","parsed","newError","errorString","_a","parsedDocument","specification"],"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","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 { readFileSync } 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 = 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","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 (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,9 +0,0 @@
1
- function E(t,s){Object.keys(s).forEach(r=>{t[r]===void 0?t[r]={...s[r]}:Object.keys(s[r]).forEach(e=>{t[r][e]={...t[r][e],...s[r][e]}})})}var y=E;var u=class{constructor(s){this.openapi=s.openapi,this.info=s.info,this.servers=s.servers,this.paths=s.paths||{},this.components=s.components,this.security=s.security,this.tags=s.tags,this.externalDocs=s.externalDocs}addData(s){s.forEach(r=>{let{paths:e,components:c,...n}=r;y(this,{paths:e||{},components:c||{}}),Object.entries(n).forEach(([o,a])=>{this[o]=a})})}},V=u;function T(t){return t.split(/\r\n|\r|\n/).filter(e=>/^\s*(#\s*.*)?$/.test(e)?!1:e.trim().length>0).length}var h=T;import{readFileSync as S}from"fs";import A from"path";import k from"yaml";var b=new Set(["openapi","info","servers","security","tags","externalDocs","components","paths"]),f=class extends Error{},$=(t,s,r)=>{let e=S(t,{encoding:"utf8"}),c=A.extname(t);if(c===".yaml"||c===".yml"){let n=k.parse(e),o=Object.keys(n).filter(a=>!b.has(a));if(o.length>0){let a=new f(`Unexpected keys: ${o.join(", ")}`);throw a.filePath=t,a}if(Object.keys(n).some(a=>b.has(a))){let a=h(e);return[{spec:n,loc:a}]}return[]}try{return s(e,r)}catch(n){throw n.filePath=t,n}},ee=$;import{parse as P}from"comment-parser";import D from"lodash.mergewith";var v=(t,s)=>{if(Array.isArray(t))return[...t,...s]},m=v;function w(t){t.security&&(t.security=Object.keys(t.security).map(s=>({[s]:t.security[s]})))}var C=new Set(["integer","number","string","boolean","object","array"]),g={int32:"integer",int64:"integer",float:"number",double:"number",date:"string","date-time":"string",password:"string",byte:"string",binary:"string"};function q(t){let s=t.type,r=s&&s.endsWith("[]"),e;s&&(e=s.replace(/\[]$/,""));let c=C.has(e),n=Object.keys(g).includes(e),o;if(t.default)switch(e){case"integer":case"int32":case"int64":{o=Number.parseInt(t.default,10);break}case"number":case"double":case"float":{o=Number.parseFloat(t.default);break}default:{o=t.default;break}}let a;c?a={type:e,default:o}:n?a={type:g[e],format:e,default:o}:a={$ref:`#/components/schemas/${e}`};let i=r?{type:"array",items:{...a}}:{...a};e===void 0&&(i=void 0);let p=t.description.trim().replace(/^- /,"");return p===""&&(p=void 0),{name:t.name,description:p,required:!t.optional,schema:i,rawType:s}}function L(t,s){return t.map(r=>{let e=q(r),c="";switch(e.name&&(c+=e.name),e.description&&(c+=` ${e.description.trim()}`),r.tag){case"operationId":case"summary":case"description":return{[r.tag]:c};case"deprecated":return{deprecated:!0};case"externalDocs":return{externalDocs:{url:e.name,description:e.description}};case"server":return{servers:[{url:e.name,description:e.description}]};case"tag":return{tags:[c]};case"cookieParam":case"headerParam":case"queryParam":case"pathParam":return{parameters:[{name:e.name,in:r.tag.replace(/Param$/,""),description:e.description,required:e.required,schema:e.schema}]};case"bodyContent":return{requestBody:{content:{[e.name.replace("*\\/*","*/*")]:{schema:e.schema}}}};case"bodyExample":{let[n,o]=e.name.split(".");return{requestBody:{content:{[n]:{examples:{[o]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}case"bodyDescription":return{requestBody:{description:c}};case"bodyRequired":return{requestBody:{required:!0}};case"response":return{responses:{[e.name]:{description:e.description}}};case"callback":return{callbacks:{[e.name]:{$ref:`#/components/callbacks/${e.rawType}`}}};case"responseContent":{let[n,o]=e.name.split(".");return{responses:{[n]:{content:{[o]:{schema:e.schema}}}}}}case"responseHeaderComponent":{let[n,o]=e.name.split(".");return{responses:{[n]:{headers:{[o]:{$ref:`#/components/headers/${e.rawType}`}}}}}}case"responseHeader":{let[n,o]=e.name.split(".");return{responses:{[n]:{headers:{[o]:{description:e.description,schema:e.schema}}}}}}case"responseExample":{let[n,o,a]=e.name.split(".");return{responses:{[n]:{content:{[o]:{examples:{[a]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}}case"responseLink":{let[n,o]=e.name.split(".");return{responses:{[n]:{links:{[o]:{$ref:`#/components/links/${e.rawType}`}}}}}}case"bodyComponent":return{requestBody:{$ref:`#/components/requestBodies/${e.rawType}`}};case"responseComponent":return{responses:{[e.name]:{$ref:`#/components/responses/${e.rawType}`}}};case"paramComponent":return{parameters:[{$ref:`#/components/parameters/${e.rawType}`}]};case"security":{let[n,o]=e.name.split("."),a=[];return o&&(a=[o]),{security:{[n]:a}}}default:return{}}})}var I=(t,s)=>{let r=/^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \/.*$/;return P(t,{spacing:"preserve"}).filter(c=>r.test(c.description.trim())).map(c=>{let n=c.tags.length+1,o=D({},...L(c.tags,s),m);w(o);let[a,i]=c.description.split(" "),p={[i.trim()]:{[a.toLowerCase().trim()]:{...o}}};return{spec:JSON.parse(JSON.stringify({paths:p})),loc:n}})},ae=I;import{parse as N}from"comment-parser";import Y from"lodash.mergewith";import B from"yaml";import M from"lodash.mergewith";var l=(t,s)=>M({},t,s,(r,e)=>e===null?r:void 0),O=t=>Object.keys(t).map(s=>t[s]).every(s=>typeof s=="object"&&Object.keys(s).every(r=>!(r in s))),d=(t,s)=>s.some(r=>t.name===r.name),j=t=>{switch(t.tag){case"openapi":return"v3";case"asyncapi":return"v4";case"swagger":return"v2";default:return"v2"}};var R=(t,s,r)=>{if(r==="x-webhooks"&&(t[r]=s[r]),r.startsWith("x-"))return;if(["components","consumes","produces","paths","schemas","securityDefinitions","responses","parameters","definitions","channels"].includes(r))Object.keys(s[r]).forEach(c=>{t[r][c]=l(t[r][c],s[r][c])});else if(r==="tags"){let{tags:c}=s;Array.isArray(c)?c.forEach(n=>{d(n,t.tags)||t.tags.push(n)}):d(c,t.tags)||t.tags.push(c)}else if(r==="security"){let{security:c}=s;t.security=c}else r.startsWith("/")&&(t.paths[r]=l(t.paths[r],s[r]))},x=R;var W={v2:["paths","definitions","responses","parameters","securityDefinitions"],v3:["paths","definitions","responses","parameters","securityDefinitions","components"],v4:["components","channels"]},F=(t,s)=>t.map(r=>{if((r.tag==="openapi"||r.tag==="swagger"||r.tag==="asyncapi")&&r.description!==""){let e=B.parseDocument(r.description);if(e.errors&&e.errors.length>0){e.errors.map(a=>{let i=a;return i.annotation=r.description,i});let o="Error parsing YAML in @openapi spec:";throw o+=s?e.errors.map(a=>{var i;return`${a.toString()}
2
- Imbedded within:
3
- \`\`\`
4
- ${(i=a==null?void 0:a.annotation)==null?void 0:i.replace(/\n/g,`
5
- `)}
6
- \`\`\``}).join(`
7
- `):e.errors.map(a=>a.toString()).join(`
8
- `),new Error(o)}let c=e.toJSON(),n={tags:[]};return W[j(r)].forEach(o=>{n[o]=n[o]||{}}),Object.keys(c).forEach(o=>{x(n,c,o)}),n}return{}}),z=(t,s)=>N(t,{spacing:"preserve"}).map(e=>{let c=e.tags.length+1,n=Y({},...F(e.tags,s),m);return["definitions","responses","parameters","securityDefinitions","components","tags"].forEach(a=>{n[a]!==void 0&&O(n[a])&&delete n[a]}),{spec:JSON.parse(JSON.stringify(n)),loc:c}}),Oe=z;export{V as a,h as b,ee as c,ae as d,Oe as e};
9
- //# sourceMappingURL=chunk-PLANANJA.mjs.map