@andrewcaires/express 1.0.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/README.md +60 -0
- package/dist/index.cjs.js +7 -0
- package/dist/index.d.ts +195 -0
- package/dist/index.esm.js +7 -0
- package/package.json +61 -0
package/README.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
[](https://www.npmjs.com/package/@andrewcaires/express)
|
|
2
|
+
[](https://www.npmjs.com/package/@andrewcaires/express)
|
|
3
|
+
[](https://www.npmjs.com/package/@andrewcaires/express)
|
|
4
|
+
[](https://www.npmjs.com/package/@andrewcaires/express)
|
|
5
|
+
|
|
6
|
+
# express
|
|
7
|
+
|
|
8
|
+
Decorators for express
|
|
9
|
+
|
|
10
|
+
## Installation
|
|
11
|
+
|
|
12
|
+
The module is now available on npm! `npm i @andrewcaires/express`
|
|
13
|
+
|
|
14
|
+
## Example usage
|
|
15
|
+
|
|
16
|
+
```js
|
|
17
|
+
// index.ts
|
|
18
|
+
|
|
19
|
+
@Controller("/users")
|
|
20
|
+
class UsersController {
|
|
21
|
+
|
|
22
|
+
@Get()
|
|
23
|
+
public all({ req, response }: IExpress) {
|
|
24
|
+
|
|
25
|
+
response.list([]);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
import { Application } from "@andrewcaires/express";
|
|
30
|
+
|
|
31
|
+
const main = async () => {
|
|
32
|
+
|
|
33
|
+
const app = new Application(
|
|
34
|
+
[
|
|
35
|
+
|
|
36
|
+
new UsersController,
|
|
37
|
+
|
|
38
|
+
],
|
|
39
|
+
{
|
|
40
|
+
|
|
41
|
+
port: 3000,
|
|
42
|
+
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
await app.listen();
|
|
47
|
+
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
main().catch(console.log);
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Links
|
|
54
|
+
|
|
55
|
+
* [Docs](https://www.npmjs.com/package/@andrewcaires/express)
|
|
56
|
+
* [npm](https://www.npmjs.com/package/@andrewcaires/express)
|
|
57
|
+
|
|
58
|
+
## License
|
|
59
|
+
|
|
60
|
+
* [MIT](https://www.npmjs.com/package/@andrewcaires/express)
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* @andrewcaires/express v1.0.0
|
|
3
|
+
* Decorators for express
|
|
4
|
+
* (c) 2023 Andrew Caires
|
|
5
|
+
* @license: MIT
|
|
6
|
+
*/
|
|
7
|
+
"use strict";require("reflect-metadata");var e=require("@andrewcaires/utils.js"),t=require("cors"),s=require("express"),r=require("fs"),o=require("http"),n=require("https"),p=require("net"),i=require("path");function a(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 E,_=a(o),x=a(n);function h(e,t,s,r){return new(s||(s=Promise))((function(o,n){function p(e){try{a(r.next(e))}catch(e){n(e)}}function i(e){try{a(r.throw(e))}catch(e){n(e)}}function a(e){var t;e.done?o(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(p,i)}a((r=r.apply(e,t||[])).next())}))}exports.MetadataKeys=void 0,(E=exports.MetadataKeys||(exports.MetadataKeys={})).MIDDLEWARE="@express_middleware",E.PATH="@express_path",E.ROUTERS="@express_routers",E.PARAMETERS="@express_parameters";const u=(e,t,s)=>Reflect.hasMetadata(e,t)?Reflect.getMetadata(e,t):s,d=200;class c{constructor(e){this.res=e}success(e){return c.success(this.res,e)}static success(e,t){return e.status(d).json({message:t})}data(e){return c.data(this.res,e)}static data(e,t){return e.status(d).json(Object.assign({},t))}error(e){return c.error(this.res,e)}static error(e,t){return e.status(500).json({message:t})}list(e){return c.list(this.res,e)}static list(e,t){return e.status(d).json([...t])}notfound(e){return c.notfound(this.res,e)}static notfound(e,t){return e.status(404).json({message:t})}validation(e){return c.validation(this.res,e)}static validation(e,t){return e.status(400).json({message:t})}unauthorized(e){return c.unauthorized(this.res,e)}static unauthorized(e,t){return e.status(401).json({message:t})}}class T extends e.EventEmitter{get instance(){return this._app}get router(){return this._router}constructor(o,n){var p;super(),this._app=s(),this._options={},this._default={cross:!1,hybrid:!1,path:"/",port:3e3},this._router=s.Router(),this._controlles=s.Router(),this._options=Object.assign(Object.assign({},this._default),n),this._app.use(s.json()),this._app.disable("x-powered-by"),this._app.use(s.urlencoded({extended:!0})),this._options.cross&&this._app.use(t()),this._app.use(this._router);const a=(null===(p=this._options.path)||void 0===p?void 0:p.length)?this._options.path:"/";if(this._app.use(a,this._controlles),this._app.all(a+"/*",((e,t)=>c.notfound(t,"Invalid API"))),this._options.public){const e=i.resolve(this._options.public);r.existsSync(e)&&this._app.use(s.static(e)),this._app.get("*",((t,s)=>{if(!r.existsSync(e))return c.notfound(s,'File "index.html" not found');s.sendFile(e+"/index.html")}))}o.forEach((t=>{const r=t.constructor,o=this._path(r),n=this._routers(r),p=this._middlewares(r),i=this._parameters(r),a=s.Router();n.forEach((s=>{const o=s.name.toString();if(e.isFunction(t[o])){if(!e.isFunction(a[s.method]))return this.error(new Error('Method "'+s.method+'" Not Found.'),"Express");const r=this._handles(t,o,p,i),n=this._indexes(o,i);a[s.method](s.path,...r,((e,s,r)=>t[o](...this._args(e,s,r,n))))}else this.error(new Error('Router "'+r.name+"."+o+'" Not Found.'),"Express")})),this._controlles.use(o,a)}))}error(t,s){e.isUndefined(s)?console.error(t):console.error(s+":",t)}log(t,s){e.isUndefined(s)?console.error(t):console.error(s+":",t)}_args(e,t,s,r,o){const n=[],p={req:e,res:t,next:s,app:this,send:new c(t),argument:o};return r.forEach((e=>{n[e.index]=e.callback(Object.assign(Object.assign({},p),{key:e.key}))})),n}_handles(t,s,r,o){return r.filter((e=>e.name==s)).map((s=>{if(e.isFunction(t[s.method])){const e=this._indexes(s.method,o);return(r,o,n)=>t[s.method](...this._args(r,o,n,e,s.argument))}this.error(new Error('Middleware "'+s.method+'" Not Found.'),"Express")})).filter(e.isFunction)}_indexes(e,t){const s=[];return t.forEach((t=>t.name==e&&s.push(t))),s}_middlewares(e){return[...u(exports.MetadataKeys.MIDDLEWARE,e,[])].reverse()}_parameters(e){return u(exports.MetadataKeys.PARAMETERS,e,[])}_path(e){return u(exports.MetadataKeys.PATH,e,"/")}_routers(e){return u(exports.MetadataKeys.ROUTERS,e,[])}listen(){return h(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("Server started on port "+this._options.port+".","Express")))),!this._server){const e=_.createServer(((e,t)=>{const s=80==this._options.port?":80":"";t.writeHead(301,{Location:"https://"+e.headers.host+s+e.url}),t.end()})),t=x.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("Server started on port "+this._options.port+".","Express"))),this._server=t}this._server||(443==this._options.port&&e.listen(80,(()=>this.log("Server started on port 80","Express"))),t.listen(this._options.port,(()=>this.log("Server started on port "+this._options.port+".","Express"))),this._server=t)}}))}}var R;exports.Methods=void 0,(R=exports.Methods||(exports.Methods={})).GET="get",R.POST="post",R.PUT="put",R.HEAD="head",R.DELETE="delete",R.OPTIONS="options",R.PATCH="patch";const O=e=>t=>(s,r)=>{const o=s.constructor,n=u(exports.MetadataKeys.ROUTERS,o,[]);n.push({path:(null==t?void 0:t.length)?t:"/",method:e,name:r}),Reflect.defineMetadata(exports.MetadataKeys.ROUTERS,n,o)},l=O(exports.Methods.GET),A=O(exports.Methods.POST),N=O(exports.Methods.PUT),I=O(exports.Methods.HEAD),S=O(exports.Methods.DELETE),D=O(exports.Methods.OPTIONS),M=O(exports.Methods.PATCH),f=e=>t=>(s,r,o)=>{const n=s.constructor,p=u(exports.MetadataKeys.PARAMETERS,n,[]);p.push({callback:e,index:o,key:(null==t?void 0:t.length)?t:"",name:r}),Reflect.defineMetadata(exports.MetadataKeys.PARAMETERS,p,n)},P=(t,s)=>e.isUndefined(s)?t:t[s],U=f((({app:e})=>e)),m=f((({argument:e})=>e)),L=f((({req:e,key:t})=>P(e.body,t))),y=f((({req:e,key:t})=>P(e.cookies,t))),C=f((({req:e,key:t})=>P(e.cookies,t))),v=f((({next:e})=>e)),g=f((({req:e,key:t})=>P(e.params,t))),F=f((({req:e,key:t})=>P(e.query,t))),H=f((({req:e})=>e)),b=H,j=f((({res:e})=>e)),q=j,k=f((({send:e})=>e));exports.ACCEPTED=202,exports.ALREADY_REPORTED=208,exports.App=U,exports.Application=T,exports.Argument=m,exports.BAD_GATEWAY=502,exports.BAD_REQUEST=400,exports.Body=L,exports.CLIENT_CLOSED_REQUEST=499,exports.CONFLICT=409,exports.CONNECTION_CLOSED_WITHOUT_RESPONSE=444,exports.CONTINUE=100,exports.CREATED=201,exports.Controller=e=>t=>Reflect.defineMetadata(exports.MetadataKeys.PATH,(null==e?void 0:e.length)?e:"/",t),exports.Cookies=y,exports.Delete=S,exports.EXPECTATION_FAILED=417,exports.FAILED_DEPENDENCY=424,exports.FORBIDDEN=403,exports.FOUND=302,exports.GATEWAY_TIMEOUT=504,exports.GONE=410,exports.Get=l,exports.HTTP_VERSION_NOT_SUPPORTED=505,exports.Head=I,exports.Headers=C,exports.IM_A_TEAPOT=418,exports.IM_USED=226,exports.INSUFFICIENT_STORAGE=507,exports.INTERNAL_SERVER_ERROR=500,exports.LENGTH_REQUIRED=411,exports.LOCKED=423,exports.LOOP_DETECTED=508,exports.METHOD_NOT_ALLOWED=405,exports.MISDIRECTED_REQUEST=421,exports.MOVED_PERMANENTLY=301,exports.MULTIPLE_CHOICES=300,exports.MULTI_STATUS=207,exports.Metadata=u,exports.Middleware=(e,t)=>(s,r)=>{const o=s.constructor,n=u(exports.MetadataKeys.MIDDLEWARE,o,[]);n.push({name:r,method:e,argument:t}),Reflect.defineMetadata(exports.MetadataKeys.MIDDLEWARE,n,o)},exports.NETWORK_AUTHENTICATION_REQUIRED=511,exports.NETWORK_CONNECTION_TIMEOUT_ERROR=599,exports.NON_AUTHORITATIVE_INFORMATION=203,exports.NOT_ACCEPTABLE=406,exports.NOT_EXTENDED=510,exports.NOT_FOUND=404,exports.NOT_IMPLEMENTED=501,exports.NOT_MODIFIED=304,exports.NO_CONTENT=204,exports.Next=v,exports.OK=d,exports.Options=D,exports.PARTIAL_CONTENT=206,exports.PAYLOAD_TOO_LARGE=413,exports.PAYMENT_REQUIRED=402,exports.PERMANENT_REDIRECT=308,exports.PRECONDITION_FAILED=412,exports.PRECONDITION_REQUIRED=428,exports.PROCESSING=102,exports.PROXY_AUTHENTICATION_REQUIRED=407,exports.Params=g,exports.Patch=M,exports.Post=A,exports.Put=N,exports.Query=F,exports.REQUESTED_RANGE_NOT_SATISFIABLE=416,exports.REQUEST_HEADER_FIELDS_TOO_LARGE=431,exports.REQUEST_TIMEOUT=408,exports.REQUEST_URI_TOO_LONG=414,exports.RESET_CONTENT=205,exports.Req=b,exports.Request=H,exports.Res=q,exports.Response=j,exports.Responses=c,exports.SEE_OTHER=303,exports.SERVICE_UNAVAILABLE=503,exports.SWITCHING_PROTOCOLS=101,exports.Send=k,exports.TEMPORARY_REDIRECT=307,exports.TOO_MANY_REQUESTS=429,exports.UNAUTHORIZED=401,exports.UNAVAILABLE_FOR_LEGAL_REASONS=451,exports.UNPROCESSABLE_ENTITY=422,exports.UNSUPPORTED_MEDIA_TYPE=415,exports.UPGRADE_REQUIRED=426,exports.USE_PROXY=305,exports.VARIANT_ALSO_NEGOCIATES=506,exports.methodFactory=O,exports.parameterFactory=f;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* @andrewcaires/express v1.0.0
|
|
3
|
+
* Decorators for express
|
|
4
|
+
* (c) 2023 Andrew Caires
|
|
5
|
+
* @license: MIT
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter, TypeCallbackFunction } from '@andrewcaires/utils.js';
|
|
8
|
+
import { Response as Response$1, Request as Request$1, NextFunction, Express, Router } from 'express';
|
|
9
|
+
|
|
10
|
+
type ResponseJson = Response$1<any, Record<string, any>>;
|
|
11
|
+
declare class Responses {
|
|
12
|
+
private res;
|
|
13
|
+
constructor(res: Response$1);
|
|
14
|
+
success(message: string): ResponseJson;
|
|
15
|
+
static success(res: Response$1, message: string): ResponseJson;
|
|
16
|
+
data(obj: object): ResponseJson;
|
|
17
|
+
static data(res: Response$1, obj: object): ResponseJson;
|
|
18
|
+
error(message: string): ResponseJson;
|
|
19
|
+
static error(res: Response$1, message: string): ResponseJson;
|
|
20
|
+
list(arr: Array<any>): ResponseJson;
|
|
21
|
+
static list(res: Response$1, arr: Array<any>): ResponseJson;
|
|
22
|
+
notfound(message: string): ResponseJson;
|
|
23
|
+
static notfound(res: Response$1, message: string): ResponseJson;
|
|
24
|
+
validation(message: string): ResponseJson;
|
|
25
|
+
static validation(res: Response$1, message: string): ResponseJson;
|
|
26
|
+
unauthorized(message: string): ResponseJson;
|
|
27
|
+
static unauthorized(res: Response$1, message: string): ResponseJson;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
interface IOptions {
|
|
31
|
+
cert?: Buffer;
|
|
32
|
+
cross?: boolean;
|
|
33
|
+
hybrid?: boolean;
|
|
34
|
+
key?: Buffer;
|
|
35
|
+
path?: string;
|
|
36
|
+
port?: number;
|
|
37
|
+
public?: string;
|
|
38
|
+
}
|
|
39
|
+
interface IParameters {
|
|
40
|
+
req: Request$1;
|
|
41
|
+
res: Response$1;
|
|
42
|
+
next: NextFunction;
|
|
43
|
+
key: string;
|
|
44
|
+
app: Application;
|
|
45
|
+
send: Responses;
|
|
46
|
+
argument: any;
|
|
47
|
+
}
|
|
48
|
+
declare class Application extends EventEmitter {
|
|
49
|
+
private readonly _app;
|
|
50
|
+
private _server?;
|
|
51
|
+
private _options;
|
|
52
|
+
private _default;
|
|
53
|
+
private readonly _router;
|
|
54
|
+
private readonly _controlles;
|
|
55
|
+
get instance(): Express;
|
|
56
|
+
get router(): Router;
|
|
57
|
+
constructor(controlles: Array<object>, options?: IOptions);
|
|
58
|
+
error(error: any, source?: string): void;
|
|
59
|
+
log(message: string, source?: string): void;
|
|
60
|
+
private _args;
|
|
61
|
+
private _handles;
|
|
62
|
+
private _indexes;
|
|
63
|
+
private _middlewares;
|
|
64
|
+
private _parameters;
|
|
65
|
+
private _path;
|
|
66
|
+
private _routers;
|
|
67
|
+
listen(): Promise<void>;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
declare const Controller: (path?: string) => ClassDecorator;
|
|
71
|
+
|
|
72
|
+
declare enum MetadataKeys {
|
|
73
|
+
MIDDLEWARE = "@express_middleware",
|
|
74
|
+
PATH = "@express_path",
|
|
75
|
+
ROUTERS = "@express_routers",
|
|
76
|
+
PARAMETERS = "@express_parameters"
|
|
77
|
+
}
|
|
78
|
+
declare const Metadata: (metadataKey: MetadataKeys, target: any, test: any) => any;
|
|
79
|
+
|
|
80
|
+
interface IRouter {
|
|
81
|
+
path: string;
|
|
82
|
+
method: Methods;
|
|
83
|
+
name: string | symbol;
|
|
84
|
+
}
|
|
85
|
+
declare enum Methods {
|
|
86
|
+
GET = "get",
|
|
87
|
+
POST = "post",
|
|
88
|
+
PUT = "put",
|
|
89
|
+
HEAD = "head",
|
|
90
|
+
DELETE = "delete",
|
|
91
|
+
OPTIONS = "options",
|
|
92
|
+
PATCH = "patch"
|
|
93
|
+
}
|
|
94
|
+
declare const methodFactory: (method: Methods) => (path?: string) => MethodDecorator;
|
|
95
|
+
declare const Get: (path?: string) => MethodDecorator;
|
|
96
|
+
declare const Post: (path?: string) => MethodDecorator;
|
|
97
|
+
declare const Put: (path?: string) => MethodDecorator;
|
|
98
|
+
declare const Head: (path?: string) => MethodDecorator;
|
|
99
|
+
declare const Delete: (path?: string) => MethodDecorator;
|
|
100
|
+
declare const Options: (path?: string) => MethodDecorator;
|
|
101
|
+
declare const Patch: (path?: string) => MethodDecorator;
|
|
102
|
+
|
|
103
|
+
interface IMiddlewares {
|
|
104
|
+
name: string | symbol;
|
|
105
|
+
method: string;
|
|
106
|
+
argument: any;
|
|
107
|
+
}
|
|
108
|
+
declare const Middleware: (method: string, argument?: any) => MethodDecorator;
|
|
109
|
+
|
|
110
|
+
interface IParameter {
|
|
111
|
+
callback: TypeCallbackFunction;
|
|
112
|
+
index: number;
|
|
113
|
+
key: string;
|
|
114
|
+
name: string | symbol;
|
|
115
|
+
}
|
|
116
|
+
declare const parameterFactory: (callback: TypeCallbackFunction) => (key?: string) => ParameterDecorator;
|
|
117
|
+
declare const App: (key?: string) => ParameterDecorator;
|
|
118
|
+
declare const Argument: (key?: string) => ParameterDecorator;
|
|
119
|
+
declare const Body: (key?: string) => ParameterDecorator;
|
|
120
|
+
declare const Cookies: (key?: string) => ParameterDecorator;
|
|
121
|
+
declare const Headers: (key?: string) => ParameterDecorator;
|
|
122
|
+
declare const Next: (key?: string) => ParameterDecorator;
|
|
123
|
+
declare const Params: (key?: string) => ParameterDecorator;
|
|
124
|
+
declare const Query: (key?: string) => ParameterDecorator;
|
|
125
|
+
declare const Request: (key?: string) => ParameterDecorator;
|
|
126
|
+
declare const Req: (key?: string) => ParameterDecorator;
|
|
127
|
+
declare const Response: (key?: string) => ParameterDecorator;
|
|
128
|
+
declare const Res: (key?: string) => ParameterDecorator;
|
|
129
|
+
declare const Send: (key?: string) => ParameterDecorator;
|
|
130
|
+
|
|
131
|
+
declare const CONTINUE = 100;
|
|
132
|
+
declare const SWITCHING_PROTOCOLS = 101;
|
|
133
|
+
declare const PROCESSING = 102;
|
|
134
|
+
declare const OK = 200;
|
|
135
|
+
declare const CREATED = 201;
|
|
136
|
+
declare const ACCEPTED = 202;
|
|
137
|
+
declare const NON_AUTHORITATIVE_INFORMATION = 203;
|
|
138
|
+
declare const NO_CONTENT = 204;
|
|
139
|
+
declare const RESET_CONTENT = 205;
|
|
140
|
+
declare const PARTIAL_CONTENT = 206;
|
|
141
|
+
declare const MULTI_STATUS = 207;
|
|
142
|
+
declare const ALREADY_REPORTED = 208;
|
|
143
|
+
declare const IM_USED = 226;
|
|
144
|
+
declare const MULTIPLE_CHOICES = 300;
|
|
145
|
+
declare const MOVED_PERMANENTLY = 301;
|
|
146
|
+
declare const FOUND = 302;
|
|
147
|
+
declare const SEE_OTHER = 303;
|
|
148
|
+
declare const NOT_MODIFIED = 304;
|
|
149
|
+
declare const USE_PROXY = 305;
|
|
150
|
+
declare const TEMPORARY_REDIRECT = 307;
|
|
151
|
+
declare const PERMANENT_REDIRECT = 308;
|
|
152
|
+
declare const BAD_REQUEST = 400;
|
|
153
|
+
declare const UNAUTHORIZED = 401;
|
|
154
|
+
declare const PAYMENT_REQUIRED = 402;
|
|
155
|
+
declare const FORBIDDEN = 403;
|
|
156
|
+
declare const NOT_FOUND = 404;
|
|
157
|
+
declare const METHOD_NOT_ALLOWED = 405;
|
|
158
|
+
declare const NOT_ACCEPTABLE = 406;
|
|
159
|
+
declare const PROXY_AUTHENTICATION_REQUIRED = 407;
|
|
160
|
+
declare const REQUEST_TIMEOUT = 408;
|
|
161
|
+
declare const CONFLICT = 409;
|
|
162
|
+
declare const GONE = 410;
|
|
163
|
+
declare const LENGTH_REQUIRED = 411;
|
|
164
|
+
declare const PRECONDITION_FAILED = 412;
|
|
165
|
+
declare const PAYLOAD_TOO_LARGE = 413;
|
|
166
|
+
declare const REQUEST_URI_TOO_LONG = 414;
|
|
167
|
+
declare const UNSUPPORTED_MEDIA_TYPE = 415;
|
|
168
|
+
declare const REQUESTED_RANGE_NOT_SATISFIABLE = 416;
|
|
169
|
+
declare const EXPECTATION_FAILED = 417;
|
|
170
|
+
declare const IM_A_TEAPOT = 418;
|
|
171
|
+
declare const MISDIRECTED_REQUEST = 421;
|
|
172
|
+
declare const UNPROCESSABLE_ENTITY = 422;
|
|
173
|
+
declare const LOCKED = 423;
|
|
174
|
+
declare const FAILED_DEPENDENCY = 424;
|
|
175
|
+
declare const UPGRADE_REQUIRED = 426;
|
|
176
|
+
declare const PRECONDITION_REQUIRED = 428;
|
|
177
|
+
declare const TOO_MANY_REQUESTS = 429;
|
|
178
|
+
declare const REQUEST_HEADER_FIELDS_TOO_LARGE = 431;
|
|
179
|
+
declare const CONNECTION_CLOSED_WITHOUT_RESPONSE = 444;
|
|
180
|
+
declare const UNAVAILABLE_FOR_LEGAL_REASONS = 451;
|
|
181
|
+
declare const CLIENT_CLOSED_REQUEST = 499;
|
|
182
|
+
declare const INTERNAL_SERVER_ERROR = 500;
|
|
183
|
+
declare const NOT_IMPLEMENTED = 501;
|
|
184
|
+
declare const BAD_GATEWAY = 502;
|
|
185
|
+
declare const SERVICE_UNAVAILABLE = 503;
|
|
186
|
+
declare const GATEWAY_TIMEOUT = 504;
|
|
187
|
+
declare const HTTP_VERSION_NOT_SUPPORTED = 505;
|
|
188
|
+
declare const VARIANT_ALSO_NEGOCIATES = 506;
|
|
189
|
+
declare const INSUFFICIENT_STORAGE = 507;
|
|
190
|
+
declare const LOOP_DETECTED = 508;
|
|
191
|
+
declare const NOT_EXTENDED = 510;
|
|
192
|
+
declare const NETWORK_AUTHENTICATION_REQUIRED = 511;
|
|
193
|
+
declare const NETWORK_CONNECTION_TIMEOUT_ERROR = 599;
|
|
194
|
+
|
|
195
|
+
export { ACCEPTED, ALREADY_REPORTED, App, Application, Argument, BAD_GATEWAY, BAD_REQUEST, Body, CLIENT_CLOSED_REQUEST, CONFLICT, CONNECTION_CLOSED_WITHOUT_RESPONSE, CONTINUE, CREATED, Controller, Cookies, Delete, EXPECTATION_FAILED, FAILED_DEPENDENCY, FORBIDDEN, FOUND, GATEWAY_TIMEOUT, GONE, Get, HTTP_VERSION_NOT_SUPPORTED, Head, Headers, IM_A_TEAPOT, IM_USED, IMiddlewares, INSUFFICIENT_STORAGE, INTERNAL_SERVER_ERROR, IOptions, IParameter, IParameters, IRouter, LENGTH_REQUIRED, LOCKED, LOOP_DETECTED, METHOD_NOT_ALLOWED, MISDIRECTED_REQUEST, MOVED_PERMANENTLY, MULTIPLE_CHOICES, MULTI_STATUS, Metadata, MetadataKeys, Methods, Middleware, NETWORK_AUTHENTICATION_REQUIRED, NETWORK_CONNECTION_TIMEOUT_ERROR, NON_AUTHORITATIVE_INFORMATION, NOT_ACCEPTABLE, NOT_EXTENDED, NOT_FOUND, NOT_IMPLEMENTED, NOT_MODIFIED, NO_CONTENT, Next, OK, Options, PARTIAL_CONTENT, PAYLOAD_TOO_LARGE, PAYMENT_REQUIRED, PERMANENT_REDIRECT, PRECONDITION_FAILED, PRECONDITION_REQUIRED, PROCESSING, PROXY_AUTHENTICATION_REQUIRED, Params, Patch, Post, Put, Query, REQUESTED_RANGE_NOT_SATISFIABLE, REQUEST_HEADER_FIELDS_TOO_LARGE, REQUEST_TIMEOUT, REQUEST_URI_TOO_LONG, RESET_CONTENT, Req, Request, Res, Response, ResponseJson, Responses, SEE_OTHER, SERVICE_UNAVAILABLE, SWITCHING_PROTOCOLS, Send, TEMPORARY_REDIRECT, TOO_MANY_REQUESTS, UNAUTHORIZED, UNAVAILABLE_FOR_LEGAL_REASONS, UNPROCESSABLE_ENTITY, UNSUPPORTED_MEDIA_TYPE, UPGRADE_REQUIRED, USE_PROXY, VARIANT_ALSO_NEGOCIATES, methodFactory, parameterFactory };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* @andrewcaires/express v1.0.0
|
|
3
|
+
* Decorators for express
|
|
4
|
+
* (c) 2023 Andrew Caires
|
|
5
|
+
* @license: MIT
|
|
6
|
+
*/
|
|
7
|
+
import"reflect-metadata";import{EventEmitter as t,isFunction as e,isUndefined as s}from"@andrewcaires/utils.js";import r from"cors";import o,{Router as n,json as i,urlencoded as a}from"express";import{existsSync as h}from"fs";import*as p from"http";import*as u from"https";import{Server as c}from"net";import{resolve as d}from"path";function l(t,e,s,r){return new(s||(s=Promise))((function(o,n){function i(t){try{h(r.next(t))}catch(t){n(t)}}function a(t){try{h(r.throw(t))}catch(t){n(t)}}function h(t){var e;t.done?o(t.value):(e=t.value,e instanceof s?e:new s((function(t){t(e)}))).then(i,a)}h((r=r.apply(t,e||[])).next())}))}var _;!function(t){t.MIDDLEWARE="@express_middleware",t.PATH="@express_path",t.ROUTERS="@express_routers",t.PARAMETERS="@express_parameters"}(_||(_={}));const m=(t,e,s)=>Reflect.hasMetadata(t,e)?Reflect.getMetadata(t,e):s,f=100,E=101,g=102,v=200,x=201,R=202,T=203,A=204,S=205,y=206,P=207,k=208,M=226,w=300,O=301,b=302,j=303,D=304,q=305,H=307,I=308,L=400,U=401,F=402,N=403,W=404,z=405,C=406,G=407,B=408,J=409,K=410,Q=411,V=412,X=413,Y=414,Z=415,$=416,tt=417,et=418,st=421,rt=422,ot=423,nt=424,it=426,at=428,ht=429,pt=431,ut=444,ct=451,dt=499,lt=500,_t=501,mt=502,ft=503,Et=504,gt=505,vt=506,xt=507,Rt=508,Tt=510,At=511,St=599;class yt{constructor(t){this.res=t}success(t){return yt.success(this.res,t)}static success(t,e){return t.status(v).json({message:e})}data(t){return yt.data(this.res,t)}static data(t,e){return t.status(v).json(Object.assign({},e))}error(t){return yt.error(this.res,t)}static error(t,e){return t.status(500).json({message:e})}list(t){return yt.list(this.res,t)}static list(t,e){return t.status(v).json([...e])}notfound(t){return yt.notfound(this.res,t)}static notfound(t,e){return t.status(404).json({message:e})}validation(t){return yt.validation(this.res,t)}static validation(t,e){return t.status(400).json({message:e})}unauthorized(t){return yt.unauthorized(this.res,t)}static unauthorized(t,e){return t.status(401).json({message:e})}}class Pt extends t{get instance(){return this._app}get router(){return this._router}constructor(t,s){var p;super(),this._app=o(),this._options={},this._default={cross:!1,hybrid:!1,path:"/",port:3e3},this._router=n(),this._controlles=n(),this._options=Object.assign(Object.assign({},this._default),s),this._app.use(i()),this._app.disable("x-powered-by"),this._app.use(a({extended:!0})),this._options.cross&&this._app.use(r()),this._app.use(this._router);const u=(null===(p=this._options.path)||void 0===p?void 0:p.length)?this._options.path:"/";if(this._app.use(u,this._controlles),this._app.all(u+"/*",((t,e)=>yt.notfound(e,"Invalid API"))),this._options.public){const t=d(this._options.public);h(t)&&this._app.use(o.static(t)),this._app.get("*",((e,s)=>{if(!h(t))return yt.notfound(s,'File "index.html" not found');s.sendFile(t+"/index.html")}))}t.forEach((t=>{const s=t.constructor,r=this._path(s),o=this._routers(s),i=this._middlewares(s),a=this._parameters(s),h=n();o.forEach((r=>{const o=r.name.toString();if(e(t[o])){if(!e(h[r.method]))return this.error(new Error('Method "'+r.method+'" Not Found.'),"Express");const s=this._handles(t,o,i,a),n=this._indexes(o,a);h[r.method](r.path,...s,((e,s,r)=>t[o](...this._args(e,s,r,n))))}else this.error(new Error('Router "'+s.name+"."+o+'" Not Found.'),"Express")})),this._controlles.use(r,h)}))}error(t,e){s(e)?console.error(t):console.error(e+":",t)}log(t,e){s(e)?console.error(t):console.error(e+":",t)}_args(t,e,s,r,o){const n=[],i={req:t,res:e,next:s,app:this,send:new yt(e),argument:o};return r.forEach((t=>{n[t.index]=t.callback(Object.assign(Object.assign({},i),{key:t.key}))})),n}_handles(t,s,r,o){return r.filter((t=>t.name==s)).map((s=>{if(e(t[s.method])){const e=this._indexes(s.method,o);return(r,o,n)=>t[s.method](...this._args(r,o,n,e,s.argument))}this.error(new Error('Middleware "'+s.method+'" Not Found.'),"Express")})).filter(e)}_indexes(t,e){const s=[];return e.forEach((e=>e.name==t&&s.push(e))),s}_middlewares(t){return[...m(_.MIDDLEWARE,t,[])].reverse()}_parameters(t){return m(_.PARAMETERS,t,[])}_path(t){return m(_.PATH,t,"/")}_routers(t){return m(_.ROUTERS,t,[])}listen(){return l(this,void 0,void 0,(function*(){if(this._options.cert&&this._options.key||(this._server=p.createServer(this._app),this._server.listen(this._options.port,(()=>this.log("Server started on port "+this._options.port+".","Express")))),!this._server){const t=p.createServer(((t,e)=>{const s=80==this._options.port?":80":"";e.writeHead(301,{Location:"https://"+t.headers.host+s+t.url}),e.end()})),e=u.createServer({key:this._options.key,cert:this._options.cert},this._app);if(this._options.hybrid){new c((s=>{s.once("data",(r=>{s.pause(),s.unshift(r),(22===r[0]?e:t).emit("connection",s),process.nextTick((()=>s.resume()))}))})).listen(this._options.port,(()=>this.log("Server started on port "+this._options.port+".","Express"))),this._server=e}this._server||(443==this._options.port&&t.listen(80,(()=>this.log("Server started on port 80","Express"))),e.listen(this._options.port,(()=>this.log("Server started on port "+this._options.port+".","Express"))),this._server=e)}}))}}const kt=t=>e=>Reflect.defineMetadata(_.PATH,(null==t?void 0:t.length)?t:"/",e);var Mt;!function(t){t.GET="get",t.POST="post",t.PUT="put",t.HEAD="head",t.DELETE="delete",t.OPTIONS="options",t.PATCH="patch"}(Mt||(Mt={}));const wt=t=>e=>(s,r)=>{const o=s.constructor,n=m(_.ROUTERS,o,[]);n.push({path:(null==e?void 0:e.length)?e:"/",method:t,name:r}),Reflect.defineMetadata(_.ROUTERS,n,o)},Ot=wt(Mt.GET),bt=wt(Mt.POST),jt=wt(Mt.PUT),Dt=wt(Mt.HEAD),qt=wt(Mt.DELETE),Ht=wt(Mt.OPTIONS),It=wt(Mt.PATCH),Lt=(t,e)=>(s,r)=>{const o=s.constructor,n=m(_.MIDDLEWARE,o,[]);n.push({name:r,method:t,argument:e}),Reflect.defineMetadata(_.MIDDLEWARE,n,o)},Ut=t=>e=>(s,r,o)=>{const n=s.constructor,i=m(_.PARAMETERS,n,[]);i.push({callback:t,index:o,key:(null==e?void 0:e.length)?e:"",name:r}),Reflect.defineMetadata(_.PARAMETERS,i,n)},Ft=(t,e)=>s(e)?t:t[e],Nt=Ut((({app:t})=>t)),Wt=Ut((({argument:t})=>t)),zt=Ut((({req:t,key:e})=>Ft(t.body,e))),Ct=Ut((({req:t,key:e})=>Ft(t.cookies,e))),Gt=Ut((({req:t,key:e})=>Ft(t.cookies,e))),Bt=Ut((({next:t})=>t)),Jt=Ut((({req:t,key:e})=>Ft(t.params,e))),Kt=Ut((({req:t,key:e})=>Ft(t.query,e))),Qt=Ut((({req:t})=>t)),Vt=Qt,Xt=Ut((({res:t})=>t)),Yt=Xt,Zt=Ut((({send:t})=>t));export{R as ACCEPTED,k as ALREADY_REPORTED,Nt as App,Pt as Application,Wt as Argument,mt as BAD_GATEWAY,L as BAD_REQUEST,zt as Body,dt as CLIENT_CLOSED_REQUEST,J as CONFLICT,ut as CONNECTION_CLOSED_WITHOUT_RESPONSE,f as CONTINUE,x as CREATED,kt as Controller,Ct as Cookies,qt as Delete,tt as EXPECTATION_FAILED,nt as FAILED_DEPENDENCY,N as FORBIDDEN,b as FOUND,Et as GATEWAY_TIMEOUT,K as GONE,Ot as Get,gt as HTTP_VERSION_NOT_SUPPORTED,Dt as Head,Gt as Headers,et as IM_A_TEAPOT,M as IM_USED,xt as INSUFFICIENT_STORAGE,lt as INTERNAL_SERVER_ERROR,Q as LENGTH_REQUIRED,ot as LOCKED,Rt as LOOP_DETECTED,z as METHOD_NOT_ALLOWED,st as MISDIRECTED_REQUEST,O as MOVED_PERMANENTLY,w as MULTIPLE_CHOICES,P as MULTI_STATUS,m as Metadata,_ as MetadataKeys,Mt as Methods,Lt as Middleware,At as NETWORK_AUTHENTICATION_REQUIRED,St as NETWORK_CONNECTION_TIMEOUT_ERROR,T as NON_AUTHORITATIVE_INFORMATION,C as NOT_ACCEPTABLE,Tt as NOT_EXTENDED,W as NOT_FOUND,_t as NOT_IMPLEMENTED,D as NOT_MODIFIED,A as NO_CONTENT,Bt as Next,v as OK,Ht as Options,y as PARTIAL_CONTENT,X as PAYLOAD_TOO_LARGE,F as PAYMENT_REQUIRED,I as PERMANENT_REDIRECT,V as PRECONDITION_FAILED,at as PRECONDITION_REQUIRED,g as PROCESSING,G as PROXY_AUTHENTICATION_REQUIRED,Jt as Params,It as Patch,bt as Post,jt as Put,Kt as Query,$ as REQUESTED_RANGE_NOT_SATISFIABLE,pt as REQUEST_HEADER_FIELDS_TOO_LARGE,B as REQUEST_TIMEOUT,Y as REQUEST_URI_TOO_LONG,S as RESET_CONTENT,Vt as Req,Qt as Request,Yt as Res,Xt as Response,yt as Responses,j as SEE_OTHER,ft as SERVICE_UNAVAILABLE,E as SWITCHING_PROTOCOLS,Zt as Send,H as TEMPORARY_REDIRECT,ht as TOO_MANY_REQUESTS,U as UNAUTHORIZED,ct as UNAVAILABLE_FOR_LEGAL_REASONS,rt as UNPROCESSABLE_ENTITY,Z as UNSUPPORTED_MEDIA_TYPE,it as UPGRADE_REQUIRED,q as USE_PROXY,vt as VARIANT_ALSO_NEGOCIATES,wt as methodFactory,Ut as parameterFactory};
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@andrewcaires/express",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Decorators for express",
|
|
5
|
+
"main": "./dist/index.cjs.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"module": "./dist/index.esm.js",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.esm.js",
|
|
12
|
+
"require": "./dist/index.cjs.js",
|
|
13
|
+
"default": "./dist/index.cjs.js"
|
|
14
|
+
},
|
|
15
|
+
"./package.json": "./package.json"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "rollup --bundleConfigAsCjs -c rollup.config.js",
|
|
22
|
+
"dev": "ts-node-dev --respawn --transpile-only ./src/dev.ts"
|
|
23
|
+
},
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/andrewcaires/npm.git"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"express"
|
|
30
|
+
],
|
|
31
|
+
"author": "Andrew Caires",
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"bugs": {
|
|
34
|
+
"url": "https://github.com/andrewcaires/npm/issues"
|
|
35
|
+
},
|
|
36
|
+
"homepage": "https://github.com/andrewcaires/npm/tree/main/api#readme",
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@andrewcaires/utils.js": "^0.2.10",
|
|
39
|
+
"cors": "^2.8.5",
|
|
40
|
+
"express": "^4.18.2",
|
|
41
|
+
"multer": "^1.4.5-lts.1",
|
|
42
|
+
"reflect-metadata": "^0.1.13"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@rollup/plugin-commonjs": "^24.0.1",
|
|
46
|
+
"@rollup/plugin-terser": "^0.4.0",
|
|
47
|
+
"@rollup/plugin-typescript": "^11.0.0",
|
|
48
|
+
"@types/cors": "^2.8.13",
|
|
49
|
+
"@types/express": "^4.17.17",
|
|
50
|
+
"@types/mime-types": "^2.1.1",
|
|
51
|
+
"@types/multer": "^1.4.7",
|
|
52
|
+
"@types/node": "^18.14.6",
|
|
53
|
+
"@typescript-eslint/eslint-plugin": "^5.54.1",
|
|
54
|
+
"@typescript-eslint/parser": "^5.54.1",
|
|
55
|
+
"eslint": "^8.35.0",
|
|
56
|
+
"rollup-plugin-dts": "^5.2.0",
|
|
57
|
+
"ts-node": "^10.9.1",
|
|
58
|
+
"ts-node-dev": "^2.0.0",
|
|
59
|
+
"tslib": "^2.5.0"
|
|
60
|
+
}
|
|
61
|
+
}
|