UNPKG

@visulima/api-platform

Version:

Visulima API platform is a set of tools to build and consume web APIs

6 lines 8.75 kB
'use strict';var child_process=require('child_process'),fs=require('fs'),q=require('process'),path=require('@visulima/path'),m=require('chalk'),jsdocOpenApi=require('@visulima/jsdoc-open-api'),fs$1=require('@visulima/fs');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var q__default=/*#__PURE__*/_interopDefault(q);var m__default=/*#__PURE__*/_interopDefault(m);var z=(e,r)=>{if(r.length===0)throw new Error("must include at least one key to map");let t=e.toString();return r.forEach(o=>{t=o.optional?t.replace("(?:\\/([^\\/]+?))?\\",`/:${o.name}?`):t.replace(String.raw`(?:([^\/]+?))`,`:${o.name}`);}),t.replace(String.raw`/?(?=\/|$)/i`,"").replace("/^","").replaceAll("\\","").replaceAll(/\/{2,}/gu,"/")},k=z;var Q=(e,r)=>{if(typeof e=="string")return e;if(e.fast_slash)return "";if(e.fast_star)return "*";let t="";r.length>0&&(t=k(e,r));let o=/^\/\^((?:\\[$()*+./?[\\\]^{|}]|[^$()*+./?[\\\]^{|}])*)\$\//u.exec(e.toString().replace(String.raw`\/?`,"").replace(String.raw`(?=\/|$)`,"$"));return Array.isArray(o)&&o.length>1?o[1].replaceAll(/\\(.)/gu,"$1").slice(1):t?t.slice(1):e.toString()},T=Q;var V=(e,r,t)=>{let o=e.route.stack.at(-1),n=r.map(a=>({in:"path",name:a.name,required:!a.optional})),s=e.route.stack.filter(a=>a.handle.metadata);if(s.length>1)throw new Error("Only one metadata middleware is allowed per route");let p=(t+e.route.path).replaceAll(/\/{2,}/gu,"/");return s.length===0?{method:o.method,path:p,pathParams:n}:{metadata:s[0].handle.metadata,method:o.method,path:p,pathParams:n}},D=(e,r,t,o)=>{if(o=[...o,...t.keys],t.name==="router"&&t.handle?.stack!==void 0)for(let n of t.handle.stack)r=r||"",D(e,`${r}/${T(t.regexp,t.keys)}`,n,o);!t.route||t.route.stack.length===0||e.push(V(t,o,r));},Z=e=>{let r=e._router||e.router,t=[];for(let o of r.stack)D(t,"",o,[]);return t},$=Z;var ee=e=>{let r=[];return $(e).forEach(t=>{r.push({file:"unknown",method:t.method.toUpperCase(),path:t.path,tags:[]});}),r},j=ee;var v=e=>e.replaceAll(/ \(.*\)/gu,"").trim(),O=e=>e.trim().split(" ")[1].slice(1,-1),te=e=>{let t=e.printRoutes().replaceAll(/[─│└├]/gu," ").trimEnd().split(` `),o=t.reduce((s,p,a)=>{let i=v(p);if(v(t[a-1]??"")===i){let x=s.filter(A=>A.index<a&&A.segment===i),{methods:S}=x.at(-1);return S!==null&&S.push(O(p)),s}let c=p.replaceAll(/ \(.*\)/gu,"").match(/ /gu);if(c===null)throw new Error("Invalid spaces");let l=c.length/4,h=p.includes("("),E=h?[O(p)]:null;return s.push({depth:l,index:a,isRoute:h,methods:E,segment:i}),s},[]),n=[];return o.filter(s=>s.isRoute).forEach(s=>{let a=[...o.filter(i=>i.index<s.index&&i.depth<s.depth).filter((i,u,c)=>!c.find(l=>l.depth===i.depth&&l.index>i.index)).map(i=>i.segment),s.segment].join("");if(s.methods===null)throw new Error("Invalid methods");s.methods.forEach(i=>{n.push({file:"unknown",method:i.toUpperCase(),path:a,tags:[]});});}),n},b=te;var re=e=>{let t=e._core.router.routes,o=[];return [...t.keys()].forEach(n=>{t.get(n).routes.forEach(s=>{o.push({file:"unknown",method:s.route.method.toUpperCase(),path:s.path,tags:[]});});}),o},C=re;var oe=e=>{let r=[];return e.middleware.filter(t=>t.router).flatMap(t=>t.router.stack).forEach(t=>{r.push({file:"unknown",method:t.methods.join("|").toUpperCase(),path:t.path,tags:[]});}),r},F=oe;var N=/\.(js|ts|mjs|cjs)$/u,pe=(e,r,t=false)=>{e=path.toNamespacedPath(e);let o=path.toNamespacedPath(q.cwd()),n=[],s=jsdocOpenApi.parseFile(e,jsdocOpenApi.jsDocumentCommentsToOpenApi,t);n=[...n,...s.map(i=>i.spec)];let p=jsdocOpenApi.parseFile(e,jsdocOpenApi.swaggerJsDocumentCommentsToOpenApi,t);n=[...n,...p.map(i=>i.spec)];let a=[];return n.length===0?(fs.readFileSync(e,"utf8").split(/\r?\n/u).forEach(u=>{let c=/[=aces|]+\s["'|](GET|POST|PUT|PATCH|HEAD|DELETE|OPTIONS)["'|]/u.exec(u);if(c){let[,l]=c;l==="GET"&&(l="GET|HEAD"),a.push({file:e.replace(`${o}/`,""),method:l,path:path.toNamespacedPath(e.replace(r,"").replace(N,"")),tags:[]});}}),a.length===0&&a.push({file:e.replace(`${o}/`,""),method:"GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS",path:path.toNamespacedPath(e.replace(r,"").replace(N,"")),tags:[]}),a):(n.forEach(i=>{Object.entries(i?.paths??{}).forEach(([c,l])=>{Object.entries(l).forEach(([E,x])=>{a.push({file:e.replace(`${o}/`,""),method:E.toUpperCase(),path:path.toNamespacedPath(c),tags:x.tags});});});}),a)},M=pe;var y=[".js",".ts",".mjs",".cjs"],H=e=>{let r=path.parse(e);for(;r.base&&r.root!==r.dir;){if(fs.readdirSync(r.dir).find(n=>n==="package.json"))return r.dir;r=path.parse(r.dir);}return null},K=e=>{let r=`${e}/package.json`,{dependencies:t}=JSON.parse(fs.readFileSync(r).toString());return t?.express?"express":t?.koa&&(t["@koa/router"]||t["koa-router"])?"koa":t?.next?"next":t?.["@hapi/hapi"]?"hapi":t?.fastify?"fastify":null},G=(e,r)=>Object.keys(e).length===0?null:r==="hapi"?typeof e.app.app=="string"?e.app:e:e.app??e;var _=e=>{try{return fs.statSync(e).isDirectory()}catch{return false}},me=async(e="")=>{let r=path.join(e,"pages/api");return !_(r)&&(r=path.join(e,"src/pages/api"),!_(r))?[]:fs$1.collect(r,{extensions:y,includeDirs:false})},U=me;var R=async(e,r,t)=>{if(r==="express")return j(e);if(r==="koa")return F(e);if(r==="hapi")return C(e);if(r==="fastify")return b(e);if(r==="next"){let o=await U(e);if(o.length===0)throw new Error(`No API routes found, in "${e}".`);return o.flatMap(n=>M(n,e,t))}return null};var he=(e,r)=>{let t=new Map;return e.forEach(o=>{let n=r(o),s=t.get(n);s?s.push(o):t.set(n,[o]);}),t},W=he;var de=(e,r)=>{let t={ANY:m__default.default.redBright,DELETE:m__default.default.redBright,GET:m__default.default.blue,HEAD:m__default.default.hex("#6C7280"),OPTIONS:m__default.default.hex("#6C7280"),PATCH:m__default.default.yellow,POST:m__default.default.yellow,PUT:m__default.default.yellow},o;if(e==="GET|HEAD")o=`${m__default.default.blue("GET")}${m__default.default.grey("|HEAD")}`;else {let u=t[e](e);o=e==="GET"?`${u}${m__default.default.grey("|HEAD")}`:u;}let n=e==="GET"?6:14-e.length,s=Array.from({length:n}).fill(" ").join(""),p=process.stdout.columns-16-r.length-4,a=p>0?Array.from({length:p}).fill(".").join(""):"",i=r.split("/").map(u=>[":","["].includes(u[0]??"")?m__default.default.yellowBright(u):u).join("/");return ` ${o}${s}${i}${m__default.default.grey(a)}`},ge=(e,r={})=>e.map(t=>{if(!(Array.isArray(r.methods)&&r.methods.includes(t.method)))return t.method==="GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS"&&(t.method="ANY"),de(t.method,t.path.replace("/pages",""))}).filter(Boolean),w=ge;var xe=async(e,r,t={})=>{let o=path.join(q__default.default.cwd(),r);if(!fs.existsSync(o))throw new Error("No such file, invalid path provided.");let n=H(o);if(!n)throw new Error("Please initialize local package.json.");if(e===void 0){let p=K(n);if(!p)throw new Error("Couldn't detect supported back-end framework.");e=p;}let s=null;if(e==="next")s=await R(o,"next",t.verbose??false);else {if(!fs.statSync(o).isFile())throw new Error(`${o} is directory, but file expected.`);if(!y.includes(path.extname(o)))throw new Error("Please specify application .ts/.js/.mjs/.cjs file.");let p=`${n}/.env`;fs.existsSync(p)&&(await import(`${n}/node_modules/dotenv/lib/main.js`)).config({path:p});let a=path.extname(o)===".ts",i=path.join(n,"node_modules/.bin/tsc");if(a&&!fs.existsSync(i))throw new Error(`Please install typescript in ${n}`);try{if(a)try{child_process.execSync(`${i} --outDir framework-list >&2`,{cwd:n});}catch(l){console.log(`TSC compilation failed. Please resolve issues in your project. `),console.log(l),fs.rmSync(path.join(n,"framework-list"),{recursive:!0});}let u=a?path.join(n,"framework-list",o.replace(n,"").replace(".ts",".js")):o,{default:c}=await import(u);s=await R(["AsyncFunction","Function"].includes(c.constructor.name)?await c():G(c,e),e,t.verbose??!1);}finally{a&&fs.rmSync(path.join(n,"framework-list"),{recursive:true});}}if(s===null)throw new Error(`Framework "${e}" is not supported.`);if(Array.isArray(t.includePaths)&&t.includePaths.length>0&&(s=t.includePaths.flatMap(p=>s.filter(a=>a.path.startsWith(p)))),Array.isArray(t.excludePaths)&&t.excludePaths.length>0&&(s=t.excludePaths.flatMap(p=>s.filter(a=>!a.path.startsWith(p)))),typeof t.group=="string"&&t.group!==""){console.log();let p=W(s,i=>t.group==="path"?i.path.replace("/pages","").split("/")[1]:i.tags[0]??"unsorted"),a=0;p.forEach((i,u)=>{a>0&&console.log();let c=(q__default.default.stdout.columns-16-u.length)/2,l=c>0?Array.from({length:c}).fill(" ").join(""):"";console.log(l+m__default.default.bold.underline(u)),w(i,t).forEach(h=>{console.log(h);}),a+=1;});}else console.log(),w(s,t).forEach(p=>{console.log(p);});console.log(` Listed ${m__default.default.greenBright(String(s.length))} HTTP ${s.length===1?"route":"routes"}. `);},wt=xe;exports.a=wt;//# sourceMappingURL=chunk-FQUHP33M.js.map //# sourceMappingURL=chunk-FQUHP33M.js.map