axe-api 0.22.0 → 0.30.0-rc10
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/build/dev-kit.d.ts +1 -0
- package/build/dev-kit.js +16 -0
- package/build/index.d.ts +3 -3
- package/build/index.js +4 -1
- package/build/src/Builders/ModelTreeBuilder.d.ts +3 -0
- package/build/src/Builders/ModelTreeBuilder.js +21 -17
- package/build/src/Builders/RouterBuilder.d.ts +3 -0
- package/build/src/Builders/RouterBuilder.js +28 -27
- package/build/src/Enums.d.ts +98 -0
- package/build/src/Enums.js +103 -1
- package/build/src/Exceptions/ApiError.d.ts +1 -1
- package/build/src/Exceptions/ApiError.js +2 -2
- package/build/src/Exceptions/AxeError.d.ts +8 -0
- package/build/src/Exceptions/AxeError.js +11 -0
- package/build/src/Handlers/AllHandler.js +4 -5
- package/build/src/Handlers/DocsHandler.d.ts +3 -0
- package/build/src/Handlers/DocsHandler.js +22 -0
- package/build/src/Handlers/HandlerFactory.d.ts +1 -1
- package/build/src/Handlers/HandlerFactory.js +1 -1
- package/build/src/Handlers/Helpers.d.ts +5 -3
- package/build/src/Handlers/Helpers.js +29 -13
- package/build/src/Handlers/PaginateHandler.js +4 -5
- package/build/src/Handlers/PatchHandler.js +2 -2
- package/build/src/Handlers/RoutesHandler.d.ts +3 -0
- package/build/src/Handlers/RoutesHandler.js +16 -0
- package/build/src/Handlers/ShowHandler.js +4 -5
- package/build/src/Handlers/StoreHandler.js +2 -2
- package/build/src/Handlers/UpdateHandler.js +2 -2
- package/build/src/Helpers.d.ts +4 -0
- package/build/src/Helpers.js +78 -0
- package/build/src/Interfaces.d.ts +54 -14
- package/build/src/Middlewares/acceptLanguageMiddleware.js +3 -5
- package/build/src/Model.d.ts +2 -2
- package/build/src/Model.js +3 -4
- package/build/src/Resolvers/FileResolver.js +2 -2
- package/build/src/Resolvers/GeneralHookResolver.d.ts +4 -2
- package/build/src/Resolvers/GeneralHookResolver.js +5 -8
- package/build/src/Resolvers/ModelResolver.d.ts +7 -0
- package/build/src/Resolvers/ModelResolver.js +99 -19
- package/build/src/Resolvers/TransactionResolver.d.ts +4 -2
- package/build/src/Resolvers/TransactionResolver.js +5 -4
- package/build/src/Resolvers/VersionConfigResolver.d.ts +7 -0
- package/build/src/Resolvers/VersionConfigResolver.js +58 -0
- package/build/src/Resolvers/VersionResolver.d.ts +7 -0
- package/build/src/Resolvers/VersionResolver.js +65 -0
- package/build/src/Resolvers/index.d.ts +3 -2
- package/build/src/Resolvers/index.js +5 -3
- package/build/src/Server.d.ts +3 -2
- package/build/src/Server.js +73 -46
- package/build/src/Services/APIService.d.ts +16 -0
- package/build/src/Services/APIService.js +82 -0
- package/build/src/Services/DocumentationService.d.ts +3 -1
- package/build/src/Services/DocumentationService.js +6 -0
- package/build/src/Services/LimitService.d.ts +5 -0
- package/build/src/Services/LimitService.js +116 -0
- package/build/src/Services/LogService.d.ts +4 -1
- package/build/src/Services/LogService.js +6 -0
- package/build/src/Services/ModelService.d.ts +6 -1
- package/build/src/Services/ModelService.js +8 -0
- package/build/src/Services/QueryService.d.ts +3 -2
- package/build/src/Services/QueryService.js +32 -7
- package/build/src/Services/SchemaValidatorService.d.ts +7 -0
- package/build/src/Services/SchemaValidatorService.js +62 -8
- package/build/src/Services/index.d.ts +3 -1
- package/build/src/Services/index.js +6 -1
- package/build/src/Types.d.ts +2 -0
- package/build/src/Types.js +2 -0
- package/build/src/constants.d.ts +5 -1
- package/build/src/constants.js +43 -2
- package/package.json +26 -24
- package/CHANGELOG.md +0 -212
- package/build/src/Resolvers/FolderResolver.d.ts +0 -5
- package/build/src/Resolvers/FolderResolver.js +0 -19
|
@@ -12,21 +12,30 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const path_1 = __importDefault(require("path"));
|
|
16
|
+
const fs_1 = __importDefault(require("fs"));
|
|
17
|
+
const promises_1 = require("fs/promises");
|
|
15
18
|
const FileResolver_1 = __importDefault(require("./FileResolver"));
|
|
16
19
|
const Enums_1 = require("../Enums");
|
|
17
20
|
const Services_1 = require("../Services");
|
|
18
21
|
const constants_1 = require("../constants");
|
|
22
|
+
const AxeError_1 = __importDefault(require("../Exceptions/AxeError"));
|
|
19
23
|
class ModelResolver {
|
|
24
|
+
constructor(version) {
|
|
25
|
+
this.version = version;
|
|
26
|
+
}
|
|
20
27
|
resolve() {
|
|
21
28
|
return __awaiter(this, void 0, void 0, function* () {
|
|
22
|
-
const logger =
|
|
29
|
+
const logger = Services_1.LogService.getInstance();
|
|
23
30
|
const modelList = new Services_1.ModelListService(yield this.getModelList());
|
|
24
31
|
yield this.setModelRelations(modelList);
|
|
25
32
|
yield this.setDatabaseColumns(modelList);
|
|
26
33
|
yield this.setModelHooks(modelList, Enums_1.Extensions.Hooks);
|
|
27
34
|
yield this.setModelHooks(modelList, Enums_1.Extensions.Events);
|
|
28
|
-
|
|
29
|
-
|
|
35
|
+
yield this.setModelSerializations(modelList);
|
|
36
|
+
yield this.setModelQueryLimits(modelList);
|
|
37
|
+
this.version.modelList = modelList;
|
|
38
|
+
logger.info(`[${this.version.name}] All models have been resolved.`);
|
|
30
39
|
});
|
|
31
40
|
}
|
|
32
41
|
setModelRelations(modelList) {
|
|
@@ -48,9 +57,8 @@ class ModelResolver {
|
|
|
48
57
|
getModelList() {
|
|
49
58
|
return __awaiter(this, void 0, void 0, function* () {
|
|
50
59
|
const list = [];
|
|
51
|
-
const folders = (yield Services_1.IoCService.use("Folders"));
|
|
52
60
|
const fileResolver = new FileResolver_1.default();
|
|
53
|
-
const models = yield fileResolver.resolve(folders.
|
|
61
|
+
const models = yield fileResolver.resolve(this.version.folders.models);
|
|
54
62
|
for (const key in models) {
|
|
55
63
|
list.push(new Services_1.ModelService(key, models[key]));
|
|
56
64
|
}
|
|
@@ -72,7 +80,7 @@ class ModelResolver {
|
|
|
72
80
|
for (const model of modelList.get()) {
|
|
73
81
|
const modelColumns = columns.filter((column) => column.table_name === model.instance.table);
|
|
74
82
|
if (modelColumns.length === 0) {
|
|
75
|
-
throw new
|
|
83
|
+
throw new AxeError_1.default(Enums_1.AxeErrorCode.TABLE_DOESNT_HAVE_ANY_COLUMN, `The "${model.instance.table}" table doesn't have any column.`);
|
|
76
84
|
}
|
|
77
85
|
model.setColumns(modelColumns);
|
|
78
86
|
}
|
|
@@ -80,25 +88,97 @@ class ModelResolver {
|
|
|
80
88
|
}
|
|
81
89
|
setModelHooks(modelList, hookType) {
|
|
82
90
|
return __awaiter(this, void 0, void 0, function* () {
|
|
83
|
-
|
|
91
|
+
// What kind of hooks that we can have
|
|
92
|
+
const hookList = Object.keys(Enums_1.HookFunctionTypes);
|
|
93
|
+
const fileResolver = new FileResolver_1.default();
|
|
94
|
+
// Basic hook/event folder path
|
|
95
|
+
const folder = hookType === Enums_1.Extensions.Hooks
|
|
96
|
+
? this.version.folders.hooks
|
|
97
|
+
: this.version.folders.events;
|
|
98
|
+
// We should check the old-style hooks files
|
|
99
|
+
yield this.checkOldStyleHookFiles(folder);
|
|
100
|
+
// Get model-based subfolders
|
|
101
|
+
const hookSubfolders = yield this.getDirectories(folder);
|
|
102
|
+
// For each subfolder, we can have many different hook file
|
|
103
|
+
for (const hookSubfolder of hookSubfolders) {
|
|
104
|
+
// Full path of the subfolder
|
|
105
|
+
const subfolderPath = path_1.default.join(folder, hookSubfolder);
|
|
106
|
+
// Determining which model we are working on by subfolder
|
|
107
|
+
const currentModel = modelList.find(hookSubfolder);
|
|
108
|
+
// If we can't find a model, it means that the developer are using wrong name
|
|
109
|
+
if (!currentModel) {
|
|
110
|
+
throw new AxeError_1.default(Enums_1.AxeErrorCode.UNDEFINED_HOOK_MODEL_RELATION, `Undefined model relation: ${subfolderPath}`);
|
|
111
|
+
}
|
|
112
|
+
// Loading all hooks files in the subfolder
|
|
113
|
+
const hooks = yield fileResolver.resolveContent(subfolderPath);
|
|
114
|
+
for (const hookName of hookList) {
|
|
115
|
+
// If we have an acceptable hook
|
|
116
|
+
if (hooks[hookName]) {
|
|
117
|
+
// We bind the hook with the model
|
|
118
|
+
currentModel.setExtensions(hookType, hookName, hooks[hookName].default);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
getDirectories(source) {
|
|
125
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
126
|
+
if (!fs_1.default.existsSync(source)) {
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
return (yield (0, promises_1.readdir)(source, { withFileTypes: true }))
|
|
130
|
+
.filter((dirent) => dirent.isDirectory())
|
|
131
|
+
.map((dirent) => dirent.name);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
checkOldStyleHookFiles(source) {
|
|
135
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
136
|
+
if (!fs_1.default.existsSync(source)) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
// We are fetching the root-level file list
|
|
140
|
+
const files = (yield (0, promises_1.readdir)(source, { withFileTypes: true }))
|
|
141
|
+
.filter((dirent) => !dirent.isDirectory())
|
|
142
|
+
.map((dirent) => dirent.name)
|
|
143
|
+
.filter((filename) => filename !== ".gitignore");
|
|
144
|
+
// If there is any hook or event file in the root level
|
|
145
|
+
const hasHookorEvent = files.some((file) => file.includes("Hook.ts") || file.includes("Event.ts"));
|
|
146
|
+
// Throwing an exception
|
|
147
|
+
if (hasHookorEvent) {
|
|
148
|
+
throw new AxeError_1.default(Enums_1.AxeErrorCode.UNACCEPTABLE_HOOK_FILE, `All hook or event files should be located under a model folder: ${source}`);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
setModelSerializations(modelList) {
|
|
153
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
84
154
|
const fileResolver = new FileResolver_1.default();
|
|
85
|
-
const
|
|
86
|
-
const hooks = yield fileResolver.resolveContent(folder);
|
|
155
|
+
const serializations = yield fileResolver.resolveContent(this.version.folders.serialization);
|
|
87
156
|
for (const model of modelList.get()) {
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
});
|
|
157
|
+
const fileName = `${model.name}Serialization`;
|
|
158
|
+
if (serializations[fileName]) {
|
|
159
|
+
const file = serializations[fileName];
|
|
160
|
+
model.setSerialization(file.default);
|
|
98
161
|
}
|
|
99
162
|
}
|
|
100
163
|
});
|
|
101
164
|
}
|
|
165
|
+
setModelQueryLimits(modelList) {
|
|
166
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
167
|
+
for (const model of modelList.get()) {
|
|
168
|
+
// We should use the full field name like `users.name`
|
|
169
|
+
const modelLimits = model.instance.limits.flat().map((item) => {
|
|
170
|
+
if (item.key) {
|
|
171
|
+
item.key = `${model.instance.table}.${item.key}`;
|
|
172
|
+
}
|
|
173
|
+
return Object.assign({}, item);
|
|
174
|
+
});
|
|
175
|
+
model.setQueryLimits([
|
|
176
|
+
...this.version.config.query.limits.flat(),
|
|
177
|
+
...modelLimits,
|
|
178
|
+
]);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}
|
|
102
182
|
getInstanceMethods(obj) {
|
|
103
183
|
const properties = Object.getOwnPropertyNames(obj.instance.constructor.prototype);
|
|
104
184
|
return properties.filter((name) => !constants_1.DEFAULT_METHODS_OF_MODELS.includes(name));
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { IModelService } from "../Interfaces";
|
|
1
|
+
import { IModelService, IVersion } from "../Interfaces";
|
|
2
2
|
import { HandlerTypes } from "../Enums";
|
|
3
3
|
declare class TransactionResolver {
|
|
4
|
-
|
|
4
|
+
private version;
|
|
5
|
+
constructor(version: IVersion);
|
|
6
|
+
resolve(model: IModelService, handlerType: HandlerTypes): Promise<boolean>;
|
|
5
7
|
private static resolveTransactionOption;
|
|
6
8
|
private static getTransactionConfiguration;
|
|
7
9
|
}
|
|
@@ -9,12 +9,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
const Services_1 = require("../Services");
|
|
13
12
|
class TransactionResolver {
|
|
14
|
-
|
|
13
|
+
constructor(version) {
|
|
14
|
+
this.version = version;
|
|
15
|
+
}
|
|
16
|
+
resolve(model, handlerType) {
|
|
15
17
|
return __awaiter(this, void 0, void 0, function* () {
|
|
16
|
-
const
|
|
17
|
-
const global = config.Application.transaction;
|
|
18
|
+
const global = this.version.config.transaction;
|
|
18
19
|
const local = model.instance.transaction;
|
|
19
20
|
let privilegedOption = false;
|
|
20
21
|
if (global) {
|
|
@@ -0,0 +1,58 @@
|
|
|
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 path_1 = __importDefault(require("path"));
|
|
39
|
+
const fs_1 = __importDefault(require("fs"));
|
|
40
|
+
const AxeError_1 = __importDefault(require("../Exceptions/AxeError"));
|
|
41
|
+
const Enums_1 = require("../Enums");
|
|
42
|
+
class VersionConfigResolver {
|
|
43
|
+
constructor(version) {
|
|
44
|
+
this.version = version;
|
|
45
|
+
}
|
|
46
|
+
resolve() {
|
|
47
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
48
|
+
const versionConfigFile = path_1.default.join(this.version.folders.root, "config");
|
|
49
|
+
if (!fs_1.default.existsSync(`${versionConfigFile}.ts`) &&
|
|
50
|
+
!fs_1.default.existsSync(`${versionConfigFile}.js`)) {
|
|
51
|
+
throw new AxeError_1.default(Enums_1.AxeErrorCode.VERSION_CONFIG_NOT_FOUND, `The version file not found: ${versionConfigFile}.ts`);
|
|
52
|
+
}
|
|
53
|
+
const { default: content } = yield Promise.resolve(`${versionConfigFile}`).then(s => __importStar(require(s)));
|
|
54
|
+
this.version.config = content;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.default = VersionConfigResolver;
|
|
@@ -0,0 +1,65 @@
|
|
|
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 validatorjs_1 = __importDefault(require("validatorjs"));
|
|
16
|
+
const promises_1 = require("fs/promises");
|
|
17
|
+
const Services_1 = require("../Services");
|
|
18
|
+
const AxeError_1 = __importDefault(require("../Exceptions/AxeError"));
|
|
19
|
+
const Enums_1 = require("../Enums");
|
|
20
|
+
const RESERVED_VERSION_FOLDERS = [
|
|
21
|
+
"Config",
|
|
22
|
+
"Events",
|
|
23
|
+
"Hooks",
|
|
24
|
+
"Models",
|
|
25
|
+
"Serialization",
|
|
26
|
+
];
|
|
27
|
+
class VersionResolver {
|
|
28
|
+
resolve() {
|
|
29
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
+
const logger = Services_1.LogService.getInstance();
|
|
31
|
+
yield this.getVersions();
|
|
32
|
+
logger.info("All API versions have been resolved.");
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
getVersions() {
|
|
36
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
37
|
+
const api = Services_1.APIService.getInstance();
|
|
38
|
+
const versionFolders = yield this.getDirectories(api.appFolder);
|
|
39
|
+
this.checkReservedKeys(versionFolders);
|
|
40
|
+
versionFolders.forEach((version) => {
|
|
41
|
+
const validation = new validatorjs_1.default({ version }, { version: "required|alpha_num" });
|
|
42
|
+
if (validation.fails()) {
|
|
43
|
+
const { version: versionError } = validation.errors.errors;
|
|
44
|
+
const [message] = versionError;
|
|
45
|
+
throw new AxeError_1.default(Enums_1.AxeErrorCode.UNACCEPTABLE_VERSION_NAME, `${message} ("${version}")`);
|
|
46
|
+
}
|
|
47
|
+
api.addVersion(version);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
getDirectories(source) {
|
|
52
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
53
|
+
return (yield (0, promises_1.readdir)(source, { withFileTypes: true }))
|
|
54
|
+
.filter((dirent) => dirent.isDirectory())
|
|
55
|
+
.map((dirent) => dirent.name);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
checkReservedKeys(names) {
|
|
59
|
+
const reservedName = names.find((name) => RESERVED_VERSION_FOLDERS.includes(name));
|
|
60
|
+
if (reservedName) {
|
|
61
|
+
throw new AxeError_1.default(Enums_1.AxeErrorCode.RESERVED_VERSION_NAME, `You can not use a reserved name in the app directory: ${reservedName}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.default = VersionResolver;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import AcceptLanguageResolver from "./AcceptLanguageResolver";
|
|
2
2
|
import FileResolver from "./FileResolver";
|
|
3
|
-
import FolderResolver from "./FolderResolver";
|
|
4
3
|
import GeneralHookResolver from "./GeneralHookResolver";
|
|
5
4
|
import ModelResolver from "./ModelResolver";
|
|
6
5
|
import TransactionResolver from "./TransactionResolver";
|
|
6
|
+
import VersionConfigResolver from "./VersionConfigResolver";
|
|
7
|
+
import VersionResolver from "./VersionResolver";
|
|
7
8
|
import WithQueryResolver from "./WithQueryResolver";
|
|
8
|
-
export { AcceptLanguageResolver, FileResolver,
|
|
9
|
+
export { AcceptLanguageResolver, FileResolver, GeneralHookResolver, ModelResolver, TransactionResolver, VersionConfigResolver, VersionResolver, WithQueryResolver, };
|
|
@@ -3,18 +3,20 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.WithQueryResolver = exports.
|
|
6
|
+
exports.WithQueryResolver = exports.VersionResolver = exports.VersionConfigResolver = exports.TransactionResolver = exports.ModelResolver = exports.GeneralHookResolver = exports.FileResolver = exports.AcceptLanguageResolver = void 0;
|
|
7
7
|
const AcceptLanguageResolver_1 = __importDefault(require("./AcceptLanguageResolver"));
|
|
8
8
|
exports.AcceptLanguageResolver = AcceptLanguageResolver_1.default;
|
|
9
9
|
const FileResolver_1 = __importDefault(require("./FileResolver"));
|
|
10
10
|
exports.FileResolver = FileResolver_1.default;
|
|
11
|
-
const FolderResolver_1 = __importDefault(require("./FolderResolver"));
|
|
12
|
-
exports.FolderResolver = FolderResolver_1.default;
|
|
13
11
|
const GeneralHookResolver_1 = __importDefault(require("./GeneralHookResolver"));
|
|
14
12
|
exports.GeneralHookResolver = GeneralHookResolver_1.default;
|
|
15
13
|
const ModelResolver_1 = __importDefault(require("./ModelResolver"));
|
|
16
14
|
exports.ModelResolver = ModelResolver_1.default;
|
|
17
15
|
const TransactionResolver_1 = __importDefault(require("./TransactionResolver"));
|
|
18
16
|
exports.TransactionResolver = TransactionResolver_1.default;
|
|
17
|
+
const VersionConfigResolver_1 = __importDefault(require("./VersionConfigResolver"));
|
|
18
|
+
exports.VersionConfigResolver = VersionConfigResolver_1.default;
|
|
19
|
+
const VersionResolver_1 = __importDefault(require("./VersionResolver"));
|
|
20
|
+
exports.VersionResolver = VersionResolver_1.default;
|
|
19
21
|
const WithQueryResolver_1 = __importDefault(require("./WithQueryResolver"));
|
|
20
22
|
exports.WithQueryResolver = WithQueryResolver_1.default;
|
package/build/src/Server.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
declare class Server {
|
|
2
|
-
start(
|
|
2
|
+
start(rootFolder: string): Promise<void>;
|
|
3
3
|
private bindDependencies;
|
|
4
4
|
private loadExpress;
|
|
5
|
-
private
|
|
5
|
+
private analyzeVersions;
|
|
6
|
+
private loadGeneralConfiguration;
|
|
6
7
|
private listen;
|
|
7
8
|
}
|
|
8
9
|
export default Server;
|
package/build/src/Server.js
CHANGED
|
@@ -1,4 +1,27 @@
|
|
|
1
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
|
+
};
|
|
2
25
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
26
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
27
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -14,50 +37,51 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
14
37
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
38
|
const Resolvers_1 = require("./Resolvers");
|
|
16
39
|
const dotenv_1 = __importDefault(require("dotenv"));
|
|
40
|
+
const path_1 = __importDefault(require("path"));
|
|
17
41
|
const express_1 = __importDefault(require("express"));
|
|
18
42
|
const knex_1 = __importDefault(require("knex"));
|
|
19
43
|
const knex_schema_inspector_1 = __importDefault(require("knex-schema-inspector"));
|
|
20
44
|
const knex_paginate_1 = require("knex-paginate");
|
|
21
45
|
const Builders_1 = require("./Builders");
|
|
22
|
-
const HandlerFactory_1 = __importDefault(require("./Handlers/HandlerFactory"));
|
|
23
46
|
const Services_1 = require("./Services");
|
|
47
|
+
const DocsHandler_1 = __importDefault(require("./Handlers/DocsHandler"));
|
|
48
|
+
const RoutesHandler_1 = __importDefault(require("./Handlers/RoutesHandler"));
|
|
49
|
+
const Helpers_1 = require("./Helpers");
|
|
24
50
|
class Server {
|
|
25
|
-
start(
|
|
51
|
+
start(rootFolder) {
|
|
26
52
|
return __awaiter(this, void 0, void 0, function* () {
|
|
27
53
|
dotenv_1.default.config();
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
54
|
+
try {
|
|
55
|
+
yield this.bindDependencies(rootFolder);
|
|
56
|
+
yield this.loadGeneralConfiguration();
|
|
57
|
+
yield this.loadExpress();
|
|
58
|
+
yield this.analyzeVersions();
|
|
59
|
+
yield this.listen();
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (error.type === "AxeError") {
|
|
63
|
+
(0, Helpers_1.consoleAxeError)(error);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
36
69
|
});
|
|
37
70
|
}
|
|
38
|
-
bindDependencies(
|
|
71
|
+
bindDependencies(rootFolder) {
|
|
39
72
|
return __awaiter(this, void 0, void 0, function* () {
|
|
40
|
-
Services_1.
|
|
41
|
-
Services_1.
|
|
42
|
-
Services_1.IoCService.singleton("Models", () => models);
|
|
73
|
+
Services_1.APIService.setInsance(rootFolder);
|
|
74
|
+
const api = Services_1.APIService.getInstance();
|
|
43
75
|
Services_1.IoCService.singleton("SchemaInspector", () => knex_schema_inspector_1.default);
|
|
44
76
|
Services_1.IoCService.singleton("Database", () => __awaiter(this, void 0, void 0, function* () {
|
|
45
|
-
const
|
|
46
|
-
const database = (0, knex_1.default)(config.Database);
|
|
77
|
+
const database = (0, knex_1.default)(api.config.database);
|
|
47
78
|
(0, knex_paginate_1.attachPaginate)();
|
|
48
79
|
return database;
|
|
49
80
|
}));
|
|
50
81
|
Services_1.IoCService.singleton("App", () => __awaiter(this, void 0, void 0, function* () {
|
|
51
82
|
return (0, express_1.default)();
|
|
52
83
|
}));
|
|
53
|
-
Services_1.
|
|
54
|
-
return new HandlerFactory_1.default();
|
|
55
|
-
});
|
|
56
|
-
Services_1.IoCService.singleton("DocumentationService", () => __awaiter(this, void 0, void 0, function* () { return new Services_1.DocumentationService(); }));
|
|
57
|
-
Services_1.IoCService.singleton("LogService", () => __awaiter(this, void 0, void 0, function* () {
|
|
58
|
-
const config = yield Services_1.IoCService.use("Config");
|
|
59
|
-
return new Services_1.LogService(config.Application.logLevel);
|
|
60
|
-
}));
|
|
84
|
+
Services_1.LogService.setInstance(api.config.logLevel);
|
|
61
85
|
});
|
|
62
86
|
}
|
|
63
87
|
loadExpress() {
|
|
@@ -67,35 +91,38 @@ class Server {
|
|
|
67
91
|
app.use(express_1.default.json());
|
|
68
92
|
});
|
|
69
93
|
}
|
|
70
|
-
|
|
94
|
+
analyzeVersions() {
|
|
95
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
96
|
+
const api = Services_1.APIService.getInstance();
|
|
97
|
+
yield new Resolvers_1.VersionResolver().resolve();
|
|
98
|
+
for (const version of api.versions) {
|
|
99
|
+
yield new Resolvers_1.VersionConfigResolver(version).resolve();
|
|
100
|
+
yield new Resolvers_1.ModelResolver(version).resolve();
|
|
101
|
+
yield new Services_1.SchemaValidatorService(version).validate();
|
|
102
|
+
yield new Builders_1.ModelTreeBuilder(version).build();
|
|
103
|
+
yield new Builders_1.RouterBuilder(version).build();
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
loadGeneralConfiguration() {
|
|
71
108
|
return __awaiter(this, void 0, void 0, function* () {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
yield
|
|
75
|
-
|
|
109
|
+
const api = Services_1.APIService.getInstance();
|
|
110
|
+
const generalConfigFile = path_1.default.join(api.appFolder, "config");
|
|
111
|
+
const { default: content } = yield Promise.resolve(`${generalConfigFile}`).then(s => __importStar(require(s)));
|
|
112
|
+
api.setConfig(content);
|
|
76
113
|
});
|
|
77
114
|
}
|
|
78
115
|
listen() {
|
|
79
116
|
return __awaiter(this, void 0, void 0, function* () {
|
|
80
|
-
const config = yield Services_1.IoCService.use("Config");
|
|
81
117
|
const app = yield Services_1.IoCService.use("App");
|
|
82
|
-
const logger =
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
res.json({
|
|
88
|
-
routes: docs.get(),
|
|
89
|
-
modelTree,
|
|
90
|
-
});
|
|
91
|
-
}));
|
|
92
|
-
app.get("/docs/routes", (req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
93
|
-
const docs = yield Services_1.IoCService.useByType("DocumentationService");
|
|
94
|
-
res.json(docs.get().map((route) => `${route.method} ${route.url}`));
|
|
95
|
-
}));
|
|
118
|
+
const logger = Services_1.LogService.getInstance();
|
|
119
|
+
const api = Services_1.APIService.getInstance();
|
|
120
|
+
if (api.config.env === "development") {
|
|
121
|
+
app.get("/docs", DocsHandler_1.default);
|
|
122
|
+
app.get("/routes", RoutesHandler_1.default);
|
|
96
123
|
}
|
|
97
|
-
app.listen(config.
|
|
98
|
-
logger.info(`API listens requests on http://localhost:${config.
|
|
124
|
+
app.listen(api.config.port, () => {
|
|
125
|
+
logger.info(`API listens requests on http://localhost:${api.config.port}`);
|
|
99
126
|
});
|
|
100
127
|
});
|
|
101
128
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { IApplicationConfig, IVersion } from "../Interfaces";
|
|
2
|
+
declare class APIService {
|
|
3
|
+
private folders;
|
|
4
|
+
private static instance;
|
|
5
|
+
constructor(rootFolder: string);
|
|
6
|
+
static getInstance(): APIService;
|
|
7
|
+
static setInsance(rootFolder: string): void;
|
|
8
|
+
get rootFolder(): string;
|
|
9
|
+
get appFolder(): string;
|
|
10
|
+
get versions(): IVersion[];
|
|
11
|
+
get config(): IApplicationConfig;
|
|
12
|
+
setConfig(config: IApplicationConfig): void;
|
|
13
|
+
addVersion(name: string): void;
|
|
14
|
+
getVersion(name: string): IVersion;
|
|
15
|
+
}
|
|
16
|
+
export default APIService;
|
|
@@ -0,0 +1,82 @@
|
|
|
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
|
+
const Enums_1 = require("../Enums");
|
|
8
|
+
const ModelListService_1 = __importDefault(require("./ModelListService"));
|
|
9
|
+
class APIService {
|
|
10
|
+
constructor(rootFolder) {
|
|
11
|
+
this.folders = {
|
|
12
|
+
rootFolder: rootFolder,
|
|
13
|
+
appFolder: path_1.default.join(rootFolder, "app"),
|
|
14
|
+
versions: [],
|
|
15
|
+
config: {
|
|
16
|
+
env: "production",
|
|
17
|
+
port: 3000,
|
|
18
|
+
logLevel: Enums_1.LogLevels.INFO,
|
|
19
|
+
prefix: "/api",
|
|
20
|
+
database: {},
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
static getInstance() {
|
|
25
|
+
return APIService.instance;
|
|
26
|
+
}
|
|
27
|
+
static setInsance(rootFolder) {
|
|
28
|
+
if (APIService.instance) {
|
|
29
|
+
throw new Error(`The instance already created: ${APIService.name}`);
|
|
30
|
+
}
|
|
31
|
+
APIService.instance = new APIService(rootFolder);
|
|
32
|
+
}
|
|
33
|
+
get rootFolder() {
|
|
34
|
+
return this.folders.rootFolder;
|
|
35
|
+
}
|
|
36
|
+
get appFolder() {
|
|
37
|
+
return this.folders.appFolder;
|
|
38
|
+
}
|
|
39
|
+
get versions() {
|
|
40
|
+
return this.folders.versions;
|
|
41
|
+
}
|
|
42
|
+
get config() {
|
|
43
|
+
return this.folders.config;
|
|
44
|
+
}
|
|
45
|
+
setConfig(config) {
|
|
46
|
+
this.folders.config = config;
|
|
47
|
+
}
|
|
48
|
+
addVersion(name) {
|
|
49
|
+
const root = path_1.default.join(this.folders.appFolder, name);
|
|
50
|
+
this.folders.versions.push({
|
|
51
|
+
name,
|
|
52
|
+
config: {
|
|
53
|
+
transaction: [],
|
|
54
|
+
serializers: [],
|
|
55
|
+
supportedLanguages: ["en"],
|
|
56
|
+
defaultLanguage: "en",
|
|
57
|
+
query: {
|
|
58
|
+
limits: [],
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
folders: {
|
|
62
|
+
root,
|
|
63
|
+
config: path_1.default.join(root, "Config"),
|
|
64
|
+
events: path_1.default.join(root, "Events"),
|
|
65
|
+
hooks: path_1.default.join(root, "Hooks"),
|
|
66
|
+
middlewares: path_1.default.join(root, "Middlewares"),
|
|
67
|
+
models: path_1.default.join(root, "Models"),
|
|
68
|
+
serialization: path_1.default.join(root, "Serialization"),
|
|
69
|
+
},
|
|
70
|
+
modelList: new ModelListService_1.default([]),
|
|
71
|
+
modelTree: [],
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
getVersion(name) {
|
|
75
|
+
const version = this.folders.versions.find((i) => i.name === name);
|
|
76
|
+
if (!version) {
|
|
77
|
+
throw new Error(`Undefined version: ${version}`);
|
|
78
|
+
}
|
|
79
|
+
return version;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
exports.default = APIService;
|