axe-api 0.20.0 → 0.20.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 (70) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/build/index.d.ts +8 -0
  3. package/build/index.js +32 -0
  4. package/build/src/Builders/ModelTreeBuilder.d.ts +9 -0
  5. package/build/src/Builders/ModelTreeBuilder.js +64 -0
  6. package/build/src/Builders/RouterBuilder.d.ts +15 -0
  7. package/build/src/Builders/RouterBuilder.js +219 -0
  8. package/build/src/Builders/index.d.ts +3 -0
  9. package/build/src/Builders/index.js +10 -0
  10. package/build/src/Enums.d.ts +77 -0
  11. package/build/src/Enums.js +90 -0
  12. package/build/src/Exceptions/ApiError.d.ts +8 -0
  13. package/build/src/Exceptions/ApiError.js +12 -0
  14. package/build/src/Handlers/AllHandler.d.ts +4 -0
  15. package/build/src/Handlers/AllHandler.js +44 -0
  16. package/build/src/Handlers/DestroyHandler.d.ts +4 -0
  17. package/build/src/Handlers/DestroyHandler.js +37 -0
  18. package/build/src/Handlers/HandlerFactory.d.ts +6 -0
  19. package/build/src/Handlers/HandlerFactory.js +36 -0
  20. package/build/src/Handlers/Helpers.d.ts +14 -0
  21. package/build/src/Handlers/Helpers.js +217 -0
  22. package/build/src/Handlers/PaginateHandler.d.ts +4 -0
  23. package/build/src/Handlers/PaginateHandler.js +48 -0
  24. package/build/src/Handlers/PatchHandler.d.ts +4 -0
  25. package/build/src/Handlers/PatchHandler.js +62 -0
  26. package/build/src/Handlers/ShowHandler.d.ts +4 -0
  27. package/build/src/Handlers/ShowHandler.js +51 -0
  28. package/build/src/Handlers/StoreHandler.d.ts +4 -0
  29. package/build/src/Handlers/StoreHandler.js +59 -0
  30. package/build/src/Handlers/UpdateHandler.d.ts +4 -0
  31. package/build/src/Handlers/UpdateHandler.js +62 -0
  32. package/build/src/Interfaces.d.ts +146 -0
  33. package/build/src/Interfaces.js +3 -0
  34. package/build/src/Model.d.ts +25 -0
  35. package/build/src/Model.js +145 -0
  36. package/build/src/Resolvers/FileResolver.d.ts +5 -0
  37. package/build/src/Resolvers/FileResolver.js +85 -0
  38. package/build/src/Resolvers/FolderResolver.d.ts +5 -0
  39. package/build/src/Resolvers/FolderResolver.js +19 -0
  40. package/build/src/Resolvers/GeneralHookResolver.d.ts +5 -0
  41. package/build/src/Resolvers/GeneralHookResolver.js +35 -0
  42. package/build/src/Resolvers/ModelResolver.d.ts +9 -0
  43. package/build/src/Resolvers/ModelResolver.js +107 -0
  44. package/build/src/Resolvers/TransactionResolver.d.ts +8 -0
  45. package/build/src/Resolvers/TransactionResolver.js +75 -0
  46. package/build/src/Resolvers/WithQueryResolver.d.ts +13 -0
  47. package/build/src/Resolvers/WithQueryResolver.js +116 -0
  48. package/build/src/Resolvers/index.d.ts +7 -0
  49. package/build/src/Resolvers/index.js +18 -0
  50. package/build/src/Server.d.ts +8 -0
  51. package/build/src/Server.js +103 -0
  52. package/build/src/Services/DocumentationService.d.ts +9 -0
  53. package/build/src/Services/DocumentationService.js +22 -0
  54. package/build/src/Services/IoCService.d.ts +9 -0
  55. package/build/src/Services/IoCService.js +51 -0
  56. package/build/src/Services/LogService.d.ts +12 -0
  57. package/build/src/Services/LogService.js +41 -0
  58. package/build/src/Services/ModelListService.d.ts +8 -0
  59. package/build/src/Services/ModelListService.js +18 -0
  60. package/build/src/Services/ModelService.d.ts +20 -0
  61. package/build/src/Services/ModelService.js +38 -0
  62. package/build/src/Services/QueryService.d.ts +34 -0
  63. package/build/src/Services/QueryService.js +377 -0
  64. package/build/src/Services/SchemaValidatorService.d.ts +12 -0
  65. package/build/src/Services/SchemaValidatorService.js +114 -0
  66. package/build/src/Services/index.d.ts +8 -0
  67. package/build/src/Services/index.js +20 -0
  68. package/build/src/constants.d.ts +23 -0
  69. package/build/src/constants.js +62 -0
  70. package/package.json +1 -1
