@andrewcaires/express 2.1.1 → 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 +78 -56
- package/dist/index.esm.js +2 -2
- package/package.json +13 -13
package/dist/index.cjs.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/express v2.
|
|
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"),u=require("fs"),l=require("http"),d=require("https"),p=require("net"),c=require("path"),h=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 R=_(l),v=_(d);function T(e,t,s,r){return new(s||(s=Promise))(function(o,i){function n(e){try{u(r.next(e))}catch(e){i(e)}}function a(e){try{u(r.throw(e))}catch(e){i(e)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof s?t:new s(function(e){e(t)})).then(n,a)}u((r=r.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;class m{}m.CONTINUE=100,m.SWITCHING_PROTOCOLS=101,m.PROCESSING=102,m.OK=200,m.CREATED=201,m.ACCEPTED=202,m.NON_AUTHORITATIVE_INFORMATION=203,m.NO_CONTENT=204,m.RESET_CONTENT=205,m.PARTIAL_CONTENT=206,m.MULTI_STATUS=207,m.ALREADY_REPORTED=208,m.IM_USED=226,m.MULTIPLE_CHOICES=300,m.MOVED_PERMANENTLY=301,m.FOUND=302,m.SEE_OTHER=303,m.NOT_MODIFIED=304,m.USE_PROXY=305,m.TEMPORARY_REDIRECT=307,m.PERMANENT_REDIRECT=308,m.BAD_REQUEST=400,m.UNAUTHORIZED=401,m.PAYMENT_REQUIRED=402,m.FORBIDDEN=403,m.NOT_FOUND=404,m.METHOD_NOT_ALLOWED=405,m.NOT_ACCEPTABLE=406,m.PROXY_AUTHENTICATION_REQUIRED=407,m.REQUEST_TIMEOUT=408,m.CONFLICT=409,m.GONE=410,m.LENGTH_REQUIRED=411,m.PRECONDITION_FAILED=412,m.PAYLOAD_TOO_LARGE=413,m.REQUEST_URI_TOO_LONG=414,m.UNSUPPORTED_MEDIA_TYPE=415,m.REQUESTED_RANGE_NOT_SATISFIABLE=416,m.EXPECTATION_FAILED=417,m.IM_A_TEAPOT=418,m.MISDIRECTED_REQUEST=421,m.UNPROCESSABLE_ENTITY=422,m.LOCKED=423,m.FAILED_DEPENDENCY=424,m.UPGRADE_REQUIRED=426,m.PRECONDITION_REQUIRED=428,m.TOO_MANY_REQUESTS=429,m.REQUEST_HEADER_FIELDS_TOO_LARGE=431,m.CONNECTION_CLOSED_WITHOUT_RESPONSE=444,m.UNAVAILABLE_FOR_LEGAL_REASONS=451,m.CLIENT_CLOSED_REQUEST=499,m.INTERNAL_SERVER_ERROR=500,m.NOT_IMPLEMENTED=501,m.BAD_GATEWAY=502,m.SERVICE_UNAVAILABLE=503,m.GATEWAY_TIMEOUT=504,m.HTTP_VERSION_NOT_SUPPORTED=505,m.VARIANT_ALSO_NEGOCIATES=506,m.INSUFFICIENT_STORAGE=507,m.LOOP_DETECTED=508,m.NOT_EXTENDED=510,m.NETWORK_AUTHENTICATION_REQUIRED=511,m.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 g extends Error{constructor(e,t=m.INTERNAL_SERVER_ERROR){super(e),this.status=t}}class N extends g{constructor(e="Not Found"){super(e,m.NOT_FOUND)}}class S extends g{constructor(e){super(e,m.UNPROCESSABLE_ENTITY)}}class x{static created(e,t,s){var r,o;const i=m.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(m.NO_CONTENT).end()}static ok(e,t,s){var r,o;const i=m.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=m.INTERNAL_SERVER_ERROR,r=O[500];if(e instanceof g)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 m.INTERNAL_SERVER_ERROR;const t=Math.trunc(e);return t<400||t>599?m.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 A{constructor(e,t,s,r,o){this.storage={},this.req=e,this.res=t,this.next=s,this.app=r,this.controller=o}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()||x.error(this.req,this.res,e)}file(e){this.isResponded()||(this.status(m.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 h.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(m.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()||x.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(m.OK,{message:e})}}class I{static extends(t){return e.metadata(I.EXTENDS,t,[])}static middleware(t){return e.metadata(I.MIDDLEWARE,t,[])}static parameters(t){return e.metadata(I.PARAMETERS,t,[])}static path(t,s){return e.metadata(I.PATH,t,s)}static routers(t){return e.metadata(I.ROUTERS,t,[])}}I.EXTENDS=Symbol("EXTENDS"),I.MIDDLEWARE=Symbol("MIDDLEWARE"),I.PARAMETERS=Symbol("PARAMETERS"),I.PATH=Symbol("PATH"),I.ROUTERS=Symbol("ROUTERS");class f extends s.EventEmitter{get controllers(){return this._controllers}get instance(){return this._app}get router(){return this._router}get server(){return this._server}constructor(t,l){var d,p;super(),this._app=n(),this._options={},this._base=n.Router(),this._router=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!=l?l:{}),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._router);const h=(null===(p=this._options.path)||void 0===p?void 0:p.length)?this._options.path:"/";if(this._app.use(h,this._base),this._app.all(h+"/*path",(e,t)=>{this._options.redirect?t.redirect(this._options.redirect):x.error(e,t,new N("Endpoint Not Found"))}),this._options.public){const e=c.resolve(this._options.public);u.existsSync(e)&&this._app.use(n.static(e)),this._app.get("*path",(t,s)=>{u.existsSync(e)?s.sendFile(e+"/index.html"):this._options.notfound?s.redirect(this._options.notfound):x.error(t,s,new N('FILE "index.html" Not Found'))})}else this._app.all("*path",(e,t)=>{this._options.redirect?t.redirect(this._options.redirect):x.error(e,t,new N("Endpoint not found"))});this._controllers.forEach(e=>{const t=n.Router(),r=this._middlewares(e),o=I.parameters(e);this._extends(e).forEach(e=>{r.push(...this._middlewares(e)),o.push(...I.parameters(e))}),I.routers(e).forEach(i=>{const n=i.propertyKey.toString();if(s.isFunction(e[n])){if(!s.isFunction(t[i.method]))return this._notFound(i.method);const a=this._handles(e,n,r,o);return t[i.method](i.path,...a,(t,r,i)=>T(this,void 0,void 0,function*(){const a=new A(t,r,i,this,e),u=this._args(a,this._indexes(n,o)),l=yield e[n](...u);a.close(s.isArray(l)||s.isObject(l)?l:void 0)}))}this._notFound(`${e.name}.${n}`)}),this._extends(e).forEach(i=>{I.routers(i).forEach(i=>{const n=i.propertyKey.toString();if(s.isFunction(e[n])){if(!s.isFunction(t[i.method]))return this._notFound(i.method);const a=this._handles(e,n,r,o);return t[i.method](i.path,...a,(t,r,i)=>T(this,void 0,void 0,function*(){const a=new A(t,r,i,this,e),u=this._args(a,this._indexes(n,o)),l=yield e[n](...u);a.close(s.isArray(l)||s.isObject(l)?l:void 0)}))}this._notFound(`${e.constructor.name}.${n}`)})}),this._base.use(I.path(e,"/"),t)})}init(){}error(e,s){t.Log.error(e)}log(e,s){t.Log.info(e)}_args(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}_handles(e,t,r,o){return r.filter(e=>e.propertyKey==t).map(t=>{if(t.callback!=s.noop){const r=this._indexes(t.method,o);return(o,i,n)=>T(this,void 0,void 0,function*(){const a=new A(o,i,n,this,e),u=s.isFunction(t.argument)?t.argument(a):t.argument,l=yield t.callback.call(e,...this._args(a,r,u));(s.isArray(l)||s.isObject(l))&&a.close(l)})}this._notFound(t.method)}).filter(s.isFunction)}_extends(e){return I.extends(e).reduce((e,t)=>(e.push(t,...this._extends(t)),e),[]).filter((e,t,s)=>s.indexOf(e)===t)}_indexes(e,t){return t.filter(t=>t.propertyKey==e)}_middlewares(e){return[...I.middleware(e)].reverse()}_notFound(e){this.error(new Error(`Router "${e}" not found`),"express")}_port(e){return`Server listening on port ${e}`}listen(){return T(this,void 0,void 0,function*(){if(this._options.cert&&this._options.key||(this._server=R.createServer(this._app),this._server.listen(this._options.port,()=>this.log(this._port(this._options.port),"express"))),!this._server){const e=R.createServer((e,t)=>{const s=80==this._options.port?":80":"";t.writeHead(m.MOVED_PERMANENTLY,{Location:`https://${e.headers.host}${s}${e.url}`}),t.end()}),t=v.createServer({key:this._options.key,cert:this._options.cert},this._app);if(this._options.hybrid){new p.Server(s=>{s.once("data",r=>{s.pause(),s.unshift(r),(22===r[0]?t:e).emit("connection",s),process.nextTick(()=>s.resume())})}).listen(this._options.port,()=>this.log(this._port(this._options.port),"express")),this._server=t}this._server||(443==this._options.port&&e.listen(80,()=>this.log(this._port(80),"express")),t.listen(this._options.port,()=>this.log(this._port(this._options.port),"express")),this._server=t)}})}}const y=e=>t=>(s,r,o)=>{I.parameters(s).push({callback:e,key:t,propertyKey:r,parameterIndex:o})},C=y(({app:e})=>e),D=y(({argument:e})=>e),U=y(({ctx:e,key:t})=>t?e.getBodyValue(t):e.getBody()),P=y(({ctx:e,key:t})=>t?e.getCookie(t):e.getCookies()),L=y(({ctx:e})=>e),b=y(({ctx:e})=>e.getFiles()),F=y(({ctx:e,key:t})=>t?e.getHeader(t):e.getHeaders()),q=y(({ctx:e,key:t})=>t?e.getParam(t):e.getParams()),M=y(({ctx:e,key:t})=>t?e.getQuery(t):e.getQueries()),k=y(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.session}),w=(e,t)=>(r,o)=>{const i=s.uuidv7();L()(r,i,0),I.middleware(r).push({method:i,argument:t,propertyKey:o,callback:e})},H={ALL:"all",GET:"get",POST:"post",PUT:"put",HEAD:"head",DELETE:"delete",OPTIONS:"options",PATCH:"patch"},j=e=>t=>(s,r)=>{I.routers(s).push({method:e,path:(null==t?void 0:t.length)?t:"/",propertyKey:r})},V=j(H.ALL),G=j(H.DELETE),B=j(H.GET),Q=j(H.HEAD),$=j(H.OPTIONS),K=j(H.PATCH),z=j(H.POST),Y=j(H.PUT),W=e=>{var t;return(null===(t=e.split(".").pop())||void 0===t?void 0:t.toLowerCase())||"bin"},X=(e,t)=>{var s;return null!==(s=e[t])&&void 0!==s?s:null},Z=(e,t)=>{const r=s.uuidv7()+"."+t;return u.existsSync(c.join(e,r))?Z(e,t):r};exports.All=V,exports.App=C,exports.Application=f,exports.Argument=D,exports.BadRequestError=class extends g{constructor(e="Bad Request"){super(e,m.BAD_REQUEST)}},exports.Body=U,exports.Cache=e=>(t,s,r)=>{w(t=>{t.cache(Object.assign({},e)),t.next()})(t,s,r)},exports.Context=A,exports.Controller=e=>t=>{I.path(t,(null==e?void 0:e.length)?e:"/")},exports.Cookies=P,exports.Ctx=L,exports.Delete=G,exports.Extends=e=>t=>{I.extends(t).push(e)},exports.Files=b,exports.ForbiddenError=class extends g{constructor(e="Forbidden"){super(e,m.FORBIDDEN)}},exports.Get=B,exports.Head=Q,exports.Headers=F,exports.HttpResponse=x,exports.InternalServerError=class extends g{constructor(e="Internal server error"){super(e,m.INTERNAL_SERVER_ERROR)}},exports.Metadata=I,exports.Methods=H,exports.Middleware=(e,t)=>(r,o)=>{let i=s.noop;if(s.isString(o)){const t=r;s.isFunction(t[e])&&(i=t[e])}I.middleware(r).push({method:e,argument:t,propertyKey:o,callback:i})},exports.NotFoundError=N,exports.Options=$,exports.Params=q,exports.Patch=K,exports.Post=z,exports.Put=Y,exports.Query=M,exports.ResponseError=g,exports.Session=k,exports.StatusCodes=m,exports.StatusText=O,exports.UnauthorizedError=class extends g{constructor(e="Unauthorized"){super(e,m.UNAUTHORIZED)}},exports.Upload=e=>{const t=s.merge({},e),r=E.diskStorage({destination(e,s,r){var o;const i=X(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=X(t,s.fieldname);r(null,Z(null!==(o=null==i?void 0:i.path)&&void 0!==o?o:"./",W(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=X(t,s.fieldname);return i?((e,t)=>!t.length||t.includes(W(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)=>{w(e=>{i(e.req,e.res,t=>{if(t)return"LIMIT_UNEXPECTED_FILE"==t.code&&(t.message=`FIELD "${t.field}" EXCEEDS MAX SIZE`),e.destroy(t);e.next()})})(e,t,s)}},exports.Use=w,exports.Validate=e=>{const t=s.Validation.object(s.isFunction(e)?e(s.Validation):e).parse();return(e,s,r)=>{w(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 S(null!=i?i:o));e.req.body=n,e.next()}))(e,s,r)}},exports.ValidationError=S,exports.methodFactory=j,exports.parameterFactory=y;
|
|
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
|
+
* @andrewcaires/express v2.2.1
|
|
3
3
|
* Decorators for express
|
|
4
4
|
* (c) 2026 Andrew Caires
|
|
5
5
|
* @license: MIT
|
|
@@ -14,10 +14,52 @@ import { CorsOptions } from 'cors';
|
|
|
14
14
|
import { SessionOptions } from 'express-session';
|
|
15
15
|
import { CookieParseOptions } from 'cookie-parser';
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
interface ICookie extends CookieParseOptions {
|
|
18
|
+
secret?: string | Array<string>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
type ServerMode = "http" | "https" | "redirect" | "hybrid";
|
|
22
|
+
|
|
23
|
+
interface TlsOptions {
|
|
24
|
+
key: Buffer | string;
|
|
25
|
+
cert: Buffer | string;
|
|
26
|
+
ca?: Buffer | string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
interface ExpressOptions {
|
|
30
|
+
compression?: CompressionOptions;
|
|
31
|
+
cookie?: ICookie;
|
|
32
|
+
cross?: boolean | CorsOptions;
|
|
33
|
+
host?: string;
|
|
34
|
+
proxy?: boolean | number;
|
|
35
|
+
json?: OptionsJson;
|
|
36
|
+
mode?: ServerMode;
|
|
37
|
+
notfound?: string;
|
|
38
|
+
path?: string;
|
|
39
|
+
port?: number;
|
|
40
|
+
public?: string;
|
|
41
|
+
redirect?: string;
|
|
42
|
+
redirectPort?: number;
|
|
43
|
+
session?: SessionOptions;
|
|
44
|
+
tls?: TlsOptions;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
interface FileUpload {
|
|
48
|
+
fieldname: string;
|
|
49
|
+
originalname: string;
|
|
50
|
+
encoding: string;
|
|
51
|
+
mimetype: string;
|
|
52
|
+
destination: string;
|
|
53
|
+
filename: string;
|
|
54
|
+
path: string;
|
|
55
|
+
size: number;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
declare class Context<T = any, A extends Application = Application> {
|
|
18
59
|
readonly req: Request;
|
|
19
60
|
readonly res: Response;
|
|
20
61
|
readonly next: NextFunction;
|
|
62
|
+
readonly id: string;
|
|
21
63
|
readonly app: A;
|
|
22
64
|
readonly controller: T;
|
|
23
65
|
private storage;
|
|
@@ -32,7 +74,8 @@ declare class Context<T = any, A = Application> {
|
|
|
32
74
|
getBodyValue<T = any>(key: string): T | undefined;
|
|
33
75
|
getCookie(key: string): string | undefined;
|
|
34
76
|
getCookies<T = TypeAnyObject>(): T;
|
|
35
|
-
getFiles<F =
|
|
77
|
+
getFiles<F extends FileUpload = FileUpload, T = TypeObject<Array<F>>>(): T;
|
|
78
|
+
getFullUrl(): string;
|
|
36
79
|
getHeader(key: string): string | undefined;
|
|
37
80
|
getHeaders<T = TypeAnyObject>(): T;
|
|
38
81
|
getIp(): string;
|
|
@@ -46,6 +89,7 @@ declare class Context<T = any, A = Application> {
|
|
|
46
89
|
private normalize;
|
|
47
90
|
ok<T = any>(data: T, meta?: TypeAnyObject): void;
|
|
48
91
|
prepare(status: number, value: TypeAnyObject | Array<TypeAnyObject>): void;
|
|
92
|
+
redirect(url: string): void;
|
|
49
93
|
send(status: number, value?: TypeAnyObject | Array<TypeAnyObject>): void;
|
|
50
94
|
setCookie(key: string, value: string, options?: CookieOptions): void;
|
|
51
95
|
status(value?: number): number;
|
|
@@ -73,21 +117,6 @@ interface ICache {
|
|
|
73
117
|
public?: boolean;
|
|
74
118
|
}
|
|
75
119
|
|
|
76
|
-
interface ICookie extends CookieParseOptions {
|
|
77
|
-
secret?: string | Array<string>;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
interface IFile {
|
|
81
|
-
fieldname: string;
|
|
82
|
-
originalname: string;
|
|
83
|
-
encoding: string;
|
|
84
|
-
mimetype: string;
|
|
85
|
-
destination: string;
|
|
86
|
-
filename: string;
|
|
87
|
-
path: string;
|
|
88
|
-
size: number;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
120
|
type IHandler = (_ctx: Context) => any;
|
|
92
121
|
|
|
93
122
|
interface IMiddlewares {
|
|
@@ -97,22 +126,6 @@ interface IMiddlewares {
|
|
|
97
126
|
callback: TypeAnyFunction;
|
|
98
127
|
}
|
|
99
128
|
|
|
100
|
-
interface IOptions {
|
|
101
|
-
cert?: Buffer;
|
|
102
|
-
compression?: CompressionOptions;
|
|
103
|
-
cookie?: ICookie;
|
|
104
|
-
cross?: boolean | CorsOptions;
|
|
105
|
-
hybrid?: boolean;
|
|
106
|
-
json?: OptionsJson;
|
|
107
|
-
key?: Buffer;
|
|
108
|
-
notfound?: string;
|
|
109
|
-
path?: string;
|
|
110
|
-
port?: number;
|
|
111
|
-
public?: string;
|
|
112
|
-
redirect?: string;
|
|
113
|
-
session?: SessionOptions;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
129
|
interface IParameter {
|
|
117
130
|
callback: TypeAnyFunction;
|
|
118
131
|
key?: string;
|
|
@@ -149,13 +162,6 @@ interface IStore extends TypeAnyObject {
|
|
|
149
162
|
touch(): this;
|
|
150
163
|
}
|
|
151
164
|
|
|
152
|
-
interface IUpload {
|
|
153
|
-
count?: number;
|
|
154
|
-
path?: string;
|
|
155
|
-
size?: number;
|
|
156
|
-
types?: Array<string>;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
165
|
interface IUse {
|
|
160
166
|
middleware: IHandler;
|
|
161
167
|
propertyKey: string | symbol;
|
|
@@ -406,8 +412,6 @@ interface OpenAPIObject {
|
|
|
406
412
|
externalDocs?: ExternalDocumentationObject;
|
|
407
413
|
}
|
|
408
414
|
|
|
409
|
-
type ParseFunction = (_$: typeof Validation) => TypeObject<ValidationBase>;
|
|
410
|
-
|
|
411
415
|
interface HttpResponseBase<T> {
|
|
412
416
|
success: true;
|
|
413
417
|
status: number;
|
|
@@ -436,29 +440,47 @@ interface HttpResponseOptions {
|
|
|
436
440
|
meta?: TypeAnyObject;
|
|
437
441
|
}
|
|
438
442
|
|
|
443
|
+
interface UploadOptions {
|
|
444
|
+
count?: number;
|
|
445
|
+
path?: string;
|
|
446
|
+
size?: number;
|
|
447
|
+
types?: Array<string>;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
type ValidationFunction = (_$: typeof Validation) => TypeObject<ValidationBase>;
|
|
451
|
+
|
|
439
452
|
declare class Application<T extends TypeAnyObject = TypeAnyObject> extends EventEmitter<T> {
|
|
440
453
|
private readonly _app;
|
|
441
454
|
private _server?;
|
|
455
|
+
private readonly _boundServers;
|
|
442
456
|
private readonly _options;
|
|
443
|
-
private readonly
|
|
444
|
-
private readonly
|
|
457
|
+
private readonly _baseRouter;
|
|
458
|
+
private readonly _globalRouter;
|
|
445
459
|
private readonly _controllers;
|
|
446
460
|
get controllers(): Array<object>;
|
|
447
461
|
get instance(): Express;
|
|
448
462
|
get router(): Router;
|
|
449
463
|
get server(): http.Server | https.Server | undefined;
|
|
450
|
-
constructor(controllers: Array<object | TypeAnyConstructor>, options?:
|
|
464
|
+
constructor(controllers: Array<object | TypeAnyConstructor>, options?: ExpressOptions);
|
|
451
465
|
init(): void;
|
|
452
466
|
error(message: any, _source?: string): void;
|
|
453
467
|
log(message: string, _source?: string): void;
|
|
454
|
-
private
|
|
455
|
-
private
|
|
456
|
-
private
|
|
457
|
-
private
|
|
458
|
-
private
|
|
459
|
-
private
|
|
460
|
-
private
|
|
468
|
+
private _resolveArgs;
|
|
469
|
+
private _buildMiddlewareChain;
|
|
470
|
+
private _collectExtends;
|
|
471
|
+
private _filterParamsByKey;
|
|
472
|
+
private _collectMiddlewares;
|
|
473
|
+
private _logRouteNotFound;
|
|
474
|
+
private _formatListeningMessage;
|
|
461
475
|
listen(): Promise<void>;
|
|
476
|
+
close(): Promise<void>;
|
|
477
|
+
private _resolveMode;
|
|
478
|
+
private _resolveTls;
|
|
479
|
+
private _bindServer;
|
|
480
|
+
private _startHttp;
|
|
481
|
+
private _startHttps;
|
|
482
|
+
private _startHttpsWithRedirect;
|
|
483
|
+
private _startHybrid;
|
|
462
484
|
}
|
|
463
485
|
|
|
464
486
|
declare const Controller: (path?: string) => ClassDecorator;
|
|
@@ -487,11 +509,11 @@ declare const Put: (path?: string) => MethodDecorator;
|
|
|
487
509
|
|
|
488
510
|
declare const Middleware: (method: string, argument?: any) => MethodDecorator;
|
|
489
511
|
|
|
490
|
-
declare const Upload: (options: TypeObject<
|
|
512
|
+
declare const Upload: (options: TypeObject<UploadOptions>) => MethodDecorator;
|
|
491
513
|
|
|
492
514
|
declare const Use: (callback: IHandler, argument?: any) => MethodDecorator;
|
|
493
515
|
|
|
494
|
-
declare const Validate: (value: TypeObject<ValidationBase> |
|
|
516
|
+
declare const Validate: (value: TypeObject<ValidationBase> | ValidationFunction) => MethodDecorator;
|
|
495
517
|
|
|
496
518
|
declare const App: (key?: string) => ParameterDecorator;
|
|
497
519
|
|
|
@@ -694,4 +716,4 @@ declare class StatusText {
|
|
|
694
716
|
}
|
|
695
717
|
|
|
696
718
|
export { All, App, Application, Argument, BadRequestError, Body, Cache, Context, Controller, Cookies, Ctx, Delete, Extends, Files, ForbiddenError, Get, Head, Headers, HttpResponse, InternalServerError, Metadata, Methods, Middleware, NotFoundError, Options, Params, Patch, Post, Put, Query, ResponseError, Session, StatusCodes, StatusText, UnauthorizedError, Upload, Use, Validate, ValidationError, methodFactory, parameterFactory };
|
|
697
|
-
export type { CallbackObject, ComponentsObject, ContactObject, EncodingObject, ExampleObject, ExternalDocumentationObject, HeaderObject, HttpResponseBase, HttpResponseCreated, HttpResponseError, HttpResponseOptions, IArgs, ICache, ICookie,
|
|
719
|
+
export type { CallbackObject, ComponentsObject, ContactObject, EncodingObject, ExampleObject, ExpressOptions, ExternalDocumentationObject, FileUpload, HeaderObject, HttpResponseBase, HttpResponseCreated, HttpResponseError, HttpResponseOptions, IArgs, ICache, ICookie, IHandler, IMiddlewares, IParameter, IRouter, IStore, IUse, InfoObject, LicenseObject, LinkObject, MediaTypeObject, Method, OAuthFlowObject, OAuthFlowsObject, OpenAPIObject, OperationObject, ParameterObject, PathItemObject, PathsObject, ReferenceObject, RequestBodyObject, ResponseObject, ResponsesObject, SchemaObject, SecurityRequirementObject, SecuritySchemeObject, ServerMode, ServerObject, ServerVariableObject, TagObject, TlsOptions, UploadOptions, ValidationFunction };
|
package/dist/index.esm.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/express v2.
|
|
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,forEachKey as n,map as a,isUndefined as l,isNull as u,EventEmitter as d,isConstructor as h,merge as c,isFunction as p,noop as E,isArray as _,uuidv7 as m,Validation as R}from"@andrewcaires/utils.js";import T from"compression";import v from"cookie-parser";import O from"cors";import N,{Router as g,json as A,urlencoded as f}from"express";import I from"express-session";import{existsSync as S}from"fs";import*as D from"http";import*as y from"https";import{Server as C}from"net";import{resolve as L,join as x}from"path";import{getClientIp as P}from"request-ip";import U,{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 b{}b.CONTINUE=100,b.SWITCHING_PROTOCOLS=101,b.PROCESSING=102,b.OK=200,b.CREATED=201,b.ACCEPTED=202,b.NON_AUTHORITATIVE_INFORMATION=203,b.NO_CONTENT=204,b.RESET_CONTENT=205,b.PARTIAL_CONTENT=206,b.MULTI_STATUS=207,b.ALREADY_REPORTED=208,b.IM_USED=226,b.MULTIPLE_CHOICES=300,b.MOVED_PERMANENTLY=301,b.FOUND=302,b.SEE_OTHER=303,b.NOT_MODIFIED=304,b.USE_PROXY=305,b.TEMPORARY_REDIRECT=307,b.PERMANENT_REDIRECT=308,b.BAD_REQUEST=400,b.UNAUTHORIZED=401,b.PAYMENT_REQUIRED=402,b.FORBIDDEN=403,b.NOT_FOUND=404,b.METHOD_NOT_ALLOWED=405,b.NOT_ACCEPTABLE=406,b.PROXY_AUTHENTICATION_REQUIRED=407,b.REQUEST_TIMEOUT=408,b.CONFLICT=409,b.GONE=410,b.LENGTH_REQUIRED=411,b.PRECONDITION_FAILED=412,b.PAYLOAD_TOO_LARGE=413,b.REQUEST_URI_TOO_LONG=414,b.UNSUPPORTED_MEDIA_TYPE=415,b.REQUESTED_RANGE_NOT_SATISFIABLE=416,b.EXPECTATION_FAILED=417,b.IM_A_TEAPOT=418,b.MISDIRECTED_REQUEST=421,b.UNPROCESSABLE_ENTITY=422,b.LOCKED=423,b.FAILED_DEPENDENCY=424,b.UPGRADE_REQUIRED=426,b.PRECONDITION_REQUIRED=428,b.TOO_MANY_REQUESTS=429,b.REQUEST_HEADER_FIELDS_TOO_LARGE=431,b.CONNECTION_CLOSED_WITHOUT_RESPONSE=444,b.UNAVAILABLE_FOR_LEGAL_REASONS=451,b.CLIENT_CLOSED_REQUEST=499,b.INTERNAL_SERVER_ERROR=500,b.NOT_IMPLEMENTED=501,b.BAD_GATEWAY=502,b.SERVICE_UNAVAILABLE=503,b.GATEWAY_TIMEOUT=504,b.HTTP_VERSION_NOT_SUPPORTED=505,b.VARIANT_ALSO_NEGOCIATES=506,b.INSUFFICIENT_STORAGE=507,b.LOOP_DETECTED=508,b.NOT_EXTENDED=510,b.NETWORK_AUTHENTICATION_REQUIRED=511,b.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=b.INTERNAL_SERVER_ERROR){super(e),this.status=t}}class q extends w{constructor(e="Bad Request"){super(e,b.BAD_REQUEST)}}class H extends w{constructor(e="Forbidden"){super(e,b.FORBIDDEN)}}class G extends w{constructor(e="Internal server error"){super(e,b.INTERNAL_SERVER_ERROR)}}class Q extends w{constructor(e="Not Found"){super(e,b.NOT_FOUND)}}class V extends w{constructor(e="Unauthorized"){super(e,b.UNAUTHORIZED)}}class $ extends w{constructor(e){super(e,b.UNPROCESSABLE_ENTITY)}}class B{static created(e,t,s){var r,o;const i=b.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(b.NO_CONTENT).end()}static ok(e,t,s){var r,o;const i=b.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=b.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 b.INTERNAL_SERVER_ERROR;const t=Math.trunc(e);return t<400||t>599?b.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.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&&n({"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()||B.error(this.req,this.res,e)}file(e){this.isResponded()||(this.status(b.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 a(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 a(null!==(t=null===(e=this.req)||void 0===e?void 0:e.headers)&&void 0!==t?t:{},e=>this.normalize(e))}getIp(){return P(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 a(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 l(s)?void 0:String(s)}getParams(){var e,t;return a(null!==(t=null===(e=this.req)||void 0===e?void 0:e.params)&&void 0!==t?t:{},e=>{if(!l(e)&&!u(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(b.OK,e)}normalize(e){if(!l(e)&&!u(e))return i(e)?JSON.stringify(e):String(e)}ok(e,t){this.isResponded()||B.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||l(t)?this.res.end():this.res.json(t))}setCookie(e,t,s){this.res.cookie(e,t,null!=s?s:{})}status(e){return l(e)||this.res.status(e),this.res.statusCode}success(e){this.send(b.OK,{message:e})}}class K{static extends(t){return e(K.EXTENDS,t,[])}static middleware(t){return e(K.MIDDLEWARE,t,[])}static parameters(t){return e(K.PARAMETERS,t,[])}static path(t,s){return e(K.PATH,t,s)}static routers(t){return e(K.ROUTERS,t,[])}}K.EXTENDS=Symbol("EXTENDS"),K.MIDDLEWARE=Symbol("MIDDLEWARE"),K.PARAMETERS=Symbol("PARAMETERS"),K.PATH=Symbol("PATH"),K.ROUTERS=Symbol("ROUTERS");class Y extends d{get controllers(){return this._controllers}get instance(){return this._app}get router(){return this._router}get server(){return this._server}constructor(e,s){var r,o;super(),this._app=N(),this._options={},this._base=g(),this._router=g(),this._controllers=[],this._controllers.push(...e.map(e=>h(e)?new e(...t(e)):e)),this._options=c({},{cross:!1,hybrid:!1,path:"/",port:3e3,session:{secret:"yoursecret",resave:!0,saveUninitialized:!1,cookie:{maxAge:864e5}}},null!=s?s:{}),this._app.use(A(this._options.json)),this._app.disable("x-powered-by"),this._app.use(f({extended:!0})),this._options.cross&&this._app.use(O(i(this._options.cross)?this._options.cross:{})),this._app.use(T(this._options.compression)),this._app.use(v(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._router);const n=(null===(o=this._options.path)||void 0===o?void 0:o.length)?this._options.path:"/";if(this._app.use(n,this._base),this._app.all(n+"/*path",(e,t)=>{this._options.redirect?t.redirect(this._options.redirect):B.error(e,t,new Q("Endpoint Not Found"))}),this._options.public){const e=L(this._options.public);S(e)&&this._app.use(N.static(e)),this._app.get("*path",(t,s)=>{S(e)?s.sendFile(e+"/index.html"):this._options.notfound?s.redirect(this._options.notfound):B.error(t,s,new Q('FILE "index.html" Not Found'))})}else this._app.all("*path",(e,t)=>{this._options.redirect?t.redirect(this._options.redirect):B.error(e,t,new Q("Endpoint not found"))});this._controllers.forEach(e=>{const t=g(),s=this._middlewares(e),r=K.parameters(e);this._extends(e).forEach(e=>{s.push(...this._middlewares(e)),r.push(...K.parameters(e))}),K.routers(e).forEach(o=>{const n=o.propertyKey.toString();if(p(e[n])){if(!p(t[o.method]))return this._notFound(o.method);const a=this._handles(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._args(a,this._indexes(n,r)),u=yield e[n](...l);a.close(_(u)||i(u)?u:void 0)}))}this._notFound(`${e.name}.${n}`)}),this._extends(e).forEach(o=>{K.routers(o).forEach(o=>{const n=o.propertyKey.toString();if(p(e[n])){if(!p(t[o.method]))return this._notFound(o.method);const a=this._handles(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._args(a,this._indexes(n,r)),u=yield e[n](...l);a.close(_(u)||i(u)?u:void 0)}))}this._notFound(`${e.constructor.name}.${n}`)})}),this._base.use(K.path(e,"/"),t)})}init(){}error(e,t){s.error(e)}log(e,t){s.info(e)}_args(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}_handles(e,t,s,r){return s.filter(e=>e.propertyKey==t).map(t=>{if(t.callback!=E){const s=this._indexes(t.method,r);return(r,o,n)=>F(this,void 0,void 0,function*(){const a=new j(r,o,n,this,e),l=p(t.argument)?t.argument(a):t.argument,u=yield t.callback.call(e,...this._args(a,s,l));(_(u)||i(u))&&a.close(u)})}this._notFound(t.method)}).filter(p)}_extends(e){return K.extends(e).reduce((e,t)=>(e.push(t,...this._extends(t)),e),[]).filter((e,t,s)=>s.indexOf(e)===t)}_indexes(e,t){return t.filter(t=>t.propertyKey==e)}_middlewares(e){return[...K.middleware(e)].reverse()}_notFound(e){this.error(new Error(`Router "${e}" not found`),"express")}_port(e){return`Server listening on port ${e}`}listen(){return F(this,void 0,void 0,function*(){if(this._options.cert&&this._options.key||(this._server=D.createServer(this._app),this._server.listen(this._options.port,()=>this.log(this._port(this._options.port),"express"))),!this._server){const e=D.createServer((e,t)=>{const s=80==this._options.port?":80":"";t.writeHead(b.MOVED_PERMANENTLY,{Location:`https://${e.headers.host}${s}${e.url}`}),t.end()}),t=y.createServer({key:this._options.key,cert:this._options.cert},this._app);if(this._options.hybrid){new C(s=>{s.once("data",r=>{s.pause(),s.unshift(r),(22===r[0]?t:e).emit("connection",s),process.nextTick(()=>s.resume())})}).listen(this._options.port,()=>this.log(this._port(this._options.port),"express")),this._server=t}this._server||(443==this._options.port&&e.listen(80,()=>this.log(this._port(80),"express")),t.listen(this._options.port,()=>this.log(this._port(this._options.port),"express")),this._server=t)}})}}const z=e=>t=>{K.path(t,(null==e?void 0:e.length)?e:"/")},W=e=>t=>{K.extends(t).push(e)},X=e=>t=>(s,r,o)=>{K.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=m();se()(s,o,0),K.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)=>{K.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),me=he(de.OPTIONS),Re=he(de.PATCH),Te=he(de.POST),ve=he(de.PUT),Oe=(e,t)=>(s,r)=>{let i=E;if(o(r)){const t=s;p(t[e])&&(i=t[e])}K.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"},ge=(e,t)=>{var s;return null!==(s=e[t])&&void 0!==s?s:null},Ae=(e,t)=>{const s=m()+"."+t;return S(x(e,s))?Ae(e,t):s},fe=e=>{const t=c({},e),s=M({destination(e,s,r){var o;const i=ge(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=ge(t,s.fieldname);r(null,Ae(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=ge(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"LIMIT_UNEXPECTED_FILE"==t.code&&(t.message=`FIELD "${t.field}" EXCEEDS MAX SIZE`),e.destroy(t);e.next()})})(e,t,s)}},Ie=e=>{const t=R.object(p(e)?e(R):e).parse();return(e,s,r)=>{le(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 $(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,q as BadRequestError,ee as Body,ue as Cache,j as Context,z as Controller,te as Cookies,se as Ctx,pe as Delete,W as Extends,re as Files,H as ForbiddenError,Ee as Get,_e as Head,oe as Headers,B as HttpResponse,G as InternalServerError,K as Metadata,de as Methods,Oe as Middleware,Q as NotFoundError,me as Options,ie as Params,Re as Patch,Te as Post,ve as Put,ne as Query,w as ResponseError,ae as Session,b as StatusCodes,k as StatusText,V as UnauthorizedError,fe as Upload,le as Use,Ie as Validate,$ 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.
|
|
3
|
+
"version": "2.2.1",
|
|
4
4
|
"description": "Decorators for express",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs.js",
|
|
@@ -38,35 +38,35 @@
|
|
|
38
38
|
"homepage": "https://github.com/andrewcaires/npm/tree/main/api#readme",
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"@andrewcaires/decorator": "^1.1.1",
|
|
41
|
-
"@andrewcaires/node": "^1.3.
|
|
42
|
-
"@andrewcaires/utils.js": "^0.4.
|
|
41
|
+
"@andrewcaires/node": "^1.3.3",
|
|
42
|
+
"@andrewcaires/utils.js": "^0.4.34",
|
|
43
43
|
"compression": "^1.8.1",
|
|
44
44
|
"cookie-parser": "^1.4.7",
|
|
45
45
|
"cors": "^2.8.6",
|
|
46
46
|
"express": "^5.2.1",
|
|
47
47
|
"express-session": "^1.19.0",
|
|
48
|
-
"multer": "^2.
|
|
48
|
+
"multer": "^2.1.1",
|
|
49
49
|
"request-ip": "^3.3.0"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@eslint/js": "^10.0.1",
|
|
53
|
-
"@rollup/plugin-commonjs": "^29.0.
|
|
54
|
-
"@rollup/plugin-terser": "^0.
|
|
53
|
+
"@rollup/plugin-commonjs": "^29.0.2",
|
|
54
|
+
"@rollup/plugin-terser": "^1.0.0",
|
|
55
55
|
"@rollup/plugin-typescript": "^12.3.0",
|
|
56
|
-
"@rollup/rollup-darwin-arm64": "^4.
|
|
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",
|
|
60
60
|
"@types/express": "^5.0.6",
|
|
61
|
-
"@types/express-session": "^1.
|
|
62
|
-
"@types/multer": "^2.
|
|
63
|
-
"@types/node": "^25.
|
|
61
|
+
"@types/express-session": "^1.19.0",
|
|
62
|
+
"@types/multer": "^2.1.0",
|
|
63
|
+
"@types/node": "^25.6.0",
|
|
64
64
|
"@types/request-ip": "^0.0.41",
|
|
65
65
|
"@types/swagger-ui-express": "^4.1.8",
|
|
66
|
-
"eslint": "^10.0
|
|
67
|
-
"rollup-plugin-dts": "^6.
|
|
66
|
+
"eslint": "^10.3.0",
|
|
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.
|
|
70
|
+
"typescript-eslint": "^8.59.2"
|
|
71
71
|
}
|
|
72
72
|
}
|