@andrewcaires/express 2.2.0 → 2.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/dist/index.cjs.js +2 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.esm.js +2 -2
- package/package.json +3 -3
package/dist/index.cjs.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/express v2.2.
|
|
2
|
+
* @andrewcaires/express v2.2.1
|
|
3
3
|
* Decorators for express
|
|
4
4
|
* (c) 2026 Andrew Caires
|
|
5
5
|
* @license: MIT
|
|
6
6
|
*/
|
|
7
|
-
"use strict";var e=require("@andrewcaires/decorator"),t=require("@andrewcaires/node"),s=require("@andrewcaires/utils.js"),r=require("compression"),o=require("cookie-parser"),i=require("cors"),n=require("express"),a=require("express-session"),l=require("fs"),u=require("http"),d=require("https"),h=require("net"),c=require("path"),p=require("request-ip"),E=require("multer");function _(e){var t=Object.create(null);return e&&Object.keys(e).forEach(function(s){if("default"!==s){var r=Object.getOwnPropertyDescriptor(e,s);Object.defineProperty(t,s,r.get?r:{enumerable:!0,get:function(){return e[s]}})}}),t.default=e,Object.freeze(t)}var v=_(u),R=_(d),m=_(h);function T(e,t,s,r){return new(s||(s=Promise))(function(o,i){function n(e){try{l(r.next(e))}catch(e){i(e)}}function a(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof s?t:new s(function(e){e(t)})).then(n,a)}l((r=r.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;class g{}g.CONTINUE=100,g.SWITCHING_PROTOCOLS=101,g.PROCESSING=102,g.OK=200,g.CREATED=201,g.ACCEPTED=202,g.NON_AUTHORITATIVE_INFORMATION=203,g.NO_CONTENT=204,g.RESET_CONTENT=205,g.PARTIAL_CONTENT=206,g.MULTI_STATUS=207,g.ALREADY_REPORTED=208,g.IM_USED=226,g.MULTIPLE_CHOICES=300,g.MOVED_PERMANENTLY=301,g.FOUND=302,g.SEE_OTHER=303,g.NOT_MODIFIED=304,g.USE_PROXY=305,g.TEMPORARY_REDIRECT=307,g.PERMANENT_REDIRECT=308,g.BAD_REQUEST=400,g.UNAUTHORIZED=401,g.PAYMENT_REQUIRED=402,g.FORBIDDEN=403,g.NOT_FOUND=404,g.METHOD_NOT_ALLOWED=405,g.NOT_ACCEPTABLE=406,g.PROXY_AUTHENTICATION_REQUIRED=407,g.REQUEST_TIMEOUT=408,g.CONFLICT=409,g.GONE=410,g.LENGTH_REQUIRED=411,g.PRECONDITION_FAILED=412,g.PAYLOAD_TOO_LARGE=413,g.REQUEST_URI_TOO_LONG=414,g.UNSUPPORTED_MEDIA_TYPE=415,g.REQUESTED_RANGE_NOT_SATISFIABLE=416,g.EXPECTATION_FAILED=417,g.IM_A_TEAPOT=418,g.MISDIRECTED_REQUEST=421,g.UNPROCESSABLE_ENTITY=422,g.LOCKED=423,g.FAILED_DEPENDENCY=424,g.UPGRADE_REQUIRED=426,g.PRECONDITION_REQUIRED=428,g.TOO_MANY_REQUESTS=429,g.REQUEST_HEADER_FIELDS_TOO_LARGE=431,g.CONNECTION_CLOSED_WITHOUT_RESPONSE=444,g.UNAVAILABLE_FOR_LEGAL_REASONS=451,g.CLIENT_CLOSED_REQUEST=499,g.INTERNAL_SERVER_ERROR=500,g.NOT_IMPLEMENTED=501,g.BAD_GATEWAY=502,g.SERVICE_UNAVAILABLE=503,g.GATEWAY_TIMEOUT=504,g.HTTP_VERSION_NOT_SUPPORTED=505,g.VARIANT_ALSO_NEGOCIATES=506,g.INSUFFICIENT_STORAGE=507,g.LOOP_DETECTED=508,g.NOT_EXTENDED=510,g.NETWORK_AUTHENTICATION_REQUIRED=511,g.NETWORK_CONNECTION_TIMEOUT_ERROR=599;class O{}O[100]="Continue",O[101]="Switching Protocols",O[102]="Processing",O[200]="OK",O[201]="Created",O[202]="Accepted",O[203]="Non-Authoritative Information",O[204]="No Content",O[205]="Reset Content",O[206]="Partial Content",O[207]="Multi-Status",O[226]="IM Used",O[300]="Multiple Choices",O[301]="Moved Permanently",O[302]="Found",O[303]="See Other",O[304]="Not Modified",O[305]="Use Proxy",O[307]="Temporary Redirect",O[308]="Permanent Redirect",O[400]="Bad Request",O[401]="Unauthorized",O[402]="Payment Required",O[403]="Forbidden",O[404]="Not Found",O[405]="Method Not Allowed",O[406]="Not Acceptable",O[407]="Proxy Authentication Required",O[408]="Request Timeout",O[409]="Conflict",O[410]="Gone",O[411]="Length Required",O[412]="Precondition Failed",O[413]="Payload Too Large",O[414]="URI Too Long",O[415]="Unsupported Media Type",O[416]="Range Not Satisfiable",O[417]="Expectation Failed",O[418]="I'm a teapot",O[422]="Unprocessable Entity",O[423]="Locked",O[424]="Failed Dependency",O[426]="Upgrade Required",O[428]="Precondition Required",O[429]="Too Many Requests",O[431]="Request Header Fields Too Large",O[451]="Unavailable For Legal Reasons",O[500]="Internal Server Error",O[501]="Not Implemented",O[502]="Bad Gateway",O[503]="Service Unavailable",O[504]="Gateway Time-out",O[505]="HTTP Version Not Supported",O[506]="Variant Also Negotiates",O[507]="Insufficient Storage",O[511]="Network Authentication Required";class N extends Error{constructor(e,t=g.INTERNAL_SERVER_ERROR){super(e),this.status=t}}class S extends N{constructor(e="Not Found"){super(e,g.NOT_FOUND)}}class f extends N{constructor(e){super(e,g.UNPROCESSABLE_ENTITY)}}class A{static created(e,t,s){var r,o;const i=g.CREATED,n={success:!0,status:i,data:t?{id:t}:{},meta:null!==(r=null==s?void 0:s.meta)&&void 0!==r?r:{},message:null!==(o=null==s?void 0:s.message)&&void 0!==o?o:null};return e.status(i).json(n),n}static noContent(e){e.status(g.NO_CONTENT).end()}static ok(e,t,s){var r,o;const i=g.OK,n={success:!0,status:i,data:t,meta:null!==(r=null==s?void 0:s.meta)&&void 0!==r?r:{},message:null!==(o=null==s?void 0:s.message)&&void 0!==o?o:null};return e.status(i).json(n),n}static error(e,t,s){var r,o;const{status:i,message:n}=this.normalizeError(s),a=Object.assign({success:!1,status:i,error:null!==(r=null==O?void 0:O[i])&&void 0!==r?r:"Internal Server Error",message:n,path:null!==(o=e.originalUrl)&&void 0!==o?o:e.url,timestamp:(new Date).toISOString()},this.isDev()&&s instanceof Error&&s.stack?{stack:s.stack}:{});return t.status(i).json(a),a}static isDev(){return"production"!==process.env.NODE_ENV}static normalizeError(e){let t=g.INTERNAL_SERVER_ERROR,r=O[500];if(e instanceof N)return t=this.safeStatus(e.status),r=this.safeMessage(e.message)||r,{status:t,message:r};if(e instanceof Error){const o=e;return s.isNumber(o.statusCode)?t=this.safeStatus(o.statusCode):s.isNumber(o.status)&&(t=this.safeStatus(o.status)),r=this.safeMessage(e.message)||r,{status:t,message:r}}if(s.isString(e))return r=this.safeMessage(e)||r,{status:t,message:r};if(e&&s.isObject(e)){const o=e;return s.isNumber(o.statusCode)?t=this.safeStatus(o.statusCode):s.isNumber(o.status)&&(t=this.safeStatus(o.status)),s.isString(o.message)&&(r=this.safeMessage(o.message)||r),{status:t,message:r}}return{status:t,message:r}}static safeStatus(e){if(!Number.isFinite(e))return g.INTERNAL_SERVER_ERROR;const t=Math.trunc(e);return t<400||t>599?g.INTERNAL_SERVER_ERROR:t}static safeMessage(e){if(!s.isString(e))return"";const t=e.trim();return t.length>2e3?t.slice(0,2e3)+"...":t}}class y{constructor(e,t,r,o,i){this.storage={},this.req=e,this.res=t,this.next=r,this.id=s.uuidv7(),this.app=o,this.controller=i}cache(e){const t=Object.assign({},e),r=[];t.private?r.push("private"):t.public&&r.push("public"),t.noStore&&(t.noCache=!0,r.push("no-store")),t.noCache&&(t.maxAge=0,delete t.sMaxAge,r.push("no-cache")),t.noTransform&&r.push("no-transform"),t.proxyRevalidate&&r.push("proxy-revalidate"),t.mustRevalidate?r.push("must-revalidate"):t.noCache||(s.isNumber(t.staleIfError)&&r.push(`stale-if-error=${t.staleIfError}`),s.isNumber(t.staleWhileRevalidate)&&r.push(`stale-while-revalidate=${t.staleWhileRevalidate}`)),s.isNumber(t.maxAge)&&r.push(`max-age=${t.maxAge}`),s.isNumber(t.sMaxAge)&&r.push(`s-maxage=${t.sMaxAge}`),r.length&&(this.res.setHeader("Cache-Control",r.join(",")),t.noCache&&s.forEachKey({"Surrogate-Control":"no-store",Pragma:"no-cache",ETag:"false",Expires:"0"},(e,t)=>this.res.setHeader(t,e)))}clearCookie(e,t){this.res.clearCookie(e,t)}close(e){this.isResponded()||this.res.json(null!=e?e:this.storage)}destroy(e){var t;e&&this.error(e),null===(t=this.res.socket)||void 0===t||t.destroy(e)}error(e){this.isResponded()||A.error(this.req,this.res,e)}file(e){this.isResponded()||(this.status(g.OK),this.res.sendFile(c.resolve(e)))}getBody(){var e,t;return null!==(t=null===(e=this.req)||void 0===e?void 0:e.body)&&void 0!==t?t:{}}getBodyValue(e){var t;return null===(t=this.req.body)||void 0===t?void 0:t[e]}getCookie(e){var t;return this.normalize(null===(t=this.req.cookies)||void 0===t?void 0:t[e])}getCookies(){var e,t;return s.map(null!==(t=null===(e=this.req)||void 0===e?void 0:e.cookies)&&void 0!==t?t:{},e=>this.normalize(e))}getFiles(){var e,t;return null!==(t=null===(e=this.req)||void 0===e?void 0:e.files)&&void 0!==t?t:{}}getHeader(e){var t;return this.normalize(null===(t=this.req.headers)||void 0===t?void 0:t[e])}getHeaders(){var e,t;return s.map(null!==(t=null===(e=this.req)||void 0===e?void 0:e.headers)&&void 0!==t?t:{},e=>this.normalize(e))}getIp(){return p.getClientIp(this.req)||"0.0.0.0"}getQuery(e){var t;return this.normalize(null===(t=this.req.query)||void 0===t?void 0:t[e])}getQueries(){var e,t;return s.map(null!==(t=null===(e=this.req)||void 0===e?void 0:e.query)&&void 0!==t?t:{},e=>this.normalize(e))}getParam(e){var t;const r=null===(t=this.req.params)||void 0===t?void 0:t[e];return s.isUndefined(r)?void 0:String(r)}getParams(){var e,t;return s.map(null!==(t=null===(e=this.req)||void 0===e?void 0:e.params)&&void 0!==t?t:{},e=>{if(!s.isUndefined(e)&&!s.isNull(e))return String(e)})}getUrl(){return`${this.req.protocol}://${this.req.get("host")}${this.req.originalUrl}`}isResponded(){return this.res.headersSent||this.res.writableEnded}json(e){this.send(g.OK,e)}normalize(e){if(!s.isUndefined(e)&&!s.isNull(e))return s.isObject(e)?JSON.stringify(e):String(e)}ok(e,t){this.isResponded()||A.ok(this.res,e,t)}prepare(e,t){this.isResponded()||(this.status(e),this.storage=t)}send(e,t){this.isResponded()||(this.status(e),204===e||304===e||s.isUndefined(t)?this.res.end():this.res.json(t))}setCookie(e,t,s){this.res.cookie(e,t,null!=s?s:{})}status(e){return s.isUndefined(e)||this.res.status(e),this.res.statusCode}success(e){this.send(g.OK,{message:e})}}class x{static extends(t){return e.metadata(x.EXTENDS,t,[])}static middleware(t){return e.metadata(x.MIDDLEWARE,t,[])}static parameters(t){return e.metadata(x.PARAMETERS,t,[])}static path(t,s){return e.metadata(x.PATH,t,s)}static routers(t){return e.metadata(x.ROUTERS,t,[])}}x.EXTENDS=Symbol("EXTENDS"),x.MIDDLEWARE=Symbol("MIDDLEWARE"),x.PARAMETERS=Symbol("PARAMETERS"),x.PATH=Symbol("PATH"),x.ROUTERS=Symbol("ROUTERS");class I extends s.EventEmitter{get controllers(){return[...this._controllers]}get instance(){return this._app}get router(){return this._globalRouter}get server(){return this._server}constructor(t,u){var d,h;super(),this._app=n(),this._boundServers=[],this._options={},this._baseRouter=n.Router(),this._globalRouter=n.Router(),this._controllers=[],this._controllers.push(...t.map(t=>s.isConstructor(t)?new t(...e.getInjectionArgs(t)):t)),this._options=s.merge({},{cross:!1,hybrid:!1,path:"/",port:3e3,session:{secret:"yoursecret",resave:!0,saveUninitialized:!1,cookie:{maxAge:864e5}}},null!=u?u:{}),this._app.use(n.json(this._options.json)),this._app.disable("x-powered-by"),this._app.use(n.urlencoded({extended:!0})),this._options.cross&&this._app.use(i(s.isObject(this._options.cross)?this._options.cross:{})),this._app.use(r(this._options.compression)),this._app.use(o(null===(d=this._options.cookie)||void 0===d?void 0:d.secret,this._options.cookie)),this._app.use(a(this._options.session)),this.init(),this._app.use(this._globalRouter);const p=(null===(h=this._options.path)||void 0===h?void 0:h.length)?this._options.path:"/";if(this._app.use(p,this._baseRouter),this._app.all(p+"/*path",(e,t)=>{this._options.redirect?t.redirect(this._options.redirect):A.error(e,t,new S("Endpoint Not Found"))}),this._options.public){const e=c.resolve(this._options.public);l.existsSync(e)&&this._app.use(n.static(e)),this._app.get("*path",(t,s)=>{l.existsSync(e)?s.sendFile(e+"/index.html"):this._options.notfound?s.redirect(this._options.notfound):A.error(t,s,new S('FILE "index.html" Not Found'))})}else this._app.all("*path",(e,t)=>{this._options.redirect?t.redirect(this._options.redirect):A.error(e,t,new S("Endpoint not found"))});this._controllers.forEach(e=>{const t=n.Router(),r=this._collectMiddlewares(e),o=x.parameters(e);this._collectExtends(e).forEach(e=>{r.push(...this._collectMiddlewares(e)),o.push(...x.parameters(e))}),x.routers(e).forEach(i=>{const n=i.propertyKey.toString();if(s.isFunction(e[n])){if(!s.isFunction(t[i.method]))return this._logRouteNotFound(i.method);const a=this._buildMiddlewareChain(e,n,r,o);return t[i.method](i.path,...a,(t,r,i)=>T(this,void 0,void 0,function*(){const a=new y(t,r,i,this,e),l=this._resolveArgs(a,this._filterParamsByKey(n,o)),u=yield e[n](...l);a.close(s.isArray(u)||s.isObject(u)?u:void 0)}))}this._logRouteNotFound(`${e.name}.${n}`)}),this._collectExtends(e).forEach(i=>{x.routers(i).forEach(i=>{const n=i.propertyKey.toString();if(s.isFunction(e[n])){if(!s.isFunction(t[i.method]))return this._logRouteNotFound(i.method);const a=this._buildMiddlewareChain(e,n,r,o);return t[i.method](i.path,...a,(t,r,i)=>T(this,void 0,void 0,function*(){const a=new y(t,r,i,this,e),l=this._resolveArgs(a,this._filterParamsByKey(n,o)),u=yield e[n](...l);a.close(s.isArray(u)||s.isObject(u)?u:void 0)}))}this._logRouteNotFound(`${e.constructor.name}.${n}`)})}),this._baseRouter.use(x.path(e,"/"),t)})}init(){}error(e,s){t.Log.error(e)}log(e,s){t.Log.info(e)}_resolveArgs(e,t,s){const r=[],o={ctx:e,key:"",app:this,argument:s};return t.forEach(e=>{r[e.parameterIndex]=e.callback(Object.assign(Object.assign({},o),{key:e.key}))}),r}_buildMiddlewareChain(e,t,r,o){return r.filter(e=>e.propertyKey==t).map(t=>{if(t.callback!=s.noop){const r=this._filterParamsByKey(t.method,o);return(o,i,n)=>T(this,void 0,void 0,function*(){const a=new y(o,i,n,this,e),l=s.isFunction(t.argument)?t.argument(a):t.argument,u=yield t.callback.call(e,...this._resolveArgs(a,r,l));(s.isArray(u)||s.isObject(u))&&a.close(u)})}this._logRouteNotFound(t.method)}).filter(s.isFunction)}_collectExtends(e){return x.extends(e).reduce((e,t)=>(e.push(t,...this._collectExtends(t)),e),[]).filter((e,t,s)=>s.indexOf(e)===t)}_filterParamsByKey(e,t){return t.filter(t=>t.propertyKey==e)}_collectMiddlewares(e){return[...x.middleware(e)].reverse()}_logRouteNotFound(e){this.error(new Error(`Router "${e}" not found`),"express")}_formatListeningMessage(e){return`Server listening on port ${e}`}listen(){return T(this,void 0,void 0,function*(){var e;const t=this._resolveMode(),s={http:this._startHttp,https:this._startHttps,hybrid:this._startHybrid,redirect:this._startHttpsWithRedirect};yield(null!==(e=s[t])&&void 0!==e?e:this._startHttp).call(this)})}close(){return T(this,void 0,void 0,function*(){yield Promise.all(this._boundServers.map(e=>new Promise((t,s)=>{e.close(e=>e?s(e):t())}))),this._boundServers.length=0,this._server=void 0})}_resolveMode(){return this._resolveTls()?this._options.mode?this._options.mode:this._options.hybrid?"hybrid":"https":"http"}_resolveTls(){if(this._options.tls&&this._options.tls.key&&this._options.tls.cert)return this._options.tls}_bindServer(e,t,s){return new Promise((r,o)=>{const i=t=>{e.off("listening",n),o(t)},n=()=>{e.off("error",i),this.log(this._formatListeningMessage(t),"express"),r()};e.once("error",i),e.once("listening",n),e.listen(t,s)})}_startHttp(){return T(this,void 0,void 0,function*(){var e;const t=v.createServer(this._app);this._server=t,this._boundServers.push(t),yield this._bindServer(t,null!==(e=this._options.port)&&void 0!==e?e:3e3,this._options.host)})}_startHttps(){return T(this,void 0,void 0,function*(){var e;const t=R.createServer(this._resolveTls(),this._app);this._server=t,this._boundServers.push(t),yield this._bindServer(t,null!==(e=this._options.port)&&void 0!==e?e:443,this._options.host)})}_startHttpsWithRedirect(){return T(this,void 0,void 0,function*(){var e,t;const s=R.createServer(this._resolveTls(),this._app),r=v.createServer((e,t)=>{var s,r;const o=(null!==(s=e.headers.host)&&void 0!==s?s:"").split(":")[0];t.writeHead(g.MOVED_PERMANENTLY,{Location:`https://${o}${null!==(r=e.url)&&void 0!==r?r:""}`}),t.end()});this._server=s,this._boundServers.push(s,r),yield Promise.all([this._bindServer(s,null!==(e=this._options.port)&&void 0!==e?e:443,this._options.host),this._bindServer(r,null!==(t=this._options.redirectPort)&&void 0!==t?t:80,this._options.host)])})}_startHybrid(){return T(this,void 0,void 0,function*(){var e;const t=v.createServer(this._app),s=R.createServer(this._resolveTls(),this._app),r=m.createServer(e=>{const r=setTimeout(()=>e.destroy(),5e3);e.once("data",o=>{clearTimeout(r),e.pause(),e.unshift(o),(22===o[0]?s:t).emit("connection",e),process.nextTick(()=>e.resume())}),e.once("error",()=>clearTimeout(r))});return this._server=s,this._boundServers.push(r,s,t),yield this._bindServer(r,null!==(e=this._options.port)&&void 0!==e?e:443,this._options.host),s})}}const b=e=>t=>(s,r,o)=>{x.parameters(s).push({callback:e,key:t,propertyKey:r,parameterIndex:o})},C=b(({app:e})=>e),D=b(({argument:e})=>e),P=b(({ctx:e,key:t})=>t?e.getBodyValue(t):e.getBody()),U=b(({ctx:e,key:t})=>t?e.getCookie(t):e.getCookies()),L=b(({ctx:e})=>e),M=b(({ctx:e})=>e.getFiles()),F=b(({ctx:e,key:t})=>t?e.getHeader(t):e.getHeaders()),q=b(({ctx:e,key:t})=>t?e.getParam(t):e.getParams()),k=b(({ctx:e,key:t})=>t?e.getQuery(t):e.getQueries()),w=b(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.session}),H=(e,t)=>(r,o)=>{const i=s.uuidv7();L()(r,i,0),x.middleware(r).push({method:i,argument:t,propertyKey:o,callback:e})},j={ALL:"all",GET:"get",POST:"post",PUT:"put",HEAD:"head",DELETE:"delete",OPTIONS:"options",PATCH:"patch"},B=e=>t=>(s,r)=>{x.routers(s).push({method:e,path:(null==t?void 0:t.length)?t:"/",propertyKey:r})},V=B(j.ALL),K=B(j.DELETE),G=B(j.GET),Q=B(j.HEAD),$=B(j.OPTIONS),z=B(j.PATCH),Y=B(j.POST),W=B(j.PUT),X=e=>{var t;return(null===(t=e.split(".").pop())||void 0===t?void 0:t.toLowerCase())||"bin"},Z=(e,t)=>{var s;return null!==(s=e[t])&&void 0!==s?s:null},J=(e,t)=>{const r=s.uuidv7()+"."+t;return l.existsSync(c.join(e,r))?J(e,t):r};exports.All=V,exports.App=C,exports.Application=I,exports.Argument=D,exports.BadRequestError=class extends N{constructor(e="Bad Request"){super(e,g.BAD_REQUEST)}},exports.Body=P,exports.Cache=e=>(t,s,r)=>{H(t=>{t.cache(Object.assign({},e)),t.next()})(t,s,r)},exports.Context=y,exports.Controller=e=>t=>{x.path(t,(null==e?void 0:e.length)?e:"/")},exports.Cookies=U,exports.Ctx=L,exports.Delete=K,exports.Extends=e=>t=>{x.extends(t).push(e)},exports.Files=M,exports.ForbiddenError=class extends N{constructor(e="Forbidden"){super(e,g.FORBIDDEN)}},exports.Get=G,exports.Head=Q,exports.Headers=F,exports.HttpResponse=A,exports.InternalServerError=class extends N{constructor(e="Internal server error"){super(e,g.INTERNAL_SERVER_ERROR)}},exports.Metadata=x,exports.Methods=j,exports.Middleware=(e,t)=>(r,o)=>{let i=s.noop;if(s.isString(o)){const t=r;s.isFunction(t[e])&&(i=t[e])}x.middleware(r).push({method:e,argument:t,propertyKey:o,callback:i})},exports.NotFoundError=S,exports.Options=$,exports.Params=q,exports.Patch=z,exports.Post=Y,exports.Put=W,exports.Query=k,exports.ResponseError=N,exports.Session=w,exports.StatusCodes=g,exports.StatusText=O,exports.UnauthorizedError=class extends N{constructor(e="Unauthorized"){super(e,g.UNAUTHORIZED)}},exports.Upload=e=>{const t=s.merge({},e),r=E.diskStorage({destination(e,s,r){var o;const i=Z(t,s.fieldname);r(null,null!==(o=null==i?void 0:i.path)&&void 0!==o?o:"./")},filename(e,s,r){var o;const i=Z(t,s.fieldname);r(null,J(null!==(o=null==i?void 0:i.path)&&void 0!==o?o:"./",X(s.originalname)))}}),o=Math.max(...Object.values(t).map(e=>{var t;return null!==(t=e.size)&&void 0!==t?t:0})),i=E({storage:r,fileFilter(e,s,r){var o;const i=Z(t,s.fieldname);return i?((e,t)=>!t.length||t.includes(X(e.originalname))||t.includes(e.mimetype.toLowerCase()))(s,null!==(o=null==i?void 0:i.types)&&void 0!==o?o:[])?void r(null,!0):r(new Error(`FILE TYPE NOT ALLOWED FOR "${s.fieldname}"`)):r(new Error(`UPLOAD FIELD "${s.fieldname}" IS NOT CONFIGURED`))},limits:{fileSize:1024*o*1024}}).fields(Object.keys(t).map(e=>{var s,r;return{name:e,maxCount:null!==(r=null===(s=t[e])||void 0===s?void 0:s.count)&&void 0!==r?r:1}}));return(e,t,s)=>{H(e=>{i(e.req,e.res,t=>{if(!t)return e.next();"LIMIT_UNEXPECTED_FILE"==t.code&&(t.message=`FIELD "${t.field}" EXCEEDS MAX SIZE`),e.destroy(t)})})(e,t,s)}},exports.Use=H,exports.Validate=e=>{const t=s.Validation.object(s.isFunction(e)?e(s.Validation):e).parse();return(e,s,r)=>{H(e=>T(void 0,void 0,void 0,function*(){var s,r;const{error:o,message:i,value:n}=yield t.validateAsync(null!==(r=null===(s=e.req)||void 0===s?void 0:s.body)&&void 0!==r?r:{});if(o)return e.error(new f(null!=i?i:o));e.req.body=n,e.next()}))(e,s,r)}},exports.ValidationError=f,exports.methodFactory=B,exports.parameterFactory=b;
|
|
7
|
+
"use strict";var e=require("@andrewcaires/decorator"),t=require("@andrewcaires/node"),s=require("@andrewcaires/utils.js"),r=require("compression"),o=require("cookie-parser"),i=require("cors"),n=require("express"),a=require("express-session"),l=require("fs"),u=require("http"),d=require("https"),h=require("net"),c=require("path"),p=require("request-ip"),E=require("multer");function _(e){var t=Object.create(null);return e&&Object.keys(e).forEach(function(s){if("default"!==s){var r=Object.getOwnPropertyDescriptor(e,s);Object.defineProperty(t,s,r.get?r:{enumerable:!0,get:function(){return e[s]}})}}),t.default=e,Object.freeze(t)}var v=_(u),R=_(d),m=_(h);function T(e,t,s,r){return new(s||(s=Promise))(function(o,i){function n(e){try{l(r.next(e))}catch(e){i(e)}}function a(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof s?t:new s(function(e){e(t)})).then(n,a)}l((r=r.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;class g{}g.CONTINUE=100,g.SWITCHING_PROTOCOLS=101,g.PROCESSING=102,g.OK=200,g.CREATED=201,g.ACCEPTED=202,g.NON_AUTHORITATIVE_INFORMATION=203,g.NO_CONTENT=204,g.RESET_CONTENT=205,g.PARTIAL_CONTENT=206,g.MULTI_STATUS=207,g.ALREADY_REPORTED=208,g.IM_USED=226,g.MULTIPLE_CHOICES=300,g.MOVED_PERMANENTLY=301,g.FOUND=302,g.SEE_OTHER=303,g.NOT_MODIFIED=304,g.USE_PROXY=305,g.TEMPORARY_REDIRECT=307,g.PERMANENT_REDIRECT=308,g.BAD_REQUEST=400,g.UNAUTHORIZED=401,g.PAYMENT_REQUIRED=402,g.FORBIDDEN=403,g.NOT_FOUND=404,g.METHOD_NOT_ALLOWED=405,g.NOT_ACCEPTABLE=406,g.PROXY_AUTHENTICATION_REQUIRED=407,g.REQUEST_TIMEOUT=408,g.CONFLICT=409,g.GONE=410,g.LENGTH_REQUIRED=411,g.PRECONDITION_FAILED=412,g.PAYLOAD_TOO_LARGE=413,g.REQUEST_URI_TOO_LONG=414,g.UNSUPPORTED_MEDIA_TYPE=415,g.REQUESTED_RANGE_NOT_SATISFIABLE=416,g.EXPECTATION_FAILED=417,g.IM_A_TEAPOT=418,g.MISDIRECTED_REQUEST=421,g.UNPROCESSABLE_ENTITY=422,g.LOCKED=423,g.FAILED_DEPENDENCY=424,g.UPGRADE_REQUIRED=426,g.PRECONDITION_REQUIRED=428,g.TOO_MANY_REQUESTS=429,g.REQUEST_HEADER_FIELDS_TOO_LARGE=431,g.CONNECTION_CLOSED_WITHOUT_RESPONSE=444,g.UNAVAILABLE_FOR_LEGAL_REASONS=451,g.CLIENT_CLOSED_REQUEST=499,g.INTERNAL_SERVER_ERROR=500,g.NOT_IMPLEMENTED=501,g.BAD_GATEWAY=502,g.SERVICE_UNAVAILABLE=503,g.GATEWAY_TIMEOUT=504,g.HTTP_VERSION_NOT_SUPPORTED=505,g.VARIANT_ALSO_NEGOCIATES=506,g.INSUFFICIENT_STORAGE=507,g.LOOP_DETECTED=508,g.NOT_EXTENDED=510,g.NETWORK_AUTHENTICATION_REQUIRED=511,g.NETWORK_CONNECTION_TIMEOUT_ERROR=599;class O{}O[100]="Continue",O[101]="Switching Protocols",O[102]="Processing",O[200]="OK",O[201]="Created",O[202]="Accepted",O[203]="Non-Authoritative Information",O[204]="No Content",O[205]="Reset Content",O[206]="Partial Content",O[207]="Multi-Status",O[226]="IM Used",O[300]="Multiple Choices",O[301]="Moved Permanently",O[302]="Found",O[303]="See Other",O[304]="Not Modified",O[305]="Use Proxy",O[307]="Temporary Redirect",O[308]="Permanent Redirect",O[400]="Bad Request",O[401]="Unauthorized",O[402]="Payment Required",O[403]="Forbidden",O[404]="Not Found",O[405]="Method Not Allowed",O[406]="Not Acceptable",O[407]="Proxy Authentication Required",O[408]="Request Timeout",O[409]="Conflict",O[410]="Gone",O[411]="Length Required",O[412]="Precondition Failed",O[413]="Payload Too Large",O[414]="URI Too Long",O[415]="Unsupported Media Type",O[416]="Range Not Satisfiable",O[417]="Expectation Failed",O[418]="I'm a teapot",O[422]="Unprocessable Entity",O[423]="Locked",O[424]="Failed Dependency",O[426]="Upgrade Required",O[428]="Precondition Required",O[429]="Too Many Requests",O[431]="Request Header Fields Too Large",O[451]="Unavailable For Legal Reasons",O[500]="Internal Server Error",O[501]="Not Implemented",O[502]="Bad Gateway",O[503]="Service Unavailable",O[504]="Gateway Time-out",O[505]="HTTP Version Not Supported",O[506]="Variant Also Negotiates",O[507]="Insufficient Storage",O[511]="Network Authentication Required";class N extends Error{constructor(e,t=g.INTERNAL_SERVER_ERROR){super(e),this.status=t}}class S extends N{constructor(e="Not Found"){super(e,g.NOT_FOUND)}}class f extends N{constructor(e){super(e,g.UNPROCESSABLE_ENTITY)}}class A{static created(e,t,s){var r,o;const i=g.CREATED,n={success:!0,status:i,data:t?{id:t}:{},meta:null!==(r=null==s?void 0:s.meta)&&void 0!==r?r:{},message:null!==(o=null==s?void 0:s.message)&&void 0!==o?o:null};return e.status(i).json(n),n}static noContent(e){e.status(g.NO_CONTENT).end()}static ok(e,t,s){var r,o;const i=g.OK,n={success:!0,status:i,data:t,meta:null!==(r=null==s?void 0:s.meta)&&void 0!==r?r:{},message:null!==(o=null==s?void 0:s.message)&&void 0!==o?o:null};return e.status(i).json(n),n}static error(e,t,s){var r,o;const{status:i,message:n}=this.normalizeError(s),a=Object.assign({success:!1,status:i,error:null!==(r=null==O?void 0:O[i])&&void 0!==r?r:"Internal Server Error",message:n,path:null!==(o=e.originalUrl)&&void 0!==o?o:e.url,timestamp:(new Date).toISOString()},this.isDev()&&s instanceof Error&&s.stack?{stack:s.stack}:{});return t.status(i).json(a),a}static isDev(){return"production"!==process.env.NODE_ENV}static normalizeError(e){let t=g.INTERNAL_SERVER_ERROR,r=O[500];if(e instanceof N)return t=this.safeStatus(e.status),r=this.safeMessage(e.message)||r,{status:t,message:r};if(e instanceof Error){const o=e;return s.isNumber(o.statusCode)?t=this.safeStatus(o.statusCode):s.isNumber(o.status)&&(t=this.safeStatus(o.status)),r=this.safeMessage(e.message)||r,{status:t,message:r}}if(s.isString(e))return r=this.safeMessage(e)||r,{status:t,message:r};if(e&&s.isObject(e)){const o=e;return s.isNumber(o.statusCode)?t=this.safeStatus(o.statusCode):s.isNumber(o.status)&&(t=this.safeStatus(o.status)),s.isString(o.message)&&(r=this.safeMessage(o.message)||r),{status:t,message:r}}return{status:t,message:r}}static safeStatus(e){if(!Number.isFinite(e))return g.INTERNAL_SERVER_ERROR;const t=Math.trunc(e);return t<400||t>599?g.INTERNAL_SERVER_ERROR:t}static safeMessage(e){if(!s.isString(e))return"";const t=e.trim();return t.length>2e3?t.slice(0,2e3)+"...":t}}class x{constructor(e,t,r,o,i){this.storage={},this.req=e,this.res=t,this.next=r,this.id=s.uuidv7(),this.app=o,this.controller=i}cache(e){const t=Object.assign({},e),r=[];t.private?r.push("private"):t.public&&r.push("public"),t.noStore&&(t.noCache=!0,r.push("no-store")),t.noCache&&(t.maxAge=0,delete t.sMaxAge,r.push("no-cache")),t.noTransform&&r.push("no-transform"),t.proxyRevalidate&&r.push("proxy-revalidate"),t.mustRevalidate?r.push("must-revalidate"):t.noCache||(s.isNumber(t.staleIfError)&&r.push(`stale-if-error=${t.staleIfError}`),s.isNumber(t.staleWhileRevalidate)&&r.push(`stale-while-revalidate=${t.staleWhileRevalidate}`)),s.isNumber(t.maxAge)&&r.push(`max-age=${t.maxAge}`),s.isNumber(t.sMaxAge)&&r.push(`s-maxage=${t.sMaxAge}`),r.length&&(this.res.setHeader("Cache-Control",r.join(",")),t.noCache&&s.forEachKey({"Surrogate-Control":"no-store",Pragma:"no-cache",ETag:"false",Expires:"0"},(e,t)=>this.res.setHeader(t,e)))}clearCookie(e,t){this.res.clearCookie(e,t)}close(e){this.isResponded()||this.res.json(null!=e?e:this.storage)}destroy(e){var t;e&&this.error(e),null===(t=this.res.socket)||void 0===t||t.destroy(e)}error(e){this.isResponded()||A.error(this.req,this.res,e)}file(e){this.isResponded()||(this.status(g.OK),this.res.sendFile(c.resolve(e)))}getBody(){var e,t;return null!==(t=null===(e=this.req)||void 0===e?void 0:e.body)&&void 0!==t?t:{}}getBodyValue(e){var t;return null===(t=this.req.body)||void 0===t?void 0:t[e]}getCookie(e){var t;return this.normalize(null===(t=this.req.cookies)||void 0===t?void 0:t[e])}getCookies(){var e,t;return s.map(null!==(t=null===(e=this.req)||void 0===e?void 0:e.cookies)&&void 0!==t?t:{},e=>this.normalize(e))}getFiles(){var e,t;return null!==(t=null===(e=this.req)||void 0===e?void 0:e.files)&&void 0!==t?t:{}}getFullUrl(){return`${this.getUrl()}${this.req.originalUrl}`}getHeader(e){var t;return this.normalize(null===(t=this.req.headers)||void 0===t?void 0:t[e])}getHeaders(){var e,t;return s.map(null!==(t=null===(e=this.req)||void 0===e?void 0:e.headers)&&void 0!==t?t:{},e=>this.normalize(e))}getIp(){return p.getClientIp(this.req)||"0.0.0.0"}getQuery(e){var t;return this.normalize(null===(t=this.req.query)||void 0===t?void 0:t[e])}getQueries(){var e,t;return s.map(null!==(t=null===(e=this.req)||void 0===e?void 0:e.query)&&void 0!==t?t:{},e=>this.normalize(e))}getParam(e){var t;const r=null===(t=this.req.params)||void 0===t?void 0:t[e];return s.isUndefined(r)?void 0:String(r)}getParams(){var e,t;return s.map(null!==(t=null===(e=this.req)||void 0===e?void 0:e.params)&&void 0!==t?t:{},e=>{if(!s.isUndefined(e)&&!s.isNull(e))return String(e)})}getUrl(){let e=this.getHeader("x-forwarded-proto")||this.req.protocol||"http";s.isString(e)&&e.includes(",")&&(e=e.split(",")[0].trim());const t=this.getHeader("cf-visitor");if(t){const r=s.parseJson(t);(null==r?void 0:r.scheme)&&(e=r.scheme)}return`${e}://${this.getHeader("host")}`}isResponded(){return this.res.headersSent||this.res.writableEnded}json(e){this.send(g.OK,e)}normalize(e){if(!s.isUndefined(e)&&!s.isNull(e))return s.isObject(e)?JSON.stringify(e):String(e)}ok(e,t){this.isResponded()||A.ok(this.res,e,t)}prepare(e,t){this.isResponded()||(this.status(e),this.storage=t)}redirect(e){this.isResponded()||this.res.redirect(e)}send(e,t){this.isResponded()||(this.status(e),204===e||304===e||s.isUndefined(t)?this.res.end():this.res.json(t))}setCookie(e,t,s){this.res.cookie(e,t,null!=s?s:{})}status(e){return s.isUndefined(e)||this.res.status(e),this.res.statusCode}success(e){this.send(g.OK,{message:e})}}class y{static extends(t){return e.metadata(y.EXTENDS,t,[])}static middleware(t){return e.metadata(y.MIDDLEWARE,t,[])}static parameters(t){return e.metadata(y.PARAMETERS,t,[])}static path(t,s){return e.metadata(y.PATH,t,s)}static routers(t){return e.metadata(y.ROUTERS,t,[])}}y.EXTENDS=Symbol("EXTENDS"),y.MIDDLEWARE=Symbol("MIDDLEWARE"),y.PARAMETERS=Symbol("PARAMETERS"),y.PATH=Symbol("PATH"),y.ROUTERS=Symbol("ROUTERS");class I extends s.EventEmitter{get controllers(){return[...this._controllers]}get instance(){return this._app}get router(){return this._globalRouter}get server(){return this._server}constructor(t,u){var d,h;super(),this._app=n(),this._boundServers=[],this._options={},this._baseRouter=n.Router(),this._globalRouter=n.Router(),this._controllers=[],this._controllers.push(...t.map(t=>s.isConstructor(t)?new t(...e.getInjectionArgs(t)):t)),this._options=s.merge({},{cross:!1,path:"/",port:3e3,session:{secret:"yoursecret",resave:!0,saveUninitialized:!1,cookie:{maxAge:864e5}}},null!=u?u:{}),this._app.use(n.json(this._options.json)),this._app.disable("x-powered-by"),this._options.proxy&&this._app.set("trust proxy",this._options.proxy),this._app.use(n.urlencoded({extended:!0})),this._options.cross&&this._app.use(i(s.isObject(this._options.cross)?this._options.cross:{})),this._app.use(r(this._options.compression)),this._app.use(o(null===(d=this._options.cookie)||void 0===d?void 0:d.secret,this._options.cookie)),this._app.use(a(this._options.session)),this.init(),this._app.use(this._globalRouter);const p=(null===(h=this._options.path)||void 0===h?void 0:h.length)?this._options.path:"/";if(this._app.use(p,this._baseRouter),this._app.all(p+"/*path",(e,t)=>{this._options.redirect?t.redirect(this._options.redirect):A.error(e,t,new S("Endpoint Not Found"))}),this._options.public){const e=c.resolve(this._options.public);l.existsSync(e)&&this._app.use(n.static(e)),this._app.get("*path",(t,s)=>{l.existsSync(e)?s.sendFile(e+"/index.html"):this._options.notfound?s.redirect(this._options.notfound):A.error(t,s,new S('FILE "index.html" Not Found'))})}else this._app.all("*path",(e,t)=>{this._options.redirect?t.redirect(this._options.redirect):A.error(e,t,new S("Endpoint not found"))});this._controllers.forEach(e=>{const t=n.Router(),r=this._collectMiddlewares(e),o=y.parameters(e);this._collectExtends(e).forEach(e=>{r.push(...this._collectMiddlewares(e)),o.push(...y.parameters(e))}),y.routers(e).forEach(i=>{const n=i.propertyKey.toString();if(s.isFunction(e[n])){if(!s.isFunction(t[i.method]))return this._logRouteNotFound(i.method);const a=this._buildMiddlewareChain(e,n,r,o);return t[i.method](i.path,...a,(t,r,i)=>T(this,void 0,void 0,function*(){const a=new x(t,r,i,this,e),l=this._resolveArgs(a,this._filterParamsByKey(n,o)),u=yield e[n](...l);a.close(s.isArray(u)||s.isObject(u)?u:void 0)}))}this._logRouteNotFound(`${e.name}.${n}`)}),this._collectExtends(e).forEach(i=>{y.routers(i).forEach(i=>{const n=i.propertyKey.toString();if(s.isFunction(e[n])){if(!s.isFunction(t[i.method]))return this._logRouteNotFound(i.method);const a=this._buildMiddlewareChain(e,n,r,o);return t[i.method](i.path,...a,(t,r,i)=>T(this,void 0,void 0,function*(){const a=new x(t,r,i,this,e),l=this._resolveArgs(a,this._filterParamsByKey(n,o)),u=yield e[n](...l);a.close(s.isArray(u)||s.isObject(u)?u:void 0)}))}this._logRouteNotFound(`${e.constructor.name}.${n}`)})}),this._baseRouter.use(y.path(e,"/"),t)})}init(){}error(e,s){t.Log.error(e)}log(e,s){t.Log.info(e)}_resolveArgs(e,t,s){const r=[],o={ctx:e,key:"",app:this,argument:s};return t.forEach(e=>{r[e.parameterIndex]=e.callback(Object.assign(Object.assign({},o),{key:e.key}))}),r}_buildMiddlewareChain(e,t,r,o){return r.filter(e=>e.propertyKey==t).map(t=>{if(t.callback!=s.noop){const r=this._filterParamsByKey(t.method,o);return(o,i,n)=>T(this,void 0,void 0,function*(){const a=new x(o,i,n,this,e),l=s.isFunction(t.argument)?t.argument(a):t.argument,u=yield t.callback.call(e,...this._resolveArgs(a,r,l));(s.isArray(u)||s.isObject(u))&&a.close(u)})}this._logRouteNotFound(t.method)}).filter(s.isFunction)}_collectExtends(e){return y.extends(e).reduce((e,t)=>(e.push(t,...this._collectExtends(t)),e),[]).filter((e,t,s)=>s.indexOf(e)===t)}_filterParamsByKey(e,t){return t.filter(t=>t.propertyKey==e)}_collectMiddlewares(e){return[...y.middleware(e)].reverse()}_logRouteNotFound(e){this.error(new Error(`Router "${e}" not found`),"express")}_formatListeningMessage(e){return`Server listening on port ${e}`}listen(){return T(this,void 0,void 0,function*(){var e;const t=this._resolveMode(),s={http:this._startHttp,https:this._startHttps,hybrid:this._startHybrid,redirect:this._startHttpsWithRedirect};yield(null!==(e=s[t])&&void 0!==e?e:this._startHttp).call(this)})}close(){return T(this,void 0,void 0,function*(){yield Promise.all(this._boundServers.map(e=>new Promise((t,s)=>{e.close(e=>e?s(e):t())}))),this._boundServers.length=0,this._server=void 0})}_resolveMode(){return this._resolveTls()&&this._options.mode?this._options.mode:"http"}_resolveTls(){if(this._options.tls&&this._options.tls.key&&this._options.tls.cert)return this._options.tls}_bindServer(e,t,s){return new Promise((r,o)=>{const i=t=>{e.off("listening",n),o(t)},n=()=>{e.off("error",i),this.log(this._formatListeningMessage(t),"express"),r()};e.once("error",i),e.once("listening",n),e.listen(t,s)})}_startHttp(){return T(this,void 0,void 0,function*(){var e;const t=v.createServer(this._app);this._server=t,this._boundServers.push(t),yield this._bindServer(t,null!==(e=this._options.port)&&void 0!==e?e:3e3,this._options.host)})}_startHttps(){return T(this,void 0,void 0,function*(){var e;const t=R.createServer(this._resolveTls(),this._app);this._server=t,this._boundServers.push(t),yield this._bindServer(t,null!==(e=this._options.port)&&void 0!==e?e:443,this._options.host)})}_startHttpsWithRedirect(){return T(this,void 0,void 0,function*(){var e,t;const s=R.createServer(this._resolveTls(),this._app),r=v.createServer((e,t)=>{var s,r;const o=(null!==(s=e.headers.host)&&void 0!==s?s:"").split(":")[0];t.writeHead(g.MOVED_PERMANENTLY,{Location:`https://${o}${null!==(r=e.url)&&void 0!==r?r:""}`}),t.end()});this._server=s,this._boundServers.push(s,r),yield Promise.all([this._bindServer(s,null!==(e=this._options.port)&&void 0!==e?e:443,this._options.host),this._bindServer(r,null!==(t=this._options.redirectPort)&&void 0!==t?t:80,this._options.host)])})}_startHybrid(){return T(this,void 0,void 0,function*(){var e;const t=v.createServer(this._app),s=R.createServer(this._resolveTls(),this._app),r=m.createServer(e=>{const r=setTimeout(()=>e.destroy(),5e3);e.once("data",o=>{clearTimeout(r),e.pause(),e.unshift(o),(22===o[0]?s:t).emit("connection",e),process.nextTick(()=>e.resume())}),e.once("error",()=>clearTimeout(r))});return this._server=s,this._boundServers.push(r,s,t),yield this._bindServer(r,null!==(e=this._options.port)&&void 0!==e?e:443,this._options.host),s})}}const C=e=>t=>(s,r,o)=>{y.parameters(s).push({callback:e,key:t,propertyKey:r,parameterIndex:o})},b=C(({app:e})=>e),D=C(({argument:e})=>e),P=C(({ctx:e,key:t})=>t?e.getBodyValue(t):e.getBody()),U=C(({ctx:e,key:t})=>t?e.getCookie(t):e.getCookies()),L=C(({ctx:e})=>e),F=C(({ctx:e})=>e.getFiles()),M=C(({ctx:e,key:t})=>t?e.getHeader(t):e.getHeaders()),q=C(({ctx:e,key:t})=>t?e.getParam(t):e.getParams()),k=C(({ctx:e,key:t})=>t?e.getQuery(t):e.getQueries()),w=C(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.session}),H=(e,t)=>(r,o)=>{const i=s.uuidv7();L()(r,i,0),y.middleware(r).push({method:i,argument:t,propertyKey:o,callback:e})},j={ALL:"all",GET:"get",POST:"post",PUT:"put",HEAD:"head",DELETE:"delete",OPTIONS:"options",PATCH:"patch"},B=e=>t=>(s,r)=>{y.routers(s).push({method:e,path:(null==t?void 0:t.length)?t:"/",propertyKey:r})},V=B(j.ALL),K=B(j.DELETE),G=B(j.GET),Q=B(j.HEAD),$=B(j.OPTIONS),z=B(j.PATCH),Y=B(j.POST),W=B(j.PUT),X=e=>{var t;return(null===(t=e.split(".").pop())||void 0===t?void 0:t.toLowerCase())||"bin"},Z=(e,t)=>{var s;return null!==(s=e[t])&&void 0!==s?s:null},J=(e,t)=>{const r=s.uuidv7()+"."+t;return l.existsSync(c.join(e,r))?J(e,t):r};exports.All=V,exports.App=b,exports.Application=I,exports.Argument=D,exports.BadRequestError=class extends N{constructor(e="Bad Request"){super(e,g.BAD_REQUEST)}},exports.Body=P,exports.Cache=e=>(t,s,r)=>{H(t=>{t.cache(Object.assign({},e)),t.next()})(t,s,r)},exports.Context=x,exports.Controller=e=>t=>{y.path(t,(null==e?void 0:e.length)?e:"/")},exports.Cookies=U,exports.Ctx=L,exports.Delete=K,exports.Extends=e=>t=>{y.extends(t).push(e)},exports.Files=F,exports.ForbiddenError=class extends N{constructor(e="Forbidden"){super(e,g.FORBIDDEN)}},exports.Get=G,exports.Head=Q,exports.Headers=M,exports.HttpResponse=A,exports.InternalServerError=class extends N{constructor(e="Internal server error"){super(e,g.INTERNAL_SERVER_ERROR)}},exports.Metadata=y,exports.Methods=j,exports.Middleware=(e,t)=>(r,o)=>{let i=s.noop;if(s.isString(o)){const t=r;s.isFunction(t[e])&&(i=t[e])}y.middleware(r).push({method:e,argument:t,propertyKey:o,callback:i})},exports.NotFoundError=S,exports.Options=$,exports.Params=q,exports.Patch=z,exports.Post=Y,exports.Put=W,exports.Query=k,exports.ResponseError=N,exports.Session=w,exports.StatusCodes=g,exports.StatusText=O,exports.UnauthorizedError=class extends N{constructor(e="Unauthorized"){super(e,g.UNAUTHORIZED)}},exports.Upload=e=>{const t=s.merge({},e),r=E.diskStorage({destination(e,s,r){var o;const i=Z(t,s.fieldname);r(null,null!==(o=null==i?void 0:i.path)&&void 0!==o?o:"./")},filename(e,s,r){var o;const i=Z(t,s.fieldname);r(null,J(null!==(o=null==i?void 0:i.path)&&void 0!==o?o:"./",X(s.originalname)))}}),o=Math.max(...Object.values(t).map(e=>{var t;return null!==(t=e.size)&&void 0!==t?t:0})),i=E({storage:r,fileFilter(e,s,r){var o;const i=Z(t,s.fieldname);return i?((e,t)=>!t.length||t.includes(X(e.originalname))||t.includes(e.mimetype.toLowerCase()))(s,null!==(o=null==i?void 0:i.types)&&void 0!==o?o:[])?void r(null,!0):r(new Error(`FILE TYPE NOT ALLOWED FOR "${s.fieldname}"`)):r(new Error(`UPLOAD FIELD "${s.fieldname}" IS NOT CONFIGURED`))},limits:{fileSize:1024*o*1024}}).fields(Object.keys(t).map(e=>{var s,r;return{name:e,maxCount:null!==(r=null===(s=t[e])||void 0===s?void 0:s.count)&&void 0!==r?r:1}}));return(e,t,s)=>{H(e=>{i(e.req,e.res,t=>{if(!t)return e.next();"LIMIT_UNEXPECTED_FILE"==t.code&&(t.message=`FIELD "${t.field}" EXCEEDS MAX SIZE`),e.destroy(t)})})(e,t,s)}},exports.Use=H,exports.Validate=e=>{const t=s.Validation.object(s.isFunction(e)?e(s.Validation):e).parse();return(e,s,r)=>{H(e=>T(void 0,void 0,void 0,function*(){var s,r;const{error:o,message:i,value:n}=yield t.validateAsync(null!==(r=null===(s=e.req)||void 0===s?void 0:s.body)&&void 0!==r?r:{});if(o)return e.error(new f(null!=i?i:o));e.req.body=n,e.next()}))(e,s,r)}},exports.ValidationError=f,exports.methodFactory=B,exports.parameterFactory=C;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/express v2.2.
|
|
2
|
+
* @andrewcaires/express v2.2.1
|
|
3
3
|
* Decorators for express
|
|
4
4
|
* (c) 2026 Andrew Caires
|
|
5
5
|
* @license: MIT
|
|
@@ -31,7 +31,7 @@ interface ExpressOptions {
|
|
|
31
31
|
cookie?: ICookie;
|
|
32
32
|
cross?: boolean | CorsOptions;
|
|
33
33
|
host?: string;
|
|
34
|
-
|
|
34
|
+
proxy?: boolean | number;
|
|
35
35
|
json?: OptionsJson;
|
|
36
36
|
mode?: ServerMode;
|
|
37
37
|
notfound?: string;
|
|
@@ -75,6 +75,7 @@ declare class Context<T = any, A extends Application = Application> {
|
|
|
75
75
|
getCookie(key: string): string | undefined;
|
|
76
76
|
getCookies<T = TypeAnyObject>(): T;
|
|
77
77
|
getFiles<F extends FileUpload = FileUpload, T = TypeObject<Array<F>>>(): T;
|
|
78
|
+
getFullUrl(): string;
|
|
78
79
|
getHeader(key: string): string | undefined;
|
|
79
80
|
getHeaders<T = TypeAnyObject>(): T;
|
|
80
81
|
getIp(): string;
|
|
@@ -88,6 +89,7 @@ declare class Context<T = any, A extends Application = Application> {
|
|
|
88
89
|
private normalize;
|
|
89
90
|
ok<T = any>(data: T, meta?: TypeAnyObject): void;
|
|
90
91
|
prepare(status: number, value: TypeAnyObject | Array<TypeAnyObject>): void;
|
|
92
|
+
redirect(url: string): void;
|
|
91
93
|
send(status: number, value?: TypeAnyObject | Array<TypeAnyObject>): void;
|
|
92
94
|
setCookie(key: string, value: string, options?: CookieOptions): void;
|
|
93
95
|
status(value?: number): number;
|
package/dist/index.esm.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/express v2.2.
|
|
2
|
+
* @andrewcaires/express v2.2.1
|
|
3
3
|
* Decorators for express
|
|
4
4
|
* (c) 2026 Andrew Caires
|
|
5
5
|
* @license: MIT
|
|
6
6
|
*/
|
|
7
|
-
import{metadata as e,getInjectionArgs as t}from"@andrewcaires/decorator";import{Log as s}from"@andrewcaires/node";import{isNumber as r,isString as o,isObject as i,uuidv7 as n,forEachKey as a,map as l,isUndefined as u,isNull as d,EventEmitter as h,isConstructor as c,merge as p,isFunction as E,noop as _,isArray as v,Validation as m}from"@andrewcaires/utils.js";import R from"compression";import T from"cookie-parser";import g from"cors";import N,{Router as O,json as S,urlencoded as f}from"express";import A from"express-session";import{existsSync as I}from"fs";import*as y from"http";import*as D from"https";import*as C from"net";import{resolve as P,join as L}from"path";import{getClientIp as b}from"request-ip";import U,{diskStorage as x}from"multer";function M(e,t,s,r){return new(s||(s=Promise))(function(o,i){function n(e){try{l(r.next(e))}catch(e){i(e)}}function a(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof s?t:new s(function(e){e(t)})).then(n,a)}l((r=r.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;class F{}F.CONTINUE=100,F.SWITCHING_PROTOCOLS=101,F.PROCESSING=102,F.OK=200,F.CREATED=201,F.ACCEPTED=202,F.NON_AUTHORITATIVE_INFORMATION=203,F.NO_CONTENT=204,F.RESET_CONTENT=205,F.PARTIAL_CONTENT=206,F.MULTI_STATUS=207,F.ALREADY_REPORTED=208,F.IM_USED=226,F.MULTIPLE_CHOICES=300,F.MOVED_PERMANENTLY=301,F.FOUND=302,F.SEE_OTHER=303,F.NOT_MODIFIED=304,F.USE_PROXY=305,F.TEMPORARY_REDIRECT=307,F.PERMANENT_REDIRECT=308,F.BAD_REQUEST=400,F.UNAUTHORIZED=401,F.PAYMENT_REQUIRED=402,F.FORBIDDEN=403,F.NOT_FOUND=404,F.METHOD_NOT_ALLOWED=405,F.NOT_ACCEPTABLE=406,F.PROXY_AUTHENTICATION_REQUIRED=407,F.REQUEST_TIMEOUT=408,F.CONFLICT=409,F.GONE=410,F.LENGTH_REQUIRED=411,F.PRECONDITION_FAILED=412,F.PAYLOAD_TOO_LARGE=413,F.REQUEST_URI_TOO_LONG=414,F.UNSUPPORTED_MEDIA_TYPE=415,F.REQUESTED_RANGE_NOT_SATISFIABLE=416,F.EXPECTATION_FAILED=417,F.IM_A_TEAPOT=418,F.MISDIRECTED_REQUEST=421,F.UNPROCESSABLE_ENTITY=422,F.LOCKED=423,F.FAILED_DEPENDENCY=424,F.UPGRADE_REQUIRED=426,F.PRECONDITION_REQUIRED=428,F.TOO_MANY_REQUESTS=429,F.REQUEST_HEADER_FIELDS_TOO_LARGE=431,F.CONNECTION_CLOSED_WITHOUT_RESPONSE=444,F.UNAVAILABLE_FOR_LEGAL_REASONS=451,F.CLIENT_CLOSED_REQUEST=499,F.INTERNAL_SERVER_ERROR=500,F.NOT_IMPLEMENTED=501,F.BAD_GATEWAY=502,F.SERVICE_UNAVAILABLE=503,F.GATEWAY_TIMEOUT=504,F.HTTP_VERSION_NOT_SUPPORTED=505,F.VARIANT_ALSO_NEGOCIATES=506,F.INSUFFICIENT_STORAGE=507,F.LOOP_DETECTED=508,F.NOT_EXTENDED=510,F.NETWORK_AUTHENTICATION_REQUIRED=511,F.NETWORK_CONNECTION_TIMEOUT_ERROR=599;class k{}k[100]="Continue",k[101]="Switching Protocols",k[102]="Processing",k[200]="OK",k[201]="Created",k[202]="Accepted",k[203]="Non-Authoritative Information",k[204]="No Content",k[205]="Reset Content",k[206]="Partial Content",k[207]="Multi-Status",k[226]="IM Used",k[300]="Multiple Choices",k[301]="Moved Permanently",k[302]="Found",k[303]="See Other",k[304]="Not Modified",k[305]="Use Proxy",k[307]="Temporary Redirect",k[308]="Permanent Redirect",k[400]="Bad Request",k[401]="Unauthorized",k[402]="Payment Required",k[403]="Forbidden",k[404]="Not Found",k[405]="Method Not Allowed",k[406]="Not Acceptable",k[407]="Proxy Authentication Required",k[408]="Request Timeout",k[409]="Conflict",k[410]="Gone",k[411]="Length Required",k[412]="Precondition Failed",k[413]="Payload Too Large",k[414]="URI Too Long",k[415]="Unsupported Media Type",k[416]="Range Not Satisfiable",k[417]="Expectation Failed",k[418]="I'm a teapot",k[422]="Unprocessable Entity",k[423]="Locked",k[424]="Failed Dependency",k[426]="Upgrade Required",k[428]="Precondition Required",k[429]="Too Many Requests",k[431]="Request Header Fields Too Large",k[451]="Unavailable For Legal Reasons",k[500]="Internal Server Error",k[501]="Not Implemented",k[502]="Bad Gateway",k[503]="Service Unavailable",k[504]="Gateway Time-out",k[505]="HTTP Version Not Supported",k[506]="Variant Also Negotiates",k[507]="Insufficient Storage",k[511]="Network Authentication Required";class w extends Error{constructor(e,t=F.INTERNAL_SERVER_ERROR){super(e),this.status=t}}class H extends w{constructor(e="Bad Request"){super(e,F.BAD_REQUEST)}}class q extends w{constructor(e="Forbidden"){super(e,F.FORBIDDEN)}}class B extends w{constructor(e="Internal server error"){super(e,F.INTERNAL_SERVER_ERROR)}}class K extends w{constructor(e="Not Found"){super(e,F.NOT_FOUND)}}class G extends w{constructor(e="Unauthorized"){super(e,F.UNAUTHORIZED)}}class Q extends w{constructor(e){super(e,F.UNPROCESSABLE_ENTITY)}}class V{static created(e,t,s){var r,o;const i=F.CREATED,n={success:!0,status:i,data:t?{id:t}:{},meta:null!==(r=null==s?void 0:s.meta)&&void 0!==r?r:{},message:null!==(o=null==s?void 0:s.message)&&void 0!==o?o:null};return e.status(i).json(n),n}static noContent(e){e.status(F.NO_CONTENT).end()}static ok(e,t,s){var r,o;const i=F.OK,n={success:!0,status:i,data:t,meta:null!==(r=null==s?void 0:s.meta)&&void 0!==r?r:{},message:null!==(o=null==s?void 0:s.message)&&void 0!==o?o:null};return e.status(i).json(n),n}static error(e,t,s){var r,o;const{status:i,message:n}=this.normalizeError(s),a=Object.assign({success:!1,status:i,error:null!==(r=null==k?void 0:k[i])&&void 0!==r?r:"Internal Server Error",message:n,path:null!==(o=e.originalUrl)&&void 0!==o?o:e.url,timestamp:(new Date).toISOString()},this.isDev()&&s instanceof Error&&s.stack?{stack:s.stack}:{});return t.status(i).json(a),a}static isDev(){return"production"!==process.env.NODE_ENV}static normalizeError(e){let t=F.INTERNAL_SERVER_ERROR,s=k[500];if(e instanceof w)return t=this.safeStatus(e.status),s=this.safeMessage(e.message)||s,{status:t,message:s};if(e instanceof Error){const o=e;return r(o.statusCode)?t=this.safeStatus(o.statusCode):r(o.status)&&(t=this.safeStatus(o.status)),s=this.safeMessage(e.message)||s,{status:t,message:s}}if(o(e))return s=this.safeMessage(e)||s,{status:t,message:s};if(e&&i(e)){const i=e;return r(i.statusCode)?t=this.safeStatus(i.statusCode):r(i.status)&&(t=this.safeStatus(i.status)),o(i.message)&&(s=this.safeMessage(i.message)||s),{status:t,message:s}}return{status:t,message:s}}static safeStatus(e){if(!Number.isFinite(e))return F.INTERNAL_SERVER_ERROR;const t=Math.trunc(e);return t<400||t>599?F.INTERNAL_SERVER_ERROR:t}static safeMessage(e){if(!o(e))return"";const t=e.trim();return t.length>2e3?t.slice(0,2e3)+"...":t}}class ${constructor(e,t,s,r,o){this.storage={},this.req=e,this.res=t,this.next=s,this.id=n(),this.app=r,this.controller=o}cache(e){const t=Object.assign({},e),s=[];t.private?s.push("private"):t.public&&s.push("public"),t.noStore&&(t.noCache=!0,s.push("no-store")),t.noCache&&(t.maxAge=0,delete t.sMaxAge,s.push("no-cache")),t.noTransform&&s.push("no-transform"),t.proxyRevalidate&&s.push("proxy-revalidate"),t.mustRevalidate?s.push("must-revalidate"):t.noCache||(r(t.staleIfError)&&s.push(`stale-if-error=${t.staleIfError}`),r(t.staleWhileRevalidate)&&s.push(`stale-while-revalidate=${t.staleWhileRevalidate}`)),r(t.maxAge)&&s.push(`max-age=${t.maxAge}`),r(t.sMaxAge)&&s.push(`s-maxage=${t.sMaxAge}`),s.length&&(this.res.setHeader("Cache-Control",s.join(",")),t.noCache&&a({"Surrogate-Control":"no-store",Pragma:"no-cache",ETag:"false",Expires:"0"},(e,t)=>this.res.setHeader(t,e)))}clearCookie(e,t){this.res.clearCookie(e,t)}close(e){this.isResponded()||this.res.json(null!=e?e:this.storage)}destroy(e){var t;e&&this.error(e),null===(t=this.res.socket)||void 0===t||t.destroy(e)}error(e){this.isResponded()||V.error(this.req,this.res,e)}file(e){this.isResponded()||(this.status(F.OK),this.res.sendFile(P(e)))}getBody(){var e,t;return null!==(t=null===(e=this.req)||void 0===e?void 0:e.body)&&void 0!==t?t:{}}getBodyValue(e){var t;return null===(t=this.req.body)||void 0===t?void 0:t[e]}getCookie(e){var t;return this.normalize(null===(t=this.req.cookies)||void 0===t?void 0:t[e])}getCookies(){var e,t;return l(null!==(t=null===(e=this.req)||void 0===e?void 0:e.cookies)&&void 0!==t?t:{},e=>this.normalize(e))}getFiles(){var e,t;return null!==(t=null===(e=this.req)||void 0===e?void 0:e.files)&&void 0!==t?t:{}}getHeader(e){var t;return this.normalize(null===(t=this.req.headers)||void 0===t?void 0:t[e])}getHeaders(){var e,t;return l(null!==(t=null===(e=this.req)||void 0===e?void 0:e.headers)&&void 0!==t?t:{},e=>this.normalize(e))}getIp(){return b(this.req)||"0.0.0.0"}getQuery(e){var t;return this.normalize(null===(t=this.req.query)||void 0===t?void 0:t[e])}getQueries(){var e,t;return l(null!==(t=null===(e=this.req)||void 0===e?void 0:e.query)&&void 0!==t?t:{},e=>this.normalize(e))}getParam(e){var t;const s=null===(t=this.req.params)||void 0===t?void 0:t[e];return u(s)?void 0:String(s)}getParams(){var e,t;return l(null!==(t=null===(e=this.req)||void 0===e?void 0:e.params)&&void 0!==t?t:{},e=>{if(!u(e)&&!d(e))return String(e)})}getUrl(){return`${this.req.protocol}://${this.req.get("host")}${this.req.originalUrl}`}isResponded(){return this.res.headersSent||this.res.writableEnded}json(e){this.send(F.OK,e)}normalize(e){if(!u(e)&&!d(e))return i(e)?JSON.stringify(e):String(e)}ok(e,t){this.isResponded()||V.ok(this.res,e,t)}prepare(e,t){this.isResponded()||(this.status(e),this.storage=t)}send(e,t){this.isResponded()||(this.status(e),204===e||304===e||u(t)?this.res.end():this.res.json(t))}setCookie(e,t,s){this.res.cookie(e,t,null!=s?s:{})}status(e){return u(e)||this.res.status(e),this.res.statusCode}success(e){this.send(F.OK,{message:e})}}class j{static extends(t){return e(j.EXTENDS,t,[])}static middleware(t){return e(j.MIDDLEWARE,t,[])}static parameters(t){return e(j.PARAMETERS,t,[])}static path(t,s){return e(j.PATH,t,s)}static routers(t){return e(j.ROUTERS,t,[])}}j.EXTENDS=Symbol("EXTENDS"),j.MIDDLEWARE=Symbol("MIDDLEWARE"),j.PARAMETERS=Symbol("PARAMETERS"),j.PATH=Symbol("PATH"),j.ROUTERS=Symbol("ROUTERS");class Y extends h{get controllers(){return[...this._controllers]}get instance(){return this._app}get router(){return this._globalRouter}get server(){return this._server}constructor(e,s){var r,o;super(),this._app=N(),this._boundServers=[],this._options={},this._baseRouter=O(),this._globalRouter=O(),this._controllers=[],this._controllers.push(...e.map(e=>c(e)?new e(...t(e)):e)),this._options=p({},{cross:!1,hybrid:!1,path:"/",port:3e3,session:{secret:"yoursecret",resave:!0,saveUninitialized:!1,cookie:{maxAge:864e5}}},null!=s?s:{}),this._app.use(S(this._options.json)),this._app.disable("x-powered-by"),this._app.use(f({extended:!0})),this._options.cross&&this._app.use(g(i(this._options.cross)?this._options.cross:{})),this._app.use(R(this._options.compression)),this._app.use(T(null===(r=this._options.cookie)||void 0===r?void 0:r.secret,this._options.cookie)),this._app.use(A(this._options.session)),this.init(),this._app.use(this._globalRouter);const n=(null===(o=this._options.path)||void 0===o?void 0:o.length)?this._options.path:"/";if(this._app.use(n,this._baseRouter),this._app.all(n+"/*path",(e,t)=>{this._options.redirect?t.redirect(this._options.redirect):V.error(e,t,new K("Endpoint Not Found"))}),this._options.public){const e=P(this._options.public);I(e)&&this._app.use(N.static(e)),this._app.get("*path",(t,s)=>{I(e)?s.sendFile(e+"/index.html"):this._options.notfound?s.redirect(this._options.notfound):V.error(t,s,new K('FILE "index.html" Not Found'))})}else this._app.all("*path",(e,t)=>{this._options.redirect?t.redirect(this._options.redirect):V.error(e,t,new K("Endpoint not found"))});this._controllers.forEach(e=>{const t=O(),s=this._collectMiddlewares(e),r=j.parameters(e);this._collectExtends(e).forEach(e=>{s.push(...this._collectMiddlewares(e)),r.push(...j.parameters(e))}),j.routers(e).forEach(o=>{const n=o.propertyKey.toString();if(E(e[n])){if(!E(t[o.method]))return this._logRouteNotFound(o.method);const a=this._buildMiddlewareChain(e,n,s,r);return t[o.method](o.path,...a,(t,s,o)=>M(this,void 0,void 0,function*(){const a=new $(t,s,o,this,e),l=this._resolveArgs(a,this._filterParamsByKey(n,r)),u=yield e[n](...l);a.close(v(u)||i(u)?u:void 0)}))}this._logRouteNotFound(`${e.name}.${n}`)}),this._collectExtends(e).forEach(o=>{j.routers(o).forEach(o=>{const n=o.propertyKey.toString();if(E(e[n])){if(!E(t[o.method]))return this._logRouteNotFound(o.method);const a=this._buildMiddlewareChain(e,n,s,r);return t[o.method](o.path,...a,(t,s,o)=>M(this,void 0,void 0,function*(){const a=new $(t,s,o,this,e),l=this._resolveArgs(a,this._filterParamsByKey(n,r)),u=yield e[n](...l);a.close(v(u)||i(u)?u:void 0)}))}this._logRouteNotFound(`${e.constructor.name}.${n}`)})}),this._baseRouter.use(j.path(e,"/"),t)})}init(){}error(e,t){s.error(e)}log(e,t){s.info(e)}_resolveArgs(e,t,s){const r=[],o={ctx:e,key:"",app:this,argument:s};return t.forEach(e=>{r[e.parameterIndex]=e.callback(Object.assign(Object.assign({},o),{key:e.key}))}),r}_buildMiddlewareChain(e,t,s,r){return s.filter(e=>e.propertyKey==t).map(t=>{if(t.callback!=_){const s=this._filterParamsByKey(t.method,r);return(r,o,n)=>M(this,void 0,void 0,function*(){const a=new $(r,o,n,this,e),l=E(t.argument)?t.argument(a):t.argument,u=yield t.callback.call(e,...this._resolveArgs(a,s,l));(v(u)||i(u))&&a.close(u)})}this._logRouteNotFound(t.method)}).filter(E)}_collectExtends(e){return j.extends(e).reduce((e,t)=>(e.push(t,...this._collectExtends(t)),e),[]).filter((e,t,s)=>s.indexOf(e)===t)}_filterParamsByKey(e,t){return t.filter(t=>t.propertyKey==e)}_collectMiddlewares(e){return[...j.middleware(e)].reverse()}_logRouteNotFound(e){this.error(new Error(`Router "${e}" not found`),"express")}_formatListeningMessage(e){return`Server listening on port ${e}`}listen(){return M(this,void 0,void 0,function*(){var e;const t=this._resolveMode(),s={http:this._startHttp,https:this._startHttps,hybrid:this._startHybrid,redirect:this._startHttpsWithRedirect};yield(null!==(e=s[t])&&void 0!==e?e:this._startHttp).call(this)})}close(){return M(this,void 0,void 0,function*(){yield Promise.all(this._boundServers.map(e=>new Promise((t,s)=>{e.close(e=>e?s(e):t())}))),this._boundServers.length=0,this._server=void 0})}_resolveMode(){return this._resolveTls()?this._options.mode?this._options.mode:this._options.hybrid?"hybrid":"https":"http"}_resolveTls(){if(this._options.tls&&this._options.tls.key&&this._options.tls.cert)return this._options.tls}_bindServer(e,t,s){return new Promise((r,o)=>{const i=t=>{e.off("listening",n),o(t)},n=()=>{e.off("error",i),this.log(this._formatListeningMessage(t),"express"),r()};e.once("error",i),e.once("listening",n),e.listen(t,s)})}_startHttp(){return M(this,void 0,void 0,function*(){var e;const t=y.createServer(this._app);this._server=t,this._boundServers.push(t),yield this._bindServer(t,null!==(e=this._options.port)&&void 0!==e?e:3e3,this._options.host)})}_startHttps(){return M(this,void 0,void 0,function*(){var e;const t=D.createServer(this._resolveTls(),this._app);this._server=t,this._boundServers.push(t),yield this._bindServer(t,null!==(e=this._options.port)&&void 0!==e?e:443,this._options.host)})}_startHttpsWithRedirect(){return M(this,void 0,void 0,function*(){var e,t;const s=D.createServer(this._resolveTls(),this._app),r=y.createServer((e,t)=>{var s,r;const o=(null!==(s=e.headers.host)&&void 0!==s?s:"").split(":")[0];t.writeHead(F.MOVED_PERMANENTLY,{Location:`https://${o}${null!==(r=e.url)&&void 0!==r?r:""}`}),t.end()});this._server=s,this._boundServers.push(s,r),yield Promise.all([this._bindServer(s,null!==(e=this._options.port)&&void 0!==e?e:443,this._options.host),this._bindServer(r,null!==(t=this._options.redirectPort)&&void 0!==t?t:80,this._options.host)])})}_startHybrid(){return M(this,void 0,void 0,function*(){var e;const t=y.createServer(this._app),s=D.createServer(this._resolveTls(),this._app),r=C.createServer(e=>{const r=setTimeout(()=>e.destroy(),5e3);e.once("data",o=>{clearTimeout(r),e.pause(),e.unshift(o),(22===o[0]?s:t).emit("connection",e),process.nextTick(()=>e.resume())}),e.once("error",()=>clearTimeout(r))});return this._server=s,this._boundServers.push(r,s,t),yield this._bindServer(r,null!==(e=this._options.port)&&void 0!==e?e:443,this._options.host),s})}}const W=e=>t=>{j.path(t,(null==e?void 0:e.length)?e:"/")},z=e=>t=>{j.extends(t).push(e)},X=e=>t=>(s,r,o)=>{j.parameters(s).push({callback:e,key:t,propertyKey:r,parameterIndex:o})},Z=X(({app:e})=>e),J=X(({argument:e})=>e),ee=X(({ctx:e,key:t})=>t?e.getBodyValue(t):e.getBody()),te=X(({ctx:e,key:t})=>t?e.getCookie(t):e.getCookies()),se=X(({ctx:e})=>e),re=X(({ctx:e})=>e.getFiles()),oe=X(({ctx:e,key:t})=>t?e.getHeader(t):e.getHeaders()),ie=X(({ctx:e,key:t})=>t?e.getParam(t):e.getParams()),ne=X(({ctx:e,key:t})=>t?e.getQuery(t):e.getQueries()),ae=X(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.session}),le=(e,t)=>(s,r)=>{const o=n();se()(s,o,0),j.middleware(s).push({method:o,argument:t,propertyKey:r,callback:e})},ue=e=>(t,s,r)=>{le(t=>{t.cache(Object.assign({},e)),t.next()})(t,s,r)},de={ALL:"all",GET:"get",POST:"post",PUT:"put",HEAD:"head",DELETE:"delete",OPTIONS:"options",PATCH:"patch"},he=e=>t=>(s,r)=>{j.routers(s).push({method:e,path:(null==t?void 0:t.length)?t:"/",propertyKey:r})},ce=he(de.ALL),pe=he(de.DELETE),Ee=he(de.GET),_e=he(de.HEAD),ve=he(de.OPTIONS),me=he(de.PATCH),Re=he(de.POST),Te=he(de.PUT),ge=(e,t)=>(s,r)=>{let i=_;if(o(r)){const t=s;E(t[e])&&(i=t[e])}j.middleware(s).push({method:e,argument:t,propertyKey:r,callback:i})},Ne=e=>{var t;return(null===(t=e.split(".").pop())||void 0===t?void 0:t.toLowerCase())||"bin"},Oe=(e,t)=>{var s;return null!==(s=e[t])&&void 0!==s?s:null},Se=(e,t)=>{const s=n()+"."+t;return I(L(e,s))?Se(e,t):s},fe=e=>{const t=p({},e),s=x({destination(e,s,r){var o;const i=Oe(t,s.fieldname);r(null,null!==(o=null==i?void 0:i.path)&&void 0!==o?o:"./")},filename(e,s,r){var o;const i=Oe(t,s.fieldname);r(null,Se(null!==(o=null==i?void 0:i.path)&&void 0!==o?o:"./",Ne(s.originalname)))}}),r=Math.max(...Object.values(t).map(e=>{var t;return null!==(t=e.size)&&void 0!==t?t:0})),o=U({storage:s,fileFilter(e,s,r){var o;const i=Oe(t,s.fieldname);return i?((e,t)=>!t.length||t.includes(Ne(e.originalname))||t.includes(e.mimetype.toLowerCase()))(s,null!==(o=null==i?void 0:i.types)&&void 0!==o?o:[])?void r(null,!0):r(new Error(`FILE TYPE NOT ALLOWED FOR "${s.fieldname}"`)):r(new Error(`UPLOAD FIELD "${s.fieldname}" IS NOT CONFIGURED`))},limits:{fileSize:1024*r*1024}}).fields(Object.keys(t).map(e=>{var s,r;return{name:e,maxCount:null!==(r=null===(s=t[e])||void 0===s?void 0:s.count)&&void 0!==r?r:1}}));return(e,t,s)=>{le(e=>{o(e.req,e.res,t=>{if(!t)return e.next();"LIMIT_UNEXPECTED_FILE"==t.code&&(t.message=`FIELD "${t.field}" EXCEEDS MAX SIZE`),e.destroy(t)})})(e,t,s)}},Ae=e=>{const t=m.object(E(e)?e(m):e).parse();return(e,s,r)=>{le(e=>M(void 0,void 0,void 0,function*(){var s,r;const{error:o,message:i,value:n}=yield t.validateAsync(null!==(r=null===(s=e.req)||void 0===s?void 0:s.body)&&void 0!==r?r:{});if(o)return e.error(new Q(null!=i?i:o));e.req.body=n,e.next()}))(e,s,r)}};export{ce as All,Z as App,Y as Application,J as Argument,H as BadRequestError,ee as Body,ue as Cache,$ as Context,W as Controller,te as Cookies,se as Ctx,pe as Delete,z as Extends,re as Files,q as ForbiddenError,Ee as Get,_e as Head,oe as Headers,V as HttpResponse,B as InternalServerError,j as Metadata,de as Methods,ge as Middleware,K as NotFoundError,ve as Options,ie as Params,me as Patch,Re as Post,Te as Put,ne as Query,w as ResponseError,ae as Session,F as StatusCodes,k as StatusText,G as UnauthorizedError,fe as Upload,le as Use,Ae as Validate,Q as ValidationError,he as methodFactory,X as parameterFactory};
|
|
7
|
+
import{metadata as e,getInjectionArgs as t}from"@andrewcaires/decorator";import{Log as s}from"@andrewcaires/node";import{isNumber as r,isString as o,isObject as i,uuidv7 as n,forEachKey as a,map as l,isUndefined as u,isNull as d,parseJson as h,EventEmitter as c,isConstructor as p,merge as E,isFunction as _,noop as v,isArray as m,Validation as R}from"@andrewcaires/utils.js";import T from"compression";import g from"cookie-parser";import N from"cors";import O,{Router as f,json as S,urlencoded as A}from"express";import I from"express-session";import{existsSync as y}from"fs";import*as D from"http";import*as C from"https";import*as P from"net";import{resolve as L,join as U}from"path";import{getClientIp as b}from"request-ip";import x,{diskStorage as M}from"multer";function F(e,t,s,r){return new(s||(s=Promise))(function(o,i){function n(e){try{l(r.next(e))}catch(e){i(e)}}function a(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof s?t:new s(function(e){e(t)})).then(n,a)}l((r=r.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;class w{}w.CONTINUE=100,w.SWITCHING_PROTOCOLS=101,w.PROCESSING=102,w.OK=200,w.CREATED=201,w.ACCEPTED=202,w.NON_AUTHORITATIVE_INFORMATION=203,w.NO_CONTENT=204,w.RESET_CONTENT=205,w.PARTIAL_CONTENT=206,w.MULTI_STATUS=207,w.ALREADY_REPORTED=208,w.IM_USED=226,w.MULTIPLE_CHOICES=300,w.MOVED_PERMANENTLY=301,w.FOUND=302,w.SEE_OTHER=303,w.NOT_MODIFIED=304,w.USE_PROXY=305,w.TEMPORARY_REDIRECT=307,w.PERMANENT_REDIRECT=308,w.BAD_REQUEST=400,w.UNAUTHORIZED=401,w.PAYMENT_REQUIRED=402,w.FORBIDDEN=403,w.NOT_FOUND=404,w.METHOD_NOT_ALLOWED=405,w.NOT_ACCEPTABLE=406,w.PROXY_AUTHENTICATION_REQUIRED=407,w.REQUEST_TIMEOUT=408,w.CONFLICT=409,w.GONE=410,w.LENGTH_REQUIRED=411,w.PRECONDITION_FAILED=412,w.PAYLOAD_TOO_LARGE=413,w.REQUEST_URI_TOO_LONG=414,w.UNSUPPORTED_MEDIA_TYPE=415,w.REQUESTED_RANGE_NOT_SATISFIABLE=416,w.EXPECTATION_FAILED=417,w.IM_A_TEAPOT=418,w.MISDIRECTED_REQUEST=421,w.UNPROCESSABLE_ENTITY=422,w.LOCKED=423,w.FAILED_DEPENDENCY=424,w.UPGRADE_REQUIRED=426,w.PRECONDITION_REQUIRED=428,w.TOO_MANY_REQUESTS=429,w.REQUEST_HEADER_FIELDS_TOO_LARGE=431,w.CONNECTION_CLOSED_WITHOUT_RESPONSE=444,w.UNAVAILABLE_FOR_LEGAL_REASONS=451,w.CLIENT_CLOSED_REQUEST=499,w.INTERNAL_SERVER_ERROR=500,w.NOT_IMPLEMENTED=501,w.BAD_GATEWAY=502,w.SERVICE_UNAVAILABLE=503,w.GATEWAY_TIMEOUT=504,w.HTTP_VERSION_NOT_SUPPORTED=505,w.VARIANT_ALSO_NEGOCIATES=506,w.INSUFFICIENT_STORAGE=507,w.LOOP_DETECTED=508,w.NOT_EXTENDED=510,w.NETWORK_AUTHENTICATION_REQUIRED=511,w.NETWORK_CONNECTION_TIMEOUT_ERROR=599;class k{}k[100]="Continue",k[101]="Switching Protocols",k[102]="Processing",k[200]="OK",k[201]="Created",k[202]="Accepted",k[203]="Non-Authoritative Information",k[204]="No Content",k[205]="Reset Content",k[206]="Partial Content",k[207]="Multi-Status",k[226]="IM Used",k[300]="Multiple Choices",k[301]="Moved Permanently",k[302]="Found",k[303]="See Other",k[304]="Not Modified",k[305]="Use Proxy",k[307]="Temporary Redirect",k[308]="Permanent Redirect",k[400]="Bad Request",k[401]="Unauthorized",k[402]="Payment Required",k[403]="Forbidden",k[404]="Not Found",k[405]="Method Not Allowed",k[406]="Not Acceptable",k[407]="Proxy Authentication Required",k[408]="Request Timeout",k[409]="Conflict",k[410]="Gone",k[411]="Length Required",k[412]="Precondition Failed",k[413]="Payload Too Large",k[414]="URI Too Long",k[415]="Unsupported Media Type",k[416]="Range Not Satisfiable",k[417]="Expectation Failed",k[418]="I'm a teapot",k[422]="Unprocessable Entity",k[423]="Locked",k[424]="Failed Dependency",k[426]="Upgrade Required",k[428]="Precondition Required",k[429]="Too Many Requests",k[431]="Request Header Fields Too Large",k[451]="Unavailable For Legal Reasons",k[500]="Internal Server Error",k[501]="Not Implemented",k[502]="Bad Gateway",k[503]="Service Unavailable",k[504]="Gateway Time-out",k[505]="HTTP Version Not Supported",k[506]="Variant Also Negotiates",k[507]="Insufficient Storage",k[511]="Network Authentication Required";class H extends Error{constructor(e,t=w.INTERNAL_SERVER_ERROR){super(e),this.status=t}}class q extends H{constructor(e="Bad Request"){super(e,w.BAD_REQUEST)}}class B extends H{constructor(e="Forbidden"){super(e,w.FORBIDDEN)}}class K extends H{constructor(e="Internal server error"){super(e,w.INTERNAL_SERVER_ERROR)}}class G extends H{constructor(e="Not Found"){super(e,w.NOT_FOUND)}}class Q extends H{constructor(e="Unauthorized"){super(e,w.UNAUTHORIZED)}}class V extends H{constructor(e){super(e,w.UNPROCESSABLE_ENTITY)}}class ${static created(e,t,s){var r,o;const i=w.CREATED,n={success:!0,status:i,data:t?{id:t}:{},meta:null!==(r=null==s?void 0:s.meta)&&void 0!==r?r:{},message:null!==(o=null==s?void 0:s.message)&&void 0!==o?o:null};return e.status(i).json(n),n}static noContent(e){e.status(w.NO_CONTENT).end()}static ok(e,t,s){var r,o;const i=w.OK,n={success:!0,status:i,data:t,meta:null!==(r=null==s?void 0:s.meta)&&void 0!==r?r:{},message:null!==(o=null==s?void 0:s.message)&&void 0!==o?o:null};return e.status(i).json(n),n}static error(e,t,s){var r,o;const{status:i,message:n}=this.normalizeError(s),a=Object.assign({success:!1,status:i,error:null!==(r=null==k?void 0:k[i])&&void 0!==r?r:"Internal Server Error",message:n,path:null!==(o=e.originalUrl)&&void 0!==o?o:e.url,timestamp:(new Date).toISOString()},this.isDev()&&s instanceof Error&&s.stack?{stack:s.stack}:{});return t.status(i).json(a),a}static isDev(){return"production"!==process.env.NODE_ENV}static normalizeError(e){let t=w.INTERNAL_SERVER_ERROR,s=k[500];if(e instanceof H)return t=this.safeStatus(e.status),s=this.safeMessage(e.message)||s,{status:t,message:s};if(e instanceof Error){const o=e;return r(o.statusCode)?t=this.safeStatus(o.statusCode):r(o.status)&&(t=this.safeStatus(o.status)),s=this.safeMessage(e.message)||s,{status:t,message:s}}if(o(e))return s=this.safeMessage(e)||s,{status:t,message:s};if(e&&i(e)){const i=e;return r(i.statusCode)?t=this.safeStatus(i.statusCode):r(i.status)&&(t=this.safeStatus(i.status)),o(i.message)&&(s=this.safeMessage(i.message)||s),{status:t,message:s}}return{status:t,message:s}}static safeStatus(e){if(!Number.isFinite(e))return w.INTERNAL_SERVER_ERROR;const t=Math.trunc(e);return t<400||t>599?w.INTERNAL_SERVER_ERROR:t}static safeMessage(e){if(!o(e))return"";const t=e.trim();return t.length>2e3?t.slice(0,2e3)+"...":t}}class j{constructor(e,t,s,r,o){this.storage={},this.req=e,this.res=t,this.next=s,this.id=n(),this.app=r,this.controller=o}cache(e){const t=Object.assign({},e),s=[];t.private?s.push("private"):t.public&&s.push("public"),t.noStore&&(t.noCache=!0,s.push("no-store")),t.noCache&&(t.maxAge=0,delete t.sMaxAge,s.push("no-cache")),t.noTransform&&s.push("no-transform"),t.proxyRevalidate&&s.push("proxy-revalidate"),t.mustRevalidate?s.push("must-revalidate"):t.noCache||(r(t.staleIfError)&&s.push(`stale-if-error=${t.staleIfError}`),r(t.staleWhileRevalidate)&&s.push(`stale-while-revalidate=${t.staleWhileRevalidate}`)),r(t.maxAge)&&s.push(`max-age=${t.maxAge}`),r(t.sMaxAge)&&s.push(`s-maxage=${t.sMaxAge}`),s.length&&(this.res.setHeader("Cache-Control",s.join(",")),t.noCache&&a({"Surrogate-Control":"no-store",Pragma:"no-cache",ETag:"false",Expires:"0"},(e,t)=>this.res.setHeader(t,e)))}clearCookie(e,t){this.res.clearCookie(e,t)}close(e){this.isResponded()||this.res.json(null!=e?e:this.storage)}destroy(e){var t;e&&this.error(e),null===(t=this.res.socket)||void 0===t||t.destroy(e)}error(e){this.isResponded()||$.error(this.req,this.res,e)}file(e){this.isResponded()||(this.status(w.OK),this.res.sendFile(L(e)))}getBody(){var e,t;return null!==(t=null===(e=this.req)||void 0===e?void 0:e.body)&&void 0!==t?t:{}}getBodyValue(e){var t;return null===(t=this.req.body)||void 0===t?void 0:t[e]}getCookie(e){var t;return this.normalize(null===(t=this.req.cookies)||void 0===t?void 0:t[e])}getCookies(){var e,t;return l(null!==(t=null===(e=this.req)||void 0===e?void 0:e.cookies)&&void 0!==t?t:{},e=>this.normalize(e))}getFiles(){var e,t;return null!==(t=null===(e=this.req)||void 0===e?void 0:e.files)&&void 0!==t?t:{}}getFullUrl(){return`${this.getUrl()}${this.req.originalUrl}`}getHeader(e){var t;return this.normalize(null===(t=this.req.headers)||void 0===t?void 0:t[e])}getHeaders(){var e,t;return l(null!==(t=null===(e=this.req)||void 0===e?void 0:e.headers)&&void 0!==t?t:{},e=>this.normalize(e))}getIp(){return b(this.req)||"0.0.0.0"}getQuery(e){var t;return this.normalize(null===(t=this.req.query)||void 0===t?void 0:t[e])}getQueries(){var e,t;return l(null!==(t=null===(e=this.req)||void 0===e?void 0:e.query)&&void 0!==t?t:{},e=>this.normalize(e))}getParam(e){var t;const s=null===(t=this.req.params)||void 0===t?void 0:t[e];return u(s)?void 0:String(s)}getParams(){var e,t;return l(null!==(t=null===(e=this.req)||void 0===e?void 0:e.params)&&void 0!==t?t:{},e=>{if(!u(e)&&!d(e))return String(e)})}getUrl(){let e=this.getHeader("x-forwarded-proto")||this.req.protocol||"http";o(e)&&e.includes(",")&&(e=e.split(",")[0].trim());const t=this.getHeader("cf-visitor");if(t){const s=h(t);(null==s?void 0:s.scheme)&&(e=s.scheme)}return`${e}://${this.getHeader("host")}`}isResponded(){return this.res.headersSent||this.res.writableEnded}json(e){this.send(w.OK,e)}normalize(e){if(!u(e)&&!d(e))return i(e)?JSON.stringify(e):String(e)}ok(e,t){this.isResponded()||$.ok(this.res,e,t)}prepare(e,t){this.isResponded()||(this.status(e),this.storage=t)}redirect(e){this.isResponded()||this.res.redirect(e)}send(e,t){this.isResponded()||(this.status(e),204===e||304===e||u(t)?this.res.end():this.res.json(t))}setCookie(e,t,s){this.res.cookie(e,t,null!=s?s:{})}status(e){return u(e)||this.res.status(e),this.res.statusCode}success(e){this.send(w.OK,{message:e})}}class Y{static extends(t){return e(Y.EXTENDS,t,[])}static middleware(t){return e(Y.MIDDLEWARE,t,[])}static parameters(t){return e(Y.PARAMETERS,t,[])}static path(t,s){return e(Y.PATH,t,s)}static routers(t){return e(Y.ROUTERS,t,[])}}Y.EXTENDS=Symbol("EXTENDS"),Y.MIDDLEWARE=Symbol("MIDDLEWARE"),Y.PARAMETERS=Symbol("PARAMETERS"),Y.PATH=Symbol("PATH"),Y.ROUTERS=Symbol("ROUTERS");class W extends c{get controllers(){return[...this._controllers]}get instance(){return this._app}get router(){return this._globalRouter}get server(){return this._server}constructor(e,s){var r,o;super(),this._app=O(),this._boundServers=[],this._options={},this._baseRouter=f(),this._globalRouter=f(),this._controllers=[],this._controllers.push(...e.map(e=>p(e)?new e(...t(e)):e)),this._options=E({},{cross:!1,path:"/",port:3e3,session:{secret:"yoursecret",resave:!0,saveUninitialized:!1,cookie:{maxAge:864e5}}},null!=s?s:{}),this._app.use(S(this._options.json)),this._app.disable("x-powered-by"),this._options.proxy&&this._app.set("trust proxy",this._options.proxy),this._app.use(A({extended:!0})),this._options.cross&&this._app.use(N(i(this._options.cross)?this._options.cross:{})),this._app.use(T(this._options.compression)),this._app.use(g(null===(r=this._options.cookie)||void 0===r?void 0:r.secret,this._options.cookie)),this._app.use(I(this._options.session)),this.init(),this._app.use(this._globalRouter);const n=(null===(o=this._options.path)||void 0===o?void 0:o.length)?this._options.path:"/";if(this._app.use(n,this._baseRouter),this._app.all(n+"/*path",(e,t)=>{this._options.redirect?t.redirect(this._options.redirect):$.error(e,t,new G("Endpoint Not Found"))}),this._options.public){const e=L(this._options.public);y(e)&&this._app.use(O.static(e)),this._app.get("*path",(t,s)=>{y(e)?s.sendFile(e+"/index.html"):this._options.notfound?s.redirect(this._options.notfound):$.error(t,s,new G('FILE "index.html" Not Found'))})}else this._app.all("*path",(e,t)=>{this._options.redirect?t.redirect(this._options.redirect):$.error(e,t,new G("Endpoint not found"))});this._controllers.forEach(e=>{const t=f(),s=this._collectMiddlewares(e),r=Y.parameters(e);this._collectExtends(e).forEach(e=>{s.push(...this._collectMiddlewares(e)),r.push(...Y.parameters(e))}),Y.routers(e).forEach(o=>{const n=o.propertyKey.toString();if(_(e[n])){if(!_(t[o.method]))return this._logRouteNotFound(o.method);const a=this._buildMiddlewareChain(e,n,s,r);return t[o.method](o.path,...a,(t,s,o)=>F(this,void 0,void 0,function*(){const a=new j(t,s,o,this,e),l=this._resolveArgs(a,this._filterParamsByKey(n,r)),u=yield e[n](...l);a.close(m(u)||i(u)?u:void 0)}))}this._logRouteNotFound(`${e.name}.${n}`)}),this._collectExtends(e).forEach(o=>{Y.routers(o).forEach(o=>{const n=o.propertyKey.toString();if(_(e[n])){if(!_(t[o.method]))return this._logRouteNotFound(o.method);const a=this._buildMiddlewareChain(e,n,s,r);return t[o.method](o.path,...a,(t,s,o)=>F(this,void 0,void 0,function*(){const a=new j(t,s,o,this,e),l=this._resolveArgs(a,this._filterParamsByKey(n,r)),u=yield e[n](...l);a.close(m(u)||i(u)?u:void 0)}))}this._logRouteNotFound(`${e.constructor.name}.${n}`)})}),this._baseRouter.use(Y.path(e,"/"),t)})}init(){}error(e,t){s.error(e)}log(e,t){s.info(e)}_resolveArgs(e,t,s){const r=[],o={ctx:e,key:"",app:this,argument:s};return t.forEach(e=>{r[e.parameterIndex]=e.callback(Object.assign(Object.assign({},o),{key:e.key}))}),r}_buildMiddlewareChain(e,t,s,r){return s.filter(e=>e.propertyKey==t).map(t=>{if(t.callback!=v){const s=this._filterParamsByKey(t.method,r);return(r,o,n)=>F(this,void 0,void 0,function*(){const a=new j(r,o,n,this,e),l=_(t.argument)?t.argument(a):t.argument,u=yield t.callback.call(e,...this._resolveArgs(a,s,l));(m(u)||i(u))&&a.close(u)})}this._logRouteNotFound(t.method)}).filter(_)}_collectExtends(e){return Y.extends(e).reduce((e,t)=>(e.push(t,...this._collectExtends(t)),e),[]).filter((e,t,s)=>s.indexOf(e)===t)}_filterParamsByKey(e,t){return t.filter(t=>t.propertyKey==e)}_collectMiddlewares(e){return[...Y.middleware(e)].reverse()}_logRouteNotFound(e){this.error(new Error(`Router "${e}" not found`),"express")}_formatListeningMessage(e){return`Server listening on port ${e}`}listen(){return F(this,void 0,void 0,function*(){var e;const t=this._resolveMode(),s={http:this._startHttp,https:this._startHttps,hybrid:this._startHybrid,redirect:this._startHttpsWithRedirect};yield(null!==(e=s[t])&&void 0!==e?e:this._startHttp).call(this)})}close(){return F(this,void 0,void 0,function*(){yield Promise.all(this._boundServers.map(e=>new Promise((t,s)=>{e.close(e=>e?s(e):t())}))),this._boundServers.length=0,this._server=void 0})}_resolveMode(){return this._resolveTls()&&this._options.mode?this._options.mode:"http"}_resolveTls(){if(this._options.tls&&this._options.tls.key&&this._options.tls.cert)return this._options.tls}_bindServer(e,t,s){return new Promise((r,o)=>{const i=t=>{e.off("listening",n),o(t)},n=()=>{e.off("error",i),this.log(this._formatListeningMessage(t),"express"),r()};e.once("error",i),e.once("listening",n),e.listen(t,s)})}_startHttp(){return F(this,void 0,void 0,function*(){var e;const t=D.createServer(this._app);this._server=t,this._boundServers.push(t),yield this._bindServer(t,null!==(e=this._options.port)&&void 0!==e?e:3e3,this._options.host)})}_startHttps(){return F(this,void 0,void 0,function*(){var e;const t=C.createServer(this._resolveTls(),this._app);this._server=t,this._boundServers.push(t),yield this._bindServer(t,null!==(e=this._options.port)&&void 0!==e?e:443,this._options.host)})}_startHttpsWithRedirect(){return F(this,void 0,void 0,function*(){var e,t;const s=C.createServer(this._resolveTls(),this._app),r=D.createServer((e,t)=>{var s,r;const o=(null!==(s=e.headers.host)&&void 0!==s?s:"").split(":")[0];t.writeHead(w.MOVED_PERMANENTLY,{Location:`https://${o}${null!==(r=e.url)&&void 0!==r?r:""}`}),t.end()});this._server=s,this._boundServers.push(s,r),yield Promise.all([this._bindServer(s,null!==(e=this._options.port)&&void 0!==e?e:443,this._options.host),this._bindServer(r,null!==(t=this._options.redirectPort)&&void 0!==t?t:80,this._options.host)])})}_startHybrid(){return F(this,void 0,void 0,function*(){var e;const t=D.createServer(this._app),s=C.createServer(this._resolveTls(),this._app),r=P.createServer(e=>{const r=setTimeout(()=>e.destroy(),5e3);e.once("data",o=>{clearTimeout(r),e.pause(),e.unshift(o),(22===o[0]?s:t).emit("connection",e),process.nextTick(()=>e.resume())}),e.once("error",()=>clearTimeout(r))});return this._server=s,this._boundServers.push(r,s,t),yield this._bindServer(r,null!==(e=this._options.port)&&void 0!==e?e:443,this._options.host),s})}}const z=e=>t=>{Y.path(t,(null==e?void 0:e.length)?e:"/")},X=e=>t=>{Y.extends(t).push(e)},Z=e=>t=>(s,r,o)=>{Y.parameters(s).push({callback:e,key:t,propertyKey:r,parameterIndex:o})},J=Z(({app:e})=>e),ee=Z(({argument:e})=>e),te=Z(({ctx:e,key:t})=>t?e.getBodyValue(t):e.getBody()),se=Z(({ctx:e,key:t})=>t?e.getCookie(t):e.getCookies()),re=Z(({ctx:e})=>e),oe=Z(({ctx:e})=>e.getFiles()),ie=Z(({ctx:e,key:t})=>t?e.getHeader(t):e.getHeaders()),ne=Z(({ctx:e,key:t})=>t?e.getParam(t):e.getParams()),ae=Z(({ctx:e,key:t})=>t?e.getQuery(t):e.getQueries()),le=Z(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.session}),ue=(e,t)=>(s,r)=>{const o=n();re()(s,o,0),Y.middleware(s).push({method:o,argument:t,propertyKey:r,callback:e})},de=e=>(t,s,r)=>{ue(t=>{t.cache(Object.assign({},e)),t.next()})(t,s,r)},he={ALL:"all",GET:"get",POST:"post",PUT:"put",HEAD:"head",DELETE:"delete",OPTIONS:"options",PATCH:"patch"},ce=e=>t=>(s,r)=>{Y.routers(s).push({method:e,path:(null==t?void 0:t.length)?t:"/",propertyKey:r})},pe=ce(he.ALL),Ee=ce(he.DELETE),_e=ce(he.GET),ve=ce(he.HEAD),me=ce(he.OPTIONS),Re=ce(he.PATCH),Te=ce(he.POST),ge=ce(he.PUT),Ne=(e,t)=>(s,r)=>{let i=v;if(o(r)){const t=s;_(t[e])&&(i=t[e])}Y.middleware(s).push({method:e,argument:t,propertyKey:r,callback:i})},Oe=e=>{var t;return(null===(t=e.split(".").pop())||void 0===t?void 0:t.toLowerCase())||"bin"},fe=(e,t)=>{var s;return null!==(s=e[t])&&void 0!==s?s:null},Se=(e,t)=>{const s=n()+"."+t;return y(U(e,s))?Se(e,t):s},Ae=e=>{const t=E({},e),s=M({destination(e,s,r){var o;const i=fe(t,s.fieldname);r(null,null!==(o=null==i?void 0:i.path)&&void 0!==o?o:"./")},filename(e,s,r){var o;const i=fe(t,s.fieldname);r(null,Se(null!==(o=null==i?void 0:i.path)&&void 0!==o?o:"./",Oe(s.originalname)))}}),r=Math.max(...Object.values(t).map(e=>{var t;return null!==(t=e.size)&&void 0!==t?t:0})),o=x({storage:s,fileFilter(e,s,r){var o;const i=fe(t,s.fieldname);return i?((e,t)=>!t.length||t.includes(Oe(e.originalname))||t.includes(e.mimetype.toLowerCase()))(s,null!==(o=null==i?void 0:i.types)&&void 0!==o?o:[])?void r(null,!0):r(new Error(`FILE TYPE NOT ALLOWED FOR "${s.fieldname}"`)):r(new Error(`UPLOAD FIELD "${s.fieldname}" IS NOT CONFIGURED`))},limits:{fileSize:1024*r*1024}}).fields(Object.keys(t).map(e=>{var s,r;return{name:e,maxCount:null!==(r=null===(s=t[e])||void 0===s?void 0:s.count)&&void 0!==r?r:1}}));return(e,t,s)=>{ue(e=>{o(e.req,e.res,t=>{if(!t)return e.next();"LIMIT_UNEXPECTED_FILE"==t.code&&(t.message=`FIELD "${t.field}" EXCEEDS MAX SIZE`),e.destroy(t)})})(e,t,s)}},Ie=e=>{const t=R.object(_(e)?e(R):e).parse();return(e,s,r)=>{ue(e=>F(void 0,void 0,void 0,function*(){var s,r;const{error:o,message:i,value:n}=yield t.validateAsync(null!==(r=null===(s=e.req)||void 0===s?void 0:s.body)&&void 0!==r?r:{});if(o)return e.error(new V(null!=i?i:o));e.req.body=n,e.next()}))(e,s,r)}};export{pe as All,J as App,W as Application,ee as Argument,q as BadRequestError,te as Body,de as Cache,j as Context,z as Controller,se as Cookies,re as Ctx,Ee as Delete,X as Extends,oe as Files,B as ForbiddenError,_e as Get,ve as Head,ie as Headers,$ as HttpResponse,K as InternalServerError,Y as Metadata,he as Methods,Ne as Middleware,G as NotFoundError,me as Options,ne as Params,Re as Patch,Te as Post,ge as Put,ae as Query,H as ResponseError,le as Session,w as StatusCodes,k as StatusText,Q as UnauthorizedError,Ae as Upload,ue as Use,Ie as Validate,V as ValidationError,ce as methodFactory,Z as parameterFactory};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@andrewcaires/express",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.1",
|
|
4
4
|
"description": "Decorators for express",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs.js",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"@rollup/plugin-commonjs": "^29.0.2",
|
|
54
54
|
"@rollup/plugin-terser": "^1.0.0",
|
|
55
55
|
"@rollup/plugin-typescript": "^12.3.0",
|
|
56
|
-
"@rollup/rollup-darwin-arm64": "^4.60.
|
|
56
|
+
"@rollup/rollup-darwin-arm64": "^4.60.3",
|
|
57
57
|
"@types/compression": "^1.8.1",
|
|
58
58
|
"@types/cookie-parser": "^1.4.10",
|
|
59
59
|
"@types/cors": "^2.8.19",
|
|
@@ -67,6 +67,6 @@
|
|
|
67
67
|
"rollup-plugin-dts": "^6.4.1",
|
|
68
68
|
"swagger-ui-express": "^5.0.1",
|
|
69
69
|
"tslib": "^2.8.1",
|
|
70
|
-
"typescript-eslint": "^8.59.
|
|
70
|
+
"typescript-eslint": "^8.59.2"
|
|
71
71
|
}
|
|
72
72
|
}
|