@@ -0,0 +1,146 @@
1
+ import { Knex } from "knex";
2
+ import { Express, Request, Response, NextFunction } from "express";
3
+ import { Column } from "knex-schema-inspector/lib/types/column";
4
+ import { HandlerTypes, LogLevels, HttpMethods, HookFunctionTypes, Extensions, Relationships, SortTypes, ConditionTypes, DependencyTypes } from "./Enums";
5
+ import Model from "./Model";
6
+ export interface IColumn extends Column {
7
+ table_name: string;
8
+ }
9
+ export interface IConfig {
10
+ }
11
+ export interface IHandlerBasedTransactionConfig {
12
+ handler: HandlerTypes | HandlerTypes[];
13
+ transaction: boolean;
14
+ }
15
+ interface IHandlerBasedSerializer {
16
+ handler: HandlerTypes[];
17
+ serializer: ((data: any, request: Request) => void)[];
18
+ }
19
+ export interface IApplicationConfig extends IConfig {
20
+ env: string;
21
+ port: number;
22
+ logLevel: LogLevels;
23
+ prefix: string;
24
+ transaction: boolean | IHandlerBasedTransactionConfig | IHandlerBasedTransactionConfig[];
25
+ serializers: ((data: any, request: Request) => void)[] | IHandlerBasedSerializer[];
26
+ }
27
+ export declare type IDatabaseConfig = Knex.Config;
28
+ export interface IFolders {
29
+ App: string;
30
+ Config: string;
31
+ Events: string;
32
+ Hooks: string;
33
+ Middlewares: string;
34
+ Models: string;
35
+ }
36
+ export interface IGeneralHooks {
37
+ onBeforeInit: (app: Express) => void | null;
38
+ onAfterInit: (app: Express) => void | null;
39
+ }
40
+ export interface IHandlerBaseMiddleware {
41
+ handler: HandlerTypes[];
42
+ middleware: (req: Request, res: Response, next: NextFunction) => void | Promise<void>;
43
+ }
44
+ export interface IHookParameter {
45
+ req: Request;
46
+ res: Response;
47
+ handlerType: HandlerTypes;
48
+ model: IModelService;
49
+ parentModel: IModelService | null;
50
+ relation: IRelation | null;
51
+ database: Knex | Knex.Transaction;
52
+ conditions: IQuery | null;
53
+ query: Knex.QueryBuilder | null;
54
+ result: any | null;
55
+ item: any | null;
56
+ formData: any | null;
57
+ }
58
+ export interface IMethodBaseConfig {
59
+ [HttpMethods.POST]?: string[];
60
+ [HttpMethods.PUT]?: string[];
61
+ [HttpMethods.PATCH]?: string[];
62
+ }
63
+ export interface IMethodBaseValidations {
64
+ [HttpMethods.POST]?: Record<string, string>;
65
+ [HttpMethods.PUT]?: Record<string, string>;
66
+ }
67
+ export interface IModelService {
68
+ name: string;
69
+ instance: Model;
70
+ relations: IRelation[];
71
+ columns: IColumn[];
72
+ columnNames: string[];
73
+ hooks: Record<HookFunctionTypes, (params: IHookParameter) => void>;
74
+ events: Record<HookFunctionTypes, (params: IHookParameter) => void>;
75
+ isRecursive: boolean;
76
+ children: IModelService[];
77
+ setColumns(columns: IColumn[]): void;
78
+ setExtensions(type: Extensions, hookFunctionType: HookFunctionTypes, data: (params: IHookParameter) => void): void;
79
+ }
80
+ export interface IRelation {
81
+ type: Relationships;
82
+ name: string;
83
+ model: string;
84
+ primaryKey: string;
85
+ foreignKey: string;
86
+ }
87
+ export interface IRequestPack {
88
+ req: Request;
89
+ res: Response;
90
+ handlerType: HandlerTypes;
91
+ model: IModelService;
92
+ parentModel: IModelService | null;
93
+ relation: IRelation | null;
94
+ database: Knex | Knex.Transaction;
95
+ }
96
+ export interface IRouteDocumentation {
97
+ model: string;
98
+ table: string;
99
+ columns: IColumn[];
100
+ method: HttpMethods;
101
+ url: string;
102
+ fillables: string[];
103
+ validations: Record<string, string> | null;
104
+ }
105
+ export interface IRawQuery {
106
+ q: string | null;
107
+ page: string | null;
108
+ per_page: string | null;
109
+ sort: string | null;
110
+ fields: string | null;
111
+ with: string | null;
112
+ }
113
+ export interface ISortField {
114
+ name: string;
115
+ type: SortTypes;
116
+ }
117
+ export interface IWith {
118
+ relationship: string;
119
+ relationModel: IModelService;
120
+ fields: string[];
121
+ children: IWith[];
122
+ }
123
+ export interface IQuery {
124
+ q: NestedWhere;
125
+ page: number;
126
+ per_page: number;
127
+ sort: ISortField[];
128
+ fields: string[];
129
+ with: IWith[];
130
+ }
131
+ export interface IWhere {
132
+ prefix: string | null;
133
+ model: IModelService;
134
+ table: string;
135
+ field: string;
136
+ condition: ConditionTypes;
137
+ value: any;
138
+ relation: IRelation | null;
139
+ }
140
+ export declare type NestedWhere = Array<NestedWhere | IWhere>;
141
+ export interface IDependency {
142
+ type: DependencyTypes;
143
+ callback: any;
144
+ instance: any;
145
+ }
146
+ export {};
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const Enums_1 = require("./Enums");
@@ -0,0 +1,25 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ import { IRelation, IMethodBaseConfig, IMethodBaseValidations, IHandlerBaseMiddleware, IHandlerBasedTransactionConfig } from "./Interfaces";
3
+ import { HandlerTypes, HttpMethods } from "./Enums";
4
+ declare class Model {
5
+ get primaryKey(): string;
6
+ get table(): string;
7
+ get fillable(): string[] | IMethodBaseConfig;
8
+ get validations(): IMethodBaseValidations | Record<string, string>;
9
+ get handlers(): HandlerTypes[];
10
+ get middlewares(): ((req: Request, res: Response, next: NextFunction) => void)[] | IHandlerBaseMiddleware[] | IHandlerBaseMiddleware;
11
+ get hiddens(): string[];
12
+ get createdAtColumn(): string | null;
13
+ get updatedAtColumn(): string | null;
14
+ get transaction(): boolean | IHandlerBasedTransactionConfig | IHandlerBasedTransactionConfig[] | null;
15
+ get ignore(): boolean;
16
+ getFillableFields(methodType: HttpMethods): string[];
17
+ getValidationRules(methodType: HttpMethods): Record<string, string> | null;
18
+ getMiddlewares(handlerType: HandlerTypes): ((req: Request, res: Response, next: NextFunction) => void)[];
19
+ hasMany(relatedModel: string, primaryKey?: string, foreignKey?: string): IRelation;
20
+ hasOne(relatedModel: string, primaryKey?: string, foreignKey?: string): IRelation;
21
+ belongsTo(relatedModel: string, primaryKey: string, foreignKey: string): IRelation;
22
+ serialize(data: any, request: Request): any;
23
+ private hasStringValue;
24
+ }
25
+ export default Model;
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const pluralize_1 = __importDefault(require("pluralize"));
7
+ const snake_case_1 = require("snake-case");
8
+ const Enums_1 = require("./Enums");
9
+ const constants_1 = require("./constants");
10
+ class Model {
11
+ get primaryKey() {
12
+ return "id";
13
+ }
14
+ get table() {
15
+ return (0, pluralize_1.default)((0, snake_case_1.snakeCase)(this.constructor.name));
16
+ }
17
+ get fillable() {
18
+ return [];
19
+ }
20
+ get validations() {
21
+ return {};
22
+ }
23
+ get handlers() {
24
+ return [...constants_1.DEFAULT_HANDLERS];
25
+ }
26
+ get middlewares() {
27
+ return [];
28
+ }
29
+ get hiddens() {
30
+ return [];
31
+ }
32
+ get createdAtColumn() {
33
+ return "created_at";
34
+ }
35
+ get updatedAtColumn() {
36
+ return "updated_at";
37
+ }
38
+ get transaction() {
39
+ return null;
40
+ }
41
+ get ignore() {
42
+ return false;
43
+ }
44
+ getFillableFields(methodType) {
45
+ if (this.fillable === null) {
46
+ return [];
47
+ }
48
+ if (Array.isArray(this.fillable)) {
49
+ return this.fillable;
50
+ }
51
+ const values = this.fillable;
52
+ switch (methodType) {
53
+ case Enums_1.HttpMethods.PATCH:
54
+ return values.PATCH || [];
55
+ case Enums_1.HttpMethods.POST:
56
+ return values.POST || [];
57
+ case Enums_1.HttpMethods.PUT:
58
+ return values.PUT || [];
59
+ default:
60
+ return [];
61
+ }
62
+ }
63
+ getValidationRules(methodType) {
64
+ if (this.hasStringValue()) {
65
+ return this.validations;
66
+ }
67
+ const values = this.validations;
68
+ switch (methodType) {
69
+ case Enums_1.HttpMethods.POST:
70
+ return values.POST || null;
71
+ case Enums_1.HttpMethods.PATCH:
72
+ case Enums_1.HttpMethods.PUT:
73
+ return values.PUT || null;
74
+ default:
75
+ return null;
76
+ }
77
+ }
78
+ getMiddlewares(handlerType) {
79
+ const results = [];
80
+ const middlewares = this.middlewares;
81
+ if (Array.isArray(middlewares)) {
82
+ middlewares.forEach((item) => {
83
+ if (item === null || item === void 0 ? void 0 : item.handler) {
84
+ const methodBasedMiddlewares = item;
85
+ if (methodBasedMiddlewares.handler.includes(handlerType)) {
86
+ results.push(methodBasedMiddlewares.middleware);
87
+ }
88
+ }
89
+ else {
90
+ results.push(item);
91
+ }
92
+ });
93
+ }
94
+ else {
95
+ const methodBasedMiddlewares = middlewares;
96
+ if (methodBasedMiddlewares.handler.includes(handlerType)) {
97
+ results.push(methodBasedMiddlewares.middleware);
98
+ }
99
+ }
100
+ return results;
101
+ }
102
+ hasMany(relatedModel, primaryKey = "id", foreignKey = "") {
103
+ if (!foreignKey) {
104
+ const currentModelName = pluralize_1.default.singular(this.constructor.name.toLowerCase());
105
+ foreignKey = `${currentModelName}_id`;
106
+ }
107
+ return {
108
+ name: relatedModel,
109
+ type: Enums_1.Relationships.HAS_MANY,
110
+ model: relatedModel,
111
+ primaryKey,
112
+ foreignKey,
113
+ };
114
+ }
115
+ hasOne(relatedModel, primaryKey = "id", foreignKey = "") {
116
+ if (foreignKey === "") {
117
+ foreignKey = `${pluralize_1.default.singular(relatedModel.toLowerCase())}_id`;
118
+ }
119
+ return {
120
+ name: relatedModel,
121
+ type: Enums_1.Relationships.HAS_ONE,
122
+ model: relatedModel,
123
+ primaryKey,
124
+ foreignKey,
125
+ };
126
+ }
127
+ belongsTo(relatedModel, primaryKey, foreignKey) {
128
+ return this.hasOne(relatedModel, foreignKey, primaryKey);
129
+ }
130
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
131
+ serialize(data, request) {
132
+ return data;
133
+ }
134
+ hasStringValue() {
135
+ const tester = this.validations;
136
+ let status = false;
137
+ for (const key of Object.keys(tester)) {
138
+ if (typeof tester[key] === "string") {
139
+ status = true;
140
+ }
141
+ }
142
+ return status;
143
+ }
144
+ }
145
+ exports.default = Model;
@@ -0,0 +1,5 @@
1
+ declare class FileResolver {
2
+ resolve<T>(directory: string): Promise<Record<string, T>>;
3
+ resolveContent(directory: string): Promise<Record<string, any>>;
4
+ }
5
+ export default FileResolver;
@@ -0,0 +1,85 @@
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
+ const fs_1 = __importDefault(require("fs"));
39
+ const path_1 = __importDefault(require("path"));
40
+ class FileResolver {
41
+ resolve(directory) {
42
+ return __awaiter(this, void 0, void 0, function* () {
43
+ const results = {};
44
+ if (!fs_1.default.existsSync(directory)) {
45
+ return results;
46
+ }
47
+ const files = (yield fs_1.default.readdirSync(directory, { withFileTypes: true }))
48
+ .filter((item) => !item.isDirectory())
49
+ .filter((filename) => filename.name.includes(".ts") || filename.name.includes(".js"))
50
+ .map((item) => item.name);
51
+ for (const file of files) {
52
+ const configFile = path_1.default.join(directory, file);
53
+ const { default: content } = yield Promise.resolve().then(() => __importStar(require(configFile)));
54
+ const key = file.replace(".ts", "").replace(".js", "");
55
+ if (content === null || content === void 0 ? void 0 : content.prototype) {
56
+ results[key] = new content();
57
+ }
58
+ else {
59
+ results[key] = content;
60
+ }
61
+ }
62
+ return results;
63
+ });
64
+ }
65
+ resolveContent(directory) {
66
+ return __awaiter(this, void 0, void 0, function* () {
67
+ const results = {};
68
+ if (!fs_1.default.existsSync(directory)) {
69
+ return results;
70
+ }
71
+ const files = yield fs_1.default
72
+ .readdirSync(directory, { withFileTypes: true })
73
+ .filter((item) => !item.isDirectory())
74
+ .map((item) => item.name);
75
+ for (const file of files) {
76
+ const configFile = path_1.default.join(directory, file);
77
+ const content = yield Promise.resolve().then(() => __importStar(require(configFile)));
78
+ const key = file.replace(".ts", "").replace(".js", "");
79
+ results[key] = content;
80
+ }
81
+ return results;
82
+ });
83
+ }
84
+ }
85
+ exports.default = FileResolver;
@@ -0,0 +1,5 @@
1
+ import { IFolders } from "../Interfaces";
2
+ declare class FolderResolver {
3
+ resolve(appFolder: string): IFolders;
4
+ }
5
+ export default FolderResolver;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const path_1 = __importDefault(require("path"));
7
+ class FolderResolver {
8
+ resolve(appFolder) {
9
+ return {
10
+ App: appFolder,
11
+ Config: path_1.default.join(appFolder, "app", "Config"),
12
+ Events: path_1.default.join(appFolder, "app", "Events"),
13
+ Hooks: path_1.default.join(appFolder, "app", "Hooks"),
14
+ Middlewares: path_1.default.join(appFolder, "app", "Middlewares"),
15
+ Models: path_1.default.join(appFolder, "app", "Models"),
16
+ };
17
+ }
18
+ }
19
+ exports.default = FolderResolver;
@@ -0,0 +1,5 @@
1
+ import { IGeneralHooks } from "../Interfaces";
2
+ declare class GeneralHookResolver {
3
+ static resolve(): Promise<IGeneralHooks>;
4
+ }
5
+ export default GeneralHookResolver;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const path_1 = __importDefault(require("path"));
16
+ const Services_1 = require("../Services");
17
+ const _1 = require(".");
18
+ class GeneralHookResolver {
19
+ static resolve() {
20
+ return __awaiter(this, void 0, void 0, function* () {
21
+ const folders = (yield Services_1.IoCService.use("Folders"));
22
+ const fileResolver = new _1.FileResolver();
23
+ const content = yield fileResolver.resolveContent(path_1.default.join(folders.App, "app"));
24
+ if (content && content.init) {
25
+ const { onBeforeInit = null, onAfterInit = null } = content.init;
26
+ return { onBeforeInit, onAfterInit };
27
+ }
28
+ return {
29
+ onBeforeInit: null,
30
+ onAfterInit: null,
31
+ };
32
+ });
33
+ }
34
+ }
35
+ exports.default = GeneralHookResolver;
@@ -0,0 +1,9 @@
1
+ declare class ModelResolver {
2
+ resolve(): Promise<void>;
3
+ private setModelRelations;
4
+ private getModelList;
5
+ private setDatabaseColumns;
6
+ private setModelHooks;
7
+ private getInstanceMethods;
8
+ }
9
+ export default ModelResolver;
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const FileResolver_1 = __importDefault(require("./FileResolver"));
16
+ const Enums_1 = require("../Enums");
17
+ const Services_1 = require("../Services");
18
+ const constants_1 = require("../constants");
19
+ class ModelResolver {
20
+ resolve() {
21
+ return __awaiter(this, void 0, void 0, function* () {
22
+ const logger = yield Services_1.IoCService.useByType("LogService");
23
+ const modelList = new Services_1.ModelListService(yield this.getModelList());
24
+ yield this.setModelRelations(modelList);
25
+ yield this.setDatabaseColumns(modelList);
26
+ yield this.setModelHooks(modelList, Enums_1.Extensions.Hooks);
27
+ yield this.setModelHooks(modelList, Enums_1.Extensions.Events);
28
+ Services_1.IoCService.singleton("ModelListService", () => modelList);
29
+ logger.info("All models have been resolved.");
30
+ });
31
+ }
32
+ setModelRelations(modelList) {
33
+ return __awaiter(this, void 0, void 0, function* () {
34
+ for (const model of modelList.get()) {
35
+ const relationMethods = this.getInstanceMethods(model);
36
+ for (const relationMethod of relationMethods) {
37
+ const relationFunction = model.instance[relationMethod];
38
+ if (typeof relationFunction !== "function") {
39
+ throw new Error(`Model relation definition should be a function: ${model.name}.${relationMethod}`);
40
+ }
41
+ const definition = relationFunction.call(model.instance);
42
+ definition.name = relationMethod;
43
+ model.relations.push(definition);
44
+ }
45
+ }
46
+ });
47
+ }
48
+ getModelList() {
49
+ return __awaiter(this, void 0, void 0, function* () {
50
+ const list = [];
51
+ const folders = (yield Services_1.IoCService.use("Folders"));
52
+ const fileResolver = new FileResolver_1.default();
53
+ const models = yield fileResolver.resolve(folders.Models);
54
+ for (const key in models) {
55
+ list.push(new Services_1.ModelService(key, models[key]));
56
+ }
57
+ return list;
58
+ });
59
+ }
60
+ setDatabaseColumns(modelList) {
61
+ return __awaiter(this, void 0, void 0, function* () {
62
+ const database = (yield Services_1.IoCService.use("Database"));
63
+ const schemaInspector = (yield Services_1.IoCService.use("SchemaInspector"));
64
+ const inspector = schemaInspector(database);
65
+ const columns = [];
66
+ for (const table of yield inspector.tables()) {
67
+ const dbColumns = yield inspector.columnInfo(table);
68
+ columns.push(...dbColumns.map((column) => {
69
+ return Object.assign(Object.assign({}, column), { table_name: table });
70
+ }));
71
+ }
72
+ for (const model of modelList.get()) {
73
+ const modelColumns = columns.filter((column) => column.table_name === model.instance.table);
74
+ if (modelColumns.length === 0) {
75
+ throw new Error(`The "${model.instance.table}" table doesn't have any column. Are you sure about the table name?`);
76
+ }
77
+ model.setColumns(modelColumns);
78
+ }
79
+ });
80
+ }
81
+ setModelHooks(modelList, hookType) {
82
+ return __awaiter(this, void 0, void 0, function* () {
83
+ const folders = (yield Services_1.IoCService.use("Folders"));
84
+ const fileResolver = new FileResolver_1.default();
85
+ const folder = hookType === Enums_1.Extensions.Hooks ? folders.Hooks : folders.Events;
86
+ const hooks = yield fileResolver.resolveContent(folder);
87
+ for (const model of modelList.get()) {
88
+ const hookFileName = `${model.name}${hookType
89
+ .toString()
90
+ .replace("s", "")}`;
91
+ if (hooks[hookFileName]) {
92
+ const keys = Object.keys(hooks[hookFileName]);
93
+ keys.forEach((key) => {
94
+ const strEnum = key;
95
+ const hookFunctionType = Enums_1.HookFunctionTypes[strEnum];
96
+ model.setExtensions(hookType, hookFunctionType, hooks[hookFileName][key]);
97
+ });
98
+ }
99
+ }
100
+ });
101
+ }
102
+ getInstanceMethods(obj) {
103
+ const properties = Object.getOwnPropertyNames(obj.instance.constructor.prototype);
104
+ return properties.filter((name) => !constants_1.DEFAULT_METHODS_OF_MODELS.includes(name));
105
+ }
106
+ }
107
+ exports.default = ModelResolver;
@@ -0,0 +1,8 @@
1
+ import { IModelService } from "../Interfaces";
2
+ import { HandlerTypes } from "../Enums";
3
+ declare class TransactionResolver {
4
+ static resolve(model: IModelService, handlerType: HandlerTypes): Promise<boolean>;
5
+ private static resolveTransactionOption;
6
+ private static getTransactionConfiguration;
7
+ }
8
+ export default TransactionResolver;