equipped 4.4.6 → 5.0.0-beta-2

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.
Files changed (72) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/lib/db/_instance.d.ts +3 -6
  3. package/lib/db/mongoose/changes.d.ts +2 -1
  4. package/lib/db/mongoose/index.d.ts +2 -1
  5. package/lib/db/mongoose/index.js +3 -1
  6. package/lib/db/mongoose/query.d.ts +1 -0
  7. package/lib/db/query.d.ts +12 -11
  8. package/lib/errors/customError.d.ts +0 -1
  9. package/lib/errors/customError.js +0 -1
  10. package/lib/errors/index.d.ts +0 -2
  11. package/lib/errors/index.js +0 -2
  12. package/lib/errors/types/refreshTokenMisusedError.d.ts +1 -1
  13. package/lib/errors/types/refreshTokenMisusedError.js +1 -1
  14. package/lib/index.d.ts +2 -0
  15. package/lib/index.js +2 -0
  16. package/lib/instance/index.d.ts +5 -4
  17. package/lib/instance/index.js +17 -4
  18. package/lib/instance/settings.d.ts +8 -0
  19. package/lib/instance/settings.js +7 -1
  20. package/lib/listeners/emitter.d.ts +3 -3
  21. package/lib/scripts/index.d.ts +1 -0
  22. package/lib/scripts/index.js +17 -0
  23. package/lib/scripts/json-schema.d.ts +2 -0
  24. package/lib/scripts/json-schema.js +75 -0
  25. package/lib/server/impls/base.d.ts +37 -0
  26. package/lib/server/impls/base.js +120 -0
  27. package/lib/server/impls/express.d.ts +16 -0
  28. package/lib/server/impls/express.js +183 -0
  29. package/lib/server/impls/fastify.d.ts +23 -0
  30. package/lib/server/impls/fastify.js +182 -0
  31. package/lib/server/index.d.ts +7 -6
  32. package/lib/server/index.js +10 -8
  33. package/lib/server/middlewares/errorHandler.d.ts +4 -1
  34. package/lib/server/middlewares/errorHandler.js +10 -11
  35. package/lib/server/middlewares/index.d.ts +1 -0
  36. package/lib/server/middlewares/index.js +1 -0
  37. package/lib/server/middlewares/notFoundHandler.d.ts +4 -1
  38. package/lib/server/middlewares/notFoundHandler.js +3 -3
  39. package/lib/server/middlewares/parseAuthUser.d.ts +4 -1
  40. package/lib/server/middlewares/parseAuthUser.js +2 -2
  41. package/lib/server/middlewares/requireAuthUser.d.ts +4 -2
  42. package/lib/server/middlewares/requireAuthUser.js +8 -3
  43. package/lib/server/middlewares/requireRefreshUser.d.ts +4 -2
  44. package/lib/server/middlewares/requireRefreshUser.js +7 -4
  45. package/lib/server/requests.d.ts +50 -0
  46. package/lib/server/requests.js +60 -0
  47. package/lib/server/routes.d.ts +6 -23
  48. package/lib/server/routes.js +39 -49
  49. package/lib/server/types.d.ts +85 -0
  50. package/lib/server/types.js +33 -0
  51. package/lib/structure/baseEntity.d.ts +4 -5
  52. package/lib/structure/baseEntity.js +20 -12
  53. package/lib/types/index.d.ts +20 -0
  54. package/lib/types/index.js +2 -0
  55. package/lib/validations/index.d.ts +1 -1
  56. package/package.json +36 -22
  57. package/lib/errors/types/accountNotVerifiedError.d.ts +0 -5
  58. package/lib/errors/types/accountNotVerifiedError.js +0 -12
  59. package/lib/errors/types/invalidToken.d.ts +0 -5
  60. package/lib/errors/types/invalidToken.js +0 -12
  61. package/lib/logger/index.d.ts +0 -13
  62. package/lib/logger/index.js +0 -41
  63. package/lib/server/app.d.ts +0 -12
  64. package/lib/server/app.js +0 -121
  65. package/lib/server/controllers/index.d.ts +0 -10
  66. package/lib/server/controllers/index.js +0 -46
  67. package/lib/server/controllers/request.d.ts +0 -40
  68. package/lib/server/controllers/request.js +0 -85
  69. package/lib/server/controllers/response.d.ts +0 -14
  70. package/lib/server/controllers/response.js +0 -16
  71. package/lib/server/statusCodes.d.ts +0 -16
  72. package/lib/server/statusCodes.js +0 -17
