@squiz/render-runtime-lib 1.74.0 → 1.75.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/lib/PreviewComponentService.js +43 -0
- package/lib/PreviewComponentService.js.map +1 -0
- package/lib/PreviewComponentService.spec.js +64 -0
- package/lib/PreviewComponentService.spec.js.map +1 -0
- package/lib/RenderInputService.js +286 -0
- package/lib/RenderInputService.js.map +1 -0
- package/lib/RenderInputService.spec.js +645 -0
- package/lib/RenderInputService.spec.js.map +1 -0
- package/lib/component-runner/ComponentRootUrlResolver.js +3 -0
- package/lib/component-runner/ComponentRootUrlResolver.js.map +1 -0
- package/lib/component-runner/ComponentRunnerServiceWithWorkers.js +91 -0
- package/lib/component-runner/ComponentRunnerServiceWithWorkers.js.map +1 -0
- package/lib/component-runner/ComponentRunnerServiceWithWorkers.spec.js +104 -0
- package/lib/component-runner/ComponentRunnerServiceWithWorkers.spec.js.map +1 -0
- package/lib/component-runner/ComponentRuntimeContext.d.ts +1 -8
- package/lib/component-runner/ComponentRuntimeContext.js +3 -0
- package/lib/component-runner/ComponentRuntimeContext.js.map +1 -0
- package/lib/component-runner/ContentRuntimeService.js +31 -0
- package/lib/component-runner/ContentRuntimeService.js.map +1 -0
- package/lib/component-runner/ExecuteComponentTask.d.ts +1 -9
- package/lib/component-runner/ExecuteComponentTask.js +8 -0
- package/lib/component-runner/ExecuteComponentTask.js.map +1 -0
- package/lib/component-runner/FunctionReturnTypes.js +3 -0
- package/lib/component-runner/FunctionReturnTypes.js.map +1 -0
- package/lib/component-runner/index.js +23 -0
- package/lib/component-runner/index.js.map +1 -0
- package/lib/component-runner/worker/component-bootstrapper.js +63 -0
- package/lib/component-runner/worker/component-bootstrapper.js.map +1 -0
- package/lib/health-check-service.js +3 -0
- package/lib/health-check-service.js.map +1 -0
- package/lib/index.d.ts +0 -16
- package/lib/index.js +23 -4610
- package/lib/index.js.map +1 -7
- package/lib/ioc.js +37 -0
- package/lib/ioc.js.map +1 -0
- package/lib/test/helpers/fixtures.js +152 -0
- package/lib/test/helpers/fixtures.js.map +1 -0
- package/lib/test/helpers/stack.js +121 -0
- package/lib/test/helpers/stack.js.map +1 -0
- package/lib/test/index.js +21 -0
- package/lib/test/index.js.map +1 -0
- package/lib/test/mock-services/MockedComponentSetService.js +413 -0
- package/lib/test/mock-services/MockedComponentSetService.js.map +1 -0
- package/lib/test/mock-services/MockedContentItemService.js +37 -0
- package/lib/test/mock-services/MockedContentItemService.js.map +1 -0
- package/lib/test-helpers.d.ts +16 -0
- package/lib/test-helpers.js +44 -0
- package/lib/test-helpers.js.map +1 -0
- package/lib/utils/getContentItemIdFromInput.js +13 -0
- package/lib/utils/getContentItemIdFromInput.js.map +1 -0
- package/lib/utils/getContentItemIdFromInput.spec.js +18 -0
- package/lib/utils/getContentItemIdFromInput.spec.js.map +1 -0
- package/lib/utils/resolvePreviewOutput.js +71 -0
- package/lib/utils/resolvePreviewOutput.js.map +1 -0
- package/lib/utils/resolvePreviewOutput.spec.js +168 -0
- package/lib/utils/resolvePreviewOutput.spec.js.map +1 -0
- package/lib/utils/setHeadersOnExpressResponse.js +15 -0
- package/lib/utils/setHeadersOnExpressResponse.js.map +1 -0
- package/lib/utils/setHeadersOnExpressResponse.sepc.js +21 -0
- package/lib/utils/setHeadersOnExpressResponse.sepc.js.map +1 -0
- package/lib/webserver/app.js +78 -0
- package/lib/webserver/app.js.map +1 -0
- package/lib/webserver/controllers/CoreController.js +116 -0
- package/lib/webserver/controllers/CoreController.js.map +1 -0
- package/lib/webserver/controllers/CoreController.spec.js +132 -0
- package/lib/webserver/controllers/CoreController.spec.js.map +1 -0
- package/lib/webserver/controllers/DefinitionController.js +162 -0
- package/lib/webserver/controllers/DefinitionController.js.map +1 -0
- package/lib/webserver/controllers/DefinitionController.spec.js +16 -0
- package/lib/webserver/controllers/DefinitionController.spec.js.map +1 -0
- package/lib/webserver/controllers/DevelopmentController.js +149 -0
- package/lib/webserver/controllers/DevelopmentController.js.map +1 -0
- package/lib/webserver/controllers/DevelopmentController.spec.js +29 -0
- package/lib/webserver/controllers/DevelopmentController.spec.js.map +1 -0
- package/lib/webserver/controllers/PreviewController.spec.js +124 -0
- package/lib/webserver/controllers/PreviewController.spec.js.map +1 -0
- package/lib/webserver/controllers/RenderController.d.ts +3 -2
- package/lib/webserver/controllers/RenderController.js +221 -0
- package/lib/webserver/controllers/RenderController.js.map +1 -0
- package/lib/webserver/controllers/RenderController.spec.js +441 -0
- package/lib/webserver/controllers/RenderController.spec.js.map +1 -0
- package/lib/webserver/controllers/StaticController.js +149 -0
- package/lib/webserver/controllers/StaticController.js.map +1 -0
- package/lib/webserver/controllers/StaticController.spec.js +28 -0
- package/lib/webserver/controllers/StaticController.spec.js.map +1 -0
- package/lib/webserver/controllers/test/definition-route-tests.js +627 -0
- package/lib/webserver/controllers/test/definition-route-tests.js.map +1 -0
- package/lib/webserver/controllers/test/development-route-tests.js +110 -0
- package/lib/webserver/controllers/test/development-route-tests.js.map +1 -0
- package/lib/webserver/controllers/test/preview-route-tests.js +122 -0
- package/lib/webserver/controllers/test/preview-route-tests.js.map +1 -0
- package/lib/webserver/controllers/test/render-route-sandbox-tests.js +194 -0
- package/lib/webserver/controllers/test/render-route-sandbox-tests.js.map +1 -0
- package/lib/webserver/controllers/test/render-route-tests.js +422 -0
- package/lib/webserver/controllers/test/render-route-tests.js.map +1 -0
- package/lib/webserver/controllers/test/static-route-tests.js +96 -0
- package/lib/webserver/controllers/test/static-route-tests.js.map +1 -0
- package/lib/webserver/index.js +6 -0
- package/lib/webserver/index.js.map +1 -0
- package/lib/webserver/routes/routes.js +902 -0
- package/lib/webserver/routes/routes.js.map +1 -0
- package/package.json +13 -6
- package/lib/migrations/20220704054051_initial.sql +0 -19
- package/lib/migrations/20220718172237_adding_component_sets.sql +0 -23
- package/lib/migrations/20220728113941_add_env_vars_field.sql +0 -1
- package/lib/migrations/20220817113300_removing_null_props_from_jsonb.sql +0 -41
- package/lib/migrations/20221027151225_dummy.sql +0 -2
- package/lib/migrations/20221117151200_add_detail_columns_to_component_version.js +0 -40
- package/lib/migrations/20221220151200_add_required_to_manifests.js +0 -7794
- package/lib/migrations/20221222151200_add_required_to_manifests.js +0 -7856
- package/lib/migrations/20223525103556_component_set_rule.sql +0 -19
- package/lib/migrations/20230111095522_update_environment_property.js +0 -7802
- package/lib/migrations/20230203084900_ensure_static_root_exists.js +0 -47
- package/lib/migrations/20230210143300_lowercase_all_uri_names.js +0 -88
- package/lib/migrations/20230217151212_component_set_component_version_updates.sql +0 -38
- package/lib/migrations/20230218121212_add_component_set_rules.js +0 -24
- package/lib/migrations/202406061447_edge_component_type.sql +0 -1
- package/lib/migrations/202407111308_component_version_type.sql +0 -1
- package/lib/migrations/202408061132_update_type_to_server.sql +0 -1
- package/lib/public/docs.json +0 -5509
- package/lib/worker/component-bootstrapper.js +0 -170132
- package/lib/worker/component-bootstrapper.js.map +0 -7
|
@@ -0,0 +1,43 @@
|
|
|
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
|
+
exports.ComponentPreviewService = exports.PREVIEW_COMPONENT_SET = void 0;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
9
|
+
const fs_extra_1 = require("fs-extra");
|
|
10
|
+
const resolvePreviewOutput_1 = require("./utils/resolvePreviewOutput");
|
|
11
|
+
const dx_common_lib_1 = require("@squiz/dx-common-lib");
|
|
12
|
+
exports.PREVIEW_COMPONENT_SET = 'unknown';
|
|
13
|
+
class ComponentPreviewService {
|
|
14
|
+
async dressRenderedOutputForPreview(componentManifest, functionDefinition, previewKey, componentOutput) {
|
|
15
|
+
const componentDirectory = componentManifest.getComponentDirectory();
|
|
16
|
+
const functionPreview = componentManifest.getFunctionPreviewConfiguration(previewKey, functionDefinition);
|
|
17
|
+
let body = componentOutput;
|
|
18
|
+
if (functionPreview && functionPreview.wrapper) {
|
|
19
|
+
body = await this.embedComponentIntoWrapper(componentDirectory, functionPreview.wrapper, functionDefinition, componentOutput);
|
|
20
|
+
}
|
|
21
|
+
return body;
|
|
22
|
+
}
|
|
23
|
+
async embedComponentIntoWrapper(componentDirectory, wrapper, functionDefinition, componentOutput) {
|
|
24
|
+
const wrapperFilePath = path_1.default.resolve(componentDirectory, wrapper.path);
|
|
25
|
+
if ((await (0, fs_extra_1.pathExists)(wrapperFilePath)) === false) {
|
|
26
|
+
throw new dx_common_lib_1.BadRequestError(`Preview wrapper file "${wrapper.path}" does not exist`);
|
|
27
|
+
}
|
|
28
|
+
const wrapperContent = await promises_1.default.readFile(wrapperFilePath, {
|
|
29
|
+
encoding: 'utf-8',
|
|
30
|
+
});
|
|
31
|
+
const type = functionDefinition.output.responseType;
|
|
32
|
+
switch (type) {
|
|
33
|
+
case 'html':
|
|
34
|
+
return (0, resolvePreviewOutput_1.resolvePreviewOutput)(wrapperContent, componentOutput, functionDefinition.output.staticFiles);
|
|
35
|
+
case 'json':
|
|
36
|
+
return componentOutput;
|
|
37
|
+
default:
|
|
38
|
+
return (0, dx_common_lib_1.never)(type);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.ComponentPreviewService = ComponentPreviewService;
|
|
43
|
+
//# sourceMappingURL=PreviewComponentService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreviewComponentService.js","sourceRoot":"","sources":["../src/PreviewComponentService.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAGxB,2DAA8B;AAC9B,uCAAsC;AACtC,uEAAsG;AAGtG,wDAA8D;AAEjD,QAAA,qBAAqB,GAAG,SAAS,CAAC;AAE/C,MAAa,uBAAuB;IAClC,KAAK,CAAC,6BAA6B,CACjC,iBAA2B,EAC3B,kBAAwD,EACxD,UAAkB,EAClB,eAAoC;QAEpC,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,qBAAqB,EAAE,CAAC;QAErE,MAAM,eAAe,GAAG,iBAAiB,CAAC,+BAA+B,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;QAE1G,IAAI,IAAI,GAAwB,eAAe,CAAC;QAEhD,IAAI,eAAe,IAAI,eAAe,CAAC,OAAO,EAAE;YAC9C,IAAI,GAAG,MAAM,IAAI,CAAC,yBAAyB,CACzC,kBAAkB,EAClB,eAAe,CAAC,OAAO,EACvB,kBAAkB,EAClB,eAAe,CAChB,CAAC;SACH;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,yBAAyB,CACrC,kBAA0B,EAC1B,OAA6E,EAC7E,kBAAwD,EACxD,eAAoC;QAEpC,MAAM,eAAe,GAAG,cAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAEvE,IAAI,CAAC,MAAM,IAAA,qBAAU,EAAC,eAAe,CAAC,CAAC,KAAK,KAAK,EAAE;YACjD,MAAM,IAAI,+BAAe,CAAC,yBAAyB,OAAO,CAAC,IAAI,kBAAkB,CAAC,CAAC;SACpF;QAED,MAAM,cAAc,GAAG,MAAM,kBAAG,CAAC,QAAQ,CAAC,eAAe,EAAE;YACzD,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC;QAEpD,QAAQ,IAAI,EAAE;YACZ,KAAK,MAAM;gBACT,OAAO,IAAA,2CAA8B,EACnC,cAAc,EACd,eAAyB,EACzB,kBAAkB,CAAC,MAAM,CAAC,WAAW,CACtC,CAAC;YACJ,KAAK,MAAM;gBACT,OAAO,eAAe,CAAC;YACzB;gBACE,OAAO,IAAA,qBAAK,EAAC,IAAI,CAAC,CAAC;SACtB;IACH,CAAC;CACF;AAxDD,0DAwDC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const component_lib_1 = require("@squiz/component-lib");
|
|
4
|
+
const PreviewComponentService_1 = require("./PreviewComponentService");
|
|
5
|
+
const dx_logger_lib_1 = require("@squiz/dx-logger-lib");
|
|
6
|
+
describe('PreviewComponentService', () => {
|
|
7
|
+
const manifestService = new component_lib_1.ManifestServiceForProduction(process.env.DATA_MOUNT_POINT, (0, dx_logger_lib_1.getLogger)({ name: 'PreviewComponentService' }));
|
|
8
|
+
const previewService = new PreviewComponentService_1.ComponentPreviewService();
|
|
9
|
+
it('dressRenderedOutputForPreview should wrap a html functions output in the the provided wrapper', async () => {
|
|
10
|
+
const manifest = await manifestService.loadManifest('unit-test-components', 'test-preview-component', '1.2.4');
|
|
11
|
+
const componentFunction = manifest.getComponentFunctionByName('other');
|
|
12
|
+
const output = await previewService.dressRenderedOutputForPreview(manifest, componentFunction, 'another-preview', 'this is the rendered output fo a component');
|
|
13
|
+
expect(output).toMatchInlineSnapshot(`
|
|
14
|
+
"<!DOCTYPE html>
|
|
15
|
+
<html lang="en">
|
|
16
|
+
<head>
|
|
17
|
+
<meta charset="UTF-8" />
|
|
18
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
19
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
20
|
+
<title>This is the preview</title>
|
|
21
|
+
</head>
|
|
22
|
+
<body>
|
|
23
|
+
this is the rendered output fo a component
|
|
24
|
+
</body>
|
|
25
|
+
</html>
|
|
26
|
+
"
|
|
27
|
+
`);
|
|
28
|
+
});
|
|
29
|
+
it('dressRenderedOutputForPreview should wrap a html functions and embed static files in the header and footer locations', async () => {
|
|
30
|
+
const manifest = await manifestService.loadManifest('unit-test-components', 'test-preview-component', '1.0.1');
|
|
31
|
+
const componentFunction = manifest.getComponentFunctionByName('main');
|
|
32
|
+
const output = await previewService.dressRenderedOutputForPreview(manifest, componentFunction, 'test-preview', 'this is the rendered output fo a component');
|
|
33
|
+
expect(output).toMatchInlineSnapshot(`
|
|
34
|
+
"<html>
|
|
35
|
+
<head>
|
|
36
|
+
<link rel="stylesheet" href="css-file.css">
|
|
37
|
+
</head>
|
|
38
|
+
<body>
|
|
39
|
+
this is the rendered output fo a component <script src="js-file.js"></script>
|
|
40
|
+
</body>
|
|
41
|
+
</html>
|
|
42
|
+
"
|
|
43
|
+
`);
|
|
44
|
+
});
|
|
45
|
+
it('dressRenderedOutputForPreview should pass the output through if no wrapper has been defined', async () => {
|
|
46
|
+
const manifest = await manifestService.loadManifest('unit-test-components', 'test-preview-component', '1.2.4');
|
|
47
|
+
const componentFunction = manifest.getComponentFunctionByName('main');
|
|
48
|
+
const output = await previewService.dressRenderedOutputForPreview(manifest, componentFunction, 'test-preview', 'this is the rendered output fo a component');
|
|
49
|
+
expect(output).toMatchInlineSnapshot(`"this is the rendered output fo a component"`);
|
|
50
|
+
});
|
|
51
|
+
it('dressRenderedOutputForPreview should pass the output through if the functions return type is json', async () => {
|
|
52
|
+
const manifest = await manifestService.loadManifest('unit-test-components', 'test-preview-component', '1.0.1');
|
|
53
|
+
const componentFunction = manifest.getComponentFunctionByName('promise-func');
|
|
54
|
+
const output = await previewService.dressRenderedOutputForPreview(manifest, componentFunction, 'test-preview', {
|
|
55
|
+
hello: 'hello',
|
|
56
|
+
});
|
|
57
|
+
expect(output).toMatchInlineSnapshot(`
|
|
58
|
+
{
|
|
59
|
+
"hello": "hello",
|
|
60
|
+
}
|
|
61
|
+
`);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=PreviewComponentService.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreviewComponentService.spec.js","sourceRoot":"","sources":["../src/PreviewComponentService.spec.ts"],"names":[],"mappings":";;AAAA,wDAAoE;AACpE,uEAAoE;AACpE,wDAAiD;AAEjD,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,MAAM,eAAe,GAAG,IAAI,4CAA4B,CACtD,OAAO,CAAC,GAAG,CAAC,gBAAiB,EAC7B,IAAA,yBAAS,EAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC,CAC/C,CAAC;IACF,MAAM,cAAc,GAAG,IAAI,iDAAuB,EAAE,CAAC;IAErD,EAAE,CAAC,+FAA+F,EAAE,KAAK,IAAI,EAAE;QAC7G,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,sBAAsB,EAAE,wBAAwB,EAAE,OAAO,CAAC,CAAC;QAC/G,MAAM,iBAAiB,GAAG,QAAQ,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;QAEvE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,6BAA6B,CAC/D,QAAQ,EACR,iBAAiB,EACjB,iBAAiB,EACjB,4CAA4C,CAC7C,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;KAcpC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sHAAsH,EAAE,KAAK,IAAI,EAAE;QACpI,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,sBAAsB,EAAE,wBAAwB,EAAE,OAAO,CAAC,CAAC;QAC/G,MAAM,iBAAiB,GAAG,QAAQ,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;QAEtE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,6BAA6B,CAC/D,QAAQ,EACR,iBAAiB,EACjB,cAAc,EACd,4CAA4C,CAC7C,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;KAUpC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6FAA6F,EAAE,KAAK,IAAI,EAAE;QAC3G,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,sBAAsB,EAAE,wBAAwB,EAAE,OAAO,CAAC,CAAC;QAC/G,MAAM,iBAAiB,GAAG,QAAQ,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;QAEtE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,6BAA6B,CAC/D,QAAQ,EACR,iBAAiB,EACjB,cAAc,EACd,4CAA4C,CAC7C,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,8CAA8C,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mGAAmG,EAAE,KAAK,IAAI,EAAE;QACjH,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,sBAAsB,EAAE,wBAAwB,EAAE,OAAO,CAAC,CAAC;QAC/G,MAAM,iBAAiB,GAAG,QAAQ,CAAC,0BAA0B,CAAC,cAAc,CAAC,CAAC;QAE9E,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,6BAA6B,CAAC,QAAQ,EAAE,iBAAiB,EAAE,cAAc,EAAE;YAC7G,KAAK,EAAE,OAAO;SACf,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;KAIpC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,286 @@
|
|
|
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
|
+
exports.RenderInputService = void 0;
|
|
7
|
+
const strict_1 = __importDefault(require("assert/strict"));
|
|
8
|
+
const dx_common_lib_1 = require("@squiz/dx-common-lib");
|
|
9
|
+
const formatted_text_lib_1 = require("@squiz/formatted-text-lib");
|
|
10
|
+
const dx_json_schema_lib_1 = require("@squiz/dx-json-schema-lib");
|
|
11
|
+
const api_1 = require("@opentelemetry/api");
|
|
12
|
+
const tracer = api_1.trace.getTracer('render-runtime-lib:RenderInputService');
|
|
13
|
+
const PREVIEW_COMPONENT_SET = 'unknown';
|
|
14
|
+
class RenderInputService {
|
|
15
|
+
constructor(apiKeyService, componentSetService, manifestService, componentFunctionService, contentItemService, rootUrlResolver) {
|
|
16
|
+
this.apiKeyService = apiKeyService;
|
|
17
|
+
this.componentSetService = componentSetService;
|
|
18
|
+
this.manifestService = manifestService;
|
|
19
|
+
this.componentFunctionService = componentFunctionService;
|
|
20
|
+
this.contentItemService = contentItemService;
|
|
21
|
+
this.rootUrlResolver = rootUrlResolver;
|
|
22
|
+
}
|
|
23
|
+
async resolveInput(request) {
|
|
24
|
+
return tracer.startActiveSpan('resolveInput', {
|
|
25
|
+
attributes: {
|
|
26
|
+
'component.id': request.componentName,
|
|
27
|
+
'component.version': request.version,
|
|
28
|
+
'component.function': request.functionName,
|
|
29
|
+
'component.set': request.componentSet,
|
|
30
|
+
'component.preview': request.previewKey,
|
|
31
|
+
},
|
|
32
|
+
}, async (span) => {
|
|
33
|
+
try {
|
|
34
|
+
const renderType = this.getRenderType(request);
|
|
35
|
+
span.setAttribute('render.inputType', renderType);
|
|
36
|
+
const manifest = await this.manifestService.loadManifest(request.namespace, request.componentName, request.version, {
|
|
37
|
+
validateFunction: request.functionName,
|
|
38
|
+
});
|
|
39
|
+
switch (renderType) {
|
|
40
|
+
case 'content-item-and-set':
|
|
41
|
+
return this.getContentItemAndSetInput(request, manifest);
|
|
42
|
+
case 'set-without-content-item':
|
|
43
|
+
return this.getSetWithoutContentItem(request, manifest); // TODO: confirm if we should be updating query handling here
|
|
44
|
+
case 'preview':
|
|
45
|
+
return this.getPreviewRenderInput(request, manifest); // TODO: confirm if we should be updating query handling here
|
|
46
|
+
default:
|
|
47
|
+
return (0, dx_common_lib_1.never)(renderType);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
span.end();
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
getRenderType(request) {
|
|
56
|
+
if (request.previewKey) {
|
|
57
|
+
if (request.contentItemId) {
|
|
58
|
+
throw new dx_common_lib_1.BadRequestError('You cannot provide a previewKey and a ContentId as input');
|
|
59
|
+
}
|
|
60
|
+
if (request.componentSet) {
|
|
61
|
+
throw new dx_common_lib_1.BadRequestError('You cannot provide a previewKey and a componentSet as input');
|
|
62
|
+
}
|
|
63
|
+
return 'preview';
|
|
64
|
+
}
|
|
65
|
+
if (request.componentSet) {
|
|
66
|
+
if (request.contentItemId) {
|
|
67
|
+
return 'content-item-and-set';
|
|
68
|
+
}
|
|
69
|
+
return 'set-without-content-item';
|
|
70
|
+
}
|
|
71
|
+
throw new dx_common_lib_1.BadRequestError('invalid input, you must provide either a previewKey or a component set');
|
|
72
|
+
}
|
|
73
|
+
async getContentItemAndSetInput(request, manifest) {
|
|
74
|
+
await this.assertComponentVersionInSet(request, manifest);
|
|
75
|
+
const componentFunction = manifest.getComponentFunctionByName(request.functionName);
|
|
76
|
+
const entryFunctionPath = await manifest.getComponentFunctionEntryFilePath(componentFunction);
|
|
77
|
+
const input = await this.getContentFromContentService(request);
|
|
78
|
+
const set = await this.componentSetService.getComponentSet(request.componentSet); // ! is safe because componentSet only undefined for preview
|
|
79
|
+
const runtimeSet = await this.componentSetService.getComponentsRuntimeSetData(manifest, set);
|
|
80
|
+
const publicFacingUrl = this.rootUrlResolver(request.expressRequest, true);
|
|
81
|
+
const webManifest = this.componentFunctionService.prepareManifestForWebResponse(manifest, runtimeSet.webPath, publicFacingUrl);
|
|
82
|
+
const headers = this.componentSetService.getComponentRuntimeHeaders(set, componentFunction);
|
|
83
|
+
this.assertInputIsValid(input, componentFunction);
|
|
84
|
+
const resolvedInput = await (0, dx_json_schema_lib_1.resolveFormattedTextNodes)(input, componentFunction.input, (0, formatted_text_lib_1.createFormattedTextToHtmlStringResolvers)({
|
|
85
|
+
componentRootUrl: publicFacingUrl,
|
|
86
|
+
}), { withJoin: '' });
|
|
87
|
+
this.assertRenderInputIsValid(resolvedInput, componentFunction);
|
|
88
|
+
const dxpApiKey = this.getDxpApiKey();
|
|
89
|
+
return {
|
|
90
|
+
renderType: 'content-item-and-set',
|
|
91
|
+
input: resolvedInput,
|
|
92
|
+
requestId: request.expressRequest.id,
|
|
93
|
+
componentRootUrl: publicFacingUrl,
|
|
94
|
+
functionName: componentFunction.name,
|
|
95
|
+
functionEntryFilePath: entryFunctionPath,
|
|
96
|
+
componentFunction: componentFunction,
|
|
97
|
+
manifest: manifest,
|
|
98
|
+
manifestForWeb: webManifest,
|
|
99
|
+
componentFullName: manifest.getName(),
|
|
100
|
+
headers: headers,
|
|
101
|
+
componentSet: set,
|
|
102
|
+
runtimeSet: runtimeSet,
|
|
103
|
+
dxpApiKey: dxpApiKey,
|
|
104
|
+
queryParameters: this.getQueryParametersFromRequest(request, componentFunction),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
async getSetWithoutContentItem(request, manifest) {
|
|
108
|
+
await this.assertComponentVersionInSet(request, manifest);
|
|
109
|
+
const componentFunction = manifest.getComponentFunctionByName(request.functionName);
|
|
110
|
+
const entryFunctionPath = await manifest.getComponentFunctionEntryFilePath(componentFunction);
|
|
111
|
+
const set = await this.componentSetService.getComponentSet(request.componentSet); // ! is safe because componentSet only undefined for preview
|
|
112
|
+
const runtimeSet = await this.componentSetService.getComponentsRuntimeSetData(manifest, set);
|
|
113
|
+
const publicFacingUrl = this.rootUrlResolver(request.expressRequest, true);
|
|
114
|
+
const webManifest = this.componentFunctionService.prepareManifestForWebResponse(manifest, runtimeSet.webPath, publicFacingUrl);
|
|
115
|
+
const headers = this.componentSetService.getComponentRuntimeHeaders(set, componentFunction);
|
|
116
|
+
const input = {};
|
|
117
|
+
this.assertInputIsValid(input, componentFunction);
|
|
118
|
+
const dxpApiKey = this.getDxpApiKey();
|
|
119
|
+
return {
|
|
120
|
+
renderType: 'set-without-content-item',
|
|
121
|
+
input: input,
|
|
122
|
+
requestId: request.expressRequest.id,
|
|
123
|
+
componentRootUrl: publicFacingUrl,
|
|
124
|
+
functionName: componentFunction.name,
|
|
125
|
+
functionEntryFilePath: entryFunctionPath,
|
|
126
|
+
componentFunction: componentFunction,
|
|
127
|
+
manifest: manifest,
|
|
128
|
+
manifestForWeb: webManifest,
|
|
129
|
+
componentFullName: manifest.getName(),
|
|
130
|
+
headers: headers,
|
|
131
|
+
componentSet: set,
|
|
132
|
+
runtimeSet: runtimeSet,
|
|
133
|
+
dxpApiKey: dxpApiKey,
|
|
134
|
+
queryParameters: this.getQueryParametersFromRequest(request, componentFunction),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
async getPreviewRenderInput(request, manifest) {
|
|
138
|
+
(0, strict_1.default)(request.previewKey);
|
|
139
|
+
const componentFunction = manifest.getComponentFunctionByName(request.functionName);
|
|
140
|
+
const entryFunctionPath = await manifest.getComponentFunctionEntryFilePath(componentFunction);
|
|
141
|
+
const previewFunctionConfig = manifest.getFunctionPreviewConfiguration(request.previewKey, componentFunction);
|
|
142
|
+
const runtimeSet = this.getPreviewRuntimeSet(manifest, request.expressRequest.query['_previewEnvVars']);
|
|
143
|
+
const publicFacingUrl = this.rootUrlResolver(request.expressRequest, true);
|
|
144
|
+
const webManifest = this.componentFunctionService.prepareManifestForPreview(manifest, request.previewKey, publicFacingUrl);
|
|
145
|
+
const input = await this.getInputForPreview(request, manifest);
|
|
146
|
+
let headers = {};
|
|
147
|
+
if (previewFunctionConfig && previewFunctionConfig.headers) {
|
|
148
|
+
headers = previewFunctionConfig.headers;
|
|
149
|
+
}
|
|
150
|
+
this.assertRenderInputIsValid(input, componentFunction);
|
|
151
|
+
return {
|
|
152
|
+
renderType: 'preview',
|
|
153
|
+
input,
|
|
154
|
+
previewKey: request.previewKey,
|
|
155
|
+
requestId: request.expressRequest.id,
|
|
156
|
+
componentRootUrl: publicFacingUrl,
|
|
157
|
+
functionName: componentFunction.name,
|
|
158
|
+
functionEntryFilePath: entryFunctionPath,
|
|
159
|
+
componentFunction: componentFunction,
|
|
160
|
+
manifest: manifest,
|
|
161
|
+
manifestForWeb: webManifest,
|
|
162
|
+
componentFullName: manifest.getName(),
|
|
163
|
+
headers: headers,
|
|
164
|
+
runtimeSet: runtimeSet,
|
|
165
|
+
manifestPath: await manifest.getManifestPath(),
|
|
166
|
+
queryParameters: this.getQueryParametersFromRequest(request, componentFunction),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
getQueryParametersFromRequest(request, componentFunction) {
|
|
170
|
+
const queryParameters = {};
|
|
171
|
+
// whitelisting of query parameters that should be handled within component service
|
|
172
|
+
// eg _contentContext for matrix asset context
|
|
173
|
+
const whitelistQueryParameters = ['_contentContext']; // TODO: confirm better way to whitelist query params
|
|
174
|
+
for (const parameter of whitelistQueryParameters) {
|
|
175
|
+
if (request.expressRequest.query[parameter] === undefined) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
if (typeof request.expressRequest.query[parameter] !== 'string') {
|
|
179
|
+
throw new dx_common_lib_1.BadRequestError(`Value for query parameter '${parameter}' must be a string`);
|
|
180
|
+
}
|
|
181
|
+
queryParameters[parameter] = request.expressRequest.query[parameter];
|
|
182
|
+
}
|
|
183
|
+
if (componentFunction.queryParameters) {
|
|
184
|
+
for (const parameter of Object.keys(componentFunction.queryParameters)) {
|
|
185
|
+
if (componentFunction.queryParameters[parameter].required &&
|
|
186
|
+
request.expressRequest.query[parameter] === undefined) {
|
|
187
|
+
throw new dx_common_lib_1.BadRequestError(`Required query parameter '${parameter}' is missing`);
|
|
188
|
+
}
|
|
189
|
+
if (request.expressRequest.query[parameter] === undefined) {
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (typeof request.expressRequest.query[parameter] !== 'string') {
|
|
193
|
+
throw new dx_common_lib_1.BadRequestError(`Value for query parameter '${parameter}' must be a string`);
|
|
194
|
+
}
|
|
195
|
+
queryParameters[parameter] = request.expressRequest.query[parameter];
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return queryParameters;
|
|
199
|
+
}
|
|
200
|
+
getPreviewRuntimeSet(manifest, previewEnvVars) {
|
|
201
|
+
return {
|
|
202
|
+
webPath: PREVIEW_COMPONENT_SET,
|
|
203
|
+
displayName: PREVIEW_COMPONENT_SET,
|
|
204
|
+
environment: this.loadEnvironmentVariablesForPreview(manifest.getModel(), previewEnvVars), // Source this from manifest, preview vars and/or local env
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
assertInputIsValid(input, componentFunction) {
|
|
208
|
+
try {
|
|
209
|
+
this.componentFunctionService.assertInputValidForComponentFunction(input, componentFunction);
|
|
210
|
+
}
|
|
211
|
+
catch (e) {
|
|
212
|
+
if (e instanceof Error) {
|
|
213
|
+
const error = new dx_common_lib_1.BadRequestError(e.message);
|
|
214
|
+
error.stack = e.stack;
|
|
215
|
+
throw error;
|
|
216
|
+
}
|
|
217
|
+
throw e;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
assertRenderInputIsValid(input, componentFunction) {
|
|
221
|
+
try {
|
|
222
|
+
this.componentFunctionService.assertRenderInputValidForComponentFunction(input, componentFunction);
|
|
223
|
+
}
|
|
224
|
+
catch (e) {
|
|
225
|
+
if (e instanceof Error) {
|
|
226
|
+
const error = new dx_common_lib_1.BadRequestError(e.message);
|
|
227
|
+
error.stack = e.stack;
|
|
228
|
+
throw error;
|
|
229
|
+
}
|
|
230
|
+
throw e;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
async assertComponentVersionInSet(request, manifest) {
|
|
234
|
+
(0, strict_1.default)(request.componentSet != undefined);
|
|
235
|
+
const set = await this.componentSetService.getComponentSet(request.componentSet);
|
|
236
|
+
const isCompVersionInSet = await this.componentSetService.componentVersionInSet(manifest, set.webPath);
|
|
237
|
+
if (!isCompVersionInSet) {
|
|
238
|
+
throw new dx_common_lib_1.ResourceNotFoundError(`${request.componentName} ${request.version} not in set ${set.webPath}`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
async getInputForPreview(request, manifest) {
|
|
242
|
+
var _a, _b;
|
|
243
|
+
const previewDefinition = (_a = manifest.getModel().previews) === null || _a === void 0 ? void 0 : _a[(_b = request.previewKey) !== null && _b !== void 0 ? _b : ''];
|
|
244
|
+
const functionDefinition = manifest.getComponentFunctionByName(request.functionName);
|
|
245
|
+
const functionData = previewDefinition === null || previewDefinition === void 0 ? void 0 : previewDefinition.functionData[functionDefinition.name];
|
|
246
|
+
let input;
|
|
247
|
+
if (functionData !== undefined) {
|
|
248
|
+
input = await manifest.getFunctionPreviewData(functionData);
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
input = request.expressRequest.query;
|
|
252
|
+
delete input._previewKey;
|
|
253
|
+
}
|
|
254
|
+
return input;
|
|
255
|
+
}
|
|
256
|
+
loadEnvironmentVariablesForPreview(manifest, fallbackVars = {}) {
|
|
257
|
+
const expectedEnvironmentVariables = manifest.environment || [];
|
|
258
|
+
// Are the env vars missing from local AND fallback vars?
|
|
259
|
+
const missingVariables = expectedEnvironmentVariables
|
|
260
|
+
.filter((v) => !(v.name in process.env) && !(v.name in fallbackVars) && v.required !== false)
|
|
261
|
+
.map((v) => v.name);
|
|
262
|
+
strict_1.default.ok(missingVariables.length === 0, `Missing required environment variables: "${missingVariables.join('","')}"`);
|
|
263
|
+
// Get env vars from local OR fallback vars
|
|
264
|
+
return Object.fromEntries(expectedEnvironmentVariables
|
|
265
|
+
.filter((v) => v.name in process.env || v.name in fallbackVars)
|
|
266
|
+
.map((v) => [v.name, process.env[v.name] || fallbackVars[v.name]]));
|
|
267
|
+
}
|
|
268
|
+
async getContentFromContentService(request) {
|
|
269
|
+
if (!this.contentItemService) {
|
|
270
|
+
throw new dx_common_lib_1.InternalServerError('Content Item service is not configured');
|
|
271
|
+
}
|
|
272
|
+
if (!request.contentItemId) {
|
|
273
|
+
throw new dx_common_lib_1.InternalServerError('Content Item id must be defined');
|
|
274
|
+
}
|
|
275
|
+
const contentInput = await this.contentItemService.getContentItem(request.contentItemId, this.getDxpApiKey());
|
|
276
|
+
if (!contentInput) {
|
|
277
|
+
throw new dx_common_lib_1.ResourceNotFoundError(`Cannot find content item with ID '${request.contentItemId}'`);
|
|
278
|
+
}
|
|
279
|
+
return contentInput;
|
|
280
|
+
}
|
|
281
|
+
getDxpApiKey() {
|
|
282
|
+
return this.apiKeyService.getInterServiceKeys()[0];
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
exports.RenderInputService = RenderInputService;
|
|
286
|
+
//# sourceMappingURL=RenderInputService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RenderInputService.js","sourceRoot":"","sources":["../src/RenderInputService.ts"],"names":[],"mappings":"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"}
|