@visulima/jsdoc-open-api 1.3.12 → 2.0.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visulima/jsdoc-open-api",
3
- "version": "1.3.12",
3
+ "version": "2.0.1",
4
4
  "description": "Generates swagger doc based on JSDoc.",
5
5
  "keywords": [
6
6
  "visulima",
@@ -42,18 +42,36 @@
42
42
  "exports": {
43
43
  ".": {
44
44
  "types": "./dist/index.d.ts",
45
- "require": "./dist/index.js",
46
- "import": "./dist/index.mjs"
45
+ "require": {
46
+ "types": "./dist/index.d.ts",
47
+ "default": "./dist/index.js"
48
+ },
49
+ "import": {
50
+ "types": "./dist/index.d.mts",
51
+ "default": "./dist/index.mjs"
52
+ }
47
53
  },
48
54
  "./cli": {
49
55
  "types": "./dist/cli/index.d.ts",
50
- "require": "./dist/cli/index.js",
51
- "import": "./dist/cli/index.mjs"
56
+ "require": {
57
+ "types": "./dist/cli/index.d.ts",
58
+ "default": "./dist/cli/index.js"
59
+ },
60
+ "import": {
61
+ "types": "./dist/cli/index.d.mts",
62
+ "default": "./dist/cli/index.mjs"
63
+ }
52
64
  },
53
65
  "./cli/commander": {
54
66
  "types": "./dist/cli/commander/index.d.ts",
55
- "require": "./dist/cli/commander/index.js",
56
- "import": "./dist/cli/commander/index.mjs"
67
+ "require": {
68
+ "types": "./dist/cli/commander/index.d.ts",
69
+ "default": "./dist/cli/commander/index.js"
70
+ },
71
+ "import": {
72
+ "types": "./dist/cli/commander/index.d.mts",
73
+ "default": "./dist/cli/commander/index.mjs"
74
+ }
57
75
  },
58
76
  "./package.json": "./package.json"
59
77
  },
@@ -77,7 +95,7 @@
77
95
  "clean": "rimraf node_modules dist .eslintcache",
78
96
  "coverage": "vitest run --coverage",
79
97
  "dev": "pnpm run build --watch",
80
- "lint:eslint": "eslint . --ext js,jsx,ts,tsx --max-warnings=0 --config .eslintrc.js --cache --cache-strategy content .",
98
+ "lint:eslint": "eslint . --ext js,cjs,mjs,jsx,ts,tsx,json,yaml,yml,md,mdx --max-warnings=0 --config .eslintrc.js",
81
99
  "lint:eslint:fix": "pnpm run lint:eslint --fix",
82
100
  "lint:prettier": "prettier --config=.prettierrc.js --check .",
83
101
  "lint:prettier:fix": "prettier --config=.prettierrc.js --write .",
@@ -87,39 +105,40 @@
87
105
  },
88
106
  "dependencies": {
89
107
  "@apidevtools/swagger-parser": "^10.1.0",
90
- "@visulima/readdir": "1.3.8",
91
- "comment-parser": "^1.3.1",
108
+ "@visulima/readdir": "2.0.1",
109
+ "comment-parser": "^1.4.0",
92
110
  "lodash.mergewith": "^4.6.2",
93
111
  "read-pkg-up": "^7.0.1",
94
112
  "yaml": "^2.3.1"
95
113
  },
