@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.
@@ -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?.experimentalSSR;
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?.experimentalSSR;
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?.experimentalSSR;
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?.experimentalSSR;
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",
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.7",
34
- "@lwrjs/diagnostics": "0.8.0-alpha.7",
35
- "@lwrjs/shared-utils": "0.8.0-alpha.7"
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.7"
38
+ "@lwrjs/types": "0.8.0-alpha.8"
39
39
  },
40
40
  "engines": {
41
41
  "node": ">=14.15.4 <19"
42
42
  },
43
- "gitHead": "5ce7bdfff149ccdb761e11e6caab11abfffe2c0b"
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