@visulima/jsdoc-open-api 1.1.1 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/README.md +4 -4
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -7
- package/src/exported.d.ts +0 -266
- package/src/index.ts +0 -7
- package/src/jsdoc/comments-to-open-api.ts +0 -402
- package/src/options.ts +0 -28
- package/src/parse-file.ts +0 -52
- package/src/spec-builder.ts +0 -61
- package/src/swagger-jsdoc/comments-to-open-api.ts +0 -89
- package/src/swagger-jsdoc/organize-swagger-object.ts +0 -66
- package/src/swagger-jsdoc/utils.ts +0 -43
- package/src/util/customizer.ts +0 -9
- package/src/util/load-definition.ts +0 -22
- package/src/util/object-merge.ts +0 -20
- package/src/util/yaml-loc.ts +0 -17
- package/src/webpack/swagger-compiler-plugin.ts +0 -169
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,29 @@
|
|
|
1
|
+
## @visulima/jsdoc-open-api [1.2.1](https://github.com/visulima/visulima/compare/@visulima/jsdoc-open-api@1.2.0...@visulima/jsdoc-open-api@1.2.1) (2022-12-01)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* added correct folder to files key in package.json ([da9f987](https://github.com/visulima/visulima/commit/da9f9871462a0b2663046cde5f05e9a90df4c496))
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Dependencies
|
|
11
|
+
|
|
12
|
+
* **@visulima/readdir:** upgraded to 1.3.1
|
|
13
|
+
|
|
14
|
+
## @visulima/jsdoc-open-api [1.2.0](https://github.com/visulima/visulima/compare/@visulima/jsdoc-open-api@1.1.1...@visulima/jsdoc-open-api@1.2.0) (2022-11-15)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Features
|
|
18
|
+
|
|
19
|
+
* added new packages for faster api creation ([#14](https://github.com/visulima/visulima/issues/14)) ([eb64fcf](https://github.com/visulima/visulima/commit/eb64fcf33f2a75ea48262ad6e71f80e159a93972))
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
### Dependencies
|
|
24
|
+
|
|
25
|
+
* **@visulima/readdir:** upgraded to 1.3.0
|
|
26
|
+
|
|
1
27
|
## @visulima/jsdoc-open-api [1.1.1](https://github.com/visulima/visulima/compare/@visulima/jsdoc-open-api@1.1.0...@visulima/jsdoc-open-api@1.1.1) (2022-10-31)
|
|
2
28
|
|
|
3
29
|
|
package/README.md
CHANGED
|
@@ -119,7 +119,7 @@ const withOpenApi = ({ definition, sources, verbose, output = "swagger/swagger.j
|
|
|
119
119
|
module.exports = withOpenApi;
|
|
120
120
|
```
|
|
121
121
|
|
|
122
|
-
####
|
|
122
|
+
#### Next.config.js
|
|
123
123
|
```js
|
|
124
124
|
const withOpenApi = require("./with-open-api");
|
|
125
125
|
|
|
@@ -147,7 +147,7 @@ module.exports = withOpenApi({
|
|
|
147
147
|
})(nextConfig);
|
|
148
148
|
```
|
|
149
149
|
|
|
150
|
-
## OpenApi
|
|
150
|
+
## OpenApi YAML syntax
|
|
151
151
|
|
|
152
152
|
The library will take the contents of @openapi (or @swagger):
|
|
153
153
|
|
|
@@ -246,7 +246,7 @@ For example, this JSON object:
|
|
|
246
246
|
}
|
|
247
247
|
```
|
|
248
248
|
|
|
249
|
-
|
|
249
|
+
Can be represented as:
|
|
250
250
|
|
|
251
251
|
```yaml
|
|
252
252
|
components:
|
|
@@ -263,7 +263,7 @@ components:
|
|
|
263
263
|
- name
|
|
264
264
|
```
|
|
265
265
|
|
|
266
|
-
|
|
266
|
+
And then referenced in the request body schema and response body schema as follows:
|
|
267
267
|
|
|
268
268
|
```js
|
|
269
269
|
/**
|
package/dist/index.js
CHANGED
|
@@ -559,7 +559,7 @@ var commentsToOpenApi2 = (fileContents, verbose) => {
|
|
|
559
559
|
const loc = comment.tags.length + 1;
|
|
560
560
|
const result = _lodashmergewith2.default.call(void 0, {}, ...tagsToObjects2(comment.tags, verbose), customizer_default);
|
|
561
561
|
["definitions", "responses", "parameters", "securityDefinitions", "components", "tags"].forEach((property) => {
|
|
562
|
-
if (
|
|
562
|
+
if (result[property] !== void 0 && hasEmptyProperty(result[property])) {
|
|
563
563
|
delete result[property];
|
|
564
564
|
}
|
|
565
565
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/util/object-merge.ts","../src/spec-builder.ts","../src/parse-file.ts","../src/util/yaml-loc.ts","../src/webpack/swagger-compiler-plugin.ts","../src/jsdoc/comments-to-open-api.ts","../src/util/customizer.ts","../src/swagger-jsdoc/comments-to-open-api.ts","../src/swagger-jsdoc/utils.ts","../src/swagger-jsdoc/organize-swagger-object.ts"],"names":["commentsToOpenApi","fs","path","parseComments","mergeWith","yaml","tagsToObjects","comments_to_open_api_default"],"mappings":"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","sourcesContent":["function objectMerge<T>(a: T, b: T) {\n Object.keys(b as object).forEach((key) => {\n if (a[key as keyof typeof b] === undefined) {\n // eslint-disable-next-line no-param-reassign\n a[key as keyof typeof b] = {\n ...b[key as keyof typeof b],\n };\n } else {\n Object.keys(b[key as keyof typeof b] as object).forEach((subKey) => {\n // eslint-disable-next-line no-param-reassign\n (a[key as keyof typeof b] as { [key: string]: object })[subKey] = {\n ...(a[key as keyof typeof b] as { [key: string]: object })[subKey],\n ...(b[key as keyof typeof b] as { [key: string]: object })[subKey],\n };\n });\n }\n });\n}\n\nexport default objectMerge;\n","import {\n BaseDefinition,\n ComponentsObject,\n ExternalDocumentationObject,\n InfoObject,\n OpenApiObject,\n PathsObject,\n SecurityRequirementObject,\n ServerObject,\n TagObject,\n} from \"./exported\";\nimport objectMerge from \"./util/object-merge\";\n\nclass SpecBuilder implements OpenApiObject {\n openapi: string;\n\n info: InfoObject;\n\n servers?: ServerObject[];\n\n paths: PathsObject;\n\n components?: ComponentsObject;\n\n security?: SecurityRequirementObject[];\n\n tags?: TagObject[];\n\n externalDocs?: ExternalDocumentationObject;\n\n constructor(baseDefinition: BaseDefinition) {\n this.openapi = baseDefinition.openapi;\n this.info = baseDefinition.info;\n this.servers = baseDefinition.servers;\n this.paths = baseDefinition.paths || {};\n this.components = baseDefinition.components;\n this.security = baseDefinition.security;\n this.tags = baseDefinition.tags;\n this.externalDocs = baseDefinition.externalDocs;\n }\n\n addData(parsedFile: OpenApiObject[]) {\n parsedFile.forEach((file) => {\n const { paths, components, ...rest } = file;\n\n // only merge paths and components\n objectMerge(this, {\n paths: paths || {},\n components: components || {},\n } as OpenApiObject);\n\n // overwrite everything else:\n Object.entries(rest).forEach(([key, value]) => {\n // @ts-ignore\n this[key as keyof OpenApiObject] = value;\n });\n });\n }\n}\n\nexport default SpecBuilder;\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport yaml from \"yaml\";\n\nimport { OpenApiObject } from \"./exported\";\nimport yamlLoc from \"./util/yaml-loc\";\n\nconst ALLOWED_KEYS = new Set([\"openapi\", \"info\", \"servers\", \"security\", \"tags\", \"externalDocs\", \"components\", \"paths\"]);\n\nclass ParseError extends Error {\n filePath?: string;\n}\n\nconst parseFile = (\n file: string,\n commentsToOpenApi: (fileContent: string, verbose?: boolean) => { spec: OpenApiObject; loc: number }[],\n verbose?: boolean,\n): { spec: OpenApiObject; loc: number }[] => {\n const fileContent = fs.readFileSync(file, { encoding: \"utf8\" });\n const extension = path.extname(file);\n\n if (extension === \".yaml\" || extension === \".yml\") {\n const spec = yaml.parse(fileContent);\n const invalidKeys = Object.keys(spec).filter((key) => !ALLOWED_KEYS.has(key));\n\n if (invalidKeys.length > 0) {\n const error = new ParseError(`Unexpected keys: ${invalidKeys.join(\", \")}`);\n\n error.filePath = file;\n\n throw error;\n }\n\n if (Object.keys(spec).some((key) => ALLOWED_KEYS.has(key))) {\n const loc = yamlLoc(fileContent);\n\n return [{ spec, loc }];\n }\n\n return [];\n }\n\n try {\n return commentsToOpenApi(fileContent, verbose);\n } catch (error: any) {\n error.filePath = file;\n\n throw error;\n }\n};\n\nexport default parseFile;\n","function yamlLoc(string: string): number {\n // Break string into lines.\n const split = string.split(/\\r\\n|\\r|\\n/);\n\n const filtered = split.filter((line) => {\n // Remove comments.\n if (/^\\s*(#\\s*.*)?$/.test(line)) {\n return false;\n }\n // Remove empty lines.\n return line.trim().length > 0;\n });\n\n return filtered.length;\n}\n\nexport default yamlLoc;\n","import SwaggerParser from \"@apidevtools/swagger-parser\";\nimport { collect } from \"@visulima/readdir\";\nimport fs from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { exit } from \"node:process\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { Compiler } from \"webpack\";\n\nimport type { BaseDefinition } from \"../exported\";\nimport jsDocumentCommentsToOpenApi from \"../jsdoc/comments-to-open-api\";\nimport parseFile from \"../parse-file\";\nimport SpecBuilder from \"../spec-builder\";\nimport swaggerJsDocumentCommentsToOpenApi from \"../swagger-jsdoc/comments-to-open-api\";\n\nconst exclude = [\n \"coverage/**\",\n \".github/**\",\n \"packages/*/test{,s}/**\",\n \"**/*.d.ts\",\n \"test{,s}/**\",\n \"test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}\",\n \"**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}\",\n \"**/__tests__/**\",\n \"**/{ava,babel,nyc}.config.{js,cjs,mjs}\",\n \"**/jest.config.{js,cjs,mjs,ts}\",\n \"**/{karma,rollup,webpack}.config.js\",\n \"**/.{eslint,mocha}rc.{js,cjs}\",\n \"**/.{travis,yarnrc}.yml\",\n \"**/{docker-compose,docker}.yml\",\n \"**/.yamllint.{yaml,yml}\",\n \"**/node_modules/**\",\n \"**/pnpm-lock.yaml\",\n \"**/pnpm-workspace.yaml\",\n \"**/{package,package-lock}.json\",\n \"**/yarn.lock\",\n \"**/package.json5\",\n \"**/.next/**\",\n];\n\nconst errorHandler = (error: any) => {\n if (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n exit(1);\n }\n};\n\nclass SwaggerCompilerPlugin {\n private readonly swaggerDefinition: BaseDefinition;\n\n private readonly sources: string[];\n\n private readonly verbose: boolean;\n\n private readonly ignore: string | ReadonlyArray<string>;\n\n assetsPath: string;\n\n constructor(\n assetsPath: string,\n sources: string[],\n swaggerDefinition: BaseDefinition,\n options: {\n verbose?: boolean;\n ignore?: string | ReadonlyArray<string>;\n },\n ) {\n this.assetsPath = assetsPath;\n this.swaggerDefinition = swaggerDefinition;\n this.sources = sources;\n this.verbose = options.verbose || false;\n this.ignore = options.ignore || [];\n }\n\n apply(compiler: Compiler) {\n compiler.hooks.make.tapAsync(\"SwaggerCompilerPlugin\", async (_, callback: VoidFunction) => {\n // eslint-disable-next-line no-console\n console.log(\"Build paused, switching to swagger build\");\n\n const spec = new SpecBuilder(this.swaggerDefinition);\n\n // eslint-disable-next-line no-restricted-syntax,unicorn/prevent-abbreviations\n for await (const dir of this.sources) {\n const files = await collect(dir, {\n // eslint-disable-next-line @rushstack/security/no-unsafe-regexp\n skip: [...this.ignore, ...exclude],\n extensions: [\".js\", \".cjs\", \".mjs\", \".ts\", \".tsx\", \".jsx\", \".yaml\", \".yml\"],\n 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 fs.mkdir(dirname(assetsPath), { recursive: true }, (error) => {\n if (error) {\n errorHandler(error);\n }\n\n fs.writeFile(assetsPath, JSON.stringify(spec, null, 2), errorHandler);\n });\n\n // eslint-disable-next-line unicorn/consistent-destructuring\n if (this.verbose) {\n // eslint-disable-next-line no-console,unicorn/consistent-destructuring\n console.log(`Written swagger spec to \"${this.assetsPath}\" file`);\n }\n\n // eslint-disable-next-line no-console\n console.log(\"switching back to normal build\");\n\n callback();\n });\n }\n}\n\nexport default SwaggerCompilerPlugin;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\n\nimport { OpenApiObject, PathsObject } from \"../exported\";\nimport customizer from \"../util/customizer\";\n\n// The security object has a bizare setup...\nfunction fixSecurityObject(thing: any) {\n if (thing.security) {\n // eslint-disable-next-line no-param-reassign\n thing.security = Object.keys(thing.security).map((s) => {\n return {\n [s]: thing.security[s],\n };\n });\n }\n}\n\nconst primitiveTypes = new Set([\"integer\", \"number\", \"string\", \"boolean\", \"object\", \"array\"]);\n\nconst formatMap: { [key: string]: string } = {\n int32: \"integer\",\n int64: \"integer\",\n float: \"number\",\n double: \"number\",\n date: \"string\",\n \"date-time\": \"string\",\n password: \"string\",\n byte: \"string\",\n binary: \"string\",\n};\n\nfunction parseDescription(tag: any) {\n const rawType = tag.type;\n const isArray = rawType && rawType.endsWith(\"[]\");\n\n let parsedType;\n\n if (rawType) {\n parsedType = rawType.replace(/\\[]$/, \"\");\n }\n\n const isPrimitive = primitiveTypes.has(parsedType);\n const isFormat = Object.keys(formatMap).includes(parsedType);\n\n let defaultValue;\n\n if (tag.default) {\n switch (parsedType) {\n case \"integer\":\n case \"int32\":\n case \"int64\": {\n defaultValue = Number.parseInt(tag.default, 10);\n break;\n }\n case \"number\":\n case \"double\":\n case \"float\": {\n defaultValue = Number.parseFloat(tag.default);\n break;\n }\n default: {\n defaultValue = tag.default;\n break;\n }\n }\n }\n\n let rootType;\n\n if (isPrimitive) {\n rootType = { type: parsedType, default: defaultValue };\n } else if (isFormat) {\n rootType = {\n type: formatMap[parsedType],\n format: parsedType,\n default: defaultValue,\n };\n } else {\n rootType = { $ref: `#/components/schemas/${parsedType}` };\n }\n\n let schema: undefined | object = isArray\n ? {\n type: \"array\",\n items: {\n ...rootType,\n },\n }\n : {\n ...rootType,\n };\n\n if (parsedType === undefined) {\n schema = undefined;\n }\n\n // remove the optional dash from the description.\n let description = tag.description.trim().replace(/^- /, \"\");\n\n if (description === \"\") {\n description = undefined;\n }\n\n return {\n name: tag.name,\n description,\n required: !tag.optional,\n schema,\n rawType,\n };\n}\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction tagsToObjects(tags: Spec[], verbose?: boolean) {\n return tags.map((tag) => {\n const parsedResponse = parseDescription(tag);\n\n // Some ops only have a `description`, merge `name` and `description`\n // for these.\n let nameAndDescription = \"\";\n\n if (parsedResponse.name) {\n nameAndDescription += parsedResponse.name;\n }\n\n if (parsedResponse.description) {\n nameAndDescription += ` ${parsedResponse.description.trim()}`;\n }\n\n switch (tag.tag) {\n case \"operationId\":\n case \"summary\":\n case \"description\": {\n return { [tag.tag]: nameAndDescription };\n }\n\n case \"deprecated\": {\n return { deprecated: true };\n }\n\n case \"externalDocs\": {\n return {\n externalDocs: {\n url: parsedResponse.name,\n description: parsedResponse.description,\n },\n };\n }\n\n case \"server\": {\n return {\n servers: [\n {\n url: parsedResponse.name,\n description: parsedResponse.description,\n },\n ],\n };\n }\n\n case \"tag\": {\n return { tags: [nameAndDescription] };\n }\n\n case \"cookieParam\":\n case \"headerParam\":\n case \"queryParam\":\n case \"pathParam\": {\n return {\n parameters: [\n {\n name: parsedResponse.name,\n in: tag.tag.replace(/Param$/, \"\"),\n description: parsedResponse.description,\n required: parsedResponse.required,\n schema: parsedResponse.schema,\n },\n ],\n };\n }\n\n case \"bodyContent\": {\n return {\n requestBody: {\n content: {\n [parsedResponse.name.replace(\"*\\\\/*\", \"*/*\")]: {\n schema: parsedResponse.schema,\n },\n },\n },\n };\n }\n\n case \"bodyExample\": {\n const [contentType, example] = parsedResponse.name.split(\".\");\n return {\n requestBody: {\n content: {\n [contentType]: {\n examples: {\n [example]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n };\n }\n\n case \"bodyDescription\": {\n return { requestBody: { description: nameAndDescription } };\n }\n\n case \"bodyRequired\": {\n return { requestBody: { required: true } };\n }\n\n case \"response\": {\n return {\n responses: {\n [parsedResponse.name]: {\n description: parsedResponse.description,\n },\n },\n };\n }\n\n case \"callback\": {\n return {\n callbacks: {\n [parsedResponse.name]: {\n $ref: `#/components/callbacks/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"responseContent\": {\n const [status, contentType] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status]: {\n content: {\n [contentType]: {\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeaderComponent\": {\n const [status, header] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n headers: {\n [header]: {\n $ref: `#/components/headers/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeader\": {\n const [status, header] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n headers: {\n [header]: {\n description: parsedResponse.description,\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseExample\": {\n const [status, contentType, example] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n content: {\n [contentType]: {\n examples: {\n [example]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n },\n };\n }\n\n case \"responseLink\": {\n const [status, link] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n links: {\n [link]: {\n $ref: `#/components/links/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"bodyComponent\": {\n return {\n requestBody: {\n $ref: `#/components/requestBodies/${parsedResponse.rawType}`,\n },\n };\n }\n\n case \"responseComponent\": {\n return {\n responses: {\n [parsedResponse.name]: {\n $ref: `#/components/responses/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"paramComponent\": {\n return {\n parameters: [{ $ref: `#/components/parameters/${parsedResponse.rawType}` }],\n };\n }\n\n case \"security\": {\n const [security, scopeItem] = parsedResponse.name.split(\".\");\n let scope: string[] = [];\n if (scopeItem) {\n scope = [scopeItem];\n }\n return {\n security: { [security]: scope },\n };\n }\n\n default: {\n return {};\n }\n }\n });\n}\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { spec: OpenApiObject; loc: number }[] => {\n const openAPIRegex = /^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \\/.*$/;\n\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments\n .filter((comment) => openAPIRegex.test(comment.description.trim()))\n .map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n fixSecurityObject(result);\n\n const [method, path]: string[] = comment.description.split(\" \");\n\n const pathsObject: PathsObject = {\n [(path as string).trim()]: {\n [(method as string).toLowerCase().trim()]: {\n ...result,\n },\n },\n };\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify({ paths: pathsObject }));\n\n return {\n spec,\n loc,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","const customizer = (objectValue: any, sourceValue: any) => {\n if (Array.isArray(objectValue)) {\n return [...objectValue, ...sourceValue];\n }\n // eslint-disable-next-line unicorn/no-useless-undefined\n return undefined;\n};\n\nexport default customizer;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\nimport yaml, { YAMLError } from \"yaml\";\n\nimport { OpenApiObject } from \"../exported\";\nimport customizer from \"../util/customizer\";\nimport organizeSwaggerObject from \"./organize-swagger-object\";\nimport { getSwaggerVersionFromSpec, hasEmptyProperty } from \"./utils\";\n\nconst specificationTemplate = {\n v2: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\"],\n v3: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\"],\n v4: [\"components\", \"channels\"],\n};\n\ntype ExtendedYAMLError = YAMLError & { annotation?: string };\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst tagsToObjects = (specs: Spec[], verbose?: boolean) => specs.map((spec: Spec) => {\n if ((spec.tag === \"openapi\" || spec.tag === \"swagger\" || spec.tag === \"asyncapi\") && spec.description !== \"\") {\n const parsed = yaml.parseDocument(spec.description);\n\n if (parsed.errors && parsed.errors.length > 0) {\n parsed.errors.map<ExtendedYAMLError>((error) => {\n const newError: ExtendedYAMLError = error;\n\n newError.annotation = spec.description;\n\n return newError;\n });\n\n let errorString = \"Error parsing YAML in @openapi spec:\";\n\n errorString += verbose\n ? (parsed.errors as ExtendedYAMLError[])\n .map((error) => `${error.toString()}\\nImbedded within:\\n\\`\\`\\`\\n ${error?.annotation?.replace(/\\n/g, \"\\n \")}\\n\\`\\`\\``)\n .join(\"\\n\")\n : parsed.errors.map((error) => error.toString()).join(\"\\n\");\n\n throw new Error(errorString);\n }\n\n const parsedDocument = parsed.toJSON();\n const specification: Record<string, any> = {\n tags: [],\n };\n\n specificationTemplate[getSwaggerVersionFromSpec(spec)].forEach((property) => {\n specification[property] = specification[property] || {};\n });\n\n Object.keys(parsedDocument).forEach((property) => {\n organizeSwaggerObject(specification, parsedDocument, property);\n });\n\n return specification;\n }\n\n return {};\n});\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { spec: OpenApiObject; loc: number }[] => {\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments.map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n [\"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\", \"tags\"].forEach((property) => {\n if (typeof result[property] !== \"undefined\" && hasEmptyProperty(result[property])) {\n delete result[property];\n }\n });\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify(result));\n\n return {\n spec,\n loc,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","import type { Spec } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\n\n/**\n * A recursive deep-merge that ignores null values when merging.\n * This returns the merged object and does not mutate.\n * @param {object} first the first object to get merged\n * @param {object} second the second object to get merged\n */\nexport const mergeDeep = (first?: object, second?: object) => mergeWith({}, first, second, (a, b) => (b === null ? a : undefined));\n\n/**\n * Checks if there is any properties of the input object which are an empty object\n * @param {object} object - the object to check\n * @returns {boolean}\n */\nexport const hasEmptyProperty = (object: Record<string, any>): boolean => Object.keys(object)\n .map((key) => object[key])\n .every((keyObject) => typeof keyObject === \"object\" && Object.keys(keyObject).every((key) => !(key in keyObject)));\n\n/**\n * @param {object} tag\n * @param {array} tags\n * @returns {boolean}\n */\nexport const isTagPresentInTags = (tag: Spec, tags: Spec[]) => tags.some((targetTag) => tag.name === targetTag.name);\n\nexport const getSwaggerVersionFromSpec = (tag: Spec) => {\n switch (tag.tag) {\n case \"openapi\": {\n return \"v3\";\n }\n case \"asyncapi\": {\n return \"v4\";\n }\n case \"swagger\": {\n return \"v2\";\n }\n default: {\n return \"v2\";\n }\n }\n};\n","import { isTagPresentInTags, mergeDeep } from \"./utils\";\n\n/**\n * @param {object} swaggerObject\n * @param {object} annotation\n * @param {string} property\n */\n// eslint-disable-next-line radar/no-duplicate-string\nconst organizeSwaggerObject = (swaggerObject: Record<string, any>, annotation: Record<string, any>, property: string) => {\n // Root property on purpose.\n // eslint-disable-next-line no-secrets/no-secrets\n // @see https://github.com/OAI/OpenAPI-Specification/blob/master/proposals/002_Webhooks.md#proposed-solution\n if (property === \"x-webhooks\") {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property] = annotation[property];\n }\n\n // Other extensions can be in varying places depending on different vendors and opinions.\n // The following return makes it so that they are not put in `paths` in the last case.\n // New specific extensions will need to be handled on case-by-case if to be included in `paths`.\n if (property.startsWith(\"x-\")) {\n return;\n }\n\n const commonProperties = [\n \"components\",\n \"consumes\",\n \"produces\",\n \"paths\",\n \"schemas\",\n \"securityDefinitions\",\n \"responses\",\n \"parameters\",\n \"definitions\",\n \"channels\",\n ];\n if (commonProperties.includes(property)) {\n Object.keys(annotation[property]).forEach((definition) => {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property][definition] = mergeDeep(swaggerObject[property][definition], annotation[property][definition]);\n });\n } else if (property === \"tags\") {\n const { tags } = annotation;\n\n if (Array.isArray(tags)) {\n tags.forEach((tag) => {\n if (!isTagPresentInTags(tag, swaggerObject.tags)) {\n swaggerObject.tags.push(tag);\n }\n });\n } else if (!isTagPresentInTags(tags, swaggerObject.tags)) {\n swaggerObject.tags.push(tags);\n }\n } else if (property === \"security\") {\n const { security } = annotation;\n\n // eslint-disable-next-line no-param-reassign\n swaggerObject.security = security;\n } else if (property.startsWith(\"/\")) {\n // Paths which are not defined as \"paths\" property, starting with a slash \"/\"\n // eslint-disable-next-line no-param-reassign\n swaggerObject.paths[property] = mergeDeep(swaggerObject.paths[property], annotation[property]);\n }\n};\n\nexport default organizeSwaggerObject;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/util/object-merge.ts","../src/spec-builder.ts","../src/parse-file.ts","../src/util/yaml-loc.ts","../src/webpack/swagger-compiler-plugin.ts","../src/jsdoc/comments-to-open-api.ts","../src/util/customizer.ts","../src/swagger-jsdoc/comments-to-open-api.ts","../src/swagger-jsdoc/utils.ts","../src/swagger-jsdoc/organize-swagger-object.ts"],"names":["commentsToOpenApi","fs","path","parseComments","mergeWith","yaml","tagsToObjects","comments_to_open_api_default"],"mappings":";AAAA,SAAS,YAAe,GAAM,GAAM;AAChC,SAAO,KAAK,CAAW,EAAE,QAAQ,CAAC,QAAQ;AACtC,QAAI,EAAE,SAA2B,QAAW;AAExC,QAAE,OAAyB;AAAA,QACvB,GAAG,EAAE;AAAA,MACT;AAAA,IACJ,OAAO;AACH,aAAO,KAAK,EAAE,IAAgC,EAAE,QAAQ,CAAC,WAAW;AAEhE,QAAC,EAAE,KAAqD,UAAU;AAAA,UAC9D,GAAI,EAAE,KAAqD;AAAA,UAC3D,GAAI,EAAE,KAAqD;AAAA,QAC/D;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ,CAAC;AACL;AAEA,IAAO,uBAAQ;;;ACNf,IAAM,cAAN,MAA2C;AAAA,EAiBvC,YAAY,gBAAgC;AACxC,SAAK,UAAU,eAAe;AAC9B,SAAK,OAAO,eAAe;AAC3B,SAAK,UAAU,eAAe;AAC9B,SAAK,QAAQ,eAAe,SAAS,CAAC;AACtC,SAAK,aAAa,eAAe;AACjC,SAAK,WAAW,eAAe;AAC/B,SAAK,OAAO,eAAe;AAC3B,SAAK,eAAe,eAAe;AAAA,EACvC;AAAA,EAEA,QAAQ,YAA6B;AACjC,eAAW,QAAQ,CAAC,SAAS;AACzB,YAAM,EAAE,OAAO,eAAe,KAAK,IAAI;AAGvC,2BAAY,MAAM;AAAA,QACd,OAAO,SAAS,CAAC;AAAA,QACjB,YAAY,cAAc,CAAC;AAAA,MAC/B,CAAkB;AAGlB,aAAO,QAAQ,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAE3C,aAAK,OAA8B;AAAA,MACvC,CAAC;AAAA,IACL,CAAC;AAAA,EACL;AACJ;AAEA,IAAO,uBAAQ;;;AC5Df,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,UAAU;;;ACFjB,SAAS,QAAQ,QAAwB;AAErC,QAAM,QAAQ,OAAO,MAAM,YAAY;AAEvC,QAAM,WAAW,MAAM,OAAO,CAAC,SAAS;AAEpC,QAAI,iBAAiB,KAAK,IAAI,GAAG;AAC7B,aAAO;AAAA,IACX;AAEA,WAAO,KAAK,KAAK,EAAE,SAAS;AAAA,EAChC,CAAC;AAED,SAAO,SAAS;AACpB;AAEA,IAAO,mBAAQ;;;ADTf,IAAM,eAAe,oBAAI,IAAI,CAAC,WAAW,QAAQ,WAAW,YAAY,QAAQ,gBAAgB,cAAc,OAAO,CAAC;AAEtH,IAAM,aAAN,cAAyB,MAAM;AAE/B;AAEA,IAAM,YAAY,CACd,MACAA,oBACA,YACyC;AACzC,QAAM,cAAc,GAAG,aAAa,MAAM,EAAE,UAAU,OAAO,CAAC;AAC9D,QAAM,YAAY,KAAK,QAAQ,IAAI;AAEnC,MAAI,cAAc,WAAW,cAAc,QAAQ;AAC/C,UAAM,OAAO,KAAK,MAAM,WAAW;AACnC,UAAM,cAAc,OAAO,KAAK,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,aAAa,IAAI,GAAG,CAAC;AAE5E,QAAI,YAAY,SAAS,GAAG;AACxB,YAAM,QAAQ,IAAI,WAAW,oBAAoB,YAAY,KAAK,IAAI,GAAG;AAEzE,YAAM,WAAW;AAEjB,YAAM;AAAA,IACV;AAEA,QAAI,OAAO,KAAK,IAAI,EAAE,KAAK,CAAC,QAAQ,aAAa,IAAI,GAAG,CAAC,GAAG;AACxD,YAAM,MAAM,iBAAQ,WAAW;AAE/B,aAAO,CAAC,EAAE,MAAM,IAAI,CAAC;AAAA,IACzB;AAEA,WAAO,CAAC;AAAA,EACZ;AAEA,MAAI;AACA,WAAOA,mBAAkB,aAAa,OAAO;AAAA,EACjD,SAAS,OAAP;AACE,UAAM,WAAW;AAEjB,UAAM;AAAA,EACV;AACJ;AAEA,IAAO,qBAAQ;;;AEnDf,OAAO,mBAAmB;AAC1B,SAAS,eAAe;AACxB,OAAOC,SAAQ;AACf,SAAS,eAAe;AACxB,SAAS,YAAY;;;ACHrB,SAAS,SAAS,qBAAqB;AACvC,OAAO,eAAe;;;ACFtB,IAAM,aAAa,CAAC,aAAkB,gBAAqB;AACvD,MAAI,MAAM,QAAQ,WAAW,GAAG;AAC5B,WAAO,CAAC,GAAG,aAAa,GAAG,WAAW;AAAA,EAC1C;AAEA,SAAO;AACX;AAEA,IAAO,qBAAQ;;;ADAf,SAAS,kBAAkB,OAAY;AACnC,MAAI,MAAM,UAAU;AAEhB,UAAM,WAAW,OAAO,KAAK,MAAM,QAAQ,EAAE,IAAI,CAAC,MAAM;AACpD,aAAO;AAAA,QACH,CAAC,IAAI,MAAM,SAAS;AAAA,MACxB;AAAA,IACJ,CAAC;AAAA,EACL;AACJ;AAEA,IAAM,iBAAiB,oBAAI,IAAI,CAAC,WAAW,UAAU,UAAU,WAAW,UAAU,OAAO,CAAC;AAE5F,IAAM,YAAuC;AAAA,EACzC,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,aAAa;AAAA,EACb,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ;AACZ;AAEA,SAAS,iBAAiB,KAAU;AAChC,QAAM,UAAU,IAAI;AACpB,QAAM,UAAU,WAAW,QAAQ,SAAS,IAAI;AAEhD,MAAI;AAEJ,MAAI,SAAS;AACT,iBAAa,QAAQ,QAAQ,QAAQ,EAAE;AAAA,EAC3C;AAEA,QAAM,cAAc,eAAe,IAAI,UAAU;AACjD,QAAM,WAAW,OAAO,KAAK,SAAS,EAAE,SAAS,UAAU;AAE3D,MAAI;AAEJ,MAAI,IAAI,SAAS;AACb,YAAQ,YAAY;AAAA,MAChB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,SAAS;AACV,uBAAe,OAAO,SAAS,IAAI,SAAS,EAAE;AAC9C;AAAA,MACJ;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,SAAS;AACV,uBAAe,OAAO,WAAW,IAAI,OAAO;AAC5C;AAAA,MACJ;AAAA,MACA,SAAS;AACL,uBAAe,IAAI;AACnB;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI;AAEJ,MAAI,aAAa;AACb,eAAW,EAAE,MAAM,YAAY,SAAS,aAAa;AAAA,EACzD,WAAW,UAAU;AACjB,eAAW;AAAA,MACP,MAAM,UAAU;AAAA,MAChB,QAAQ;AAAA,MACR,SAAS;AAAA,IACb;AAAA,EACJ,OAAO;AACH,eAAW,EAAE,MAAM,wBAAwB,aAAa;AAAA,EAC5D;AAEA,MAAI,SAA6B,UAC3B;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,MACH,GAAG;AAAA,IACP;AAAA,EACJ,IACE;AAAA,IACE,GAAG;AAAA,EACP;AAEJ,MAAI,eAAe,QAAW;AAC1B,aAAS;AAAA,EACb;AAGA,MAAI,cAAc,IAAI,YAAY,KAAK,EAAE,QAAQ,OAAO,EAAE;AAE1D,MAAI,gBAAgB,IAAI;AACpB,kBAAc;AAAA,EAClB;AAEA,SAAO;AAAA,IACH,MAAM,IAAI;AAAA,IACV;AAAA,IACA,UAAU,CAAC,IAAI;AAAA,IACf;AAAA,IACA;AAAA,EACJ;AACJ;AAIA,SAAS,cAAc,MAAc,SAAmB;AACpD,SAAO,KAAK,IAAI,CAAC,QAAQ;AACrB,UAAM,iBAAiB,iBAAiB,GAAG;AAI3C,QAAI,qBAAqB;AAEzB,QAAI,eAAe,MAAM;AACrB,4BAAsB,eAAe;AAAA,IACzC;AAEA,QAAI,eAAe,aAAa;AAC5B,4BAAsB,IAAI,eAAe,YAAY,KAAK;AAAA,IAC9D;AAEA,YAAQ,IAAI,KAAK;AAAA,MACb,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,eAAe;AAChB,eAAO,EAAE,CAAC,IAAI,MAAM,mBAAmB;AAAA,MAC3C;AAAA,MAEA,KAAK,cAAc;AACf,eAAO,EAAE,YAAY,KAAK;AAAA,MAC9B;AAAA,MAEA,KAAK,gBAAgB;AACjB,eAAO;AAAA,UACH,cAAc;AAAA,YACV,KAAK,eAAe;AAAA,YACpB,aAAa,eAAe;AAAA,UAChC;AAAA,QACJ;AAAA,MACJ;AAAA,MAEA,KAAK,UAAU;AACX,eAAO;AAAA,UACH,SAAS;AAAA,YACL;AAAA,cACI,KAAK,eAAe;AAAA,cACpB,aAAa,eAAe;AAAA,YAChC;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,MAEA,KAAK,OAAO;AACR,eAAO,EAAE,MAAM,CAAC,kBAAkB,EAAE;AAAA,MACxC;AAAA,MAEA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,aAAa;AACd,eAAO;AAAA,UACH,YAAY;AAAA,YACR;AAAA,cACI,MAAM,eAAe;AAAA,cACrB,IAAI,IAAI,IAAI,QAAQ,UAAU,EAAE;AAAA,cAChC,aAAa,eAAe;AAAA,cAC5B,UAAU,eAAe;AAAA,cACzB,QAAQ,eAAe;AAAA,YAC3B;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,MAEA,KAAK,eAAe;AAChB,eAAO;AAAA,UACH,aAAa;AAAA,YACT,SAAS;AAAA,cACL,CAAC,eAAe,KAAK,QAAQ,SAAS,KAAK,IAAI;AAAA,gBAC3C,QAAQ,eAAe;AAAA,cAC3B;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,MAEA,KAAK,eAAe;AAChB,cAAM,CAAC,aAAa,OAAO,IAAI,eAAe,KAAK,MAAM,GAAG;AAC5D,eAAO;AAAA,UACH,aAAa;AAAA,YACT,SAAS;AAAA,cACL,CAAC,cAAc;AAAA,gBACX,UAAU;AAAA,kBACN,CAAC,UAAU;AAAA,oBACP,MAAM,yBAAyB,eAAe;AAAA,kBAClD;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,MAEA,KAAK,mBAAmB;AACpB,eAAO,EAAE,aAAa,EAAE,aAAa,mBAAmB,EAAE;AAAA,MAC9D;AAAA,MAEA,KAAK,gBAAgB;AACjB,eAAO,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE;AAAA,MAC7C;AAAA,MAEA,KAAK,YAAY;AACb,eAAO;AAAA,UACH,WAAW;AAAA,YACP,CAAC,eAAe,OAAO;AAAA,cACnB,aAAa,eAAe;AAAA,YAChC;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,MAEA,KAAK,YAAY;AACb,eAAO;AAAA,UACH,WAAW;AAAA,YACP,CAAC,eAAe,OAAO;AAAA,cACnB,MAAM,0BAA0B,eAAe;AAAA,YACnD;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,MAEA,KAAK,mBAAmB;AACpB,cAAM,CAAC,QAAQ,WAAW,IAAI,eAAe,KAAK,MAAM,GAAG;AAE3D,eAAO;AAAA,UACH,WAAW;AAAA,YACP,CAAC,SAAS;AAAA,cACN,SAAS;AAAA,gBACL,CAAC,cAAc;AAAA,kBACX,QAAQ,eAAe;AAAA,gBAC3B;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,MAEA,KAAK,2BAA2B;AAC5B,cAAM,CAAC,QAAQ,MAAM,IAAI,eAAe,KAAK,MAAM,GAAG;AACtD,eAAO;AAAA,UACH,WAAW;AAAA,YACP,CAAC,SAAS;AAAA,cACN,SAAS;AAAA,gBACL,CAAC,SAAS;AAAA,kBACN,MAAM,wBAAwB,eAAe;AAAA,gBACjD;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,MAEA,KAAK,kBAAkB;AACnB,cAAM,CAAC,QAAQ,MAAM,IAAI,eAAe,KAAK,MAAM,GAAG;AACtD,eAAO;AAAA,UACH,WAAW;AAAA,YACP,CAAC,SAAS;AAAA,cACN,SAAS;AAAA,gBACL,CAAC,SAAS;AAAA,kBACN,aAAa,eAAe;AAAA,kBAC5B,QAAQ,eAAe;AAAA,gBAC3B;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,MAEA,KAAK,mBAAmB;AACpB,cAAM,CAAC,QAAQ,aAAa,OAAO,IAAI,eAAe,KAAK,MAAM,GAAG;AACpE,eAAO;AAAA,UACH,WAAW;AAAA,YACP,CAAC,SAAS;AAAA,cACN,SAAS;AAAA,gBACL,CAAC,cAAc;AAAA,kBACX,UAAU;AAAA,oBACN,CAAC,UAAU;AAAA,sBACP,MAAM,yBAAyB,eAAe;AAAA,oBAClD;AAAA,kBACJ;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,MAEA,KAAK,gBAAgB;AACjB,cAAM,CAAC,QAAQ,IAAI,IAAI,eAAe,KAAK,MAAM,GAAG;AACpD,eAAO;AAAA,UACH,WAAW;AAAA,YACP,CAAC,SAAS;AAAA,cACN,OAAO;AAAA,gBACH,CAAC,OAAO;AAAA,kBACJ,MAAM,sBAAsB,eAAe;AAAA,gBAC/C;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,MAEA,KAAK,iBAAiB;AAClB,eAAO;AAAA,UACH,aAAa;AAAA,YACT,MAAM,8BAA8B,eAAe;AAAA,UACvD;AAAA,QACJ;AAAA,MACJ;AAAA,MAEA,KAAK,qBAAqB;AACtB,eAAO;AAAA,UACH,WAAW;AAAA,YACP,CAAC,eAAe,OAAO;AAAA,cACnB,MAAM,0BAA0B,eAAe;AAAA,YACnD;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,MAEA,KAAK,kBAAkB;AACnB,eAAO;AAAA,UACH,YAAY,CAAC,EAAE,MAAM,2BAA2B,eAAe,UAAU,CAAC;AAAA,QAC9E;AAAA,MACJ;AAAA,MAEA,KAAK,YAAY;AACb,cAAM,CAAC,UAAU,SAAS,IAAI,eAAe,KAAK,MAAM,GAAG;AAC3D,YAAI,QAAkB,CAAC;AACvB,YAAI,WAAW;AACX,kBAAQ,CAAC,SAAS;AAAA,QACtB;AACA,eAAO;AAAA,UACH,UAAU,EAAE,CAAC,WAAW,MAAM;AAAA,QAClC;AAAA,MACJ;AAAA,MAEA,SAAS;AACL,eAAO,CAAC;AAAA,MACZ;AAAA,IACJ;AAAA,EACJ,CAAC;AACL;AAEA,IAAM,oBAAoB,CAAC,cAAsB,YAA8D;AAC3G,QAAM,eAAe;AAErB,QAAM,qBAAqB,cAAc,cAAc,EAAE,SAAS,WAAW,CAAC;AAE9E,SAAO,mBACF,OAAO,CAAC,YAAY,aAAa,KAAK,QAAQ,YAAY,KAAK,CAAC,CAAC,EACjE,IAAI,CAAC,YAAY;AAId,UAAM,MAAM,QAAQ,KAAK,SAAS;AAElC,UAAM,SAAS,UAAU,CAAC,GAAG,GAAG,cAAc,QAAQ,MAAM,OAAO,GAAG,kBAAU;AAEhF,sBAAkB,MAAM;AAExB,UAAM,CAAC,QAAQC,KAAI,IAAc,QAAQ,YAAY,MAAM,GAAG;AAE9D,UAAM,cAA2B;AAAA,MAC7B,CAAEA,MAAgB,KAAK,IAAI;AAAA,QACvB,CAAE,OAAkB,YAAY,EAAE,KAAK,IAAI;AAAA,UACvC,GAAG;AAAA,QACP;AAAA,MACJ;AAAA,IACJ;AAGA,UAAM,OAAO,KAAK,MAAM,KAAK,UAAU,EAAE,OAAO,YAAY,CAAC,CAAC;AAE9D,WAAO;AAAA,MACH;AAAA,MACA;AAAA,IACJ;AAAA,EACJ,CAAC;AACT;AAEA,IAAO,+BAAQ;;;AEhZf,SAAS,SAASC,sBAAqB;AACvC,OAAOC,gBAAe;AACtB,OAAOC,WAAyB;;;ACFhC,OAAOD,gBAAe;AAQf,IAAM,YAAY,CAAC,OAAgB,WAAoBA,WAAU,CAAC,GAAG,OAAO,QAAQ,CAAC,GAAG,MAAO,MAAM,OAAO,IAAI,MAAU;AAO1H,IAAM,mBAAmB,CAAC,WAAyC,OAAO,KAAK,MAAM,EACvF,IAAI,CAAC,QAAQ,OAAO,IAAI,EACxB,MAAM,CAAC,cAAc,OAAO,cAAc,YAAY,OAAO,KAAK,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,UAAU,CAAC;AAO9G,IAAM,qBAAqB,CAAC,KAAW,SAAiB,KAAK,KAAK,CAAC,cAAc,IAAI,SAAS,UAAU,IAAI;AAE5G,IAAM,4BAA4B,CAAC,QAAc;AACpD,UAAQ,IAAI,KAAK;AAAA,IACb,KAAK,WAAW;AACZ,aAAO;AAAA,IACX;AAAA,IACA,KAAK,YAAY;AACb,aAAO;AAAA,IACX;AAAA,IACA,KAAK,WAAW;AACZ,aAAO;AAAA,IACX;AAAA,IACA,SAAS;AACL,aAAO;AAAA,IACX;AAAA,EACJ;AACJ;;;AClCA,IAAM,wBAAwB,CAAC,eAAoC,YAAiC,aAAqB;AAIrH,MAAI,aAAa,cAAc;AAE3B,kBAAc,YAAY,WAAW;AAAA,EACzC;AAKA,MAAI,SAAS,WAAW,IAAI,GAAG;AAC3B;AAAA,EACJ;AAEA,QAAM,mBAAmB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,MAAI,iBAAiB,SAAS,QAAQ,GAAG;AACrC,WAAO,KAAK,WAAW,SAAS,EAAE,QAAQ,CAAC,eAAe;AAEtD,oBAAc,UAAU,cAAc,UAAU,cAAc,UAAU,aAAa,WAAW,UAAU,WAAW;AAAA,IACzH,CAAC;AAAA,EACL,WAAW,aAAa,QAAQ;AAC5B,UAAM,EAAE,KAAK,IAAI;AAEjB,QAAI,MAAM,QAAQ,IAAI,GAAG;AACrB,WAAK,QAAQ,CAAC,QAAQ;AAClB,YAAI,CAAC,mBAAmB,KAAK,cAAc,IAAI,GAAG;AAC9C,wBAAc,KAAK,KAAK,GAAG;AAAA,QAC/B;AAAA,MACJ,CAAC;AAAA,IACL,WAAW,CAAC,mBAAmB,MAAM,cAAc,IAAI,GAAG;AACtD,oBAAc,KAAK,KAAK,IAAI;AAAA,IAChC;AAAA,EACJ,WAAW,aAAa,YAAY;AAChC,UAAM,EAAE,SAAS,IAAI;AAGrB,kBAAc,WAAW;AAAA,EAC7B,WAAW,SAAS,WAAW,GAAG,GAAG;AAGjC,kBAAc,MAAM,YAAY,UAAU,cAAc,MAAM,WAAW,WAAW,SAAS;AAAA,EACjG;AACJ;AAEA,IAAO,kCAAQ;;;AFvDf,IAAM,wBAAwB;AAAA,EAC1B,IAAI,CAAC,SAAS,eAAe,aAAa,cAAc,qBAAqB;AAAA,EAC7E,IAAI,CAAC,SAAS,eAAe,aAAa,cAAc,uBAAuB,YAAY;AAAA,EAC3F,IAAI,CAAC,cAAc,UAAU;AACjC;AAKA,IAAME,iBAAgB,CAAC,OAAe,YAAsB,MAAM,IAAI,CAAC,SAAe;AAClF,OAAK,KAAK,QAAQ,aAAa,KAAK,QAAQ,aAAa,KAAK,QAAQ,eAAe,KAAK,gBAAgB,IAAI;AAC1G,UAAM,SAASD,MAAK,cAAc,KAAK,WAAW;AAElD,QAAI,OAAO,UAAU,OAAO,OAAO,SAAS,GAAG;AAC3C,aAAO,OAAO,IAAuB,CAAC,UAAU;AAC5C,cAAM,WAA8B;AAEpC,iBAAS,aAAa,KAAK;AAE3B,eAAO;AAAA,MACX,CAAC;AAED,UAAI,cAAc;AAElB,qBAAe,UACR,OAAO,OACL,IAAI,CAAC,UAAO;AApCjC;AAoCoC,kBAAG,MAAM,SAAS;AAAA;AAAA;AAAA,KAAkC,oCAAO,eAAP,mBAAmB,QAAQ,OAAO;AAAA;AAAA,OAAiB,EACtH,KAAK,IAAI,IACZ,OAAO,OAAO,IAAI,CAAC,UAAU,MAAM,SAAS,CAAC,EAAE,KAAK,IAAI;AAE9D,YAAM,IAAI,MAAM,WAAW;AAAA,IAC/B;AAEA,UAAM,iBAAiB,OAAO,OAAO;AACrC,UAAM,gBAAqC;AAAA,MACvC,MAAM,CAAC;AAAA,IACX;AAEA,0BAAsB,0BAA0B,IAAI,GAAG,QAAQ,CAAC,aAAa;AACzE,oBAAc,YAAY,cAAc,aAAa,CAAC;AAAA,IAC1D,CAAC;AAED,WAAO,KAAK,cAAc,EAAE,QAAQ,CAAC,aAAa;AAC9C,sCAAsB,eAAe,gBAAgB,QAAQ;AAAA,IACjE,CAAC;AAED,WAAO;AAAA,EACX;AAEA,SAAO,CAAC;AACZ,CAAC;AAED,IAAML,qBAAoB,CAAC,cAAsB,YAA8D;AAC3G,QAAM,qBAAqBG,eAAc,cAAc,EAAE,SAAS,WAAW,CAAC;AAE9E,SAAO,mBAAmB,IAAI,CAAC,YAAY;AAIvC,UAAM,MAAM,QAAQ,KAAK,SAAS;AAClC,UAAM,SAASC,WAAU,CAAC,GAAG,GAAGE,eAAc,QAAQ,MAAM,OAAO,GAAG,kBAAU;AAEhF,KAAC,eAAe,aAAa,cAAc,uBAAuB,cAAc,MAAM,EAAE,QAAQ,CAAC,aAAa;AAC1G,UAAI,OAAO,cAAc,UAAa,iBAAiB,OAAO,SAAS,GAAG;AACtE,eAAO,OAAO;AAAA,MAClB;AAAA,IACJ,CAAC;AAGD,UAAM,OAAO,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC;AAE9C,WAAO;AAAA,MACH;AAAA,MACA;AAAA,IACJ;AAAA,EACJ,CAAC;AACL;AAEA,IAAOC,gCAAQP;;;AH1Ef,IAAM,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAEA,IAAM,eAAe,CAAC,UAAe;AACjC,MAAI,OAAO;AAEP,YAAQ,MAAM,KAAK;AACnB,SAAK,CAAC;AAAA,EACV;AACJ;AAEA,IAAM,wBAAN,MAA4B;AAAA,EAWxB,YACI,YACA,SACA,mBACA,SAIF;AACE,SAAK,aAAa;AAClB,SAAK,oBAAoB;AACzB,SAAK,UAAU;AACf,SAAK,UAAU,QAAQ,WAAW;AAClC,SAAK,SAAS,QAAQ,UAAU,CAAC;AAAA,EACrC;AAAA,EAEA,MAAM,UAAoB;AACtB,aAAS,MAAM,KAAK,SAAS,yBAAyB,OAAO,GAAG,aAA2B;AAEvF,cAAQ,IAAI,0CAA0C;AAEtD,YAAM,OAAO,IAAI,qBAAY,KAAK,iBAAiB;AAGnD,uBAAiB,OAAO,KAAK,SAAS;AAClC,cAAM,QAAQ,MAAM,QAAQ,KAAK;AAAA,UAE7B,MAAM,CAAC,GAAG,KAAK,QAAQ,GAAG,OAAO;AAAA,UACjC,YAAY,CAAC,OAAO,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,SAAS,MAAM;AAAA,UAC1E,aAAa;AAAA,UACb,kBAAkB;AAAA,YACd,OAAO;AAAA,cACH,OAAO,KAAK;AAAA,cACZ,WAAW;AAAA,YACf;AAAA,YACA,MAAM;AAAA,cACF,OAAO,KAAK;AAAA,cACZ,WAAW;AAAA,YACf;AAAA,UACJ;AAAA,QACJ,CAAC;AAED,YAAI,KAAK,SAAS;AAEd,kBAAQ,IAAI,SAAS,MAAM,mBAAmB,KAAK;AAEnD,kBAAQ,IAAI,KAAK;AAAA,QACrB;AAEA,cAAM,QAAQ,CAAC,SAAS;AACpB,cAAI,KAAK,SAAS;AAEd,oBAAQ,IAAI,gBAAgB,MAAM;AAAA,UACtC;AAEA,cAAI;AACA,kBAAM,uBAAuB,mBAAU,MAAM,8BAA6B,KAAK,OAAO;AAEtF,iBAAK,QAAQ,qBAAqB,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;AAE1D,kBAAM,8BAA8B,mBAAU,MAAMO,+BAAoC,KAAK,OAAO;AAEpG,iBAAK,QAAQ,4BAA4B,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;AAAA,UACrE,SAAS,OAAP;AAEE,oBAAQ,MAAM,KAAK;AACnB,iBAAK,CAAC;AAAA,UACV;AAAA,QACJ,CAAC;AAAA,MACL;AAEA,UAAI;AACA,YAAI,KAAK,SAAS;AAEd,kBAAQ,IAAI,yBAAyB;AAErC,kBAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,QAC7C;AAEA,cAAM,cAAc,SAAS,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC;AAAA,MACjE,SAAS,OAAP;AAEE,gBAAQ,MAAM,MAAM,OAAO,CAAC;AAC5B,aAAK,CAAC;AAAA,MACV;AAEA,YAAM,EAAE,WAAW,IAAI;AAEvB,MAAAN,IAAG,MAAM,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,GAAG,CAAC,UAAU;AAC1D,YAAI,OAAO;AACP,uBAAa,KAAK;AAAA,QACtB;AAEA,QAAAA,IAAG,UAAU,YAAY,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,YAAY;AAAA,MACxE,CAAC;AAGD,UAAI,KAAK,SAAS;AAEd,gBAAQ,IAAI,4BAA4B,KAAK,kBAAkB;AAAA,MACnE;AAGA,cAAQ,IAAI,gCAAgC;AAE5C,eAAS;AAAA,IACb,CAAC;AAAA,EACL;AACJ;AAEA,IAAO,kCAAQ","sourcesContent":["function objectMerge<T>(a: T, b: T) {\n Object.keys(b as object).forEach((key) => {\n if (a[key as keyof typeof b] === undefined) {\n // eslint-disable-next-line no-param-reassign\n a[key as keyof typeof b] = {\n ...b[key as keyof typeof b],\n };\n } else {\n Object.keys(b[key as keyof typeof b] as object).forEach((subKey) => {\n // eslint-disable-next-line no-param-reassign\n (a[key as keyof typeof b] as { [key: string]: object })[subKey] = {\n ...(a[key as keyof typeof b] as { [key: string]: object })[subKey],\n ...(b[key as keyof typeof b] as { [key: string]: object })[subKey],\n };\n });\n }\n });\n}\n\nexport default objectMerge;\n","import {\n BaseDefinition,\n ComponentsObject,\n ExternalDocumentationObject,\n InfoObject,\n OpenApiObject,\n PathsObject,\n SecurityRequirementObject,\n ServerObject,\n TagObject,\n} from \"./exported\";\nimport objectMerge from \"./util/object-merge\";\n\nclass SpecBuilder implements OpenApiObject {\n openapi: string;\n\n info: InfoObject;\n\n servers?: ServerObject[];\n\n paths: PathsObject;\n\n components?: ComponentsObject;\n\n security?: SecurityRequirementObject[];\n\n tags?: TagObject[];\n\n externalDocs?: ExternalDocumentationObject;\n\n constructor(baseDefinition: BaseDefinition) {\n this.openapi = baseDefinition.openapi;\n this.info = baseDefinition.info;\n this.servers = baseDefinition.servers;\n this.paths = baseDefinition.paths || {};\n this.components = baseDefinition.components;\n this.security = baseDefinition.security;\n this.tags = baseDefinition.tags;\n this.externalDocs = baseDefinition.externalDocs;\n }\n\n addData(parsedFile: OpenApiObject[]) {\n parsedFile.forEach((file) => {\n const { paths, components, ...rest } = file;\n\n // only merge paths and components\n objectMerge(this, {\n paths: paths || {},\n components: components || {},\n } as OpenApiObject);\n\n // overwrite everything else:\n Object.entries(rest).forEach(([key, value]) => {\n // @ts-ignore\n this[key as keyof OpenApiObject] = value;\n });\n });\n }\n}\n\nexport default SpecBuilder;\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport yaml from \"yaml\";\n\nimport { OpenApiObject } from \"./exported\";\nimport yamlLoc from \"./util/yaml-loc\";\n\nconst ALLOWED_KEYS = new Set([\"openapi\", \"info\", \"servers\", \"security\", \"tags\", \"externalDocs\", \"components\", \"paths\"]);\n\nclass ParseError extends Error {\n filePath?: string;\n}\n\nconst parseFile = (\n file: string,\n commentsToOpenApi: (fileContent: string, verbose?: boolean) => { spec: OpenApiObject; loc: number }[],\n verbose?: boolean,\n): { spec: OpenApiObject; loc: number }[] => {\n const fileContent = fs.readFileSync(file, { encoding: \"utf8\" });\n const extension = path.extname(file);\n\n if (extension === \".yaml\" || extension === \".yml\") {\n const spec = yaml.parse(fileContent);\n const invalidKeys = Object.keys(spec).filter((key) => !ALLOWED_KEYS.has(key));\n\n if (invalidKeys.length > 0) {\n const error = new ParseError(`Unexpected keys: ${invalidKeys.join(\", \")}`);\n\n error.filePath = file;\n\n throw error;\n }\n\n if (Object.keys(spec).some((key) => ALLOWED_KEYS.has(key))) {\n const loc = yamlLoc(fileContent);\n\n return [{ spec, loc }];\n }\n\n return [];\n }\n\n try {\n return commentsToOpenApi(fileContent, verbose);\n } catch (error: any) {\n error.filePath = file;\n\n throw error;\n }\n};\n\nexport default parseFile;\n","function yamlLoc(string: string): number {\n // Break string into lines.\n const split = string.split(/\\r\\n|\\r|\\n/);\n\n const filtered = split.filter((line) => {\n // Remove comments.\n if (/^\\s*(#\\s*.*)?$/.test(line)) {\n return false;\n }\n // Remove empty lines.\n return line.trim().length > 0;\n });\n\n return filtered.length;\n}\n\nexport default yamlLoc;\n","import SwaggerParser from \"@apidevtools/swagger-parser\";\nimport { collect } from \"@visulima/readdir\";\nimport fs from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { exit } from \"node:process\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { Compiler } from \"webpack\";\n\nimport type { BaseDefinition } from \"../exported\";\nimport jsDocumentCommentsToOpenApi from \"../jsdoc/comments-to-open-api\";\nimport parseFile from \"../parse-file\";\nimport SpecBuilder from \"../spec-builder\";\nimport swaggerJsDocumentCommentsToOpenApi from \"../swagger-jsdoc/comments-to-open-api\";\n\nconst exclude = [\n \"coverage/**\",\n \".github/**\",\n \"packages/*/test{,s}/**\",\n \"**/*.d.ts\",\n \"test{,s}/**\",\n \"test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}\",\n \"**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}\",\n \"**/__tests__/**\",\n \"**/{ava,babel,nyc}.config.{js,cjs,mjs}\",\n \"**/jest.config.{js,cjs,mjs,ts}\",\n \"**/{karma,rollup,webpack}.config.js\",\n \"**/.{eslint,mocha}rc.{js,cjs}\",\n \"**/.{travis,yarnrc}.yml\",\n \"**/{docker-compose,docker}.yml\",\n \"**/.yamllint.{yaml,yml}\",\n \"**/node_modules/**\",\n \"**/pnpm-lock.yaml\",\n \"**/pnpm-workspace.yaml\",\n \"**/{package,package-lock}.json\",\n \"**/yarn.lock\",\n \"**/package.json5\",\n \"**/.next/**\",\n];\n\nconst errorHandler = (error: any) => {\n if (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n exit(1);\n }\n};\n\nclass SwaggerCompilerPlugin {\n private readonly swaggerDefinition: BaseDefinition;\n\n private readonly sources: string[];\n\n private readonly verbose: boolean;\n\n private readonly ignore: string | ReadonlyArray<string>;\n\n assetsPath: string;\n\n constructor(\n assetsPath: string,\n sources: string[],\n swaggerDefinition: BaseDefinition,\n options: {\n verbose?: boolean;\n ignore?: string | ReadonlyArray<string>;\n },\n ) {\n this.assetsPath = assetsPath;\n this.swaggerDefinition = swaggerDefinition;\n this.sources = sources;\n this.verbose = options.verbose || false;\n this.ignore = options.ignore || [];\n }\n\n apply(compiler: Compiler) {\n compiler.hooks.make.tapAsync(\"SwaggerCompilerPlugin\", async (_, callback: VoidFunction) => {\n // eslint-disable-next-line no-console\n console.log(\"Build paused, switching to swagger build\");\n\n const spec = new SpecBuilder(this.swaggerDefinition);\n\n // eslint-disable-next-line no-restricted-syntax,unicorn/prevent-abbreviations\n for await (const dir of this.sources) {\n const files = await collect(dir, {\n // eslint-disable-next-line @rushstack/security/no-unsafe-regexp\n skip: [...this.ignore, ...exclude],\n extensions: [\".js\", \".cjs\", \".mjs\", \".ts\", \".tsx\", \".jsx\", \".yaml\", \".yml\"],\n 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 fs.mkdir(dirname(assetsPath), { recursive: true }, (error) => {\n if (error) {\n errorHandler(error);\n }\n\n fs.writeFile(assetsPath, JSON.stringify(spec, null, 2), errorHandler);\n });\n\n // eslint-disable-next-line unicorn/consistent-destructuring\n if (this.verbose) {\n // eslint-disable-next-line no-console,unicorn/consistent-destructuring\n console.log(`Written swagger spec to \"${this.assetsPath}\" file`);\n }\n\n // eslint-disable-next-line no-console\n console.log(\"switching back to normal build\");\n\n callback();\n });\n }\n}\n\nexport default SwaggerCompilerPlugin;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\n\nimport { OpenApiObject, PathsObject } from \"../exported\";\nimport customizer from \"../util/customizer\";\n\n// The security object has a bizare setup...\nfunction fixSecurityObject(thing: any) {\n if (thing.security) {\n // eslint-disable-next-line no-param-reassign\n thing.security = Object.keys(thing.security).map((s) => {\n return {\n [s]: thing.security[s],\n };\n });\n }\n}\n\nconst primitiveTypes = new Set([\"integer\", \"number\", \"string\", \"boolean\", \"object\", \"array\"]);\n\nconst formatMap: { [key: string]: string } = {\n int32: \"integer\",\n int64: \"integer\",\n float: \"number\",\n double: \"number\",\n date: \"string\",\n \"date-time\": \"string\",\n password: \"string\",\n byte: \"string\",\n binary: \"string\",\n};\n\nfunction parseDescription(tag: any) {\n const rawType = tag.type;\n const isArray = rawType && rawType.endsWith(\"[]\");\n\n let parsedType;\n\n if (rawType) {\n parsedType = rawType.replace(/\\[]$/, \"\");\n }\n\n const isPrimitive = primitiveTypes.has(parsedType);\n const isFormat = Object.keys(formatMap).includes(parsedType);\n\n let defaultValue;\n\n if (tag.default) {\n switch (parsedType) {\n case \"integer\":\n case \"int32\":\n case \"int64\": {\n defaultValue = Number.parseInt(tag.default, 10);\n break;\n }\n case \"number\":\n case \"double\":\n case \"float\": {\n defaultValue = Number.parseFloat(tag.default);\n break;\n }\n default: {\n defaultValue = tag.default;\n break;\n }\n }\n }\n\n let rootType;\n\n if (isPrimitive) {\n rootType = { type: parsedType, default: defaultValue };\n } else if (isFormat) {\n rootType = {\n type: formatMap[parsedType],\n format: parsedType,\n default: defaultValue,\n };\n } else {\n rootType = { $ref: `#/components/schemas/${parsedType}` };\n }\n\n let schema: undefined | object = isArray\n ? {\n type: \"array\",\n items: {\n ...rootType,\n },\n }\n : {\n ...rootType,\n };\n\n if (parsedType === undefined) {\n schema = undefined;\n }\n\n // remove the optional dash from the description.\n let description = tag.description.trim().replace(/^- /, \"\");\n\n if (description === \"\") {\n description = undefined;\n }\n\n return {\n name: tag.name,\n description,\n required: !tag.optional,\n schema,\n rawType,\n };\n}\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction tagsToObjects(tags: Spec[], verbose?: boolean) {\n return tags.map((tag) => {\n const parsedResponse = parseDescription(tag);\n\n // Some ops only have a `description`, merge `name` and `description`\n // for these.\n let nameAndDescription = \"\";\n\n if (parsedResponse.name) {\n nameAndDescription += parsedResponse.name;\n }\n\n if (parsedResponse.description) {\n nameAndDescription += ` ${parsedResponse.description.trim()}`;\n }\n\n switch (tag.tag) {\n case \"operationId\":\n case \"summary\":\n case \"description\": {\n return { [tag.tag]: nameAndDescription };\n }\n\n case \"deprecated\": {\n return { deprecated: true };\n }\n\n case \"externalDocs\": {\n return {\n externalDocs: {\n url: parsedResponse.name,\n description: parsedResponse.description,\n },\n };\n }\n\n case \"server\": {\n return {\n servers: [\n {\n url: parsedResponse.name,\n description: parsedResponse.description,\n },\n ],\n };\n }\n\n case \"tag\": {\n return { tags: [nameAndDescription] };\n }\n\n case \"cookieParam\":\n case \"headerParam\":\n case \"queryParam\":\n case \"pathParam\": {\n return {\n parameters: [\n {\n name: parsedResponse.name,\n in: tag.tag.replace(/Param$/, \"\"),\n description: parsedResponse.description,\n required: parsedResponse.required,\n schema: parsedResponse.schema,\n },\n ],\n };\n }\n\n case \"bodyContent\": {\n return {\n requestBody: {\n content: {\n [parsedResponse.name.replace(\"*\\\\/*\", \"*/*\")]: {\n schema: parsedResponse.schema,\n },\n },\n },\n };\n }\n\n case \"bodyExample\": {\n const [contentType, example] = parsedResponse.name.split(\".\");\n return {\n requestBody: {\n content: {\n [contentType]: {\n examples: {\n [example]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n };\n }\n\n case \"bodyDescription\": {\n return { requestBody: { description: nameAndDescription } };\n }\n\n case \"bodyRequired\": {\n return { requestBody: { required: true } };\n }\n\n case \"response\": {\n return {\n responses: {\n [parsedResponse.name]: {\n description: parsedResponse.description,\n },\n },\n };\n }\n\n case \"callback\": {\n return {\n callbacks: {\n [parsedResponse.name]: {\n $ref: `#/components/callbacks/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"responseContent\": {\n const [status, contentType] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status]: {\n content: {\n [contentType]: {\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeaderComponent\": {\n const [status, header] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n headers: {\n [header]: {\n $ref: `#/components/headers/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeader\": {\n const [status, header] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n headers: {\n [header]: {\n description: parsedResponse.description,\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseExample\": {\n const [status, contentType, example] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n content: {\n [contentType]: {\n examples: {\n [example]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n },\n };\n }\n\n case \"responseLink\": {\n const [status, link] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n links: {\n [link]: {\n $ref: `#/components/links/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"bodyComponent\": {\n return {\n requestBody: {\n $ref: `#/components/requestBodies/${parsedResponse.rawType}`,\n },\n };\n }\n\n case \"responseComponent\": {\n return {\n responses: {\n [parsedResponse.name]: {\n $ref: `#/components/responses/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"paramComponent\": {\n return {\n parameters: [{ $ref: `#/components/parameters/${parsedResponse.rawType}` }],\n };\n }\n\n case \"security\": {\n const [security, scopeItem] = parsedResponse.name.split(\".\");\n let scope: string[] = [];\n if (scopeItem) {\n scope = [scopeItem];\n }\n return {\n security: { [security]: scope },\n };\n }\n\n default: {\n return {};\n }\n }\n });\n}\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { spec: OpenApiObject; loc: number }[] => {\n const openAPIRegex = /^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \\/.*$/;\n\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments\n .filter((comment) => openAPIRegex.test(comment.description.trim()))\n .map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n fixSecurityObject(result);\n\n const [method, path]: string[] = comment.description.split(\" \");\n\n const pathsObject: PathsObject = {\n [(path as string).trim()]: {\n [(method as string).toLowerCase().trim()]: {\n ...result,\n },\n },\n };\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify({ paths: pathsObject }));\n\n return {\n spec,\n loc,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","const customizer = (objectValue: any, sourceValue: any) => {\n if (Array.isArray(objectValue)) {\n return [...objectValue, ...sourceValue];\n }\n // eslint-disable-next-line unicorn/no-useless-undefined\n return undefined;\n};\n\nexport default customizer;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\nimport yaml, { YAMLError } from \"yaml\";\n\nimport { OpenApiObject } from \"../exported\";\nimport customizer from \"../util/customizer\";\nimport organizeSwaggerObject from \"./organize-swagger-object\";\nimport { getSwaggerVersionFromSpec, hasEmptyProperty } from \"./utils\";\n\nconst specificationTemplate = {\n v2: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\"],\n v3: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\"],\n v4: [\"components\", \"channels\"],\n};\n\ntype ExtendedYAMLError = YAMLError & { annotation?: string };\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst tagsToObjects = (specs: Spec[], verbose?: boolean) => specs.map((spec: Spec) => {\n if ((spec.tag === \"openapi\" || spec.tag === \"swagger\" || spec.tag === \"asyncapi\") && spec.description !== \"\") {\n const parsed = yaml.parseDocument(spec.description);\n\n if (parsed.errors && parsed.errors.length > 0) {\n parsed.errors.map<ExtendedYAMLError>((error) => {\n const newError: ExtendedYAMLError = error;\n\n newError.annotation = spec.description;\n\n return newError;\n });\n\n let errorString = \"Error parsing YAML in @openapi spec:\";\n\n errorString += verbose\n ? (parsed.errors as ExtendedYAMLError[])\n .map((error) => `${error.toString()}\\nImbedded within:\\n\\`\\`\\`\\n ${error?.annotation?.replace(/\\n/g, \"\\n \")}\\n\\`\\`\\``)\n .join(\"\\n\")\n : parsed.errors.map((error) => error.toString()).join(\"\\n\");\n\n throw new Error(errorString);\n }\n\n const parsedDocument = parsed.toJSON();\n const specification: Record<string, any> = {\n tags: [],\n };\n\n specificationTemplate[getSwaggerVersionFromSpec(spec)].forEach((property) => {\n specification[property] = specification[property] || {};\n });\n\n Object.keys(parsedDocument).forEach((property) => {\n organizeSwaggerObject(specification, parsedDocument, property);\n });\n\n return specification;\n }\n\n return {};\n});\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { spec: OpenApiObject; loc: number }[] => {\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments.map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n [\"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\", \"tags\"].forEach((property) => {\n if (result[property] !== undefined && hasEmptyProperty(result[property])) {\n delete result[property];\n }\n });\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify(result));\n\n return {\n spec,\n loc,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","import type { Spec } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\n\n/**\n * A recursive deep-merge that ignores null values when merging.\n * This returns the merged object and does not mutate.\n * @param {object} first the first object to get merged\n * @param {object} second the second object to get merged\n */\nexport const mergeDeep = (first?: object, second?: object) => mergeWith({}, first, second, (a, b) => (b === null ? a : undefined));\n\n/**\n * Checks if there is any properties of the input object which are an empty object\n * @param {object} object - the object to check\n * @returns {boolean}\n */\nexport const hasEmptyProperty = (object: Record<string, any>): boolean => Object.keys(object)\n .map((key) => object[key])\n .every((keyObject) => typeof keyObject === \"object\" && Object.keys(keyObject).every((key) => !(key in keyObject)));\n\n/**\n * @param {object} tag\n * @param {array} tags\n * @returns {boolean}\n */\nexport const isTagPresentInTags = (tag: Spec, tags: Spec[]) => tags.some((targetTag) => tag.name === targetTag.name);\n\nexport const getSwaggerVersionFromSpec = (tag: Spec) => {\n switch (tag.tag) {\n case \"openapi\": {\n return \"v3\";\n }\n case \"asyncapi\": {\n return \"v4\";\n }\n case \"swagger\": {\n return \"v2\";\n }\n default: {\n return \"v2\";\n }\n }\n};\n","import { isTagPresentInTags, mergeDeep } from \"./utils\";\n\n/**\n * @param {object} swaggerObject\n * @param {object} annotation\n * @param {string} property\n */\n// eslint-disable-next-line radar/no-duplicate-string\nconst organizeSwaggerObject = (swaggerObject: Record<string, any>, annotation: Record<string, any>, property: string) => {\n // Root property on purpose.\n // eslint-disable-next-line no-secrets/no-secrets\n // @see https://github.com/OAI/OpenAPI-Specification/blob/master/proposals/002_Webhooks.md#proposed-solution\n if (property === \"x-webhooks\") {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property] = annotation[property];\n }\n\n // Other extensions can be in varying places depending on different vendors and opinions.\n // The following return makes it so that they are not put in `paths` in the last case.\n // New specific extensions will need to be handled on case-by-case if to be included in `paths`.\n if (property.startsWith(\"x-\")) {\n return;\n }\n\n const commonProperties = [\n \"components\",\n \"consumes\",\n \"produces\",\n \"paths\",\n \"schemas\",\n \"securityDefinitions\",\n \"responses\",\n \"parameters\",\n \"definitions\",\n \"channels\",\n ];\n if (commonProperties.includes(property)) {\n Object.keys(annotation[property]).forEach((definition) => {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property][definition] = mergeDeep(swaggerObject[property][definition], annotation[property][definition]);\n });\n } else if (property === \"tags\") {\n const { tags } = annotation;\n\n if (Array.isArray(tags)) {\n tags.forEach((tag) => {\n if (!isTagPresentInTags(tag, swaggerObject.tags)) {\n swaggerObject.tags.push(tag);\n }\n });\n } else if (!isTagPresentInTags(tags, swaggerObject.tags)) {\n swaggerObject.tags.push(tags);\n }\n } else if (property === \"security\") {\n const { security } = annotation;\n\n // eslint-disable-next-line no-param-reassign\n swaggerObject.security = security;\n } else if (property.startsWith(\"/\")) {\n // Paths which are not defined as \"paths\" property, starting with a slash \"/\"\n // eslint-disable-next-line no-param-reassign\n swaggerObject.paths[property] = mergeDeep(swaggerObject.paths[property], annotation[property]);\n }\n};\n\nexport default organizeSwaggerObject;\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -559,7 +559,7 @@ var commentsToOpenApi2 = (fileContents, verbose) => {
|
|
|
559
559
|
const loc = comment.tags.length + 1;
|
|
560
560
|
const result = mergeWith3({}, ...tagsToObjects2(comment.tags, verbose), customizer_default);
|
|
561
561
|
["definitions", "responses", "parameters", "securityDefinitions", "components", "tags"].forEach((property) => {
|
|
562
|
-
if (
|
|
562
|
+
if (result[property] !== void 0 && hasEmptyProperty(result[property])) {
|
|
563
563
|
delete result[property];
|
|
564
564
|
}
|
|
565
565
|
});
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/util/object-merge.ts","../src/spec-builder.ts","../src/parse-file.ts","../src/util/yaml-loc.ts","../src/webpack/swagger-compiler-plugin.ts","../src/jsdoc/comments-to-open-api.ts","../src/util/customizer.ts","../src/swagger-jsdoc/comments-to-open-api.ts","../src/swagger-jsdoc/utils.ts","../src/swagger-jsdoc/organize-swagger-object.ts"],"sourcesContent":["function objectMerge<T>(a: T, b: T) {\n Object.keys(b as object).forEach((key) => {\n if (a[key as keyof typeof b] === undefined) {\n // eslint-disable-next-line no-param-reassign\n a[key as keyof typeof b] = {\n ...b[key as keyof typeof b],\n };\n } else {\n Object.keys(b[key as keyof typeof b] as object).forEach((subKey) => {\n // eslint-disable-next-line no-param-reassign\n (a[key as keyof typeof b] as { [key: string]: object })[subKey] = {\n ...(a[key as keyof typeof b] as { [key: string]: object })[subKey],\n ...(b[key as keyof typeof b] as { [key: string]: object })[subKey],\n };\n });\n }\n });\n}\n\nexport default objectMerge;\n","import {\n BaseDefinition,\n ComponentsObject,\n ExternalDocumentationObject,\n InfoObject,\n OpenApiObject,\n PathsObject,\n SecurityRequirementObject,\n ServerObject,\n TagObject,\n} from \"./exported\";\nimport objectMerge from \"./util/object-merge\";\n\nclass SpecBuilder implements OpenApiObject {\n openapi: string;\n\n info: InfoObject;\n\n servers?: ServerObject[];\n\n paths: PathsObject;\n\n components?: ComponentsObject;\n\n security?: SecurityRequirementObject[];\n\n tags?: TagObject[];\n\n externalDocs?: ExternalDocumentationObject;\n\n constructor(baseDefinition: BaseDefinition) {\n this.openapi = baseDefinition.openapi;\n this.info = baseDefinition.info;\n this.servers = baseDefinition.servers;\n this.paths = baseDefinition.paths || {};\n this.components = baseDefinition.components;\n this.security = baseDefinition.security;\n this.tags = baseDefinition.tags;\n this.externalDocs = baseDefinition.externalDocs;\n }\n\n addData(parsedFile: OpenApiObject[]) {\n parsedFile.forEach((file) => {\n const { paths, components, ...rest } = file;\n\n // only merge paths and components\n objectMerge(this, {\n paths: paths || {},\n components: components || {},\n } as OpenApiObject);\n\n // overwrite everything else:\n Object.entries(rest).forEach(([key, value]) => {\n // @ts-ignore\n this[key as keyof OpenApiObject] = value;\n });\n });\n }\n}\n\nexport default SpecBuilder;\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport yaml from \"yaml\";\n\nimport { OpenApiObject } from \"./exported\";\nimport yamlLoc from \"./util/yaml-loc\";\n\nconst ALLOWED_KEYS = new Set([\"openapi\", \"info\", \"servers\", \"security\", \"tags\", \"externalDocs\", \"components\", \"paths\"]);\n\nclass ParseError extends Error {\n filePath?: string;\n}\n\nconst parseFile = (\n file: string,\n commentsToOpenApi: (fileContent: string, verbose?: boolean) => { spec: OpenApiObject; loc: number }[],\n verbose?: boolean,\n): { spec: OpenApiObject; loc: number }[] => {\n const fileContent = fs.readFileSync(file, { encoding: \"utf8\" });\n const extension = path.extname(file);\n\n if (extension === \".yaml\" || extension === \".yml\") {\n const spec = yaml.parse(fileContent);\n const invalidKeys = Object.keys(spec).filter((key) => !ALLOWED_KEYS.has(key));\n\n if (invalidKeys.length > 0) {\n const error = new ParseError(`Unexpected keys: ${invalidKeys.join(\", \")}`);\n\n error.filePath = file;\n\n throw error;\n }\n\n if (Object.keys(spec).some((key) => ALLOWED_KEYS.has(key))) {\n const loc = yamlLoc(fileContent);\n\n return [{ spec, loc }];\n }\n\n return [];\n }\n\n try {\n return commentsToOpenApi(fileContent, verbose);\n } catch (error: any) {\n error.filePath = file;\n\n throw error;\n }\n};\n\nexport default parseFile;\n","function yamlLoc(string: string): number {\n // Break string into lines.\n const split = string.split(/\\r\\n|\\r|\\n/);\n\n const filtered = split.filter((line) => {\n // Remove comments.\n if (/^\\s*(#\\s*.*)?$/.test(line)) {\n return false;\n }\n // Remove empty lines.\n return line.trim().length > 0;\n });\n\n return filtered.length;\n}\n\nexport default yamlLoc;\n","import SwaggerParser from \"@apidevtools/swagger-parser\";\nimport { collect } from \"@visulima/readdir\";\nimport fs from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { exit } from \"node:process\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { Compiler } from \"webpack\";\n\nimport type { BaseDefinition } from \"../exported\";\nimport jsDocumentCommentsToOpenApi from \"../jsdoc/comments-to-open-api\";\nimport parseFile from \"../parse-file\";\nimport SpecBuilder from \"../spec-builder\";\nimport swaggerJsDocumentCommentsToOpenApi from \"../swagger-jsdoc/comments-to-open-api\";\n\nconst exclude = [\n \"coverage/**\",\n \".github/**\",\n \"packages/*/test{,s}/**\",\n \"**/*.d.ts\",\n \"test{,s}/**\",\n \"test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}\",\n \"**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}\",\n \"**/__tests__/**\",\n \"**/{ava,babel,nyc}.config.{js,cjs,mjs}\",\n \"**/jest.config.{js,cjs,mjs,ts}\",\n \"**/{karma,rollup,webpack}.config.js\",\n \"**/.{eslint,mocha}rc.{js,cjs}\",\n \"**/.{travis,yarnrc}.yml\",\n \"**/{docker-compose,docker}.yml\",\n \"**/.yamllint.{yaml,yml}\",\n \"**/node_modules/**\",\n \"**/pnpm-lock.yaml\",\n \"**/pnpm-workspace.yaml\",\n \"**/{package,package-lock}.json\",\n \"**/yarn.lock\",\n \"**/package.json5\",\n \"**/.next/**\",\n];\n\nconst errorHandler = (error: any) => {\n if (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n exit(1);\n }\n};\n\nclass SwaggerCompilerPlugin {\n private readonly swaggerDefinition: BaseDefinition;\n\n private readonly sources: string[];\n\n private readonly verbose: boolean;\n\n private readonly ignore: string | ReadonlyArray<string>;\n\n assetsPath: string;\n\n constructor(\n assetsPath: string,\n sources: string[],\n swaggerDefinition: BaseDefinition,\n options: {\n verbose?: boolean;\n ignore?: string | ReadonlyArray<string>;\n },\n ) {\n this.assetsPath = assetsPath;\n this.swaggerDefinition = swaggerDefinition;\n this.sources = sources;\n this.verbose = options.verbose || false;\n this.ignore = options.ignore || [];\n }\n\n apply(compiler: Compiler) {\n compiler.hooks.make.tapAsync(\"SwaggerCompilerPlugin\", async (_, callback: VoidFunction) => {\n // eslint-disable-next-line no-console\n console.log(\"Build paused, switching to swagger build\");\n\n const spec = new SpecBuilder(this.swaggerDefinition);\n\n // eslint-disable-next-line no-restricted-syntax,unicorn/prevent-abbreviations\n for await (const dir of this.sources) {\n const files = await collect(dir, {\n // eslint-disable-next-line @rushstack/security/no-unsafe-regexp\n skip: [...this.ignore, ...exclude],\n extensions: [\".js\", \".cjs\", \".mjs\", \".ts\", \".tsx\", \".jsx\", \".yaml\", \".yml\"],\n 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 fs.mkdir(dirname(assetsPath), { recursive: true }, (error) => {\n if (error) {\n errorHandler(error);\n }\n\n fs.writeFile(assetsPath, JSON.stringify(spec, null, 2), errorHandler);\n });\n\n // eslint-disable-next-line unicorn/consistent-destructuring\n if (this.verbose) {\n // eslint-disable-next-line no-console,unicorn/consistent-destructuring\n console.log(`Written swagger spec to \"${this.assetsPath}\" file`);\n }\n\n // eslint-disable-next-line no-console\n console.log(\"switching back to normal build\");\n\n callback();\n });\n }\n}\n\nexport default SwaggerCompilerPlugin;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\n\nimport { OpenApiObject, PathsObject } from \"../exported\";\nimport customizer from \"../util/customizer\";\n\n// The security object has a bizare setup...\nfunction fixSecurityObject(thing: any) {\n if (thing.security) {\n // eslint-disable-next-line no-param-reassign\n thing.security = Object.keys(thing.security).map((s) => {\n return {\n [s]: thing.security[s],\n };\n });\n }\n}\n\nconst primitiveTypes = new Set([\"integer\", \"number\", \"string\", \"boolean\", \"object\", \"array\"]);\n\nconst formatMap: { [key: string]: string } = {\n int32: \"integer\",\n int64: \"integer\",\n float: \"number\",\n double: \"number\",\n date: \"string\",\n \"date-time\": \"string\",\n password: \"string\",\n byte: \"string\",\n binary: \"string\",\n};\n\nfunction parseDescription(tag: any) {\n const rawType = tag.type;\n const isArray = rawType && rawType.endsWith(\"[]\");\n\n let parsedType;\n\n if (rawType) {\n parsedType = rawType.replace(/\\[]$/, \"\");\n }\n\n const isPrimitive = primitiveTypes.has(parsedType);\n const isFormat = Object.keys(formatMap).includes(parsedType);\n\n let defaultValue;\n\n if (tag.default) {\n switch (parsedType) {\n case \"integer\":\n case \"int32\":\n case \"int64\": {\n defaultValue = Number.parseInt(tag.default, 10);\n break;\n }\n case \"number\":\n case \"double\":\n case \"float\": {\n defaultValue = Number.parseFloat(tag.default);\n break;\n }\n default: {\n defaultValue = tag.default;\n break;\n }\n }\n }\n\n let rootType;\n\n if (isPrimitive) {\n rootType = { type: parsedType, default: defaultValue };\n } else if (isFormat) {\n rootType = {\n type: formatMap[parsedType],\n format: parsedType,\n default: defaultValue,\n };\n } else {\n rootType = { $ref: `#/components/schemas/${parsedType}` };\n }\n\n let schema: undefined | object = isArray\n ? {\n type: \"array\",\n items: {\n ...rootType,\n },\n }\n : {\n ...rootType,\n };\n\n if (parsedType === undefined) {\n schema = undefined;\n }\n\n // remove the optional dash from the description.\n let description = tag.description.trim().replace(/^- /, \"\");\n\n if (description === \"\") {\n description = undefined;\n }\n\n return {\n name: tag.name,\n description,\n required: !tag.optional,\n schema,\n rawType,\n };\n}\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction tagsToObjects(tags: Spec[], verbose?: boolean) {\n return tags.map((tag) => {\n const parsedResponse = parseDescription(tag);\n\n // Some ops only have a `description`, merge `name` and `description`\n // for these.\n let nameAndDescription = \"\";\n\n if (parsedResponse.name) {\n nameAndDescription += parsedResponse.name;\n }\n\n if (parsedResponse.description) {\n nameAndDescription += ` ${parsedResponse.description.trim()}`;\n }\n\n switch (tag.tag) {\n case \"operationId\":\n case \"summary\":\n case \"description\": {\n return { [tag.tag]: nameAndDescription };\n }\n\n case \"deprecated\": {\n return { deprecated: true };\n }\n\n case \"externalDocs\": {\n return {\n externalDocs: {\n url: parsedResponse.name,\n description: parsedResponse.description,\n },\n };\n }\n\n case \"server\": {\n return {\n servers: [\n {\n url: parsedResponse.name,\n description: parsedResponse.description,\n },\n ],\n };\n }\n\n case \"tag\": {\n return { tags: [nameAndDescription] };\n }\n\n case \"cookieParam\":\n case \"headerParam\":\n case \"queryParam\":\n case \"pathParam\": {\n return {\n parameters: [\n {\n name: parsedResponse.name,\n in: tag.tag.replace(/Param$/, \"\"),\n description: parsedResponse.description,\n required: parsedResponse.required,\n schema: parsedResponse.schema,\n },\n ],\n };\n }\n\n case \"bodyContent\": {\n return {\n requestBody: {\n content: {\n [parsedResponse.name.replace(\"*\\\\/*\", \"*/*\")]: {\n schema: parsedResponse.schema,\n },\n },\n },\n };\n }\n\n case \"bodyExample\": {\n const [contentType, example] = parsedResponse.name.split(\".\");\n return {\n requestBody: {\n content: {\n [contentType]: {\n examples: {\n [example]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n };\n }\n\n case \"bodyDescription\": {\n return { requestBody: { description: nameAndDescription } };\n }\n\n case \"bodyRequired\": {\n return { requestBody: { required: true } };\n }\n\n case \"response\": {\n return {\n responses: {\n [parsedResponse.name]: {\n description: parsedResponse.description,\n },\n },\n };\n }\n\n case \"callback\": {\n return {\n callbacks: {\n [parsedResponse.name]: {\n $ref: `#/components/callbacks/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"responseContent\": {\n const [status, contentType] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status]: {\n content: {\n [contentType]: {\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeaderComponent\": {\n const [status, header] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n headers: {\n [header]: {\n $ref: `#/components/headers/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeader\": {\n const [status, header] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n headers: {\n [header]: {\n description: parsedResponse.description,\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseExample\": {\n const [status, contentType, example] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n content: {\n [contentType]: {\n examples: {\n [example]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n },\n };\n }\n\n case \"responseLink\": {\n const [status, link] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n links: {\n [link]: {\n $ref: `#/components/links/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"bodyComponent\": {\n return {\n requestBody: {\n $ref: `#/components/requestBodies/${parsedResponse.rawType}`,\n },\n };\n }\n\n case \"responseComponent\": {\n return {\n responses: {\n [parsedResponse.name]: {\n $ref: `#/components/responses/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"paramComponent\": {\n return {\n parameters: [{ $ref: `#/components/parameters/${parsedResponse.rawType}` }],\n };\n }\n\n case \"security\": {\n const [security, scopeItem] = parsedResponse.name.split(\".\");\n let scope: string[] = [];\n if (scopeItem) {\n scope = [scopeItem];\n }\n return {\n security: { [security]: scope },\n };\n }\n\n default: {\n return {};\n }\n }\n });\n}\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { spec: OpenApiObject; loc: number }[] => {\n const openAPIRegex = /^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \\/.*$/;\n\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments\n .filter((comment) => openAPIRegex.test(comment.description.trim()))\n .map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n fixSecurityObject(result);\n\n const [method, path]: string[] = comment.description.split(\" \");\n\n const pathsObject: PathsObject = {\n [(path as string).trim()]: {\n [(method as string).toLowerCase().trim()]: {\n ...result,\n },\n },\n };\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify({ paths: pathsObject }));\n\n return {\n spec,\n loc,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","const customizer = (objectValue: any, sourceValue: any) => {\n if (Array.isArray(objectValue)) {\n return [...objectValue, ...sourceValue];\n }\n // eslint-disable-next-line unicorn/no-useless-undefined\n return undefined;\n};\n\nexport default customizer;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\nimport yaml, { YAMLError } from \"yaml\";\n\nimport { OpenApiObject } from \"../exported\";\nimport customizer from \"../util/customizer\";\nimport organizeSwaggerObject from \"./organize-swagger-object\";\nimport { getSwaggerVersionFromSpec, hasEmptyProperty } from \"./utils\";\n\nconst specificationTemplate = {\n v2: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\"],\n v3: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\"],\n v4: [\"components\", \"channels\"],\n};\n\ntype ExtendedYAMLError = YAMLError & { annotation?: string };\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst tagsToObjects = (specs: Spec[], verbose?: boolean) => specs.map((spec: Spec) => {\n if ((spec.tag === \"openapi\" || spec.tag === \"swagger\" || spec.tag === \"asyncapi\") && spec.description !== \"\") {\n const parsed = yaml.parseDocument(spec.description);\n\n if (parsed.errors && parsed.errors.length > 0) {\n parsed.errors.map<ExtendedYAMLError>((error) => {\n const newError: ExtendedYAMLError = error;\n\n newError.annotation = spec.description;\n\n return newError;\n });\n\n let errorString = \"Error parsing YAML in @openapi spec:\";\n\n errorString += verbose\n ? (parsed.errors as ExtendedYAMLError[])\n .map((error) => `${error.toString()}\\nImbedded within:\\n\\`\\`\\`\\n ${error?.annotation?.replace(/\\n/g, \"\\n \")}\\n\\`\\`\\``)\n .join(\"\\n\")\n : parsed.errors.map((error) => error.toString()).join(\"\\n\");\n\n throw new Error(errorString);\n }\n\n const parsedDocument = parsed.toJSON();\n const specification: Record<string, any> = {\n tags: [],\n };\n\n specificationTemplate[getSwaggerVersionFromSpec(spec)].forEach((property) => {\n specification[property] = specification[property] || {};\n });\n\n Object.keys(parsedDocument).forEach((property) => {\n organizeSwaggerObject(specification, parsedDocument, property);\n });\n\n return specification;\n }\n\n return {};\n});\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { spec: OpenApiObject; loc: number }[] => {\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments.map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n [\"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\", \"tags\"].forEach((property) => {\n if (typeof result[property] !== \"undefined\" && hasEmptyProperty(result[property])) {\n delete result[property];\n }\n });\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify(result));\n\n return {\n spec,\n loc,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","import type { Spec } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\n\n/**\n * A recursive deep-merge that ignores null values when merging.\n * This returns the merged object and does not mutate.\n * @param {object} first the first object to get merged\n * @param {object} second the second object to get merged\n */\nexport const mergeDeep = (first?: object, second?: object) => mergeWith({}, first, second, (a, b) => (b === null ? a : undefined));\n\n/**\n * Checks if there is any properties of the input object which are an empty object\n * @param {object} object - the object to check\n * @returns {boolean}\n */\nexport const hasEmptyProperty = (object: Record<string, any>): boolean => Object.keys(object)\n .map((key) => object[key])\n .every((keyObject) => typeof keyObject === \"object\" && Object.keys(keyObject).every((key) => !(key in keyObject)));\n\n/**\n * @param {object} tag\n * @param {array} tags\n * @returns {boolean}\n */\nexport const isTagPresentInTags = (tag: Spec, tags: Spec[]) => tags.some((targetTag) => tag.name === targetTag.name);\n\nexport const getSwaggerVersionFromSpec = (tag: Spec) => {\n switch (tag.tag) {\n case \"openapi\": {\n return \"v3\";\n }\n case \"asyncapi\": {\n return \"v4\";\n }\n case \"swagger\": {\n return \"v2\";\n }\n default: {\n return \"v2\";\n }\n }\n};\n","import { isTagPresentInTags, mergeDeep } from \"./utils\";\n\n/**\n * @param {object} swaggerObject\n * @param {object} annotation\n * @param {string} property\n */\n// eslint-disable-next-line radar/no-duplicate-string\nconst organizeSwaggerObject = (swaggerObject: Record<string, any>, annotation: Record<string, any>, property: string) => {\n // Root property on purpose.\n // eslint-disable-next-line no-secrets/no-secrets\n // @see https://github.com/OAI/OpenAPI-Specification/blob/master/proposals/002_Webhooks.md#proposed-solution\n if (property === \"x-webhooks\") {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property] = annotation[property];\n }\n\n // Other extensions can be in varying places depending on different vendors and opinions.\n // The following return makes it so that they are not put in `paths` in the last case.\n // New specific extensions will need to be handled on case-by-case if to be included in `paths`.\n if (property.startsWith(\"x-\")) {\n return;\n }\n\n const commonProperties = [\n \"components\",\n \"consumes\",\n \"produces\",\n \"paths\",\n \"schemas\",\n \"securityDefinitions\",\n \"responses\",\n \"parameters\",\n \"definitions\",\n \"channels\",\n ];\n if (commonProperties.includes(property)) {\n Object.keys(annotation[property]).forEach((definition) => {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property][definition] = mergeDeep(swaggerObject[property][definition], annotation[property][definition]);\n });\n } else if (property === \"tags\") {\n const { tags } = annotation;\n\n if (Array.isArray(tags)) {\n tags.forEach((tag) => {\n if (!isTagPresentInTags(tag, swaggerObject.tags)) {\n swaggerObject.tags.push(tag);\n }\n });\n } else if (!isTagPresentInTags(tags, swaggerObject.tags)) {\n swaggerObject.tags.push(tags);\n }\n } else if (property === \"security\") {\n const { security } = annotation;\n\n // eslint-disable-next-line no-param-reassign\n swaggerObject.security = security;\n } else if (property.startsWith(\"/\")) {\n // Paths which are not defined as \"paths\" property, starting with a slash \"/\"\n // eslint-disable-next-line no-param-reassign\n swaggerObject.paths[property] = mergeDeep(swaggerObject.paths[property], annotation[property]);\n }\n};\n\nexport default organizeSwaggerObject;\n"],"mappings":"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","names":["commentsToOpenApi","fs","path","parseComments","mergeWith","yaml","mergeWith","tagsToObjects","yaml","commentsToOpenApi","parseComments","mergeWith","comments_to_open_api_default","comments_to_open_api_default","fs"]}
|
|
1
|
+
{"version":3,"sources":["../src/util/object-merge.ts","../src/spec-builder.ts","../src/parse-file.ts","../src/util/yaml-loc.ts","../src/webpack/swagger-compiler-plugin.ts","../src/jsdoc/comments-to-open-api.ts","../src/util/customizer.ts","../src/swagger-jsdoc/comments-to-open-api.ts","../src/swagger-jsdoc/utils.ts","../src/swagger-jsdoc/organize-swagger-object.ts"],"sourcesContent":["function objectMerge<T>(a: T, b: T) {\n Object.keys(b as object).forEach((key) => {\n if (a[key as keyof typeof b] === undefined) {\n // eslint-disable-next-line no-param-reassign\n a[key as keyof typeof b] = {\n ...b[key as keyof typeof b],\n };\n } else {\n Object.keys(b[key as keyof typeof b] as object).forEach((subKey) => {\n // eslint-disable-next-line no-param-reassign\n (a[key as keyof typeof b] as { [key: string]: object })[subKey] = {\n ...(a[key as keyof typeof b] as { [key: string]: object })[subKey],\n ...(b[key as keyof typeof b] as { [key: string]: object })[subKey],\n };\n });\n }\n });\n}\n\nexport default objectMerge;\n","import {\n BaseDefinition,\n ComponentsObject,\n ExternalDocumentationObject,\n InfoObject,\n OpenApiObject,\n PathsObject,\n SecurityRequirementObject,\n ServerObject,\n TagObject,\n} from \"./exported\";\nimport objectMerge from \"./util/object-merge\";\n\nclass SpecBuilder implements OpenApiObject {\n openapi: string;\n\n info: InfoObject;\n\n servers?: ServerObject[];\n\n paths: PathsObject;\n\n components?: ComponentsObject;\n\n security?: SecurityRequirementObject[];\n\n tags?: TagObject[];\n\n externalDocs?: ExternalDocumentationObject;\n\n constructor(baseDefinition: BaseDefinition) {\n this.openapi = baseDefinition.openapi;\n this.info = baseDefinition.info;\n this.servers = baseDefinition.servers;\n this.paths = baseDefinition.paths || {};\n this.components = baseDefinition.components;\n this.security = baseDefinition.security;\n this.tags = baseDefinition.tags;\n this.externalDocs = baseDefinition.externalDocs;\n }\n\n addData(parsedFile: OpenApiObject[]) {\n parsedFile.forEach((file) => {\n const { paths, components, ...rest } = file;\n\n // only merge paths and components\n objectMerge(this, {\n paths: paths || {},\n components: components || {},\n } as OpenApiObject);\n\n // overwrite everything else:\n Object.entries(rest).forEach(([key, value]) => {\n // @ts-ignore\n this[key as keyof OpenApiObject] = value;\n });\n });\n }\n}\n\nexport default SpecBuilder;\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport yaml from \"yaml\";\n\nimport { OpenApiObject } from \"./exported\";\nimport yamlLoc from \"./util/yaml-loc\";\n\nconst ALLOWED_KEYS = new Set([\"openapi\", \"info\", \"servers\", \"security\", \"tags\", \"externalDocs\", \"components\", \"paths\"]);\n\nclass ParseError extends Error {\n filePath?: string;\n}\n\nconst parseFile = (\n file: string,\n commentsToOpenApi: (fileContent: string, verbose?: boolean) => { spec: OpenApiObject; loc: number }[],\n verbose?: boolean,\n): { spec: OpenApiObject; loc: number }[] => {\n const fileContent = fs.readFileSync(file, { encoding: \"utf8\" });\n const extension = path.extname(file);\n\n if (extension === \".yaml\" || extension === \".yml\") {\n const spec = yaml.parse(fileContent);\n const invalidKeys = Object.keys(spec).filter((key) => !ALLOWED_KEYS.has(key));\n\n if (invalidKeys.length > 0) {\n const error = new ParseError(`Unexpected keys: ${invalidKeys.join(\", \")}`);\n\n error.filePath = file;\n\n throw error;\n }\n\n if (Object.keys(spec).some((key) => ALLOWED_KEYS.has(key))) {\n const loc = yamlLoc(fileContent);\n\n return [{ spec, loc }];\n }\n\n return [];\n }\n\n try {\n return commentsToOpenApi(fileContent, verbose);\n } catch (error: any) {\n error.filePath = file;\n\n throw error;\n }\n};\n\nexport default parseFile;\n","function yamlLoc(string: string): number {\n // Break string into lines.\n const split = string.split(/\\r\\n|\\r|\\n/);\n\n const filtered = split.filter((line) => {\n // Remove comments.\n if (/^\\s*(#\\s*.*)?$/.test(line)) {\n return false;\n }\n // Remove empty lines.\n return line.trim().length > 0;\n });\n\n return filtered.length;\n}\n\nexport default yamlLoc;\n","import SwaggerParser from \"@apidevtools/swagger-parser\";\nimport { collect } from \"@visulima/readdir\";\nimport fs from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { exit } from \"node:process\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { Compiler } from \"webpack\";\n\nimport type { BaseDefinition } from \"../exported\";\nimport jsDocumentCommentsToOpenApi from \"../jsdoc/comments-to-open-api\";\nimport parseFile from \"../parse-file\";\nimport SpecBuilder from \"../spec-builder\";\nimport swaggerJsDocumentCommentsToOpenApi from \"../swagger-jsdoc/comments-to-open-api\";\n\nconst exclude = [\n \"coverage/**\",\n \".github/**\",\n \"packages/*/test{,s}/**\",\n \"**/*.d.ts\",\n \"test{,s}/**\",\n \"test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}\",\n \"**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}\",\n \"**/__tests__/**\",\n \"**/{ava,babel,nyc}.config.{js,cjs,mjs}\",\n \"**/jest.config.{js,cjs,mjs,ts}\",\n \"**/{karma,rollup,webpack}.config.js\",\n \"**/.{eslint,mocha}rc.{js,cjs}\",\n \"**/.{travis,yarnrc}.yml\",\n \"**/{docker-compose,docker}.yml\",\n \"**/.yamllint.{yaml,yml}\",\n \"**/node_modules/**\",\n \"**/pnpm-lock.yaml\",\n \"**/pnpm-workspace.yaml\",\n \"**/{package,package-lock}.json\",\n \"**/yarn.lock\",\n \"**/package.json5\",\n \"**/.next/**\",\n];\n\nconst errorHandler = (error: any) => {\n if (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n exit(1);\n }\n};\n\nclass SwaggerCompilerPlugin {\n private readonly swaggerDefinition: BaseDefinition;\n\n private readonly sources: string[];\n\n private readonly verbose: boolean;\n\n private readonly ignore: string | ReadonlyArray<string>;\n\n assetsPath: string;\n\n constructor(\n assetsPath: string,\n sources: string[],\n swaggerDefinition: BaseDefinition,\n options: {\n verbose?: boolean;\n ignore?: string | ReadonlyArray<string>;\n },\n ) {\n this.assetsPath = assetsPath;\n this.swaggerDefinition = swaggerDefinition;\n this.sources = sources;\n this.verbose = options.verbose || false;\n this.ignore = options.ignore || [];\n }\n\n apply(compiler: Compiler) {\n compiler.hooks.make.tapAsync(\"SwaggerCompilerPlugin\", async (_, callback: VoidFunction) => {\n // eslint-disable-next-line no-console\n console.log(\"Build paused, switching to swagger build\");\n\n const spec = new SpecBuilder(this.swaggerDefinition);\n\n // eslint-disable-next-line no-restricted-syntax,unicorn/prevent-abbreviations\n for await (const dir of this.sources) {\n const files = await collect(dir, {\n // eslint-disable-next-line @rushstack/security/no-unsafe-regexp\n skip: [...this.ignore, ...exclude],\n extensions: [\".js\", \".cjs\", \".mjs\", \".ts\", \".tsx\", \".jsx\", \".yaml\", \".yml\"],\n 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 fs.mkdir(dirname(assetsPath), { recursive: true }, (error) => {\n if (error) {\n errorHandler(error);\n }\n\n fs.writeFile(assetsPath, JSON.stringify(spec, null, 2), errorHandler);\n });\n\n // eslint-disable-next-line unicorn/consistent-destructuring\n if (this.verbose) {\n // eslint-disable-next-line no-console,unicorn/consistent-destructuring\n console.log(`Written swagger spec to \"${this.assetsPath}\" file`);\n }\n\n // eslint-disable-next-line no-console\n console.log(\"switching back to normal build\");\n\n callback();\n });\n }\n}\n\nexport default SwaggerCompilerPlugin;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\n\nimport { OpenApiObject, PathsObject } from \"../exported\";\nimport customizer from \"../util/customizer\";\n\n// The security object has a bizare setup...\nfunction fixSecurityObject(thing: any) {\n if (thing.security) {\n // eslint-disable-next-line no-param-reassign\n thing.security = Object.keys(thing.security).map((s) => {\n return {\n [s]: thing.security[s],\n };\n });\n }\n}\n\nconst primitiveTypes = new Set([\"integer\", \"number\", \"string\", \"boolean\", \"object\", \"array\"]);\n\nconst formatMap: { [key: string]: string } = {\n int32: \"integer\",\n int64: \"integer\",\n float: \"number\",\n double: \"number\",\n date: \"string\",\n \"date-time\": \"string\",\n password: \"string\",\n byte: \"string\",\n binary: \"string\",\n};\n\nfunction parseDescription(tag: any) {\n const rawType = tag.type;\n const isArray = rawType && rawType.endsWith(\"[]\");\n\n let parsedType;\n\n if (rawType) {\n parsedType = rawType.replace(/\\[]$/, \"\");\n }\n\n const isPrimitive = primitiveTypes.has(parsedType);\n const isFormat = Object.keys(formatMap).includes(parsedType);\n\n let defaultValue;\n\n if (tag.default) {\n switch (parsedType) {\n case \"integer\":\n case \"int32\":\n case \"int64\": {\n defaultValue = Number.parseInt(tag.default, 10);\n break;\n }\n case \"number\":\n case \"double\":\n case \"float\": {\n defaultValue = Number.parseFloat(tag.default);\n break;\n }\n default: {\n defaultValue = tag.default;\n break;\n }\n }\n }\n\n let rootType;\n\n if (isPrimitive) {\n rootType = { type: parsedType, default: defaultValue };\n } else if (isFormat) {\n rootType = {\n type: formatMap[parsedType],\n format: parsedType,\n default: defaultValue,\n };\n } else {\n rootType = { $ref: `#/components/schemas/${parsedType}` };\n }\n\n let schema: undefined | object = isArray\n ? {\n type: \"array\",\n items: {\n ...rootType,\n },\n }\n : {\n ...rootType,\n };\n\n if (parsedType === undefined) {\n schema = undefined;\n }\n\n // remove the optional dash from the description.\n let description = tag.description.trim().replace(/^- /, \"\");\n\n if (description === \"\") {\n description = undefined;\n }\n\n return {\n name: tag.name,\n description,\n required: !tag.optional,\n schema,\n rawType,\n };\n}\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction tagsToObjects(tags: Spec[], verbose?: boolean) {\n return tags.map((tag) => {\n const parsedResponse = parseDescription(tag);\n\n // Some ops only have a `description`, merge `name` and `description`\n // for these.\n let nameAndDescription = \"\";\n\n if (parsedResponse.name) {\n nameAndDescription += parsedResponse.name;\n }\n\n if (parsedResponse.description) {\n nameAndDescription += ` ${parsedResponse.description.trim()}`;\n }\n\n switch (tag.tag) {\n case \"operationId\":\n case \"summary\":\n case \"description\": {\n return { [tag.tag]: nameAndDescription };\n }\n\n case \"deprecated\": {\n return { deprecated: true };\n }\n\n case \"externalDocs\": {\n return {\n externalDocs: {\n url: parsedResponse.name,\n description: parsedResponse.description,\n },\n };\n }\n\n case \"server\": {\n return {\n servers: [\n {\n url: parsedResponse.name,\n description: parsedResponse.description,\n },\n ],\n };\n }\n\n case \"tag\": {\n return { tags: [nameAndDescription] };\n }\n\n case \"cookieParam\":\n case \"headerParam\":\n case \"queryParam\":\n case \"pathParam\": {\n return {\n parameters: [\n {\n name: parsedResponse.name,\n in: tag.tag.replace(/Param$/, \"\"),\n description: parsedResponse.description,\n required: parsedResponse.required,\n schema: parsedResponse.schema,\n },\n ],\n };\n }\n\n case \"bodyContent\": {\n return {\n requestBody: {\n content: {\n [parsedResponse.name.replace(\"*\\\\/*\", \"*/*\")]: {\n schema: parsedResponse.schema,\n },\n },\n },\n };\n }\n\n case \"bodyExample\": {\n const [contentType, example] = parsedResponse.name.split(\".\");\n return {\n requestBody: {\n content: {\n [contentType]: {\n examples: {\n [example]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n };\n }\n\n case \"bodyDescription\": {\n return { requestBody: { description: nameAndDescription } };\n }\n\n case \"bodyRequired\": {\n return { requestBody: { required: true } };\n }\n\n case \"response\": {\n return {\n responses: {\n [parsedResponse.name]: {\n description: parsedResponse.description,\n },\n },\n };\n }\n\n case \"callback\": {\n return {\n callbacks: {\n [parsedResponse.name]: {\n $ref: `#/components/callbacks/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"responseContent\": {\n const [status, contentType] = parsedResponse.name.split(\".\");\n\n return {\n responses: {\n [status]: {\n content: {\n [contentType]: {\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeaderComponent\": {\n const [status, header] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n headers: {\n [header]: {\n $ref: `#/components/headers/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"responseHeader\": {\n const [status, header] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n headers: {\n [header]: {\n description: parsedResponse.description,\n schema: parsedResponse.schema,\n },\n },\n },\n },\n };\n }\n\n case \"responseExample\": {\n const [status, contentType, example] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n content: {\n [contentType]: {\n examples: {\n [example]: {\n $ref: `#/components/examples/${parsedResponse.rawType}`,\n },\n },\n },\n },\n },\n },\n };\n }\n\n case \"responseLink\": {\n const [status, link] = parsedResponse.name.split(\".\");\n return {\n responses: {\n [status]: {\n links: {\n [link]: {\n $ref: `#/components/links/${parsedResponse.rawType}`,\n },\n },\n },\n },\n };\n }\n\n case \"bodyComponent\": {\n return {\n requestBody: {\n $ref: `#/components/requestBodies/${parsedResponse.rawType}`,\n },\n };\n }\n\n case \"responseComponent\": {\n return {\n responses: {\n [parsedResponse.name]: {\n $ref: `#/components/responses/${parsedResponse.rawType}`,\n },\n },\n };\n }\n\n case \"paramComponent\": {\n return {\n parameters: [{ $ref: `#/components/parameters/${parsedResponse.rawType}` }],\n };\n }\n\n case \"security\": {\n const [security, scopeItem] = parsedResponse.name.split(\".\");\n let scope: string[] = [];\n if (scopeItem) {\n scope = [scopeItem];\n }\n return {\n security: { [security]: scope },\n };\n }\n\n default: {\n return {};\n }\n }\n });\n}\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { spec: OpenApiObject; loc: number }[] => {\n const openAPIRegex = /^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \\/.*$/;\n\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments\n .filter((comment) => openAPIRegex.test(comment.description.trim()))\n .map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n fixSecurityObject(result);\n\n const [method, path]: string[] = comment.description.split(\" \");\n\n const pathsObject: PathsObject = {\n [(path as string).trim()]: {\n [(method as string).toLowerCase().trim()]: {\n ...result,\n },\n },\n };\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify({ paths: pathsObject }));\n\n return {\n spec,\n loc,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","const customizer = (objectValue: any, sourceValue: any) => {\n if (Array.isArray(objectValue)) {\n return [...objectValue, ...sourceValue];\n }\n // eslint-disable-next-line unicorn/no-useless-undefined\n return undefined;\n};\n\nexport default customizer;\n","import type { Spec } from \"comment-parser\";\nimport { parse as parseComments } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\nimport yaml, { YAMLError } from \"yaml\";\n\nimport { OpenApiObject } from \"../exported\";\nimport customizer from \"../util/customizer\";\nimport organizeSwaggerObject from \"./organize-swagger-object\";\nimport { getSwaggerVersionFromSpec, hasEmptyProperty } from \"./utils\";\n\nconst specificationTemplate = {\n v2: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\"],\n v3: [\"paths\", \"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\"],\n v4: [\"components\", \"channels\"],\n};\n\ntype ExtendedYAMLError = YAMLError & { annotation?: string };\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst tagsToObjects = (specs: Spec[], verbose?: boolean) => specs.map((spec: Spec) => {\n if ((spec.tag === \"openapi\" || spec.tag === \"swagger\" || spec.tag === \"asyncapi\") && spec.description !== \"\") {\n const parsed = yaml.parseDocument(spec.description);\n\n if (parsed.errors && parsed.errors.length > 0) {\n parsed.errors.map<ExtendedYAMLError>((error) => {\n const newError: ExtendedYAMLError = error;\n\n newError.annotation = spec.description;\n\n return newError;\n });\n\n let errorString = \"Error parsing YAML in @openapi spec:\";\n\n errorString += verbose\n ? (parsed.errors as ExtendedYAMLError[])\n .map((error) => `${error.toString()}\\nImbedded within:\\n\\`\\`\\`\\n ${error?.annotation?.replace(/\\n/g, \"\\n \")}\\n\\`\\`\\``)\n .join(\"\\n\")\n : parsed.errors.map((error) => error.toString()).join(\"\\n\");\n\n throw new Error(errorString);\n }\n\n const parsedDocument = parsed.toJSON();\n const specification: Record<string, any> = {\n tags: [],\n };\n\n specificationTemplate[getSwaggerVersionFromSpec(spec)].forEach((property) => {\n specification[property] = specification[property] || {};\n });\n\n Object.keys(parsedDocument).forEach((property) => {\n organizeSwaggerObject(specification, parsedDocument, property);\n });\n\n return specification;\n }\n\n return {};\n});\n\nconst commentsToOpenApi = (fileContents: string, verbose?: boolean): { spec: OpenApiObject; loc: number }[] => {\n const jsDocumentComments = parseComments(fileContents, { spacing: \"preserve\" });\n\n return jsDocumentComments.map((comment) => {\n // Line count, number of tags + 1 for description.\n // - Don't count line-breaking due to long descriptions\n // - Don't count empty lines\n const loc = comment.tags.length + 1;\n const result = mergeWith({}, ...tagsToObjects(comment.tags, verbose), customizer);\n\n [\"definitions\", \"responses\", \"parameters\", \"securityDefinitions\", \"components\", \"tags\"].forEach((property) => {\n if (result[property] !== undefined && hasEmptyProperty(result[property])) {\n delete result[property];\n }\n });\n\n // Purge all undefined objects/arrays.\n const spec = JSON.parse(JSON.stringify(result));\n\n return {\n spec,\n loc,\n };\n });\n};\n\nexport default commentsToOpenApi;\n","import type { Spec } from \"comment-parser\";\nimport mergeWith from \"lodash.mergewith\";\n\n/**\n * A recursive deep-merge that ignores null values when merging.\n * This returns the merged object and does not mutate.\n * @param {object} first the first object to get merged\n * @param {object} second the second object to get merged\n */\nexport const mergeDeep = (first?: object, second?: object) => mergeWith({}, first, second, (a, b) => (b === null ? a : undefined));\n\n/**\n * Checks if there is any properties of the input object which are an empty object\n * @param {object} object - the object to check\n * @returns {boolean}\n */\nexport const hasEmptyProperty = (object: Record<string, any>): boolean => Object.keys(object)\n .map((key) => object[key])\n .every((keyObject) => typeof keyObject === \"object\" && Object.keys(keyObject).every((key) => !(key in keyObject)));\n\n/**\n * @param {object} tag\n * @param {array} tags\n * @returns {boolean}\n */\nexport const isTagPresentInTags = (tag: Spec, tags: Spec[]) => tags.some((targetTag) => tag.name === targetTag.name);\n\nexport const getSwaggerVersionFromSpec = (tag: Spec) => {\n switch (tag.tag) {\n case \"openapi\": {\n return \"v3\";\n }\n case \"asyncapi\": {\n return \"v4\";\n }\n case \"swagger\": {\n return \"v2\";\n }\n default: {\n return \"v2\";\n }\n }\n};\n","import { isTagPresentInTags, mergeDeep } from \"./utils\";\n\n/**\n * @param {object} swaggerObject\n * @param {object} annotation\n * @param {string} property\n */\n// eslint-disable-next-line radar/no-duplicate-string\nconst organizeSwaggerObject = (swaggerObject: Record<string, any>, annotation: Record<string, any>, property: string) => {\n // Root property on purpose.\n // eslint-disable-next-line no-secrets/no-secrets\n // @see https://github.com/OAI/OpenAPI-Specification/blob/master/proposals/002_Webhooks.md#proposed-solution\n if (property === \"x-webhooks\") {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property] = annotation[property];\n }\n\n // Other extensions can be in varying places depending on different vendors and opinions.\n // The following return makes it so that they are not put in `paths` in the last case.\n // New specific extensions will need to be handled on case-by-case if to be included in `paths`.\n if (property.startsWith(\"x-\")) {\n return;\n }\n\n const commonProperties = [\n \"components\",\n \"consumes\",\n \"produces\",\n \"paths\",\n \"schemas\",\n \"securityDefinitions\",\n \"responses\",\n \"parameters\",\n \"definitions\",\n \"channels\",\n ];\n if (commonProperties.includes(property)) {\n Object.keys(annotation[property]).forEach((definition) => {\n // eslint-disable-next-line no-param-reassign\n swaggerObject[property][definition] = mergeDeep(swaggerObject[property][definition], annotation[property][definition]);\n });\n } else if (property === \"tags\") {\n const { tags } = annotation;\n\n if (Array.isArray(tags)) {\n tags.forEach((tag) => {\n if (!isTagPresentInTags(tag, swaggerObject.tags)) {\n swaggerObject.tags.push(tag);\n }\n });\n } else if (!isTagPresentInTags(tags, swaggerObject.tags)) {\n swaggerObject.tags.push(tags);\n }\n } else if (property === \"security\") {\n const { security } = annotation;\n\n // eslint-disable-next-line no-param-reassign\n swaggerObject.security = security;\n } else if (property.startsWith(\"/\")) {\n // Paths which are not defined as \"paths\" property, starting with a slash \"/\"\n // eslint-disable-next-line no-param-reassign\n swaggerObject.paths[property] = mergeDeep(swaggerObject.paths[property], annotation[property]);\n }\n};\n\nexport default organizeSwaggerObject;\n"],"mappings":"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","names":["commentsToOpenApi","fs","path","parseComments","mergeWith","yaml","mergeWith","tagsToObjects","yaml","commentsToOpenApi","parseComments","mergeWith","comments_to_open_api_default","comments_to_open_api_default","fs"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@visulima/jsdoc-open-api",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "Generates swagger doc based on JSDoc.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"visulima",
|
|
@@ -53,8 +53,8 @@
|
|
|
53
53
|
"jsdoc-open-api": "./bin/index.js"
|
|
54
54
|
},
|
|
55
55
|
"files": [
|
|
56
|
-
"
|
|
57
|
-
"dist",
|
|
56
|
+
"bin/**",
|
|
57
|
+
"dist/**",
|
|
58
58
|
"README.md",
|
|
59
59
|
"CHANGELOG.md",
|
|
60
60
|
"LICENSE.md"
|
|
@@ -65,13 +65,13 @@
|
|
|
65
65
|
"clean": "rimraf node_modules dist",
|
|
66
66
|
"coverage": "vitest run --coverage",
|
|
67
67
|
"dev": "pnpm predev && pnpm run build --watch",
|
|
68
|
-
"lint:eslint": "cross-env NO_LOGS=true eslint --ext js,jsx,ts,tsx --max-warnings=0 --config .eslintrc.cjs --cache --cache-strategy content .",
|
|
68
|
+
"lint:eslint": "cross-env NO_LOGS=true eslint . --ext js,jsx,ts,tsx --max-warnings=0 --config .eslintrc.cjs --cache --cache-strategy content .",
|
|
69
69
|
"lint:eslint:fix": "pnpm run lint:eslint --fix",
|
|
70
70
|
"test": "vitest"
|
|
71
71
|
},
|
|
72
72
|
"dependencies": {
|
|
73
73
|
"@apidevtools/swagger-parser": "^10.1.0",
|
|
74
|
-
"@visulima/readdir": "1.
|
|
74
|
+
"@visulima/readdir": "1.3.1",
|
|
75
75
|
"cli-progress": "^3.11.2",
|
|
76
76
|
"commander": "^9.4.1",
|
|
77
77
|
"comment-parser": "^1.3.1",
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
"eslint-plugin-simple-import-sort": "^8.0.0",
|
|
111
111
|
"eslint-plugin-sort-keys-fix": "^1.1.2",
|
|
112
112
|
"eslint-plugin-testing-library": "^5.7.2",
|
|
113
|
-
"eslint-plugin-unicorn": "^
|
|
113
|
+
"eslint-plugin-unicorn": "^45.0.0",
|
|
114
114
|
"eslint-plugin-you-dont-need-lodash-underscore": "^6.12.0",
|
|
115
115
|
"eslint-plugin-you-dont-need-momentjs": "^1.6.0",
|
|
116
116
|
"openapi-types": "^12.0.2",
|
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
"semantic-release": "^19.0.5",
|
|
121
121
|
"tsup": "^6.2.3",
|
|
122
122
|
"typescript": "^4.8.4",
|
|
123
|
-
"vitest": "^0.
|
|
123
|
+
"vitest": "^0.25.0",
|
|
124
124
|
"webpack": "^5.74.0"
|
|
125
125
|
},
|
|
126
126
|
"optionalDependencies": {
|