96
114
  "devDependencies": {
97
- "@anolilab/eslint-config": "^11.0.2",
98
- "@anolilab/prettier-config": "^5.0.1",
99
- "@anolilab/semantic-release-preset": "^6.0.2",
115
+ "@anolilab/eslint-config": "^11.3.3",
116
+ "@anolilab/prettier-config": "^5.0.3",
117
+ "@anolilab/semantic-release-preset": "^6.0.4",
100
118
  "@rushstack/eslint-plugin-security": "^0.6.0",
101
- "@stoplight/types": "^13.17.0",
102
119
  "@types/cli-progress": "^3.11.0",
103
120
  "@types/http-errors": "^2.0.1",
104
121
  "@types/lodash.mergewith": "^4.6.7",
105
- "@types/node": "18.16.18",
106
- "@types/webpack": "^5.28.1",
107
- "@vitest/coverage-v8": "^0.33.0",
122
+ "@types/node": "18.17.1",
123
+ "@types/webpack": "^5.28.2",
124
+ "@vitest/coverage-v8": "^0.34.3",
108
125
  "c8": "^8.0.1",
109
126
  "cli-progress": "^3.12.0",
110
127
  "commander": "^11.0.0",
111
128
  "cross-env": "^7.0.3",
112
- "eslint": "^8.46.0",
129
+ "eslint": "^8.48.0",
113
130
  "eslint-plugin-etc": "^2.0.3",
114
- "eslint-plugin-mdx": "^2.1.0",
131
+ "eslint-plugin-mdx": "^2.2.0",
115
132
  "eslint-plugin-vitest": "^0.2.8",
133
+ "eslint-plugin-vitest-globals": "^1.4.0",
116
134
  "openapi-types": "^12.1.3",
117
- "prettier": "^3.0.0",
135
+ "prettier": "^3.0.2",
118
136
  "rimraf": "^5.0.1",
119
- "semantic-release": "^21.0.7",
120
- "tsup": "^7.1.0",
121
- "typescript": "^5.1.6",
122
- "vitest": "^0.33.0",
137
+ "semantic-release": "^21.1.1",
138
+ "sort-package-json": "^2.5.1",
139
+ "tsup": "^7.2.0",
140
+ "typescript": "^5.2.2",
141
+ "vitest": "^0.34.3",
123
142
  "webpack": "^5.88.2"
124
143
  },
125
144
  "optionalDependencies": {
@@ -128,7 +147,7 @@
128
147
  "webpack": "^5.88.2"
129
148
  },
130
149
  "engines": {
131
- "node": ">=16.18.0 <=20.*"
150
+ "node": ">=18.* <=20.*"
132
151
  },
