axe-api 0.20.4 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/build/src/Handlers/PatchHandler.js +1 -1
- package/build/src/Handlers/StoreHandler.js +1 -1
- package/build/src/Handlers/UpdateHandler.js +1 -1
- package/build/src/Interfaces.d.ts +10 -0
- package/build/src/Middlewares/acceptLanguageMiddleware.js +6 -15
- package/build/src/Resolvers/AcceptLanguageResolver.d.ts +7 -0
- package/build/src/Resolvers/AcceptLanguageResolver.js +66 -0
- package/build/src/Resolvers/index.d.ts +2 -1
- package/build/src/Resolvers/index.js +3 -1
- package/package.json +1 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Release Notes
|
|
2
2
|
|
|
3
|
+
## [0.21.0 (2022-12-28)](https://github.com/axe-api/axe-api/compare/0.21.0...0.20.4)
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- Added `i18n` support. [#44](https://github.com/axe-api/axe-api/issues/44)
|
|
8
|
+
|
|
3
9
|
## [0.20.4 (2022-12-24)](https://github.com/axe-api/axe-api/compare/0.20.4...0.20.3)
|
|
4
10
|
|
|
5
11
|
### Fixed
|
|
@@ -36,7 +36,7 @@ exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
36
36
|
const validationRules = model.instance.getValidationRules(requestMethod);
|
|
37
37
|
if (validationRules) {
|
|
38
38
|
// The validation language should be set
|
|
39
|
-
validatorjs_1.default.useLang(req.language);
|
|
39
|
+
validatorjs_1.default.useLang(req.currentLanguage.language);
|
|
40
40
|
// Validate the data
|
|
41
41
|
const validation = new validatorjs_1.default(formData, validationRules);
|
|
42
42
|
if (validation.fails()) {
|
|
@@ -23,7 +23,7 @@ exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
23
23
|
const validationRules = model.instance.getValidationRules(requestMethod);
|
|
24
24
|
if (validationRules) {
|
|
25
25
|
// The validation language should be set
|
|
26
|
-
validatorjs_1.default.useLang(req.language);
|
|
26
|
+
validatorjs_1.default.useLang(req.currentLanguage.language);
|
|
27
27
|
// Validate the data
|
|
28
28
|
const validation = new validatorjs_1.default(formData, validationRules);
|
|
29
29
|
if (validation.fails()) {
|
|
@@ -36,7 +36,7 @@ exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
36
36
|
const validationRules = model.instance.getValidationRules(requestMethod);
|
|
37
37
|
if (validationRules) {
|
|
38
38
|
// The validation language should be set
|
|
39
|
-
validatorjs_1.default.useLang(req.language);
|
|
39
|
+
validatorjs_1.default.useLang(req.currentLanguage.language);
|
|
40
40
|
// Validate the data
|
|
41
41
|
const validation = new validatorjs_1.default(formData, validationRules);
|
|
42
42
|
if (validation.fails()) {
|
|
@@ -23,8 +23,18 @@ export interface IApplicationConfig extends IConfig {
|
|
|
23
23
|
prefix: string;
|
|
24
24
|
transaction: boolean | IHandlerBasedTransactionConfig | IHandlerBasedTransactionConfig[];
|
|
25
25
|
serializers: ((data: any, request: Request) => void)[] | IHandlerBasedSerializer[];
|
|
26
|
+
supportedLanguages: string[];
|
|
26
27
|
defaultLanguage: string;
|
|
27
28
|
}
|
|
29
|
+
export interface ILanguage {
|
|
30
|
+
title: string;
|
|
31
|
+
language: string;
|
|
32
|
+
region?: string | null;
|
|
33
|
+
}
|
|
34
|
+
export interface IAcceptedLanguage {
|
|
35
|
+
language: ILanguage;
|
|
36
|
+
quality: number;
|
|
37
|
+
}
|
|
28
38
|
export declare type IDatabaseConfig = Knex.Config;
|
|
29
39
|
export interface IFolders {
|
|
30
40
|
App: string;
|
|
@@ -8,26 +8,17 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
const accept_language_parser_1 = __importDefault(require("accept-language-parser"));
|
|
16
12
|
const Services_1 = require("../Services");
|
|
13
|
+
const Resolvers_1 = require("../Resolvers");
|
|
17
14
|
exports.default = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
|
-
var _a;
|
|
19
15
|
// Application configuration is need for the default setting.
|
|
20
16
|
const configs = yield Services_1.IoCService.use("Config");
|
|
21
17
|
const application = configs.Application;
|
|
22
|
-
const { defaultLanguage } = application;
|
|
23
|
-
//
|
|
24
|
-
req.
|
|
25
|
-
//
|
|
26
|
-
|
|
27
|
-
// be carried by Express.Request
|
|
28
|
-
req.language =
|
|
29
|
-
req.acceptedLanguages.length > 0
|
|
30
|
-
? ((_a = req.acceptedLanguages.at(0)) === null || _a === void 0 ? void 0 : _a.code) || defaultLanguage
|
|
31
|
-
: defaultLanguage;
|
|
18
|
+
const { supportedLanguages, defaultLanguage } = application;
|
|
19
|
+
// Setting the current language by the supported, default and the client prefences
|
|
20
|
+
req.currentLanguage = Resolvers_1.AcceptLanguageResolver.resolve(req.get("accept-language") || "", supportedLanguages || ["en"], defaultLanguage || "en");
|
|
21
|
+
// Adding the `Content-Language` header to the response object
|
|
22
|
+
res.setHeader("Content-Language", req.currentLanguage.title);
|
|
32
23
|
next();
|
|
33
24
|
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ILanguage } from "../Interfaces";
|
|
2
|
+
declare class AcceptLanguageResolver {
|
|
3
|
+
static resolve(value: string, supportedLanguages: string[], defaultLanguage: string): ILanguage;
|
|
4
|
+
static toLanguageObject(key?: string): ILanguage;
|
|
5
|
+
private static toSortedPreferences;
|
|
6
|
+
}
|
|
7
|
+
export default AcceptLanguageResolver;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class AcceptLanguageResolver {
|
|
4
|
+
static resolve(value, supportedLanguages, defaultLanguage) {
|
|
5
|
+
value = value.trim();
|
|
6
|
+
if (value === "*") {
|
|
7
|
+
return this.toLanguageObject(defaultLanguage);
|
|
8
|
+
}
|
|
9
|
+
const languages = this.toSortedPreferences(value);
|
|
10
|
+
const perfectMatch = languages.find((item) => supportedLanguages.includes(item.language.title));
|
|
11
|
+
const anyMatch = languages.find((item) => supportedLanguages.includes(item.language.language));
|
|
12
|
+
if (perfectMatch && !anyMatch) {
|
|
13
|
+
return perfectMatch.language;
|
|
14
|
+
}
|
|
15
|
+
if (!perfectMatch && anyMatch) {
|
|
16
|
+
return anyMatch.language;
|
|
17
|
+
}
|
|
18
|
+
if (perfectMatch && anyMatch) {
|
|
19
|
+
if (perfectMatch.quality >= anyMatch.quality) {
|
|
20
|
+
return perfectMatch.language;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
return this.toLanguageObject(anyMatch.language.language);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return this.toLanguageObject(defaultLanguage);
|
|
27
|
+
}
|
|
28
|
+
static toLanguageObject(key = "") {
|
|
29
|
+
const [language, region] = key.split("-");
|
|
30
|
+
return {
|
|
31
|
+
title: key,
|
|
32
|
+
language,
|
|
33
|
+
region: region || null,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
static toSortedPreferences(value) {
|
|
37
|
+
// Splitting by language definitons
|
|
38
|
+
const keys = value.split(",").map((key) => key.trim());
|
|
39
|
+
const languages = [];
|
|
40
|
+
for (const key of keys) {
|
|
41
|
+
// Splitting by the quality values
|
|
42
|
+
const [code, quality] = key.split(";");
|
|
43
|
+
// Parsing the language code and the quality value
|
|
44
|
+
const item = {
|
|
45
|
+
language: this.toLanguageObject(code),
|
|
46
|
+
quality: quality ? parseFloat(quality.replace("q=", "")) : 1,
|
|
47
|
+
};
|
|
48
|
+
languages.push(item);
|
|
49
|
+
}
|
|
50
|
+
// Sorting ASC
|
|
51
|
+
languages.sort((a, b) => {
|
|
52
|
+
if (a.quality === b.quality) {
|
|
53
|
+
return 0;
|
|
54
|
+
}
|
|
55
|
+
if (a.quality === null) {
|
|
56
|
+
return 1;
|
|
57
|
+
}
|
|
58
|
+
if (b.quality === null) {
|
|
59
|
+
return -1;
|
|
60
|
+
}
|
|
61
|
+
return a.quality < b.quality ? 1 : -1;
|
|
62
|
+
});
|
|
63
|
+
return languages;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.default = AcceptLanguageResolver;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import AcceptLanguageResolver from "./AcceptLanguageResolver";
|
|
1
2
|
import FileResolver from "./FileResolver";
|
|
2
3
|
import FolderResolver from "./FolderResolver";
|
|
3
4
|
import GeneralHookResolver from "./GeneralHookResolver";
|
|
4
5
|
import ModelResolver from "./ModelResolver";
|
|
5
6
|
import TransactionResolver from "./TransactionResolver";
|
|
6
7
|
import WithQueryResolver from "./WithQueryResolver";
|
|
7
|
-
export { FileResolver, FolderResolver, GeneralHookResolver, ModelResolver, TransactionResolver, WithQueryResolver, };
|
|
8
|
+
export { AcceptLanguageResolver, FileResolver, FolderResolver, GeneralHookResolver, ModelResolver, TransactionResolver, WithQueryResolver, };
|
|
@@ -3,7 +3,9 @@ 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.TransactionResolver = exports.ModelResolver = exports.GeneralHookResolver = exports.FolderResolver = exports.FileResolver = void 0;
|
|
6
|
+
exports.WithQueryResolver = exports.TransactionResolver = exports.ModelResolver = exports.GeneralHookResolver = exports.FolderResolver = exports.FileResolver = exports.AcceptLanguageResolver = void 0;
|
|
7
|
+
const AcceptLanguageResolver_1 = __importDefault(require("./AcceptLanguageResolver"));
|
|
8
|
+
exports.AcceptLanguageResolver = AcceptLanguageResolver_1.default;
|
|
7
9
|
const FileResolver_1 = __importDefault(require("./FileResolver"));
|
|
8
10
|
exports.FileResolver = FileResolver_1.default;
|
|
9
11
|
const FolderResolver_1 = __importDefault(require("./FolderResolver"));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "axe-api",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.0",
|
|
4
4
|
"description": "AXE API is a simple tool which has been created based on Express and Knex.js to create Rest APIs quickly.",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -30,7 +30,6 @@
|
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@types/express": "^4.17.15",
|
|
33
|
-
"accept-language-parser": "^1.5.0",
|
|
34
33
|
"change-case": "^4.1.2",
|
|
35
34
|
"dotenv": "^14.2.0",
|
|
36
35
|
"express": "^4.18.2",
|