@omer-x/next-openapi-json-generator 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import type { OperationObject } from "@omer-x/openapi-types/operation";
2
2
  export declare function findAppFolderPath(): Promise<string | null>;
3
3
  export declare function getRouteExports(routePath: string, schemas: Record<string, unknown>): Promise<Record<string, {
4
- apiData?: OperationObject | undefined;
4
+ apiData?: OperationObject;
5
5
  } | undefined>>;
@@ -0,0 +1,3 @@
1
+ import type { SchemaObject } from "@omer-x/openapi-types/schema";
2
+ import type { ZodType } from "zod";
3
+ export default function convertToOpenAPI(schema: ZodType<unknown>, isArray: boolean): SchemaObject;
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- (()=>{"use strict";var __webpack_modules__={489:function(e,t,r){var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getDirectoryItems=t.directoryExists=void 0;const n=r(896),s=o(r(943)),a=o(r(760));t.directoryExists=async function(e){try{return await s.default.access(e,n.constants.F_OK),!0}catch(e){return!1}},t.getDirectoryItems=async function e(t,r){const o=[],n=await s.default.readdir(t);for(const u of n){const n=a.default.resolve(t,u);if((await s.default.stat(n)).isDirectory()){const t=await e(n,r);o.push(...t)}else u===r&&o.push(n)}return o}},580:function(e,t,r){var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const n=o(r(106));function s(e,t){if(typeof e!=typeof t)return!1;switch(typeof e){case"object":return null===e?e===t:!!t&&(Array.isArray(e)?!!Array.isArray(t)&&e.every(((e,r)=>s(e,t[r]))):Object.entries(e).every((([e,r])=>s(r,t[e]))));case"function":case"symbol":return!1;default:return e===t}}t.default=function e(t,r,o){if(o)for(const[e,o]of Object.entries(r))if(s(t,(0,n.default)(o)))return{$ref:`#/components/schemas/${e}`};if("$ref"in t)return t;if(t.oneOf)return{...t,oneOf:t.oneOf.map((t=>e(t,r,!0)))};if(t.anyOf)return{...t,anyOf:t.anyOf.map((t=>e(t,r,!0)))};switch(t.type){case"object":return{...t,properties:Object.entries(t.properties).reduce(((t,[o,n])=>({...t,[o]:e(n,r,!0)})),{})};case"array":return Array.isArray(t.items)?{...t,items:t.items.map((t=>e(t,r,!0)))}:{...t,items:e(t.items,r,!0)}}return t}},37:function(__unused_webpack_module,exports,__webpack_require__){var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.getRouteExports=exports.findAppFolderPath=void 0;const promises_1=__importDefault(__webpack_require__(455)),node_path_1=__importDefault(__webpack_require__(760)),dir_1=__webpack_require__(489),transpile_1=__webpack_require__(380);async function findAppFolderPath(){const e=node_path_1.default.resolve(process.cwd(),"src","app");if(await(0,dir_1.directoryExists)(e))return e;const t=node_path_1.default.resolve(process.cwd(),"app");return await(0,dir_1.directoryExists)(t)?t:null}function injectSchemas(e,t){return e.replace(new RegExp(`\\b${t}\\.`,"g"),`global.schemas[${t}].`).replace(new RegExp(`\\b${t}\\b`,"g"),`"${t}"`)}async function getRouteExports(routePath,schemas){const content=await promises_1.default.readFile(routePath,"utf-8"),code=(0,transpile_1.transpile)(content),fixedCode=Object.keys(schemas).reduce(injectSchemas,code);global.schemas=schemas;const result=eval(fixedCode);return delete global.schemas,result}exports.findAppFolderPath=findAppFolderPath,exports.getRouteExports=getRouteExports},976:function(e,t,r){var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const n=o(r(580));function s(e,t){return t?(0,n.default)(t,e,!0):t}function a(e,t){return t?Object.entries(t).reduce(((t,[r,o])=>({...t,[r]:{...o,schema:s(e,o.schema)}})),{}):t}function u(e,t){return!t||"$ref"in t?t:{...t,content:a(e,t.content)}}function i(e,t){return"$ref"in t?t:{...t,content:a(e,t.content)}}function c(e,t){return t?Object.entries(t).reduce(((t,[r,o])=>({...t,[r]:i(e,o)})),{}):t}t.default=function(e,t){return{...e,parameters:e.parameters?.map((e=>function(e,t){return"$ref"in e?e:{...e,schema:s(t,e.schema)}}(e,t))),requestBody:u(t,e.requestBody),responses:c(t,e.responses)}}},683:function(e,t,r){var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.bundlePaths=t.createRouteRecord=void 0;const n=o(r(976));function s(e,t){return e.replace(t,"").replace("[","{").replace("]","}").replace("/route.ts","")}t.createRouteRecord=function(e,t,r,o){return{method:e.toLocaleLowerCase(),path:s(t,r),apiData:o}},t.bundlePaths=function(e,t){return e.sort(((e,t)=>e.path.localeCompare(t.path))),e.reduce(((e,r)=>({...e,[r.path]:{...e[r.path],[r.method]:(0,n.default)(r.apiData,t)}})),{})}},363:function(e,t,r){var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.bundleSchemas=void 0;const n=o(r(106)),s=o(r(580));t.bundleSchemas=function(e){const t=Object.keys(e).reduce(((t,r)=>({...t,[r]:(0,n.default)(e[r],{target:"openApi3"})})),{});return Object.entries(t).reduce(((t,[r,o])=>({...t,[r]:(0,s.default)(o,e,!1)})),{})}},380:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.transpile=void 0;const o=r(899);t.transpile=function(e){const t=["import createRoute from '@omer-x/next-openapi-route-handler'","import z from 'zod';",function(e){const t=["GET","POST","PUT","PATCH","DELETE"];return`${t.map((e=>`exports.${e} = void 0;\n`))}\n${e}\nmodule.exports = { ${t.map((e=>`${e}: exports.${e}`)).join(", ")} }`}(function(e){return e.replace(/^import\s.+\sfrom\s.+;$/gm,"").trim()}(e))];return(0,o.transpile)(t.join("\n"))}},156:function(e,t,r){var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const n=o(r(213)),s=r(489),a=r(37),u=r(683),i=r(363);t.default=async function(e){const t=await(0,a.findAppFolderPath)();if(!t)throw new Error("This is not a Next.js application!");const r=await(0,s.getDirectoryItems)(t,"route.ts"),o=[];for(const n of r){const r=await(0,a.getRouteExports)(n,e);for(const[e,s]of Object.entries(r))s&&s.apiData&&o.push((0,u.createRouteRecord)(e.toLocaleLowerCase(),n,t,s.apiData))}const c=(0,n.default)();return{openapi:"3.1.0",info:{title:c.serviceName,version:c.version},paths:(0,u.bundlePaths)(o,e),components:{schemas:(0,i.bundleSchemas)(e)},tags:[]}}},213:e=>{e.exports=require("@omer-x/package-metadata")},899:e=>{e.exports=require("typescript")},106:e=>{e.exports=require("zod-to-json-schema")},896:e=>{e.exports=require("fs")},943:e=>{e.exports=require("fs/promises")},455:e=>{e.exports=require("node:fs/promises")},760:e=>{e.exports=require("node:path")}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var r=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e].call(r.exports,r,r.exports,__webpack_require__),r.exports}var __webpack_exports__=__webpack_require__(156);module.exports=__webpack_exports__})();
1
+ (()=>{"use strict";var __webpack_modules__={489:function(e,t,r){var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.directoryExists=async function(e){try{return await a.default.access(e,n.constants.F_OK),!0}catch(e){return!1}},t.getDirectoryItems=async function e(t,r){const o=[],n=await a.default.readdir(t);for(const u of n){const n=s.default.resolve(t,u);if((await a.default.stat(n)).isDirectory()){const t=await e(n,r);o.push(...t)}else u===r&&o.push(n)}return o};const n=r(896),a=o(r(943)),s=o(r(760))},580:function(e,t,r){var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.default=function e(t,r,o){if(o)for(const[e,o]of Object.entries(r))if(a(t,(0,n.default)(o,!1)))return{$ref:`#/components/schemas/${e}`};if("$ref"in t)return t;if(t.oneOf)return{...t,oneOf:t.oneOf.map((t=>e(t,r,!0)))};if(t.anyOf)return{...t,anyOf:t.anyOf.map((t=>e(t,r,!0)))};switch(t.type){case"object":return{...t,properties:Object.entries(t.properties).reduce(((t,[o,n])=>({...t,[o]:e(n,r,!0)})),{})};case"array":return Array.isArray(t.items)?{...t,items:t.items.map((t=>e(t,r,!0)))}:{...t,items:e(t.items,r,!0)}}return t};const n=o(r(292));function a(e,t){if(typeof e!=typeof t)return!1;switch(typeof e){case"object":return null===e?e===t:!!t&&(Array.isArray(e)?!!Array.isArray(t)&&e.every(((e,r)=>a(e,t[r]))):Object.entries(e).every((([e,r])=>a(r,t[e]))));case"function":case"symbol":return!1;default:return e===t}}},37:function(__unused_webpack_module,exports,__webpack_require__){var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.findAppFolderPath=findAppFolderPath,exports.getRouteExports=getRouteExports;const promises_1=__importDefault(__webpack_require__(455)),node_path_1=__importDefault(__webpack_require__(760)),dir_1=__webpack_require__(489),transpile_1=__webpack_require__(380);async function findAppFolderPath(){const e=node_path_1.default.resolve(process.cwd(),"src","app");if(await(0,dir_1.directoryExists)(e))return e;const t=node_path_1.default.resolve(process.cwd(),"app");return await(0,dir_1.directoryExists)(t)?t:null}function injectSchemas(e,t){return e.replace(new RegExp(`\\b${t}\\.`,"g"),`global.schemas[${t}].`).replace(new RegExp(`\\b${t}\\b`,"g"),`"${t}"`)}async function getRouteExports(routePath,schemas){const content=await promises_1.default.readFile(routePath,"utf-8"),code=(0,transpile_1.transpile)(content),fixedCode=Object.keys(schemas).reduce(injectSchemas,code);global.schemas=schemas;const result=eval(fixedCode);return delete global.schemas,result}},976:function(e,t,r){var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){return{...e,parameters:e.parameters?.map((e=>function(e,t){return"$ref"in e?e:{...e,schema:a(t,e.schema)}}(e,t))),requestBody:u(t,e.requestBody),responses:i(t,e.responses)}};const n=o(r(580));function a(e,t){return t?(0,n.default)(t,e,!0):t}function s(e,t){return t?Object.entries(t).reduce(((t,[r,o])=>({...t,[r]:{...o,schema:a(e,o.schema)}})),{}):t}function u(e,t){return!t||"$ref"in t?t:{...t,content:s(e,t.content)}}function c(e,t){return"$ref"in t?t:{...t,content:s(e,t.content)}}function i(e,t){return t?Object.entries(t).reduce(((t,[r,o])=>({...t,[r]:c(e,o)})),{}):t}},683:function(e,t,r){var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.createRouteRecord=function(e,t,r,o){return{method:e.toLocaleLowerCase(),path:a(t,r),apiData:o}},t.bundlePaths=function(e,t){return e.sort(((e,t)=>e.path.localeCompare(t.path))),e.reduce(((e,r)=>({...e,[r.path]:{...e[r.path],[r.method]:(0,n.default)(r.apiData,t)}})),{})};const n=o(r(976));function a(e,t){return e.replace(t,"").replace("[","{").replace("]","}").replace("/route.ts","")}},363:function(e,t,r){var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.bundleSchemas=function(e){const t=Object.keys(e).reduce(((t,r)=>({...t,[r]:(0,a.default)(e[r],!1)})),{});return Object.entries(t).reduce(((t,[r,o])=>({...t,[r]:(0,n.default)(o,e,!1)})),{})};const n=o(r(580)),a=o(r(292))},380:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.transpile=function(e){const t=["import createRoute from '@omer-x/next-openapi-route-handler'","import z from 'zod';",a(n(e))];return(0,o.transpile)(t.join("\n"))};const o=r(899);function n(e){return e.replace(/^import\s.+\sfrom\s.+;$/gm,"").trim()}function a(e){const t=["GET","POST","PUT","PATCH","DELETE"];return`${t.map((e=>`exports.${e} = void 0;\n`))}\n${e}\n${`module.exports = { ${t.map((e=>`${e}: exports.${e}`)).join(", ")} }`}`}},292:function(e,t,r){var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){return(0,n.default)(t?e.array():e,{target:"openApi3",$refStrategy:"none"})};const n=o(r(106))},156:function(e,t,r){var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.default=async function(e){const t=await(0,s.findAppFolderPath)();if(!t)throw new Error("This is not a Next.js application!");const r=await(0,a.getDirectoryItems)(t,"route.ts"),o=[];for(const n of r){const r=await(0,s.getRouteExports)(n,e);for(const[e,a]of Object.entries(r))a&&a.apiData&&o.push((0,u.createRouteRecord)(e.toLocaleLowerCase(),n,t,a.apiData))}const i=(0,n.default)();return{openapi:"3.1.0",info:{title:i.serviceName,version:i.version},paths:(0,u.bundlePaths)(o,e),components:{schemas:(0,c.bundleSchemas)(e)},tags:[]}};const n=o(r(213)),a=r(489),s=r(37),u=r(683),c=r(363)},213:e=>{e.exports=require("@omer-x/package-metadata")},899:e=>{e.exports=require("typescript")},106:e=>{e.exports=require("zod-to-json-schema")},896:e=>{e.exports=require("fs")},943:e=>{e.exports=require("fs/promises")},455:e=>{e.exports=require("node:fs/promises")},760:e=>{e.exports=require("node:path")}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var r=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e].call(r.exports,r,r.exports,__webpack_require__),r.exports}var __webpack_exports__=__webpack_require__(156);module.exports=__webpack_exports__})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omer-x/next-openapi-json-generator",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "a Next.js plugin to generate OpenAPI documentation from route handlers",
5
5
  "keywords": [
6
6
  "next.js",
@@ -40,22 +40,22 @@
40
40
  },
41
41
  "dependencies": {
42
42
  "@omer-x/package-metadata": "^0.1.2",
43
- "typescript": "^5.4.5",
44
- "zod-to-json-schema": "^3.23.0"
43
+ "typescript": "^5.5.2",
44
+ "zod-to-json-schema": "^3.23.1"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@omer-x/eslint-config": "^1.0.7",
48
48
  "@omer-x/openapi-types": "^0.1.2",
49
- "@types/node": "^20.14.2",
49
+ "@types/node": "^20.14.8",
50
50
  "clean-webpack-plugin": "^4.0.0",
51
51
  "eslint": "^8.57.0",
52
52
  "ts-loader": "^9.5.1",
53
53
  "ts-unused-exports": "^10.1.0",
54
- "webpack": "^5.92.0",
54
+ "webpack": "^5.92.1",
55
55
  "webpack-cli": "^5.1.4",
56
56
  "zod": "^3.23.8"
57
57
  },
58
58
  "peerDependencies": {
59
- "@omer-x/next-openapi-route-handler": "^0.3.0"
59
+ "@omer-x/next-openapi-route-handler": "^0.4.0"
60
60
  }
61
61
  }