133
152
  "publishConfig": {
134
153
  "access": "public",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/command/generate-command.ts","../src/cli/command/init-command.ts"],"names":["collect","cliProgress","lstatSync","mkdirSync","writeFileSync","dirname","normalize","pathToFileURL","generateCommand","configName","paths","options","openapiConfig","config","multibar","spec","spec_builder_default","dir","files","bar","file","parsedJsDocumentFile","parse_file_default","comments_to_open_api_default","item","parsedSwaggerJsDocumentFile","validate_default","output","generate_command_default","existsSync","realpathSync","readPkgUp","initCommand","packageJsonPath","foundPackageJson","exportTemplate","package_","packagePath","init_command_default"],"mappings":"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","sourcesContent":["import { collect } from \"@visulima/readdir\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport cliProgress from \"cli-progress\";\nimport { lstatSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, normalize } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type { BaseDefinition } from \"../../exported.d\";\nimport jsDocumentCommentsToOpenApi from \"../../jsdoc/comments-to-open-api\";\nimport parseFile from \"../../parse-file\";\nimport SpecBuilder from \"../../spec-builder\";\nimport swaggerJsDocumentCommentsToOpenApi from \"../../swagger-jsdoc/comments-to-open-api\";\nimport validate from \"../../validate\";\n\nconst generateCommand = async (\n configName: string,\n paths: string[],\n options: {\n config?: string;\n output?: string;\n verbose?: boolean;\n veryVerbose?: boolean;\n },\n // eslint-disable-next-line sonarjs/cognitive-complexity\n): Promise<void> => {\n let openapiConfig: {\n exclude: string[];\n extensions?: string[];\n followSymlinks?: boolean;\n include?: ReadonlyArray<string> | string;\n swaggerDefinition: BaseDefinition;\n } = {\n exclude: [],\n swaggerDefinition: {} as BaseDefinition,\n };\n\n try {\n let config = await import(pathToFileURL(normalize(options.config ?? configName)).href);\n\n if (config?.default) {\n config = config.default;\n }\n\n openapiConfig = config;\n } catch {\n throw new Error(`No config file found, on: ${options.config ?? \".openapirc.js\"}\\n`);\n }\n\n const multibar = new cliProgress.MultiBar(\n {\n clearOnComplete: false,\n format: \"{value}/{total} | {bar} | {filename}\",\n hideCursor: true,\n },\n cliProgress.Presets.shades_grey,\n );\n const spec = new SpecBuilder(openapiConfig.swaggerDefinition);\n\n // eslint-disable-next-line no-restricted-syntax,unicorn/prevent-abbreviations\n for await (const dir of paths) {\n // Check if the path is a directory\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n lstatSync(dir).isDirectory();\n\n const files = await collect(dir, {\n extensions: openapiConfig.extensions ?? [\".js\", \".cjs\", \".mjs\", \".ts\", \".tsx\", \".jsx\", \".yaml\", \".yml\"],\n followSymlinks: openapiConfig.followSymlinks ?? false,\n match: openapiConfig.include,\n minimatchOptions: {\n match: {\n debug: options.verbose,\n matchBase: true,\n },\n skip: {\n debug: options.verbose,\n matchBase: true,\n },\n },\n skip: [...openapiConfig.exclude, \"node_modules/**\"],\n });\n\n if (options.verbose ?? options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(`\\nFound ${files.length} files in ${dir}`);\n }\n\n if (options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(files);\n }\n\n const bar = multibar.create(files.length, 0);\n\n files.forEach((file) => {\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Parsing file ${file}`);\n }\n\n bar.increment(1, { filename: dir });\n\n const parsedJsDocumentFile = parseFile(file, jsDocumentCommentsToOpenApi, options.verbose);\n\n spec.addData(parsedJsDocumentFile.map((item) => item.spec));\n\n const parsedSwaggerJsDocumentFile = parseFile(file, swaggerJsDocumentCommentsToOpenApi, options.verbose);\n\n spec.addData(parsedSwaggerJsDocumentFile.map((item) => item.spec));\n });\n }\n\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(\"Validating swagger spec\");\n }\n\n if (options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(spec, null, 2));\n }\n\n await validate(JSON.parse(JSON.stringify(spec)) as Record<string, unknown>);\n\n const output = options.output ?? \"swagger.json\";\n\n multibar.stop();\n\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Written swagger spec to \"${output}\" file`);\n }\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n mkdirSync(dirname(output), { recursive: true });\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n writeFileSync(output, JSON.stringify(spec, null, 2));\n\n // eslint-disable-next-line no-console\n console.log(`\\nSwagger specification is ready, check the \"${output}\" file.`);\n};\n\nexport default generateCommand;\n","import { existsSync, realpathSync, writeFileSync } from \"node:fs\";\nimport readPkgUp from \"read-pkg-up\";\n\nconst initCommand = (configName: string, packageJsonPath = process.cwd()): void => {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n if (existsSync(configName)) {\n throw new Error(\"Config file already exists\");\n }\n\n const foundPackageJson = readPkgUp.sync({\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n cwd: realpathSync(packageJsonPath),\n });\n\n let exportTemplate = \"module.exports =\";\n\n if (foundPackageJson) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { packageJson: package_, path: packagePath } = foundPackageJson;\n\n // eslint-disable-next-line no-console\n console.info(`Found package.json at \"${packagePath}\"`);\n\n if (package_[\"type\"] === \"module\") {\n // eslint-disable-next-line no-console\n console.info(\"Found package.json with type: module, using ES6 as export for the config file\");\n\n exportTemplate = \"export default\";\n }\n } else {\n // eslint-disable-next-line no-console\n console.info(\"No package.json found\");\n }\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n writeFileSync(\n configName,\n `${exportTemplate} {\n exclude: [\n 'coverage/**',\n '.github/**',\n 'packages/*/test{,s}/**',\n '**/*.d.ts',\n 'test{,s}/**',\n 'test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}',\n '**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}',\n '**/__tests__/**',\n '**/{ava,babel,nyc}.config.{js,cjs,mjs}',\n '**/jest.config.{js,cjs,mjs,ts}',\n '**/{karma,rollup,webpack}.config.js',\n '**/.{eslint,mocha}rc.{js,cjs}',\n '**/.{travis,yarnrc}.yml',\n '**/{docker-compose,docker}.yml',\n '**/.yamllint.{yaml,yml}',\n '**/node_modules/**',\n '**/pnpm-lock.yaml',\n '**/pnpm-workspace.yaml',\n '**/{package,package-lock}.json',\n '**/yarn.lock',\n '**/package.json5',\n '**/.next/**',\n ],\n followSymlinks: false,\n swaggerDefinition: {\n openapi: '3.0.0',\n info: {\n title: 'API',\n version: '1.0.0',\n },\n },\n};\n`,\n );\n\n // eslint-disable-next-line no-console\n console.log(`Created \"${configName}\"`);\n};\n\nexport default initCommand;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/command/generate-command.ts","../src/cli/command/init-command.ts"],"names":["collect","cliProgress","lstatSync","mkdirSync","writeFileSync","dirname","normalize","pathToFileURL","generateCommand","configName","paths","options","openapiConfig","config","multibar","spec","spec_builder_default","dir","files","bar","file","parsedJsDocumentFile","parse_file_default","comments_to_open_api_default","item","parsedSwaggerJsDocumentFile","validate_default","output","generate_command_default","existsSync","realpathSync","readPkgUp","initCommand","packageJsonPath","foundPackageJson","exportTemplate","package_","packagePath","init_command_default"],"mappings":"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","sourcesContent":["import { collect } from \"@visulima/readdir\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport cliProgress from \"cli-progress\";\nimport { lstatSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, normalize } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type { BaseDefinition } from \"../../exported.d\";\nimport jsDocumentCommentsToOpenApi from \"../../jsdoc/comments-to-open-api\";\nimport parseFile from \"../../parse-file\";\nimport SpecBuilder from \"../../spec-builder\";\nimport swaggerJsDocumentCommentsToOpenApi from \"../../swagger-jsdoc/comments-to-open-api\";\nimport validate from \"../../validate\";\n\nconst generateCommand = async (\n configName: string,\n paths: string[],\n options: {\n config?: string;\n output?: string;\n verbose?: boolean;\n veryVerbose?: boolean;\n },\n // eslint-disable-next-line sonarjs/cognitive-complexity\n): Promise<void> => {\n let openapiConfig: {\n exclude: string[];\n extensions?: string[];\n followSymlinks?: boolean;\n include?: ReadonlyArray<string> | string;\n swaggerDefinition: BaseDefinition;\n } = {\n exclude: [],\n swaggerDefinition: {} as BaseDefinition,\n };\n\n try {\n let config = await import(pathToFileURL(normalize(options.config ?? configName)).href);\n\n if (config?.default) {\n config = config.default;\n }\n\n openapiConfig = config;\n } catch {\n throw new Error(`No config file found, on: ${options.config ?? \".openapirc.js\"}\\n`);\n }\n\n const multibar = new cliProgress.MultiBar(\n {\n clearOnComplete: false,\n format: \"{value}/{total} | {bar} | {filename}\",\n hideCursor: true,\n },\n cliProgress.Presets.shades_grey,\n );\n const spec = new SpecBuilder(openapiConfig.swaggerDefinition);\n\n // eslint-disable-next-line no-restricted-syntax,unicorn/prevent-abbreviations\n for await (const dir of paths) {\n // Check if the path is a directory\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n lstatSync(dir).isDirectory();\n\n const files = await collect(dir, {\n extensions: openapiConfig.extensions ?? [\".js\", \".cjs\", \".mjs\", \".ts\", \".tsx\", \".jsx\", \".yaml\", \".yml\"],\n followSymlinks: openapiConfig.followSymlinks ?? false,\n match: openapiConfig.include,\n minimatchOptions: {\n match: {\n debug: options.verbose,\n matchBase: true,\n },\n skip: {\n debug: options.verbose,\n matchBase: true,\n },\n },\n skip: [...openapiConfig.exclude, \"node_modules/**\"],\n });\n\n if (options.verbose ?? options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(`\\nFound ${files.length} files in ${dir}`);\n }\n\n if (options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(files);\n }\n\n const bar = multibar.create(files.length, 0);\n\n files.forEach((file) => {\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Parsing file ${file}`);\n }\n\n bar.increment(1, { filename: dir });\n\n const parsedJsDocumentFile = parseFile(file, jsDocumentCommentsToOpenApi, options.verbose);\n\n spec.addData(parsedJsDocumentFile.map((item) => item.spec));\n\n const parsedSwaggerJsDocumentFile = parseFile(file, swaggerJsDocumentCommentsToOpenApi, options.verbose);\n\n spec.addData(parsedSwaggerJsDocumentFile.map((item) => item.spec));\n });\n }\n\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(\"Validating swagger spec\");\n }\n\n if (options.veryVerbose) {\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(spec, null, 2));\n }\n\n await validate(JSON.parse(JSON.stringify(spec)) as Record<string, unknown>);\n\n const output = options.output ?? \"swagger.json\";\n\n multibar.stop();\n\n if (options.verbose) {\n // eslint-disable-next-line no-console\n console.log(`Written swagger spec to \"${output}\" file`);\n }\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n mkdirSync(dirname(output), { recursive: true });\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n writeFileSync(output, JSON.stringify(spec, null, 2));\n\n // eslint-disable-next-line no-console\n console.log(`\\nSwagger specification is ready, check the \"${output}\" file.`);\n};\n\nexport default generateCommand;\n","import { existsSync, realpathSync, writeFileSync } from \"node:fs\";\nimport readPkgUp from \"read-pkg-up\";\n\nconst initCommand = (configName: string, packageJsonPath = process.cwd()): void => {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n if (existsSync(configName)) {\n throw new Error(\"Config file already exists\");\n }\n\n const foundPackageJson = readPkgUp.sync({\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n cwd: realpathSync(packageJsonPath),\n });\n\n let exportTemplate = \"module.exports =\";\n\n if (foundPackageJson) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { packageJson: package_, path: packagePath } = foundPackageJson;\n\n // eslint-disable-next-line no-console\n console.info(`Found package.json at \"${packagePath}\"`);\n\n if (package_[\"type\"] === \"module\") {\n // eslint-disable-next-line no-console\n console.info(\"Found package.json with type: module, using ES6 as export for the config file\");\n\n exportTemplate = \"export default\";\n }\n } else {\n // eslint-disable-next-line no-console\n console.info(\"No package.json found\");\n }\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n writeFileSync(\n configName,\n `${exportTemplate} {\n exclude: [\n 'coverage/**',\n '.github/**',\n 'packages/*/test{,s}/**',\n '**/*.d.ts',\n 'test{,s}/**',\n 'test{,-*}.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}',\n '**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx,yaml,yml}',\n '**/__tests__/**',\n '**/{ava,babel,nyc}.config.{js,cjs,mjs}',\n '**/jest.config.{js,cjs,mjs,ts}',\n '**/{karma,rollup,webpack}.config.js',\n '**/.{eslint,mocha}rc.{js,cjs}',\n '**/.{travis,yarnrc}.yml',\n '**/{docker-compose,docker}.yml',\n '**/.yamllint.{yaml,yml}',\n '**/node_modules/**',\n '**/pnpm-lock.yaml',\n '**/pnpm-workspace.yaml',\n '**/{package,package-lock}.json',\n '**/yarn.lock',\n '**/package.json5',\n '**/.next/**',\n ],\n followSymlinks: false,\n swaggerDefinition: {\n openapi: '3.0.0',\n info: {\n title: 'API',\n version: '1.0.0',\n },\n },\n};\n`,\n );\n\n // eslint-disable-next-line no-console\n console.log(`Created \"${configName}\"`);\n};\n\nexport default initCommand;\n"]}
