equipped 4.3.2 → 4.4.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/CHANGELOG.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ## [4.4.0](https://github.com/kevinand11/equipped/compare/v4.3.2...v4.4.0) (2024-02-23)
6
+
5
7
  ### [4.3.2](https://github.com/kevinand11/equipped/compare/v4.3.1...v4.3.2) (2024-02-21)
6
8
 
7
9
  ### [4.3.1](https://github.com/kevinand11/equipped/compare/v4.3.0...v4.3.1) (2024-02-17)
@@ -35,5 +35,7 @@ class ConsoleLogger extends Logger {
35
35
  }
36
36
  exports.ConsoleLogger = ConsoleLogger;
37
37
  _ConsoleLogger_log = new WeakMap(), _ConsoleLogger_instances = new WeakSet(), _ConsoleLogger_getTime = function _ConsoleLogger_getTime() {
38
- return new Date().toJSON().split('T')[1].slice(0, 8);
38
+ const date = new Date().toJSON();
39
+ const split = date.split('T');
40
+ return [split[0], split[1].slice(0, 8)].join('T');
39
41
  };
@@ -1,11 +1,12 @@
1
1
  import supertest from 'supertest';
2
2
  import { Listener } from '../listeners';
3
- import { Route } from './routes';
3
+ import { Route, Router } from './routes';
4
4
  export declare class Server {
5
5
  #private;
6
6
  constructor();
7
7
  get listener(): Listener;
8
8
  set routes(routes: Route[]);
9
+ register(router: Router): void;
9
10
  test(): import("supertest/lib/agent")<supertest.SuperTestStatic.Test>;
10
11
  start(port: number): Promise<boolean>;
11
12
  }
package/lib/server/app.js CHANGED
@@ -31,6 +31,7 @@ const supertest_1 = __importDefault(require("supertest"));
31
31
  const exit_1 = require("../exit");
32
32
  const instance_1 = require("../instance");
33
33
  const listeners_1 = require("../listeners");
34
+ const middlewares_1 = require("./middlewares");
34
35
  const parseAuthUser_1 = require("./middlewares/parseAuthUser");
35
36
  const routes_1 = require("./routes");
36
37
  const statusCodes_1 = require("./statusCodes");
