@squiz/dx-common-lib 1.39.1-alpha.9 → 1.40.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/.npm/_logs/{2023-06-26T08_03_09_170Z-debug-0.log → 2023-07-06T01_50_58_148Z-debug-0.log} +15 -15
- package/lib/api-key-validation/ApiKeyValidationService.d.ts +8 -3
- package/lib/api-key-validation/CloudflareApiKeyService.d.ts +9 -4
- package/lib/api-key-validation/CloudflareApiKeyService.js +24 -12
- package/lib/api-key-validation/CloudflareApiKeyService.js.map +1 -1
- package/lib/api-key-validation/CloudflareApiKeyService.spec.js +26 -23
- package/lib/api-key-validation/CloudflareApiKeyService.spec.js.map +1 -1
- package/lib/api-key-validation/DevelopmentApiKeyService.d.ts +8 -3
- package/lib/api-key-validation/DevelopmentApiKeyService.js +14 -5
- package/lib/api-key-validation/DevelopmentApiKeyService.js.map +1 -1
- package/lib/api-key-validation/DevelopmentApiKeyService.spec.js +10 -6
- package/lib/api-key-validation/DevelopmentApiKeyService.spec.js.map +1 -1
- package/lib/assertions/assertIsArray.d.ts +1 -0
- package/lib/assertions/assertIsArray.js +15 -0
- package/lib/assertions/assertIsArray.js.map +1 -0
- package/lib/assertions/assertIsArray.spec.js +16 -0
- package/lib/assertions/assertIsArray.spec.js.map +1 -0
- package/lib/assertions/index.d.ts +1 -0
- package/lib/assertions/index.js +1 -0
- package/lib/assertions/index.js.map +1 -1
- package/lib/formatted-text/formattedTextToHtmlString.d.ts +7 -1
- package/lib/formatted-text/formattedTextToHtmlString.js +32 -1
- package/lib/formatted-text/formattedTextToHtmlString.js.map +1 -1
- package/lib/formatted-text/formattedTextToHtmlString.spec.js +30 -0
- package/lib/formatted-text/formattedTextToHtmlString.spec.js.map +1 -1
- package/lib/index.d.ts +0 -1
- package/lib/index.js +0 -1
- package/lib/index.js.map +1 -1
- package/package.json +5 -4
- package/src/api-key-validation/ApiKeyValidationService.ts +9 -3
- package/src/api-key-validation/CloudflareApiKeyService.spec.ts +38 -24
- package/src/api-key-validation/CloudflareApiKeyService.ts +27 -13
- package/src/api-key-validation/DevelopmentApiKeyService.spec.ts +12 -6
- package/src/api-key-validation/DevelopmentApiKeyService.ts +16 -5
- package/src/assertions/assertIsArray.spec.ts +16 -0
- package/src/assertions/assertIsArray.ts +11 -0
- package/src/assertions/index.ts +1 -0
- package/src/formatted-text/formattedTextToHtmlString.spec.ts +40 -0
- package/src/formatted-text/formattedTextToHtmlString.ts +31 -2
- package/src/index.ts +0 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/lib/server-utils/apiKeyMiddleware.d.ts +0 -6
- package/lib/server-utils/apiKeyMiddleware.js +0 -23
- package/lib/server-utils/apiKeyMiddleware.js.map +0 -1
- package/lib/server-utils/apiKeyMiddleware.spec.js +0 -40
- package/lib/server-utils/apiKeyMiddleware.spec.js.map +0 -1
- package/src/server-utils/apiKeyMiddleware.spec.ts +0 -51
- package/src/server-utils/apiKeyMiddleware.ts +0 -26
- /package/lib/{server-utils/apiKeyMiddleware.spec.d.ts → assertions/assertIsArray.spec.d.ts} +0 -0
package/.npm/_logs/{2023-06-26T08_03_09_170Z-debug-0.log → 2023-07-06T01_50_58_148Z-debug-0.log}
RENAMED
@@ -3,35 +3,35 @@
|
|
3
3
|
2 info using node@v18.15.0
|
4
4
|
3 timing npm:load:whichnode Completed in 1ms
|
5
5
|
4 timing config:load:defaults Completed in 2ms
|
6
|
-
5 timing config:load:file:/usr/local/lib/node_modules/npm/npmrc Completed in
|
6
|
+
5 timing config:load:file:/usr/local/lib/node_modules/npm/npmrc Completed in 1ms
|
7
7
|
6 timing config:load:builtin Completed in 1ms
|
8
|
-
7 timing config:load:cli Completed in
|
8
|
+
7 timing config:load:cli Completed in 2ms
|
9
9
|
8 timing config:load:env Completed in 1ms
|
10
10
|
9 info found workspace root at /builds/developer-experience/cmp
|
11
11
|
10 timing config:load:file:/builds/developer-experience/cmp/.npmrc Completed in 0ms
|
12
|
-
11 timing config:load:project Completed in
|
13
|
-
12 timing config:load:file:/root/.npmrc Completed in
|
14
|
-
13 timing config:load:user Completed in
|
12
|
+
11 timing config:load:project Completed in 25ms
|
13
|
+
12 timing config:load:file:/root/.npmrc Completed in 1ms
|
14
|
+
13 timing config:load:user Completed in 1ms
|
15
15
|
14 timing config:load:file:/usr/local/etc/npmrc Completed in 0ms
|
16
16
|
15 timing config:load:global Completed in 0ms
|
17
17
|
16 timing config:load:setEnvs Completed in 1ms
|
18
|
-
17 timing config:load Completed in
|
19
|
-
18 timing npm:load:configload Completed in
|
18
|
+
17 timing config:load Completed in 34ms
|
19
|
+
18 timing npm:load:configload Completed in 34ms
|
20
20
|
19 timing npm:load:mkdirpcache Completed in 0ms
|
21
21
|
20 timing npm:load:mkdirplogs Completed in 0ms
|
22
22
|
21 verbose title npm run compile
|
23
23
|
22 verbose argv "run" "compile" "--"
|
24
24
|
23 timing npm:load:setTitle Completed in 1ms
|
25
25
|
24 timing config:load:flatten Completed in 4ms
|
26
|
-
25 timing npm:load:display Completed in
|
27
|
-
26 verbose logfile logs-max:10 dir:/builds/developer-experience/cmp/packages/dx-common-lib/.npm/_logs/2023-
|
28
|
-
27 verbose logfile /builds/developer-experience/cmp/packages/dx-common-lib/.npm/_logs/2023-
|
29
|
-
28 timing npm:load:logFile Completed in
|
26
|
+
25 timing npm:load:display Completed in 5ms
|
27
|
+
26 verbose logfile logs-max:10 dir:/builds/developer-experience/cmp/packages/dx-common-lib/.npm/_logs/2023-07-06T01_50_58_148Z-
|
28
|
+
27 verbose logfile /builds/developer-experience/cmp/packages/dx-common-lib/.npm/_logs/2023-07-06T01_50_58_148Z-debug-0.log
|
29
|
+
28 timing npm:load:logFile Completed in 3ms
|
30
30
|
29 timing npm:load:timers Completed in 0ms
|
31
|
-
30 timing npm:load:configScope Completed in
|
32
|
-
31 timing npm:load Completed in
|
31
|
+
30 timing npm:load:configScope Completed in 1ms
|
32
|
+
31 timing npm:load Completed in 48ms
|
33
33
|
32 silly logfile done cleaning log files
|
34
|
-
33 timing command:run Completed in
|
34
|
+
33 timing command:run Completed in 5161ms
|
35
35
|
34 verbose exit 0
|
36
|
-
35 timing npm Completed in
|
36
|
+
35 timing npm Completed in 5221ms
|
37
37
|
36 info ok
|
@@ -1,5 +1,10 @@
|
|
1
|
+
/// <reference types="node" />
|
2
|
+
import { IncomingMessage } from 'http';
|
1
3
|
export interface ApiKeyValidationService {
|
2
|
-
|
3
|
-
|
4
|
-
|
4
|
+
interServiceKeyIsValid(key: string | undefined): boolean;
|
5
|
+
/**
|
6
|
+
* @deprecated Suggest moving towards using JWT authentication.
|
7
|
+
*/
|
8
|
+
matrixKeyIsValid(key: string | undefined, request: IncomingMessage): boolean;
|
9
|
+
getInterServiceKeys(): string[];
|
5
10
|
}
|
@@ -1,18 +1,23 @@
|
|
1
|
+
/// <reference types="node" />
|
1
2
|
import { SecretsManagerClient } from '@aws-sdk/client-secrets-manager';
|
2
3
|
import { ApiKeyValidationService } from './ApiKeyValidationService';
|
3
4
|
import { Logger } from '@squiz/dx-logger-lib';
|
5
|
+
import { IncomingMessage } from 'http';
|
4
6
|
export interface CloudFlareKeys {
|
5
|
-
keys: string[];
|
6
7
|
'matrix-keys': string[];
|
8
|
+
'inter-service-keys': string[];
|
7
9
|
}
|
8
10
|
export declare class CloudflareApiKeyService implements ApiKeyValidationService {
|
9
11
|
protected secretName: string;
|
10
12
|
protected secretsClient: SecretsManagerClient;
|
11
13
|
protected logger: Logger;
|
12
14
|
constructor(secretName: string, logger?: Logger);
|
13
|
-
|
14
|
-
|
15
|
+
/**
|
16
|
+
* @deprecated Suggest moving towards using JWT authentication.
|
17
|
+
*/
|
18
|
+
matrixKeyIsValid(key: string, request: IncomingMessage): boolean;
|
19
|
+
interServiceKeyIsValid(key: string): boolean;
|
15
20
|
protected getValidApiKeys(): Promise<CloudFlareKeys>;
|
16
21
|
refreshApiKeys(): Promise<void>;
|
17
|
-
|
22
|
+
getInterServiceKeys(): string[];
|
18
23
|
}
|
@@ -5,8 +5,8 @@ const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager");
|
|
5
5
|
const UnAuthenticatedRequestError_1 = require("../error/UnAuthenticatedRequestError");
|
6
6
|
const dx_logger_lib_1 = require("@squiz/dx-logger-lib");
|
7
7
|
let validKeys = {
|
8
|
-
keys: [],
|
9
8
|
'matrix-keys': [],
|
9
|
+
'inter-service-keys': [],
|
10
10
|
};
|
11
11
|
let refreshInterval;
|
12
12
|
// number must be smaller than 24 days.
|
@@ -23,17 +23,28 @@ class CloudflareApiKeyService {
|
|
23
23
|
}
|
24
24
|
this.logger = logger;
|
25
25
|
}
|
26
|
-
|
27
|
-
|
26
|
+
/**
|
27
|
+
* @deprecated Suggest moving towards using JWT authentication.
|
28
|
+
*/
|
29
|
+
matrixKeyIsValid(key, request) {
|
30
|
+
var _a;
|
31
|
+
if (validKeys['matrix-keys'].length == 0) {
|
28
32
|
throw new UnAuthenticatedRequestError_1.UnAuthenticatedRequestError('No api keys to check against');
|
29
33
|
}
|
30
|
-
|
34
|
+
if (validKeys['matrix-keys'].includes(key)) {
|
35
|
+
this.logger.info('Request authenticated using legacy Matrix API key', {
|
36
|
+
url: request.url,
|
37
|
+
userAgent: (_a = request.headers) === null || _a === void 0 ? void 0 : _a['user-agent'],
|
38
|
+
});
|
39
|
+
return true;
|
40
|
+
}
|
41
|
+
return false;
|
31
42
|
}
|
32
|
-
|
33
|
-
if (validKeys['
|
34
|
-
throw new UnAuthenticatedRequestError_1.UnAuthenticatedRequestError('No api keys to check against');
|
43
|
+
interServiceKeyIsValid(key) {
|
44
|
+
if (validKeys['inter-service-keys'].length == 0) {
|
45
|
+
throw new UnAuthenticatedRequestError_1.UnAuthenticatedRequestError('No inter service api keys to check against');
|
35
46
|
}
|
36
|
-
return validKeys['
|
47
|
+
return validKeys['inter-service-keys'].includes(key);
|
37
48
|
}
|
38
49
|
async getValidApiKeys() {
|
39
50
|
let secretValue;
|
@@ -51,7 +62,7 @@ class CloudflareApiKeyService {
|
|
51
62
|
throw new Error('cloudflare api key SecretString undefined');
|
52
63
|
}
|
53
64
|
const secret = JSON.parse(secretValue.SecretString);
|
54
|
-
if (secret
|
65
|
+
if (secret['matrix-keys'] && secret['inter-service-keys']) {
|
55
66
|
return secret;
|
56
67
|
}
|
57
68
|
throw new Error('api keys retrieved and decoded successfully but contained no values');
|
@@ -63,7 +74,8 @@ class CloudflareApiKeyService {
|
|
63
74
|
async refreshApiKeys() {
|
64
75
|
this.logger.info('refreshing keys');
|
65
76
|
validKeys = await this.getValidApiKeys();
|
66
|
-
this.logger.info(`
|
77
|
+
this.logger.info(`found ${validKeys['matrix-keys'].length} valid matrix keys`);
|
78
|
+
this.logger.info(`found ${validKeys['inter-service-keys'].length} valid inter service keys`);
|
67
79
|
if (!refreshInterval) {
|
68
80
|
refreshInterval = setInterval(async () => {
|
69
81
|
await this.refreshApiKeys();
|
@@ -71,8 +83,8 @@ class CloudflareApiKeyService {
|
|
71
83
|
}
|
72
84
|
}
|
73
85
|
// temporary method, to be removed when DXP auth is properly implemented
|
74
|
-
|
75
|
-
return validKeys['
|
86
|
+
getInterServiceKeys() {
|
87
|
+
return validKeys['inter-service-keys'];
|
76
88
|
}
|
77
89
|
}
|
78
90
|
exports.CloudflareApiKeyService = CloudflareApiKeyService;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"CloudflareApiKeyService.js","sourceRoot":"","sources":["../../src/api-key-validation/CloudflareApiKeyService.ts"],"names":[],"mappings":";;;AAAA,4EAIyC;AACzC,sFAAmF;AAEnF,wDAAyD;
|
1
|
+
{"version":3,"file":"CloudflareApiKeyService.js","sourceRoot":"","sources":["../../src/api-key-validation/CloudflareApiKeyService.ts"],"names":[],"mappings":"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"}
|
@@ -15,14 +15,14 @@ describe('CloudflareApiKeyService', () => {
|
|
15
15
|
});
|
16
16
|
it('should make a request to the aws secrets manager when refreshing the keys', async () => {
|
17
17
|
sendSpy.mockClear();
|
18
|
-
sendSpy.mockImplementationOnce(() => Promise.resolve({ SecretString: '{"keys":[]}' }));
|
18
|
+
sendSpy.mockImplementationOnce(() => Promise.resolve({ SecretString: '{"matrix-keys":[], "inter-service-keys":[]}' }));
|
19
19
|
await service.refreshApiKeys();
|
20
20
|
expect(sendSpy.mock.lastCall[0].input).toEqual({ SecretId: 'my-secret-name' });
|
21
21
|
expect(sendSpy.mock.lastCall[0]).toBeInstanceOf(client_secrets_manager_1.GetSecretValueCommand);
|
22
22
|
});
|
23
23
|
it('should start a refresh timer once called, but only once', (done) => {
|
24
24
|
sendSpy.mockClear();
|
25
|
-
sendSpy.mockImplementationOnce(() => Promise.resolve({ SecretString: '{"keys":["my-new-key"]}' }));
|
25
|
+
sendSpy.mockImplementationOnce(() => Promise.resolve({ SecretString: '{"matrix-keys":[], "inter-service-keys":["my-new-key"]}' }));
|
26
26
|
const spy = jest.spyOn(service, 'refreshApiKeys');
|
27
27
|
expect(spy).not.toBeCalled();
|
28
28
|
expect(setInterval).toHaveBeenCalledTimes(1); // for the above 2 tests
|
@@ -30,62 +30,65 @@ describe('CloudflareApiKeyService', () => {
|
|
30
30
|
expect(spy).toHaveBeenCalled();
|
31
31
|
jest.useRealTimers();
|
32
32
|
setTimeout(() => {
|
33
|
-
expect(service.
|
33
|
+
expect(service.interServiceKeyIsValid('my-new-key')).toEqual(true);
|
34
34
|
done();
|
35
35
|
}, 5);
|
36
36
|
});
|
37
37
|
});
|
38
|
-
describe('
|
38
|
+
describe('matrixKeyIsValid', () => {
|
39
39
|
describe('when there are no api keys', () => {
|
40
40
|
beforeAll(async () => {
|
41
|
-
sendSpy.mockImplementation(() => Promise.resolve({ SecretString: '{"keys":[]}' }));
|
41
|
+
sendSpy.mockImplementation(() => Promise.resolve({ SecretString: '{"matrix-keys":[], "inter-service-keys":[]}' }));
|
42
42
|
await service.refreshApiKeys();
|
43
43
|
});
|
44
44
|
it('should throw an unauthenticated request error when validating a key if there are no keys to validate against', () => {
|
45
|
-
expect(() => service.
|
45
|
+
expect(() => service.matrixKeyIsValid('anything', {})).toThrowError(new UnAuthenticatedRequestError_1.UnAuthenticatedRequestError('No api keys to check against'));
|
46
46
|
});
|
47
47
|
});
|
48
48
|
describe('when there are api keys', () => {
|
49
49
|
beforeAll(async () => {
|
50
|
-
sendSpy.mockImplementation(() => Promise.resolve({
|
50
|
+
sendSpy.mockImplementation(() => Promise.resolve({
|
51
|
+
SecretString: '{"matrix-keys":["my-matrix-key"], "inter-service-keys":["my-inter-service-key"]}',
|
52
|
+
}));
|
51
53
|
await service.refreshApiKeys();
|
52
54
|
});
|
53
|
-
it('should return true when there are keys loaded and the input key is in the list of valid keys', () => {
|
54
|
-
expect(service.
|
55
|
-
expect(service.keyIsValid('my-other-key')).toEqual(true);
|
55
|
+
it('should return true when there are keys loaded and the input key is in the list of valid matrix keys', () => {
|
56
|
+
expect(service.matrixKeyIsValid('my-matrix-key', {})).toEqual(true);
|
56
57
|
});
|
57
|
-
it('should return false when there are keys loaded and the input key is not in the list of valid keys', async () => {
|
58
|
-
expect(service.
|
58
|
+
it('should return false when there are keys loaded and the input key is not in the list of valid matrix keys', async () => {
|
59
|
+
expect(service.matrixKeyIsValid('not-my-key', {})).toEqual(false);
|
59
60
|
});
|
60
|
-
it('should return false
|
61
|
-
expect(service.
|
61
|
+
it('should return false when using non matrix keys', async () => {
|
62
|
+
expect(service.matrixKeyIsValid('my-inter-service-key', {})).toEqual(false);
|
62
63
|
});
|
63
64
|
});
|
64
65
|
});
|
65
|
-
describe('
|
66
|
+
describe('interServiceKeyIsValid', () => {
|
66
67
|
describe('when there are no api keys', () => {
|
67
68
|
beforeAll(async () => {
|
68
|
-
sendSpy.mockImplementation(() => Promise.resolve({ SecretString: '{"keys":[], "
|
69
|
+
sendSpy.mockImplementation(() => Promise.resolve({ SecretString: '{"matrix-keys":[], "inter-service-keys":[]}' }));
|
69
70
|
await service.refreshApiKeys();
|
70
71
|
});
|
71
72
|
it('should throw an unauthenticated request error when validating a key if there are no keys to validate against', () => {
|
72
|
-
expect(() => service.
|
73
|
+
expect(() => service.interServiceKeyIsValid('anything')).toThrowError(new UnAuthenticatedRequestError_1.UnAuthenticatedRequestError('No inter service api keys to check against'));
|
73
74
|
});
|
74
75
|
});
|
75
76
|
describe('when there are api keys', () => {
|
76
77
|
beforeAll(async () => {
|
77
|
-
sendSpy.mockImplementation(() => Promise.resolve({
|
78
|
+
sendSpy.mockImplementation(() => Promise.resolve({
|
79
|
+
SecretString: '{"keys":["my-key", "my-other-key"], "matrix-keys":["my-matrix-key"], "inter-service-keys":["my-inter-service-key"]}',
|
80
|
+
}));
|
78
81
|
await service.refreshApiKeys();
|
79
82
|
});
|
80
83
|
it('should return true when there are keys loaded and the input key is in the list of valid matrix keys', () => {
|
81
|
-
expect(service.
|
84
|
+
expect(service.interServiceKeyIsValid('my-inter-service-key')).toEqual(true);
|
82
85
|
});
|
83
86
|
it('should return false when there are keys loaded and the input key is not in the list of valid matrix keys', async () => {
|
84
|
-
expect(service.
|
87
|
+
expect(service.interServiceKeyIsValid('not-my-key')).toEqual(false);
|
85
88
|
});
|
86
|
-
it('should return false when using non
|
87
|
-
expect(service.
|
88
|
-
expect(service.
|
89
|
+
it('should return false when using non inter-service keys', async () => {
|
90
|
+
expect(service.interServiceKeyIsValid('my-key')).toEqual(false);
|
91
|
+
expect(service.interServiceKeyIsValid('my-matrix-key')).toEqual(false);
|
89
92
|
});
|
90
93
|
});
|
91
94
|
});
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"CloudflareApiKeyService.spec.js","sourceRoot":"","sources":["../../src/api-key-validation/CloudflareApiKeyService.spec.ts"],"names":[],"mappings":";;AAAA,4EAA8F;AAC9F,sFAAmF;AACnF,uEAAoE;
|
1
|
+
{"version":3,"file":"CloudflareApiKeyService.spec.js","sourceRoot":"","sources":["../../src/api-key-validation/CloudflareApiKeyService.spec.ts"],"names":[],"mappings":"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"}
|
@@ -1,6 +1,11 @@
|
|
1
|
+
/// <reference types="node" />
|
2
|
+
import { Logger } from '@squiz/dx-logger-lib';
|
1
3
|
import { ApiKeyValidationService } from './ApiKeyValidationService';
|
4
|
+
import { IncomingMessage } from 'http';
|
2
5
|
export declare class DevelopmentApiKeyService implements ApiKeyValidationService {
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
+
private logger;
|
7
|
+
constructor(logger?: Logger);
|
8
|
+
matrixKeyIsValid(key: string | undefined, request: IncomingMessage): boolean;
|
9
|
+
interServiceKeyIsValid(key: string | undefined): boolean;
|
10
|
+
getInterServiceKeys(): string[];
|
6
11
|
}
|
@@ -1,16 +1,25 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.DevelopmentApiKeyService = void 0;
|
4
|
+
const dx_logger_lib_1 = require("@squiz/dx-logger-lib");
|
4
5
|
class DevelopmentApiKeyService {
|
5
|
-
|
6
|
-
|
6
|
+
constructor(logger) {
|
7
|
+
this.logger = logger || (0, dx_logger_lib_1.getLogger)({ name: 'DevelopmentApiKeyService' });
|
7
8
|
}
|
8
|
-
matrixKeyIsValid() {
|
9
|
+
matrixKeyIsValid(key, request) {
|
10
|
+
var _a;
|
11
|
+
this.logger.info('Request authenticated using legacy Matrix API key', {
|
12
|
+
url: request.url,
|
13
|
+
userAgent: (_a = request.headers) === null || _a === void 0 ? void 0 : _a['user-agent'],
|
14
|
+
});
|
9
15
|
return true;
|
10
16
|
}
|
17
|
+
interServiceKeyIsValid(key) {
|
18
|
+
return Boolean(key && this.getInterServiceKeys().includes(key));
|
19
|
+
}
|
11
20
|
// temporary method, to be removed when DXP auth is properly implemented
|
12
|
-
|
13
|
-
return ['
|
21
|
+
getInterServiceKeys() {
|
22
|
+
return ['inter-service-api-key'];
|
14
23
|
}
|
15
24
|
}
|
16
25
|
exports.DevelopmentApiKeyService = DevelopmentApiKeyService;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"DevelopmentApiKeyService.js","sourceRoot":"","sources":["../../src/api-key-validation/DevelopmentApiKeyService.ts"],"names":[],"mappings":";;;
|
1
|
+
{"version":3,"file":"DevelopmentApiKeyService.js","sourceRoot":"","sources":["../../src/api-key-validation/DevelopmentApiKeyService.ts"],"names":[],"mappings":";;;AAAA,wDAAyD;AAIzD,MAAa,wBAAwB;IAGnC,YAAmB,MAAe;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,IAAA,yBAAS,EAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC1E,CAAC;IACM,gBAAgB,CAAC,GAAuB,EAAE,OAAwB;;QACvE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mDAAmD,EAAE;YACpE,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,SAAS,EAAE,MAAA,OAAO,CAAC,OAAO,0CAAG,YAAY,CAAC;SAC3C,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IACM,sBAAsB,CAAC,GAAuB;QACnD,OAAO,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,wEAAwE;IACjE,mBAAmB;QACxB,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACnC,CAAC;CACF;AApBD,4DAoBC"}
|
@@ -1,16 +1,20 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
const DevelopmentApiKeyService_1 = require("./DevelopmentApiKeyService");
|
4
|
+
const dx_logger_lib_1 = require("@squiz/dx-logger-lib");
|
4
5
|
describe('DevelopmentApiKeyService', () => {
|
5
|
-
const service = new DevelopmentApiKeyService_1.DevelopmentApiKeyService();
|
6
|
-
describe('
|
6
|
+
const service = new DevelopmentApiKeyService_1.DevelopmentApiKeyService((0, dx_logger_lib_1.getLogger)({ name: 'test', silent: true }));
|
7
|
+
describe('matrixKeyIsValid', () => {
|
7
8
|
it('should always return true', () => {
|
8
|
-
expect(service.
|
9
|
+
expect(service.matrixKeyIsValid(undefined, {})).toEqual(true);
|
9
10
|
});
|
10
11
|
});
|
11
|
-
describe('
|
12
|
-
it('should
|
13
|
-
expect(service.
|
12
|
+
describe('interServiceKeyIsValid', () => {
|
13
|
+
it('should return true if key is "inter-service-api-key"', () => {
|
14
|
+
expect(service.interServiceKeyIsValid('inter-service-api-key')).toEqual(true);
|
15
|
+
});
|
16
|
+
it('should return false if key is not "inter-service-api-key"', () => {
|
17
|
+
expect(service.interServiceKeyIsValid('invalid-api-key')).toEqual(false);
|
14
18
|
});
|
15
19
|
});
|
16
20
|
});
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"DevelopmentApiKeyService.spec.js","sourceRoot":"","sources":["../../src/api-key-validation/DevelopmentApiKeyService.spec.ts"],"names":[],"mappings":";;AAAA,yEAAsE;AAEtE,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,MAAM,OAAO,GAAG,IAAI,mDAAwB,EAAE,CAAC;
|
1
|
+
{"version":3,"file":"DevelopmentApiKeyService.spec.js","sourceRoot":"","sources":["../../src/api-key-validation/DevelopmentApiKeyService.spec.ts"],"names":[],"mappings":";;AAAA,yEAAsE;AAEtE,wDAAiD;AAEjD,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,MAAM,OAAO,GAAG,IAAI,mDAAwB,CAAC,IAAA,yBAAS,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAExF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,EAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;YACnE,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export declare function assertIsArray(val: any): asserts val is Array<any>;
|
@@ -0,0 +1,15 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.assertIsArray = void 0;
|
4
|
+
const assert_1 = require("assert");
|
5
|
+
function assertIsArray(val) {
|
6
|
+
if (!Array.isArray(val)) {
|
7
|
+
throw new assert_1.AssertionError({
|
8
|
+
actual: val,
|
9
|
+
expected: 'array',
|
10
|
+
message: `Expected ${val} to be array`,
|
11
|
+
});
|
12
|
+
}
|
13
|
+
}
|
14
|
+
exports.assertIsArray = assertIsArray;
|
15
|
+
//# sourceMappingURL=assertIsArray.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"assertIsArray.js","sourceRoot":"","sources":["../../src/assertions/assertIsArray.ts"],"names":[],"mappings":";;;AAAA,mCAAwC;AAExC,SAAgB,aAAa,CAAC,GAAQ;IACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACvB,MAAM,IAAI,uBAAc,CAAC;YACvB,MAAM,EAAE,GAAG;YACX,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,YAAY,GAAG,cAAc;SACvC,CAAC,CAAC;KACJ;AACH,CAAC;AARD,sCAQC"}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const assertIsArray_1 = require("./assertIsArray");
|
4
|
+
describe('assertIsArray', () => {
|
5
|
+
it('should throw an assertion error if input is undefined', () => {
|
6
|
+
expect(() => (0, assertIsArray_1.assertIsArray)(undefined)).toThrowErrorMatchingInlineSnapshot(`"Expected undefined to be array"`);
|
7
|
+
});
|
8
|
+
it('should throw an assertion error if input is null', () => {
|
9
|
+
expect(() => (0, assertIsArray_1.assertIsArray)(null)).toThrowErrorMatchingInlineSnapshot(`"Expected null to be array"`);
|
10
|
+
});
|
11
|
+
it('should return "void" or undefined if valid', () => {
|
12
|
+
expect((0, assertIsArray_1.assertIsArray)(['test'])).toBeUndefined();
|
13
|
+
expect(() => (0, assertIsArray_1.assertIsArray)(['test'])).not.toThrowError();
|
14
|
+
});
|
15
|
+
});
|
16
|
+
//# sourceMappingURL=assertIsArray.spec.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"assertIsArray.spec.js","sourceRoot":"","sources":["../../src/assertions/assertIsArray.spec.ts"],"names":[],"mappings":";;AAAA,mDAAgD;AAEhD,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,6BAAa,EAAC,SAAS,CAAC,CAAC,CAAC,kCAAkC,CAAC,kCAAkC,CAAC,CAAC;IAChH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,6BAAa,EAAC,IAAI,CAAC,CAAC,CAAC,kCAAkC,CAAC,6BAA6B,CAAC,CAAC;IACtG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,IAAA,6BAAa,EAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAChD,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,6BAAa,EAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
@@ -5,5 +5,6 @@ export * from './assertIsObject';
|
|
5
5
|
export * from './assertIsNotAnEmptyString';
|
6
6
|
export * from './assertIsEnumValue';
|
7
7
|
export * from './assertIsBoolean';
|
8
|
+
export * from './assertIsArray';
|
8
9
|
export * from './assertAssignWithDefaultUndefinedValue';
|
9
10
|
export * from './assertAssign';
|
package/lib/assertions/index.js
CHANGED
@@ -22,6 +22,7 @@ __exportStar(require("./assertIsObject"), exports);
|
|
22
22
|
__exportStar(require("./assertIsNotAnEmptyString"), exports);
|
23
23
|
__exportStar(require("./assertIsEnumValue"), exports);
|
24
24
|
__exportStar(require("./assertIsBoolean"), exports);
|
25
|
+
__exportStar(require("./assertIsArray"), exports);
|
25
26
|
// Assert assign
|
26
27
|
__exportStar(require("./assertAssignWithDefaultUndefinedValue"), exports);
|
27
28
|
__exportStar(require("./assertAssign"), exports);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/assertions/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oBAAoB;AACpB,mDAAiC;AACjC,oDAAkC;AAClC,8DAA4C;AAC5C,mDAAiC;AACjC,6DAA2C;AAC3C,sDAAoC;AACpC,oDAAkC;
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/assertions/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oBAAoB;AACpB,mDAAiC;AACjC,oDAAkC;AAClC,8DAA4C;AAC5C,mDAAiC;AACjC,6DAA2C;AAC3C,sDAAoC;AACpC,oDAAkC;AAClC,kDAAgC;AAEhC,gBAAgB;AAChB,0EAAwD;AACxD,iDAA+B"}
|
@@ -1,3 +1,9 @@
|
|
1
|
-
import { BaseResolvedNodes, FullyResolvedNodesMap } from '@squiz/dx-json-schema-lib';
|
1
|
+
import { BaseResolvedNodes, FORMATTED_TEXT_MODELS, FullyResolvedNodesMap } from '@squiz/dx-json-schema-lib';
|
2
|
+
type FormattedNodeFontProperties = FORMATTED_TEXT_MODELS.v1.FormattedNodeFontProperties;
|
2
3
|
export declare const formattedTextToHtmlStringResolvers: FullyResolvedNodesMap;
|
3
4
|
export declare function formattedTextToHtmlString(formattedText: BaseResolvedNodes): Promise<string>;
|
5
|
+
export declare function buildAttributesString(attributes: {
|
6
|
+
[k: string]: string;
|
7
|
+
} | undefined): string;
|
8
|
+
export declare function buildFontClasses(font: FormattedNodeFontProperties | undefined): string[];
|
9
|
+
export {};
|
@@ -1,10 +1,17 @@
|
|
1
1
|
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.formattedTextToHtmlString = exports.formattedTextToHtmlStringResolvers = void 0;
|
6
|
+
exports.buildFontClasses = exports.buildAttributesString = exports.formattedTextToHtmlString = exports.formattedTextToHtmlStringResolvers = void 0;
|
4
7
|
const dx_json_schema_lib_1 = require("@squiz/dx-json-schema-lib");
|
8
|
+
const axios_1 = __importDefault(require("axios"));
|
5
9
|
exports.formattedTextToHtmlStringResolvers = {
|
6
10
|
tag: async (node) => buildTagHTML(node),
|
7
11
|
text: async (node) => node.value,
|
12
|
+
component: async (node) => {
|
13
|
+
return await buildComponentHtml(node);
|
14
|
+
},
|
8
15
|
default: async (node) => {
|
9
16
|
return `<p class="invalid-node-type"> node of type "${node.type}" cannot be converted to html</p>`;
|
10
17
|
},
|
@@ -25,6 +32,11 @@ function buildTagHTML(formattedTextTag) {
|
|
25
32
|
const attributesStr = buildAttributesString(formattedTextTag.attributes);
|
26
33
|
return `<${formattedTextTag.tag}${attributesStr}>${formattedTextTag.children.join('')}</${formattedTextTag.tag}>`;
|
27
34
|
}
|
35
|
+
async function buildComponentHtml(node) {
|
36
|
+
const renderUrl = buildComponentRenderUrl(node);
|
37
|
+
const componentHtml = await axios_1.default.get(renderUrl);
|
38
|
+
return componentHtml.data;
|
39
|
+
}
|
28
40
|
function getClassString(formattedTextTag) {
|
29
41
|
var _a, _b, _c;
|
30
42
|
const fontClasses = buildFontClasses(formattedTextTag.font);
|
@@ -49,6 +61,7 @@ function buildAttributesString(attributes) {
|
|
49
61
|
}
|
50
62
|
return attributesString;
|
51
63
|
}
|
64
|
+
exports.buildAttributesString = buildAttributesString;
|
52
65
|
function buildFontClasses(font) {
|
53
66
|
if (!font) {
|
54
67
|
return [];
|
@@ -74,4 +87,22 @@ function buildFontClasses(font) {
|
|
74
87
|
}
|
75
88
|
return classes;
|
76
89
|
}
|
90
|
+
exports.buildFontClasses = buildFontClasses;
|
91
|
+
function buildComponentRenderUrl(node) {
|
92
|
+
var _a;
|
93
|
+
const [baseUrl, namespace, name, version] = getComponentDetails(node.schemaName);
|
94
|
+
let query = `_componentSet=${node.componentSet}`;
|
95
|
+
if ((_a = node.content) === null || _a === void 0 ? void 0 : _a.contentItemId.length) {
|
96
|
+
query = query.concat(`&_contentItemId=${node.content.contentItemId}`);
|
97
|
+
}
|
98
|
+
const renderUrl = `${baseUrl}/r/${namespace}/${name}/${version}?${query}`;
|
99
|
+
return renderUrl;
|
100
|
+
}
|
101
|
+
function getComponentDetails(str) {
|
102
|
+
const baseUrl = str.split('/d/')[0];
|
103
|
+
const sections = str.split('/');
|
104
|
+
const lastThreeSections = sections.slice(-3);
|
105
|
+
const [namespace, version, name] = lastThreeSections;
|
106
|
+
return [baseUrl, namespace, version, name];
|
107
|
+
}
|
77
108
|
//# sourceMappingURL=formattedTextToHtmlString.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"formattedTextToHtmlString.js","sourceRoot":"","sources":["../../src/formatted-text/formattedTextToHtmlString.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"formattedTextToHtmlString.js","sourceRoot":"","sources":["../../src/formatted-text/formattedTextToHtmlString.ts"],"names":[],"mappings":";;;;;;AAAA,kEAMmC;AACnC,kDAA0B;AAMb,QAAA,kCAAkC,GAA0B;IACvE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;IACvC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK;IAChC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACxB,OAAO,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,OAAO,+CAA+C,IAAI,CAAC,IAAI,mCAAmC,CAAC;IACrG,CAAC;CACF,CAAC;AAEK,KAAK,UAAU,yBAAyB,CAAC,aAAgC;IAC9E,MAAM,MAAM,GAAG,MAAM,IAAA,yCAAoB,EAAC,aAAa,EAAE,0CAAkC,CAAC,CAAC;IAC7F,OAAO,MAAM,CAAC;AAChB,CAAC;AAHD,8DAGC;AAED,SAAS,YAAY,CAAC,gBAAkC;IACtD,MAAM,OAAO,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAEjD,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;QAChC,gBAAgB,CAAC,UAAU,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;KAClD;SAAM;QACL,gBAAgB,CAAC,UAAU,CAAC,KAAK,GAAG,OAAO,CAAC;KAC7C;IAED,MAAM,aAAa,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAEzE,OAAO,IAAI,gBAAgB,CAAC,GAAG,GAAG,aAAa,IAAI,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,gBAAgB,CAAC,GAAG,GAAG,CAAC;AACpH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAmB;IACnD,MAAM,SAAS,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACjD,OAAO,aAAa,CAAC,IAAI,CAAC;AAC5B,CAAC;AAED,SAAS,cAAc,CAAC,gBAAkC;;IACxD,MAAM,WAAW,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAE5D,IAAI,MAAM,GAAG,MAAA,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,UAAU,0CAAE,KAAK,mCAAI,EAAE,CAAC;IAEvD,IAAI,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,iBAAiB,0CAAE,SAAS,EAAE;QAClD,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;KAChE;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;QAC1B,MAAM,IAAI,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KACvC;IAED,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC;AAED,SAAgB,qBAAqB,CAAC,UAA+C;IACnF,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,EAAE,CAAC;KACX;IAED,IAAI,gBAAgB,GAAG,EAAE,CAAC;IAC1B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;QAClC,IAAI,UAAU,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE;YAChC,gBAAgB,IAAI,IAAI,SAAS,KAAK,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC;SAChE;KACF;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAbD,sDAaC;AAED,SAAgB,gBAAgB,CAAC,IAA6C;IAC5E,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,EAAE,CAAC;KACX;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,IAAI,CAAC,IAAI,EAAE;QACb,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KACtB;IACD,IAAI,IAAI,CAAC,SAAS,EAAE;QAClB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;KAC3B;IACD,IAAI,IAAI,CAAC,OAAO,EAAE;QAChB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;KACzB;IACD,IAAI,IAAI,CAAC,KAAK,EAAE;QACd,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;KACrC;IACD,IAAI,IAAI,CAAC,IAAI,EAAE;QACb,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;KACnC;IACD,IAAI,IAAI,CAAC,UAAU,EAAE;QACnB,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;KACzC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AA1BD,4CA0BC;AAED,SAAS,uBAAuB,CAAC,IAAmB;;IAClD,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjF,IAAI,KAAK,GAAG,iBAAiB,IAAI,CAAC,YAAY,EAAE,CAAC;IACjD,IAAI,MAAA,IAAI,CAAC,OAAO,0CAAE,aAAa,CAAC,MAAM,EAAE;QACtC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,mBAAmB,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;KACvE;IACD,MAAM,SAAS,GAAG,GAAG,OAAO,MAAM,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;IAC1E,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW;IACtC,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,iBAAiB,CAAC;IACrD,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC"}
|
@@ -1,6 +1,15 @@
|
|
1
1
|
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
6
|
const formattedTextToHtmlString_1 = require("./formattedTextToHtmlString");
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
8
|
+
const mockedResponse = {
|
9
|
+
data: `<div>component-html</div>`,
|
10
|
+
};
|
11
|
+
const axiosGetSpy = jest.spyOn(axios_1.default, 'get');
|
12
|
+
axiosGetSpy.mockResolvedValue(mockedResponse);
|
4
13
|
describe('formattedTextToHtmlString', () => {
|
5
14
|
it('should convert text nodes to HTML', async () => {
|
6
15
|
const textNode = {
|
@@ -208,5 +217,26 @@ describe('formattedTextToHtmlString', () => {
|
|
208
217
|
};
|
209
218
|
await expect((0, formattedTextToHtmlString_1.formattedTextToHtmlString)(formattedNodes)).resolves.toMatchInlineSnapshot(`"<div class="justify">Lorem ipsum dolor sit amet, consectetur adipiscing elit. <strong class="bold">Vestibulum dictum</strong> mi vel urna maximus, et luctus ipsum tincidunt</div>"`);
|
210
219
|
});
|
220
|
+
it('should handle component nodes', async () => {
|
221
|
+
const formattedNodes = {
|
222
|
+
type: 'component',
|
223
|
+
componentSet: 'test',
|
224
|
+
schemaName: 'https://some.render-runtime.url/d/page-demo/demo-button/1.0.0',
|
225
|
+
};
|
226
|
+
await expect((0, formattedTextToHtmlString_1.formattedTextToHtmlString)(formattedNodes)).resolves.toMatchInlineSnapshot(`"<div>component-html</div>"`);
|
227
|
+
expect(axiosGetSpy).toBeCalledWith('https://some.render-runtime.url/r/page-demo/demo-button/1.0.0?_componentSet=test');
|
228
|
+
});
|
229
|
+
it('should handle component nodes - with content provided', async () => {
|
230
|
+
const formattedNodes = {
|
231
|
+
type: 'component',
|
232
|
+
componentSet: 'test',
|
233
|
+
content: {
|
234
|
+
contentItemId: '123',
|
235
|
+
},
|
236
|
+
schemaName: 'https://some.render-runtime.url/d/page-demo/demo-button/1.0.0',
|
237
|
+
};
|
238
|
+
await expect((0, formattedTextToHtmlString_1.formattedTextToHtmlString)(formattedNodes)).resolves.toMatchInlineSnapshot(`"<div>component-html</div>"`);
|
239
|
+
expect(axiosGetSpy).toBeCalledWith('https://some.render-runtime.url/r/page-demo/demo-button/1.0.0?_componentSet=test&_contentItemId=123');
|
240
|
+
});
|
211
241
|
});
|
212
242
|
//# sourceMappingURL=formattedTextToHtmlString.spec.js.map
|