@@ -1,19 +0,0 @@
1
- import { parse } from 'comment-parser';
2
- import A from 'lodash.mergewith';
3
- import { readFileSync } from 'fs';
4
- import q from 'path';
5
- import R from 'yaml';
6
- import H from '@apidevtools/swagger-parser';
7
-
8
- var E=(t,s)=>{if(Array.isArray(t))return [...t,...s]},m=E;var v=t=>{t.security&&(t.security=Object.keys(t.security).map(s=>({[s]:t.security[s]})));},w=new Set(["integer","number","string","boolean","object","array"]),y={binary:"string",byte:"string",date:"string","date-time":"string",double:"number",float:"number",int32:"integer",int64:"integer",password:"string"},k=t=>{let s=t.type,r=s.endsWith("[]"),e=s.replace(/\[]$/,""),a=w.has(e),n=Object.keys(y).includes(e),o;if(t.default)switch(e){case"integer":case"int32":case"int64":{o=Number.parseInt(t.default,10);break}case"number":case"double":case"float":{o=Number.parseFloat(t.default);break}default:{o=t.default;break}}let i;a?i={default:o,type:e}:n?i={default:o,format:e,type:y[e]}:i={$ref:`#/components/schemas/${e}`};let c=r?{items:{...i},type:"array"}:{...i};e===""&&(c=void 0);let p=t.description.trim().replace(/^- /,"");return p===""&&(p=void 0),{description:p,name:t.name,rawType:s,required:!t.optional,schema:c}},P=(t,s)=>t.map(r=>{let e=k(r),a="";switch(e.name&&(a+=e.name),e.description&&(a+=` ${e.description.trim()}`),r.tag){case"operationId":case"summary":case"description":return {[r.tag]:a};case"deprecated":return {deprecated:!0};case"externalDocs":return {externalDocs:{description:e.description,url:e.name}};case"server":return {servers:[{description:e.description,url:e.name}]};case"tag":return {tags:[a]};case"cookieParam":case"headerParam":case"queryParam":case"pathParam":return {parameters:[{description:e.description,in:r.tag.replace(/Param$/,""),name:e.name,required:e.required,schema:e.schema}]};case"bodyContent":return {requestBody:{content:{[e.name.replace("*\\/*","*/*")]:{schema:e.schema}}}};case"bodyExample":{let[n,o]=e.name.split(".");return {requestBody:{content:{[n]:{examples:{[o]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}case"bodyDescription":return {requestBody:{description:a}};case"bodyRequired":return {requestBody:{required:!0}};case"response":return {responses:{[e.name]:{description:e.description}}};case"callback":return {callbacks:{[e.name]:{$ref:`#/components/callbacks/${e.rawType}`}}};case"responseContent":{let[n,o]=e.name.split(".");return {responses:{[n]:{content:{[o]:{schema:e.schema}}}}}}case"responseHeaderComponent":{let[n,o]=e.name.split(".");return {responses:{[n]:{headers:{[o]:{$ref:`#/components/headers/${e.rawType}`}}}}}}case"responseHeader":{let[n,o]=e.name.split(".");return {responses:{[n]:{headers:{[o]:{description:e.description,schema:e.schema}}}}}}case"responseExample":{let[n,o,i]=e.name.split(".");return {responses:{[n]:{content:{[o]:{examples:{[i]:{$ref:`#/components/examples/${e.rawType}`}}}}}}}}case"responseLink":{let[n,o]=e.name.split(".");return {responses:{[n]:{links:{[o]:{$ref:`#/components/links/${e.rawType}`}}}}}}case"bodyComponent":return {requestBody:{$ref:`#/components/requestBodies/${e.rawType}`}};case"responseComponent":return {responses:{[e.name]:{$ref:`#/components/responses/${e.rawType}`}}};case"paramComponent":return {parameters:[{$ref:`#/components/parameters/${e.rawType}`}]};case"security":{let[n,o]=e.name.split("."),i=[];return o&&(i=[o]),{security:{[n]:i}}}default:return {}}}),$=(t,s)=>{let r=/^(GET|PUT|POST|DELETE|OPTIONS|HEAD|PATCH|TRACE) \/.*$/;return parse(t,{spacing:"preserve"}).filter(a=>r.test(a.description.trim())).map(a=>{let n=a.tags.length+1,o=A({},...P(a.tags),m);v(o);let[i,c]=a.description.split(" "),p={[c.trim()]:{[i.toLowerCase().trim()]:{...o}}},T=JSON.parse(JSON.stringify({paths:p}));return {loc:n,spec:T}})},Q=$;var D=t=>t.split(/\r\n|\r|\n/).filter(e=>/^\s*(#\s*(?:\S.*)?)?$/.test(e)?!1:e.trim().length>0).length,g=D;var b=new Set(["openapi","info","servers","security","tags","externalDocs","components","paths"]),u=class extends Error{},L=(t,s,r)=>{let e=readFileSync(t,{encoding:"utf8"}),a=q.extname(t);if(a===".yaml"||a===".yml"){let n=R.parse(e),o=Object.keys(n).filter(i=>!b.has(i));if(o.length>0){let i=new u(`Unexpected keys: ${o.join(", ")}`);throw i.filePath=t,i}return Object.keys(n).some(i=>b.has(i))?[{loc:g(e),spec:n}]:[]}try{return s(e,r)}catch(n){throw n.filePath=t,n}},ne=L;var I=(t,s)=>{Object.keys(s).forEach(r=>{t[r]===void 0?t[r]={...s[r]}:Object.keys(s[r]).forEach(e=>{t[r][e]={...t[r][e],...s[r][e]};});});},h=I;var d=class{constructor(s){this.openapi=s.openapi,this.info=s.info,this.servers=s.servers,this.paths=s.paths??{},this.components=s.components,this.security=s.security,this.tags=s.tags,this.externalDocs=s.externalDocs;}addData(s){s.forEach(r=>{let{components:e,paths:a,...n}=r;h(this,{components:e??{},paths:a??{}}),Object.entries(n).forEach(([o,i])=>{this[o]=i;});});}},ce=d;var l=(t,s)=>A({},t,s,(r,e)=>e===null?r:void 0),O=t=>Object.keys(t).map(s=>t[s]).every(s=>typeof s=="object"&&Object.keys(s).every(r=>!(r in s))),f=(t,s)=>s.some(r=>t.name===r.name),j=t=>{switch(t.tag){case"openapi":return "v3";case"asyncapi":return "v4";case"swagger":return "v2";default:return "v2"}};var N=(t,s,r)=>{if(r==="x-webhooks"&&(t[r]=s[r]),r.startsWith("x-"))return;if(["components","consumes","produces","paths","schemas","securityDefinitions","responses","parameters","definitions","channels"].includes(r))Object.keys(s[r]).forEach(a=>{t[r][a]=l(t[r][a],s[r][a]);});else if(r==="tags"){let{tags:a}=s;Array.isArray(a)?a.forEach(n=>{f(n,t.tags)||t.tags.push(n);}):f(a,t.tags)||t.tags.push(a);}else if(r==="security"){let{security:a}=s;t.security=a;}else r.startsWith("/")&&(t.paths[r]=l(t.paths[r],s[r]));},x=N;var F={v2:["paths","definitions","responses","parameters","securityDefinitions"],v3:["paths","definitions","responses","parameters","securityDefinitions","components"],v4:["components","channels"]},z=(t,s)=>t.map(r=>{if((r.tag==="openapi"||r.tag==="swagger"||r.tag==="asyncapi")&&r.description!==""){let e=R.parseDocument(r.description);if(e.errors.length>0){e.errors.map(i=>{let c=i;return c.annotation=r.description,c});let o="Error parsing YAML in @openapi spec:";throw o+=s?e.errors.map(i=>`${i.toString()}
9
- Imbedded within:
10
- \`\`\`
11
- ${i.annotation?.replace(/\n/g,`
12
- `)}
13
- \`\`\``).join(`
14
- `):e.errors.map(i=>i.toString()).join(`
15
- `),new Error(o)}let a=e.toJSON(),n={tags:[]};return F[j(r)].forEach(o=>{n[o]=n[o]||{};}),Object.keys(a).forEach(o=>{x(n,a,o);}),n}return {}}),J=(t,s)=>parse(t,{spacing:"preserve"}).map(e=>{let a=e.tags.length+1,n=A({},...z(e.tags,s),m);["definitions","responses","parameters","securityDefinitions","components","tags"].forEach(i=>{n[i]!==void 0&&O(n[i])&&delete n[i];});let o=JSON.parse(JSON.stringify(n));return {loc:a,spec:o}}),je=J;var U=async t=>{await H.validate(t);},Ee=U;
16
-
17
- export { Q as a, g as b, ne as c, ce as d, je as e, Ee as f };
18
- //# sourceMappingURL=out.js.map
19
- //# sourceMappingURL=chunk-WHYPHVY6.mjs.map