@andrewcaires/express 1.2.4 → 1.2.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @andrewcaires/express v1.2.4
2
+ * @andrewcaires/express v1.2.5
3
3
  * Decorators for express
4
4
  * (c) 2025 Andrew Caires
5
5
  * @license: MIT
6
6
  */
7
- "use strict";var e=require("@andrewcaires/node"),t=require("@andrewcaires/utils.js"),s=require("compression"),r=require("cookie-parser"),o=require("cors"),i=require("express"),n=require("express-session"),a=require("fs"),p=require("http"),h=require("https"),u=require("net"),c=require("path"),E=require("request-ip"),l=require("multer");function d(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 _=d(p),T=d(h);function O(e,t,s,r){return new(s||(s=Promise))((function(o,i){function n(e){try{p(r.next(e))}catch(e){i(e)}}function a(e){try{p(r.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?o(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(n,a)}p((r=r.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;class x{}x.CONTINUE=100,x.SWITCHING_PROTOCOLS=101,x.PROCESSING=102,x.OK=200,x.CREATED=201,x.ACCEPTED=202,x.NON_AUTHORITATIVE_INFORMATION=203,x.NO_CONTENT=204,x.RESET_CONTENT=205,x.PARTIAL_CONTENT=206,x.MULTI_STATUS=207,x.ALREADY_REPORTED=208,x.IM_USED=226,x.MULTIPLE_CHOICES=300,x.MOVED_PERMANENTLY=301,x.FOUND=302,x.SEE_OTHER=303,x.NOT_MODIFIED=304,x.USE_PROXY=305,x.TEMPORARY_REDIRECT=307,x.PERMANENT_REDIRECT=308,x.BAD_REQUEST=400,x.UNAUTHORIZED=401,x.PAYMENT_REQUIRED=402,x.FORBIDDEN=403,x.NOT_FOUND=404,x.METHOD_NOT_ALLOWED=405,x.NOT_ACCEPTABLE=406,x.PROXY_AUTHENTICATION_REQUIRED=407,x.REQUEST_TIMEOUT=408,x.CONFLICT=409,x.GONE=410,x.LENGTH_REQUIRED=411,x.PRECONDITION_FAILED=412,x.PAYLOAD_TOO_LARGE=413,x.REQUEST_URI_TOO_LONG=414,x.UNSUPPORTED_MEDIA_TYPE=415,x.REQUESTED_RANGE_NOT_SATISFIABLE=416,x.EXPECTATION_FAILED=417,x.IM_A_TEAPOT=418,x.MISDIRECTED_REQUEST=421,x.UNPROCESSABLE_ENTITY=422,x.LOCKED=423,x.FAILED_DEPENDENCY=424,x.UPGRADE_REQUIRED=426,x.PRECONDITION_REQUIRED=428,x.TOO_MANY_REQUESTS=429,x.REQUEST_HEADER_FIELDS_TOO_LARGE=431,x.CONNECTION_CLOSED_WITHOUT_RESPONSE=444,x.UNAVAILABLE_FOR_LEGAL_REASONS=451,x.CLIENT_CLOSED_REQUEST=499,x.INTERNAL_SERVER_ERROR=500,x.NOT_IMPLEMENTED=501,x.BAD_GATEWAY=502,x.SERVICE_UNAVAILABLE=503,x.GATEWAY_TIMEOUT=504,x.HTTP_VERSION_NOT_SUPPORTED=505,x.VARIANT_ALSO_NEGOCIATES=506,x.INSUFFICIENT_STORAGE=507,x.LOOP_DETECTED=508,x.NOT_EXTENDED=510,x.NETWORK_AUTHENTICATION_REQUIRED=511,x.NETWORK_CONNECTION_TIMEOUT_ERROR=599;class R{constructor(e,t,s,r){this.req=e,this.res=t,this.next=s,this.controller=r}cache(e){const s=[];e.private?s.push("private"):e.public&&s.push("public"),e.noStore&&(e.noCache=!0,s.push("no-store")),e.noCache&&(e.maxAge=0,delete e.sMaxAge,s.push("no-cache")),e.noTransform&&s.push("no-transform"),e.proxyRevalidate&&s.push("proxy-revalidate"),e.mustRevalidate?s.push("must-revalidate"):e.noCache||(t.isNumber(e.staleIfError)&&s.push(`stale-if-error=${e.staleIfError}`),t.isNumber(e.staleWhileRevalidate)&&s.push(`stale-while-revalidate=${e.staleWhileRevalidate}`)),t.isNumber(e.maxAge)&&s.push(`max-age=${e.maxAge}`),t.isNumber(e.sMaxAge)&&s.push(`s-maxage=${e.sMaxAge}`),s.length&&(this.res.setHeader("Cache-Control",s.join(",")),e.noCache&&t.forEachKey({"Surrogate-Control":"no-store",Pragma:"no-cache",ETag:"false",Expires:"0"},((e,t)=>this.res.setHeader(t,e))))}close(e){this.res.headersSent||this.res.json(e||this.storage)}destroy(e){var t;e&&this.error(e.message),null===(t=this.res.socket)||void 0===t||t.destroy(e)}error(e){this.send(x.INTERNAL_SERVER_ERROR,{message:e})}file(e){this.res.headersSent||(this.status(x.OK),this.res.sendFile(c.resolve(e)))}ip(){return E.getClientIp(this.req)||"0.0.0.0"}json(e){this.send(x.OK,e)}notFound(e){this.send(x.NOT_FOUND,{message:e})}prepare(e,t){this.res.headersSent||(this.status(e),this.storage=t)}send(e,t){this.res.headersSent||(this.status(e),this.res.json(t))}status(e){return e&&this.res.status(e),this.res.statusCode}success(e){this.send(x.OK,{message:e})}unauthorized(e){this.send(x.UNAUTHORIZED,{message:e})}validation(e){this.send(x.BAD_REQUEST,{message:e})}}class N{static extends(t){return e.Metadata(N.EXTENDS,t,[])}static middleware(t){return e.Metadata(N.MIDDLEWARE,t,[])}static parameters(t){return e.Metadata(N.PARAMETERS,t,[])}static path(t,s){return e.Metadata(N.PATH,t,s)}static routers(t){return e.Metadata(N.ROUTERS,t,[])}}N.EXTENDS=Symbol(),N.MIDDLEWARE=Symbol(),N.PARAMETERS=Symbol(),N.PATH=Symbol(),N.ROUTERS=Symbol();class A extends t.EventEmitter{get controllers(){return this._controllers}get instance(){return this._app}get router(){return this._router}get server(){return this._server}constructor(e,p){var h;super(),this._app=i(),this._options={},this._default={cross:!1,hybrid:!1,path:"/",port:3e3,session:{secret:"yoursecret",resave:!0,saveUninitialized:!1,cookie:{maxAge:864e5}}},this._base=i.Router(),this._router=i.Router(),this._controllers=[],this._controllers.push(...e),this._options=t.merge(Object.assign({},this._default),Object.assign({},p)),this._app.use(i.json(this._options.json)),this._app.disable("x-powered-by"),this._app.use(i.urlencoded({extended:!0})),this._options.cross&&this._app.use(o(t.isObject(this._options.cross)?this._options.cross:{}));const u=this._options.cookie;this._app.use(s()),this._app.use(r(null==u?void 0:u.secret,null==u?void 0:u.options)),this._app.use(n(this._options.session)),this.init(),this._app.use(this._router);const E=(null===(h=this._options.path)||void 0===h?void 0:h.length)?this._options.path:"/";if(this._app.use(E,this._base),this._app.all(E+"/*",((e,t)=>{this._options.redirect?t.redirect(this._options.redirect):(t.status(x.NOT_FOUND),t.json({message:"INVALID API"}))})),this._options.public){const e=c.resolve(this._options.public);a.existsSync(e)&&this._app.use(i.static(e)),this._app.get("*",((t,s)=>{a.existsSync(e)?s.sendFile(e+"/index.html"):this._options.notfound?s.redirect(this._options.notfound):(s.status(x.NOT_FOUND),s.json({message:'FILE "index.html" NOT FOUND'}))}))}else this._app.all("*",((e,t)=>{this._options.redirect?t.redirect(this._options.redirect):(t.status(x.NOT_FOUND),t.json({message:"INVALID API"}))}));e.forEach((e=>{const s=i.Router(),r=this._middlewares(e),o=N.parameters(e);this._extends(e).forEach((e=>{r.push(...this._middlewares(e)),o.push(...N.parameters(e))})),N.routers(e).forEach((i=>{const n=i.propertyKey.toString();if(t.isFunction(e[n])){if(!t.isFunction(s[i.method]))return this._notFound(i.method);const a=this._handles(e,n,r,o);return s[i.method](i.path,...a,((s,r,i)=>O(this,void 0,void 0,(function*(){const a=new R(s,r,i,e),p=this._args(a,this._indexes(n,o)),h=yield e[n](...p);a.close(t.isArray(h)||t.isObject(h)?h:void 0)}))))}this._notFound(`${e.name}.${n}`)})),this._extends(e).forEach((i=>{N.routers(i).forEach((i=>{const n=i.propertyKey.toString();if(t.isFunction(e[n])){if(!t.isFunction(s[i.method]))return this._notFound(i.method);const a=this._handles(e,n,r,o);return s[i.method](i.path,...a,((s,r,i)=>O(this,void 0,void 0,(function*(){const a=new R(s,r,i,e),p=this._args(a,this._indexes(n,o)),h=yield e[n](...p);a.close(t.isArray(h)||t.isObject(h)?h:void 0)}))))}this._notFound(`${e.constructor.name}.${n}`)}))})),this._base.use(N.path(e,"/"),s)}))}init(){}error(t,s){e.Log.error(t)}log(t,s){e.Log.info(t)}_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,s,r,o){return r.filter((e=>e.propertyKey==s)).map((s=>{if(s.callback!=t.noop){const r=this._indexes(s.method,o);return(o,i,n)=>O(this,void 0,void 0,(function*(){const a=new R(o,i,n,e),p=t.isFunction(s.argument)?s.argument(a):s.argument,h=yield s.callback.call(e,...this._args(a,r,p));(t.isArray(h)||t.isObject(h))&&a.close(h)}))}this._notFound(s.method)})).filter(t.isFunction)}_extends(e){return N.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[...N.middleware(e)].reverse()}_notFound(e){this.error(new Error(`Router "${e}" not found`),"express")}_port(e){return`Server listening on port ${e}`}listen(){return O(this,void 0,void 0,(function*(){if(this._options.cert&&this._options.key||(this._server=_.createServer(this._app),this._server.listen(this._options.port,(()=>this.log(this._port(this._options.port),"express")))),!this._server){const e=_.createServer(((e,t)=>{const s=80==this._options.port?":80":"";t.writeHead(x.MOVED_PERMANENTLY,{Location:`https://${e.headers.host}${s}${e.url}`}),t.end()})),t=T.createServer({key:this._options.key,cert:this._options.cert},this._app);if(this._options.hybrid){new u.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)}}))}}var m;exports.Methods=void 0,(m=exports.Methods||(exports.Methods={})).ALL="all",m.GET="get",m.POST="post",m.PUT="put",m.HEAD="head",m.DELETE="delete",m.OPTIONS="options",m.PATCH="patch";const I=e=>t=>(s,r)=>{N.routers(s).push({method:e,path:(null==t?void 0:t.length)?t:"/",propertyKey:r})},S=I(exports.Methods.ALL),f=e=>t=>(s,r,o)=>{N.parameters(s).push({callback:e,key:t,propertyKey:r,parameterIndex:o})},D=f((({app:e})=>e)),g=f((({argument:e})=>e)),y=(e,s)=>t.isUndefined(s)?e:e[s],v=f((({ctx:e,key:t})=>y(e.req.body,t))),U=f((({ctx:e,key:t})=>y(e.req.cookies,t))),C=f((({ctx:e})=>e)),P=f((({ctx:e})=>t.toArray(e.req.files))),L=f((({ctx:e,key:t})=>y(e.req.headers,t))),M=f((({ctx:e,key:t})=>y(e.req.params,t))),b=f((({ctx:e,key:t})=>y(e.req.query,t))),F=f((({ctx:e})=>e.req.session)),k=(e,s)=>(r,o)=>{const i=t.uniqueID();C()(r,i,0),N.middleware(r).push({method:i,argument:s,propertyKey:o,callback:e})},q=I(exports.Methods.DELETE),j=I(exports.Methods.GET),w=I(exports.Methods.HEAD),H=I(exports.Methods.OPTIONS),G=I(exports.Methods.PATCH),K=I(exports.Methods.POST),Q=I(exports.Methods.PUT);class Y{static file(e,s){const r=t.uuidv4()+"."+s;return a.existsSync(c.join(e,r))?Y.file(e,s):r}static middleware(e,t){const s=Y._cache(t);s.upload||(s.upload=Y.multer(t)),s.upload(e.req,e.res,(t=>{if(t)return e.destroy(t);e.next()}))}static multer(e){const t=(null==e?void 0:e.path)||"./",s=l.diskStorage({destination:(e,s,r)=>r(null,t),filename:(e,s,r)=>O(this,void 0,void 0,(function*(){return r(null,Y.file(t,s.originalname.split(".").pop()||"bin"))}))}),r=(null==e?void 0:e.types)||[];return l({storage:s,fileFilter(e,t,s){return O(this,void 0,void 0,(function*(){if(r.length){const e=t.originalname.split(".").pop()||"bin";return-1!=r.indexOf(t.mimetype)||-1!=r.indexOf(e)?s(null,!0):s(new Error("File not allowed"))}return s(null,!0)}))},limits:{fileSize:1e6*((null==e?void 0:e.size)||5)}}).array((null==e?void 0:e.field)||"field",(null==e?void 0:e.count)||1)}}Y._cache=t.cache(),exports.All=S,exports.App=D,exports.Application=A,exports.Argument=g,exports.Body=v,exports.Cache=e=>(t,s,r)=>{k((t=>{t.cache(Object.assign({},e)),t.next()}))(t,s,r)},exports.Context=R,exports.Controller=e=>t=>{N.path(t,(null==e?void 0:e.length)?e:"/")},exports.Cookies=U,exports.Ctx=C,exports.Delete=q,exports.Extends=e=>t=>{N.extends(t).push(e)},exports.Files=P,exports.Get=j,exports.Head=w,exports.Headers=L,exports.Metadata=N,exports.Middleware=(e,s)=>(r,o)=>{let i=t.noop;if(t.isString(o)){const s=r;t.isFunction(s[e])&&(i=s[e])}N.middleware(r).push({method:e,argument:s,propertyKey:o,callback:i})},exports.Options=H,exports.Params=M,exports.Patch=G,exports.Post=K,exports.Put=Q,exports.Query=b,exports.Session=F,exports.Status=x,exports.Upload=Y,exports.Use=k,exports.methodFactory=I,exports.parameterFactory=f;
7
+ "use strict";var e=require("@andrewcaires/node"),t=require("@andrewcaires/utils.js"),s=require("compression"),r=require("cookie-parser"),o=require("cors"),i=require("express"),n=require("express-session"),a=require("fs"),p=require("http"),h=require("https"),u=require("net"),c=require("path"),E=require("request-ip"),l=require("multer");function d(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 _=d(p),T=d(h);function O(e,t,s,r){return new(s||(s=Promise))(function(o,i){function n(e){try{p(r.next(e))}catch(e){i(e)}}function a(e){try{p(r.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?o(e.value):(t=e.value,t instanceof s?t:new s(function(e){e(t)})).then(n,a)}p((r=r.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;class x{}x.CONTINUE=100,x.SWITCHING_PROTOCOLS=101,x.PROCESSING=102,x.OK=200,x.CREATED=201,x.ACCEPTED=202,x.NON_AUTHORITATIVE_INFORMATION=203,x.NO_CONTENT=204,x.RESET_CONTENT=205,x.PARTIAL_CONTENT=206,x.MULTI_STATUS=207,x.ALREADY_REPORTED=208,x.IM_USED=226,x.MULTIPLE_CHOICES=300,x.MOVED_PERMANENTLY=301,x.FOUND=302,x.SEE_OTHER=303,x.NOT_MODIFIED=304,x.USE_PROXY=305,x.TEMPORARY_REDIRECT=307,x.PERMANENT_REDIRECT=308,x.BAD_REQUEST=400,x.UNAUTHORIZED=401,x.PAYMENT_REQUIRED=402,x.FORBIDDEN=403,x.NOT_FOUND=404,x.METHOD_NOT_ALLOWED=405,x.NOT_ACCEPTABLE=406,x.PROXY_AUTHENTICATION_REQUIRED=407,x.REQUEST_TIMEOUT=408,x.CONFLICT=409,x.GONE=410,x.LENGTH_REQUIRED=411,x.PRECONDITION_FAILED=412,x.PAYLOAD_TOO_LARGE=413,x.REQUEST_URI_TOO_LONG=414,x.UNSUPPORTED_MEDIA_TYPE=415,x.REQUESTED_RANGE_NOT_SATISFIABLE=416,x.EXPECTATION_FAILED=417,x.IM_A_TEAPOT=418,x.MISDIRECTED_REQUEST=421,x.UNPROCESSABLE_ENTITY=422,x.LOCKED=423,x.FAILED_DEPENDENCY=424,x.UPGRADE_REQUIRED=426,x.PRECONDITION_REQUIRED=428,x.TOO_MANY_REQUESTS=429,x.REQUEST_HEADER_FIELDS_TOO_LARGE=431,x.CONNECTION_CLOSED_WITHOUT_RESPONSE=444,x.UNAVAILABLE_FOR_LEGAL_REASONS=451,x.CLIENT_CLOSED_REQUEST=499,x.INTERNAL_SERVER_ERROR=500,x.NOT_IMPLEMENTED=501,x.BAD_GATEWAY=502,x.SERVICE_UNAVAILABLE=503,x.GATEWAY_TIMEOUT=504,x.HTTP_VERSION_NOT_SUPPORTED=505,x.VARIANT_ALSO_NEGOCIATES=506,x.INSUFFICIENT_STORAGE=507,x.LOOP_DETECTED=508,x.NOT_EXTENDED=510,x.NETWORK_AUTHENTICATION_REQUIRED=511,x.NETWORK_CONNECTION_TIMEOUT_ERROR=599;class R{constructor(e,t,s,r){this.req=e,this.res=t,this.next=s,this.controller=r}cache(e){const s=[];e.private?s.push("private"):e.public&&s.push("public"),e.noStore&&(e.noCache=!0,s.push("no-store")),e.noCache&&(e.maxAge=0,delete e.sMaxAge,s.push("no-cache")),e.noTransform&&s.push("no-transform"),e.proxyRevalidate&&s.push("proxy-revalidate"),e.mustRevalidate?s.push("must-revalidate"):e.noCache||(t.isNumber(e.staleIfError)&&s.push(`stale-if-error=${e.staleIfError}`),t.isNumber(e.staleWhileRevalidate)&&s.push(`stale-while-revalidate=${e.staleWhileRevalidate}`)),t.isNumber(e.maxAge)&&s.push(`max-age=${e.maxAge}`),t.isNumber(e.sMaxAge)&&s.push(`s-maxage=${e.sMaxAge}`),s.length&&(this.res.setHeader("Cache-Control",s.join(",")),e.noCache&&t.forEachKey({"Surrogate-Control":"no-store",Pragma:"no-cache",ETag:"false",Expires:"0"},(e,t)=>this.res.setHeader(t,e)))}close(e){this.res.headersSent||this.res.json(e||this.storage)}destroy(e){var t;e&&this.error(e.message),null===(t=this.res.socket)||void 0===t||t.destroy(e)}error(e){this.send(x.INTERNAL_SERVER_ERROR,{message:e})}file(e){this.res.headersSent||(this.status(x.OK),this.res.sendFile(c.resolve(e)))}ip(){return E.getClientIp(this.req)||"0.0.0.0"}json(e){this.send(x.OK,e)}notFound(e){this.send(x.NOT_FOUND,{message:e})}prepare(e,t){this.res.headersSent||(this.status(e),this.storage=t)}send(e,t){this.res.headersSent||(this.status(e),this.res.json(t))}status(e){return e&&this.res.status(e),this.res.statusCode}success(e){this.send(x.OK,{message:e})}unauthorized(e){this.send(x.UNAUTHORIZED,{message:e})}validation(e){this.send(x.BAD_REQUEST,{message:e})}}class N{static extends(t){return e.Metadata(N.EXTENDS,t,[])}static middleware(t){return e.Metadata(N.MIDDLEWARE,t,[])}static parameters(t){return e.Metadata(N.PARAMETERS,t,[])}static path(t,s){return e.Metadata(N.PATH,t,s)}static routers(t){return e.Metadata(N.ROUTERS,t,[])}}N.EXTENDS=Symbol(),N.MIDDLEWARE=Symbol(),N.PARAMETERS=Symbol(),N.PATH=Symbol(),N.ROUTERS=Symbol();class A extends t.EventEmitter{get controllers(){return this._controllers}get instance(){return this._app}get router(){return this._router}get server(){return this._server}constructor(e,p){var h;super(),this._app=i(),this._options={},this._default={cross:!1,hybrid:!1,path:"/",port:3e3,session:{secret:"yoursecret",resave:!0,saveUninitialized:!1,cookie:{maxAge:864e5}}},this._base=i.Router(),this._router=i.Router(),this._controllers=[],this._controllers.push(...e),this._options=t.merge(Object.assign({},this._default),Object.assign({},p)),this._app.use(i.json(this._options.json)),this._app.disable("x-powered-by"),this._app.use(i.urlencoded({extended:!0})),this._options.cross&&this._app.use(o(t.isObject(this._options.cross)?this._options.cross:{}));const u=this._options.cookie;this._app.use(s()),this._app.use(r(null==u?void 0:u.secret,null==u?void 0:u.options)),this._app.use(n(this._options.session)),this.init(),this._app.use(this._router);const E=(null===(h=this._options.path)||void 0===h?void 0:h.length)?this._options.path:"/";if(this._app.use(E,this._base),this._app.all(E+"/*path",(e,t)=>{this._options.redirect?t.redirect(this._options.redirect):(t.status(x.NOT_FOUND),t.json({message:"INVALID API"}))}),this._options.public){const e=c.resolve(this._options.public);a.existsSync(e)&&this._app.use(i.static(e)),this._app.get("*",(t,s)=>{a.existsSync(e)?s.sendFile(e+"/index.html"):this._options.notfound?s.redirect(this._options.notfound):(s.status(x.NOT_FOUND),s.json({message:'FILE "index.html" NOT FOUND'}))})}else this._app.all("*path",(e,t)=>{this._options.redirect?t.redirect(this._options.redirect):(t.status(x.NOT_FOUND),t.json({message:"INVALID API"}))});e.forEach(e=>{const s=i.Router(),r=this._middlewares(e),o=N.parameters(e);this._extends(e).forEach(e=>{r.push(...this._middlewares(e)),o.push(...N.parameters(e))}),N.routers(e).forEach(i=>{const n=i.propertyKey.toString();if(t.isFunction(e[n])){if(!t.isFunction(s[i.method]))return this._notFound(i.method);const a=this._handles(e,n,r,o);return s[i.method](i.path,...a,(s,r,i)=>O(this,void 0,void 0,function*(){const a=new R(s,r,i,e),p=this._args(a,this._indexes(n,o)),h=yield e[n](...p);a.close(t.isArray(h)||t.isObject(h)?h:void 0)}))}this._notFound(`${e.name}.${n}`)}),this._extends(e).forEach(i=>{N.routers(i).forEach(i=>{const n=i.propertyKey.toString();if(t.isFunction(e[n])){if(!t.isFunction(s[i.method]))return this._notFound(i.method);const a=this._handles(e,n,r,o);return s[i.method](i.path,...a,(s,r,i)=>O(this,void 0,void 0,function*(){const a=new R(s,r,i,e),p=this._args(a,this._indexes(n,o)),h=yield e[n](...p);a.close(t.isArray(h)||t.isObject(h)?h:void 0)}))}this._notFound(`${e.constructor.name}.${n}`)})}),this._base.use(N.path(e,"/"),s)})}init(){}error(t,s){e.Log.error(t)}log(t,s){e.Log.info(t)}_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,s,r,o){return r.filter(e=>e.propertyKey==s).map(s=>{if(s.callback!=t.noop){const r=this._indexes(s.method,o);return(o,i,n)=>O(this,void 0,void 0,function*(){const a=new R(o,i,n,e),p=t.isFunction(s.argument)?s.argument(a):s.argument,h=yield s.callback.call(e,...this._args(a,r,p));(t.isArray(h)||t.isObject(h))&&a.close(h)})}this._notFound(s.method)}).filter(t.isFunction)}_extends(e){return N.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[...N.middleware(e)].reverse()}_notFound(e){this.error(new Error(`Router "${e}" not found`),"express")}_port(e){return`Server listening on port ${e}`}listen(){return O(this,void 0,void 0,function*(){if(this._options.cert&&this._options.key||(this._server=_.createServer(this._app),this._server.listen(this._options.port,()=>this.log(this._port(this._options.port),"express"))),!this._server){const e=_.createServer((e,t)=>{const s=80==this._options.port?":80":"";t.writeHead(x.MOVED_PERMANENTLY,{Location:`https://${e.headers.host}${s}${e.url}`}),t.end()}),t=T.createServer({key:this._options.key,cert:this._options.cert},this._app);if(this._options.hybrid){new u.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)}})}}var m;exports.Methods=void 0,(m=exports.Methods||(exports.Methods={})).ALL="all",m.GET="get",m.POST="post",m.PUT="put",m.HEAD="head",m.DELETE="delete",m.OPTIONS="options",m.PATCH="patch";const I=e=>t=>(s,r)=>{N.routers(s).push({method:e,path:(null==t?void 0:t.length)?t:"/",propertyKey:r})},S=I(exports.Methods.ALL),f=e=>t=>(s,r,o)=>{N.parameters(s).push({callback:e,key:t,propertyKey:r,parameterIndex:o})},D=f(({app:e})=>e),g=f(({argument:e})=>e),y=(e,s)=>t.isUndefined(s)?e:e[s],v=f(({ctx:e,key:t})=>y(e.req.body,t)),U=f(({ctx:e,key:t})=>y(e.req.cookies,t)),C=f(({ctx:e})=>e),P=f(({ctx:e})=>t.toArray(e.req.files)),L=f(({ctx:e,key:t})=>y(e.req.headers,t)),M=f(({ctx:e,key:t})=>y(e.req.params,t)),b=f(({ctx:e,key:t})=>y(e.req.query,t)),F=f(({ctx:e})=>e.req.session),k=(e,s)=>(r,o)=>{const i=t.uniqueID();C()(r,i,0),N.middleware(r).push({method:i,argument:s,propertyKey:o,callback:e})},q=I(exports.Methods.DELETE),j=I(exports.Methods.GET),w=I(exports.Methods.HEAD),H=I(exports.Methods.OPTIONS),G=I(exports.Methods.PATCH),K=I(exports.Methods.POST),Q=I(exports.Methods.PUT);class Y{static file(e,s){const r=t.uuidv4()+"."+s;return a.existsSync(c.join(e,r))?Y.file(e,s):r}static middleware(e,t){const s=Y._cache(t);s.upload||(s.upload=Y.multer(t)),s.upload(e.req,e.res,t=>{if(t)return e.destroy(t);e.next()})}static multer(e){const t=(null==e?void 0:e.path)||"./",s=l.diskStorage({destination:(e,s,r)=>r(null,t),filename:(e,s,r)=>O(this,void 0,void 0,function*(){return r(null,Y.file(t,s.originalname.split(".").pop()||"bin"))})}),r=(null==e?void 0:e.types)||[];return l({storage:s,fileFilter(e,t,s){return O(this,void 0,void 0,function*(){if(r.length){const e=t.originalname.split(".").pop()||"bin";return-1!=r.indexOf(t.mimetype)||-1!=r.indexOf(e)?s(null,!0):s(new Error("File not allowed"))}return s(null,!0)})},limits:{fileSize:1e6*((null==e?void 0:e.size)||5)}}).array((null==e?void 0:e.field)||"field",(null==e?void 0:e.count)||1)}}Y._cache=t.cache(),exports.All=S,exports.App=D,exports.Application=A,exports.Argument=g,exports.Body=v,exports.Cache=e=>(t,s,r)=>{k(t=>{t.cache(Object.assign({},e)),t.next()})(t,s,r)},exports.Context=R,exports.Controller=e=>t=>{N.path(t,(null==e?void 0:e.length)?e:"/")},exports.Cookies=U,exports.Ctx=C,exports.Delete=q,exports.Extends=e=>t=>{N.extends(t).push(e)},exports.Files=P,exports.Get=j,exports.Head=w,exports.Headers=L,exports.Metadata=N,exports.Middleware=(e,s)=>(r,o)=>{let i=t.noop;if(t.isString(o)){const s=r;t.isFunction(s[e])&&(i=s[e])}N.middleware(r).push({method:e,argument:s,propertyKey:o,callback:i})},exports.Options=H,exports.Params=M,exports.Patch=G,exports.Post=K,exports.Put=Q,exports.Query=b,exports.Session=F,exports.Status=x,exports.Upload=Y,exports.Use=k,exports.methodFactory=I,exports.parameterFactory=f;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @andrewcaires/express v1.2.4
2
+ * @andrewcaires/express v1.2.5
3
3
  * Decorators for express
4
4
  * (c) 2025 Andrew Caires
5
5
  * @license: MIT
@@ -306,4 +306,5 @@ declare class Upload {
306
306
  private static multer;
307
307
  }
308
308
 
309
- export { All, App, Application, Argument, Body, Cache, Context, Controller, Cookies, Ctx, Delete, Extends, Files, Get, Head, Headers, type IArgs, type ICache, type ICookie, type IFile, type IHandler, type IMiddlewares, type IOptions, type IParameter, type IRouter, type IStore, type IUpload, type IUse, Metadata, Methods, Middleware, Options, Params, Patch, Post, Put, Query, Session, Status, Upload, Use, methodFactory, parameterFactory };
309
+ export { All, App, Application, Argument, Body, Cache, Context, Controller, Cookies, Ctx, Delete, Extends, Files, Get, Head, Headers, Metadata, Methods, Middleware, Options, Params, Patch, Post, Put, Query, Session, Status, Upload, Use, methodFactory, parameterFactory };
310
+ export type { IArgs, ICache, ICookie, IFile, IHandler, IMiddlewares, IOptions, IParameter, IRouter, IStore, IUpload, IUse };
package/dist/index.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @andrewcaires/express v1.2.4
2
+ * @andrewcaires/express v1.2.5
3
3
  * Decorators for express
4
4
  * (c) 2025 Andrew Caires
5
5
  * @license: MIT
6
6
  */
7
- import{Metadata as t,Log as e}from"@andrewcaires/node";import{isNumber as s,forEachKey as r,EventEmitter as i,merge as o,isObject as n,isFunction as a,noop as h,isArray as p,isUndefined as E,toArray as _,uniqueID as l,isString as c,cache as u,uuidv4 as d}from"@andrewcaires/utils.js";import T from"compression";import O from"cookie-parser";import m from"cors";import R,{Router as N,json as A,urlencoded as I}from"express";import f from"express-session";import{existsSync as S}from"fs";import*as D from"http";import*as g from"https";import{Server as v}from"net";import{resolve as x,join as y}from"path";import{getClientIp as U}from"request-ip";import L from"multer";function C(t,e,s,r){return new(s||(s=Promise))((function(i,o){function n(t){try{h(r.next(t))}catch(t){o(t)}}function a(t){try{h(r.throw(t))}catch(t){o(t)}}function h(t){var e;t.done?i(t.value):(e=t.value,e instanceof s?e:new s((function(t){t(e)}))).then(n,a)}h((r=r.apply(t,e||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;class P{}P.CONTINUE=100,P.SWITCHING_PROTOCOLS=101,P.PROCESSING=102,P.OK=200,P.CREATED=201,P.ACCEPTED=202,P.NON_AUTHORITATIVE_INFORMATION=203,P.NO_CONTENT=204,P.RESET_CONTENT=205,P.PARTIAL_CONTENT=206,P.MULTI_STATUS=207,P.ALREADY_REPORTED=208,P.IM_USED=226,P.MULTIPLE_CHOICES=300,P.MOVED_PERMANENTLY=301,P.FOUND=302,P.SEE_OTHER=303,P.NOT_MODIFIED=304,P.USE_PROXY=305,P.TEMPORARY_REDIRECT=307,P.PERMANENT_REDIRECT=308,P.BAD_REQUEST=400,P.UNAUTHORIZED=401,P.PAYMENT_REQUIRED=402,P.FORBIDDEN=403,P.NOT_FOUND=404,P.METHOD_NOT_ALLOWED=405,P.NOT_ACCEPTABLE=406,P.PROXY_AUTHENTICATION_REQUIRED=407,P.REQUEST_TIMEOUT=408,P.CONFLICT=409,P.GONE=410,P.LENGTH_REQUIRED=411,P.PRECONDITION_FAILED=412,P.PAYLOAD_TOO_LARGE=413,P.REQUEST_URI_TOO_LONG=414,P.UNSUPPORTED_MEDIA_TYPE=415,P.REQUESTED_RANGE_NOT_SATISFIABLE=416,P.EXPECTATION_FAILED=417,P.IM_A_TEAPOT=418,P.MISDIRECTED_REQUEST=421,P.UNPROCESSABLE_ENTITY=422,P.LOCKED=423,P.FAILED_DEPENDENCY=424,P.UPGRADE_REQUIRED=426,P.PRECONDITION_REQUIRED=428,P.TOO_MANY_REQUESTS=429,P.REQUEST_HEADER_FIELDS_TOO_LARGE=431,P.CONNECTION_CLOSED_WITHOUT_RESPONSE=444,P.UNAVAILABLE_FOR_LEGAL_REASONS=451,P.CLIENT_CLOSED_REQUEST=499,P.INTERNAL_SERVER_ERROR=500,P.NOT_IMPLEMENTED=501,P.BAD_GATEWAY=502,P.SERVICE_UNAVAILABLE=503,P.GATEWAY_TIMEOUT=504,P.HTTP_VERSION_NOT_SUPPORTED=505,P.VARIANT_ALSO_NEGOCIATES=506,P.INSUFFICIENT_STORAGE=507,P.LOOP_DETECTED=508,P.NOT_EXTENDED=510,P.NETWORK_AUTHENTICATION_REQUIRED=511,P.NETWORK_CONNECTION_TIMEOUT_ERROR=599;class F{constructor(t,e,s,r){this.req=t,this.res=e,this.next=s,this.controller=r}cache(t){const e=[];t.private?e.push("private"):t.public&&e.push("public"),t.noStore&&(t.noCache=!0,e.push("no-store")),t.noCache&&(t.maxAge=0,delete t.sMaxAge,e.push("no-cache")),t.noTransform&&e.push("no-transform"),t.proxyRevalidate&&e.push("proxy-revalidate"),t.mustRevalidate?e.push("must-revalidate"):t.noCache||(s(t.staleIfError)&&e.push(`stale-if-error=${t.staleIfError}`),s(t.staleWhileRevalidate)&&e.push(`stale-while-revalidate=${t.staleWhileRevalidate}`)),s(t.maxAge)&&e.push(`max-age=${t.maxAge}`),s(t.sMaxAge)&&e.push(`s-maxage=${t.sMaxAge}`),e.length&&(this.res.setHeader("Cache-Control",e.join(",")),t.noCache&&r({"Surrogate-Control":"no-store",Pragma:"no-cache",ETag:"false",Expires:"0"},((t,e)=>this.res.setHeader(e,t))))}close(t){this.res.headersSent||this.res.json(t||this.storage)}destroy(t){var e;t&&this.error(t.message),null===(e=this.res.socket)||void 0===e||e.destroy(t)}error(t){this.send(P.INTERNAL_SERVER_ERROR,{message:t})}file(t){this.res.headersSent||(this.status(P.OK),this.res.sendFile(x(t)))}ip(){return U(this.req)||"0.0.0.0"}json(t){this.send(P.OK,t)}notFound(t){this.send(P.NOT_FOUND,{message:t})}prepare(t,e){this.res.headersSent||(this.status(t),this.storage=e)}send(t,e){this.res.headersSent||(this.status(t),this.res.json(e))}status(t){return t&&this.res.status(t),this.res.statusCode}success(t){this.send(P.OK,{message:t})}unauthorized(t){this.send(P.UNAUTHORIZED,{message:t})}validation(t){this.send(P.BAD_REQUEST,{message:t})}}class b{static extends(e){return t(b.EXTENDS,e,[])}static middleware(e){return t(b.MIDDLEWARE,e,[])}static parameters(e){return t(b.PARAMETERS,e,[])}static path(e,s){return t(b.PATH,e,s)}static routers(e){return t(b.ROUTERS,e,[])}}b.EXTENDS=Symbol(),b.MIDDLEWARE=Symbol(),b.PARAMETERS=Symbol(),b.PATH=Symbol(),b.ROUTERS=Symbol();class M extends i{get controllers(){return this._controllers}get instance(){return this._app}get router(){return this._router}get server(){return this._server}constructor(t,e){var s;super(),this._app=R(),this._options={},this._default={cross:!1,hybrid:!1,path:"/",port:3e3,session:{secret:"yoursecret",resave:!0,saveUninitialized:!1,cookie:{maxAge:864e5}}},this._base=N(),this._router=N(),this._controllers=[],this._controllers.push(...t),this._options=o(Object.assign({},this._default),Object.assign({},e)),this._app.use(A(this._options.json)),this._app.disable("x-powered-by"),this._app.use(I({extended:!0})),this._options.cross&&this._app.use(m(n(this._options.cross)?this._options.cross:{}));const r=this._options.cookie;this._app.use(T()),this._app.use(O(null==r?void 0:r.secret,null==r?void 0:r.options)),this._app.use(f(this._options.session)),this.init(),this._app.use(this._router);const i=(null===(s=this._options.path)||void 0===s?void 0:s.length)?this._options.path:"/";if(this._app.use(i,this._base),this._app.all(i+"/*",((t,e)=>{this._options.redirect?e.redirect(this._options.redirect):(e.status(P.NOT_FOUND),e.json({message:"INVALID API"}))})),this._options.public){const t=x(this._options.public);S(t)&&this._app.use(R.static(t)),this._app.get("*",((e,s)=>{S(t)?s.sendFile(t+"/index.html"):this._options.notfound?s.redirect(this._options.notfound):(s.status(P.NOT_FOUND),s.json({message:'FILE "index.html" NOT FOUND'}))}))}else this._app.all("*",((t,e)=>{this._options.redirect?e.redirect(this._options.redirect):(e.status(P.NOT_FOUND),e.json({message:"INVALID API"}))}));t.forEach((t=>{const e=N(),s=this._middlewares(t),r=b.parameters(t);this._extends(t).forEach((t=>{s.push(...this._middlewares(t)),r.push(...b.parameters(t))})),b.routers(t).forEach((i=>{const o=i.propertyKey.toString();if(a(t[o])){if(!a(e[i.method]))return this._notFound(i.method);const h=this._handles(t,o,s,r);return e[i.method](i.path,...h,((e,s,i)=>C(this,void 0,void 0,(function*(){const a=new F(e,s,i,t),h=this._args(a,this._indexes(o,r)),E=yield t[o](...h);a.close(p(E)||n(E)?E:void 0)}))))}this._notFound(`${t.name}.${o}`)})),this._extends(t).forEach((i=>{b.routers(i).forEach((i=>{const o=i.propertyKey.toString();if(a(t[o])){if(!a(e[i.method]))return this._notFound(i.method);const h=this._handles(t,o,s,r);return e[i.method](i.path,...h,((e,s,i)=>C(this,void 0,void 0,(function*(){const a=new F(e,s,i,t),h=this._args(a,this._indexes(o,r)),E=yield t[o](...h);a.close(p(E)||n(E)?E:void 0)}))))}this._notFound(`${t.constructor.name}.${o}`)}))})),this._base.use(b.path(t,"/"),e)}))}init(){}error(t,s){e.error(t)}log(t,s){e.info(t)}_args(t,e,s){const r=[],i={ctx:t,key:"",app:this,argument:s};return e.forEach((t=>{r[t.parameterIndex]=t.callback(Object.assign(Object.assign({},i),{key:t.key}))})),r}_handles(t,e,s,r){return s.filter((t=>t.propertyKey==e)).map((e=>{if(e.callback!=h){const s=this._indexes(e.method,r);return(r,i,o)=>C(this,void 0,void 0,(function*(){const h=new F(r,i,o,t),E=a(e.argument)?e.argument(h):e.argument,_=yield e.callback.call(t,...this._args(h,s,E));(p(_)||n(_))&&h.close(_)}))}this._notFound(e.method)})).filter(a)}_extends(t){return b.extends(t).reduce(((t,e)=>(t.push(e,...this._extends(e)),t)),[]).filter(((t,e,s)=>s.indexOf(t)===e))}_indexes(t,e){return e.filter((e=>e.propertyKey==t))}_middlewares(t){return[...b.middleware(t)].reverse()}_notFound(t){this.error(new Error(`Router "${t}" not found`),"express")}_port(t){return`Server listening on port ${t}`}listen(){return C(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 t=D.createServer(((t,e)=>{const s=80==this._options.port?":80":"";e.writeHead(P.MOVED_PERMANENTLY,{Location:`https://${t.headers.host}${s}${t.url}`}),e.end()})),e=g.createServer({key:this._options.key,cert:this._options.cert},this._app);if(this._options.hybrid){new v((s=>{s.once("data",(r=>{s.pause(),s.unshift(r),(22===r[0]?e:t).emit("connection",s),process.nextTick((()=>s.resume()))}))})).listen(this._options.port,(()=>this.log(this._port(this._options.port),"express"))),this._server=e}this._server||(443==this._options.port&&t.listen(80,(()=>this.log(this._port(80),"express"))),e.listen(this._options.port,(()=>this.log(this._port(this._options.port),"express"))),this._server=e)}}))}}const k=t=>e=>{b.path(e,(null==t?void 0:t.length)?t:"/")},w=t=>e=>{b.extends(e).push(t)};var H;!function(t){t.ALL="all",t.GET="get",t.POST="post",t.PUT="put",t.HEAD="head",t.DELETE="delete",t.OPTIONS="options",t.PATCH="patch"}(H||(H={}));const G=t=>e=>(s,r)=>{b.routers(s).push({method:t,path:(null==e?void 0:e.length)?e:"/",propertyKey:r})},K=G(H.ALL),Q=t=>e=>(s,r,i)=>{b.parameters(s).push({callback:t,key:e,propertyKey:r,parameterIndex:i})},j=Q((({app:t})=>t)),Y=Q((({argument:t})=>t)),$=(t,e)=>E(e)?t:t[e],q=Q((({ctx:t,key:e})=>$(t.req.body,e))),V=Q((({ctx:t,key:e})=>$(t.req.cookies,e))),W=Q((({ctx:t})=>t)),B=Q((({ctx:t})=>_(t.req.files))),X=Q((({ctx:t,key:e})=>$(t.req.headers,e))),z=Q((({ctx:t,key:e})=>$(t.req.params,e))),Z=Q((({ctx:t,key:e})=>$(t.req.query,e))),J=Q((({ctx:t})=>t.req.session)),tt=(t,e)=>(s,r)=>{const i=l();W()(s,i,0),b.middleware(s).push({method:i,argument:e,propertyKey:r,callback:t})},et=t=>(e,s,r)=>{tt((e=>{e.cache(Object.assign({},t)),e.next()}))(e,s,r)},st=G(H.DELETE),rt=G(H.GET),it=G(H.HEAD),ot=(t,e)=>(s,r)=>{let i=h;if(c(r)){const e=s;a(e[t])&&(i=e[t])}b.middleware(s).push({method:t,argument:e,propertyKey:r,callback:i})},nt=G(H.OPTIONS),at=G(H.PATCH),ht=G(H.POST),pt=G(H.PUT);class Et{static file(t,e){const s=d()+"."+e;return S(y(t,s))?Et.file(t,e):s}static middleware(t,e){const s=Et._cache(e);s.upload||(s.upload=Et.multer(e)),s.upload(t.req,t.res,(e=>{if(e)return t.destroy(e);t.next()}))}static multer(t){const e=(null==t?void 0:t.path)||"./",s=L.diskStorage({destination:(t,s,r)=>r(null,e),filename:(t,s,r)=>C(this,void 0,void 0,(function*(){return r(null,Et.file(e,s.originalname.split(".").pop()||"bin"))}))}),r=(null==t?void 0:t.types)||[];return L({storage:s,fileFilter(t,e,s){return C(this,void 0,void 0,(function*(){if(r.length){const t=e.originalname.split(".").pop()||"bin";return-1!=r.indexOf(e.mimetype)||-1!=r.indexOf(t)?s(null,!0):s(new Error("File not allowed"))}return s(null,!0)}))},limits:{fileSize:1e6*((null==t?void 0:t.size)||5)}}).array((null==t?void 0:t.field)||"field",(null==t?void 0:t.count)||1)}}Et._cache=u();export{K as All,j as App,M as Application,Y as Argument,q as Body,et as Cache,F as Context,k as Controller,V as Cookies,W as Ctx,st as Delete,w as Extends,B as Files,rt as Get,it as Head,X as Headers,b as Metadata,H as Methods,ot as Middleware,nt as Options,z as Params,at as Patch,ht as Post,pt as Put,Z as Query,J as Session,P as Status,Et as Upload,tt as Use,G as methodFactory,Q as parameterFactory};
7
+ import{Metadata as t,Log as e}from"@andrewcaires/node";import{isNumber as s,forEachKey as r,EventEmitter as i,merge as o,isObject as n,isFunction as a,noop as h,isArray as p,isUndefined as E,toArray as _,uniqueID as l,isString as c,cache as u,uuidv4 as d}from"@andrewcaires/utils.js";import T from"compression";import O from"cookie-parser";import m from"cors";import R,{Router as N,json as A,urlencoded as I}from"express";import f from"express-session";import{existsSync as S}from"fs";import*as D from"http";import*as g from"https";import{Server as v}from"net";import{resolve as x,join as y}from"path";import{getClientIp as U}from"request-ip";import L from"multer";function C(t,e,s,r){return new(s||(s=Promise))(function(i,o){function n(t){try{h(r.next(t))}catch(t){o(t)}}function a(t){try{h(r.throw(t))}catch(t){o(t)}}function h(t){var e;t.done?i(t.value):(e=t.value,e instanceof s?e:new s(function(t){t(e)})).then(n,a)}h((r=r.apply(t,e||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;class P{}P.CONTINUE=100,P.SWITCHING_PROTOCOLS=101,P.PROCESSING=102,P.OK=200,P.CREATED=201,P.ACCEPTED=202,P.NON_AUTHORITATIVE_INFORMATION=203,P.NO_CONTENT=204,P.RESET_CONTENT=205,P.PARTIAL_CONTENT=206,P.MULTI_STATUS=207,P.ALREADY_REPORTED=208,P.IM_USED=226,P.MULTIPLE_CHOICES=300,P.MOVED_PERMANENTLY=301,P.FOUND=302,P.SEE_OTHER=303,P.NOT_MODIFIED=304,P.USE_PROXY=305,P.TEMPORARY_REDIRECT=307,P.PERMANENT_REDIRECT=308,P.BAD_REQUEST=400,P.UNAUTHORIZED=401,P.PAYMENT_REQUIRED=402,P.FORBIDDEN=403,P.NOT_FOUND=404,P.METHOD_NOT_ALLOWED=405,P.NOT_ACCEPTABLE=406,P.PROXY_AUTHENTICATION_REQUIRED=407,P.REQUEST_TIMEOUT=408,P.CONFLICT=409,P.GONE=410,P.LENGTH_REQUIRED=411,P.PRECONDITION_FAILED=412,P.PAYLOAD_TOO_LARGE=413,P.REQUEST_URI_TOO_LONG=414,P.UNSUPPORTED_MEDIA_TYPE=415,P.REQUESTED_RANGE_NOT_SATISFIABLE=416,P.EXPECTATION_FAILED=417,P.IM_A_TEAPOT=418,P.MISDIRECTED_REQUEST=421,P.UNPROCESSABLE_ENTITY=422,P.LOCKED=423,P.FAILED_DEPENDENCY=424,P.UPGRADE_REQUIRED=426,P.PRECONDITION_REQUIRED=428,P.TOO_MANY_REQUESTS=429,P.REQUEST_HEADER_FIELDS_TOO_LARGE=431,P.CONNECTION_CLOSED_WITHOUT_RESPONSE=444,P.UNAVAILABLE_FOR_LEGAL_REASONS=451,P.CLIENT_CLOSED_REQUEST=499,P.INTERNAL_SERVER_ERROR=500,P.NOT_IMPLEMENTED=501,P.BAD_GATEWAY=502,P.SERVICE_UNAVAILABLE=503,P.GATEWAY_TIMEOUT=504,P.HTTP_VERSION_NOT_SUPPORTED=505,P.VARIANT_ALSO_NEGOCIATES=506,P.INSUFFICIENT_STORAGE=507,P.LOOP_DETECTED=508,P.NOT_EXTENDED=510,P.NETWORK_AUTHENTICATION_REQUIRED=511,P.NETWORK_CONNECTION_TIMEOUT_ERROR=599;class F{constructor(t,e,s,r){this.req=t,this.res=e,this.next=s,this.controller=r}cache(t){const e=[];t.private?e.push("private"):t.public&&e.push("public"),t.noStore&&(t.noCache=!0,e.push("no-store")),t.noCache&&(t.maxAge=0,delete t.sMaxAge,e.push("no-cache")),t.noTransform&&e.push("no-transform"),t.proxyRevalidate&&e.push("proxy-revalidate"),t.mustRevalidate?e.push("must-revalidate"):t.noCache||(s(t.staleIfError)&&e.push(`stale-if-error=${t.staleIfError}`),s(t.staleWhileRevalidate)&&e.push(`stale-while-revalidate=${t.staleWhileRevalidate}`)),s(t.maxAge)&&e.push(`max-age=${t.maxAge}`),s(t.sMaxAge)&&e.push(`s-maxage=${t.sMaxAge}`),e.length&&(this.res.setHeader("Cache-Control",e.join(",")),t.noCache&&r({"Surrogate-Control":"no-store",Pragma:"no-cache",ETag:"false",Expires:"0"},(t,e)=>this.res.setHeader(e,t)))}close(t){this.res.headersSent||this.res.json(t||this.storage)}destroy(t){var e;t&&this.error(t.message),null===(e=this.res.socket)||void 0===e||e.destroy(t)}error(t){this.send(P.INTERNAL_SERVER_ERROR,{message:t})}file(t){this.res.headersSent||(this.status(P.OK),this.res.sendFile(x(t)))}ip(){return U(this.req)||"0.0.0.0"}json(t){this.send(P.OK,t)}notFound(t){this.send(P.NOT_FOUND,{message:t})}prepare(t,e){this.res.headersSent||(this.status(t),this.storage=e)}send(t,e){this.res.headersSent||(this.status(t),this.res.json(e))}status(t){return t&&this.res.status(t),this.res.statusCode}success(t){this.send(P.OK,{message:t})}unauthorized(t){this.send(P.UNAUTHORIZED,{message:t})}validation(t){this.send(P.BAD_REQUEST,{message:t})}}class b{static extends(e){return t(b.EXTENDS,e,[])}static middleware(e){return t(b.MIDDLEWARE,e,[])}static parameters(e){return t(b.PARAMETERS,e,[])}static path(e,s){return t(b.PATH,e,s)}static routers(e){return t(b.ROUTERS,e,[])}}b.EXTENDS=Symbol(),b.MIDDLEWARE=Symbol(),b.PARAMETERS=Symbol(),b.PATH=Symbol(),b.ROUTERS=Symbol();class M extends i{get controllers(){return this._controllers}get instance(){return this._app}get router(){return this._router}get server(){return this._server}constructor(t,e){var s;super(),this._app=R(),this._options={},this._default={cross:!1,hybrid:!1,path:"/",port:3e3,session:{secret:"yoursecret",resave:!0,saveUninitialized:!1,cookie:{maxAge:864e5}}},this._base=N(),this._router=N(),this._controllers=[],this._controllers.push(...t),this._options=o(Object.assign({},this._default),Object.assign({},e)),this._app.use(A(this._options.json)),this._app.disable("x-powered-by"),this._app.use(I({extended:!0})),this._options.cross&&this._app.use(m(n(this._options.cross)?this._options.cross:{}));const r=this._options.cookie;this._app.use(T()),this._app.use(O(null==r?void 0:r.secret,null==r?void 0:r.options)),this._app.use(f(this._options.session)),this.init(),this._app.use(this._router);const i=(null===(s=this._options.path)||void 0===s?void 0:s.length)?this._options.path:"/";if(this._app.use(i,this._base),this._app.all(i+"/*path",(t,e)=>{this._options.redirect?e.redirect(this._options.redirect):(e.status(P.NOT_FOUND),e.json({message:"INVALID API"}))}),this._options.public){const t=x(this._options.public);S(t)&&this._app.use(R.static(t)),this._app.get("*",(e,s)=>{S(t)?s.sendFile(t+"/index.html"):this._options.notfound?s.redirect(this._options.notfound):(s.status(P.NOT_FOUND),s.json({message:'FILE "index.html" NOT FOUND'}))})}else this._app.all("*path",(t,e)=>{this._options.redirect?e.redirect(this._options.redirect):(e.status(P.NOT_FOUND),e.json({message:"INVALID API"}))});t.forEach(t=>{const e=N(),s=this._middlewares(t),r=b.parameters(t);this._extends(t).forEach(t=>{s.push(...this._middlewares(t)),r.push(...b.parameters(t))}),b.routers(t).forEach(i=>{const o=i.propertyKey.toString();if(a(t[o])){if(!a(e[i.method]))return this._notFound(i.method);const h=this._handles(t,o,s,r);return e[i.method](i.path,...h,(e,s,i)=>C(this,void 0,void 0,function*(){const a=new F(e,s,i,t),h=this._args(a,this._indexes(o,r)),E=yield t[o](...h);a.close(p(E)||n(E)?E:void 0)}))}this._notFound(`${t.name}.${o}`)}),this._extends(t).forEach(i=>{b.routers(i).forEach(i=>{const o=i.propertyKey.toString();if(a(t[o])){if(!a(e[i.method]))return this._notFound(i.method);const h=this._handles(t,o,s,r);return e[i.method](i.path,...h,(e,s,i)=>C(this,void 0,void 0,function*(){const a=new F(e,s,i,t),h=this._args(a,this._indexes(o,r)),E=yield t[o](...h);a.close(p(E)||n(E)?E:void 0)}))}this._notFound(`${t.constructor.name}.${o}`)})}),this._base.use(b.path(t,"/"),e)})}init(){}error(t,s){e.error(t)}log(t,s){e.info(t)}_args(t,e,s){const r=[],i={ctx:t,key:"",app:this,argument:s};return e.forEach(t=>{r[t.parameterIndex]=t.callback(Object.assign(Object.assign({},i),{key:t.key}))}),r}_handles(t,e,s,r){return s.filter(t=>t.propertyKey==e).map(e=>{if(e.callback!=h){const s=this._indexes(e.method,r);return(r,i,o)=>C(this,void 0,void 0,function*(){const h=new F(r,i,o,t),E=a(e.argument)?e.argument(h):e.argument,_=yield e.callback.call(t,...this._args(h,s,E));(p(_)||n(_))&&h.close(_)})}this._notFound(e.method)}).filter(a)}_extends(t){return b.extends(t).reduce((t,e)=>(t.push(e,...this._extends(e)),t),[]).filter((t,e,s)=>s.indexOf(t)===e)}_indexes(t,e){return e.filter(e=>e.propertyKey==t)}_middlewares(t){return[...b.middleware(t)].reverse()}_notFound(t){this.error(new Error(`Router "${t}" not found`),"express")}_port(t){return`Server listening on port ${t}`}listen(){return C(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 t=D.createServer((t,e)=>{const s=80==this._options.port?":80":"";e.writeHead(P.MOVED_PERMANENTLY,{Location:`https://${t.headers.host}${s}${t.url}`}),e.end()}),e=g.createServer({key:this._options.key,cert:this._options.cert},this._app);if(this._options.hybrid){new v(s=>{s.once("data",r=>{s.pause(),s.unshift(r),(22===r[0]?e:t).emit("connection",s),process.nextTick(()=>s.resume())})}).listen(this._options.port,()=>this.log(this._port(this._options.port),"express")),this._server=e}this._server||(443==this._options.port&&t.listen(80,()=>this.log(this._port(80),"express")),e.listen(this._options.port,()=>this.log(this._port(this._options.port),"express")),this._server=e)}})}}const k=t=>e=>{b.path(e,(null==t?void 0:t.length)?t:"/")},w=t=>e=>{b.extends(e).push(t)};var H;!function(t){t.ALL="all",t.GET="get",t.POST="post",t.PUT="put",t.HEAD="head",t.DELETE="delete",t.OPTIONS="options",t.PATCH="patch"}(H||(H={}));const G=t=>e=>(s,r)=>{b.routers(s).push({method:t,path:(null==e?void 0:e.length)?e:"/",propertyKey:r})},K=G(H.ALL),Q=t=>e=>(s,r,i)=>{b.parameters(s).push({callback:t,key:e,propertyKey:r,parameterIndex:i})},j=Q(({app:t})=>t),Y=Q(({argument:t})=>t),$=(t,e)=>E(e)?t:t[e],q=Q(({ctx:t,key:e})=>$(t.req.body,e)),V=Q(({ctx:t,key:e})=>$(t.req.cookies,e)),W=Q(({ctx:t})=>t),B=Q(({ctx:t})=>_(t.req.files)),X=Q(({ctx:t,key:e})=>$(t.req.headers,e)),z=Q(({ctx:t,key:e})=>$(t.req.params,e)),Z=Q(({ctx:t,key:e})=>$(t.req.query,e)),J=Q(({ctx:t})=>t.req.session),tt=(t,e)=>(s,r)=>{const i=l();W()(s,i,0),b.middleware(s).push({method:i,argument:e,propertyKey:r,callback:t})},et=t=>(e,s,r)=>{tt(e=>{e.cache(Object.assign({},t)),e.next()})(e,s,r)},st=G(H.DELETE),rt=G(H.GET),it=G(H.HEAD),ot=(t,e)=>(s,r)=>{let i=h;if(c(r)){const e=s;a(e[t])&&(i=e[t])}b.middleware(s).push({method:t,argument:e,propertyKey:r,callback:i})},nt=G(H.OPTIONS),at=G(H.PATCH),ht=G(H.POST),pt=G(H.PUT);class Et{static file(t,e){const s=d()+"."+e;return S(y(t,s))?Et.file(t,e):s}static middleware(t,e){const s=Et._cache(e);s.upload||(s.upload=Et.multer(e)),s.upload(t.req,t.res,e=>{if(e)return t.destroy(e);t.next()})}static multer(t){const e=(null==t?void 0:t.path)||"./",s=L.diskStorage({destination:(t,s,r)=>r(null,e),filename:(t,s,r)=>C(this,void 0,void 0,function*(){return r(null,Et.file(e,s.originalname.split(".").pop()||"bin"))})}),r=(null==t?void 0:t.types)||[];return L({storage:s,fileFilter(t,e,s){return C(this,void 0,void 0,function*(){if(r.length){const t=e.originalname.split(".").pop()||"bin";return-1!=r.indexOf(e.mimetype)||-1!=r.indexOf(t)?s(null,!0):s(new Error("File not allowed"))}return s(null,!0)})},limits:{fileSize:1e6*((null==t?void 0:t.size)||5)}}).array((null==t?void 0:t.field)||"field",(null==t?void 0:t.count)||1)}}Et._cache=u();export{K as All,j as App,M as Application,Y as Argument,q as Body,et as Cache,F as Context,k as Controller,V as Cookies,W as Ctx,st as Delete,w as Extends,B as Files,rt as Get,it as Head,X as Headers,b as Metadata,H as Methods,ot as Middleware,nt as Options,z as Params,at as Patch,ht as Post,pt as Put,Z as Query,J as Session,P as Status,Et as Upload,tt as Use,G as methodFactory,Q as parameterFactory};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andrewcaires/express",
3
- "version": "1.2.4",
3
+ "version": "1.2.5",
4
4
  "description": "Decorators for express",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs.js",
@@ -37,30 +37,30 @@
37
37
  "homepage": "https://github.com/andrewcaires/npm/tree/main/api#readme",
38
38
  "dependencies": {
39
39
  "@andrewcaires/node": "^1.2.5",
40
- "@andrewcaires/utils.js": "^0.4.3",
41
- "compression": "^1.7.5",
40
+ "@andrewcaires/utils.js": "^0.4.9",
41
+ "compression": "^1.8.0",
42
42
  "cookie-parser": "^1.4.7",
43
43
  "cors": "^2.8.5",
44
- "express": "^4.21.2",
44
+ "express": "^5.1.0",
45
45
  "express-session": "^1.18.1",
46
- "multer": "^1.4.5-lts.1",
46
+ "multer": "^2.0.1",
47
47
  "request-ip": "^3.3.0"
48
48
  },
49
49
  "devDependencies": {
50
- "@rollup/plugin-commonjs": "^28.0.2",
50
+ "@rollup/plugin-commonjs": "^28.0.6",
51
51
  "@rollup/plugin-terser": "^0.4.4",
52
- "@rollup/plugin-typescript": "^12.1.2",
53
- "@types/compression": "^1.7.5",
54
- "@types/cookie-parser": "^1.4.8",
55
- "@types/cors": "^2.8.17",
56
- "@types/express": "^5.0.0",
57
- "@types/express-session": "^1.18.1",
58
- "@types/multer": "^1.4.12",
59
- "@types/node": "^22.13.1",
52
+ "@rollup/plugin-typescript": "^12.1.4",
53
+ "@types/compression": "^1.8.1",
54
+ "@types/cookie-parser": "^1.4.9",
55
+ "@types/cors": "^2.8.19",
56
+ "@types/express": "^5.0.3",
57
+ "@types/express-session": "^1.18.2",
58
+ "@types/multer": "^2.0.0",
59
+ "@types/node": "^24.0.10",
60
60
  "@types/request-ip": "^0.0.41",
61
- "eslint": "^9.19.0",
62
- "rollup-plugin-dts": "^6.1.1",
61
+ "eslint": "^9.30.1",
62
+ "rollup-plugin-dts": "^6.2.1",
63
63
  "tslib": "^2.8.1",
64
- "typescript-eslint": "^8.23.0"
64
+ "typescript-eslint": "^8.35.1"
65
65
  }
66
66
  }