axe-api 1.0.0-rc2 → 1.0.0-rc20

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 (123) hide show
  1. package/build/index.d.ts +3 -1
  2. package/build/index.js +4 -1
  3. package/build/src/Builders/ModelTreeBuilder.js +1 -2
  4. package/build/src/Builders/RouterBuilder.d.ts +1 -1
  5. package/build/src/Builders/RouterBuilder.js +10 -9
  6. package/build/src/Builders/SwaggerBuilder.d.ts +2 -0
  7. package/build/src/Builders/SwaggerBuilder.js +558 -0
  8. package/build/src/Enums.d.ts +0 -7
  9. package/build/src/Enums.js +14 -22
  10. package/build/src/Handlers/{MetadataHandler.js → DocsHandler.js} +28 -7
  11. package/build/src/Handlers/ErrorHandler.d.ts +4 -0
  12. package/build/src/Handlers/ErrorHandler.js +12 -0
  13. package/build/src/Handlers/Helpers.d.ts +3 -3
  14. package/build/src/Handlers/Helpers.js +4 -4
  15. package/build/src/Handlers/RequestHandler.d.ts +2 -1
  16. package/build/src/Handlers/RequestHandler.js +23 -22
  17. package/build/src/Handlers/{DocsHTMLHandler.js → SwaggerHandler.js} +8 -7
  18. package/build/src/Helpers.d.ts +0 -1
  19. package/build/src/Helpers.js +1 -53
  20. package/build/src/Interfaces.d.ts +89 -22
  21. package/build/src/Middlewares/RateLimit/AdaptorFactory.d.ts +6 -0
  22. package/build/src/Middlewares/RateLimit/AdaptorFactory.js +17 -0
  23. package/build/src/Middlewares/RateLimit/MemoryAdaptor.d.ts +10 -0
  24. package/build/src/Middlewares/RateLimit/MemoryAdaptor.js +41 -0
  25. package/build/src/Middlewares/RateLimit/RedisAdaptor.d.ts +10 -0
  26. package/build/src/Middlewares/RateLimit/RedisAdaptor.js +35 -0
  27. package/build/src/Middlewares/RateLimit/index.d.ts +23 -0
  28. package/build/src/Middlewares/RateLimit/index.js +138 -0
  29. package/build/src/Model.d.ts +212 -10
  30. package/build/src/Model.js +237 -35
  31. package/build/src/Phases/All/FetchPhase.d.ts +2 -2
  32. package/build/src/Phases/All/PreparePhase.d.ts +2 -2
  33. package/build/src/Phases/All/index.d.ts +1 -1
  34. package/build/src/Phases/Delete/ActionPhase.d.ts +2 -2
  35. package/build/src/Phases/Delete/PreparePhase.d.ts +2 -2
  36. package/build/src/Phases/Delete/QueryPhase.d.ts +2 -2
  37. package/build/src/Phases/Delete/QueryPhase.js +3 -1
  38. package/build/src/Phases/Delete/ResponsePhase.d.ts +2 -2
  39. package/build/src/Phases/Delete/ResponsePhase.js +8 -1
  40. package/build/src/Phases/Delete/index.d.ts +4 -4
  41. package/build/src/Phases/ForceDelete/ActionPhase.d.ts +2 -2
  42. package/build/src/Phases/ForceDelete/PreparePhase.d.ts +2 -2
  43. package/build/src/Phases/ForceDelete/PreparePhase.js +3 -1
  44. package/build/src/Phases/ForceDelete/QueryPhase.d.ts +2 -2
  45. package/build/src/Phases/ForceDelete/QueryPhase.js +3 -1
  46. package/build/src/Phases/ForceDelete/index.d.ts +3 -3
  47. package/build/src/Phases/List/RelationalPhase.d.ts +2 -2
  48. package/build/src/Phases/List/ResultPhase.d.ts +2 -2
  49. package/build/src/Phases/List/ResultPhase.js +8 -1
  50. package/build/src/Phases/List/SerializePhase.d.ts +2 -2
  51. package/build/src/Phases/List/index.d.ts +3 -3
  52. package/build/src/Phases/Paginate/FetchPhase.d.ts +2 -2
  53. package/build/src/Phases/Paginate/FetchPhase.js +11 -0
  54. package/build/src/Phases/Paginate/PreparePhase.d.ts +2 -2
  55. package/build/src/Phases/Paginate/PreparePhase.js +0 -8
  56. package/build/src/Phases/Paginate/index.d.ts +2 -2
  57. package/build/src/Phases/Patch/PrepareActionPhase.d.ts +2 -2
  58. package/build/src/Phases/Patch/PrepareActionPhase.js +3 -1
  59. package/build/src/Phases/Patch/index.d.ts +1 -1
  60. package/build/src/Phases/Show/FetchPhase.d.ts +2 -2
  61. package/build/src/Phases/Show/FetchPhase.js +14 -2
  62. package/build/src/Phases/Show/PreparePhase.d.ts +2 -2
  63. package/build/src/Phases/Show/PreparePhase.js +0 -9
  64. package/build/src/Phases/Show/index.d.ts +2 -2
  65. package/build/src/Phases/Single/GetPhase.d.ts +2 -2
  66. package/build/src/Phases/Single/GetPhase.js +3 -1
  67. package/build/src/Phases/Single/PrepareGetPhase.d.ts +2 -2
  68. package/build/src/Phases/Single/RelationalPhase.d.ts +2 -2
  69. package/build/src/Phases/Single/ResultPhase.d.ts +2 -2
  70. package/build/src/Phases/Single/ResultPhase.js +8 -1
  71. package/build/src/Phases/Single/SerializePhase.d.ts +2 -2
  72. package/build/src/Phases/Single/index.d.ts +5 -5
  73. package/build/src/Phases/Store/ActionPhase.d.ts +2 -2
  74. package/build/src/Phases/Store/ActionPhase.js +3 -0
  75. package/build/src/Phases/Store/PreparePhase.d.ts +2 -2
  76. package/build/src/Phases/Store/PreparePhase.js +2 -2
  77. package/build/src/Phases/Store/index.d.ts +2 -2
  78. package/build/src/Phases/Update/ActionPhase.d.ts +2 -2
  79. package/build/src/Phases/Update/PrepareActionPhase.d.ts +2 -2
  80. package/build/src/Phases/Update/PrepareActionPhase.js +3 -1
  81. package/build/src/Phases/Update/index.d.ts +2 -2
  82. package/build/src/Resolvers/ModelResolver.js +11 -6
  83. package/build/src/Resolvers/TransactionResolver.js +3 -15
  84. package/build/src/Resolvers/VersionConfigResolver.js +6 -1
  85. package/build/src/Resolvers/VersionResolver.js +2 -2
  86. package/build/src/Server.d.ts +5 -0
  87. package/build/src/Server.js +34 -19
  88. package/build/src/Services/APIService.d.ts +6 -3
  89. package/build/src/Services/APIService.js +9 -8
  90. package/build/src/Services/App.d.ts +94 -8
  91. package/build/src/Services/App.js +146 -10
  92. package/build/src/Services/AxeRequest.d.ts +52 -1
  93. package/build/src/Services/AxeRequest.js +76 -4
  94. package/build/src/Services/AxeResponse.d.ts +30 -2
  95. package/build/src/Services/AxeResponse.js +35 -4
  96. package/build/src/Services/ConverterService.d.ts +9 -0
  97. package/build/src/Services/ConverterService.js +49 -0
  98. package/build/src/Services/DocumentationService.d.ts +5 -2
  99. package/build/src/Services/DocumentationService.js +13 -1
  100. package/build/src/Services/IoCService.d.ts +29 -2
  101. package/build/src/Services/IoCService.js +33 -6
  102. package/build/src/Services/LimitService.d.ts +18 -0
  103. package/build/src/Services/LimitService.js +18 -0
  104. package/build/src/Services/LogService.d.ts +8 -12
  105. package/build/src/Services/LogService.js +16 -33
  106. package/build/src/Services/ModelService.d.ts +3 -3
  107. package/build/src/Services/QueryService.d.ts +3 -3
  108. package/build/src/Services/QueryService.js +5 -0
  109. package/build/src/Services/SchemaValidatorService.js +1 -2
  110. package/build/src/Services/URLService.d.ts +5 -14
  111. package/build/src/Services/URLService.js +36 -8
  112. package/build/src/Steps/Event.d.ts +11 -0
  113. package/build/src/Steps/Event.js +17 -0
  114. package/build/src/Steps/Hook.d.ts +11 -0
  115. package/build/src/Steps/Hook.js +17 -0
  116. package/build/src/Steps/Phase.d.ts +11 -0
  117. package/build/src/Steps/Phase.js +18 -0
  118. package/build/src/Types.d.ts +19 -6
  119. package/build/src/constants.d.ts +5 -19
  120. package/build/src/constants.js +152 -152
  121. package/package.json +39 -27
  122. /package/build/src/Handlers/{DocsHTMLHandler.d.ts → DocsHandler.d.ts} +0 -0
  123. /package/build/src/Handlers/{MetadataHandler.d.ts → SwaggerHandler.d.ts} +0 -0