@@ -43,8 +44,7 @@ class Server {
43
44
  __classPrivateFieldSet(this, _Server_expressApp, (0, express_1.default)(), "f");
44
45
  __classPrivateFieldGet(this, _Server_expressApp, "f").disable('x-powered-by');
45
46
  __classPrivateFieldSet(this, _Server_httpServer, http_1.default.createServer(__classPrivateFieldGet(this, _Server_expressApp, "f")), "f");
46
- if (settings.isDev)
47
- __classPrivateFieldGet(this, _Server_expressApp, "f").use((0, morgan_1.default)('dev'));
47
+ __classPrivateFieldGet(this, _Server_expressApp, "f").use((0, morgan_1.default)((tokens, req, res) => `${tokens.method(req, res)}(${tokens.status(req, res)}) ${tokens.url(req, res)} ${tokens.res(req, res, 'content-length')}b - ${tokens['response-time'](req, res)}ms`));
48
48
  __classPrivateFieldGet(this, _Server_expressApp, "f").use(express_1.default.json());
49
49
  __classPrivateFieldGet(this, _Server_expressApp, "f").use((0, cookie_parser_1.default)());
50
50
  __classPrivateFieldGet(this, _Server_expressApp, "f").use(helmet_1.default.crossOriginResourcePolicy({ policy: 'cross-origin' }));
@@ -77,11 +77,19 @@ class Server {
77
77
  return __classPrivateFieldGet(this, _Server_listener, "f");
78
78
  }
79
79
  set routes(routes) {
80
- const allRoutes = [...routes, ...(0, routes_1.PostRoutes)()];
81
- allRoutes.forEach(({ method, path, controllers }) => {
80
+ routes.forEach(({ method, path, controllers }) => {
82
81
  controllers = [parseAuthUser_1.parseAuthUser, ...controllers];
83
82
  if (path)
84
- __classPrivateFieldGet(this, _Server_expressApp, "f")[method]?.(formatPath(path), ...controllers);
83
+ __classPrivateFieldGet(this, _Server_expressApp, "f")[method]?.((0, routes_1.formatPath)(path), ...controllers);
84
+ else
85
+ __classPrivateFieldGet(this, _Server_expressApp, "f").use(...controllers);
86
+ });
87
+ }
88
+ register(router) {
89
+ router.routes.forEach(({ method, path, controllers }) => {
90
+ controllers = [parseAuthUser_1.parseAuthUser, ...controllers];
91
+ if (path)
92
+ __classPrivateFieldGet(this, _Server_expressApp, "f")[method]?.(path, ...controllers);
85
93
  else
86
94
  __classPrivateFieldGet(this, _Server_expressApp, "f").use(...controllers);
87
95
  });
@@ -90,6 +98,11 @@ class Server {
90
98
  return (0, supertest_1.default)(__classPrivateFieldGet(this, _Server_httpServer, "f"));
91
99
  }
92
100
  async start(port) {
101
+ const postRoutesRouter = new routes_1.Router();
102
+ postRoutesRouter.get({ path: '__health' })(async () => `${instance_1.Instance.get().settings.appId} service running`);
103
+ postRoutesRouter.all({ middlewares: [middlewares_1.notFoundHandler] })();
104
+ postRoutesRouter.all({ middlewares: [middlewares_1.errorHandler] })();
105
+ this.register(postRoutesRouter);
93
106
  return await new Promise((resolve, reject) => {
94
107
  try {
95
108
  const app = __classPrivateFieldGet(this, _Server_httpServer, "f").listen(port, async () => {
@@ -106,6 +119,3 @@ class Server {
106
119
  }
107
120
  exports.Server = Server;
108
121
  _Server_expressApp = new WeakMap(), _Server_httpServer = new WeakMap(), _Server_listener = new WeakMap();
109
- const formatPath = (path) => `/${path}/`
110
- .replaceAll('///', '/')
111
- .replaceAll('//', '/');
@@ -1,19 +1,10 @@
1
- /// <reference types="node" />
2
1
  import { ErrorRequestHandler, Handler } from 'express';
3
- import { Writable } from 'stream';
4
- import { SupportedStatusCodes } from '../statusCodes';
5
2
  import { Request as CustomRequest } from './request';
6
- type CustomResponse = {
7
- result: any;
8
- status?: SupportedStatusCodes;
9
- headers?: Record<string, any>;
10
- piped?: boolean;
11
- };
12
- type ExtraArgs = {
13
- pipeThrough?: Writable;
14
- };
3
+ import { Response } from './response';
4
+ type CustomResponse<T> = Response<T> | T;
15
5
  export type Controller = Handler | ErrorRequestHandler;
16
- export declare const makeController: (cb: (_: CustomRequest, extras: ExtraArgs) => Promise<CustomResponse>) => Controller;
17
- export declare const makeMiddleware: (cb: (_: CustomRequest, extras: ExtraArgs) => Promise<void>) => Controller;
18
- export declare const makeErrorMiddleware: (cb: (_: CustomRequest, __: Error, extras: ExtraArgs) => Promise<CustomResponse>) => Controller;
6
+ export type RouteHandler<T> = (req: CustomRequest) => Promise<CustomResponse<T>>;
7
+ export declare const makeController: <T>(cb: RouteHandler<T>) => Controller;
8
+ export declare const makeMiddleware: <T>(cb: RouteHandler<T>) => Controller;
9
+ export declare const makeErrorMiddleware: <T>(cb: (_: CustomRequest, __: Error) => Promise<CustomResponse<T>>) => Controller;
19
10
  export {};
@@ -3,18 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.makeErrorMiddleware = exports.makeMiddleware = exports.makeController = void 0;
4
4
  const statusCodes_1 = require("../statusCodes");
5
5
  const request_1 = require("./request");
6
- const defaultHeaders = { 'Content-Type': 'application/json' };
6
+ const response_1 = require("./response");
7
7
  const makeController = (cb) => {
8
8
  return async (req, res, next) => {
9
9
  try {
10
- const extras = {
11
- pipeThrough: res
12
- };
13
- const { status = statusCodes_1.StatusCodes.Ok, result, headers = defaultHeaders, piped = false } = await cb(await request_1.Request.make(req), extras);
14
- if (!piped) {
15
- Object.entries(headers).forEach(([key, value]) => res.header(key, value));
16
- const type = result === null || result == undefined ? 'json' : 'send';
17
- res.status(status)[type](result).end();
10
+ const rawResponse = await cb(await request_1.Request.make(req, res));
11
+ const response = rawResponse instanceof response_1.Response ? rawResponse : new response_1.Response({ body: rawResponse });
12
+ if (!response.piped) {
13
+ Object.entries(response.headers).forEach(([key, value]) => res.header(key, value));
14
+ const type = response.shouldJSONify ? 'json' : 'send';
15
+ res.status(response.status)[type](response.body).end();
18
16
  }
19
17
  }
20
18
  catch (e) {
@@ -26,10 +24,7 @@ exports.makeController = makeController;
26
24
  const makeMiddleware = (cb) => {
27
25
  return async (req, res, next) => {
28
26
  try {
29
- const extras = {
30
- pipeThrough: res
31
- };
32
- await cb(await request_1.Request.make(req), extras);
27
+ await cb(await request_1.Request.make(req, res));
33
28
  return next();
34
29
  }
35
30
  catch (e) {
@@ -40,13 +35,11 @@ const makeMiddleware = (cb) => {
40
35
  exports.makeMiddleware = makeMiddleware;
41
36
  const makeErrorMiddleware = (cb) => {
42
37
  return async (err, req, res, _) => {
43
- const extras = {
44
- pipeThrough: res
45
- };
46
- const { status = statusCodes_1.StatusCodes.BadRequest, result, headers = defaultHeaders, piped = false } = await cb(await request_1.Request.make(req), err, extras);
47
- if (!piped) {
48
- Object.entries(headers).forEach(([key, value]) => res.header(key, value));
49
- res.status(status).send(result).end();
38
+ const rawResponse = await cb(await request_1.Request.make(req, res), err);
39
+ const response = rawResponse instanceof response_1.Response ? rawResponse : new response_1.Response({ body: rawResponse, status: statusCodes_1.StatusCodes.BadRequest });
40
+ if (!response.piped) {
41
+ Object.entries(response.headers).forEach(([key, value]) => res.header(key, value));
42
+ res.status(response.status).send(response.body).end();
50
43
  }
51
44
  };
52
45
  };
@@ -1,10 +1,14 @@
1
- import { Request as ExpressRequest } from 'express';
1
+ /// <reference types="node" />
2
+ import { Request as ExpressRequest, Response as ExpressResponse } from 'express';
3
+ import { Writable } from 'stream';
2
4
  import { CustomError } from '../../errors';
3
5
  import { StorageFile } from '../../storage';
4
6
  import { AuthUser, RefreshUser } from '../../utils/authUser';
7
+ import { Response } from './response';
5
8
  type HeaderKeys = 'AccessToken' | 'RefreshToken' | 'Referer' | 'ContentType' | 'UserAgent';
6
9
  export declare class Request {
7
10
  #private;
11
+ private readonly rawRes;
8
12
  readonly ip: string | undefined;
9
13
  readonly method: string;
10
14
  readonly path: string;
@@ -29,7 +33,8 @@ export declare class Request {
29
33
  method: string;
30
34
  path: string;
31
35
  data: Record<string, any>;
32
- });
33
- static make(req: ExpressRequest): Promise<Request>;
36
+ }, rawRes: ExpressResponse);
37
+ static make(req: ExpressRequest, res: ExpressResponse): Promise<Request>;
38
+ pipe(cb: (stream: Writable) => void): Response<ExpressResponse<any, Record<string, any>>>;
34
39
  }
35
40
  export {};
@@ -9,9 +9,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.Request = void 0;
10
10
  const json_1 = require("../../utils/json");
11
11
  const media_1 = require("../../utils/media");
12
+ const statusCodes_1 = require("../statusCodes");
13
+ const response_1 = require("./response");
12
14
  class Request {
13
- constructor({ ip, body, cookies, params, query, method, path, headers, files, data }) {
15
+ constructor({ ip, body, cookies, params, query, method, path, headers, files, data }, rawRes) {
14
16
  _Request_instances.add(this);
17
+ this.rawRes = rawRes;
15
18
  this.authUser = null;
16
19
  this.refreshUser = null;
17
20
  this.pendingError = null;
@@ -25,12 +28,16 @@ class Request {
25
28
  this.params = params;
26
29
  this.query = Object.fromEntries(Object.entries(query ?? {})
27
30
  .map(([key, val]) => [key, __classPrivateFieldGet(this, _Request_instances, "m", _Request_parseQueryStrings).call(this, val)]));
31
+ if (this.query['auth'])
32
+ delete this.query['auth'];
33
+ if (this.query['authType'])
34
+ delete this.query['authType'];
28
35
  this.headers = headers;
29
36
  this.files = files;
30
37
  this.authUser = data.authUser ?? null;
31
38
  this.refreshUser = data.refreshUser ?? null;
32
39
  }
33
- static async make(req) {
40
+ static async make(req, res) {
34
41
  const allHeaders = Object.fromEntries(Object.entries(req.headers).map(([key, val]) => [key, val ?? null]));
35
42
  const headers = {
36
43
  ...allHeaders,
@@ -63,7 +70,11 @@ class Request {
63
70
  path: req.path,
64
71
  headers, files,
65
72
  data: {}
66
- }));
73
+ }, res));
74
+ }
75
+ pipe(cb) {
76
+ cb(this.rawRes);
77
+ return new response_1.Response({ piped: true, status: statusCodes_1.StatusCodes.Ok, body: this.rawRes });
67
78
  }
68
79
  }
69
80
  exports.Request = Request;
@@ -0,0 +1,14 @@
1
+ import { SupportedStatusCodes } from '../statusCodes';
2
+ export declare class Response<T> {
3
+ readonly body: T | undefined;
4
+ readonly status: SupportedStatusCodes;
5
+ readonly headers: Record<string, any>;
6
+ readonly piped: boolean;
7
+ constructor({ body, status, headers, piped }: {
8
+ body?: T;
9
+ status?: SupportedStatusCodes;
10
+ headers?: Record<string, any>;
11
+ piped?: boolean;
12
+ });
13
+ get shouldJSONify(): boolean;
14
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Response = void 0;
4
+ const statusCodes_1 = require("../statusCodes");
5
+ class Response {
6
+ constructor({ body, status = statusCodes_1.StatusCodes.Ok, headers = { 'Content-Type': 'application/json' }, piped = false }) {
7
+ this.body = body;
8
+ this.status = status;
9
+ this.headers = headers;
10
+ this.piped = piped;
11
+ }
12
+ get shouldJSONify() {
13
+ return this.body === null || this.body === undefined;
14
+ }
15
+ }
16
+ exports.Response = Response;
@@ -1,6 +1,7 @@
1
1
  export * from './controllers';
2
2
  export * from './controllers/request';
3
+ export * from './controllers/response';
3
4
  export * from './middlewares';
4
- export { groupRoutes } from './routes';
5
+ export { Router, groupRoutes } from './routes';
5
6
  export type { Route } from './routes';
6
7
  export * from './statusCodes';
@@ -14,10 +14,12 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.groupRoutes = void 0;
17
+ exports.groupRoutes = exports.Router = void 0;
18
18
  __exportStar(require("./controllers"), exports);
19
19
  __exportStar(require("./controllers/request"), exports);
20
+ __exportStar(require("./controllers/response"), exports);
20
21
  __exportStar(require("./middlewares"), exports);
21
22
  var routes_1 = require("./routes");
23
+ Object.defineProperty(exports, "Router", { enumerable: true, get: function () { return routes_1.Router; } });
22
24
  Object.defineProperty(exports, "groupRoutes", { enumerable: true, get: function () { return routes_1.groupRoutes; } });
23
25
  __exportStar(require("./statusCodes"), exports);
@@ -1,10 +1,25 @@
1
- import { Controller } from './controllers';
2
- type MethodTypes = 'get' | 'post' | 'put' | 'delete' | 'all';
1
+ import { Controller, RouteHandler } from './controllers';
2
+ type MethodTypes = 'get' | 'post' | 'put' | 'patch' | 'delete' | 'all';
3
3
  export type Route = {
4
4
  path: string;
5
5
  method: MethodTypes;
6
6
  controllers: Controller[];
7
7
  };
8
- export declare const PostRoutes: () => Route[];
8
+ export declare const formatPath: (path: string) => string;
9
9
  export declare const groupRoutes: (parent: string, routes: Route[]) => Route[];
10
+ type RouteConfig = Partial<Omit<Route, 'method' | 'controllers'>> & {
11
+ middlewares?: Route['controllers'];
12
+ };
13
+ export declare class Router {
14
+ #private;
15
+ readonly routes: Route[];
16
+ constructor(config?: RouteConfig);
17
+ get(route: RouteConfig): <T>(handler?: RouteHandler<T> | undefined) => void;
18
+ post(route: RouteConfig): <T>(handler?: RouteHandler<T> | undefined) => void;
19
+ put(route: RouteConfig): <T>(handler?: RouteHandler<T> | undefined) => void;
20
+ patch(route: RouteConfig): <T>(handler?: RouteHandler<T> | undefined) => void;
21
+ delete(route: RouteConfig): <T>(handler?: RouteHandler<T> | undefined) => void;
22
+ all(route: RouteConfig): <T>(handler?: RouteHandler<T> | undefined) => void;
23
+ include(router: Router): void;
24
+ }
10
25
  export {};
@@ -1,36 +1,67 @@
1
1
  "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var _Router_instances, _Router_config, _Router_addRoute;
2
14
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.groupRoutes = exports.PostRoutes = void 0;
4
- const instance_1 = require("../instance");
15
+ exports.Router = exports.groupRoutes = exports.formatPath = void 0;
5
16
  const controllers_1 = require("./controllers");
6
- const errorHandler_1 = require("./middlewares/errorHandler");
7
- const notFoundHandler_1 = require("./middlewares/notFoundHandler");
8
- const statusCodes_1 = require("./statusCodes");
9
- const PostRoutes = () => [
10
- {
11
- path: '__health',
12
- method: 'get',
13
- controllers: [
14
- (0, controllers_1.makeController)(async () => {
15
- return {
16
- status: statusCodes_1.StatusCodes.Ok,
17
- result: `${instance_1.Instance.get().settings.appId} service running`
18
- };
19
- })
20
- ]
21
- },
22
- {
23
- path: '',
24
- method: 'all',
25
- controllers: [notFoundHandler_1.notFoundHandler]
26
- },
27
- {
28
- path: '',
29
- method: 'all',
30
- controllers: [errorHandler_1.errorHandler]
31
- }
32
- ];
33
- exports.PostRoutes = PostRoutes;
17
+ const formatPath = (path) => `/${path}`
18
+ .replaceAll('///', '/')
19
+ .replaceAll('//', '/');
20
+ exports.formatPath = formatPath;
34
21
  const groupRoutes = (parent, routes) => routes
35
- .map((route) => ({ ...route, path: `${parent}/${route.path}` }));
22
+ .map((route) => ({ ...route, path: (0, exports.formatPath)(`${parent}/${route.path}`) }));
36
23
  exports.groupRoutes = groupRoutes;
24
+ class Router {
25
+ constructor(config) {
26
+ _Router_instances.add(this);
27
+ _Router_config.set(this, void 0);
28
+ this.routes = [];
29
+ __classPrivateFieldSet(this, _Router_config, config, "f");
30
+ }
31
+ get(route) {
32
+ return __classPrivateFieldGet(this, _Router_instances, "m", _Router_addRoute).call(this, 'get', route);
33
+ }
34
+ post(route) {
35
+ return __classPrivateFieldGet(this, _Router_instances, "m", _Router_addRoute).call(this, 'post', route);
36
+ }
37
+ put(route) {
38
+ return __classPrivateFieldGet(this, _Router_instances, "m", _Router_addRoute).call(this, 'put', route);
39
+ }
40
+ patch(route) {
41
+ return __classPrivateFieldGet(this, _Router_instances, "m", _Router_addRoute).call(this, 'patch', route);
42
+ }
43
+ delete(route) {
44
+ return __classPrivateFieldGet(this, _Router_instances, "m", _Router_addRoute).call(this, 'delete', route);
45
+ }
46
+ all(route) {
47
+ return __classPrivateFieldGet(this, _Router_instances, "m", _Router_addRoute).call(this, 'all', route);
48
+ }
49
+ include(router) {
50
+ router.routes.forEach((route) => {
51
+ __classPrivateFieldGet(this, _Router_instances, "m", _Router_addRoute).call(this, route.method, route)();
52
+ });
53
+ }
54
+ }
55
+ exports.Router = Router;
56
+ _Router_config = new WeakMap(), _Router_instances = new WeakSet(), _Router_addRoute = function _Router_addRoute(method, route) {
57
+ return (handler) => {
58
+ const controllers = [...(__classPrivateFieldGet(this, _Router_config, "f")?.middlewares ?? []), ...(route.middlewares ?? [])];
59
+ if (handler)
60
+ controllers.push((0, controllers_1.makeController)(handler));
61
+ this.routes.push({
62
+ method,
63
+ controllers,
64
+ path: (0, exports.formatPath)(`${__classPrivateFieldGet(this, _Router_config, "f")?.path ?? ''}/${route.path ?? ''}`),
65
+ });
66
+ };
67
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "equipped",
3
- "version": "4.3.2",
3
+ "version": "4.4.0",
4
4
  "private": false,
5
5
  "description": "",
6
6
  "main": "lib/index.js",