@cryptexlabs/codex-nodejs-common 0.7.2 → 0.7.4
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/lib/package.json +4 -4
- package/lib/src/context/context.builder.d.ts +3 -3
- package/lib/src/context/context.builder.js.map +1 -1
- package/lib/src/exception/friendly-http-exception.d.ts +2 -1
- package/lib/src/exception/friendly-http-exception.js +2 -1
- package/lib/src/exception/friendly-http-exception.js.map +1 -1
- package/lib/src/filter/app-http-exception-filter.js +29 -11
- package/lib/src/filter/app-http-exception-filter.js.map +1 -1
- package/lib/src/util/locale.util.d.ts +2 -2
- package/lib/src/util/locale.util.js +4 -4
- package/lib/src/util/locale.util.js.map +1 -1
- package/package.json +4 -4
- package/src/context/context.builder.ts +3 -2
- package/src/exception/friendly-http-exception.ts +3 -1
- package/src/filter/app-http-exception-filter.ts +32 -12
- package/src/util/locale.util.spec.ts +21 -15
- package/src/util/locale.util.ts +10 -5
package/lib/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cryptexlabs/codex-nodejs-common",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.4",
|
|
4
4
|
"description": "Common code for Assistant applications",
|
|
5
5
|
"main": "lib/src/index.js",
|
|
6
6
|
"repository": "git@gitlab.com:cryptexlabs/public/codex-nodejs-common.git",
|
|
@@ -12,12 +12,12 @@
|
|
|
12
12
|
"Josh Woodcock <josh.woodcock@cryptexlabs.com>"
|
|
13
13
|
],
|
|
14
14
|
"peerDependencies": {
|
|
15
|
-
"@cryptexlabs/codex-data-model": "0.1.
|
|
15
|
+
"@cryptexlabs/codex-data-model": "0.1.6",
|
|
16
|
+
"@nestjs/common": "8.0.6",
|
|
17
|
+
"@nestjs/core": "8.0.6"
|
|
16
18
|
},
|
|
17
19
|
"dependencies": {
|
|
18
20
|
"@elastic/elasticsearch": "8.2.1",
|
|
19
|
-
"@nestjs/common": "8.0.6",
|
|
20
|
-
"@nestjs/core": "8.0.6",
|
|
21
21
|
"@nestjs/elasticsearch": "8.1.0",
|
|
22
22
|
"@nestjs/platform-socket.io": "8.0.6",
|
|
23
23
|
"@nestjs/platform-ws": "8.0.6",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="i18n" />
|
|
2
2
|
import { LoggerService } from "@nestjs/common";
|
|
3
|
-
import { ClientInterface, LocaleInterface, MessageContextInterface, MessageMetaInterface } from "@cryptexlabs/codex-data-model";
|
|
3
|
+
import { ApiMetaHeadersInterface, ClientInterface, LocaleInterface, MessageContextInterface, MessageMetaInterface } from "@cryptexlabs/codex-data-model";
|
|
4
4
|
import { DefaultConfig } from "../config";
|
|
5
5
|
import { Context } from "./context";
|
|
6
6
|
export declare class ContextBuilder {
|
|
@@ -15,8 +15,8 @@ export declare class ContextBuilder {
|
|
|
15
15
|
constructor(logger: LoggerService, config: DefaultConfig, client: ClientInterface, messageContext: MessageContextInterface, i18nApi?: i18nAPI);
|
|
16
16
|
build(): ContextBuilder;
|
|
17
17
|
setI18nApi(i18nApi: i18nAPI): this;
|
|
18
|
-
setMetaFromHeaders(headers:
|
|
19
|
-
setMetaFromHeadersForNewMessage(headers:
|
|
18
|
+
setMetaFromHeaders(headers: ApiMetaHeadersInterface): this;
|
|
19
|
+
setMetaFromHeadersForNewMessage(headers: ApiMetaHeadersInterface): this;
|
|
20
20
|
setMeta(meta: MessageMetaInterface): this;
|
|
21
21
|
setCorrelationId(correlationId: string): ContextBuilder;
|
|
22
22
|
setLocale(locale: LocaleInterface): this;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.builder.js","sourceRoot":"","sources":["../../../src/context/context.builder.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAA2D;AAC3D,
|
|
1
|
+
{"version":3,"file":"context.builder.js","sourceRoot":"","sources":["../../../src/context/context.builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,5 +3,6 @@ import { Context } from "../context";
|
|
|
3
3
|
export declare class FriendlyHttpException extends HttpException {
|
|
4
4
|
readonly context: Context;
|
|
5
5
|
readonly userMessage: string;
|
|
6
|
-
|
|
6
|
+
readonly stack: string;
|
|
7
|
+
constructor(response: string | Record<string, any>, context: Context, userMessage: string, status: HttpStatus, stack: string);
|
|
7
8
|
}
|
|
@@ -3,10 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.FriendlyHttpException = void 0;
|
|
4
4
|
const common_1 = require("@nestjs/common");
|
|
5
5
|
class FriendlyHttpException extends common_1.HttpException {
|
|
6
|
-
constructor(response, context, userMessage, status) {
|
|
6
|
+
constructor(response, context, userMessage, status, stack) {
|
|
7
7
|
super(response, status);
|
|
8
8
|
this.context = context;
|
|
9
9
|
this.userMessage = userMessage;
|
|
10
|
+
this.stack = stack;
|
|
10
11
|
}
|
|
11
12
|
}
|
|
12
13
|
exports.FriendlyHttpException = FriendlyHttpException;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"friendly-http-exception.js","sourceRoot":"","sources":["../../../src/exception/friendly-http-exception.ts"],"names":[],"mappings":";;;AAAA,2CAA2D;AAG3D,MAAa,qBAAsB,SAAQ,sBAAa;IACtD,YACE,QAAsC,EACtB,OAAgB,EAChB,WAAmB,EACnC,MAAkB;
|
|
1
|
+
{"version":3,"file":"friendly-http-exception.js","sourceRoot":"","sources":["../../../src/exception/friendly-http-exception.ts"],"names":[],"mappings":";;;AAAA,2CAA2D;AAG3D,MAAa,qBAAsB,SAAQ,sBAAa;IACtD,YACE,QAAsC,EACtB,OAAgB,EAChB,WAAmB,EACnC,MAAkB,EAEF,KAAa;QAE7B,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QANR,YAAO,GAAP,OAAO,CAAS;QAChB,gBAAW,GAAX,WAAW,CAAQ;QAGnB,UAAK,GAAL,KAAK,CAAQ;IAG/B,CAAC;CACF;AAXD,sDAWC"}
|
|
@@ -32,15 +32,30 @@ let AppHttpExceptionFilter = class AppHttpExceptionFilter extends core_1.BaseExc
|
|
|
32
32
|
const logger = exception instanceof exception_1.FriendlyHttpException
|
|
33
33
|
? exception.context.logger
|
|
34
34
|
: this.fallbackLogger;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
35
|
+
let developerText = this.getDeveloperText(exception, this.fallbackLocale);
|
|
36
|
+
const stack = exception.stack && typeof exception.stack === "string"
|
|
37
|
+
? exception.stack.split("\n").map((line) => line.trim())
|
|
38
|
+
: "No stack available. Very sad";
|
|
39
|
+
if (developerText) {
|
|
40
|
+
logger.error(developerText, {
|
|
41
|
+
request: {
|
|
42
|
+
headers: request.headers,
|
|
43
|
+
body: request.body,
|
|
44
|
+
url: request.url,
|
|
45
|
+
method: request.method,
|
|
46
|
+
stack,
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
logger.error([
|
|
52
|
+
"Error not explained",
|
|
53
|
+
"This probably means someone wrote code that throws an error without an error message",
|
|
54
|
+
"This should never happen!",
|
|
55
|
+
].join(". "), {
|
|
56
|
+
stack,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
44
59
|
if (!(exception instanceof common_1.HttpException) && exception.stack) {
|
|
45
60
|
logger.error(exception.stack);
|
|
46
61
|
}
|
|
@@ -57,8 +72,8 @@ let AppHttpExceptionFilter = class AppHttpExceptionFilter extends core_1.BaseExc
|
|
|
57
72
|
const started = exception instanceof exception_1.FriendlyHttpException
|
|
58
73
|
? exception.context.started
|
|
59
74
|
: undefined;
|
|
60
|
-
|
|
61
|
-
const userMessage = exception
|
|
75
|
+
developerText = this.getDeveloperText(exception, locale);
|
|
76
|
+
const userMessage = exception.userMessage ? exception.userMessage : "";
|
|
62
77
|
const errorHttpResponse = new response_1.ErrorHttpResponse(status, locale, new response_1.ErrorMessage(locale, locales_1.i18nData, null, null, developerText, userMessage), exception.stack || null, this.config, correlationId, started);
|
|
63
78
|
response.status(status).json(errorHttpResponse);
|
|
64
79
|
}
|
|
@@ -80,6 +95,9 @@ let AppHttpExceptionFilter = class AppHttpExceptionFilter extends core_1.BaseExc
|
|
|
80
95
|
else if (exception.message.message) {
|
|
81
96
|
developerText = exception.message.message;
|
|
82
97
|
}
|
|
98
|
+
else if (exception.getResponse) {
|
|
99
|
+
developerText = exception.getResponse();
|
|
100
|
+
}
|
|
83
101
|
else {
|
|
84
102
|
developerText = exception.message;
|
|
85
103
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-http-exception-filter.js","sourceRoot":"","sources":["../../../src/filter/app-http-exception-filter.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAQwB;AACxB,uCAAmD;AAEnD,0CAA8D;AAC9D,4CAAqD;AACrD,oEAAuD;AACvD,gDAA8C;AAC9C,0CAA8C;AAC9C,sCAA0C;AAI1C,IAAa,sBAAsB,GAAnC,MAAa,sBAAuB,SAAQ,0BAAmB;IAC7D,YACmB,cAAsB,EACtB,cAA6B,EAC7B,MAAqB,EACtC,cAA2B;QAE3B,KAAK,CAAC,cAAc,CAAC,CAAC;QALL,mBAAc,GAAd,cAAc,CAAQ;QACtB,mBAAc,GAAd,cAAc,CAAe;QAC7B,WAAM,GAAN,MAAM,CAAe;IAIxC,CAAC;IAED,KAAK,CAAC,SAAc,EAAE,IAAmB;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAW,CAAC;QAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAEnC,MAAM,MAAM,GACV,SAAS,YAAY,iCAAqB;YACxC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM;YAC1B,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;QAE1B,MAAM,CAAC,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"app-http-exception-filter.js","sourceRoot":"","sources":["../../../src/filter/app-http-exception-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Locale } from "@cryptexlabs/codex-data-model";
|
|
1
|
+
import { ApiMetaHeadersInterface, Locale } from "@cryptexlabs/codex-data-model";
|
|
2
2
|
import { Context } from "../context";
|
|
3
3
|
export declare class LocaleUtil {
|
|
4
4
|
static getLocaleFromAcceptLanguageHeader(context: Context, langCode: string): Locale;
|
|
5
|
-
static getLocaleFromHeaders(headers:
|
|
5
|
+
static getLocaleFromHeaders(headers: ApiMetaHeadersInterface, context: Context): Locale;
|
|
6
6
|
}
|
|
@@ -8,7 +8,7 @@ const locales_1 = require("../locales/locales");
|
|
|
8
8
|
class LocaleUtil {
|
|
9
9
|
static getLocaleFromAcceptLanguageHeader(context, langCode) {
|
|
10
10
|
if (!langCode) {
|
|
11
|
-
throw new exception_1.FriendlyHttpException(`Accept language header is not set`, context, locales_1.i18nData.__({ phrase: "an-error-occurred", locale: "en-US" }), common_1.HttpStatus.BAD_REQUEST);
|
|
11
|
+
throw new exception_1.FriendlyHttpException(`Accept language header is not set`, context, locales_1.i18nData.__({ phrase: "an-error-occurred", locale: "en-US" }), common_1.HttpStatus.BAD_REQUEST, "LocaleUtil\ngetLocaleFromAcceptLanguageHeader");
|
|
12
12
|
}
|
|
13
13
|
const parts = langCode.split("-");
|
|
14
14
|
let language;
|
|
@@ -23,7 +23,7 @@ class LocaleUtil {
|
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
if (!language || !country) {
|
|
26
|
-
throw new exception_1.FriendlyHttpException(`Invalid Accept-Language header: ${langCode}`, context, locales_1.i18nData.__({ phrase: "language-not-supported", locale: "en-US" }), common_1.HttpStatus.BAD_REQUEST);
|
|
26
|
+
throw new exception_1.FriendlyHttpException(`Invalid Accept-Language header: ${langCode}`, context, locales_1.i18nData.__({ phrase: "language-not-supported", locale: "en-US" }), common_1.HttpStatus.BAD_REQUEST, "LocaleUtil\ngetLocaleFromAcceptLanguageHeader");
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
else {
|
|
@@ -39,10 +39,10 @@ class LocaleUtil {
|
|
|
39
39
|
}
|
|
40
40
|
country = country.split(",")[0];
|
|
41
41
|
if (!codex_data_model_1.ValidLanguageCodes.includes(language)) {
|
|
42
|
-
throw new exception_1.FriendlyHttpException(`Invalid language code: ${country}`, context, locales_1.i18nData.__({ phrase: "language-not-supported", locale: "en-US" }), common_1.HttpStatus.NOT_ACCEPTABLE);
|
|
42
|
+
throw new exception_1.FriendlyHttpException(`Invalid language code: ${country}`, context, locales_1.i18nData.__({ phrase: "language-not-supported", locale: "en-US" }), common_1.HttpStatus.NOT_ACCEPTABLE, "LocaleUtil\ngetLocaleFromAcceptLanguageHeader");
|
|
43
43
|
}
|
|
44
44
|
if (!codex_data_model_1.ValidCountryCodes.includes(country)) {
|
|
45
|
-
throw new exception_1.FriendlyHttpException(`Invalid country code: ${country}`, context, locales_1.i18nData.__({ phrase: "language-not-supported", locale: "en-US" }), common_1.HttpStatus.NOT_ACCEPTABLE);
|
|
45
|
+
throw new exception_1.FriendlyHttpException(`Invalid country code: ${country}`, context, locales_1.i18nData.__({ phrase: "language-not-supported", locale: "en-US" }), common_1.HttpStatus.NOT_ACCEPTABLE, "LocaleUtil\ngetLocaleFromAcceptLanguageHeader");
|
|
46
46
|
}
|
|
47
47
|
return new codex_data_model_1.Locale(language, country);
|
|
48
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locale.util.js","sourceRoot":"","sources":["../../../src/util/locale.util.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"locale.util.js","sourceRoot":"","sources":["../../../src/util/locale.util.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cryptexlabs/codex-nodejs-common",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.4",
|
|
4
4
|
"description": "Common code for Assistant applications",
|
|
5
5
|
"main": "lib/src/index.js",
|
|
6
6
|
"repository": "git@gitlab.com:cryptexlabs/public/codex-nodejs-common.git",
|
|
@@ -12,12 +12,12 @@
|
|
|
12
12
|
"Josh Woodcock <josh.woodcock@cryptexlabs.com>"
|
|
13
13
|
],
|
|
14
14
|
"peerDependencies": {
|
|
15
|
-
"@cryptexlabs/codex-data-model": "0.1.
|
|
15
|
+
"@cryptexlabs/codex-data-model": "0.1.6",
|
|
16
|
+
"@nestjs/common": "8.0.6",
|
|
17
|
+
"@nestjs/core": "8.0.6"
|
|
16
18
|
},
|
|
17
19
|
"dependencies": {
|
|
18
20
|
"@elastic/elasticsearch": "8.2.1",
|
|
19
|
-
"@nestjs/common": "8.0.6",
|
|
20
|
-
"@nestjs/core": "8.0.6",
|
|
21
21
|
"@nestjs/elasticsearch": "8.1.0",
|
|
22
22
|
"@nestjs/platform-socket.io": "8.0.6",
|
|
23
23
|
"@nestjs/platform-ws": "8.0.6",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Injectable, LoggerService } from "@nestjs/common";
|
|
2
2
|
import {
|
|
3
|
+
ApiMetaHeadersInterface,
|
|
3
4
|
ClientInterface,
|
|
4
5
|
Locale,
|
|
5
6
|
LocaleI18nInterface,
|
|
@@ -41,7 +42,7 @@ export class ContextBuilder {
|
|
|
41
42
|
return this;
|
|
42
43
|
}
|
|
43
44
|
|
|
44
|
-
public setMetaFromHeaders(headers:
|
|
45
|
+
public setMetaFromHeaders(headers: ApiMetaHeadersInterface) {
|
|
45
46
|
this.setMetaFromHeadersForNewMessage(headers);
|
|
46
47
|
if (headers["x-client-version"]) {
|
|
47
48
|
this.client.version = headers["x-client-version"];
|
|
@@ -59,7 +60,7 @@ export class ContextBuilder {
|
|
|
59
60
|
return this;
|
|
60
61
|
}
|
|
61
62
|
|
|
62
|
-
public setMetaFromHeadersForNewMessage(headers:
|
|
63
|
+
public setMetaFromHeadersForNewMessage(headers: ApiMetaHeadersInterface) {
|
|
63
64
|
this.setCorrelationId(headers["x-correlation-id"]);
|
|
64
65
|
this.setLocale(LocaleUtil.getLocaleFromHeaders(headers, this.getResult()));
|
|
65
66
|
this.setStarted(headers["x-started"]);
|
|
@@ -6,7 +6,9 @@ export class FriendlyHttpException extends HttpException {
|
|
|
6
6
|
response: string | Record<string, any>,
|
|
7
7
|
public readonly context: Context,
|
|
8
8
|
public readonly userMessage: string,
|
|
9
|
-
status: HttpStatus
|
|
9
|
+
status: HttpStatus,
|
|
10
|
+
|
|
11
|
+
public readonly stack: string
|
|
10
12
|
) {
|
|
11
13
|
super(response, status);
|
|
12
14
|
}
|
|
@@ -38,15 +38,34 @@ export class AppHttpExceptionFilter extends BaseExceptionFilter {
|
|
|
38
38
|
? exception.context.logger
|
|
39
39
|
: this.fallbackLogger;
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
41
|
+
let developerText = this.getDeveloperText(exception, this.fallbackLocale);
|
|
42
|
+
const stack =
|
|
43
|
+
exception.stack && typeof exception.stack === "string"
|
|
44
|
+
? exception.stack.split("\n").map((line) => line.trim())
|
|
45
|
+
: "No stack available. Very sad";
|
|
46
|
+
|
|
47
|
+
if (developerText) {
|
|
48
|
+
logger.error(developerText, {
|
|
49
|
+
request: {
|
|
50
|
+
headers: request.headers,
|
|
51
|
+
body: request.body,
|
|
52
|
+
url: request.url,
|
|
53
|
+
method: request.method,
|
|
54
|
+
stack,
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
} else {
|
|
58
|
+
logger.error(
|
|
59
|
+
[
|
|
60
|
+
"Error not explained",
|
|
61
|
+
"This probably means someone wrote code that throws an error without an error message",
|
|
62
|
+
"This should never happen!",
|
|
63
|
+
].join(". "),
|
|
64
|
+
{
|
|
65
|
+
stack,
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
}
|
|
50
69
|
|
|
51
70
|
// If this is a normal error it means something random occurred and we want the stacktrace
|
|
52
71
|
if (!(exception instanceof HttpException) && exception.stack) {
|
|
@@ -74,10 +93,9 @@ export class AppHttpExceptionFilter extends BaseExceptionFilter {
|
|
|
74
93
|
? exception.context.started
|
|
75
94
|
: undefined;
|
|
76
95
|
|
|
77
|
-
|
|
96
|
+
developerText = this.getDeveloperText(exception, locale);
|
|
78
97
|
|
|
79
|
-
const userMessage =
|
|
80
|
-
exception instanceof FriendlyHttpException ? exception.userMessage : "";
|
|
98
|
+
const userMessage = exception.userMessage ? exception.userMessage : "";
|
|
81
99
|
|
|
82
100
|
const errorHttpResponse = new ErrorHttpResponse(
|
|
83
101
|
status,
|
|
@@ -114,6 +132,8 @@ export class AppHttpExceptionFilter extends BaseExceptionFilter {
|
|
|
114
132
|
}
|
|
115
133
|
} else if (exception.message.message) {
|
|
116
134
|
developerText = exception.message.message;
|
|
135
|
+
} else if (exception.getResponse) {
|
|
136
|
+
developerText = exception.getResponse();
|
|
117
137
|
} else {
|
|
118
138
|
developerText = exception.message;
|
|
119
139
|
}
|
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
import { LocaleUtil } from "./locale.util";
|
|
2
2
|
import { HttpException } from "@nestjs/common";
|
|
3
3
|
import { FriendlyHttpException } from "../exception";
|
|
4
|
+
import {
|
|
5
|
+
ApiMetaHeadersInterface,
|
|
6
|
+
CountryLanguageCombination,
|
|
7
|
+
} from "@cryptexlabs/codex-data-model";
|
|
4
8
|
|
|
5
9
|
describe("LocaleUtil", () => {
|
|
6
10
|
describe("getLocaleFromHeaders", () => {
|
|
7
11
|
it("Should throw error when no accept language header is specified", () => {
|
|
8
12
|
expect(() => {
|
|
9
|
-
LocaleUtil.getLocaleFromHeaders({}, null);
|
|
13
|
+
LocaleUtil.getLocaleFromHeaders({} as ApiMetaHeadersInterface, null);
|
|
10
14
|
}).toThrow(HttpException);
|
|
11
15
|
});
|
|
12
16
|
|
|
13
17
|
it("Should parse a normal header", () => {
|
|
14
18
|
const locale = LocaleUtil.getLocaleFromHeaders(
|
|
15
19
|
{
|
|
16
|
-
"
|
|
17
|
-
},
|
|
20
|
+
"accept-language": "en-US",
|
|
21
|
+
} as ApiMetaHeadersInterface,
|
|
18
22
|
null
|
|
19
23
|
);
|
|
20
24
|
expect(locale.language).toBe("en");
|
|
@@ -25,7 +29,7 @@ describe("LocaleUtil", () => {
|
|
|
25
29
|
const locale = LocaleUtil.getLocaleFromHeaders(
|
|
26
30
|
{
|
|
27
31
|
"accept-language": "en-US",
|
|
28
|
-
},
|
|
32
|
+
} as ApiMetaHeadersInterface,
|
|
29
33
|
null
|
|
30
34
|
);
|
|
31
35
|
expect(locale.language).toBe("en");
|
|
@@ -35,8 +39,8 @@ describe("LocaleUtil", () => {
|
|
|
35
39
|
it("Should parse a double language", () => {
|
|
36
40
|
const locale = LocaleUtil.getLocaleFromHeaders(
|
|
37
41
|
{
|
|
38
|
-
"accept-language": "en-US,us",
|
|
39
|
-
},
|
|
42
|
+
"accept-language": "en-US,us" as CountryLanguageCombination,
|
|
43
|
+
} as ApiMetaHeadersInterface,
|
|
40
44
|
null
|
|
41
45
|
);
|
|
42
46
|
expect(locale.language).toBe("en");
|
|
@@ -46,8 +50,8 @@ describe("LocaleUtil", () => {
|
|
|
46
50
|
it("Should parse an uppercase language code in header", () => {
|
|
47
51
|
const locale = LocaleUtil.getLocaleFromHeaders(
|
|
48
52
|
{
|
|
49
|
-
"accept-language": "EN-US",
|
|
50
|
-
},
|
|
53
|
+
"accept-language": "EN-US" as CountryLanguageCombination,
|
|
54
|
+
} as ApiMetaHeadersInterface,
|
|
51
55
|
null
|
|
52
56
|
);
|
|
53
57
|
expect(locale.language).toBe("en");
|
|
@@ -57,8 +61,8 @@ describe("LocaleUtil", () => {
|
|
|
57
61
|
it("Should parse a lowercase country code in header", () => {
|
|
58
62
|
const locale = LocaleUtil.getLocaleFromHeaders(
|
|
59
63
|
{
|
|
60
|
-
"accept-language": "en-us",
|
|
61
|
-
},
|
|
64
|
+
"accept-language": "en-us" as CountryLanguageCombination,
|
|
65
|
+
} as ApiMetaHeadersInterface,
|
|
62
66
|
null
|
|
63
67
|
);
|
|
64
68
|
expect(locale.language).toBe("en");
|
|
@@ -68,8 +72,8 @@ describe("LocaleUtil", () => {
|
|
|
68
72
|
it("Should parse an accept language in the format: 'US,EN;Q=0.9'", () => {
|
|
69
73
|
const locale = LocaleUtil.getLocaleFromHeaders(
|
|
70
74
|
{
|
|
71
|
-
"accept-language": "US,EN;Q=0.9",
|
|
72
|
-
},
|
|
75
|
+
"accept-language": "US,EN;Q=0.9" as CountryLanguageCombination,
|
|
76
|
+
} as ApiMetaHeadersInterface,
|
|
73
77
|
null
|
|
74
78
|
);
|
|
75
79
|
expect(locale.language).toBe("en");
|
|
@@ -79,8 +83,8 @@ describe("LocaleUtil", () => {
|
|
|
79
83
|
it("Should parse an accept language in the format: 'en-US,en;q=0.9'", () => {
|
|
80
84
|
const locale = LocaleUtil.getLocaleFromHeaders(
|
|
81
85
|
{
|
|
82
|
-
"accept-language": " en-US,en;q=0.9",
|
|
83
|
-
},
|
|
86
|
+
"accept-language": " en-US,en;q=0.9" as CountryLanguageCombination,
|
|
87
|
+
} as ApiMetaHeadersInterface,
|
|
84
88
|
null
|
|
85
89
|
);
|
|
86
90
|
expect(locale.language).toBe("en");
|
|
@@ -90,7 +94,9 @@ describe("LocaleUtil", () => {
|
|
|
90
94
|
it("Should throw an error for an invalid country code", () => {
|
|
91
95
|
expect(() => {
|
|
92
96
|
LocaleUtil.getLocaleFromHeaders(
|
|
93
|
-
{
|
|
97
|
+
{
|
|
98
|
+
"accept-language": "asldkafsdj-*" as CountryLanguageCombination,
|
|
99
|
+
} as ApiMetaHeadersInterface,
|
|
94
100
|
null
|
|
95
101
|
);
|
|
96
102
|
}).toThrow(FriendlyHttpException);
|
package/src/util/locale.util.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
+
ApiMetaHeadersInterface,
|
|
2
3
|
CountryCode,
|
|
3
4
|
LanguageCode,
|
|
4
5
|
Locale,
|
|
@@ -20,7 +21,8 @@ export class LocaleUtil {
|
|
|
20
21
|
`Accept language header is not set`,
|
|
21
22
|
context,
|
|
22
23
|
i18nData.__({ phrase: "an-error-occurred", locale: "en-US" }),
|
|
23
|
-
HttpStatus.BAD_REQUEST
|
|
24
|
+
HttpStatus.BAD_REQUEST,
|
|
25
|
+
"LocaleUtil\ngetLocaleFromAcceptLanguageHeader"
|
|
24
26
|
);
|
|
25
27
|
}
|
|
26
28
|
const parts = langCode.split("-");
|
|
@@ -42,7 +44,8 @@ export class LocaleUtil {
|
|
|
42
44
|
`Invalid Accept-Language header: ${langCode}`,
|
|
43
45
|
context,
|
|
44
46
|
i18nData.__({ phrase: "language-not-supported", locale: "en-US" }),
|
|
45
|
-
HttpStatus.BAD_REQUEST
|
|
47
|
+
HttpStatus.BAD_REQUEST,
|
|
48
|
+
"LocaleUtil\ngetLocaleFromAcceptLanguageHeader"
|
|
46
49
|
);
|
|
47
50
|
}
|
|
48
51
|
} else {
|
|
@@ -64,7 +67,8 @@ export class LocaleUtil {
|
|
|
64
67
|
`Invalid language code: ${country}`,
|
|
65
68
|
context,
|
|
66
69
|
i18nData.__({ phrase: "language-not-supported", locale: "en-US" }),
|
|
67
|
-
HttpStatus.NOT_ACCEPTABLE
|
|
70
|
+
HttpStatus.NOT_ACCEPTABLE,
|
|
71
|
+
"LocaleUtil\ngetLocaleFromAcceptLanguageHeader"
|
|
68
72
|
);
|
|
69
73
|
}
|
|
70
74
|
if (!ValidCountryCodes.includes(country)) {
|
|
@@ -72,7 +76,8 @@ export class LocaleUtil {
|
|
|
72
76
|
`Invalid country code: ${country}`,
|
|
73
77
|
context,
|
|
74
78
|
i18nData.__({ phrase: "language-not-supported", locale: "en-US" }),
|
|
75
|
-
HttpStatus.NOT_ACCEPTABLE
|
|
79
|
+
HttpStatus.NOT_ACCEPTABLE,
|
|
80
|
+
"LocaleUtil\ngetLocaleFromAcceptLanguageHeader"
|
|
76
81
|
);
|
|
77
82
|
}
|
|
78
83
|
|
|
@@ -80,7 +85,7 @@ export class LocaleUtil {
|
|
|
80
85
|
}
|
|
81
86
|
|
|
82
87
|
public static getLocaleFromHeaders(
|
|
83
|
-
headers:
|
|
88
|
+
headers: ApiMetaHeadersInterface,
|
|
84
89
|
context: Context
|
|
85
90
|
) {
|
|
86
91
|
const langCode = headers["accept-language"] || headers["Accept-Language"];
|