package/build/index.d.ts CHANGED
@@ -3,6 +3,8 @@ import Model from "./src/Model";
3
3
  import ApiError from "./src/Exceptions/ApiError";
4
4
  import { DEFAULT_HANDLERS, DEFAULT_VERSION_CONFIG } from "./src/constants";
5
5
  import { IoCService, allow, deny, App, AxeRequest, AxeResponse } from "./src/Services";
6
+ import { rateLimit } from "./src/Middlewares/RateLimit";
6
7
  export * from "./src/Enums";
7
8
  export * from "./src/Interfaces";
8
- export { App, AxeRequest, AxeResponse, Server, Model, ApiError, DEFAULT_HANDLERS, DEFAULT_VERSION_CONFIG, IoCService, allow, deny, };
9
+ export * from "./src/Types";
10
+ export { App, AxeRequest, AxeResponse, Server, Model, ApiError, DEFAULT_HANDLERS, DEFAULT_VERSION_CONFIG, IoCService, allow, deny, rateLimit, };
package/build/index.js CHANGED
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.deny = exports.allow = exports.IoCService = exports.DEFAULT_VERSION_CONFIG = exports.DEFAULT_HANDLERS = exports.ApiError = exports.Model = exports.Server = exports.AxeResponse = exports.AxeRequest = exports.App = void 0;
20
+ exports.rateLimit = exports.deny = exports.allow = exports.IoCService = exports.DEFAULT_VERSION_CONFIG = exports.DEFAULT_HANDLERS = exports.ApiError = exports.Model = exports.Server = exports.AxeResponse = exports.AxeRequest = exports.App = void 0;
21
21
  const Server_1 = __importDefault(require("./src/Server"));
