@lwrjs/view-registry 0.8.0-alpha.7 → 0.8.0-alpha.8
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/build/cjs/linkers/legacy_view_bootstrap.cjs +1 -1
- package/build/cjs/linkers/view_bootstrap.cjs +1 -1
- package/build/es/linkers/legacy_view_bootstrap.js +1 -1
- package/build/es/linkers/view_bootstrap.js +1 -1
- package/package.json +6 -6
- package/build/cjs/mobify-view-registry.cjs +0 -212
- package/build/es/mobify-view-registry.d.ts +0 -38
- package/build/es/mobify-view-registry.js +0 -292
|
@@ -58,7 +58,7 @@ async function getHtmlResources(view, viewParams, resourceContext) {
|
|
|
58
58
|
const rootComponents = [];
|
|
59
59
|
const requiredAmdModules = [];
|
|
60
60
|
const preloadAmdModules = [];
|
|
61
|
-
const isSSR = view.bootstrap?.
|
|
61
|
+
const isSSR = view.bootstrap?.ssr;
|
|
62
62
|
if (isAMD) {
|
|
63
63
|
const shimBundle = !bundle ? "lwr-loader-shim-legacy.js" : debug || minify === false ? "lwr-loader-shim-legacy.bundle.js" : "lwr-loader-shim-legacy.bundle.min.js";
|
|
64
64
|
const def = await resourceRegistry.getResource({specifier: shimBundle, version}, runtimeEnvironment, runtimeParams);
|
|
@@ -58,7 +58,7 @@ async function getHtmlResources(view, viewParams, resourceContext) {
|
|
|
58
58
|
const rootComponents = [];
|
|
59
59
|
const requiredAmdModules = [];
|
|
60
60
|
const preloadAmdModules = [];
|
|
61
|
-
const isSSR = view.bootstrap?.
|
|
61
|
+
const isSSR = view.bootstrap?.ssr;
|
|
62
62
|
if (isAMD) {
|
|
63
63
|
const shimBundle = !bundle ? "lwr-loader-shim.js" : debug || minify === false ? "lwr-loader-shim.bundle.js" : "lwr-loader-shim.bundle.min.js";
|
|
64
64
|
const def = await resourceRegistry.getResource({specifier: shimBundle, version}, runtimeEnvironment, runtimeParams);
|
|
@@ -40,7 +40,7 @@ export async function getHtmlResources(view, viewParams, resourceContext) {
|
|
|
40
40
|
// Collection of modules that will be loaded in the view
|
|
41
41
|
const preloadAmdModules = [];
|
|
42
42
|
// Determine if server side rendering view modules
|
|
43
|
-
const isSSR = view.bootstrap?.
|
|
43
|
+
const isSSR = view.bootstrap?.ssr;
|
|
44
44
|
// ------ AMD Required module resources
|
|
45
45
|
if (isAMD) {
|
|
46
46
|
// Keep shim format in sync with view_bootstrap.ts
|
|
@@ -40,7 +40,7 @@ export async function getHtmlResources(view, viewParams, resourceContext) {
|
|
|
40
40
|
// Collection of modules that will be loaded in the view
|
|
41
41
|
const preloadAmdModules = [];
|
|
42
42
|
// Determine if server side rendering view modules
|
|
43
|
-
const isSSR = view.bootstrap?.
|
|
43
|
+
const isSSR = view.bootstrap?.ssr;
|
|
44
44
|
// ------ AMD Required module resources
|
|
45
45
|
if (isAMD) {
|
|
46
46
|
// Keep shim format in sync with legacy_view_bootstrap.ts
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
|
-
"version": "0.8.0-alpha.
|
|
7
|
+
"version": "0.8.0-alpha.8",
|
|
8
8
|
"homepage": "https://developer.salesforce.com/docs/platform/lwr/overview",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
@@ -30,15 +30,15 @@
|
|
|
30
30
|
"build/**/*.d.ts"
|
|
31
31
|
],
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@lwrjs/app-service": "0.8.0-alpha.
|
|
34
|
-
"@lwrjs/diagnostics": "0.8.0-alpha.
|
|
35
|
-
"@lwrjs/shared-utils": "0.8.0-alpha.
|
|
33
|
+
"@lwrjs/app-service": "0.8.0-alpha.8",
|
|
34
|
+
"@lwrjs/diagnostics": "0.8.0-alpha.8",
|
|
35
|
+
"@lwrjs/shared-utils": "0.8.0-alpha.8"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@lwrjs/types": "0.8.0-alpha.
|
|
38
|
+
"@lwrjs/types": "0.8.0-alpha.8"
|
|
39
39
|
},
|
|
40
40
|
"engines": {
|
|
41
41
|
"node": ">=14.15.4 <19"
|
|
42
42
|
},
|
|
43
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "345e7545d2d1d1f587567aacf0a072473c746d9e"
|
|
44
44
|
}
|
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
var __create = Object.create;
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
4
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
7
|
-
var __markAsModule = (target) => __defProp(target, "__esModule", {value: true});
|
|
8
|
-
var __export = (target, all) => {
|
|
9
|
-
for (var name in all)
|
|
10
|
-
__defProp(target, name, {get: all[name], enumerable: true});
|
|
11
|
-
};
|
|
12
|
-
var __exportStar = (target, module2, desc) => {
|
|
13
|
-
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
|
|
14
|
-
for (let key of __getOwnPropNames(module2))
|
|
15
|
-
if (!__hasOwnProp.call(target, key) && key !== "default")
|
|
16
|
-
__defProp(target, key, {get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable});
|
|
17
|
-
}
|
|
18
|
-
return target;
|
|
19
|
-
};
|
|
20
|
-
var __toModule = (module2) => {
|
|
21
|
-
return __exportStar(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2);
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
// packages/@lwrjs/view-registry/src/mobify-view-registry.ts
|
|
25
|
-
__markAsModule(exports);
|
|
26
|
-
__export(exports, {
|
|
27
|
-
MobifyViewRegistry: () => MobifyViewRegistry
|
|
28
|
-
});
|
|
29
|
-
var import_shared_utils = __toModule(require("@lwrjs/shared-utils"));
|
|
30
|
-
var import_link_lwr_resources = __toModule(require("./linkers/link-lwr-resources.cjs"));
|
|
31
|
-
var import_utils = __toModule(require("./utils.cjs"));
|
|
32
|
-
var MobifyViewRegistry = class {
|
|
33
|
-
constructor(context, globalConfig) {
|
|
34
|
-
this.viewProviders = [];
|
|
35
|
-
this.immutableAssets = new Map();
|
|
36
|
-
this.pendingViewDefinitions = new Map();
|
|
37
|
-
this.name = "mobify-view-registry";
|
|
38
|
-
this.resourceRegistry = context.resourceRegistry;
|
|
39
|
-
this.runtimeEnvironment = context.runtimeEnvironment;
|
|
40
|
-
this.moduleRegistry = context.moduleRegistry;
|
|
41
|
-
this.moduleBundler = context.moduleBundler;
|
|
42
|
-
this.assetRegistry = context.assetRegistry;
|
|
43
|
-
this.viewTransformers = context.viewTransformers || [];
|
|
44
|
-
this.globalConfig = globalConfig;
|
|
45
|
-
this.globalData = context.globalData;
|
|
46
|
-
}
|
|
47
|
-
getPublicApi() {
|
|
48
|
-
return {
|
|
49
|
-
getViewDefinition: this.getViewDefinition.bind(this),
|
|
50
|
-
getView: this.getView.bind(this)
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
addViewProviders(providers) {
|
|
54
|
-
this.viewProviders.push(...providers);
|
|
55
|
-
}
|
|
56
|
-
addViewTransformers(transformers) {
|
|
57
|
-
this.viewTransformers.push(...transformers);
|
|
58
|
-
}
|
|
59
|
-
initializeViewProviders() {
|
|
60
|
-
return Promise.all(this.viewProviders.map((vp) => vp.initialize()));
|
|
61
|
-
}
|
|
62
|
-
async delegateGetView(viewId) {
|
|
63
|
-
for (const vp of this.viewProviders) {
|
|
64
|
-
const result = await vp.getView(viewId);
|
|
65
|
-
if (result) {
|
|
66
|
-
return result;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
throw new Error(`No View provider was able to resolve a view for template: ${viewId.contentTemplate}`);
|
|
70
|
-
}
|
|
71
|
-
async getView(viewId, skipCaching = false) {
|
|
72
|
-
const {contentTemplate, rootComponent} = viewId;
|
|
73
|
-
const compiledView = await this.delegateGetView(viewId);
|
|
74
|
-
return compiledView;
|
|
75
|
-
}
|
|
76
|
-
hasViewDefinition(view, viewParams, runtimeEnvironment, runtimeParams, renderOptions) {
|
|
77
|
-
return false;
|
|
78
|
-
}
|
|
79
|
-
async getViewDefinition(view, viewParams, runtimeEnvironment, runtimeParams, renderOptions) {
|
|
80
|
-
const {skipCaching, freezeAssets, viewParamCacheKey} = (0, import_utils.normalizeRenderOptions)(this.runtimeEnvironment, renderOptions);
|
|
81
|
-
const pendingViewDefinition = this.renderView(view, viewParams, runtimeEnvironment, runtimeParams, renderOptions);
|
|
82
|
-
const viewDefinition = await pendingViewDefinition;
|
|
83
|
-
return viewDefinition;
|
|
84
|
-
}
|
|
85
|
-
async renderView(view, viewParams, runtimeEnvironment, runtimeParams = {}, renderOptions) {
|
|
86
|
-
const {contentTemplate, rootComponent, layoutTemplate} = view;
|
|
87
|
-
const lwrResourcesId = `__LWR_RESOURCES__${Date.now()}`;
|
|
88
|
-
const renderedContent = await this.render({contentTemplate, rootComponent}, {...viewParams, lwr_resources: lwrResourcesId}, renderOptions);
|
|
89
|
-
let normalizedRenderOptions = (0, import_utils.normalizeRenderOptions)(this.runtimeEnvironment, renderedContent.options, renderOptions);
|
|
90
|
-
const layout = layoutTemplate || renderedContent.compiledView.layoutTemplate;
|
|
91
|
-
if (!layout) {
|
|
92
|
-
const renderedViewDef2 = await this.link(renderedContent, {
|
|
93
|
-
view,
|
|
94
|
-
viewParams,
|
|
95
|
-
runtimeEnvironment,
|
|
96
|
-
runtimeParams,
|
|
97
|
-
renderOptions: normalizedRenderOptions,
|
|
98
|
-
contentIds: {lwrResourcesId}
|
|
99
|
-
});
|
|
100
|
-
return renderedViewDef2;
|
|
101
|
-
}
|
|
102
|
-
const layoutTemplatePath = (0, import_shared_utils.normalizeResourcePath)(layout, this.globalConfig);
|
|
103
|
-
const renderedLayout = await this.render({contentTemplate: layoutTemplatePath}, {
|
|
104
|
-
...renderedContent.compiledView.properties,
|
|
105
|
-
...viewParams,
|
|
106
|
-
body: renderedContent.renderedView,
|
|
107
|
-
lwr_resources: lwrResourcesId
|
|
108
|
-
});
|
|
109
|
-
normalizedRenderOptions = (0, import_utils.normalizeRenderOptions)(this.runtimeEnvironment, renderedLayout.options, normalizedRenderOptions);
|
|
110
|
-
const renderedViewDef = await this.link({
|
|
111
|
-
...renderedLayout,
|
|
112
|
-
compiledView: {
|
|
113
|
-
...renderedLayout.compiledView,
|
|
114
|
-
immutable: renderedContent.compiledView.immutable && renderedLayout.compiledView.immutable
|
|
115
|
-
},
|
|
116
|
-
metadata: {
|
|
117
|
-
customElements: [
|
|
118
|
-
...renderedContent.metadata.customElements,
|
|
119
|
-
...renderedLayout.metadata.customElements
|
|
120
|
-
],
|
|
121
|
-
assetReferences: [
|
|
122
|
-
...renderedContent.metadata.assetReferences,
|
|
123
|
-
...renderedLayout.metadata.assetReferences
|
|
124
|
-
]
|
|
125
|
-
}
|
|
126
|
-
}, {
|
|
127
|
-
view: {...view, layoutTemplate: layoutTemplatePath},
|
|
128
|
-
viewParams,
|
|
129
|
-
runtimeEnvironment,
|
|
130
|
-
runtimeParams,
|
|
131
|
-
renderOptions: normalizedRenderOptions,
|
|
132
|
-
contentIds: {lwrResourcesId},
|
|
133
|
-
importer: renderedContent.compiledView.filePath
|
|
134
|
-
});
|
|
135
|
-
return renderedViewDef;
|
|
136
|
-
}
|
|
137
|
-
async render(viewId, viewParams, renderOptions) {
|
|
138
|
-
const globalContext = this.globalData;
|
|
139
|
-
const {rootComponent, contentTemplate} = viewId;
|
|
140
|
-
const compiledView = await this.getView({
|
|
141
|
-
contentTemplate,
|
|
142
|
-
rootComponent
|
|
143
|
-
}, renderOptions?.skipCaching);
|
|
144
|
-
const result = await compiledView.render({
|
|
145
|
-
...globalContext,
|
|
146
|
-
...compiledView.properties,
|
|
147
|
-
...viewParams
|
|
148
|
-
});
|
|
149
|
-
const normalizedResult = (0, import_utils.normalizeRenderedResult)(result);
|
|
150
|
-
return {
|
|
151
|
-
compiledView,
|
|
152
|
-
...normalizedResult
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
async link(renderedView, viewContext) {
|
|
156
|
-
const {
|
|
157
|
-
view,
|
|
158
|
-
viewParams,
|
|
159
|
-
runtimeEnvironment: runtimeEnv,
|
|
160
|
-
runtimeParams,
|
|
161
|
-
renderOptions,
|
|
162
|
-
contentIds,
|
|
163
|
-
importer
|
|
164
|
-
} = viewContext;
|
|
165
|
-
const {skipMetadataCollection, freezeAssets} = renderOptions;
|
|
166
|
-
const {lwrResourcesId} = contentIds;
|
|
167
|
-
const {moduleRegistry, resourceRegistry, moduleBundler} = this;
|
|
168
|
-
const runtimeEnvironment = {...runtimeEnv, immutableAssets: freezeAssets};
|
|
169
|
-
const {
|
|
170
|
-
renderedView: renderedViewContent,
|
|
171
|
-
metadata: renderedViewMetadata,
|
|
172
|
-
compiledView: {immutable = true}
|
|
173
|
-
} = renderedView;
|
|
174
|
-
const linkedMetadata = skipMetadataCollection ? renderedViewMetadata : await (0, import_shared_utils.extractMetadataFromHtml)(renderedViewContent);
|
|
175
|
-
const mergedViewContext = {
|
|
176
|
-
...viewContext,
|
|
177
|
-
runtimeEnvironment,
|
|
178
|
-
importer: importer || renderedView.compiledView.filePath
|
|
179
|
-
};
|
|
180
|
-
const stringBuilder = (0, import_shared_utils.createStringBuilder)(renderedViewContent);
|
|
181
|
-
for (const viewTransformer of this.viewTransformers) {
|
|
182
|
-
await viewTransformer.link?.(stringBuilder, mergedViewContext, linkedMetadata);
|
|
183
|
-
}
|
|
184
|
-
const linkedAssetContent = stringBuilder.toString();
|
|
185
|
-
if (linkedAssetContent.includes(lwrResourcesId)) {
|
|
186
|
-
const {renderedView: linkedView, viewRecord} = await (0, import_link_lwr_resources.linkLwrResources)(linkedAssetContent, view, viewParams, {
|
|
187
|
-
lwrResourcesId,
|
|
188
|
-
viewMetadata: linkedMetadata,
|
|
189
|
-
moduleRegistry,
|
|
190
|
-
moduleBundler,
|
|
191
|
-
resourceRegistry,
|
|
192
|
-
runtimeEnvironment,
|
|
193
|
-
runtimeParams
|
|
194
|
-
});
|
|
195
|
-
return {
|
|
196
|
-
renderedView: linkedView,
|
|
197
|
-
immutable,
|
|
198
|
-
viewRecord: {
|
|
199
|
-
assetReferences: (0, import_utils.reduceSourceAssetReferences)(linkedMetadata.assetReferences),
|
|
200
|
-
...viewRecord
|
|
201
|
-
}
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
return {
|
|
205
|
-
renderedView: linkedAssetContent,
|
|
206
|
-
immutable,
|
|
207
|
-
viewRecord: {
|
|
208
|
-
assetReferences: (0, import_utils.reduceSourceAssetReferences)(linkedMetadata.assetReferences)
|
|
209
|
-
}
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
};
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { AssetRegistry, CompiledView, Json, LinkedViewDefinition, ModuleBundler, ModuleRegistry, NormalizedLwrGlobalConfig, PublicViewRegistry, RenderOptions, ResourceRegistry, RuntimeEnvironment, RuntimeParams, View, ViewIdentity, ViewParams, ViewProvider, ViewRegistry, ViewTransformPlugin } from '@lwrjs/types';
|
|
2
|
-
interface ViewProviderContext {
|
|
3
|
-
viewTransformers?: ViewTransformPlugin[];
|
|
4
|
-
assetRegistry: AssetRegistry;
|
|
5
|
-
moduleRegistry: ModuleRegistry;
|
|
6
|
-
moduleBundler: ModuleBundler;
|
|
7
|
-
resourceRegistry: ResourceRegistry;
|
|
8
|
-
globalData: Json;
|
|
9
|
-
runtimeEnvironment: RuntimeEnvironment;
|
|
10
|
-
}
|
|
11
|
-
export declare class MobifyViewRegistry implements ViewRegistry {
|
|
12
|
-
name: string;
|
|
13
|
-
viewProviders: ViewProvider[];
|
|
14
|
-
resourceRegistry: ResourceRegistry;
|
|
15
|
-
moduleRegistry: ModuleRegistry;
|
|
16
|
-
moduleBundler: ModuleBundler;
|
|
17
|
-
assetRegistry: AssetRegistry;
|
|
18
|
-
globalConfig: NormalizedLwrGlobalConfig;
|
|
19
|
-
globalData: Json;
|
|
20
|
-
runtimeEnvironment: RuntimeEnvironment;
|
|
21
|
-
immutableAssets: Map<string, string>;
|
|
22
|
-
viewTransformers: ViewTransformPlugin[];
|
|
23
|
-
private pendingViewDefinitions;
|
|
24
|
-
constructor(context: ViewProviderContext, globalConfig: NormalizedLwrGlobalConfig);
|
|
25
|
-
getPublicApi(): PublicViewRegistry;
|
|
26
|
-
addViewProviders(providers: ViewProvider[]): void;
|
|
27
|
-
addViewTransformers(transformers: ViewTransformPlugin[]): void;
|
|
28
|
-
initializeViewProviders(): Promise<void[]>;
|
|
29
|
-
delegateGetView(viewId: ViewIdentity): Promise<CompiledView>;
|
|
30
|
-
getView(viewId: ViewIdentity, skipCaching?: boolean): Promise<CompiledView>;
|
|
31
|
-
hasViewDefinition(view: View, viewParams: ViewParams, runtimeEnvironment: RuntimeEnvironment, runtimeParams?: RuntimeParams, renderOptions?: RenderOptions): boolean;
|
|
32
|
-
getViewDefinition(view: View, viewParams: ViewParams, runtimeEnvironment: RuntimeEnvironment, runtimeParams?: RuntimeParams, renderOptions?: RenderOptions): Promise<LinkedViewDefinition>;
|
|
33
|
-
private renderView;
|
|
34
|
-
private render;
|
|
35
|
-
private link;
|
|
36
|
-
}
|
|
37
|
-
export {};
|
|
38
|
-
//# sourceMappingURL=mobify-view-registry.d.ts.map
|
|
@@ -1,292 +0,0 @@
|
|
|
1
|
-
import { normalizeResourcePath, extractMetadataFromHtml, createStringBuilder, } from '@lwrjs/shared-utils';
|
|
2
|
-
import { linkLwrResources } from './linkers/link-lwr-resources.js';
|
|
3
|
-
import { normalizeRenderOptions, normalizeRenderedResult, reduceSourceAssetReferences } from './utils.js';
|
|
4
|
-
export class MobifyViewRegistry {
|
|
5
|
-
constructor(context, globalConfig) {
|
|
6
|
-
this.viewProviders = [];
|
|
7
|
-
this.immutableAssets = new Map();
|
|
8
|
-
// Cache of unresolved view definitions
|
|
9
|
-
// Cache key: View + View Params
|
|
10
|
-
//
|
|
11
|
-
// Pending view definitions are tracked to prevent concurrent resolution of the same view.
|
|
12
|
-
// Subsequent requests for the same view will await the original promise.
|
|
13
|
-
// Cache entries will be removed once the view is resolved.
|
|
14
|
-
this.pendingViewDefinitions = new Map();
|
|
15
|
-
this.name = 'mobify-view-registry';
|
|
16
|
-
this.resourceRegistry = context.resourceRegistry;
|
|
17
|
-
this.runtimeEnvironment = context.runtimeEnvironment;
|
|
18
|
-
this.moduleRegistry = context.moduleRegistry;
|
|
19
|
-
this.moduleBundler = context.moduleBundler;
|
|
20
|
-
this.assetRegistry = context.assetRegistry;
|
|
21
|
-
this.viewTransformers = context.viewTransformers || [];
|
|
22
|
-
this.globalConfig = globalConfig;
|
|
23
|
-
this.globalData = context.globalData;
|
|
24
|
-
// this.appEmitter = context.appEmitter;
|
|
25
|
-
// const observer = context.appObserver;
|
|
26
|
-
// Observers for cached entries external dependencies -- view templates, modules, and assets
|
|
27
|
-
// observer.onViewSourceChange(({ payload }) => this.onViewSourceChange(payload));
|
|
28
|
-
// observer.onModuleDefinitionChange(({ payload }) => this.onModuleDefinitionChange(payload));
|
|
29
|
-
// observer.onAssetSourceChange(({ payload }) => this.onAssetSourceChange(payload));
|
|
30
|
-
}
|
|
31
|
-
getPublicApi() {
|
|
32
|
-
return {
|
|
33
|
-
getViewDefinition: this.getViewDefinition.bind(this),
|
|
34
|
-
getView: this.getView.bind(this),
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
// -- Public API --------------------------------------------------------------------
|
|
38
|
-
// Add new view providers
|
|
39
|
-
addViewProviders(providers) {
|
|
40
|
-
this.viewProviders.push(...providers);
|
|
41
|
-
}
|
|
42
|
-
addViewTransformers(transformers) {
|
|
43
|
-
this.viewTransformers.push(...transformers);
|
|
44
|
-
}
|
|
45
|
-
initializeViewProviders() {
|
|
46
|
-
return Promise.all(this.viewProviders.map((vp) => vp.initialize()));
|
|
47
|
-
}
|
|
48
|
-
async delegateGetView(viewId) {
|
|
49
|
-
for (const vp of this.viewProviders) {
|
|
50
|
-
// eslint-disable-next-line no-await-in-loop
|
|
51
|
-
const result = await vp.getView(viewId);
|
|
52
|
-
if (result) {
|
|
53
|
-
return result;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
throw new Error(`No View provider was able to resolve a view for template: ${viewId.contentTemplate}`);
|
|
57
|
-
}
|
|
58
|
-
async getView(viewId, skipCaching = false) {
|
|
59
|
-
const { contentTemplate, rootComponent } = viewId;
|
|
60
|
-
// TODO no need for in memory cache here but need to prevent multiple requests to same view
|
|
61
|
-
// const compiledViewCacheKey = getCacheKeyFromJson({ contentTemplate, rootComponent });
|
|
62
|
-
// // use cached compiledView if available
|
|
63
|
-
// if (!skipCaching && this.compiledViews.has(compiledViewCacheKey)) {
|
|
64
|
-
// return this.compiledViews.get(compiledViewCacheKey) as CompiledView;
|
|
65
|
-
// }
|
|
66
|
-
const compiledView = await this.delegateGetView(viewId);
|
|
67
|
-
// cache the compiled view
|
|
68
|
-
// if (!skipCaching) {
|
|
69
|
-
// this.compiledViews.set(compiledViewCacheKey, compiledView);
|
|
70
|
-
// }
|
|
71
|
-
return compiledView;
|
|
72
|
-
}
|
|
73
|
-
hasViewDefinition(view, viewParams, runtimeEnvironment, runtimeParams, renderOptions) {
|
|
74
|
-
// const { id, bootstrap, rootComponent, contentTemplate, layoutTemplate } = view;
|
|
75
|
-
// const { freezeAssets, viewParamCacheKey } = normalizeRenderOptions(
|
|
76
|
-
// this.runtimeEnvironment,
|
|
77
|
-
// renderOptions,
|
|
78
|
-
// );
|
|
79
|
-
// const viewDefId = getCacheKeyFromJson({
|
|
80
|
-
// id, // application
|
|
81
|
-
// bootstrap, // application configuration
|
|
82
|
-
// rootComponent, // content property
|
|
83
|
-
// contentTemplate, // content property
|
|
84
|
-
// layoutTemplate, // content property
|
|
85
|
-
// freezeAssets, // renderingShape
|
|
86
|
-
// locale: runtimeParams?.locale,
|
|
87
|
-
// debug: runtimeEnvironment.debug,
|
|
88
|
-
// });
|
|
89
|
-
// // viewParams is an unbounded object and can be very large (17MB/view for developer.salesforce.com). Allowing conusmers
|
|
90
|
-
// // to provide a simple override avoids the excess memory / performance overhead of serializing & storing the viewParams
|
|
91
|
-
// // on every request, while still reusing our caching logic.
|
|
92
|
-
// const viewParamKey = viewParamCacheKey
|
|
93
|
-
// ? getCacheKeyFromJson(viewParamCacheKey)
|
|
94
|
-
// : getCacheKeyFromJson(viewParams);
|
|
95
|
-
// // important: cache key does not include the unbounded viewParams
|
|
96
|
-
// if (this.viewDefinitions.has(viewDefId)) {
|
|
97
|
-
// const viewDef = this.viewDefinitions.get(viewDefId);
|
|
98
|
-
// if (viewDef && viewDef.paramKey === viewParamKey) {
|
|
99
|
-
// return true;
|
|
100
|
-
// }
|
|
101
|
-
// }
|
|
102
|
-
return false;
|
|
103
|
-
}
|
|
104
|
-
async getViewDefinition(view, viewParams, runtimeEnvironment, runtimeParams, renderOptions) {
|
|
105
|
-
const { skipCaching, freezeAssets, viewParamCacheKey } = normalizeRenderOptions(this.runtimeEnvironment, renderOptions);
|
|
106
|
-
// const viewDefCacheKey = getCacheKeyFromJson({
|
|
107
|
-
// ...view,
|
|
108
|
-
// freezeAssets, // renderingShape,
|
|
109
|
-
// locale: runtimeParams?.locale,
|
|
110
|
-
// debug: runtimeEnvironment.debug,
|
|
111
|
-
// });
|
|
112
|
-
// viewParams is an unbounded object and can be very large (17MB/view for developer.salesforce.com). Allowing consumers
|
|
113
|
-
// to provide a simple override avoids the excess memory / performance overhead of serializing & storing the viewParams
|
|
114
|
-
// on every request, while still reusing our caching logic.
|
|
115
|
-
// const viewParamKey = viewParamCacheKey
|
|
116
|
-
// ? getCacheKeyFromJson(viewParamCacheKey)
|
|
117
|
-
// : getCacheKeyFromJson(viewParams);
|
|
118
|
-
// const cacheDisabled = process.env.NOCACHE === 'true' || skipCaching;
|
|
119
|
-
// important: cache key does not include the unbounded viewParams
|
|
120
|
-
// if (cacheDisabled === false && this.viewDefinitions.has(viewDefCacheKey)) {
|
|
121
|
-
// const viewDefinition = this.viewDefinitions.get(viewDefCacheKey);
|
|
122
|
-
// if (
|
|
123
|
-
// viewDefinition &&
|
|
124
|
-
// viewDefinition.paramKey === viewParamKey &&
|
|
125
|
-
// viewDefinition.viewDefinition.immutable
|
|
126
|
-
// ) {
|
|
127
|
-
// return viewDefinition.viewDefinition;
|
|
128
|
-
// }
|
|
129
|
-
// }
|
|
130
|
-
// const pendingViewDefCacheKey = viewDefCacheKey + viewParamKey;
|
|
131
|
-
// if (this.pendingViewDefinitions.has(pendingViewDefCacheKey)) {
|
|
132
|
-
// return this.pendingViewDefinitions.get(pendingViewDefCacheKey) as Promise<LinkedViewDefinition>;
|
|
133
|
-
// }
|
|
134
|
-
// TODO pending view definition key
|
|
135
|
-
const pendingViewDefinition = this.renderView(view, viewParams, runtimeEnvironment, runtimeParams, renderOptions);
|
|
136
|
-
// this.pendingViewDefinitions.set(pendingViewDefCacheKey, pendingViewDefinition);
|
|
137
|
-
const viewDefinition = await pendingViewDefinition;
|
|
138
|
-
// this.pendingViewDefinitions.delete(pendingViewDefCacheKey);
|
|
139
|
-
// if (cacheDisabled === false) {
|
|
140
|
-
// this.viewDefinitions.set(viewDefCacheKey, {
|
|
141
|
-
// view,
|
|
142
|
-
// viewDefinition,
|
|
143
|
-
// paramKey: viewParamKey,
|
|
144
|
-
// });
|
|
145
|
-
// }
|
|
146
|
-
return viewDefinition;
|
|
147
|
-
}
|
|
148
|
-
async renderView(view, viewParams, runtimeEnvironment, runtimeParams = {}, renderOptions) {
|
|
149
|
-
const { contentTemplate, rootComponent, layoutTemplate } = view;
|
|
150
|
-
const lwrResourcesId = `__LWR_RESOURCES__${Date.now()}`;
|
|
151
|
-
const renderedContent = await this.render({ contentTemplate, rootComponent }, { ...viewParams, lwr_resources: lwrResourcesId }, renderOptions);
|
|
152
|
-
// normalize the renderOptions provided by the CompiledView content with the request options.
|
|
153
|
-
let normalizedRenderOptions = normalizeRenderOptions(this.runtimeEnvironment, renderedContent.options, renderOptions);
|
|
154
|
-
const layout = layoutTemplate || renderedContent.compiledView.layoutTemplate;
|
|
155
|
-
if (!layout) {
|
|
156
|
-
// Content only view
|
|
157
|
-
const renderedViewDef = await this.link(renderedContent, {
|
|
158
|
-
view,
|
|
159
|
-
viewParams,
|
|
160
|
-
runtimeEnvironment,
|
|
161
|
-
runtimeParams,
|
|
162
|
-
// using any options provided by the content, overridden with invocation provided rendering options
|
|
163
|
-
renderOptions: normalizedRenderOptions,
|
|
164
|
-
contentIds: { lwrResourcesId },
|
|
165
|
-
});
|
|
166
|
-
return renderedViewDef;
|
|
167
|
-
}
|
|
168
|
-
// Layout wrapped content: pass in the view provider properties and body from the rendered content
|
|
169
|
-
const layoutTemplatePath = normalizeResourcePath(layout, this.globalConfig);
|
|
170
|
-
const renderedLayout = await this.render({ contentTemplate: layoutTemplatePath }, {
|
|
171
|
-
...renderedContent.compiledView.properties,
|
|
172
|
-
...viewParams,
|
|
173
|
-
body: renderedContent.renderedView,
|
|
174
|
-
lwr_resources: lwrResourcesId,
|
|
175
|
-
});
|
|
176
|
-
normalizedRenderOptions = normalizeRenderOptions(this.runtimeEnvironment, renderedLayout.options, normalizedRenderOptions);
|
|
177
|
-
const renderedViewDef = await this.link({
|
|
178
|
-
...renderedLayout,
|
|
179
|
-
// Rendered Layout view's immutability is a composite of the layouts mutability and the body's mutability
|
|
180
|
-
compiledView: {
|
|
181
|
-
...renderedLayout.compiledView,
|
|
182
|
-
immutable: renderedContent.compiledView.immutable && renderedLayout.compiledView.immutable,
|
|
183
|
-
},
|
|
184
|
-
// Rendered layouts known metadata is a composition of the layouts and body content's known metadata.
|
|
185
|
-
metadata: {
|
|
186
|
-
customElements: [
|
|
187
|
-
...renderedContent.metadata.customElements,
|
|
188
|
-
...renderedLayout.metadata.customElements,
|
|
189
|
-
],
|
|
190
|
-
assetReferences: [
|
|
191
|
-
...renderedContent.metadata.assetReferences,
|
|
192
|
-
...renderedLayout.metadata.assetReferences,
|
|
193
|
-
],
|
|
194
|
-
},
|
|
195
|
-
},
|
|
196
|
-
// Render Content now contains a layout
|
|
197
|
-
{
|
|
198
|
-
view: { ...view, layoutTemplate: layoutTemplatePath },
|
|
199
|
-
viewParams,
|
|
200
|
-
runtimeEnvironment,
|
|
201
|
-
runtimeParams,
|
|
202
|
-
renderOptions: normalizedRenderOptions,
|
|
203
|
-
contentIds: { lwrResourcesId },
|
|
204
|
-
// TODO: We override the importer with the original view, however
|
|
205
|
-
// Layouts relative paths won't work
|
|
206
|
-
importer: renderedContent.compiledView.filePath,
|
|
207
|
-
});
|
|
208
|
-
return renderedViewDef;
|
|
209
|
-
}
|
|
210
|
-
async render(viewId, viewParams, renderOptions) {
|
|
211
|
-
const globalContext = this.globalData;
|
|
212
|
-
const { rootComponent, contentTemplate } = viewId;
|
|
213
|
-
const compiledView = await this.getView({
|
|
214
|
-
contentTemplate,
|
|
215
|
-
rootComponent,
|
|
216
|
-
}, renderOptions?.skipCaching);
|
|
217
|
-
// Get content/body of the view
|
|
218
|
-
/*
|
|
219
|
-
When rendering the compiled view, a collection variable properties can be passed to the render() to be rendered in
|
|
220
|
-
the view's content. The following are the sources of those properties:
|
|
221
|
-
* GlobalContext is global data provided by the project in the ${globalDataDir}
|
|
222
|
-
* A View Provider MAY expose a set of properties that should be applied to all rendered content generated by the CompiledView renderer()
|
|
223
|
-
* A caller can also pass a set of property parameters derived from the request or out-of-band sources.
|
|
224
|
-
|
|
225
|
-
These are merged together in to a combined context used by render()
|
|
226
|
-
*/
|
|
227
|
-
const result = await compiledView.render({
|
|
228
|
-
...globalContext,
|
|
229
|
-
...compiledView.properties,
|
|
230
|
-
...viewParams,
|
|
231
|
-
});
|
|
232
|
-
const normalizedResult = normalizeRenderedResult(result);
|
|
233
|
-
return {
|
|
234
|
-
compiledView,
|
|
235
|
-
...normalizedResult,
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
async link(renderedView, viewContext) {
|
|
239
|
-
const { view, viewParams, runtimeEnvironment: runtimeEnv, runtimeParams, renderOptions, contentIds, importer, } = viewContext;
|
|
240
|
-
const { skipMetadataCollection, freezeAssets } = renderOptions;
|
|
241
|
-
const { lwrResourcesId } = contentIds;
|
|
242
|
-
const { moduleRegistry, resourceRegistry, moduleBundler } = this;
|
|
243
|
-
const runtimeEnvironment = { ...runtimeEnv, immutableAssets: freezeAssets };
|
|
244
|
-
// normalize/extract metadata
|
|
245
|
-
const { renderedView: renderedViewContent, metadata: renderedViewMetadata, compiledView: { immutable = true }, } = renderedView;
|
|
246
|
-
const linkedMetadata = skipMetadataCollection
|
|
247
|
-
? renderedViewMetadata
|
|
248
|
-
: await extractMetadataFromHtml(renderedViewContent);
|
|
249
|
-
const mergedViewContext = {
|
|
250
|
-
...viewContext,
|
|
251
|
-
runtimeEnvironment,
|
|
252
|
-
importer: importer || renderedView.compiledView.filePath,
|
|
253
|
-
};
|
|
254
|
-
const stringBuilder = createStringBuilder(renderedViewContent);
|
|
255
|
-
for (const viewTransformer of this.viewTransformers) {
|
|
256
|
-
// eslint-disable-next-line no-await-in-loop
|
|
257
|
-
await viewTransformer.link?.(stringBuilder, mergedViewContext, linkedMetadata);
|
|
258
|
-
}
|
|
259
|
-
const linkedAssetContent = stringBuilder.toString();
|
|
260
|
-
// Link LWR related resources
|
|
261
|
-
if (linkedAssetContent.includes(lwrResourcesId)) {
|
|
262
|
-
// This calculation is expensive, only do it if lwr_resources is needed
|
|
263
|
-
// Link LWR View resources if necessary
|
|
264
|
-
const { renderedView: linkedView, viewRecord } = await linkLwrResources(linkedAssetContent, view, viewParams, {
|
|
265
|
-
lwrResourcesId,
|
|
266
|
-
viewMetadata: linkedMetadata,
|
|
267
|
-
moduleRegistry,
|
|
268
|
-
moduleBundler,
|
|
269
|
-
resourceRegistry,
|
|
270
|
-
runtimeEnvironment,
|
|
271
|
-
runtimeParams,
|
|
272
|
-
});
|
|
273
|
-
return {
|
|
274
|
-
// ...viewDefinition,
|
|
275
|
-
renderedView: linkedView,
|
|
276
|
-
immutable,
|
|
277
|
-
viewRecord: {
|
|
278
|
-
assetReferences: reduceSourceAssetReferences(linkedMetadata.assetReferences),
|
|
279
|
-
...viewRecord,
|
|
280
|
-
},
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
|
-
return {
|
|
284
|
-
renderedView: linkedAssetContent,
|
|
285
|
-
immutable,
|
|
286
|
-
viewRecord: {
|
|
287
|
-
assetReferences: reduceSourceAssetReferences(linkedMetadata.assetReferences),
|
|
288
|
-
},
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
//# sourceMappingURL=mobify-view-registry.js.map
|