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 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
- // Parsing the `accept-language` value
24
- req.acceptedLanguages = accept_language_parser_1.default.parse(req.headers["accept-language"] || defaultLanguage);
25
- // Getting the current language by the accept-langauge and the default language
26
- // value. This values can be used anywhere in the API because the values would
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.20.4",
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",