package/CHANGELOG.md CHANGED
@@ -2,6 +2,38 @@
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
+ ## [5.0.0-beta-2](https://github.com/kevinand11/equipped/compare/v5.0.0-beta-1...v5.0.0-beta-2) (2024-05-30)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * validate expects value of unknown not Record ([f3773f9](https://github.com/kevinand11/equipped/commit/f3773f905f6ccb5713fd30a0870d34fbd40c36fc))
11
+
12
+ ## [5.0.0-beta-1](https://github.com/kevinand11/equipped/compare/v4.4.6...v5.0.0-beta-1) (2024-05-29)
13
+
14
+
15
+ ### Features
16
+
17
+ * add request type details on Request class ([d6c3752](https://github.com/kevinand11/equipped/commit/d6c37529e7eeac5a3c2ac20e0a205de49cb0465e))
18
+ * error handler per route ([0eccc21](https://github.com/kevinand11/equipped/commit/0eccc2129c559353efc65ae7ddf6bd0368e4031e))
19
+ * express server swagger ([95c811b](https://github.com/kevinand11/equipped/commit/95c811ba7a1086116c4327c37e1723b08b85059d))
20
+ * fastify swagger and custom schema validation error ([17b8710](https://github.com/kevinand11/equipped/commit/17b8710324c5c515daa8928d7028ef0150a6c30d))
21
+ * hide routes from schema ([304df23](https://github.com/kevinand11/equipped/commit/304df23a413f13cbd77f2eeeae00032d57dcea2c))
22
+ * new JsonValue and Ignored types ([ba73af4](https://github.com/kevinand11/equipped/commit/ba73af440f54549d10a974fd530c35ac912ec4dd))
23
+ * regustere schemas in server and reference by key ([7298bb0](https://github.com/kevinand11/equipped/commit/7298bb0ae6a908325bbef3cd308e2a7787147387))
24
+ * route securities ([a7b91a1](https://github.com/kevinand11/equipped/commit/a7b91a17acf15cc9013fe971b0adf2b96cd129da))
25
+ * schema for fastify ([990529c](https://github.com/kevinand11/equipped/commit/990529ce777d5fcfb6f4c11d634ecdc31aa2ea81))
26
+ * script to generate schemas ([2736ffa](https://github.com/kevinand11/equipped/commit/2736ffa68da13fb0b3ef96809a06be74754257ba))
27
+ * settings to toggle whether to schema validate ([6f64313](https://github.com/kevinand11/equipped/commit/6f643133632963cc5418259d3f97a9cf172bcdaf))
28
+ * throw ValidationError for failed schema validation in express app ([be30a5e](https://github.com/kevinand11/equipped/commit/be30a5e1ff7fe7016bf6effa9566a3a48acafd0e))
29
+
30
+
31
+ ### Bug Fixes
32
+
33
+ * catch errors in json schema ([02f4b0b](https://github.com/kevinand11/equipped/commit/02f4b0bb4c8eaa3fc0e1a25b14e2f531101d3d08))
34
+ * fix mongo createCollection command ([f0bfbfa](https://github.com/kevinand11/equipped/commit/f0bfbfa945d48741fbc56b6766483f12b35e0f7c))
35
+ * remove recursive type for QueryWhereBlock to prevent recursive errors in schema gen ([31e3af6](https://github.com/kevinand11/equipped/commit/31e3af64e6ead4b67e5a787df3c0b39671f8e39b))
36
+
5
37
  ### [4.4.6](https://github.com/kevinand11/equipped/compare/v4.4.5...v4.4.6) (2024-04-07)
6
38
 
7
39
  ### [4.4.5](https://github.com/kevinand11/equipped/compare/v4.4.4...v4.4.5) (2024-04-06)
@@ -1,16 +1,17 @@
1
1
  import { BaseEntity } from '../structure';
2
+ import { DeepPartial } from '../types';
2
3
  import { DebeziumSetup } from './debezium';
3
4
  import { QueryParams, QueryResults } from './query';
4
5
  export declare abstract class Db {
5
6
  #private;
6
- abstract change<Model, Entity extends BaseEntity<any>>(collection: any, callbacks: DbChangeCallbacks<Model, Entity>, mapper: (model: Model | null) => Entity | null): DbChange<Model, Entity>;
7
+ abstract change<Model, Entity extends BaseEntity>(collection: any, callbacks: DbChangeCallbacks<Model, Entity>, mapper: (model: Model | null) => Entity | null): DbChange<Model, Entity>;
7
8
  abstract query<Model>(collection: any, params: QueryParams): Promise<QueryResults<Model>>;
8
9
  protected _addToDbChanges(dbChange: DbChange<any, any>): this;
9
10
  startAllDbChanges(): Promise<void>;
10
11
  abstract start(): Promise<void>;
11
12
  abstract close(): Promise<void>;
12
13
  }
13
- export declare abstract class DbChange<Model, Entity extends BaseEntity<any>> {
14
+ export declare abstract class DbChange<Model, Entity extends BaseEntity> {
14
15
  #private;
15
16
  constructor(callbacks: DbChangeCallbacks<Model, Entity>, mapper: (model: Model | null) => Entity | null);
16
17
  abstract start(): Promise<void>;
@@ -18,9 +19,6 @@ export declare abstract class DbChange<Model, Entity extends BaseEntity<any>> {
18
19
  get mapper(): (model: Model | null) => Entity | null;
19
20
  protected _setup(key: string, data: DebeziumSetup): Promise<boolean>;
20
21
  }
21
- type DeepPartial<T> = {
22
- [P in keyof T]?: DeepPartial<T[P]>;
23
- };
24
22
  export type DbChangeCallbacks<Model, Entity> = {
25
23
  created?: (data: {
26
24
  before: null;
@@ -36,4 +34,3 @@ export type DbChangeCallbacks<Model, Entity> = {
36
34
  after: null;
37
35
  }) => Promise<void>;
38
36
  };
39
- export {};
@@ -22,10 +22,11 @@
22
22
  /// <reference types="mongoose/types/validation" />
23
23
  /// <reference types="mongoose/types/virtuals" />
24
24
  /// <reference types="mongoose/types/inferschematype" />
25
+ /// <reference types="mongoose/types/inferrawdoctype" />
25
26
  import mongoose from 'mongoose';
26
27
  import { BaseEntity } from '../../structure';
27
28
  import { DbChange, DbChangeCallbacks } from '../_instance';
28
- export declare class MongoDbChange<Model, Entity extends BaseEntity<any>> extends DbChange<Model, Entity> {
29
+ export declare class MongoDbChange<Model, Entity extends BaseEntity> extends DbChange<Model, Entity> {
29
30
  #private;
30
31
  constructor(model: mongoose.Model<Model>, callbacks: DbChangeCallbacks<Model, Entity>, mapper: (model: Model | null) => Entity | null);
31
32
  start(): Promise<void>;
@@ -22,6 +22,7 @@
22
22
  /// <reference types="mongoose/types/validation" />
23
23
  /// <reference types="mongoose/types/virtuals" />
24
24
  /// <reference types="mongoose/types/inferschematype" />
25
+ /// <reference types="mongoose/types/inferrawdoctype" />
25
26
  import mongoose from 'mongoose';
26
27
  import { BaseEntity } from '../../structure';
27
28
  import { QueryParams, QueryResults } from '../query';
@@ -32,7 +33,7 @@ export declare class MongoDb extends Db {
32
33
  get Schema(): typeof mongoose.Schema;
33
34
  get Id(): mongoose.Types.ObjectId;
34
35
  use(dbName?: string): mongoose.Connection;
35
- change<Model, Entity extends BaseEntity<any>>(model: mongoose.Model<Model>, callbacks: DbChangeCallbacks<Model, Entity>, mapper: (model: Model | null) => Entity | null): MongoDbChange<Model, Entity>;
36
+ change<Model, Entity extends BaseEntity>(model: mongoose.Model<Model>, callbacks: DbChangeCallbacks<Model, Entity>, mapper: (model: Model | null) => Entity | null): MongoDbChange<Model, Entity>;
36
37
  query<Model>(model: mongoose.Model<Model>, params: QueryParams): Promise<QueryResults<Model>>;
37
38
  start(): Promise<void>;
38
39
  close(): Promise<void>;
@@ -58,7 +58,9 @@ class MongoDb extends _instance_1.Db {
58
58
  await Promise.all([mongoose_1.default.connection, ...__classPrivateFieldGet(this, _MongoDb_instances, "a", _MongoDb_connections_get)].map((conn) => {
59
59
  return Object.values(conn.models)
60
60
  .map(async (model) => {
61
- await conn.db.command({ collMod: model.collection.name, changeStreamPreAndPostImages: { enabled: true } });
61
+ await conn.db.createCollection(model.collection.name, {
62
+ changeStreamPreAndPostImages: { enabled: true }
63
+ });
62
64
  });
63
65
  }).flat());
64
66
  }
@@ -22,6 +22,7 @@
22
22
  /// <reference types="mongoose/types/validation" />
23
23
  /// <reference types="mongoose/types/virtuals" />
24
24
  /// <reference types="mongoose/types/inferschematype" />
25
+ /// <reference types="mongoose/types/inferrawdoctype" />
25
26
  import mongoose from 'mongoose';
26
27
  import { QueryParams, QueryResults } from '../query';
27
28
  export declare const parseMongodbQueryParams: <Model>(model: mongoose.Model<Model>, params: QueryParams) => Promise<QueryResults<Model>>;
package/lib/db/query.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { Paths } from '../types';
1
2
  export type QueryResults<Model> = {
2
3
  pages: {
3
4
  start: number;
@@ -28,23 +29,23 @@ export declare enum Conditions {
28
29
  nin = "nin",
29
30
  exists = "exists"
30
31
  }
31
- export type QueryWhere = {
32
- field: string;
33
- value: any;
32
+ export type QueryWhere<T> = {
33
+ field: Paths<T, string>;
34
+ value: unknown;
34
35
  condition?: Conditions;
35
36
  };
36
- export type QueryWhereBlock = {
37
+ export type QueryWhereBlock<T> = {
37
38
  condition: QueryKeys;
38
- value: (QueryWhere | QueryWhereBlock)[];
39
+ value: QueryWhere<T>[];
39
40
  };
40
- export type QueryWhereClause = QueryWhere | QueryWhereBlock;
41
- export type QueryParams = {
42
- where?: QueryWhereClause[];
43
- auth?: QueryWhereClause[];
41
+ export type QueryWhereClause<T> = QueryWhere<T> | QueryWhereBlock<T>;
42
+ export type QueryParams<T = unknown> = {
43
+ where?: QueryWhereClause<T>[];
44
+ auth?: QueryWhereClause<T>[];
44
45
  whereType?: QueryKeys;
45
46
  authType?: QueryKeys;
46
47
  sort?: {
47
- field: string;
48
+ field: Paths<T, string>;
48
49
  desc?: boolean;
49
50
  }[];
50
51
  limit?: number;
@@ -52,6 +53,6 @@ export type QueryParams = {
52
53
  page?: number;
53
54
  search?: {
54
55
  value: string;
55
- fields: string[];
56
+ fields: Paths<T, string>[];
56
57
  };
57
58
  };
@@ -6,7 +6,6 @@ export declare abstract class CustomError extends Error {
6
6
  message: string;
7
7
  field?: string;
8
8
  }[];
9
- isCustomError: boolean;
10
9
  protected constructor(message: string, serializedErrors: {
11
10
  message: string;
12
11
  field?: string;
@@ -4,7 +4,6 @@ exports.CustomError = void 0;
4
4
  class CustomError extends Error {
5
5
  constructor(message, serializedErrors) {
6
6
  super(message);
7
- this.isCustomError = true;
8
7
  this.message = message;
9
8
  this.serializedErrors = serializedErrors;
10
9
  }
@@ -1,8 +1,6 @@
1
1
  export * from './customError';
2
2
  export * from './types/accessTokenExpired';
3
- export * from './types/accountNotVerifiedError';
4
3
  export * from './types/badRequestError';
5
- export * from './types/invalidToken';
6
4
  export * from './types/notAuthenticatedError';
7
5
  export * from './types/notAuthorizedError';
8
6
  export * from './types/notFoundError';
@@ -16,9 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./customError"), exports);
18
18
  __exportStar(require("./types/accessTokenExpired"), exports);
19
- __exportStar(require("./types/accountNotVerifiedError"), exports);
20
19
  __exportStar(require("./types/badRequestError"), exports);
21
- __exportStar(require("./types/invalidToken"), exports);
22
20
  __exportStar(require("./types/notAuthenticatedError"), exports);
23
21
  __exportStar(require("./types/notAuthorizedError"), exports);
24
22
  __exportStar(require("./types/notFoundError"), exports);
@@ -1,5 +1,5 @@
1
1
  import { CustomError } from '../customError';
2
2
  export declare class RefreshTokenMisusedError extends CustomError {
3
- statusCode: 462;
3
+ statusCode: 401;
4
4
  constructor(message?: string);
5
5
  }
@@ -6,7 +6,7 @@ const customError_1 = require("../customError");
6
6
  class RefreshTokenMisusedError extends customError_1.CustomError {
7
7
  constructor(message = 'Refresh token misused') {
8
8
  super(message, [{ message }]);
9
- this.statusCode = server_1.StatusCodes.RefreshTokenMisused;
9
+ this.statusCode = server_1.StatusCodes.NotAuthenticated;
10
10
  }
11
11
  }
12
12
  exports.RefreshTokenMisusedError = RefreshTokenMisusedError;
package/lib/index.d.ts CHANGED
@@ -7,9 +7,11 @@ export { Events } from './events/';
7
7
  export * from './exit';
8
8
  export * from './instance';
9
9
  export * from './listeners';
10
+ export * from './scripts';
10
11
  export * from './server';
11
12
  export * from './storage';
12
13
  export * from './structure';
14
+ export * from './types';
13
15
  export * from './utils/auth';
14
16
  export * from './utils/authUser';
15
17
  export * from './utils/retry';
package/lib/index.js CHANGED
@@ -28,9 +28,11 @@ __exportStar(require("./errors"), exports);
28
28
  __exportStar(require("./exit"), exports);
29
29
  __exportStar(require("./instance"), exports);
30
30
  __exportStar(require("./listeners"), exports);
31
+ __exportStar(require("./scripts"), exports);
31
32
  __exportStar(require("./server"), exports);
32
33
  __exportStar(require("./storage"), exports);
33
34
  __exportStar(require("./structure"), exports);
35
+ __exportStar(require("./types"), exports);
34
36
  __exportStar(require("./utils/auth"), exports);
35
37
  __exportStar(require("./utils/authUser"), exports);
36
38
  __exportStar(require("./utils/retry"), exports);
@@ -1,23 +1,24 @@
1
+ import pino from 'pino';
1
2
  import { BullJob } from '../bull';
2
3
  import { Cache } from '../cache/cache';
3
4
  import { MongoDb } from '../db/mongoose';
4
5
  import { EventBus } from '../events/';
5
- import { Logger } from '../logger';
6
- import { Server } from '../server/app';
6
+ import { Server } from '../server';
7
7
  import { Settings } from './settings';
8
8
  export declare class Instance {
9
9
  #private;
10
10
  private constructor();
11
- get logger(): Logger;
11
+ get logger(): pino.Logger<any>;
12
12
  get job(): BullJob;
13
13
  get cache(): Cache;
14
14
  get eventBus(): EventBus;
15
- get server(): Server;
15
+ get server(): Server<any, any>;
16
16
  get dbs(): {
17
17
  mongo: MongoDb;
18
18
  };
19
19
  get listener(): import("..").Listener;
20
20
  get settings(): Settings;
21
+ static createLogger(): import("pino").Logger<any>;
21
22
  static initialize(settings: Partial<Settings>): void;
22
23
  static get(): Instance;
23
24
  startConnections(): Promise<void>;
@@ -10,16 +10,19 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
10
10
  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");
11
11
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
12
12
  };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
13
16
  var _a, _Instance_initialized, _Instance_instance, _Instance_settings, _Instance_logger, _Instance_job, _Instance_cache, _Instance_eventBus, _Instance_server, _Instance_dbs;
14
17
  Object.defineProperty(exports, "__esModule", { value: true });
15
18
  exports.Instance = void 0;
19
+ const pino_1 = __importDefault(require("pino"));
16
20
  const bull_1 = require("../bull");
17
21
  const redis_cache_1 = require("../cache/types/redis-cache");
18
22
  const mongoose_1 = require("../db/mongoose");
19
23
  const kafka_1 = require("../events/kafka");
20
24
  const exit_1 = require("../exit");
21
- const logger_1 = require("../logger");
22
- const app_1 = require("../server/app");
25
+ const server_1 = require("../server");
23
26
  const settings_1 = require("./settings");
24
27
  class Instance {
25
28
  constructor() {
@@ -32,7 +35,7 @@ class Instance {
32
35
  _Instance_dbs.set(this, null);
33
36
  }
34
37
  get logger() {
35
- return __classPrivateFieldSet(this, _Instance_logger, __classPrivateFieldGet(this, _Instance_logger, "f") || new logger_1.ConsoleLogger(), "f");
38
+ return __classPrivateFieldSet(this, _Instance_logger, __classPrivateFieldGet(this, _Instance_logger, "f") || _a.createLogger(), "f");
36
39
  }
37
40
  get job() {
38
41
  return __classPrivateFieldSet(this, _Instance_job, __classPrivateFieldGet(this, _Instance_job, "f") || new bull_1.BullJob(), "f");
@@ -44,7 +47,7 @@ class Instance {
44
47
  return __classPrivateFieldSet(this, _Instance_eventBus, __classPrivateFieldGet(this, _Instance_eventBus, "f") || new kafka_1.KafkaEventBus(), "f");
45
48
  }
46
49
  get server() {
47
- return __classPrivateFieldSet(this, _Instance_server, __classPrivateFieldGet(this, _Instance_server, "f") || new app_1.Server(), "f");
50
+ return __classPrivateFieldSet(this, _Instance_server, __classPrivateFieldGet(this, _Instance_server, "f") || server_1.serverTypes[this.settings.server](), "f");
48
51
  }
49
52
  get dbs() {
50
53
  return __classPrivateFieldSet(this, _Instance_dbs, __classPrivateFieldGet(this, _Instance_dbs, "f") || { mongo: new mongoose_1.MongoDb() }, "f");
@@ -55,6 +58,16 @@ class Instance {
55
58
  get settings() {
56
59
  return __classPrivateFieldGet(this, _Instance_settings, "f");
57
60
  }
61
+ static createLogger() {
62
+ return (0, pino_1.default)({
63
+ level: _a.get()?.settings?.logLevel ?? 'info',
64
+ serializers: {
65
+ err: pino_1.default.stdSerializers.err,
66
+ req: pino_1.default.stdSerializers.req,
67
+ res: pino_1.default.stdSerializers.res,
68
+ },
69
+ });
70
+ }
58
71
  static initialize(settings) {
59
72
  __classPrivateFieldSet(_a, _a, true, "f", _Instance_initialized);
60
73
  const instanceSettings = _a.get().settings;
@@ -1,3 +1,5 @@
1
+ import { Level } from 'pino';
2
+ import type { ServerTypes } from '../server';
1
3
  export type Settings = {
2
4
  isDev: boolean;
3
5
  accessTokenKey: string;
@@ -22,5 +24,11 @@ export type Settings = {
22
24
  slowDownDelayInMs: number;
23
25
  hashSaltRounds: number;
24
26
  paginationDefaultLimit: number;
27
+ server: ServerTypes;
28
+ openapiDocsVersion: string;
29
+ openapiDocsUrl: string;
30
+ logLevel: Level;
31
+ logRequests: boolean;
32
+ requestSchemaValidation: boolean;
25
33
  };
26
34
  export declare const defaulInstanceSetting: Settings;
@@ -24,5 +24,11 @@ exports.defaulInstanceSetting = {
24
24
  slowDownAfter: 1000,
25
25
  slowDownDelayInMs: 500,
26
26
  hashSaltRounds: 10,
27
- paginationDefaultLimit: 100
27
+ paginationDefaultLimit: 100,
28
+ server: 'express',
29
+ openapiDocsVersion: '1.0.0',
30
+ openapiDocsUrl: '/__docs',
31
+ logLevel: 'info',
32
+ logRequests: true,
33
+ requestSchemaValidation: false,
28
34
  };
@@ -13,9 +13,9 @@ export declare class Listener {
13
13
  #private;
14
14
  constructor(socket: io.Server, callers: SocketCallers);
15
15
  start(): Promise<void>;
16
- created(channels: string[], data: BaseEntity<any>): Promise<void>;
17
- updated(channels: string[], data: BaseEntity<any>): Promise<void>;
18
- deleted(channels: string[], data: BaseEntity<any>): Promise<void>;
16
+ created(channels: string[], data: BaseEntity): Promise<void>;
17
+ updated(channels: string[], data: BaseEntity): Promise<void>;
18
+ deleted(channels: string[], data: BaseEntity): Promise<void>;
19
19
  set callers(callers: SocketCallers);
20
20
  register(channel: string, onJoin?: OnJoinFn): this;
21
21
  }
@@ -0,0 +1 @@
1
+ export * from './json-schema';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./json-schema"), exports);
@@ -0,0 +1,2 @@
1
+ import { RouteSchema } from '../server';
2
+ export declare function generateJSONSchema(patterns: (string | RegExp)[], paths: string[]): Record<string, RouteSchema>;
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.generateJSONSchema = void 0;
27
+ const ts_oas_1 = __importStar(require("ts-oas"));
28
+ const instance_1 = require("../instance");
29
+ function generateJSONSchema(patterns, paths) {
30
+ const tsProgram = (0, ts_oas_1.createProgram)(paths, { strictNullChecks: true });
31
+ const tsoas = new ts_oas_1.default(tsProgram, { ref: false, ignoreErrors: true });
32
+ const jsonSchema = tsoas.getSchemas(patterns);
33
+ return Object.entries(jsonSchema)
34
+ .map(([name, { properties: def }]) => {
35
+ try {
36
+ const key = def?.key?.enum?.at(0) ?? name;
37
+ if (!def || !key || !def.method)
38
+ throw new Error();
39
+ const response = def.responses.properties ?? def.responses.anyOf?.reduce((acc, cur) => {
40
+ if (cur.properties)
41
+ return { ...acc, ...cur.properties };
42
+ return acc;
43
+ }, {}) ?? undefined;
44
+ const schema = def
45
+ ? {
46
+ body: def.body,
47
+ params: def.params,
48
+ querystring: def.query,
49
+ headers: def.headers,
50
+ response,
51
+ operationId: key,
52
+ summary: name,
53
+ }
54
+ : undefined;
55
+ return [key, schema];
56
+ }
57
+ catch (err) {
58
+ instance_1.Instance.createLogger().warn(`Error parsing ${name}: ${err.message}. Skipping route`);
59
+ return [undefined, undefined];
60
+ }
61
+ })
62
+ .reduce((acc, [path, schema]) => {
63
+ if (path && schema)
64
+ acc[path] = stripEmptyObjects(schema);
65
+ return acc;
66
+ }, {});
67
+ }
68
+ exports.generateJSONSchema = generateJSONSchema;
69
+ function stripEmptyObjects(obj) {
70
+ return Object.entries(obj).reduce((acc, [key, value]) => {
71
+ if (!value || typeof value === 'object' && Object.keys(value).length === 0)
72
+ return acc;
73
+ return { ...acc, [key]: value };
74
+ }, {});
75
+ }
@@ -0,0 +1,37 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node/http" />
3
+ /// <reference types="pino-http" />
4
+ import http from 'http';
5
+ import { OpenAPIV3_1 } from 'openapi-types';
6
+ import supertest from 'supertest';
7
+ import { FastifySchema } from 'fastify';
8
+ import { Listener } from '../../listeners';
9
+ import { Defined } from '../../types';
10
+ import { Request } from '../requests';
11
+ import { Router } from '../routes';
12
+ import { Route } from '../types';
13
+ export type FullRoute = Required<Omit<Route, 'schema' | 'tags' | 'security' | 'hideSchema' | 'onError' | 'onSetupHandler' | '__def'>> & {
14
+ schema: FastifySchema;
15
+ onError?: Route['onError'];
16
+ };
17
+ type Schemas = Record<string, Defined<Route['schema']>>;
18
+ export declare abstract class Server<Req = any, Res = any> {
19
+ #private;
20
+ protected server: http.Server;
21
+ protected staticPath: string;
22
+ protected settings: import("../../instance/settings").Settings;
23
+ protected baseOpenapiDoc: OpenAPIV3_1.Document;
24
+ protected abstract onLoad(): Promise<void>;
25
+ protected abstract startServer(port: number): Promise<boolean>;
26
+ protected abstract parse(req: Req, res: Res): Promise<Request>;
27
+ protected abstract registerRoute(route: FullRoute): void;
28
+ constructor(server: http.Server);
29
+ get listener(): Listener;
30
+ addRoutes(routes: Route[]): void;
31
+ addSchema(schemas: Schemas): void;
32
+ load(): Promise<void>;
33
+ register(router: Router | Router[]): void;
34
+ test(): import("supertest/lib/agent")<supertest.SuperTestStatic.Test>;
35
+ start(port: number): Promise<boolean>;
36
+ }
37
+ export {};