22
22
  exports.Server = Server_1.default;
23
23
  const Model_1 = __importDefault(require("./src/Model"));
@@ -34,5 +34,8 @@ Object.defineProperty(exports, "deny", { enumerable: true, get: function () { re
34
34
  Object.defineProperty(exports, "App", { enumerable: true, get: function () { return Services_1.App; } });
35
35
  Object.defineProperty(exports, "AxeRequest", { enumerable: true, get: function () { return Services_1.AxeRequest; } });
36
36
  Object.defineProperty(exports, "AxeResponse", { enumerable: true, get: function () { return Services_1.AxeResponse; } });
37
+ const RateLimit_1 = require("./src/Middlewares/RateLimit");
38
+ Object.defineProperty(exports, "rateLimit", { enumerable: true, get: function () { return RateLimit_1.rateLimit; } });
37
39
  __exportStar(require("./src/Enums"), exports);
38
40
  __exportStar(require("./src/Interfaces"), exports);
41
+ __exportStar(require("./src/Types"), exports);
@@ -17,12 +17,11 @@ class ModelTreeBuilder {
17
17
  }
18
18
  build() {
19
19
  return __awaiter(this, void 0, void 0, function* () {
20
- const logger = Services_1.LogService.getInstance();
21
20
  const tree = this.getRootLevelOfTree();
22
21
  this.createRecursiveTree(tree);
23
22
  this.addNestedRoutes(tree);
24
23
  this.version.modelTree = tree;
25
- logger.info(`[${this.version.name}] Model tree has been created.`);
24
+ Services_1.LogService.debug(`[${this.version.name}] Model tree has been created.`);
26
25
  });
27
26
  }
28
27
  getRootLevelOfTree() {
@@ -7,7 +7,7 @@ declare class RouterBuilder {
7
7
  private createRouteByModel;
8
8
  private createNestedRoutes;
9
9
  private createChildRoutes;
10
- private addExpressRoute;
10
+ private addRoute;
11
11
  private getResourcePath;
12
12
  private getRootPrefix;
13
13
  }
@@ -36,14 +36,13 @@ class RouterBuilder {
36
36
  }
37
37
  build() {
38
38
  return __awaiter(this, void 0, void 0, function* () {
39
- const app = yield Services_1.IoCService.useByType("App");
40
- const logger = Services_1.LogService.getInstance();
39
+ const app = yield Services_1.IoCService.use("App");
41
40
  const generalHooks = yield new Resolvers_1.GeneralHookResolver(this.version).resolve();
42
41
  if (generalHooks.onBeforeInit) {
43
42
  generalHooks.onBeforeInit(app);
44
43
  }
45
44
  yield this.createRoutesByModelTree();
46
- logger.info(`[${this.version.name}] Express routes have been created.`);
45
+ Services_1.LogService.debug(`[${this.version.name}] All endpoints have been created.`);
47
46
  if (generalHooks.onAfterInit) {
48
47
  generalHooks.onAfterInit(app);
49
48
  }
@@ -76,8 +75,8 @@ class RouterBuilder {
76
75
  const middlewares = [
77
76
  ...model.instance.getMiddlewares(handlerType),
78
77
  ];
79
- // Adding the route to the express
80
- yield this.addExpressRoute(handlerType, url, middlewares, model, parentModel, relation);
78
+ // Adding the endpoint
79
+ yield this.addRoute(handlerType, url, middlewares, model, parentModel, relation);
81
80
  }
82
81
  yield this.createChildRoutes(model, resource, urlPrefix);
83
82
  yield this.createNestedRoutes(model, allowRecursive, urlPrefix, resource);
@@ -92,7 +91,8 @@ class RouterBuilder {
92
91
  const relation = model.relations.find((relation) => relation.model === model.name &&
93
92
  relation.type === Enums_1.Relationships.HAS_MANY);
94
93
  if (relation) {
95
- yield this.createRouteByModel(model, `${urlPrefix}${resource}/:${(0, change_case_1.camelCase)(relation.foreignKey)}/`, model, relation, false);
94
+ const paramName = (0, change_case_1.camelCase)(`${model.name}-${relation.primaryKey}`);
95
+ yield this.createRouteByModel(model, `${urlPrefix}${resource}/:${paramName}/`, model, relation, false);
96
96
  }
97
97
  });
98
98
  }
@@ -107,12 +107,13 @@ class RouterBuilder {
107
107
  const child = model.children.find((item) => item.name === relation.model);
108
108
  // It should be recursive
109
109
  if (child) {
110
- yield this.createRouteByModel(child, `${urlPrefix}${resource}/:${(0, change_case_1.camelCase)(relation.foreignKey)}/`, model, relation);
110
+ const paramName = (0, change_case_1.camelCase)(`${model.name}-${relation.primaryKey}`);
111
+ yield this.createRouteByModel(child, `${urlPrefix}${resource}/:${paramName}/`, model, relation);
111
112
  }
112
113
  }
113
114
  });
114
115
  }
115
- addExpressRoute(handlerType, url, middlewares, model, parentModel, relation) {
116
+ addRoute(handlerType, url, middlewares, model, parentModel, relation) {
116
117
  return __awaiter(this, void 0, void 0, function* () {
117
118
  const docs = Services_1.DocumentationService.getInstance();
118
119
  const data = {
@@ -125,7 +126,7 @@ class RouterBuilder {
125
126
  // Adding the route
126
127
  yield URLService_1.default.add(constants_1.HANDLER_METHOD_MAP[handlerType], url, data, middlewares);
127
128
  // Documentation
128
- docs.push(this.version, handlerType, constants_1.HANDLER_METHOD_MAP[handlerType], url, model);
129
+ docs.push(this.version, handlerType, constants_1.HANDLER_METHOD_MAP[handlerType], url, model, parentModel);
129
130
  });
130
131
  }
131
132
  getResourcePath(model, relation) {
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<any>;
2
+ export default _default;
@@ -0,0 +1,558 @@
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
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ /* eslint-disable no-prototype-builtins */
39
+ const path_1 = __importDefault(require("path"));
40
+ const fs_1 = __importDefault(require("fs"));
41
+ const change_case_1 = require("change-case");
42
+ const Enums_1 = require("../Enums");
43
+ const node_cache_1 = __importDefault(require("node-cache"));
44
+ const Services_1 = require("../Services");
45
+ const cache = new node_cache_1.default();
46
+ const DATA_TYPE_MAP = [
47
+ {
48
+ type: "string",
49
+ values: [
50
+ "char",
51
+ "varchar",
52
+ "text",
53
+ "tinytext",
54
+ "mediumtext",
55
+ "longtext",
56
+ "enum",
57
+ "set",
58
+ "varbinary",
59
+ "blob",
60
+ "tinyblob",
61
+ "mediumblob",
62
+ "longblob",
63
+ "date",
64
+ "datetime",
65
+ "timestamp",
66
+ "time",
67
+ "year",
68
+ ],
69
+ },
70
+ {
71
+ type: "number",
72
+ values: [
73
+ "tinyint",
74
+ "smallint",
75
+ "mediumint",
76
+ "int",
77
+ "integer",
78
+ "bigint",
79
+ "float",
80
+ "double",
81
+ "decimal",
82
+ "numeric",
83
+ ],
84
+ },
85
+ {
86
+ type: "boolean",
87
+ values: ["boolean", "binary"],
88
+ },
89
+ ];
90
+ const SUMMARY_TEXTS = {
91
+ [Enums_1.HandlerTypes.INSERT]: "Add a new {model}",
92
+ [Enums_1.HandlerTypes.PAGINATE]: "Retrieve a paginated list of {model}s",
93
+ [Enums_1.HandlerTypes.SHOW]: "Retrieve details of a {model}",
94
+ [Enums_1.HandlerTypes.UPDATE]: "Update an existing {model}",
95
+ [Enums_1.HandlerTypes.DELETE]: "Delete a {model}",
96
+ [Enums_1.HandlerTypes.FORCE_DELETE]: "Force delete a {model}",
97
+ [Enums_1.HandlerTypes.PATCH]: "Apply partial updates to a {model}",
98
+ [Enums_1.HandlerTypes.ALL]: "Get all items on {model}",
99
+ };
100
+ const DESCRIPTION_TEXTS = {
101
+ [Enums_1.HandlerTypes.INSERT]: "Add a new {model}",
102
+ [Enums_1.HandlerTypes.PAGINATE]: "Retrieve a paginated list of {model}s",
103
+ [Enums_1.HandlerTypes.SHOW]: "Retrieve details of a {model} by primary key",
104
+ [Enums_1.HandlerTypes.UPDATE]: "Update an existing {model} by primary key",
105
+ [Enums_1.HandlerTypes.DELETE]: "Delete a {model} by primary key",
106
+ [Enums_1.HandlerTypes.FORCE_DELETE]: "Force delete a {model} by primary key",
107
+ [Enums_1.HandlerTypes.PATCH]: "Apply partial updates to a {model} by primary key",
108
+ [Enums_1.HandlerTypes.ALL]: "Get all items on {model}",
109
+ };
110
+ const SINGLE_RETURN_ENDPOINTS = [
111
+ Enums_1.HandlerTypes.INSERT,
112
+ Enums_1.HandlerTypes.PATCH,
113
+ Enums_1.HandlerTypes.SHOW,
114
+ Enums_1.HandlerTypes.UPDATE,
115
+ ];
116
+ const ALLOWED_2XX_HANDLERS = [
117
+ Enums_1.HandlerTypes.ALL,
118
+ Enums_1.HandlerTypes.PAGINATE,
119
+ Enums_1.HandlerTypes.PATCH,
120
+ Enums_1.HandlerTypes.SHOW,
121
+ Enums_1.HandlerTypes.UPDATE,
122
+ ];
123
+ const POSSIBLE_404_HANDLERS = [
124
+ Enums_1.HandlerTypes.DELETE,
125
+ Enums_1.HandlerTypes.FORCE_DELETE,
126
+ Enums_1.HandlerTypes.PATCH,
127
+ Enums_1.HandlerTypes.SHOW,
128
+ Enums_1.HandlerTypes.UPDATE,
129
+ ];
130
+ const NO_CONTENT_HANDLERS = [
131
+ Enums_1.HandlerTypes.DELETE,
132
+ Enums_1.HandlerTypes.FORCE_DELETE,
133
+ ];
134
+ const ALLOWED_REQUEST_BODY_HANDLERS = [
135
+ Enums_1.HandlerTypes.INSERT,
136
+ Enums_1.HandlerTypes.UPDATE,
137
+ Enums_1.HandlerTypes.PATCH,
138
+ ];
139
+ const ALLOWED_QUERY_HANDLERS = [
140
+ Enums_1.HandlerTypes.ALL,
141
+ Enums_1.HandlerTypes.SHOW,
142
+ Enums_1.HandlerTypes.PAGINATE,
143
+ ];
144
+ const PAGINATION_SCHEMA = {
145
+ type: "object",
146
+ properties: {
147
+ total: {
148
+ type: "integer",
149
+ default: 1,
150
+ },
151
+ lastPage: {
152
+ type: "integer",
153
+ default: 1,
154
+ },
155
+ perPage: {
156
+ type: "integer",
157
+ default: 10,
158
+ },
159
+ currentPage: {
160
+ type: "integer",
161
+ default: 1,
162
+ },
163
+ from: {
164
+ type: "integer",
165
+ default: 0,
166
+ },
167
+ to: {
168
+ type: "integer",
169
+ default: 10,
170
+ },
171
+ },
172
+ };
173
+ const ERROR_SCHEMA = {
174
+ type: "object",
175
+ properties: {
176
+ error: {
177
+ type: "string",
178
+ default: "An error occorred",
179
+ },
180
+ },
181
+ };
182
+ const VALIDATION_ERROR_SCHEMA = {
183
+ type: "object",
184
+ properties: {
185
+ errors: {
186
+ type: "object",
187
+ },
188
+ },
189
+ };
190
+ const toPropertyType = (datatype) => {
191
+ for (const item of DATA_TYPE_MAP) {
192
+ if (item.values.includes(datatype)) {
193
+ return item.type;
194
+ }
195
+ }
196
+ return datatype;
197
+ };
198
+ const toEndpointSummary = (endpoint) => {
199
+ const value = SUMMARY_TEXTS[endpoint.handler] || "";
200
+ return value.replace("{model}", endpoint.model.toLowerCase());
201
+ };
202
+ const toEndpointDescription = (endpoint) => {
203
+ const value = DESCRIPTION_TEXTS[endpoint.handler] || "";
204
+ return value.replace("{model}", endpoint.model.toLowerCase());
205
+ };
206
+ const to2XXResponse = (endpoint) => {
207
+ // Single item response
208
+ if (SINGLE_RETURN_ENDPOINTS.includes(endpoint.handler)) {
209
+ return {
210
+ content: {
211
+ "application/json": {
212
+ schema: {
213
+ $ref: `#/components/schemas/${endpoint.model}`,
214
+ },
215
+ },
216
+ },
217
+ };
218
+ }
219
+ // All response
220
+ if (endpoint.handler === Enums_1.HandlerTypes.ALL) {
221
+ return {
222
+ content: {
223
+ "application/json": {
224
+ schema: {
225
+ type: "array",
226
+ items: {
227
+ $ref: `#/components/schemas/${endpoint.model}`,
228
+ },
229
+ },
230
+ },
231
+ },
232
+ };
233
+ }
234
+ return {
235
+ content: {
236
+ "application/json": {
237
+ schema: {
238
+ type: "object",
239
+ properties: {
240
+ data: {
241
+ type: "array",
242
+ items: {
243
+ $ref: `#/components/schemas/${endpoint.model}`,
244
+ },
245
+ },
246
+ pagination: {
247
+ $ref: `#/components/schemas/Pagination`,
248
+ },
249
+ },
250
+ },
251
+ },
252
+ },
253
+ };
254
+ };
255
+ const toEndpointResponse = (endpoint) => {
256
+ const response = {};
257
+ if (ALLOWED_2XX_HANDLERS.includes(endpoint.handler)) {
258
+ response["200"] = Object.assign(Object.assign({}, to2XXResponse(endpoint)), { description: "OK" });
259
+ }
260
+ if (endpoint.handler === Enums_1.HandlerTypes.INSERT) {
261
+ response["201"] = Object.assign(Object.assign({}, to2XXResponse(endpoint)), { description: "Created" });
262
+ response["400"] = {
263
+ description: "Bad request",
264
+ content: {
265
+ "application/json": {
266
+ schema: {
267
+ $ref: `#/components/schemas/ValidationError`,
268
+ },
269
+ },
270
+ },
271
+ };
272
+ }
273
+ if (NO_CONTENT_HANDLERS.includes(endpoint.handler)) {
274
+ response["204"] = {
275
+ description: "No Content",
276
+ };
277
+ }
278
+ if (POSSIBLE_404_HANDLERS.includes(endpoint.handler) ||
279
+ endpoint.parentModel) {
280
+ response["404"] = {
281
+ description: "Not Found",
282
+ content: {
283
+ "application/json": {
284
+ schema: {
285
+ $ref: `#/components/schemas/Error`,
286
+ },
287
+ },
288
+ },
289
+ };
290
+ }
291
+ return response;
292
+ };
293
+ const toFillableFieldProperties = (model) => {
294
+ const fields = model.instance.getFillableFields(Enums_1.HttpMethods.POST);
295
+ const properties = {};
296
+ for (const field of fields) {
297
+ const column = model.columns.find((item) => item.name === field);
298
+ if (column) {
299
+ properties[column.name] = {
300
+ type: toPropertyType(column.data_type),
301
+ format: column.data_type,
302
+ };
303
+ }
304
+ }
305
+ return properties;
306
+ };
307
+ const toRequestBody = (endpoint) => {
308
+ if (ALLOWED_REQUEST_BODY_HANDLERS.includes(endpoint.handler) === false) {
309
+ return undefined;
310
+ }
311
+ const bodySchema = `${endpoint.model}${(0, change_case_1.pascalCase)(endpoint.method)}Body`;
312
+ return {
313
+ description: "Update an existent pet in the store",
314
+ content: {
315
+ "application/json": {
316
+ schema: {
317
+ $ref: `#/components/requestBodies/${bodySchema}`,
318
+ },
319
+ },
320
+ },
321
+ required: true,
322
+ };
323
+ };
324
+ const toRequestParameters = (endpoint) => {
325
+ const parameters = [
326
+ {
327
+ in: "header",
328
+ name: "Accept-Language",
329
+ schema: {
330
+ type: "string",
331
+ example: "en;q=0.8, de;q=0.7, *;q=0.5",
332
+ },
333
+ required: false,
334
+ },
335
+ ];
336
+ if (endpoint.url.includes(":")) {
337
+ const sections = endpoint.url
338
+ .split("/")
339
+ .filter((item) => item.includes(":"))
340
+ .map((item) => item.replace(":", ""));
341
+ for (const section of sections) {
342
+ parameters.push({
343
+ in: "path",
344
+ name: section,
345
+ required: true,
346
+ });
347
+ }
348
+ }
349
+ if (endpoint.handler === Enums_1.HandlerTypes.PAGINATE) {
350
+ parameters.push(...[
351
+ {
352
+ name: "page",
353
+ in: "query",
354
+ description: "The page number to list",
355
+ required: false,
356
+ schema: {
357
+ type: "integer",
358
+ default: 1,
359
+ },
360
+ },
361
+ {
362
+ name: "per_page",
363
+ in: "query",
364
+ description: "Number of records to list on a page",
365
+ required: false,
366
+ schema: {
367
+ type: "integer",
368
+ default: 10,
369
+ },
370
+ },
371
+ {
372
+ name: "sort",
373
+ in: "query",
374
+ description: "The field to sort the data (ASC: id, DESC: -id)",
375
+ required: false,
376
+ schema: {
377
+ type: "string",
378
+ },
379
+ },
380
+ ]);
381
+ }
382
+ if (ALLOWED_QUERY_HANDLERS.includes(endpoint.handler)) {
383
+ parameters.push(...[
384
+ {
385
+ name: "fields",
386
+ in: "query",
387
+ description: "The model fields that can be fetched",
388
+ required: false,
389
+ schema: {
390
+ type: "string",
391
+ },
392
+ },
393
+ {
394
+ name: "with",
395
+ in: "query",
396
+ description: "Listable related models",
397
+ required: false,
398
+ schema: {
399
+ type: "string",
400
+ },
401
+ },
402
+ {
403
+ name: "trashed",
404
+ in: "query",
405
+ description: "List of deleted data with soft-delete",
406
+ required: false,
407
+ schema: {
408
+ type: "integer",
409
+ default: 0,
410
+ },
411
+ },
412
+ {
413
+ name: "q",
414
+ in: "query",
415
+ description: "JSON query to filter data",
416
+ required: false,
417
+ schema: {
418
+ type: "string",
419
+ },
420
+ },
421
+ ]);
422
+ }
423
+ return parameters;
424
+ };
425
+ const deepMerge = (base, source) => {
426
+ // Check if either base or source is not an object, or if source is null
427
+ if (typeof base !== "object" ||
428
+ typeof source !== "object" ||
429
+ source === null) {
430
+ return source;
431
+ }
432
+ // Create a copy of the base object to avoid modifying it directly
433
+ const merged = Object.assign({}, base);
434
+ // Loop through all properties in the source object
435
+ for (const key in source) {
436
+ if (source.hasOwnProperty(key)) {
437
+ // If the key exists in the base object and both values are objects, merge recursively
438
+ if (base.hasOwnProperty(key) &&
439
+ typeof base[key] === "object" &&
440
+ typeof source[key] === "object") {
441
+ merged[key] = deepMerge(base[key], source[key]);
442
+ }
443
+ else {
444
+ // If the key does not exist in the base object or one of the values is not an object, assign the source value to the merged object
445
+ merged[key] = source[key];
446
+ }
447
+ }
448
+ }
449
+ return merged;
450
+ };
451
+ const generateDocumentation = () => __awaiter(void 0, void 0, void 0, function* () {
452
+ const docs = Services_1.DocumentationService.getInstance();
453
+ const api = Services_1.APIService.getInstance();
454
+ let baseSchema = {
455
+ info: {
456
+ title: "Axe API",
457
+ description: "Edit your swagger/index.ts file",
458
+ },
459
+ servers: [
460
+ {
461
+ url: "http://localhost:3000",
462
+ },
463
+ ],
464
+ };
465
+ const swaggerBasePath = path_1.default.join(api.appFolder, "swagger");
466
+ if (fs_1.default.existsSync(`${swaggerBasePath}.ts`) ||
467
+ fs_1.default.existsSync(`${swaggerBasePath}.js`)) {
468
+ const { default: userDefinedSchema, DOCUMENTATION_SERVER } = yield Promise.resolve(`${swaggerBasePath}`).then(s => __importStar(require(s)));
469
+ baseSchema = userDefinedSchema;
470
+ if (!DOCUMENTATION_SERVER) {
471
+ throw new Error("`DOCUMENTATION_SERVER` URL should be exported");
472
+ }
473
+ api.setDocumentationServer(DOCUMENTATION_SERVER);
474
+ }
475
+ const schemas = {};
476
+ const requestBodies = {};
477
+ const firstVersion = api.versions.at(0);
478
+ if (!firstVersion) {
479
+ throw new Error("The version is not found!");
480
+ }
481
+ for (const model of firstVersion.modelList.get()) {
482
+ const properties = {};
483
+ for (const column of model.columns) {
484
+ properties[column.name] = {
485
+ type: toPropertyType(column.data_type),
486
+ format: column.data_type,
487
+ };
488
+ }
489
+ schemas[model.name] = {
490
+ type: "object",
491
+ properties,
492
+ };
493
+ if (model.instance.handlers.includes(Enums_1.HandlerTypes.INSERT)) {
494
+ requestBodies[`${model.name}${(0, change_case_1.pascalCase)(Enums_1.HttpMethods.POST)}Body`] = {
495
+ type: "object",
496
+ properties: toFillableFieldProperties(model),
497
+ };
498
+ }
499
+ if (model.instance.handlers.includes(Enums_1.HandlerTypes.UPDATE)) {
500
+ requestBodies[`${model.name}${(0, change_case_1.pascalCase)(Enums_1.HttpMethods.PUT)}Body`] = {
501
+ type: "object",
502
+ properties: toFillableFieldProperties(model),
503
+ };
504
+ }
505
+ if (model.instance.handlers.includes(Enums_1.HandlerTypes.PATCH)) {
506
+ requestBodies[`${model.name}${(0, change_case_1.pascalCase)(Enums_1.HttpMethods.PATCH)}Body`] = {
507
+ type: "object",
508
+ properties: toFillableFieldProperties(model),
509
+ };
510
+ }
511
+ }
512
+ const paths = {};
513
+ for (const endpoint of docs.get()) {
514
+ if (paths[endpoint.url] === undefined) {
515
+ paths[endpoint.url] = {};
516
+ }
517
+ const path = {
518
+ tags: [endpoint.model],
519
+ summary: toEndpointSummary(endpoint),
520
+ description: toEndpointDescription(endpoint),
521
+ operationId: `${endpoint.handler}${endpoint.model}`,
522
+ responses: toEndpointResponse(endpoint),
523
+ parameters: toRequestParameters(endpoint),
524
+ };
525
+ const requestBody = toRequestBody(endpoint);
526
+ if (requestBody) {
527
+ path.requestBody = requestBody;
528
+ }
529
+ paths[endpoint.url][endpoint.method.toLowerCase()] = path;
530
+ }
531
+ // Added custom endpoint
532
+ for (const custom of docs.getCustoms()) {
533
+ if (paths[custom.url] === undefined) {
534
+ paths[custom.url] = {};
535
+ }
536
+ paths[custom.url][custom.method.toLowerCase()] = {
537
+ description: "Custom endpoint",
538
+ };
539
+ }
540
+ const builded = {
541
+ openapi: "3.0.0",
542
+ paths,
543
+ components: {
544
+ schemas: Object.assign(Object.assign({}, schemas), { Pagination: PAGINATION_SCHEMA, Error: ERROR_SCHEMA, ValidationError: VALIDATION_ERROR_SCHEMA }),
545
+ requestBodies,
546
+ },
547
+ };
548
+ return deepMerge(baseSchema, builded);
549
+ });
550
+ exports.default = () => __awaiter(void 0, void 0, void 0, function* () {
551
+ const cached = cache.get("axe-api-documentation");
552
+ if (cached) {
553
+ return JSON.parse(cached);
554
+ }
555
+ const documentation = yield generateDocumentation();
556
+ cache.set("axe-api-documentation", JSON.stringify(documentation));
557
+ return documentation;
558
+ });
@@ -61,13 +61,6 @@ export declare enum HttpMethods {
61
61
  GET = "GET",
62
62
  DELETE = "DELETE"
63
63
  }
64
- export declare enum LogLevels {
65
- NONE = 0,
66
- ERROR = 1,
67
- WARNING = 2,
68
- INFO = 3,
69
- ALL = 4
70
- }
71
64
  export declare enum Relationships {
72
65
  HAS_ONE = "HAS_ONE",
73
66
  HAS_MANY = "HAS_MANY"