@andrewcaires/express 2.0.5 → 2.1.0
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 +31 -22
- package/dist/index.esm.js +2 -2
- package/package.json +10 -8
package/dist/index.cjs.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/express v2.0
|
|
2
|
+
* @andrewcaires/express v2.1.0
|
|
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"),r=require("@andrewcaires/utils.js"),s=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"),p=require("net"),h=require("path"),E=require("request-ip"),c=require("multer");function _(e){var t=Object.create(null);return e&&Object.keys(e).forEach(function(r){if("default"!==r){var s=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,s.get?s:{enumerable:!0,get:function(){return e[r]}})}}),t.default=e,Object.freeze(t)}var v=_(u),T=_(d);function O(e,t,r,s){return new(r||(r=Promise))(function(o,i){function n(e){try{l(s.next(e))}catch(e){i(e)}}function a(e){try{l(s.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(n,a)}l((s=s.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;class R{}R.CONTINUE=100,R.SWITCHING_PROTOCOLS=101,R.PROCESSING=102,R.OK=200,R.CREATED=201,R.ACCEPTED=202,R.NON_AUTHORITATIVE_INFORMATION=203,R.NO_CONTENT=204,R.RESET_CONTENT=205,R.PARTIAL_CONTENT=206,R.MULTI_STATUS=207,R.ALREADY_REPORTED=208,R.IM_USED=226,R.MULTIPLE_CHOICES=300,R.MOVED_PERMANENTLY=301,R.FOUND=302,R.SEE_OTHER=303,R.NOT_MODIFIED=304,R.USE_PROXY=305,R.TEMPORARY_REDIRECT=307,R.PERMANENT_REDIRECT=308,R.BAD_REQUEST=400,R.UNAUTHORIZED=401,R.PAYMENT_REQUIRED=402,R.FORBIDDEN=403,R.NOT_FOUND=404,R.METHOD_NOT_ALLOWED=405,R.NOT_ACCEPTABLE=406,R.PROXY_AUTHENTICATION_REQUIRED=407,R.REQUEST_TIMEOUT=408,R.CONFLICT=409,R.GONE=410,R.LENGTH_REQUIRED=411,R.PRECONDITION_FAILED=412,R.PAYLOAD_TOO_LARGE=413,R.REQUEST_URI_TOO_LONG=414,R.UNSUPPORTED_MEDIA_TYPE=415,R.REQUESTED_RANGE_NOT_SATISFIABLE=416,R.EXPECTATION_FAILED=417,R.IM_A_TEAPOT=418,R.MISDIRECTED_REQUEST=421,R.UNPROCESSABLE_ENTITY=422,R.LOCKED=423,R.FAILED_DEPENDENCY=424,R.UPGRADE_REQUIRED=426,R.PRECONDITION_REQUIRED=428,R.TOO_MANY_REQUESTS=429,R.REQUEST_HEADER_FIELDS_TOO_LARGE=431,R.CONNECTION_CLOSED_WITHOUT_RESPONSE=444,R.UNAVAILABLE_FOR_LEGAL_REASONS=451,R.CLIENT_CLOSED_REQUEST=499,R.INTERNAL_SERVER_ERROR=500,R.NOT_IMPLEMENTED=501,R.BAD_GATEWAY=502,R.SERVICE_UNAVAILABLE=503,R.GATEWAY_TIMEOUT=504,R.HTTP_VERSION_NOT_SUPPORTED=505,R.VARIANT_ALSO_NEGOCIATES=506,R.INSUFFICIENT_STORAGE=507,R.LOOP_DETECTED=508,R.NOT_EXTENDED=510,R.NETWORK_AUTHENTICATION_REQUIRED=511,R.NETWORK_CONNECTION_TIMEOUT_ERROR=599;class x extends Error{constructor(e,t=R.INTERNAL_SERVER_ERROR){super(e),this.status=t}}class N extends x{constructor(e){super(e,R.UNPROCESSABLE_ENTITY)}}class A{constructor(e,t,r,s,o){this.req=e,this.res=t,this.next=r,this.app=s,this.controller=o}cache(e){const t=[];e.private?t.push("private"):e.public&&t.push("public"),e.noStore&&(e.noCache=!0,t.push("no-store")),e.noCache&&(e.maxAge=0,delete e.sMaxAge,t.push("no-cache")),e.noTransform&&t.push("no-transform"),e.proxyRevalidate&&t.push("proxy-revalidate"),e.mustRevalidate?t.push("must-revalidate"):e.noCache||(r.isNumber(e.staleIfError)&&t.push(`stale-if-error=${e.staleIfError}`),r.isNumber(e.staleWhileRevalidate)&&t.push(`stale-while-revalidate=${e.staleWhileRevalidate}`)),r.isNumber(e.maxAge)&&t.push(`max-age=${e.maxAge}`),r.isNumber(e.sMaxAge)&&t.push(`s-maxage=${e.sMaxAge}`),t.length&&(this.res.setHeader("Cache-Control",t.join(",")),e.noCache&&r.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)}cookie(e,t,s){r.isUndefined(t)?this.res.clearCookie(e):this.res.cookie(e,t,null!=s?s:{})}destroy(e){var t;e&&this.error(e),null===(t=this.res.socket)||void 0===t||t.destroy(e)}error(e){var t;let r=null!==(t=e.toString())&&void 0!==t?t:"",s=R.INTERNAL_SERVER_ERROR;e instanceof Error&&(r=e.message,e instanceof x&&(s=e.status)),this.send(s,{error:r})}file(e){this.res.headersSent||(this.status(R.OK),this.res.sendFile(h.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,r,s;return null!==(s=null===(r=null===(t=this.req.cookies)||void 0===t?void 0:t[e])||void 0===r?void 0:r.toString())&&void 0!==s?s:""}getCookies(){var e;return null!==(e=this.req.cookies)&&void 0!==e?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,r,s;return null!==(s=null===(r=null===(t=this.req)||void 0===t?void 0:t.header(e))||void 0===r?void 0:r.toString())&&void 0!==s?s:""}getHeaders(){var e,t;return null!==(t=null===(e=this.req)||void 0===e?void 0:e.headers)&&void 0!==t?t:{}}getIp(){return E.getClientIp(this.req)||"0.0.0.0"}getQuery(e){var t;return null===(t=this.req.query)||void 0===t?void 0:t[e]}getQueries(){var e,t;return null!==(t=null===(e=this.req)||void 0===e?void 0:e.query)&&void 0!==t?t:{}}getParam(e){var t,r,s;return null!==(s=null===(r=null===(t=this.req.params)||void 0===t?void 0:t[e])||void 0===r?void 0:r.toString())&&void 0!==s?s:""}getParams(){var e,t;return null!==(t=null===(e=this.req)||void 0===e?void 0:e.params)&&void 0!==t?t:{}}getUrl(){return`${this.req.protocol}://${this.req.get("host")}${this.req.originalUrl}`}json(e){this.send(R.OK,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(R.OK,{message:e})}}class m{static extends(t){return e.metadata(m.EXTENDS,t,[])}static middleware(t){return e.metadata(m.MIDDLEWARE,t,[])}static parameters(t){return e.metadata(m.PARAMETERS,t,[])}static path(t,r){return e.metadata(m.PATH,t,r)}static routers(t){return e.metadata(m.ROUTERS,t,[])}}m.EXTENDS=Symbol("EXTENDS"),m.MIDDLEWARE=Symbol("MIDDLEWARE"),m.PARAMETERS=Symbol("PARAMETERS"),m.PATH=Symbol("PATH"),m.ROUTERS=Symbol("ROUTERS");class I extends r.EventEmitter{get controllers(){return this._controllers}get instance(){return this._app}get router(){return this._router}get server(){return this._server}constructor(t,u){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=>r.isConstructor(t)?new t(...e.getInjectionArgs(t)):t)),this._options=r.merge({},{cross:!1,hybrid:!1,path:"/",port:3e3,session:{secret:"yoursecret",resave:!0,saveUninitialized:!1,cookie:{maxAge:864e5}}},null!=u?u:{}),this._app.use(n.json(this._options.json)),this._app.disable("x-powered-by"),this._app.use(n.urlencoded({extended:!0})),this._options.cross&&this._app.use(i(r.isObject(this._options.cross)?this._options.cross:{})),this._app.use(s(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 E=(null===(p=this._options.path)||void 0===p?void 0:p.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(R.NOT_FOUND),t.json({message:"INVALID API"}))}),this._options.public){const e=h.resolve(this._options.public);l.existsSync(e)&&this._app.use(n.static(e)),this._app.get("*path",(t,r)=>{l.existsSync(e)?r.sendFile(e+"/index.html"):this._options.notfound?r.redirect(this._options.notfound):(r.status(R.NOT_FOUND),r.json({message:'FILE "index.html" NOT FOUND'}))})}else this._app.all("*path",(e,t)=>{this._options.redirect?t.redirect(this._options.redirect):(t.status(R.NOT_FOUND),t.json({message:"INVALID API"}))});this._controllers.forEach(e=>{const t=n.Router(),s=this._middlewares(e),o=m.parameters(e);this._extends(e).forEach(e=>{s.push(...this._middlewares(e)),o.push(...m.parameters(e))}),m.routers(e).forEach(i=>{const n=i.propertyKey.toString();if(r.isFunction(e[n])){if(!r.isFunction(t[i.method]))return this._notFound(i.method);const a=this._handles(e,n,s,o);return t[i.method](i.path,...a,(t,s,i)=>O(this,void 0,void 0,function*(){const a=new A(t,s,i,this,e),l=this._args(a,this._indexes(n,o)),u=yield e[n](...l);a.close(r.isArray(u)||r.isObject(u)?u:void 0)}))}this._notFound(`${e.name}.${n}`)}),this._extends(e).forEach(i=>{m.routers(i).forEach(i=>{const n=i.propertyKey.toString();if(r.isFunction(e[n])){if(!r.isFunction(t[i.method]))return this._notFound(i.method);const a=this._handles(e,n,s,o);return t[i.method](i.path,...a,(t,s,i)=>O(this,void 0,void 0,function*(){const a=new A(t,s,i,this,e),l=this._args(a,this._indexes(n,o)),u=yield e[n](...l);a.close(r.isArray(u)||r.isObject(u)?u:void 0)}))}this._notFound(`${e.constructor.name}.${n}`)})}),this._base.use(m.path(e,"/"),t)})}init(){}error(e,r){t.Log.error(e)}log(e,r){t.Log.info(e)}_args(e,t,r){const s=[],o={ctx:e,key:"",app:this,argument:r};return t.forEach(e=>{s[e.parameterIndex]=e.callback(Object.assign(Object.assign({},o),{key:e.key}))}),s}_handles(e,t,s,o){return s.filter(e=>e.propertyKey==t).map(t=>{if(t.callback!=r.noop){const s=this._indexes(t.method,o);return(o,i,n)=>O(this,void 0,void 0,function*(){const a=new A(o,i,n,this,e),l=r.isFunction(t.argument)?t.argument(a):t.argument,u=yield t.callback.call(e,...this._args(a,s,l));(r.isArray(u)||r.isObject(u))&&a.close(u)})}this._notFound(t.method)}).filter(r.isFunction)}_extends(e){return m.extends(e).reduce((e,t)=>(e.push(t,...this._extends(t)),e),[]).filter((e,t,r)=>r.indexOf(e)===t)}_indexes(e,t){return t.filter(t=>t.propertyKey==e)}_middlewares(e){return[...m.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=v.createServer(this._app),this._server.listen(this._options.port,()=>this.log(this._port(this._options.port),"express"))),!this._server){const e=v.createServer((e,t)=>{const r=80==this._options.port?":80":"";t.writeHead(R.MOVED_PERMANENTLY,{Location:`https://${e.headers.host}${r}${e.url}`}),t.end()}),t=T.createServer({key:this._options.key,cert:this._options.cert},this._app);if(this._options.hybrid){new p.Server(r=>{r.once("data",s=>{r.pause(),r.unshift(s),(22===s[0]?t:e).emit("connection",r),process.nextTick(()=>r.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 S=e=>t=>(r,s,o)=>{m.parameters(r).push({callback:e,key:t,propertyKey:s,parameterIndex:o})},g=S(({app:e})=>e),D=S(({argument:e})=>e),y=(e,t)=>r.isUndefined(t)?e:e[t],f=S(({ctx:e,key:t})=>{var r,s;return y(null!==(s=null===(r=e.req)||void 0===r?void 0:r.body)&&void 0!==s?s:{},t)}),L=S(({ctx:e,key:t})=>{var r,s;return y(null!==(s=null===(r=e.req)||void 0===r?void 0:r.cookies)&&void 0!==s?s:{},t)}),C=S(({ctx:e})=>e),U=S(({ctx:e})=>{var t,r;return null!==(r=null===(t=e.req)||void 0===t?void 0:t.files)&&void 0!==r?r:{}}),P=S(({ctx:e,key:t})=>{var r,s;return y(null!==(s=null===(r=e.req)||void 0===r?void 0:r.headers)&&void 0!==s?s:{},t)}),F=S(({ctx:e,key:t})=>{var r,s;return y(null!==(s=null===(r=e.req)||void 0===r?void 0:r.params)&&void 0!==s?s:{},t)}),b=S(({ctx:e,key:t})=>{var r,s,o;return String(null!==(o=y(null!==(s=null===(r=e.req)||void 0===r?void 0:r.query)&&void 0!==s?s:{},t))&&void 0!==o?o:"")}),M=S(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.session}),q=(e,t)=>(s,o)=>{const i=r.uuidv7();C()(s,i,0),m.middleware(s).push({method:i,argument:t,propertyKey:o,callback:e})};var k;exports.Methods=void 0,(k=exports.Methods||(exports.Methods={})).ALL="all",k.GET="get",k.POST="post",k.PUT="put",k.HEAD="head",k.DELETE="delete",k.OPTIONS="options",k.PATCH="patch";const w=e=>t=>(r,s)=>{m.routers(r).push({method:e,path:(null==t?void 0:t.length)?t:"/",propertyKey:s})},j=w(exports.Methods.ALL),H=w(exports.Methods.DELETE),V=w(exports.Methods.GET),$=w(exports.Methods.HEAD),G=w(exports.Methods.OPTIONS),Q=w(exports.Methods.PATCH),K=w(exports.Methods.POST),Y=w(exports.Methods.PUT),B=e=>{var t;return(null===(t=e.split(".").pop())||void 0===t?void 0:t.toLowerCase())||"bin"},W=(e,t)=>{var r;return null!==(r=e[t])&&void 0!==r?r:null},X=(e,t)=>{const s=r.uuidv7()+"."+t;return l.existsSync(h.join(e,s))?X(e,t):s};exports.All=j,exports.App=g,exports.Application=I,exports.Argument=D,exports.Body=f,exports.Cache=e=>(t,r,s)=>{q(t=>{t.cache(Object.assign({},e)),t.next()})(t,r,s)},exports.Context=A,exports.Controller=e=>t=>{m.path(t,(null==e?void 0:e.length)?e:"/")},exports.Cookies=L,exports.Ctx=C,exports.Delete=H,exports.Extends=e=>t=>{m.extends(t).push(e)},exports.Files=U,exports.ForbiddenError=class extends x{constructor(e="Forbidden"){super(e,R.FORBIDDEN)}},exports.Get=V,exports.Head=$,exports.Headers=P,exports.InternalServerError=class extends x{constructor(e="Internal server error"){super(e,R.INTERNAL_SERVER_ERROR)}},exports.Metadata=m,exports.Middleware=(e,t)=>(s,o)=>{let i=r.noop;if(r.isString(o)){const t=s;r.isFunction(t[e])&&(i=t[e])}m.middleware(s).push({method:e,argument:t,propertyKey:o,callback:i})},exports.NotFoundError=class extends x{constructor(e="Record not found"){super(e,R.NOT_FOUND)}},exports.Options=G,exports.Params=F,exports.Patch=Q,exports.Post=K,exports.Put=Y,exports.Query=b,exports.ResponseError=x,exports.Session=M,exports.Status=R,exports.UnauthorizedError=class extends x{constructor(e="Unauthorized"){super(e,R.UNAUTHORIZED)}},exports.Upload=e=>{const t=r.merge({},e),s=c.diskStorage({destination(e,r,s){var o;const i=W(t,r.fieldname);s(null,null!==(o=null==i?void 0:i.path)&&void 0!==o?o:"./")},filename(e,r,s){var o;const i=W(t,r.fieldname);s(null,X(null!==(o=null==i?void 0:i.path)&&void 0!==o?o:"./",B(r.originalname)))}}),o=Math.max(...Object.values(t).map(e=>{var t;return null!==(t=e.size)&&void 0!==t?t:0})),i=c({storage:s,fileFilter(e,r,s){var o;const i=W(t,r.fieldname);return i?((e,t)=>!t.length||t.includes(B(e.originalname))||t.includes(e.mimetype.toLowerCase()))(r,null!==(o=null==i?void 0:i.types)&&void 0!==o?o:[])?void s(null,!0):s(new Error(`FILE TYPE NOT ALLOWED FOR "${r.fieldname}"`)):s(new Error(`UPLOAD FIELD "${r.fieldname}" IS NOT CONFIGURED`))},limits:{fileSize:1024*o*1024}}).fields(Object.keys(t).map(e=>{var r,s;return{name:e,maxCount:null!==(s=null===(r=t[e])||void 0===r?void 0:r.count)&&void 0!==s?s:1}}));return(e,t,r)=>{q(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,r)}},exports.Use=q,exports.Validate=e=>{const t=r.Validation.object(r.isFunction(e)?e(r.Validation):e).parse();return(e,r,s)=>{q(e=>O(void 0,void 0,void 0,function*(){var r,s;const{error:o,message:i,value:n}=yield t.validateAsync(null!==(s=null===(r=e.req)||void 0===r?void 0:r.body)&&void 0!==s?s:{});if(o)return e.error(new N(null!=i?i:o));e.req.body=n,e.next()}))(e,r,s)}},exports.ValidationError=N,exports.methodFactory=w,exports.parameterFactory=S;
|
|
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"),h=require("path"),E=require("request-ip"),c=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 T=_(l),O=_(d);function v(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 R{}R.CONTINUE=100,R.SWITCHING_PROTOCOLS=101,R.PROCESSING=102,R.OK=200,R.CREATED=201,R.ACCEPTED=202,R.NON_AUTHORITATIVE_INFORMATION=203,R.NO_CONTENT=204,R.RESET_CONTENT=205,R.PARTIAL_CONTENT=206,R.MULTI_STATUS=207,R.ALREADY_REPORTED=208,R.IM_USED=226,R.MULTIPLE_CHOICES=300,R.MOVED_PERMANENTLY=301,R.FOUND=302,R.SEE_OTHER=303,R.NOT_MODIFIED=304,R.USE_PROXY=305,R.TEMPORARY_REDIRECT=307,R.PERMANENT_REDIRECT=308,R.BAD_REQUEST=400,R.UNAUTHORIZED=401,R.PAYMENT_REQUIRED=402,R.FORBIDDEN=403,R.NOT_FOUND=404,R.METHOD_NOT_ALLOWED=405,R.NOT_ACCEPTABLE=406,R.PROXY_AUTHENTICATION_REQUIRED=407,R.REQUEST_TIMEOUT=408,R.CONFLICT=409,R.GONE=410,R.LENGTH_REQUIRED=411,R.PRECONDITION_FAILED=412,R.PAYLOAD_TOO_LARGE=413,R.REQUEST_URI_TOO_LONG=414,R.UNSUPPORTED_MEDIA_TYPE=415,R.REQUESTED_RANGE_NOT_SATISFIABLE=416,R.EXPECTATION_FAILED=417,R.IM_A_TEAPOT=418,R.MISDIRECTED_REQUEST=421,R.UNPROCESSABLE_ENTITY=422,R.LOCKED=423,R.FAILED_DEPENDENCY=424,R.UPGRADE_REQUIRED=426,R.PRECONDITION_REQUIRED=428,R.TOO_MANY_REQUESTS=429,R.REQUEST_HEADER_FIELDS_TOO_LARGE=431,R.CONNECTION_CLOSED_WITHOUT_RESPONSE=444,R.UNAVAILABLE_FOR_LEGAL_REASONS=451,R.CLIENT_CLOSED_REQUEST=499,R.INTERNAL_SERVER_ERROR=500,R.NOT_IMPLEMENTED=501,R.BAD_GATEWAY=502,R.SERVICE_UNAVAILABLE=503,R.GATEWAY_TIMEOUT=504,R.HTTP_VERSION_NOT_SUPPORTED=505,R.VARIANT_ALSO_NEGOCIATES=506,R.INSUFFICIENT_STORAGE=507,R.LOOP_DETECTED=508,R.NOT_EXTENDED=510,R.NETWORK_AUTHENTICATION_REQUIRED=511,R.NETWORK_CONNECTION_TIMEOUT_ERROR=599;class m extends Error{constructor(e,t=R.INTERNAL_SERVER_ERROR){super(e),this.status=t}}class N extends m{constructor(e){super(e,R.UNPROCESSABLE_ENTITY)}}class x{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){var t;let s=null!==(t=e.toString())&&void 0!==t?t:"",r=R.INTERNAL_SERVER_ERROR;e instanceof Error&&(s=e.message,e instanceof m&&(r=e.status)),this.send(r,{error:s})}file(e){this.isResponded()||(this.status(R.OK),this.res.sendFile(h.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 E.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(R.OK,e)}normalize(e){if(!s.isUndefined(e)&&!s.isNull(e))return s.isObject(e)?JSON.stringify(e):String(e)}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(R.OK,{message:e})}}class A{static extends(t){return e.metadata(A.EXTENDS,t,[])}static middleware(t){return e.metadata(A.MIDDLEWARE,t,[])}static parameters(t){return e.metadata(A.PARAMETERS,t,[])}static path(t,s){return e.metadata(A.PATH,t,s)}static routers(t){return e.metadata(A.ROUTERS,t,[])}}A.EXTENDS=Symbol("EXTENDS"),A.MIDDLEWARE=Symbol("MIDDLEWARE"),A.PARAMETERS=Symbol("PARAMETERS"),A.PATH=Symbol("PATH"),A.ROUTERS=Symbol("ROUTERS");class g 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 E=(null===(p=this._options.path)||void 0===p?void 0:p.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(R.NOT_FOUND),t.json({message:"INVALID API"}))}),this._options.public){const e=h.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):(s.status(R.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(R.NOT_FOUND),t.json({message:"INVALID API"}))});this._controllers.forEach(e=>{const t=n.Router(),r=this._middlewares(e),o=A.parameters(e);this._extends(e).forEach(e=>{r.push(...this._middlewares(e)),o.push(...A.parameters(e))}),A.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)=>v(this,void 0,void 0,function*(){const a=new x(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=>{A.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)=>v(this,void 0,void 0,function*(){const a=new x(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(A.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)=>v(this,void 0,void 0,function*(){const a=new x(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 A.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[...A.middleware(e)].reverse()}_notFound(e){this.error(new Error(`Router "${e}" not found`),"express")}_port(e){return`Server listening on port ${e}`}listen(){return v(this,void 0,void 0,function*(){if(this._options.cert&&this._options.key||(this._server=T.createServer(this._app),this._server.listen(this._options.port,()=>this.log(this._port(this._options.port),"express"))),!this._server){const e=T.createServer((e,t)=>{const s=80==this._options.port?":80":"";t.writeHead(R.MOVED_PERMANENTLY,{Location:`https://${e.headers.host}${s}${e.url}`}),t.end()}),t=O.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 I=e=>t=>(s,r,o)=>{A.parameters(s).push({callback:e,key:t,propertyKey:r,parameterIndex:o})},S=I(({app:e})=>e),D=I(({argument:e})=>e),f=I(({ctx:e,key:t})=>t?e.getBodyValue(t):e.getBody()),y=I(({ctx:e,key:t})=>t?e.getCookie(t):e.getCookies()),C=I(({ctx:e})=>e),U=I(({ctx:e})=>e.getFiles()),L=I(({ctx:e,key:t})=>t?e.getHeader(t):e.getHeaders()),P=I(({ctx:e,key:t})=>t?e.getParam(t):e.getParams()),b=I(({ctx:e,key:t})=>t?e.getQuery(t):e.getQueries()),F=I(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.session}),q=(e,t)=>(r,o)=>{const i=s.uuidv7();C()(r,i,0),A.middleware(r).push({method:i,argument:t,propertyKey:o,callback:e})},k={ALL:"all",GET:"get",POST:"post",PUT:"put",HEAD:"head",DELETE:"delete",OPTIONS:"options",PATCH:"patch"},M=e=>t=>(s,r)=>{A.routers(s).push({method:e,path:(null==t?void 0:t.length)?t:"/",propertyKey:r})},w=M(k.ALL),j=M(k.DELETE),H=M(k.GET),Q=M(k.HEAD),V=M(k.OPTIONS),$=M(k.PATCH),B=M(k.POST),G=M(k.PUT),K=e=>{var t;return(null===(t=e.split(".").pop())||void 0===t?void 0:t.toLowerCase())||"bin"},Y=(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(h.join(e,r))?z(e,t):r};exports.All=w,exports.App=S,exports.Application=g,exports.Argument=D,exports.BadRequestError=class extends m{constructor(e="Bad Request"){super(e,R.BAD_REQUEST)}},exports.Body=f,exports.Cache=e=>(t,s,r)=>{q(t=>{t.cache(Object.assign({},e)),t.next()})(t,s,r)},exports.Context=x,exports.Controller=e=>t=>{A.path(t,(null==e?void 0:e.length)?e:"/")},exports.Cookies=y,exports.Ctx=C,exports.Delete=j,exports.Extends=e=>t=>{A.extends(t).push(e)},exports.Files=U,exports.ForbiddenError=class extends m{constructor(e="Forbidden"){super(e,R.FORBIDDEN)}},exports.Get=H,exports.Head=Q,exports.Headers=L,exports.InternalServerError=class extends m{constructor(e="Internal server error"){super(e,R.INTERNAL_SERVER_ERROR)}},exports.Metadata=A,exports.Methods=k,exports.Middleware=(e,t)=>(r,o)=>{let i=s.noop;if(s.isString(o)){const t=r;s.isFunction(t[e])&&(i=t[e])}A.middleware(r).push({method:e,argument:t,propertyKey:o,callback:i})},exports.NotFoundError=class extends m{constructor(e="Record not found"){super(e,R.NOT_FOUND)}},exports.Options=V,exports.Params=P,exports.Patch=$,exports.Post=B,exports.Put=G,exports.Query=b,exports.ResponseError=m,exports.Session=F,exports.Status=R,exports.UnauthorizedError=class extends m{constructor(e="Unauthorized"){super(e,R.UNAUTHORIZED)}},exports.Upload=e=>{const t=s.merge({},e),r=c.diskStorage({destination(e,s,r){var o;const i=Y(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=Y(t,s.fieldname);r(null,z(null!==(o=null==i?void 0:i.path)&&void 0!==o?o:"./",K(s.originalname)))}}),o=Math.max(...Object.values(t).map(e=>{var t;return null!==(t=e.size)&&void 0!==t?t:0})),i=c({storage:r,fileFilter(e,s,r){var o;const i=Y(t,s.fieldname);return i?((e,t)=>!t.length||t.includes(K(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)=>{q(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=q,exports.Validate=e=>{const t=s.Validation.object(s.isFunction(e)?e(s.Validation):e).parse();return(e,s,r)=>{q(e=>v(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 N(null!=i?i:o));e.req.body=n,e.next()}))(e,s,r)}},exports.ValidationError=N,exports.methodFactory=M,exports.parameterFactory=I;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/express v2.0
|
|
2
|
+
* @andrewcaires/express v2.1.0
|
|
3
3
|
* Decorators for express
|
|
4
4
|
* (c) 2026 Andrew Caires
|
|
5
5
|
* @license: MIT
|
|
@@ -20,30 +20,33 @@ declare class Context<T = any, A = Application> {
|
|
|
20
20
|
readonly next: NextFunction;
|
|
21
21
|
readonly app: A;
|
|
22
22
|
readonly controller: T;
|
|
23
|
-
private storage
|
|
23
|
+
private storage;
|
|
24
24
|
constructor(req: Request, res: Response, next: NextFunction, app: A, controller: T);
|
|
25
25
|
cache(options: ICache): void;
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
clearCookie(key: string, options?: CookieOptions): void;
|
|
27
|
+
close(value?: TypeAnyObject | Array<TypeAnyObject>): void;
|
|
28
28
|
destroy(error?: Error): void;
|
|
29
29
|
error(error: string | Error): void;
|
|
30
30
|
file(path: string): void;
|
|
31
31
|
getBody<T = TypeAnyObject>(): T;
|
|
32
32
|
getBodyValue<T = any>(key: string): T | undefined;
|
|
33
|
-
getCookie(key: string): string;
|
|
33
|
+
getCookie(key: string): string | undefined;
|
|
34
34
|
getCookies<T = TypeAnyObject>(): T;
|
|
35
35
|
getFiles<F = IFile, T = TypeObject<Array<F>>>(): T;
|
|
36
|
-
getHeader(key: string): string;
|
|
36
|
+
getHeader(key: string): string | undefined;
|
|
37
37
|
getHeaders<T = TypeAnyObject>(): T;
|
|
38
38
|
getIp(): string;
|
|
39
|
-
getQuery
|
|
39
|
+
getQuery(key: string): string | undefined;
|
|
40
40
|
getQueries<T = TypeAnyObject>(): T;
|
|
41
|
-
getParam(key: string): string;
|
|
41
|
+
getParam(key: string): string | undefined;
|
|
42
42
|
getParams<T = TypeAnyObject>(): T;
|
|
43
43
|
getUrl(): string;
|
|
44
|
+
isResponded(): boolean;
|
|
44
45
|
json(value?: TypeAnyObject | Array<TypeAnyObject>): void;
|
|
46
|
+
private normalize;
|
|
45
47
|
prepare(status: number, value: TypeAnyObject | Array<TypeAnyObject>): void;
|
|
46
48
|
send(status: number, value?: TypeAnyObject | Array<TypeAnyObject>): void;
|
|
49
|
+
setCookie(key: string, value: string, options?: CookieOptions): void;
|
|
47
50
|
status(value?: number): number;
|
|
48
51
|
success(message: string): void;
|
|
49
52
|
}
|
|
@@ -116,19 +119,21 @@ interface IParameter {
|
|
|
116
119
|
parameterIndex: number;
|
|
117
120
|
}
|
|
118
121
|
|
|
119
|
-
declare
|
|
120
|
-
ALL
|
|
121
|
-
GET
|
|
122
|
-
POST
|
|
123
|
-
PUT
|
|
124
|
-
HEAD
|
|
125
|
-
DELETE
|
|
126
|
-
OPTIONS
|
|
127
|
-
PATCH
|
|
128
|
-
}
|
|
122
|
+
declare const Methods: {
|
|
123
|
+
readonly ALL: "all";
|
|
124
|
+
readonly GET: "get";
|
|
125
|
+
readonly POST: "post";
|
|
126
|
+
readonly PUT: "put";
|
|
127
|
+
readonly HEAD: "head";
|
|
128
|
+
readonly DELETE: "delete";
|
|
129
|
+
readonly OPTIONS: "options";
|
|
130
|
+
readonly PATCH: "patch";
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
type Method = typeof Methods[keyof typeof Methods];
|
|
129
134
|
|
|
130
135
|
interface IRouter {
|
|
131
|
-
method:
|
|
136
|
+
method: Method;
|
|
132
137
|
path: string;
|
|
133
138
|
propertyKey: string | symbol;
|
|
134
139
|
}
|
|
@@ -441,7 +446,7 @@ declare const Get: (path?: string) => MethodDecorator;
|
|
|
441
446
|
|
|
442
447
|
declare const Head: (path?: string) => MethodDecorator;
|
|
443
448
|
|
|
444
|
-
declare const methodFactory: (method:
|
|
449
|
+
declare const methodFactory: (method: Method) => (path?: string) => MethodDecorator;
|
|
445
450
|
|
|
446
451
|
declare const Options: (path?: string) => MethodDecorator;
|
|
447
452
|
|
|
@@ -486,6 +491,10 @@ declare class ResponseError extends Error {
|
|
|
486
491
|
constructor(message: string, status?: number);
|
|
487
492
|
}
|
|
488
493
|
|
|
494
|
+
declare class BadRequestError extends ResponseError {
|
|
495
|
+
constructor(message?: string);
|
|
496
|
+
}
|
|
497
|
+
|
|
489
498
|
declare class ForbiddenError extends ResponseError {
|
|
490
499
|
constructor(message?: string);
|
|
491
500
|
}
|
|
@@ -585,5 +594,5 @@ declare class Status {
|
|
|
585
594
|
static readonly NETWORK_CONNECTION_TIMEOUT_ERROR = 599;
|
|
586
595
|
}
|
|
587
596
|
|
|
588
|
-
export { All, App, Application, Argument, Body, Cache, Context, Controller, Cookies, Ctx, Delete, Extends, Files, ForbiddenError, Get, Head, Headers, InternalServerError, Metadata, Methods, Middleware, NotFoundError, Options, Params, Patch, Post, Put, Query, ResponseError, Session, Status, UnauthorizedError, Upload, Use, Validate, ValidationError, methodFactory, parameterFactory };
|
|
589
|
-
export type { CallbackObject, ComponentsObject, ContactObject, EncodingObject, ExampleObject, ExternalDocumentationObject, HeaderObject, IArgs, ICache, ICookie, IFile, IHandler, IMiddlewares, IOptions, IParameter, IRouter, IStore, IUpload, IUse, InfoObject, LicenseObject, LinkObject, MediaTypeObject, OAuthFlowObject, OAuthFlowsObject, OpenAPIObject, OperationObject, ParameterObject, ParseFunction, PathItemObject, PathsObject, ReferenceObject, RequestBodyObject, ResponseObject, ResponsesObject, SchemaObject, SecurityRequirementObject, SecuritySchemeObject, ServerObject, ServerVariableObject, TagObject };
|
|
597
|
+
export { All, App, Application, Argument, BadRequestError, Body, Cache, Context, Controller, Cookies, Ctx, Delete, Extends, Files, ForbiddenError, Get, Head, Headers, InternalServerError, Metadata, Methods, Middleware, NotFoundError, Options, Params, Patch, Post, Put, Query, ResponseError, Session, Status, UnauthorizedError, Upload, Use, Validate, ValidationError, methodFactory, parameterFactory };
|
|
598
|
+
export type { CallbackObject, ComponentsObject, ContactObject, EncodingObject, ExampleObject, ExternalDocumentationObject, HeaderObject, IArgs, ICache, ICookie, IFile, IHandler, IMiddlewares, IOptions, IParameter, IRouter, IStore, IUpload, IUse, InfoObject, LicenseObject, LinkObject, MediaTypeObject, Method, OAuthFlowObject, OAuthFlowsObject, OpenAPIObject, OperationObject, ParameterObject, ParseFunction, PathItemObject, PathsObject, ReferenceObject, RequestBodyObject, ResponseObject, ResponsesObject, SchemaObject, SecurityRequirementObject, SecuritySchemeObject, ServerObject, ServerVariableObject, TagObject };
|
package/dist/index.esm.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/express v2.0
|
|
2
|
+
* @andrewcaires/express v2.1.0
|
|
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 r}from"@andrewcaires/node";import{isNumber as s,forEachKey as o,isUndefined as i,EventEmitter as n,isConstructor as a,merge as l,isObject as u,isFunction as h,noop as d,isArray as E,uuidv7 as p,isString as c,Validation as _}from"@andrewcaires/utils.js";import v from"compression";import T from"cookie-parser";import O from"cors";import R,{Router as m,json as N,urlencoded as A}from"express";import I from"express-session";import{existsSync as S}from"fs";import*as D from"http";import*as f from"https";import{Server as g}from"net";import{resolve as y,join as L}from"path";import{getClientIp as x}from"request-ip";import U,{diskStorage as C}from"multer";function P(e,t,r,s){return new(r||(r=Promise))(function(o,i){function n(e){try{l(s.next(e))}catch(e){i(e)}}function a(e){try{l(s.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(n,a)}l((s=s.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;class F{}F.CONTINUE=100,F.SWITCHING_PROTOCOLS=101,F.PROCESSING=102,F.OK=200,F.CREATED=201,F.ACCEPTED=202,F.NON_AUTHORITATIVE_INFORMATION=203,F.NO_CONTENT=204,F.RESET_CONTENT=205,F.PARTIAL_CONTENT=206,F.MULTI_STATUS=207,F.ALREADY_REPORTED=208,F.IM_USED=226,F.MULTIPLE_CHOICES=300,F.MOVED_PERMANENTLY=301,F.FOUND=302,F.SEE_OTHER=303,F.NOT_MODIFIED=304,F.USE_PROXY=305,F.TEMPORARY_REDIRECT=307,F.PERMANENT_REDIRECT=308,F.BAD_REQUEST=400,F.UNAUTHORIZED=401,F.PAYMENT_REQUIRED=402,F.FORBIDDEN=403,F.NOT_FOUND=404,F.METHOD_NOT_ALLOWED=405,F.NOT_ACCEPTABLE=406,F.PROXY_AUTHENTICATION_REQUIRED=407,F.REQUEST_TIMEOUT=408,F.CONFLICT=409,F.GONE=410,F.LENGTH_REQUIRED=411,F.PRECONDITION_FAILED=412,F.PAYLOAD_TOO_LARGE=413,F.REQUEST_URI_TOO_LONG=414,F.UNSUPPORTED_MEDIA_TYPE=415,F.REQUESTED_RANGE_NOT_SATISFIABLE=416,F.EXPECTATION_FAILED=417,F.IM_A_TEAPOT=418,F.MISDIRECTED_REQUEST=421,F.UNPROCESSABLE_ENTITY=422,F.LOCKED=423,F.FAILED_DEPENDENCY=424,F.UPGRADE_REQUIRED=426,F.PRECONDITION_REQUIRED=428,F.TOO_MANY_REQUESTS=429,F.REQUEST_HEADER_FIELDS_TOO_LARGE=431,F.CONNECTION_CLOSED_WITHOUT_RESPONSE=444,F.UNAVAILABLE_FOR_LEGAL_REASONS=451,F.CLIENT_CLOSED_REQUEST=499,F.INTERNAL_SERVER_ERROR=500,F.NOT_IMPLEMENTED=501,F.BAD_GATEWAY=502,F.SERVICE_UNAVAILABLE=503,F.GATEWAY_TIMEOUT=504,F.HTTP_VERSION_NOT_SUPPORTED=505,F.VARIANT_ALSO_NEGOCIATES=506,F.INSUFFICIENT_STORAGE=507,F.LOOP_DETECTED=508,F.NOT_EXTENDED=510,F.NETWORK_AUTHENTICATION_REQUIRED=511,F.NETWORK_CONNECTION_TIMEOUT_ERROR=599;class b extends Error{constructor(e,t=F.INTERNAL_SERVER_ERROR){super(e),this.status=t}}class M extends b{constructor(e="Forbidden"){super(e,F.FORBIDDEN)}}class k extends b{constructor(e="Internal server error"){super(e,F.INTERNAL_SERVER_ERROR)}}class q extends b{constructor(e="Record not found"){super(e,F.NOT_FOUND)}}class w extends b{constructor(e="Unauthorized"){super(e,F.UNAUTHORIZED)}}class H extends b{constructor(e){super(e,F.UNPROCESSABLE_ENTITY)}}class ${constructor(e,t,r,s,o){this.req=e,this.res=t,this.next=r,this.app=s,this.controller=o}cache(e){const t=[];e.private?t.push("private"):e.public&&t.push("public"),e.noStore&&(e.noCache=!0,t.push("no-store")),e.noCache&&(e.maxAge=0,delete e.sMaxAge,t.push("no-cache")),e.noTransform&&t.push("no-transform"),e.proxyRevalidate&&t.push("proxy-revalidate"),e.mustRevalidate?t.push("must-revalidate"):e.noCache||(s(e.staleIfError)&&t.push(`stale-if-error=${e.staleIfError}`),s(e.staleWhileRevalidate)&&t.push(`stale-while-revalidate=${e.staleWhileRevalidate}`)),s(e.maxAge)&&t.push(`max-age=${e.maxAge}`),s(e.sMaxAge)&&t.push(`s-maxage=${e.sMaxAge}`),t.length&&(this.res.setHeader("Cache-Control",t.join(",")),e.noCache&&o({"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)}cookie(e,t,r){i(t)?this.res.clearCookie(e):this.res.cookie(e,t,null!=r?r:{})}destroy(e){var t;e&&this.error(e),null===(t=this.res.socket)||void 0===t||t.destroy(e)}error(e){var t;let r=null!==(t=e.toString())&&void 0!==t?t:"",s=F.INTERNAL_SERVER_ERROR;e instanceof Error&&(r=e.message,e instanceof b&&(s=e.status)),this.send(s,{error:r})}file(e){this.res.headersSent||(this.status(F.OK),this.res.sendFile(y(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,r,s;return null!==(s=null===(r=null===(t=this.req.cookies)||void 0===t?void 0:t[e])||void 0===r?void 0:r.toString())&&void 0!==s?s:""}getCookies(){var e;return null!==(e=this.req.cookies)&&void 0!==e?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,r,s;return null!==(s=null===(r=null===(t=this.req)||void 0===t?void 0:t.header(e))||void 0===r?void 0:r.toString())&&void 0!==s?s:""}getHeaders(){var e,t;return null!==(t=null===(e=this.req)||void 0===e?void 0:e.headers)&&void 0!==t?t:{}}getIp(){return x(this.req)||"0.0.0.0"}getQuery(e){var t;return null===(t=this.req.query)||void 0===t?void 0:t[e]}getQueries(){var e,t;return null!==(t=null===(e=this.req)||void 0===e?void 0:e.query)&&void 0!==t?t:{}}getParam(e){var t,r,s;return null!==(s=null===(r=null===(t=this.req.params)||void 0===t?void 0:t[e])||void 0===r?void 0:r.toString())&&void 0!==s?s:""}getParams(){var e,t;return null!==(t=null===(e=this.req)||void 0===e?void 0:e.params)&&void 0!==t?t:{}}getUrl(){return`${this.req.protocol}://${this.req.get("host")}${this.req.originalUrl}`}json(e){this.send(F.OK,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(F.OK,{message:e})}}class G{static extends(t){return e(G.EXTENDS,t,[])}static middleware(t){return e(G.MIDDLEWARE,t,[])}static parameters(t){return e(G.PARAMETERS,t,[])}static path(t,r){return e(G.PATH,t,r)}static routers(t){return e(G.ROUTERS,t,[])}}G.EXTENDS=Symbol("EXTENDS"),G.MIDDLEWARE=Symbol("MIDDLEWARE"),G.PARAMETERS=Symbol("PARAMETERS"),G.PATH=Symbol("PATH"),G.ROUTERS=Symbol("ROUTERS");class Q extends n{get controllers(){return this._controllers}get instance(){return this._app}get router(){return this._router}get server(){return this._server}constructor(e,r){var s,o;super(),this._app=R(),this._options={},this._base=m(),this._router=m(),this._controllers=[],this._controllers.push(...e.map(e=>a(e)?new e(...t(e)):e)),this._options=l({},{cross:!1,hybrid:!1,path:"/",port:3e3,session:{secret:"yoursecret",resave:!0,saveUninitialized:!1,cookie:{maxAge:864e5}}},null!=r?r:{}),this._app.use(N(this._options.json)),this._app.disable("x-powered-by"),this._app.use(A({extended:!0})),this._options.cross&&this._app.use(O(u(this._options.cross)?this._options.cross:{})),this._app.use(v(this._options.compression)),this._app.use(T(null===(s=this._options.cookie)||void 0===s?void 0:s.secret,this._options.cookie)),this._app.use(I(this._options.session)),this.init(),this._app.use(this._router);const i=(null===(o=this._options.path)||void 0===o?void 0:o.length)?this._options.path:"/";if(this._app.use(i,this._base),this._app.all(i+"/*path",(e,t)=>{this._options.redirect?t.redirect(this._options.redirect):(t.status(F.NOT_FOUND),t.json({message:"INVALID API"}))}),this._options.public){const e=y(this._options.public);S(e)&&this._app.use(R.static(e)),this._app.get("*path",(t,r)=>{S(e)?r.sendFile(e+"/index.html"):this._options.notfound?r.redirect(this._options.notfound):(r.status(F.NOT_FOUND),r.json({message:'FILE "index.html" NOT FOUND'}))})}else this._app.all("*path",(e,t)=>{this._options.redirect?t.redirect(this._options.redirect):(t.status(F.NOT_FOUND),t.json({message:"INVALID API"}))});this._controllers.forEach(e=>{const t=m(),r=this._middlewares(e),s=G.parameters(e);this._extends(e).forEach(e=>{r.push(...this._middlewares(e)),s.push(...G.parameters(e))}),G.routers(e).forEach(o=>{const i=o.propertyKey.toString();if(h(e[i])){if(!h(t[o.method]))return this._notFound(o.method);const n=this._handles(e,i,r,s);return t[o.method](o.path,...n,(t,r,o)=>P(this,void 0,void 0,function*(){const n=new $(t,r,o,this,e),a=this._args(n,this._indexes(i,s)),l=yield e[i](...a);n.close(E(l)||u(l)?l:void 0)}))}this._notFound(`${e.name}.${i}`)}),this._extends(e).forEach(o=>{G.routers(o).forEach(o=>{const i=o.propertyKey.toString();if(h(e[i])){if(!h(t[o.method]))return this._notFound(o.method);const n=this._handles(e,i,r,s);return t[o.method](o.path,...n,(t,r,o)=>P(this,void 0,void 0,function*(){const n=new $(t,r,o,this,e),a=this._args(n,this._indexes(i,s)),l=yield e[i](...a);n.close(E(l)||u(l)?l:void 0)}))}this._notFound(`${e.constructor.name}.${i}`)})}),this._base.use(G.path(e,"/"),t)})}init(){}error(e,t){r.error(e)}log(e,t){r.info(e)}_args(e,t,r){const s=[],o={ctx:e,key:"",app:this,argument:r};return t.forEach(e=>{s[e.parameterIndex]=e.callback(Object.assign(Object.assign({},o),{key:e.key}))}),s}_handles(e,t,r,s){return r.filter(e=>e.propertyKey==t).map(t=>{if(t.callback!=d){const r=this._indexes(t.method,s);return(s,o,i)=>P(this,void 0,void 0,function*(){const n=new $(s,o,i,this,e),a=h(t.argument)?t.argument(n):t.argument,l=yield t.callback.call(e,...this._args(n,r,a));(E(l)||u(l))&&n.close(l)})}this._notFound(t.method)}).filter(h)}_extends(e){return G.extends(e).reduce((e,t)=>(e.push(t,...this._extends(t)),e),[]).filter((e,t,r)=>r.indexOf(e)===t)}_indexes(e,t){return t.filter(t=>t.propertyKey==e)}_middlewares(e){return[...G.middleware(e)].reverse()}_notFound(e){this.error(new Error(`Router "${e}" not found`),"express")}_port(e){return`Server listening on port ${e}`}listen(){return P(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 r=80==this._options.port?":80":"";t.writeHead(F.MOVED_PERMANENTLY,{Location:`https://${e.headers.host}${r}${e.url}`}),t.end()}),t=f.createServer({key:this._options.key,cert:this._options.cert},this._app);if(this._options.hybrid){new g(r=>{r.once("data",s=>{r.pause(),r.unshift(s),(22===s[0]?t:e).emit("connection",r),process.nextTick(()=>r.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=>{G.path(t,(null==e?void 0:e.length)?e:"/")},j=e=>t=>{G.extends(t).push(e)},K=e=>t=>(r,s,o)=>{G.parameters(r).push({callback:e,key:t,propertyKey:s,parameterIndex:o})},V=K(({app:e})=>e),W=K(({argument:e})=>e),B=(e,t)=>i(t)?e:e[t],X=K(({ctx:e,key:t})=>{var r,s;return B(null!==(s=null===(r=e.req)||void 0===r?void 0:r.body)&&void 0!==s?s:{},t)}),z=K(({ctx:e,key:t})=>{var r,s;return B(null!==(s=null===(r=e.req)||void 0===r?void 0:r.cookies)&&void 0!==s?s:{},t)}),Z=K(({ctx:e})=>e),J=K(({ctx:e})=>{var t,r;return null!==(r=null===(t=e.req)||void 0===t?void 0:t.files)&&void 0!==r?r:{}}),ee=K(({ctx:e,key:t})=>{var r,s;return B(null!==(s=null===(r=e.req)||void 0===r?void 0:r.headers)&&void 0!==s?s:{},t)}),te=K(({ctx:e,key:t})=>{var r,s;return B(null!==(s=null===(r=e.req)||void 0===r?void 0:r.params)&&void 0!==s?s:{},t)}),re=K(({ctx:e,key:t})=>{var r,s,o;return String(null!==(o=B(null!==(s=null===(r=e.req)||void 0===r?void 0:r.query)&&void 0!==s?s:{},t))&&void 0!==o?o:"")}),se=K(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.session}),oe=(e,t)=>(r,s)=>{const o=p();Z()(r,o,0),G.middleware(r).push({method:o,argument:t,propertyKey:s,callback:e})},ie=e=>(t,r,s)=>{oe(t=>{t.cache(Object.assign({},e)),t.next()})(t,r,s)};var ne;!function(e){e.ALL="all",e.GET="get",e.POST="post",e.PUT="put",e.HEAD="head",e.DELETE="delete",e.OPTIONS="options",e.PATCH="patch"}(ne||(ne={}));const ae=e=>t=>(r,s)=>{G.routers(r).push({method:e,path:(null==t?void 0:t.length)?t:"/",propertyKey:s})},le=ae(ne.ALL),ue=ae(ne.DELETE),he=ae(ne.GET),de=ae(ne.HEAD),Ee=ae(ne.OPTIONS),pe=ae(ne.PATCH),ce=ae(ne.POST),_e=ae(ne.PUT),ve=(e,t)=>(r,s)=>{let o=d;if(c(s)){const t=r;h(t[e])&&(o=t[e])}G.middleware(r).push({method:e,argument:t,propertyKey:s,callback:o})},Te=e=>{var t;return(null===(t=e.split(".").pop())||void 0===t?void 0:t.toLowerCase())||"bin"},Oe=(e,t)=>{var r;return null!==(r=e[t])&&void 0!==r?r:null},Re=(e,t)=>{const r=p()+"."+t;return S(L(e,r))?Re(e,t):r},me=e=>{const t=l({},e),r=C({destination(e,r,s){var o;const i=Oe(t,r.fieldname);s(null,null!==(o=null==i?void 0:i.path)&&void 0!==o?o:"./")},filename(e,r,s){var o;const i=Oe(t,r.fieldname);s(null,Re(null!==(o=null==i?void 0:i.path)&&void 0!==o?o:"./",Te(r.originalname)))}}),s=Math.max(...Object.values(t).map(e=>{var t;return null!==(t=e.size)&&void 0!==t?t:0})),o=U({storage:r,fileFilter(e,r,s){var o;const i=Oe(t,r.fieldname);return i?((e,t)=>!t.length||t.includes(Te(e.originalname))||t.includes(e.mimetype.toLowerCase()))(r,null!==(o=null==i?void 0:i.types)&&void 0!==o?o:[])?void s(null,!0):s(new Error(`FILE TYPE NOT ALLOWED FOR "${r.fieldname}"`)):s(new Error(`UPLOAD FIELD "${r.fieldname}" IS NOT CONFIGURED`))},limits:{fileSize:1024*s*1024}}).fields(Object.keys(t).map(e=>{var r,s;return{name:e,maxCount:null!==(s=null===(r=t[e])||void 0===r?void 0:r.count)&&void 0!==s?s:1}}));return(e,t,r)=>{oe(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,r)}},Ne=e=>{const t=_.object(h(e)?e(_):e).parse();return(e,r,s)=>{oe(e=>P(void 0,void 0,void 0,function*(){var r,s;const{error:o,message:i,value:n}=yield t.validateAsync(null!==(s=null===(r=e.req)||void 0===r?void 0:r.body)&&void 0!==s?s:{});if(o)return e.error(new H(null!=i?i:o));e.req.body=n,e.next()}))(e,r,s)}};export{le as All,V as App,Q as Application,W as Argument,X as Body,ie as Cache,$ as Context,Y as Controller,z as Cookies,Z as Ctx,ue as Delete,j as Extends,J as Files,M as ForbiddenError,he as Get,de as Head,ee as Headers,k as InternalServerError,G as Metadata,ne as Methods,ve as Middleware,q as NotFoundError,Ee as Options,te as Params,pe as Patch,ce as Post,_e as Put,re as Query,b as ResponseError,se as Session,F as Status,w as UnauthorizedError,me as Upload,oe as Use,Ne as Validate,H as ValidationError,ae as methodFactory,K as parameterFactory};
|
|
7
|
+
import{metadata as e,getInjectionArgs as t}from"@andrewcaires/decorator";import{Log as s}from"@andrewcaires/node";import{isNumber as r,forEachKey as o,map as i,isUndefined as n,isNull as a,isObject as l,EventEmitter as h,isConstructor as u,merge as d,isFunction as p,noop as E,isArray as c,uuidv7 as _,isString as T,Validation as O}from"@andrewcaires/utils.js";import m from"compression";import R from"cookie-parser";import v from"cors";import N,{Router as A,json as I,urlencoded as g}from"express";import S from"express-session";import{existsSync as D}from"fs";import*as f from"http";import*as y from"https";import{Server as x}from"net";import{resolve as L,join as C}from"path";import{getClientIp as U}from"request-ip";import P,{diskStorage as F}from"multer";function b(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 k{}k.CONTINUE=100,k.SWITCHING_PROTOCOLS=101,k.PROCESSING=102,k.OK=200,k.CREATED=201,k.ACCEPTED=202,k.NON_AUTHORITATIVE_INFORMATION=203,k.NO_CONTENT=204,k.RESET_CONTENT=205,k.PARTIAL_CONTENT=206,k.MULTI_STATUS=207,k.ALREADY_REPORTED=208,k.IM_USED=226,k.MULTIPLE_CHOICES=300,k.MOVED_PERMANENTLY=301,k.FOUND=302,k.SEE_OTHER=303,k.NOT_MODIFIED=304,k.USE_PROXY=305,k.TEMPORARY_REDIRECT=307,k.PERMANENT_REDIRECT=308,k.BAD_REQUEST=400,k.UNAUTHORIZED=401,k.PAYMENT_REQUIRED=402,k.FORBIDDEN=403,k.NOT_FOUND=404,k.METHOD_NOT_ALLOWED=405,k.NOT_ACCEPTABLE=406,k.PROXY_AUTHENTICATION_REQUIRED=407,k.REQUEST_TIMEOUT=408,k.CONFLICT=409,k.GONE=410,k.LENGTH_REQUIRED=411,k.PRECONDITION_FAILED=412,k.PAYLOAD_TOO_LARGE=413,k.REQUEST_URI_TOO_LONG=414,k.UNSUPPORTED_MEDIA_TYPE=415,k.REQUESTED_RANGE_NOT_SATISFIABLE=416,k.EXPECTATION_FAILED=417,k.IM_A_TEAPOT=418,k.MISDIRECTED_REQUEST=421,k.UNPROCESSABLE_ENTITY=422,k.LOCKED=423,k.FAILED_DEPENDENCY=424,k.UPGRADE_REQUIRED=426,k.PRECONDITION_REQUIRED=428,k.TOO_MANY_REQUESTS=429,k.REQUEST_HEADER_FIELDS_TOO_LARGE=431,k.CONNECTION_CLOSED_WITHOUT_RESPONSE=444,k.UNAVAILABLE_FOR_LEGAL_REASONS=451,k.CLIENT_CLOSED_REQUEST=499,k.INTERNAL_SERVER_ERROR=500,k.NOT_IMPLEMENTED=501,k.BAD_GATEWAY=502,k.SERVICE_UNAVAILABLE=503,k.GATEWAY_TIMEOUT=504,k.HTTP_VERSION_NOT_SUPPORTED=505,k.VARIANT_ALSO_NEGOCIATES=506,k.INSUFFICIENT_STORAGE=507,k.LOOP_DETECTED=508,k.NOT_EXTENDED=510,k.NETWORK_AUTHENTICATION_REQUIRED=511,k.NETWORK_CONNECTION_TIMEOUT_ERROR=599;class M extends Error{constructor(e,t=k.INTERNAL_SERVER_ERROR){super(e),this.status=t}}class w extends M{constructor(e="Bad Request"){super(e,k.BAD_REQUEST)}}class H extends M{constructor(e="Forbidden"){super(e,k.FORBIDDEN)}}class q extends M{constructor(e="Internal server error"){super(e,k.INTERNAL_SERVER_ERROR)}}class Q extends M{constructor(e="Record not found"){super(e,k.NOT_FOUND)}}class $ extends M{constructor(e="Unauthorized"){super(e,k.UNAUTHORIZED)}}class G extends M{constructor(e){super(e,k.UNPROCESSABLE_ENTITY)}}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&&o({"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){var t;let s=null!==(t=e.toString())&&void 0!==t?t:"",r=k.INTERNAL_SERVER_ERROR;e instanceof Error&&(s=e.message,e instanceof M&&(r=e.status)),this.send(r,{error:s})}file(e){this.isResponded()||(this.status(k.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 i(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 i(null!==(t=null===(e=this.req)||void 0===e?void 0:e.headers)&&void 0!==t?t:{},e=>this.normalize(e))}getIp(){return U(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 i(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 n(s)?void 0:String(s)}getParams(){var e,t;return i(null!==(t=null===(e=this.req)||void 0===e?void 0:e.params)&&void 0!==t?t:{},e=>{if(!n(e)&&!a(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(k.OK,e)}normalize(e){if(!n(e)&&!a(e))return l(e)?JSON.stringify(e):String(e)}prepare(e,t){this.isResponded()||(this.status(e),this.storage=t)}send(e,t){this.isResponded()||(this.status(e),204===e||304===e||n(t)?this.res.end():this.res.json(t))}setCookie(e,t,s){this.res.cookie(e,t,null!=s?s:{})}status(e){return n(e)||this.res.status(e),this.res.statusCode}success(e){this.send(k.OK,{message:e})}}class B{static extends(t){return e(B.EXTENDS,t,[])}static middleware(t){return e(B.MIDDLEWARE,t,[])}static parameters(t){return e(B.PARAMETERS,t,[])}static path(t,s){return e(B.PATH,t,s)}static routers(t){return e(B.ROUTERS,t,[])}}B.EXTENDS=Symbol("EXTENDS"),B.MIDDLEWARE=Symbol("MIDDLEWARE"),B.PARAMETERS=Symbol("PARAMETERS"),B.PATH=Symbol("PATH"),B.ROUTERS=Symbol("ROUTERS");class V extends h{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=A(),this._router=A(),this._controllers=[],this._controllers.push(...e.map(e=>u(e)?new e(...t(e)):e)),this._options=d({},{cross:!1,hybrid:!1,path:"/",port:3e3,session:{secret:"yoursecret",resave:!0,saveUninitialized:!1,cookie:{maxAge:864e5}}},null!=s?s:{}),this._app.use(I(this._options.json)),this._app.disable("x-powered-by"),this._app.use(g({extended:!0})),this._options.cross&&this._app.use(v(l(this._options.cross)?this._options.cross:{})),this._app.use(m(this._options.compression)),this._app.use(R(null===(r=this._options.cookie)||void 0===r?void 0:r.secret,this._options.cookie)),this._app.use(S(this._options.session)),this.init(),this._app.use(this._router);const i=(null===(o=this._options.path)||void 0===o?void 0:o.length)?this._options.path:"/";if(this._app.use(i,this._base),this._app.all(i+"/*path",(e,t)=>{this._options.redirect?t.redirect(this._options.redirect):(t.status(k.NOT_FOUND),t.json({message:"INVALID API"}))}),this._options.public){const e=L(this._options.public);D(e)&&this._app.use(N.static(e)),this._app.get("*path",(t,s)=>{D(e)?s.sendFile(e+"/index.html"):this._options.notfound?s.redirect(this._options.notfound):(s.status(k.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(k.NOT_FOUND),t.json({message:"INVALID API"}))});this._controllers.forEach(e=>{const t=A(),s=this._middlewares(e),r=B.parameters(e);this._extends(e).forEach(e=>{s.push(...this._middlewares(e)),r.push(...B.parameters(e))}),B.routers(e).forEach(o=>{const i=o.propertyKey.toString();if(p(e[i])){if(!p(t[o.method]))return this._notFound(o.method);const n=this._handles(e,i,s,r);return t[o.method](o.path,...n,(t,s,o)=>b(this,void 0,void 0,function*(){const n=new j(t,s,o,this,e),a=this._args(n,this._indexes(i,r)),h=yield e[i](...a);n.close(c(h)||l(h)?h:void 0)}))}this._notFound(`${e.name}.${i}`)}),this._extends(e).forEach(o=>{B.routers(o).forEach(o=>{const i=o.propertyKey.toString();if(p(e[i])){if(!p(t[o.method]))return this._notFound(o.method);const n=this._handles(e,i,s,r);return t[o.method](o.path,...n,(t,s,o)=>b(this,void 0,void 0,function*(){const n=new j(t,s,o,this,e),a=this._args(n,this._indexes(i,r)),h=yield e[i](...a);n.close(c(h)||l(h)?h:void 0)}))}this._notFound(`${e.constructor.name}.${i}`)})}),this._base.use(B.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,i)=>b(this,void 0,void 0,function*(){const n=new j(r,o,i,this,e),a=p(t.argument)?t.argument(n):t.argument,h=yield t.callback.call(e,...this._args(n,s,a));(c(h)||l(h))&&n.close(h)})}this._notFound(t.method)}).filter(p)}_extends(e){return B.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[...B.middleware(e)].reverse()}_notFound(e){this.error(new Error(`Router "${e}" not found`),"express")}_port(e){return`Server listening on port ${e}`}listen(){return b(this,void 0,void 0,function*(){if(this._options.cert&&this._options.key||(this._server=f.createServer(this._app),this._server.listen(this._options.port,()=>this.log(this._port(this._options.port),"express"))),!this._server){const e=f.createServer((e,t)=>{const s=80==this._options.port?":80":"";t.writeHead(k.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 x(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=>{B.path(t,(null==e?void 0:e.length)?e:"/")},K=e=>t=>{B.extends(t).push(e)},W=e=>t=>(s,r,o)=>{B.parameters(s).push({callback:e,key:t,propertyKey:r,parameterIndex:o})},z=W(({app:e})=>e),X=W(({argument:e})=>e),Z=W(({ctx:e,key:t})=>t?e.getBodyValue(t):e.getBody()),J=W(({ctx:e,key:t})=>t?e.getCookie(t):e.getCookies()),ee=W(({ctx:e})=>e),te=W(({ctx:e})=>e.getFiles()),se=W(({ctx:e,key:t})=>t?e.getHeader(t):e.getHeaders()),re=W(({ctx:e,key:t})=>t?e.getParam(t):e.getParams()),oe=W(({ctx:e,key:t})=>t?e.getQuery(t):e.getQueries()),ie=W(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.session}),ne=(e,t)=>(s,r)=>{const o=_();ee()(s,o,0),B.middleware(s).push({method:o,argument:t,propertyKey:r,callback:e})},ae=e=>(t,s,r)=>{ne(t=>{t.cache(Object.assign({},e)),t.next()})(t,s,r)},le={ALL:"all",GET:"get",POST:"post",PUT:"put",HEAD:"head",DELETE:"delete",OPTIONS:"options",PATCH:"patch"},he=e=>t=>(s,r)=>{B.routers(s).push({method:e,path:(null==t?void 0:t.length)?t:"/",propertyKey:r})},ue=he(le.ALL),de=he(le.DELETE),pe=he(le.GET),Ee=he(le.HEAD),ce=he(le.OPTIONS),_e=he(le.PATCH),Te=he(le.POST),Oe=he(le.PUT),me=(e,t)=>(s,r)=>{let o=E;if(T(r)){const t=s;p(t[e])&&(o=t[e])}B.middleware(s).push({method:e,argument:t,propertyKey:r,callback:o})},Re=e=>{var t;return(null===(t=e.split(".").pop())||void 0===t?void 0:t.toLowerCase())||"bin"},ve=(e,t)=>{var s;return null!==(s=e[t])&&void 0!==s?s:null},Ne=(e,t)=>{const s=_()+"."+t;return D(C(e,s))?Ne(e,t):s},Ae=e=>{const t=d({},e),s=F({destination(e,s,r){var o;const i=ve(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=ve(t,s.fieldname);r(null,Ne(null!==(o=null==i?void 0:i.path)&&void 0!==o?o:"./",Re(s.originalname)))}}),r=Math.max(...Object.values(t).map(e=>{var t;return null!==(t=e.size)&&void 0!==t?t:0})),o=P({storage:s,fileFilter(e,s,r){var o;const i=ve(t,s.fieldname);return i?((e,t)=>!t.length||t.includes(Re(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)=>{ne(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=O.object(p(e)?e(O):e).parse();return(e,s,r)=>{ne(e=>b(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 G(null!=i?i:o));e.req.body=n,e.next()}))(e,s,r)}};export{ue as All,z as App,V as Application,X as Argument,w as BadRequestError,Z as Body,ae as Cache,j as Context,Y as Controller,J as Cookies,ee as Ctx,de as Delete,K as Extends,te as Files,H as ForbiddenError,pe as Get,Ee as Head,se as Headers,q as InternalServerError,B as Metadata,le as Methods,me as Middleware,Q as NotFoundError,ce as Options,re as Params,_e as Patch,Te as Post,Oe as Put,oe as Query,M as ResponseError,ie as Session,k as Status,$ as UnauthorizedError,Ae as Upload,ne as Use,Ie as Validate,G as ValidationError,he as methodFactory,W as parameterFactory};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@andrewcaires/express",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "Decorators for express",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs.js",
|
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
],
|
|
21
21
|
"scripts": {
|
|
22
22
|
"dev": "tsx-dev --watch --clear ./src/dev.ts",
|
|
23
|
-
"build": "rollup --bundleConfigAsCjs -c rollup.config.js"
|
|
23
|
+
"build": "npm run lint && rollup --bundleConfigAsCjs -c rollup.config.js",
|
|
24
|
+
"lint": "eslint \"src/**/*.{ts,tsx,js,jsx}\" --max-warnings=0"
|
|
24
25
|
},
|
|
25
26
|
"repository": {
|
|
26
27
|
"type": "git",
|
|
@@ -37,8 +38,8 @@
|
|
|
37
38
|
"homepage": "https://github.com/andrewcaires/npm/tree/main/api#readme",
|
|
38
39
|
"dependencies": {
|
|
39
40
|
"@andrewcaires/decorator": "^1.1.1",
|
|
40
|
-
"@andrewcaires/node": "^1.
|
|
41
|
-
"@andrewcaires/utils.js": "^0.4.
|
|
41
|
+
"@andrewcaires/node": "^1.3.1",
|
|
42
|
+
"@andrewcaires/utils.js": "^0.4.31",
|
|
42
43
|
"compression": "^1.8.1",
|
|
43
44
|
"cookie-parser": "^1.4.7",
|
|
44
45
|
"cors": "^2.8.6",
|
|
@@ -48,23 +49,24 @@
|
|
|
48
49
|
"request-ip": "^3.3.0"
|
|
49
50
|
},
|
|
50
51
|
"devDependencies": {
|
|
52
|
+
"@eslint/js": "^10.0.1",
|
|
51
53
|
"@rollup/plugin-commonjs": "^29.0.0",
|
|
52
54
|
"@rollup/plugin-terser": "^0.4.4",
|
|
53
55
|
"@rollup/plugin-typescript": "^12.3.0",
|
|
54
|
-
"@rollup/rollup-darwin-arm64": "^4.
|
|
56
|
+
"@rollup/rollup-darwin-arm64": "^4.58.0",
|
|
55
57
|
"@types/compression": "^1.8.1",
|
|
56
58
|
"@types/cookie-parser": "^1.4.10",
|
|
57
59
|
"@types/cors": "^2.8.19",
|
|
58
60
|
"@types/express": "^5.0.6",
|
|
59
61
|
"@types/express-session": "^1.18.2",
|
|
60
62
|
"@types/multer": "^2.0.0",
|
|
61
|
-
"@types/node": "^25.
|
|
63
|
+
"@types/node": "^25.3.0",
|
|
62
64
|
"@types/request-ip": "^0.0.41",
|
|
63
65
|
"@types/swagger-ui-express": "^4.1.8",
|
|
64
|
-
"eslint": "^
|
|
66
|
+
"eslint": "^10.0.1",
|
|
65
67
|
"rollup-plugin-dts": "^6.3.0",
|
|
66
68
|
"swagger-ui-express": "^5.0.1",
|
|
67
69
|
"tslib": "^2.8.1",
|
|
68
|
-
"typescript-eslint": "^8.
|
|
70
|
+
"typescript-eslint": "^8.56.0"
|
|
69
71
|
}
|
|
70
72
|
}
|