@omer-x/next-openapi-json-generator 0.2.1 → 0.2.4

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("]","}").replaceAll("\\","/").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.1",
3
+ "version": "0.2.4",
4
4
  "description": "a Next.js plugin to generate OpenAPI documentation from route handlers",
5
5
  "keywords": [
6
6
  "next.js",
@@ -40,18 +40,18 @@
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
  },