@next-core/runtime 1.55.4 → 1.55.6
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/dist/cjs/internal/Renderer.js +67 -27
- package/dist/cjs/internal/Renderer.js.map +1 -1
- package/dist/cjs/internal/RendererContext.js +13 -9
- package/dist/cjs/internal/RendererContext.js.map +1 -1
- package/dist/cjs/internal/compute/listenOnTrackingContext.js +27 -3
- package/dist/cjs/internal/compute/listenOnTrackingContext.js.map +1 -1
- package/dist/cjs/internal/data/DataStore.js +5 -1
- package/dist/cjs/internal/data/DataStore.js.map +1 -1
- package/dist/cjs/internal/interfaces.js.map +1 -1
- package/dist/esm/internal/Renderer.js +70 -29
- package/dist/esm/internal/Renderer.js.map +1 -1
- package/dist/esm/internal/RendererContext.js +13 -9
- package/dist/esm/internal/RendererContext.js.map +1 -1
- package/dist/esm/internal/compute/listenOnTrackingContext.js +26 -3
- package/dist/esm/internal/compute/listenOnTrackingContext.js.map +1 -1
- package/dist/esm/internal/data/DataStore.js +5 -1
- package/dist/esm/internal/data/DataStore.js.map +1 -1
- package/dist/esm/internal/interfaces.js.map +1 -1
- package/dist/types/internal/Renderer.d.ts +4 -3
- package/dist/types/internal/compute/listenOnTrackingContext.d.ts +6 -1
- package/dist/types/internal/data/DataStore.d.ts +1 -1
- package/dist/types/internal/interfaces.d.ts +1 -0
- package/package.json +2 -2
|
@@ -38,7 +38,7 @@ var _bindListeners = require("./bindListeners.js");
|
|
|
38
38
|
var _setupRootRuntimeContext = require("./setupRootRuntimeContext.js");
|
|
39
39
|
var _routeMatchedMap = require("./routeMatchedMap.js");
|
|
40
40
|
var _ErrorNode = require("./ErrorNode.js");
|
|
41
|
-
async function renderRoutes(returnNode, routes, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, isIncremental) {
|
|
41
|
+
async function renderRoutes(returnNode, routes, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, isIncremental, initialTracker) {
|
|
42
42
|
const matched = await (0, _matchRoutes.matchRoutes)(routes, _runtimeContext);
|
|
43
43
|
const output = getEmptyRenderOutput();
|
|
44
44
|
const menuRequestNode = output.menuRequestNode = {
|
|
@@ -106,9 +106,9 @@ async function renderRoutes(returnNode, routes, _runtimeContext, rendererContext
|
|
|
106
106
|
}
|
|
107
107
|
let newOutput;
|
|
108
108
|
if (route.type === "routes") {
|
|
109
|
-
newOutput = await renderRoutes(returnNode, route.routes, runtimeContext, rendererContext, routePath, menuRequestNode, slotId);
|
|
109
|
+
newOutput = await renderRoutes(returnNode, route.routes, runtimeContext, rendererContext, routePath, menuRequestNode, slotId, undefined, initialTracker);
|
|
110
110
|
} else {
|
|
111
|
-
newOutput = await renderBricks(returnNode, route.bricks, runtimeContext, rendererContext, routePath, menuRequestNode, slotId);
|
|
111
|
+
newOutput = await renderBricks(returnNode, route.bricks, runtimeContext, rendererContext, routePath, menuRequestNode, slotId, undefined, undefined, initialTracker);
|
|
112
112
|
}
|
|
113
113
|
mergeRenderOutput(output, newOutput);
|
|
114
114
|
appendMenuRequestNode(menuRequestNode, newOutput.menuRequestNode);
|
|
@@ -117,12 +117,12 @@ async function renderRoutes(returnNode, routes, _runtimeContext, rendererContext
|
|
|
117
117
|
}
|
|
118
118
|
return output;
|
|
119
119
|
}
|
|
120
|
-
async function renderBricks(returnNode, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, keyPath) {
|
|
120
|
+
async function renderBricks(returnNode, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, keyPath, initialTracker) {
|
|
121
121
|
(0, _setupRootRuntimeContext.setupRootRuntimeContext)(bricks, runtimeContext, true);
|
|
122
122
|
const output = getEmptyRenderOutput();
|
|
123
123
|
const kPath = keyPath ?? [];
|
|
124
124
|
// 多个构件并行异步转换,但转换的结果按原顺序串行合并。
|
|
125
|
-
const rendered = await Promise.all(bricks.map((brickConf, index) => renderBrick(returnNode, brickConf, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, kPath.concat(index), tplStack && new Map(tplStack))));
|
|
125
|
+
const rendered = await Promise.all(bricks.map((brickConf, index) => renderBrick(returnNode, brickConf, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, kPath.concat(index), tplStack && new Map(tplStack), initialTracker)));
|
|
126
126
|
rendered.forEach((item, index) => {
|
|
127
127
|
if (item.hasTrackingControls) {
|
|
128
128
|
// Memoize a render node before it's been merged.
|
|
@@ -132,9 +132,9 @@ async function renderBricks(returnNode, bricks, runtimeContext, rendererContext,
|
|
|
132
132
|
});
|
|
133
133
|
return output;
|
|
134
134
|
}
|
|
135
|
-
async function renderBrick(returnNode, brickConf, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, keyPath = [], tplStack = new Map()) {
|
|
135
|
+
async function renderBrick(returnNode, brickConf, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, keyPath = [], tplStack = new Map(), initialTracker) {
|
|
136
136
|
try {
|
|
137
|
-
return await legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, keyPath, tplStack);
|
|
137
|
+
return await legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, keyPath, tplStack, initialTracker);
|
|
138
138
|
} catch (error) {
|
|
139
139
|
if (brickConf.errorBoundary) {
|
|
140
140
|
// eslint-disable-next-line no-console
|
|
@@ -148,7 +148,7 @@ async function renderBrick(returnNode, brickConf, _runtimeContext, rendererConte
|
|
|
148
148
|
}
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
|
-
async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, keyPath, tplStack) {
|
|
151
|
+
async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, keyPath, tplStack, initialTracker) {
|
|
152
152
|
var _hooks$checkPermissio2, _runtimeContext$app;
|
|
153
153
|
const output = getEmptyRenderOutput();
|
|
154
154
|
if (!brickConf.brick) {
|
|
@@ -186,7 +186,7 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
|
|
|
186
186
|
...acc,
|
|
187
187
|
[symbol]: brickConf[symbol]
|
|
188
188
|
}), {})
|
|
189
|
-
}, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, keyPath, tplStack);
|
|
189
|
+
}, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, keyPath, tplStack, initialTracker);
|
|
190
190
|
}
|
|
191
191
|
const tplStateStoreId = brickConf[_constants.symbolForTplStateStoreId];
|
|
192
192
|
const formStateStoreId = brickConf[_constants2.symbolForFormStateStoreId];
|
|
@@ -222,10 +222,21 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
|
|
|
222
222
|
const {
|
|
223
223
|
dataSource
|
|
224
224
|
} = brickConf;
|
|
225
|
-
const
|
|
225
|
+
const {
|
|
226
|
+
contextNames,
|
|
227
|
+
stateNames
|
|
228
|
+
} = (0, _getTracks.getTracks)(dataSource);
|
|
229
|
+
const lowerLevelRenderControlNode = async (runtimeContext, tracker, trackDataSource) => {
|
|
226
230
|
var _slots$slot;
|
|
227
231
|
// First, compute the `dataSource`
|
|
228
232
|
const computedDataSource = await (0, _computeRealValue.asyncComputeRealValue)(dataSource, runtimeContext);
|
|
233
|
+
if (trackDataSource) {
|
|
234
|
+
(0, _listenOnTrackingContext.trackAfterInitial)(runtimeContext, [{
|
|
235
|
+
contextNames,
|
|
236
|
+
stateNames,
|
|
237
|
+
propValue: dataSource
|
|
238
|
+
}], tracker);
|
|
239
|
+
}
|
|
229
240
|
|
|
230
241
|
// Then, get the matched slot.
|
|
231
242
|
const slot = brickName === ":forEach" ? "" : brickName === ":switch" ? String(computedDataSource) : computedDataSource ? "" : "else";
|
|
@@ -244,39 +255,63 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
|
|
|
244
255
|
if (!Array.isArray(computedDataSource)) {
|
|
245
256
|
return getEmptyRenderOutput();
|
|
246
257
|
}
|
|
247
|
-
return renderForEach(returnNode, computedDataSource, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, keyPath);
|
|
258
|
+
return renderForEach(returnNode, computedDataSource, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, keyPath, tracker);
|
|
248
259
|
}
|
|
249
260
|
case ":if":
|
|
250
261
|
case ":switch":
|
|
251
262
|
{
|
|
252
|
-
return renderBricks(returnNode, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, keyPath);
|
|
263
|
+
return renderBricks(returnNode, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, keyPath, tracker);
|
|
253
264
|
}
|
|
254
265
|
}
|
|
255
266
|
};
|
|
256
|
-
const renderControlNode = async runtimeContext => {
|
|
257
|
-
|
|
258
|
-
|
|
267
|
+
const renderControlNode = async (runtimeContext, type) => {
|
|
268
|
+
var _ref;
|
|
269
|
+
let changedAfterInitial = false;
|
|
270
|
+
const tracker = {
|
|
271
|
+
disposes: [],
|
|
272
|
+
listener: () => {
|
|
273
|
+
changedAfterInitial = true;
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
let rerenderCount = 0;
|
|
277
|
+
let rawOutput;
|
|
278
|
+
let uninitialized = true;
|
|
279
|
+
|
|
280
|
+
// When perform an incremental sub-route render, for control nodes,
|
|
281
|
+
// context maybe changed just after their data source being computed,
|
|
282
|
+
// as well as props of their children bricks being computed, and before
|
|
283
|
+
// bricks being mounted. Thus these changes may not take any effects.
|
|
284
|
+
// So we need to track the context changes after the initial render,
|
|
285
|
+
// and perform re-renders for these control nodes if necessary.
|
|
286
|
+
while (uninitialized || changedAfterInitial) {
|
|
287
|
+
changedAfterInitial = false;
|
|
288
|
+
rawOutput = await lowerLevelRenderControlNode(runtimeContext, tracker, uninitialized && type === "initial");
|
|
289
|
+
tracker.disposes.forEach(dispose => dispose());
|
|
290
|
+
tracker.disposes.length = 0;
|
|
291
|
+
uninitialized = false;
|
|
292
|
+
// istanbul ignore next
|
|
293
|
+
if (++rerenderCount > 10) {
|
|
294
|
+
throw new Error(`Maximum rerender stack overflowed (iid: ${brickConf.iid})`);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
(_ref = rawOutput).node ?? (_ref.node = {
|
|
259
298
|
tag: _enums.RenderTag.PLACEHOLDER,
|
|
260
299
|
return: returnNode
|
|
261
300
|
});
|
|
262
301
|
return rawOutput;
|
|
263
302
|
};
|
|
264
|
-
const controlledOutput = await renderControlNode(runtimeContext);
|
|
303
|
+
const controlledOutput = await renderControlNode(runtimeContext, "initial");
|
|
265
304
|
const {
|
|
266
305
|
onMount,
|
|
267
306
|
onUnmount
|
|
268
307
|
} = brickConf.lifeCycle ?? {};
|
|
269
|
-
const {
|
|
270
|
-
contextNames,
|
|
271
|
-
stateNames
|
|
272
|
-
} = (0, _getTracks.getTracks)(dataSource);
|
|
273
308
|
if (contextNames || stateNames) {
|
|
274
309
|
controlledOutput.hasTrackingControls = true;
|
|
275
310
|
let renderId = 0;
|
|
276
311
|
const listener = async () => {
|
|
277
312
|
const currentRenderId = ++renderId;
|
|
278
313
|
const [scopedRuntimeContext, tplStateStoreScope, formStateStoreScope] = createScopedRuntimeContext(runtimeContext);
|
|
279
|
-
const reControlledOutput = await renderControlNode(scopedRuntimeContext);
|
|
314
|
+
const reControlledOutput = await renderControlNode(scopedRuntimeContext, "rerender");
|
|
280
315
|
const scopedStores = [...tplStateStoreScope, ...formStateStoreScope];
|
|
281
316
|
await postAsyncRender(reControlledOutput, scopedRuntimeContext, scopedStores);
|
|
282
317
|
|
|
@@ -307,15 +342,17 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
|
|
|
307
342
|
leading: true,
|
|
308
343
|
trailing: true
|
|
309
344
|
});
|
|
345
|
+
const runtimeBrick = returnNode.tag === _enums.RenderTag.BRICK ? returnNode : null;
|
|
346
|
+
const disposes = runtimeBrick ? runtimeBrick.disposes ?? (runtimeBrick.disposes = []) : [];
|
|
310
347
|
if (contextNames) {
|
|
311
348
|
for (const contextName of contextNames) {
|
|
312
|
-
runtimeContext.ctxStore.onChange(contextName, debouncedListener);
|
|
349
|
+
disposes.push(runtimeContext.ctxStore.onChange(contextName, debouncedListener));
|
|
313
350
|
}
|
|
314
351
|
}
|
|
315
352
|
if (stateNames) {
|
|
316
353
|
for (const contextName of stateNames) {
|
|
317
354
|
const tplStateStore = (0, _utils.getTplStateStore)(runtimeContext, "STATE", `: "${dataSource}"`);
|
|
318
|
-
tplStateStore.onChange(contextName, debouncedListener);
|
|
355
|
+
disposes.push(tplStateStore.onChange(contextName, debouncedListener));
|
|
319
356
|
}
|
|
320
357
|
}
|
|
321
358
|
}
|
|
@@ -420,6 +457,9 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
|
|
|
420
457
|
|
|
421
458
|
// 加载构件属性和加载子构件等任务,可以并行。
|
|
422
459
|
const blockingList = [];
|
|
460
|
+
|
|
461
|
+
// Note: properties here has already been initialized.
|
|
462
|
+
(0, _listenOnTrackingContext.trackAfterInitial)(runtimeContext, trackingContextList, initialTracker);
|
|
423
463
|
const loadProperties = async () => {
|
|
424
464
|
brick.properties = await (0, _computeRealProperties.constructAsyncProperties)(asyncPropertyEntries);
|
|
425
465
|
(0, _listenOnTrackingContext.listenOnTrackingContext)(brick, trackingContextList);
|
|
@@ -456,7 +496,7 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
|
|
|
456
496
|
const routeSlotFromIndexToSlotId = new Map();
|
|
457
497
|
const rendered = await Promise.all(Object.entries(slots).map(([childSlotId, slotConf], index) => {
|
|
458
498
|
if (slotConf.type !== "routes") {
|
|
459
|
-
return renderBricks(brick, slotConf.bricks, childRuntimeContext, rendererContext, parentRoutes, menuRequestReturnNode, childSlotId, tplStack);
|
|
499
|
+
return renderBricks(brick, slotConf.bricks, childRuntimeContext, rendererContext, parentRoutes, menuRequestReturnNode, childSlotId, tplStack, undefined, initialTracker);
|
|
460
500
|
}
|
|
461
501
|
const parentRoute = parentRoutes[parentRoutes.length - 1];
|
|
462
502
|
if (parentRoute !== null && parentRoute !== void 0 && parentRoute.incrementalSubRoutes) {
|
|
@@ -526,7 +566,7 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
|
|
|
526
566
|
return incrementalOutput.route ? true : null;
|
|
527
567
|
});
|
|
528
568
|
}
|
|
529
|
-
return renderRoutes(brick, slotConf.routes, childRuntimeContext, rendererContext, parentRoutes, menuRequestReturnNode, childSlotId);
|
|
569
|
+
return renderRoutes(brick, slotConf.routes, childRuntimeContext, rendererContext, parentRoutes, menuRequestReturnNode, childSlotId, undefined, initialTracker);
|
|
530
570
|
}));
|
|
531
571
|
const childrenOutput = {
|
|
532
572
|
...output,
|
|
@@ -565,7 +605,7 @@ function ensureValidControlBrick(brick) {
|
|
|
565
605
|
throw new Error(`Unknown storyboard control node: "${brick}"`);
|
|
566
606
|
}
|
|
567
607
|
}
|
|
568
|
-
async function renderForEach(returnNode, dataSource, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, keyPath) {
|
|
608
|
+
async function renderForEach(returnNode, dataSource, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, keyPath, initialTracker) {
|
|
569
609
|
const output = getEmptyRenderOutput();
|
|
570
610
|
const size = dataSource.length;
|
|
571
611
|
const rendered = await Promise.all(dataSource.map((item, i) => Promise.all(bricks.map((brickConf, j) => renderBrick(returnNode, brickConf, {
|
|
@@ -573,7 +613,7 @@ async function renderForEach(returnNode, dataSource, bricks, runtimeContext, ren
|
|
|
573
613
|
forEachItem: item,
|
|
574
614
|
forEachIndex: i,
|
|
575
615
|
forEachSize: size
|
|
576
|
-
}, rendererContext, parentRoutes, menuRequestReturnNode, slotId, keyPath.concat(i * size + j), tplStack && new Map(tplStack))))));
|
|
616
|
+
}, rendererContext, parentRoutes, menuRequestReturnNode, slotId, keyPath.concat(i * size + j), tplStack && new Map(tplStack), initialTracker)))));
|
|
577
617
|
|
|
578
618
|
// 多层构件并行异步转换,但转换的结果按原顺序串行合并。
|
|
579
619
|
rendered.flat().forEach((item, index) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Renderer.js","names":["_loader","require","_cook","_general","_storyboard","_lodash","_checkIf","_computeRealProperties","_resolveData","_computeRealValue","_listenOnTrackingContext","_matchRoutes","_constants","_expandCustomTemplate","_utils","_CustomTemplates","_Runtime","_enums","_getTracks","_isStrictMode","_constants2","_expandFormRenderer","_registerFormRenderer","_evaluate","_matchStoryboard","_bindListeners","_setupRootRuntimeContext","_routeMatchedMap","_ErrorNode","renderRoutes","returnNode","routes","_runtimeContext","rendererContext","parentRoutes","menuRequestReturnNode","slotId","isIncremental","matched","matchRoutes","output","getEmptyRenderOutput","menuRequestNode","return","unauthenticated","_hooks$checkPermissio","route","path","match","runtimeContext","iid","setMatchedRoute","ctxStore","disposeDataInRoutes","routePath","concat","define","context","undefined","pendingPermissionsPreCheck","push","hooks","checkPermissions","preCheckPermissionsForBrickOrRoute","value","asyncComputeRealValue","preLoadBricks","Array","isArray","blockingList","loadBricksImperatively","getBrickPackages","type","redirectTo","redirect","resolved","resolveData","transform","console","error","Error","menuRequest","loadMenu","menu","request","memoizeMenuRequestNode","newOutput","renderBricks","bricks","mergeRenderOutput","appendMenuRequestNode","tplStack","keyPath","setupRootRuntimeContext","kPath","rendered","Promise","all","map","brickConf","index","renderBrick","Map","forEach","item","hasTrackingControls","memoize","node","legacyRenderBrick","errorBoundary","ErrorNode","_hooks$checkPermissio2","_runtimeContext$app","brick","template","if","brickIf","permissionsPreCheck","restBrickConf","isGeneralizedTrackAll","dataSource","slots","Object","getOwnPropertySymbols","reduce","acc","symbol","tplStateStoreId","symbolForTplStateStoreId","formStateStoreId","symbolForFormStateStoreId","hasOwnProperty","symbolForTPlExternalForEachItem","forEachItem","forEachIndex","symbolForTPlExternalForEachIndex","forEachSize","symbolForTPlExternalForEachSize","length","strict","isStrictMode","warnAboutStrictMode","asyncCheckBrickIf","brickName","startsWith","ensureValidControlBrick","lowerLevelRenderControlNode","_slots$slot","computedDataSource","slot","String","childrenToSlots","children","renderForEach","renderControlNode","rawOutput","tag","RenderTag","PLACEHOLDER","controlledOutput","onMount","onUnmount","lifeCycle","contextNames","stateNames","getTracks","renderId","listener","currentRenderId","scopedRuntimeContext","tplStateStoreScope","formStateStoreScope","createScopedRuntimeContext","reControlledOutput","scopedStores","postAsyncRender","listenerFactory","CustomEvent","detail","rerender","reRender","store","mountAsyncData","debouncedListener","debounce","leading","trailing","contextName","onChange","tplStateStore","getTplStateStore","registerArbitraryLifeCycle","test","customTemplates","get","catchLoad","unknownBricks","tplTagName","getTagNameOfCustomTemplate","app","id","tplCount","set","includes","customElements","FORM_RENDERER","registerFormRenderer","enqueueStableLoadBricks","formData","confProps","_brickConf$properties","properties","compute","trackingContextList","asyncPropertyEntries","asyncComputeRealPropertyEntries","computedPropsFromHost","symbolForAsyncComputedPropsFromHost","isScript","props","constructAsyncProperties","src","rel","href","prefix","window","PUBLIC_ROOT","attrs","loadScript","loadStyle","BRICK","events","portal","ref","usedProcessors","strictCollectMemberUsage","size","loadProcessorsImperatively","join","loadProperties","listenOnTrackingContext","registerBrickLifeCycle","expandedBrickConf","expandCustomTemplate","expandFormRenderer","childRuntimeContext","loadChildren","routeSlotFromIndexToSlotId","entries","childSlotId","slotConf","parentRoute","incrementalSubRoutes","performIncrementalRender","location","prevLocation","homepage","pathname","matchHomepage","every","prevMatch","newMatch","matchRoute","isEqual","params","query","URLSearchParams","search","failed","incrementalOutput","reBailout","reMergeMenuRequestNodes","result","reCatch","childrenOutput","has","mergeSiblingRenderMenuRequest","child","isTrackAll","isPreEvaluated","getPreEvaluatedRaw","i","j","flat","getDataStores","tplStateStoreMap","values","formStateStoreMap","stores","flushStableLoadBricks","waitForAll","menuConf","warn","rest","last","sibling","assign","originalSlots","newSlots","process","env","NODE_ENV","promise","name","unknownPolicy","catch","e"],"sources":["../../../src/internal/Renderer.ts"],"sourcesContent":["import type {\n BrickConf,\n BrickConfInTemplate,\n ContextConf,\n MenuConf,\n RouteConf,\n RouteConfOfBricks,\n SlotConfOfBricks,\n SlotsConf,\n StaticMenuConf,\n} from \"@next-core/types\";\nimport {\n enqueueStableLoadBricks,\n flushStableLoadBricks,\n loadBricksImperatively,\n loadProcessorsImperatively,\n loadScript,\n loadStyle,\n} from \"@next-core/loader\";\nimport { isTrackAll } from \"@next-core/cook\";\nimport { hasOwnProperty } from \"@next-core/utils/general\";\nimport { strictCollectMemberUsage } from \"@next-core/utils/storyboard\";\nimport { debounce, isEqual } from \"lodash\";\nimport { asyncCheckBrickIf } from \"./compute/checkIf.js\";\nimport {\n asyncComputeRealPropertyEntries,\n constructAsyncProperties,\n} from \"./compute/computeRealProperties.js\";\nimport { resolveData } from \"./data/resolveData.js\";\nimport { asyncComputeRealValue } from \"./compute/computeRealValue.js\";\nimport {\n TrackingContextItem,\n listenOnTrackingContext,\n} from \"./compute/listenOnTrackingContext.js\";\nimport { RendererContext } from \"./RendererContext.js\";\nimport { matchRoute, matchRoutes } from \"./matchRoutes.js\";\nimport {\n symbolForAsyncComputedPropsFromHost,\n symbolForTPlExternalForEachIndex,\n symbolForTPlExternalForEachItem,\n symbolForTPlExternalForEachSize,\n symbolForTplStateStoreId,\n} from \"./CustomTemplates/constants.js\";\nimport { expandCustomTemplate } from \"./CustomTemplates/expandCustomTemplate.js\";\nimport type {\n MenuRequestNode,\n RenderBrick,\n RenderChildNode,\n RenderReturnNode,\n RuntimeBrickConfWithSymbols,\n RuntimeContext,\n} from \"./interfaces.js\";\nimport {\n getTagNameOfCustomTemplate,\n getTplStateStore,\n} from \"./CustomTemplates/utils.js\";\nimport { customTemplates } from \"../CustomTemplates.js\";\nimport type { NextHistoryState } from \"./historyExtended.js\";\nimport { getBrickPackages, hooks } from \"./Runtime.js\";\nimport { RenderTag } from \"./enums.js\";\nimport { getTracks } from \"./compute/getTracks.js\";\nimport { isStrictMode, warnAboutStrictMode } from \"../isStrictMode.js\";\nimport {\n FORM_RENDERER,\n RuntimeBrickConfOfFormSymbols,\n symbolForFormStateStoreId,\n} from \"./FormRenderer/constants.js\";\nimport { expandFormRenderer } from \"./FormRenderer/expandFormRenderer.js\";\nimport { registerFormRenderer } from \"./FormRenderer/registerFormRenderer.js\";\nimport { isPreEvaluated } from \"./compute/evaluate.js\";\nimport { getPreEvaluatedRaw } from \"./compute/evaluate.js\";\nimport { RuntimeBrickConfOfTplSymbols } from \"./CustomTemplates/constants.js\";\nimport { matchHomepage } from \"./matchStoryboard.js\";\nimport type { DataStore, DataStoreType } from \"./data/DataStore.js\";\nimport { listenerFactory } from \"./bindListeners.js\";\nimport type { MatchResult } from \"./matchPath.js\";\nimport { setupRootRuntimeContext } from \"./setupRootRuntimeContext.js\";\nimport { setMatchedRoute } from \"./routeMatchedMap.js\";\nimport { ErrorNode } from \"./ErrorNode.js\";\n\nexport interface RenderOutput {\n node?: RenderChildNode;\n unauthenticated?: boolean;\n redirect?: {\n path: string;\n state?: NextHistoryState;\n };\n route?: RouteConf;\n path?: string;\n blockingList: (Promise<unknown> | undefined)[];\n menuRequestNode?: MenuRequestNode;\n hasTrackingControls?: boolean;\n}\n\nexport async function renderRoutes(\n returnNode: RenderReturnNode,\n routes: RouteConf[],\n _runtimeContext: RuntimeContext,\n rendererContext: RendererContext,\n parentRoutes: RouteConf[],\n menuRequestReturnNode: MenuRequestNode,\n slotId?: string,\n isIncremental?: boolean\n): Promise<RenderOutput> {\n const matched = await matchRoutes(routes, _runtimeContext);\n const output = getEmptyRenderOutput();\n const menuRequestNode: MenuRequestNode = (output.menuRequestNode = {\n return: menuRequestReturnNode,\n });\n switch (matched) {\n case \"missed\":\n break;\n case \"unauthenticated\":\n output.unauthenticated = true;\n break;\n default: {\n const route = (output.route = matched.route);\n output.path = matched.match.path;\n const runtimeContext = {\n ..._runtimeContext,\n match: matched.match,\n };\n\n if (route.iid) {\n setMatchedRoute(route.iid, matched.match);\n }\n\n if (isIncremental) {\n runtimeContext.ctxStore.disposeDataInRoutes(routes);\n }\n const routePath = parentRoutes.concat(route);\n runtimeContext.ctxStore.define(\n route.context,\n runtimeContext,\n undefined,\n routePath\n );\n runtimeContext.pendingPermissionsPreCheck.push(\n hooks?.checkPermissions?.preCheckPermissionsForBrickOrRoute(\n route,\n (value) => asyncComputeRealValue(value, runtimeContext)\n )\n );\n\n // Currently, this is only used for brick size-checking: these bricks\n // will be loaded before page rendering, but they will NOT be rendered.\n const { preLoadBricks } = route as { preLoadBricks?: string[] };\n if (Array.isArray(preLoadBricks)) {\n output.blockingList.push(\n loadBricksImperatively(preLoadBricks, getBrickPackages())\n );\n }\n\n if (route.type === \"redirect\") {\n let redirectTo: unknown;\n if (typeof route.redirect === \"string\") {\n redirectTo = await asyncComputeRealValue(\n route.redirect,\n runtimeContext\n );\n } else {\n const resolved = (await resolveData(\n {\n transform: \"redirect\",\n ...route.redirect,\n },\n runtimeContext\n )) as { redirect?: unknown };\n redirectTo = resolved.redirect;\n }\n if (typeof redirectTo !== \"string\") {\n // eslint-disable-next-line no-console\n console.error(\"Unexpected redirect result:\", redirectTo);\n throw new Error(\n `Unexpected type of redirect result: ${typeof redirectTo}`\n );\n }\n output.redirect = { path: redirectTo };\n } else {\n const menuRequest = loadMenu(route.menu, runtimeContext);\n if (menuRequest) {\n menuRequestNode.request = menuRequest;\n }\n\n if (!isIncremental) {\n rendererContext.memoizeMenuRequestNode(routes, menuRequestNode);\n }\n\n let newOutput: RenderOutput;\n if (route.type === \"routes\") {\n newOutput = await renderRoutes(\n returnNode,\n route.routes,\n runtimeContext,\n rendererContext,\n routePath,\n menuRequestNode,\n slotId\n );\n } else {\n newOutput = await renderBricks(\n returnNode,\n route.bricks,\n runtimeContext,\n rendererContext,\n routePath,\n menuRequestNode,\n slotId\n );\n }\n\n mergeRenderOutput(output, newOutput);\n appendMenuRequestNode(menuRequestNode, newOutput.menuRequestNode);\n }\n }\n }\n\n return output;\n}\n\nexport async function renderBricks(\n returnNode: RenderReturnNode,\n bricks: BrickConf[],\n runtimeContext: RuntimeContext,\n rendererContext: RendererContext,\n parentRoutes: RouteConf[],\n menuRequestReturnNode: MenuRequestNode,\n slotId?: string,\n tplStack?: Map<string, number>,\n keyPath?: number[]\n): Promise<RenderOutput> {\n setupRootRuntimeContext(bricks, runtimeContext, true);\n const output = getEmptyRenderOutput();\n const kPath = keyPath ?? [];\n // 多个构件并行异步转换,但转换的结果按原顺序串行合并。\n const rendered = await Promise.all(\n bricks.map((brickConf, index) =>\n renderBrick(\n returnNode,\n brickConf,\n runtimeContext,\n rendererContext,\n parentRoutes,\n menuRequestReturnNode,\n slotId,\n kPath.concat(index),\n tplStack && new Map(tplStack)\n )\n )\n );\n\n rendered.forEach((item, index) => {\n if (item.hasTrackingControls) {\n // Memoize a render node before it's been merged.\n rendererContext.memoize(\n slotId,\n kPath.concat(index),\n item.node,\n returnNode\n );\n }\n mergeRenderOutput(output, item);\n });\n\n return output;\n}\n\nexport async function renderBrick(\n returnNode: RenderReturnNode,\n brickConf: RuntimeBrickConfWithSymbols,\n _runtimeContext: RuntimeContext,\n rendererContext: RendererContext,\n parentRoutes: RouteConf[],\n menuRequestReturnNode: MenuRequestNode,\n slotId?: string,\n keyPath: number[] = [],\n tplStack = new Map<string, number>()\n): Promise<RenderOutput> {\n try {\n return await legacyRenderBrick(\n returnNode,\n brickConf,\n _runtimeContext,\n rendererContext,\n parentRoutes,\n menuRequestReturnNode,\n slotId,\n keyPath,\n tplStack\n );\n } catch (error) {\n if (brickConf.errorBoundary) {\n // eslint-disable-next-line no-console\n console.error(\"Error caught by error boundary:\", error);\n return {\n node: await ErrorNode(error, returnNode),\n blockingList: [],\n };\n } else {\n throw error;\n }\n }\n}\n\nasync function legacyRenderBrick(\n returnNode: RenderReturnNode,\n brickConf: RuntimeBrickConfWithSymbols,\n _runtimeContext: RuntimeContext,\n rendererContext: RendererContext,\n parentRoutes: RouteConf[],\n menuRequestReturnNode: MenuRequestNode,\n slotId: string | undefined,\n keyPath: number[],\n tplStack: Map<string, number>\n): Promise<RenderOutput> {\n const output = getEmptyRenderOutput();\n\n if (!brickConf.brick) {\n if ((brickConf as { template?: string }).template) {\n // eslint-disable-next-line no-console\n console.error(\"Legacy templates are dropped in v3:\", brickConf);\n } else {\n // eslint-disable-next-line no-console\n console.error(\"Invalid brick:\", brickConf);\n }\n return output;\n }\n\n // Translate `if: \"<%= ... %>\"` to `brick: \":if\", dataSource: \"<%= ... %>\"`.\n // In other words, translate tracking if expressions to tracking control nodes of `:if`.\n const { if: brickIf, permissionsPreCheck, ...restBrickConf } = brickConf;\n if (isGeneralizedTrackAll(brickIf)) {\n return renderBrick(\n returnNode,\n {\n brick: \":if\",\n dataSource: brickIf,\n // `permissionsPreCheck` maybe required before computing `if`.\n permissionsPreCheck,\n slots: {\n \"\": {\n type: \"bricks\",\n bricks: [restBrickConf],\n },\n },\n // These symbols have to be copied to the new brick conf.\n ...Object.getOwnPropertySymbols(brickConf).reduce(\n (acc, symbol) => ({\n ...acc,\n [symbol]: (brickConf as any)[symbol],\n }),\n {} as RuntimeBrickConfOfTplSymbols & RuntimeBrickConfOfFormSymbols\n ),\n },\n _runtimeContext,\n rendererContext,\n parentRoutes,\n menuRequestReturnNode,\n slotId,\n keyPath,\n tplStack\n );\n }\n\n const tplStateStoreId = brickConf[symbolForTplStateStoreId];\n const formStateStoreId = brickConf[symbolForFormStateStoreId];\n const runtimeContext = {\n ..._runtimeContext,\n tplStateStoreId,\n formStateStoreId,\n };\n\n if (hasOwnProperty(brickConf, symbolForTPlExternalForEachItem)) {\n // The external bricks of a template should restore their `forEach*` from their host.\n runtimeContext.forEachItem = brickConf[symbolForTPlExternalForEachItem];\n runtimeContext.forEachIndex = brickConf[symbolForTPlExternalForEachIndex];\n runtimeContext.forEachSize = brickConf[symbolForTPlExternalForEachSize];\n }\n\n const { context } = brickConf as { context?: ContextConf[] };\n // istanbul ignore next\n if (Array.isArray(context) && context.length > 0) {\n const strict = isStrictMode(runtimeContext);\n warnAboutStrictMode(\n strict,\n \"Defining context on bricks\",\n \"check your brick:\",\n brickConf\n );\n if (!strict) {\n runtimeContext.ctxStore.define(context, runtimeContext);\n }\n }\n\n runtimeContext.pendingPermissionsPreCheck.push(\n hooks?.checkPermissions?.preCheckPermissionsForBrickOrRoute(\n brickConf,\n (value) => asyncComputeRealValue(value, runtimeContext)\n )\n );\n\n if (!(await asyncCheckBrickIf(brickConf, runtimeContext))) {\n return output;\n }\n\n const brickName = brickConf.brick;\n if (brickName.startsWith(\":\")) {\n ensureValidControlBrick(brickName);\n\n const { dataSource } = brickConf;\n\n const lowerLevelRenderControlNode = async (\n runtimeContext: RuntimeContext\n ) => {\n // First, compute the `dataSource`\n const computedDataSource = await asyncComputeRealValue(\n dataSource,\n runtimeContext\n );\n\n // Then, get the matched slot.\n const slot =\n brickName === \":forEach\"\n ? \"\"\n : brickName === \":switch\"\n ? String(computedDataSource)\n : computedDataSource\n ? \"\"\n : \"else\";\n\n // Don't forget to transpile children to slots.\n const slots = childrenToSlots(brickConf.children, brickConf.slots);\n\n // Then, get the bricks in that matched slot.\n const bricks =\n slots &&\n hasOwnProperty(slots, slot) &&\n (slots[slot] as SlotConfOfBricks)?.bricks;\n\n if (!Array.isArray(bricks)) {\n return getEmptyRenderOutput();\n }\n\n switch (brickName) {\n case \":forEach\": {\n if (!Array.isArray(computedDataSource)) {\n return getEmptyRenderOutput();\n }\n return renderForEach(\n returnNode,\n computedDataSource,\n bricks,\n runtimeContext,\n rendererContext,\n parentRoutes,\n menuRequestReturnNode,\n slotId,\n tplStack,\n keyPath\n );\n }\n case \":if\":\n case \":switch\": {\n return renderBricks(\n returnNode,\n bricks,\n runtimeContext,\n rendererContext,\n parentRoutes,\n menuRequestReturnNode,\n slotId,\n tplStack,\n keyPath\n );\n }\n }\n };\n\n const renderControlNode = async (runtimeContext: RuntimeContext) => {\n const rawOutput = await lowerLevelRenderControlNode(runtimeContext);\n rawOutput.node ??= {\n tag: RenderTag.PLACEHOLDER,\n return: returnNode,\n };\n return rawOutput;\n };\n\n const controlledOutput = await renderControlNode(runtimeContext);\n const { onMount, onUnmount } = brickConf.lifeCycle ?? {};\n\n const { contextNames, stateNames } = getTracks(dataSource);\n if (contextNames || stateNames) {\n controlledOutput.hasTrackingControls = true;\n let renderId = 0;\n const listener = async () => {\n const currentRenderId = ++renderId;\n const [scopedRuntimeContext, tplStateStoreScope, formStateStoreScope] =\n createScopedRuntimeContext(runtimeContext);\n\n const reControlledOutput =\n await renderControlNode(scopedRuntimeContext);\n\n const scopedStores = [...tplStateStoreScope, ...formStateStoreScope];\n await postAsyncRender(\n reControlledOutput,\n scopedRuntimeContext,\n scopedStores\n );\n\n // Ignore stale renders\n if (renderId === currentRenderId) {\n if (onUnmount) {\n listenerFactory(\n onUnmount,\n runtimeContext\n )(new CustomEvent(\"unmount\", { detail: { rerender: true } }));\n }\n\n rendererContext.reRender(\n slotId,\n keyPath,\n reControlledOutput.node,\n returnNode\n );\n\n if (onMount) {\n listenerFactory(\n onMount,\n scopedRuntimeContext\n )(new CustomEvent(\"mount\", { detail: { rerender: true } }));\n }\n\n for (const store of scopedStores) {\n store.mountAsyncData();\n }\n }\n };\n // Enable leading invocation, to keep tracking orders.\n const debouncedListener = debounce(listener, 0, {\n leading: true,\n trailing: true,\n });\n if (contextNames) {\n for (const contextName of contextNames) {\n runtimeContext.ctxStore.onChange(contextName, debouncedListener);\n }\n }\n if (stateNames) {\n for (const contextName of stateNames) {\n const tplStateStore = getTplStateStore(\n runtimeContext,\n \"STATE\",\n `: \"${dataSource}\"`\n );\n tplStateStore.onChange(contextName, debouncedListener);\n }\n }\n }\n\n if (onMount) {\n rendererContext.registerArbitraryLifeCycle(\"onMount\", () => {\n listenerFactory(\n onMount,\n runtimeContext\n )(new CustomEvent(\"mount\", { detail: { rerender: false } }));\n });\n }\n\n if (onUnmount) {\n rendererContext.registerArbitraryLifeCycle(\"onUnmount\", () => {\n listenerFactory(\n onUnmount,\n runtimeContext\n )(new CustomEvent(\"unmount\", { detail: { rerender: false } }));\n });\n }\n\n return controlledOutput;\n }\n\n // Widgets need to be defined before rendering.\n if (/\\.tpl-/.test(brickName) && !customTemplates.get(brickName)) {\n await catchLoad(\n loadBricksImperatively([brickName], getBrickPackages()),\n \"brick\",\n brickName,\n rendererContext.unknownBricks\n );\n }\n\n const tplTagName = getTagNameOfCustomTemplate(\n brickName,\n runtimeContext.app?.id\n );\n\n if (tplTagName) {\n const tplCount = tplStack.get(tplTagName) ?? 0;\n if (tplCount >= 10) {\n throw new Error(\n `Maximum custom template stack overflowed: \"${tplTagName}\"`\n );\n }\n tplStack.set(tplTagName, tplCount + 1);\n } else if (brickName.includes(\"-\") && !customElements.get(brickName)) {\n if (brickName === FORM_RENDERER) {\n registerFormRenderer();\n } else {\n output.blockingList.push(\n catchLoad(\n enqueueStableLoadBricks([brickName], getBrickPackages()),\n \"brick\",\n brickName,\n rendererContext.unknownBricks\n )\n );\n }\n }\n\n let formData: unknown;\n let confProps: Record<string, unknown> | undefined;\n if (brickName === FORM_RENDERER) {\n ({ formData, ...confProps } = brickConf.properties ?? {});\n\n if (brickConf.properties?.compute) {\n formData = await asyncComputeRealValue(formData, runtimeContext);\n }\n } else {\n confProps = brickConf.properties;\n }\n\n const trackingContextList: TrackingContextItem[] = [];\n const asyncPropertyEntries = asyncComputeRealPropertyEntries(\n confProps,\n runtimeContext,\n trackingContextList\n );\n\n const computedPropsFromHost = brickConf[symbolForAsyncComputedPropsFromHost];\n if (computedPropsFromHost) {\n asyncPropertyEntries.push(...computedPropsFromHost);\n }\n\n const isScript = brickName === \"script\";\n if (isScript || brickName === \"link\") {\n const props = await constructAsyncProperties(asyncPropertyEntries);\n if (isScript ? props.src : props.rel === \"stylesheet\" && props.href) {\n const prefix = window.PUBLIC_ROOT ?? \"\";\n if (isScript) {\n const { src, ...attrs } = props;\n await catchLoad(\n loadScript(src as string, prefix, attrs),\n \"script\",\n src as string,\n \"silent\"\n );\n } else {\n const { href, ...attrs } = props;\n await catchLoad(\n loadStyle(href as string, prefix, attrs),\n \"stylesheet\",\n href as string,\n \"silent\"\n );\n }\n return output;\n }\n }\n\n const brick: RenderBrick = {\n tag: RenderTag.BRICK,\n type: tplTagName || brickName,\n return: returnNode,\n slotId,\n events: brickConf.events,\n runtimeContext,\n portal: brickConf.portal,\n iid: brickConf.iid,\n ref: (brickConf as BrickConfInTemplate).ref,\n };\n\n output.node = brick;\n\n // 在最终挂载前,先加载所有可能用到的 processors。\n const usedProcessors = strictCollectMemberUsage(\n [brickConf.events, brickConf.lifeCycle],\n \"PROCESSORS\",\n 2\n );\n if (usedProcessors.size > 0) {\n output.blockingList.push(\n catchLoad(\n loadProcessorsImperatively(usedProcessors, getBrickPackages()),\n \"processors\",\n [...usedProcessors].join(\", \"),\n rendererContext.unknownBricks\n )\n );\n }\n\n // 加载构件属性和加载子构件等任务,可以并行。\n const blockingList: Promise<unknown>[] = [];\n\n const loadProperties = async () => {\n brick.properties = await constructAsyncProperties(asyncPropertyEntries);\n listenOnTrackingContext(brick, trackingContextList);\n };\n blockingList.push(loadProperties());\n\n rendererContext.registerBrickLifeCycle(brick, brickConf.lifeCycle);\n\n let expandedBrickConf = brickConf;\n if (tplTagName) {\n expandedBrickConf = expandCustomTemplate(\n tplTagName,\n brickConf,\n brick,\n asyncPropertyEntries,\n rendererContext\n );\n } else if (brickName === FORM_RENDERER) {\n expandedBrickConf = expandFormRenderer(\n formData,\n brickConf,\n brick,\n asyncPropertyEntries,\n rendererContext\n );\n }\n\n if (expandedBrickConf.portal) {\n // A portal brick has no slotId.\n brick.slotId = undefined;\n }\n\n let childRuntimeContext: RuntimeContext;\n if (tplTagName) {\n // There is a boundary for `forEachItem` between template internals and externals.\n childRuntimeContext = {\n ...runtimeContext,\n };\n delete childRuntimeContext.forEachItem;\n delete childRuntimeContext.forEachIndex;\n delete childRuntimeContext.forEachSize;\n } else {\n childRuntimeContext = runtimeContext;\n }\n\n const loadChildren = async () => {\n const slots = childrenToSlots(\n expandedBrickConf.children,\n expandedBrickConf.slots\n );\n if (!slots) {\n return;\n }\n const routeSlotFromIndexToSlotId = new Map<number, string>();\n const rendered = await Promise.all(\n Object.entries(slots).map(([childSlotId, slotConf], index) => {\n if (slotConf.type !== \"routes\") {\n return renderBricks(\n brick,\n (slotConf as SlotConfOfBricks).bricks,\n childRuntimeContext,\n rendererContext,\n parentRoutes,\n menuRequestReturnNode,\n childSlotId,\n tplStack\n );\n }\n\n const parentRoute = parentRoutes[parentRoutes.length - 1] as\n | RouteConfOfBricks\n | undefined;\n if (parentRoute?.incrementalSubRoutes) {\n routeSlotFromIndexToSlotId.set(index, childSlotId);\n rendererContext.performIncrementalRender(\n slotConf,\n parentRoutes,\n async (location, prevLocation) => {\n const { homepage } = childRuntimeContext.app;\n const { pathname } = location;\n // Ignore if any one of homepage and parent routes not matched.\n if (\n !matchHomepage(homepage, pathname) ||\n !parentRoutes.every((route) => {\n let prevMatch: MatchResult | null;\n let newMatch: MatchResult | null;\n return (\n (prevMatch = matchRoute(\n route,\n homepage,\n prevLocation.pathname\n )) &&\n (newMatch = matchRoute(route, homepage, pathname)) &&\n (route !== parentRoute ||\n isEqual(prevMatch.params, newMatch.params))\n );\n })\n ) {\n return false;\n }\n\n const [\n scopedRuntimeContext,\n tplStateStoreScope,\n formStateStoreScope,\n ] = createScopedRuntimeContext({\n ...childRuntimeContext,\n location,\n query: new URLSearchParams(location.search),\n });\n\n let failed = false;\n let incrementalOutput: RenderOutput;\n let scopedStores: DataStore<\"STATE\" | \"FORM_STATE\">[] = [];\n\n try {\n incrementalOutput = await renderRoutes(\n brick,\n slotConf.routes,\n scopedRuntimeContext,\n rendererContext,\n parentRoutes,\n menuRequestReturnNode,\n childSlotId,\n true\n );\n\n // Do not ignore incremental rendering even if all sub-routes are missed.\n // Since parent route is matched.\n if (incrementalOutput.route) {\n // Bailout if redirect or unauthenticated is set\n if (rendererContext.reBailout(incrementalOutput)) {\n return true;\n }\n\n scopedStores = [\n ...tplStateStoreScope,\n ...formStateStoreScope,\n ];\n await postAsyncRender(\n incrementalOutput,\n scopedRuntimeContext,\n [scopedRuntimeContext.ctxStore, ...scopedStores]\n );\n }\n\n await rendererContext.reMergeMenuRequestNodes(\n menuRequestReturnNode,\n slotConf.routes,\n incrementalOutput.menuRequestNode\n );\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\"Incremental sub-router failed:\", error);\n\n const result = await rendererContext.reCatch(error, brick);\n if (!result) {\n return true;\n }\n ({ failed, output: incrementalOutput } = result);\n\n // Assert: no errors will be throw\n await rendererContext.reMergeMenuRequestNodes(\n menuRequestReturnNode,\n slotConf.routes,\n incrementalOutput.menuRequestNode\n );\n }\n\n rendererContext.reRender(\n childSlotId,\n [],\n incrementalOutput.node,\n brick\n );\n\n if (!failed) {\n scopedRuntimeContext.ctxStore.mountAsyncData(\n incrementalOutput.route\n );\n for (const store of scopedStores) {\n store.mountAsyncData();\n }\n }\n\n // When result is null, it means the incremental rendering is tried but routes missed.\n // In this case, we should continue to re-render the parent routes.\n return incrementalOutput.route ? true : null;\n }\n );\n }\n\n return renderRoutes(\n brick,\n slotConf.routes,\n childRuntimeContext,\n rendererContext,\n parentRoutes,\n menuRequestReturnNode,\n childSlotId\n );\n })\n );\n\n const childrenOutput: RenderOutput = {\n ...output,\n node: undefined,\n blockingList: [],\n menuRequestNode: undefined,\n };\n rendered.forEach((item, index) => {\n if (routeSlotFromIndexToSlotId.has(index)) {\n // Memoize a render node before it's been merged.\n rendererContext.memoize(\n routeSlotFromIndexToSlotId.get(index),\n [],\n item.node,\n brick\n );\n }\n mergeRenderOutput(childrenOutput, item);\n mergeSiblingRenderMenuRequest(childrenOutput, item);\n });\n if (childrenOutput.node) {\n brick.child = childrenOutput.node;\n }\n mergeRenderOutput(output, {\n ...childrenOutput,\n node: undefined,\n });\n\n appendMenuRequestNode(\n menuRequestReturnNode,\n (output.menuRequestNode = childrenOutput.menuRequestNode)\n );\n };\n blockingList.push(loadChildren());\n\n await Promise.all(blockingList);\n\n return output;\n}\n\nfunction isGeneralizedTrackAll(brickIf: unknown): boolean {\n return typeof brickIf === \"string\"\n ? isTrackAll(brickIf)\n : isPreEvaluated(brickIf) &&\n // istanbul ignore next: covered by e2e tests\n isTrackAll(getPreEvaluatedRaw(brickIf));\n}\n\ntype ValidControlBrick = \":forEach\" | \":if\" | \":switch\";\n\nfunction ensureValidControlBrick(\n brick: string\n): asserts brick is ValidControlBrick {\n if (brick !== \":forEach\" && brick !== \":if\" && brick !== \":switch\") {\n throw new Error(`Unknown storyboard control node: \"${brick}\"`);\n }\n}\n\nasync function renderForEach(\n returnNode: RenderReturnNode,\n dataSource: unknown[],\n bricks: BrickConf[],\n runtimeContext: RuntimeContext,\n rendererContext: RendererContext,\n parentRoutes: RouteConf[],\n menuRequestReturnNode: MenuRequestNode,\n slotId: string | undefined,\n tplStack: Map<string, number>,\n keyPath: number[]\n): Promise<RenderOutput> {\n const output = getEmptyRenderOutput();\n\n const size = dataSource.length;\n const rendered = await Promise.all(\n dataSource.map((item, i) =>\n Promise.all(\n bricks.map((brickConf, j) =>\n renderBrick(\n returnNode,\n brickConf,\n {\n ...runtimeContext,\n forEachItem: item,\n forEachIndex: i,\n forEachSize: size,\n },\n rendererContext,\n parentRoutes,\n menuRequestReturnNode,\n slotId,\n keyPath.concat(i * size + j),\n tplStack && new Map(tplStack)\n )\n )\n )\n )\n );\n\n // 多层构件并行异步转换,但转换的结果按原顺序串行合并。\n rendered.flat().forEach((item, index) => {\n if (item.hasTrackingControls) {\n // Memoize a render node before it's been merged.\n rendererContext.memoize(\n slotId,\n keyPath.concat(index),\n item.node,\n returnNode\n );\n }\n mergeRenderOutput(output, item);\n });\n\n return output;\n}\n\nexport function getDataStores(runtimeContext: RuntimeContext) {\n return [\n runtimeContext.ctxStore,\n ...runtimeContext.tplStateStoreMap.values(),\n ...runtimeContext.formStateStoreMap.values(),\n ];\n}\n\nexport function postAsyncRender(\n output: RenderOutput,\n runtimeContext: RuntimeContext,\n stores: DataStore<DataStoreType>[]\n) {\n flushStableLoadBricks();\n\n return Promise.all([\n ...output.blockingList,\n ...stores.map((store) => store.waitForAll()),\n ...runtimeContext.pendingPermissionsPreCheck,\n ]);\n}\n\nexport function createScopedRuntimeContext(\n runtimeContext: RuntimeContext\n): [\n scopedRuntimeContext: RuntimeContext,\n tplStateStoreScope: DataStore<\"STATE\">[],\n formStateStoreScope: DataStore<\"FORM_STATE\">[],\n] {\n const tplStateStoreScope: DataStore<\"STATE\">[] = [];\n const formStateStoreScope: DataStore<\"FORM_STATE\">[] = [];\n const scopedRuntimeContext: RuntimeContext = {\n ...runtimeContext,\n tplStateStoreScope,\n formStateStoreScope,\n };\n return [scopedRuntimeContext, tplStateStoreScope, formStateStoreScope];\n}\n\nfunction loadMenu(\n menuConf: MenuConf | undefined,\n runtimeContext: RuntimeContext\n) {\n if (!menuConf) {\n return;\n }\n\n // istanbul ignore next\n if ((menuConf as { type?: \"brick\" }).type === \"brick\") {\n // eslint-disable-next-line no-console\n console.error(\"Set menu with brick is dropped in v3:\", menuConf);\n throw new Error(\"Set menu with brick is dropped in v3\");\n }\n\n // istanbul ignore next\n if (menuConf.type === \"resolve\") {\n // eslint-disable-next-line no-console\n console.warn(\"Set menu with resolve is not supported in v3 yet:\", menuConf);\n return;\n }\n\n return asyncComputeRealValue(\n menuConf,\n runtimeContext\n ) as Promise<StaticMenuConf>;\n}\n\nfunction mergeRenderOutput(\n output: RenderOutput,\n newOutput: RenderOutput\n): void {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { blockingList, node, menuRequestNode, hasTrackingControls, ...rest } =\n newOutput;\n output.blockingList.push(...blockingList);\n\n if (node) {\n if (output.node) {\n let last = output.node;\n while (last.sibling) {\n last = last.sibling;\n }\n last.sibling = node;\n } else {\n output.node = node;\n }\n }\n\n Object.assign(output, rest);\n}\n\nfunction mergeSiblingRenderMenuRequest(\n output: RenderOutput,\n newOutput: RenderOutput\n) {\n const menuRequestNode = newOutput.menuRequestNode;\n if (menuRequestNode) {\n if (output.menuRequestNode) {\n let last = output.menuRequestNode;\n while (last.sibling) {\n last = last.sibling;\n }\n last.sibling = menuRequestNode;\n } else {\n output.menuRequestNode = menuRequestNode;\n }\n }\n}\n\nfunction appendMenuRequestNode(\n menuRequestReturnNode: MenuRequestNode,\n menuRequestNode: MenuRequestNode | undefined\n) {\n if (!menuRequestNode) {\n return;\n }\n if (menuRequestReturnNode.child) {\n let last = menuRequestReturnNode.child;\n while (last.sibling) {\n last = last.sibling;\n }\n last.sibling = menuRequestNode;\n } else {\n menuRequestReturnNode.child = menuRequestNode;\n }\n}\n\nfunction getEmptyRenderOutput(): RenderOutput {\n return { blockingList: [] };\n}\n\nexport function childrenToSlots(\n children: BrickConf[] | undefined,\n originalSlots: SlotsConf | undefined\n) {\n let newSlots = originalSlots;\n // istanbul ignore next\n if (\n process.env.NODE_ENV === \"development\" &&\n children &&\n !Array.isArray(children)\n ) {\n // eslint-disable-next-line no-console\n console.warn(\n \"Specified brick children but not array:\",\n `<${typeof children}>`,\n children\n );\n }\n if (Array.isArray(children) && !newSlots) {\n newSlots = {};\n for (const child of children) {\n const slot = child.slot ?? \"\";\n if (!hasOwnProperty(newSlots, slot)) {\n newSlots[slot] = {\n type: \"bricks\",\n bricks: [],\n };\n }\n (newSlots[slot] as SlotConfOfBricks).bricks.push(child);\n }\n }\n return newSlots;\n}\n\nfunction catchLoad(\n promise: Promise<unknown>,\n type: \"brick\" | \"processors\" | \"script\" | \"stylesheet\",\n name: string,\n unknownPolicy: RendererContext[\"unknownBricks\"]\n) {\n return unknownPolicy === \"silent\"\n ? promise.catch((e) => {\n // eslint-disable-next-line no-console\n console.error(`Load %s \"%s\" failed:`, type, name, e);\n })\n : promise;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Renderer.js","names":["_loader","require","_cook","_general","_storyboard","_lodash","_checkIf","_computeRealProperties","_resolveData","_computeRealValue","_listenOnTrackingContext","_matchRoutes","_constants","_expandCustomTemplate","_utils","_CustomTemplates","_Runtime","_enums","_getTracks","_isStrictMode","_constants2","_expandFormRenderer","_registerFormRenderer","_evaluate","_matchStoryboard","_bindListeners","_setupRootRuntimeContext","_routeMatchedMap","_ErrorNode","renderRoutes","returnNode","routes","_runtimeContext","rendererContext","parentRoutes","menuRequestReturnNode","slotId","isIncremental","initialTracker","matched","matchRoutes","output","getEmptyRenderOutput","menuRequestNode","return","unauthenticated","_hooks$checkPermissio","route","path","match","runtimeContext","iid","setMatchedRoute","ctxStore","disposeDataInRoutes","routePath","concat","define","context","undefined","pendingPermissionsPreCheck","push","hooks","checkPermissions","preCheckPermissionsForBrickOrRoute","value","asyncComputeRealValue","preLoadBricks","Array","isArray","blockingList","loadBricksImperatively","getBrickPackages","type","redirectTo","redirect","resolved","resolveData","transform","console","error","Error","menuRequest","loadMenu","menu","request","memoizeMenuRequestNode","newOutput","renderBricks","bricks","mergeRenderOutput","appendMenuRequestNode","tplStack","keyPath","setupRootRuntimeContext","kPath","rendered","Promise","all","map","brickConf","index","renderBrick","Map","forEach","item","hasTrackingControls","memoize","node","legacyRenderBrick","errorBoundary","ErrorNode","_hooks$checkPermissio2","_runtimeContext$app","brick","template","if","brickIf","permissionsPreCheck","restBrickConf","isGeneralizedTrackAll","dataSource","slots","Object","getOwnPropertySymbols","reduce","acc","symbol","tplStateStoreId","symbolForTplStateStoreId","formStateStoreId","symbolForFormStateStoreId","hasOwnProperty","symbolForTPlExternalForEachItem","forEachItem","forEachIndex","symbolForTPlExternalForEachIndex","forEachSize","symbolForTPlExternalForEachSize","length","strict","isStrictMode","warnAboutStrictMode","asyncCheckBrickIf","brickName","startsWith","ensureValidControlBrick","contextNames","stateNames","getTracks","lowerLevelRenderControlNode","tracker","trackDataSource","_slots$slot","computedDataSource","trackAfterInitial","propValue","slot","String","childrenToSlots","children","renderForEach","renderControlNode","_ref","changedAfterInitial","disposes","listener","rerenderCount","rawOutput","uninitialized","dispose","tag","RenderTag","PLACEHOLDER","controlledOutput","onMount","onUnmount","lifeCycle","renderId","currentRenderId","scopedRuntimeContext","tplStateStoreScope","formStateStoreScope","createScopedRuntimeContext","reControlledOutput","scopedStores","postAsyncRender","listenerFactory","CustomEvent","detail","rerender","reRender","store","mountAsyncData","debouncedListener","debounce","leading","trailing","runtimeBrick","BRICK","contextName","onChange","tplStateStore","getTplStateStore","registerArbitraryLifeCycle","test","customTemplates","get","catchLoad","unknownBricks","tplTagName","getTagNameOfCustomTemplate","app","id","tplCount","set","includes","customElements","FORM_RENDERER","registerFormRenderer","enqueueStableLoadBricks","formData","confProps","_brickConf$properties","properties","compute","trackingContextList","asyncPropertyEntries","asyncComputeRealPropertyEntries","computedPropsFromHost","symbolForAsyncComputedPropsFromHost","isScript","props","constructAsyncProperties","src","rel","href","prefix","window","PUBLIC_ROOT","attrs","loadScript","loadStyle","events","portal","ref","usedProcessors","strictCollectMemberUsage","size","loadProcessorsImperatively","join","loadProperties","listenOnTrackingContext","registerBrickLifeCycle","expandedBrickConf","expandCustomTemplate","expandFormRenderer","childRuntimeContext","loadChildren","routeSlotFromIndexToSlotId","entries","childSlotId","slotConf","parentRoute","incrementalSubRoutes","performIncrementalRender","location","prevLocation","homepage","pathname","matchHomepage","every","prevMatch","newMatch","matchRoute","isEqual","params","query","URLSearchParams","search","failed","incrementalOutput","reBailout","reMergeMenuRequestNodes","result","reCatch","childrenOutput","has","mergeSiblingRenderMenuRequest","child","isTrackAll","isPreEvaluated","getPreEvaluatedRaw","i","j","flat","getDataStores","tplStateStoreMap","values","formStateStoreMap","stores","flushStableLoadBricks","waitForAll","menuConf","warn","rest","last","sibling","assign","originalSlots","newSlots","process","env","NODE_ENV","promise","name","unknownPolicy","catch","e"],"sources":["../../../src/internal/Renderer.ts"],"sourcesContent":["import type {\n BrickConf,\n BrickConfInTemplate,\n ContextConf,\n MenuConf,\n RouteConf,\n RouteConfOfBricks,\n SlotConfOfBricks,\n SlotsConf,\n StaticMenuConf,\n} from \"@next-core/types\";\nimport {\n enqueueStableLoadBricks,\n flushStableLoadBricks,\n loadBricksImperatively,\n loadProcessorsImperatively,\n loadScript,\n loadStyle,\n} from \"@next-core/loader\";\nimport { isTrackAll } from \"@next-core/cook\";\nimport { hasOwnProperty } from \"@next-core/utils/general\";\nimport { strictCollectMemberUsage } from \"@next-core/utils/storyboard\";\nimport { debounce, isEqual } from \"lodash\";\nimport { asyncCheckBrickIf } from \"./compute/checkIf.js\";\nimport {\n asyncComputeRealPropertyEntries,\n constructAsyncProperties,\n} from \"./compute/computeRealProperties.js\";\nimport { resolveData } from \"./data/resolveData.js\";\nimport { asyncComputeRealValue } from \"./compute/computeRealValue.js\";\nimport {\n TrackingContextItem,\n listenOnTrackingContext,\n trackAfterInitial,\n type InitialTracker,\n} from \"./compute/listenOnTrackingContext.js\";\nimport { RendererContext } from \"./RendererContext.js\";\nimport { matchRoute, matchRoutes } from \"./matchRoutes.js\";\nimport {\n symbolForAsyncComputedPropsFromHost,\n symbolForTPlExternalForEachIndex,\n symbolForTPlExternalForEachItem,\n symbolForTPlExternalForEachSize,\n symbolForTplStateStoreId,\n} from \"./CustomTemplates/constants.js\";\nimport { expandCustomTemplate } from \"./CustomTemplates/expandCustomTemplate.js\";\nimport type {\n MenuRequestNode,\n RenderBrick,\n RenderChildNode,\n RenderReturnNode,\n RuntimeBrickConfWithSymbols,\n RuntimeContext,\n} from \"./interfaces.js\";\nimport {\n getTagNameOfCustomTemplate,\n getTplStateStore,\n} from \"./CustomTemplates/utils.js\";\nimport { customTemplates } from \"../CustomTemplates.js\";\nimport type { NextHistoryState } from \"./historyExtended.js\";\nimport { getBrickPackages, hooks } from \"./Runtime.js\";\nimport { RenderTag } from \"./enums.js\";\nimport { getTracks } from \"./compute/getTracks.js\";\nimport { isStrictMode, warnAboutStrictMode } from \"../isStrictMode.js\";\nimport {\n FORM_RENDERER,\n RuntimeBrickConfOfFormSymbols,\n symbolForFormStateStoreId,\n} from \"./FormRenderer/constants.js\";\nimport { expandFormRenderer } from \"./FormRenderer/expandFormRenderer.js\";\nimport { registerFormRenderer } from \"./FormRenderer/registerFormRenderer.js\";\nimport { isPreEvaluated } from \"./compute/evaluate.js\";\nimport { getPreEvaluatedRaw } from \"./compute/evaluate.js\";\nimport { RuntimeBrickConfOfTplSymbols } from \"./CustomTemplates/constants.js\";\nimport { matchHomepage } from \"./matchStoryboard.js\";\nimport type { DataStore, DataStoreType } from \"./data/DataStore.js\";\nimport { listenerFactory } from \"./bindListeners.js\";\nimport type { MatchResult } from \"./matchPath.js\";\nimport { setupRootRuntimeContext } from \"./setupRootRuntimeContext.js\";\nimport { setMatchedRoute } from \"./routeMatchedMap.js\";\nimport { ErrorNode } from \"./ErrorNode.js\";\n\nexport interface RenderOutput {\n node?: RenderChildNode;\n unauthenticated?: boolean;\n redirect?: {\n path: string;\n state?: NextHistoryState;\n };\n route?: RouteConf;\n path?: string;\n blockingList: (Promise<unknown> | undefined)[];\n menuRequestNode?: MenuRequestNode;\n hasTrackingControls?: boolean;\n}\n\nexport async function renderRoutes(\n returnNode: RenderReturnNode,\n routes: RouteConf[],\n _runtimeContext: RuntimeContext,\n rendererContext: RendererContext,\n parentRoutes: RouteConf[],\n menuRequestReturnNode: MenuRequestNode,\n slotId?: string,\n isIncremental?: boolean,\n initialTracker?: InitialTracker\n): Promise<RenderOutput> {\n const matched = await matchRoutes(routes, _runtimeContext);\n const output = getEmptyRenderOutput();\n const menuRequestNode: MenuRequestNode = (output.menuRequestNode = {\n return: menuRequestReturnNode,\n });\n switch (matched) {\n case \"missed\":\n break;\n case \"unauthenticated\":\n output.unauthenticated = true;\n break;\n default: {\n const route = (output.route = matched.route);\n output.path = matched.match.path;\n const runtimeContext = {\n ..._runtimeContext,\n match: matched.match,\n };\n\n if (route.iid) {\n setMatchedRoute(route.iid, matched.match);\n }\n\n if (isIncremental) {\n runtimeContext.ctxStore.disposeDataInRoutes(routes);\n }\n const routePath = parentRoutes.concat(route);\n runtimeContext.ctxStore.define(\n route.context,\n runtimeContext,\n undefined,\n routePath\n );\n runtimeContext.pendingPermissionsPreCheck.push(\n hooks?.checkPermissions?.preCheckPermissionsForBrickOrRoute(\n route,\n (value) => asyncComputeRealValue(value, runtimeContext)\n )\n );\n\n // Currently, this is only used for brick size-checking: these bricks\n // will be loaded before page rendering, but they will NOT be rendered.\n const { preLoadBricks } = route as { preLoadBricks?: string[] };\n if (Array.isArray(preLoadBricks)) {\n output.blockingList.push(\n loadBricksImperatively(preLoadBricks, getBrickPackages())\n );\n }\n\n if (route.type === \"redirect\") {\n let redirectTo: unknown;\n if (typeof route.redirect === \"string\") {\n redirectTo = await asyncComputeRealValue(\n route.redirect,\n runtimeContext\n );\n } else {\n const resolved = (await resolveData(\n {\n transform: \"redirect\",\n ...route.redirect,\n },\n runtimeContext\n )) as { redirect?: unknown };\n redirectTo = resolved.redirect;\n }\n if (typeof redirectTo !== \"string\") {\n // eslint-disable-next-line no-console\n console.error(\"Unexpected redirect result:\", redirectTo);\n throw new Error(\n `Unexpected type of redirect result: ${typeof redirectTo}`\n );\n }\n output.redirect = { path: redirectTo };\n } else {\n const menuRequest = loadMenu(route.menu, runtimeContext);\n if (menuRequest) {\n menuRequestNode.request = menuRequest;\n }\n\n if (!isIncremental) {\n rendererContext.memoizeMenuRequestNode(routes, menuRequestNode);\n }\n\n let newOutput: RenderOutput;\n if (route.type === \"routes\") {\n newOutput = await renderRoutes(\n returnNode,\n route.routes,\n runtimeContext,\n rendererContext,\n routePath,\n menuRequestNode,\n slotId,\n undefined,\n initialTracker\n );\n } else {\n newOutput = await renderBricks(\n returnNode,\n route.bricks,\n runtimeContext,\n rendererContext,\n routePath,\n menuRequestNode,\n slotId,\n undefined,\n undefined,\n initialTracker\n );\n }\n\n mergeRenderOutput(output, newOutput);\n appendMenuRequestNode(menuRequestNode, newOutput.menuRequestNode);\n }\n }\n }\n\n return output;\n}\n\nexport async function renderBricks(\n returnNode: RenderReturnNode,\n bricks: BrickConf[],\n runtimeContext: RuntimeContext,\n rendererContext: RendererContext,\n parentRoutes: RouteConf[],\n menuRequestReturnNode: MenuRequestNode,\n slotId?: string,\n tplStack?: Map<string, number>,\n keyPath?: number[],\n initialTracker?: InitialTracker\n): Promise<RenderOutput> {\n setupRootRuntimeContext(bricks, runtimeContext, true);\n const output = getEmptyRenderOutput();\n const kPath = keyPath ?? [];\n // 多个构件并行异步转换,但转换的结果按原顺序串行合并。\n const rendered = await Promise.all(\n bricks.map((brickConf, index) =>\n renderBrick(\n returnNode,\n brickConf,\n runtimeContext,\n rendererContext,\n parentRoutes,\n menuRequestReturnNode,\n slotId,\n kPath.concat(index),\n tplStack && new Map(tplStack),\n initialTracker\n )\n )\n );\n\n rendered.forEach((item, index) => {\n if (item.hasTrackingControls) {\n // Memoize a render node before it's been merged.\n rendererContext.memoize(\n slotId,\n kPath.concat(index),\n item.node,\n returnNode\n );\n }\n mergeRenderOutput(output, item);\n });\n\n return output;\n}\n\nexport async function renderBrick(\n returnNode: RenderReturnNode,\n brickConf: RuntimeBrickConfWithSymbols,\n _runtimeContext: RuntimeContext,\n rendererContext: RendererContext,\n parentRoutes: RouteConf[],\n menuRequestReturnNode: MenuRequestNode,\n slotId?: string,\n keyPath: number[] = [],\n tplStack = new Map<string, number>(),\n initialTracker?: InitialTracker\n): Promise<RenderOutput> {\n try {\n return await legacyRenderBrick(\n returnNode,\n brickConf,\n _runtimeContext,\n rendererContext,\n parentRoutes,\n menuRequestReturnNode,\n slotId,\n keyPath,\n tplStack,\n initialTracker\n );\n } catch (error) {\n if (brickConf.errorBoundary) {\n // eslint-disable-next-line no-console\n console.error(\"Error caught by error boundary:\", error);\n return {\n node: await ErrorNode(error, returnNode),\n blockingList: [],\n };\n } else {\n throw error;\n }\n }\n}\n\nasync function legacyRenderBrick(\n returnNode: RenderReturnNode,\n brickConf: RuntimeBrickConfWithSymbols,\n _runtimeContext: RuntimeContext,\n rendererContext: RendererContext,\n parentRoutes: RouteConf[],\n menuRequestReturnNode: MenuRequestNode,\n slotId: string | undefined,\n keyPath: number[],\n tplStack: Map<string, number>,\n initialTracker?: InitialTracker\n): Promise<RenderOutput> {\n const output = getEmptyRenderOutput();\n\n if (!brickConf.brick) {\n if ((brickConf as { template?: string }).template) {\n // eslint-disable-next-line no-console\n console.error(\"Legacy templates are dropped in v3:\", brickConf);\n } else {\n // eslint-disable-next-line no-console\n console.error(\"Invalid brick:\", brickConf);\n }\n return output;\n }\n\n // Translate `if: \"<%= ... %>\"` to `brick: \":if\", dataSource: \"<%= ... %>\"`.\n // In other words, translate tracking if expressions to tracking control nodes of `:if`.\n const { if: brickIf, permissionsPreCheck, ...restBrickConf } = brickConf;\n if (isGeneralizedTrackAll(brickIf)) {\n return renderBrick(\n returnNode,\n {\n brick: \":if\",\n dataSource: brickIf,\n // `permissionsPreCheck` maybe required before computing `if`.\n permissionsPreCheck,\n slots: {\n \"\": {\n type: \"bricks\",\n bricks: [restBrickConf],\n },\n },\n // These symbols have to be copied to the new brick conf.\n ...Object.getOwnPropertySymbols(brickConf).reduce(\n (acc, symbol) => ({\n ...acc,\n [symbol]: brickConf[symbol as typeof symbolForTplStateStoreId],\n }),\n {} as RuntimeBrickConfOfTplSymbols & RuntimeBrickConfOfFormSymbols\n ),\n },\n _runtimeContext,\n rendererContext,\n parentRoutes,\n menuRequestReturnNode,\n slotId,\n keyPath,\n tplStack,\n initialTracker\n );\n }\n\n const tplStateStoreId = brickConf[symbolForTplStateStoreId];\n const formStateStoreId = brickConf[symbolForFormStateStoreId];\n const runtimeContext = {\n ..._runtimeContext,\n tplStateStoreId,\n formStateStoreId,\n };\n\n if (hasOwnProperty(brickConf, symbolForTPlExternalForEachItem)) {\n // The external bricks of a template should restore their `forEach*` from their host.\n runtimeContext.forEachItem = brickConf[symbolForTPlExternalForEachItem];\n runtimeContext.forEachIndex = brickConf[symbolForTPlExternalForEachIndex];\n runtimeContext.forEachSize = brickConf[symbolForTPlExternalForEachSize];\n }\n\n const { context } = brickConf as { context?: ContextConf[] };\n // istanbul ignore next\n if (Array.isArray(context) && context.length > 0) {\n const strict = isStrictMode(runtimeContext);\n warnAboutStrictMode(\n strict,\n \"Defining context on bricks\",\n \"check your brick:\",\n brickConf\n );\n if (!strict) {\n runtimeContext.ctxStore.define(context, runtimeContext);\n }\n }\n\n runtimeContext.pendingPermissionsPreCheck.push(\n hooks?.checkPermissions?.preCheckPermissionsForBrickOrRoute(\n brickConf,\n (value) => asyncComputeRealValue(value, runtimeContext)\n )\n );\n\n if (!(await asyncCheckBrickIf(brickConf, runtimeContext))) {\n return output;\n }\n\n const brickName = brickConf.brick;\n if (brickName.startsWith(\":\")) {\n ensureValidControlBrick(brickName);\n\n const { dataSource } = brickConf;\n const { contextNames, stateNames } = getTracks(dataSource);\n\n const lowerLevelRenderControlNode = async (\n runtimeContext: RuntimeContext,\n tracker: InitialTracker,\n trackDataSource: boolean\n ) => {\n // First, compute the `dataSource`\n const computedDataSource = await asyncComputeRealValue(\n dataSource,\n runtimeContext\n );\n\n if (trackDataSource) {\n trackAfterInitial(\n runtimeContext,\n [{ contextNames, stateNames, propValue: dataSource }],\n tracker\n );\n }\n\n // Then, get the matched slot.\n const slot =\n brickName === \":forEach\"\n ? \"\"\n : brickName === \":switch\"\n ? String(computedDataSource)\n : computedDataSource\n ? \"\"\n : \"else\";\n\n // Don't forget to transpile children to slots.\n const slots = childrenToSlots(brickConf.children, brickConf.slots);\n\n // Then, get the bricks in that matched slot.\n const bricks =\n slots &&\n hasOwnProperty(slots, slot) &&\n (slots[slot] as SlotConfOfBricks)?.bricks;\n\n if (!Array.isArray(bricks)) {\n return getEmptyRenderOutput();\n }\n\n switch (brickName) {\n case \":forEach\": {\n if (!Array.isArray(computedDataSource)) {\n return getEmptyRenderOutput();\n }\n return renderForEach(\n returnNode,\n computedDataSource,\n bricks,\n runtimeContext,\n rendererContext,\n parentRoutes,\n menuRequestReturnNode,\n slotId,\n tplStack,\n keyPath,\n tracker\n );\n }\n case \":if\":\n case \":switch\": {\n return renderBricks(\n returnNode,\n bricks,\n runtimeContext,\n rendererContext,\n parentRoutes,\n menuRequestReturnNode,\n slotId,\n tplStack,\n keyPath,\n tracker\n );\n }\n }\n };\n\n const renderControlNode = async (\n runtimeContext: RuntimeContext,\n type: \"initial\" | \"rerender\"\n ) => {\n let changedAfterInitial = false;\n const tracker: InitialTracker = {\n disposes: [],\n listener: () => {\n changedAfterInitial = true;\n },\n };\n let rerenderCount = 0;\n let rawOutput: RenderOutput;\n let uninitialized = true;\n\n // When perform an incremental sub-route render, for control nodes,\n // context maybe changed just after their data source being computed,\n // as well as props of their children bricks being computed, and before\n // bricks being mounted. Thus these changes may not take any effects.\n // So we need to track the context changes after the initial render,\n // and perform re-renders for these control nodes if necessary.\n while (uninitialized || changedAfterInitial) {\n changedAfterInitial = false;\n rawOutput = await lowerLevelRenderControlNode(\n runtimeContext,\n tracker,\n uninitialized && type === \"initial\"\n );\n tracker.disposes.forEach((dispose) => dispose());\n tracker.disposes.length = 0;\n uninitialized = false;\n // istanbul ignore next\n if (++rerenderCount > 10) {\n throw new Error(\n `Maximum rerender stack overflowed (iid: ${brickConf.iid})`\n );\n }\n }\n\n rawOutput!.node ??= {\n tag: RenderTag.PLACEHOLDER,\n return: returnNode,\n };\n return rawOutput!;\n };\n\n const controlledOutput = await renderControlNode(runtimeContext, \"initial\");\n\n const { onMount, onUnmount } = brickConf.lifeCycle ?? {};\n\n if (contextNames || stateNames) {\n controlledOutput.hasTrackingControls = true;\n let renderId = 0;\n const listener = async () => {\n const currentRenderId = ++renderId;\n const [scopedRuntimeContext, tplStateStoreScope, formStateStoreScope] =\n createScopedRuntimeContext(runtimeContext);\n\n const reControlledOutput = await renderControlNode(\n scopedRuntimeContext,\n \"rerender\"\n );\n\n const scopedStores = [...tplStateStoreScope, ...formStateStoreScope];\n await postAsyncRender(\n reControlledOutput,\n scopedRuntimeContext,\n scopedStores\n );\n\n // Ignore stale renders\n if (renderId === currentRenderId) {\n if (onUnmount) {\n listenerFactory(\n onUnmount,\n runtimeContext\n )(new CustomEvent(\"unmount\", { detail: { rerender: true } }));\n }\n\n rendererContext.reRender(\n slotId,\n keyPath,\n reControlledOutput.node,\n returnNode\n );\n\n if (onMount) {\n listenerFactory(\n onMount,\n scopedRuntimeContext\n )(new CustomEvent(\"mount\", { detail: { rerender: true } }));\n }\n\n for (const store of scopedStores) {\n store.mountAsyncData();\n }\n }\n };\n // Enable leading invocation, to keep tracking orders.\n const debouncedListener = debounce(listener, 0, {\n leading: true,\n trailing: true,\n });\n const runtimeBrick =\n returnNode.tag === RenderTag.BRICK ? returnNode : null;\n const disposes = runtimeBrick ? (runtimeBrick.disposes ??= []) : [];\n if (contextNames) {\n for (const contextName of contextNames) {\n disposes.push(\n runtimeContext.ctxStore.onChange(contextName, debouncedListener)\n );\n }\n }\n if (stateNames) {\n for (const contextName of stateNames) {\n const tplStateStore = getTplStateStore(\n runtimeContext,\n \"STATE\",\n `: \"${dataSource}\"`\n );\n disposes.push(tplStateStore.onChange(contextName, debouncedListener));\n }\n }\n }\n\n if (onMount) {\n rendererContext.registerArbitraryLifeCycle(\"onMount\", () => {\n listenerFactory(\n onMount,\n runtimeContext\n )(new CustomEvent(\"mount\", { detail: { rerender: false } }));\n });\n }\n\n if (onUnmount) {\n rendererContext.registerArbitraryLifeCycle(\"onUnmount\", () => {\n listenerFactory(\n onUnmount,\n runtimeContext\n )(new CustomEvent(\"unmount\", { detail: { rerender: false } }));\n });\n }\n\n return controlledOutput;\n }\n\n // Widgets need to be defined before rendering.\n if (/\\.tpl-/.test(brickName) && !customTemplates.get(brickName)) {\n await catchLoad(\n loadBricksImperatively([brickName], getBrickPackages()),\n \"brick\",\n brickName,\n rendererContext.unknownBricks\n );\n }\n\n const tplTagName = getTagNameOfCustomTemplate(\n brickName,\n runtimeContext.app?.id\n );\n\n if (tplTagName) {\n const tplCount = tplStack.get(tplTagName) ?? 0;\n if (tplCount >= 10) {\n throw new Error(\n `Maximum custom template stack overflowed: \"${tplTagName}\"`\n );\n }\n tplStack.set(tplTagName, tplCount + 1);\n } else if (brickName.includes(\"-\") && !customElements.get(brickName)) {\n if (brickName === FORM_RENDERER) {\n registerFormRenderer();\n } else {\n output.blockingList.push(\n catchLoad(\n enqueueStableLoadBricks([brickName], getBrickPackages()),\n \"brick\",\n brickName,\n rendererContext.unknownBricks\n )\n );\n }\n }\n\n let formData: unknown;\n let confProps: Record<string, unknown> | undefined;\n if (brickName === FORM_RENDERER) {\n ({ formData, ...confProps } = brickConf.properties ?? {});\n\n if (brickConf.properties?.compute) {\n formData = await asyncComputeRealValue(formData, runtimeContext);\n }\n } else {\n confProps = brickConf.properties;\n }\n\n const trackingContextList: TrackingContextItem[] = [];\n const asyncPropertyEntries = asyncComputeRealPropertyEntries(\n confProps,\n runtimeContext,\n trackingContextList\n );\n\n const computedPropsFromHost = brickConf[symbolForAsyncComputedPropsFromHost];\n if (computedPropsFromHost) {\n asyncPropertyEntries.push(...computedPropsFromHost);\n }\n\n const isScript = brickName === \"script\";\n if (isScript || brickName === \"link\") {\n const props = await constructAsyncProperties(asyncPropertyEntries);\n if (isScript ? props.src : props.rel === \"stylesheet\" && props.href) {\n const prefix = window.PUBLIC_ROOT ?? \"\";\n if (isScript) {\n const { src, ...attrs } = props;\n await catchLoad(\n loadScript(src as string, prefix, attrs),\n \"script\",\n src as string,\n \"silent\"\n );\n } else {\n const { href, ...attrs } = props;\n await catchLoad(\n loadStyle(href as string, prefix, attrs),\n \"stylesheet\",\n href as string,\n \"silent\"\n );\n }\n return output;\n }\n }\n\n const brick: RenderBrick = {\n tag: RenderTag.BRICK,\n type: tplTagName || brickName,\n return: returnNode,\n slotId,\n events: brickConf.events,\n runtimeContext,\n portal: brickConf.portal,\n iid: brickConf.iid,\n ref: (brickConf as BrickConfInTemplate).ref,\n };\n\n output.node = brick;\n\n // 在最终挂载前,先加载所有可能用到的 processors。\n const usedProcessors = strictCollectMemberUsage(\n [brickConf.events, brickConf.lifeCycle],\n \"PROCESSORS\",\n 2\n );\n if (usedProcessors.size > 0) {\n output.blockingList.push(\n catchLoad(\n loadProcessorsImperatively(usedProcessors, getBrickPackages()),\n \"processors\",\n [...usedProcessors].join(\", \"),\n rendererContext.unknownBricks\n )\n );\n }\n\n // 加载构件属性和加载子构件等任务,可以并行。\n const blockingList: Promise<unknown>[] = [];\n\n // Note: properties here has already been initialized.\n trackAfterInitial(runtimeContext, trackingContextList, initialTracker);\n\n const loadProperties = async () => {\n brick.properties = await constructAsyncProperties(asyncPropertyEntries);\n listenOnTrackingContext(brick, trackingContextList);\n };\n blockingList.push(loadProperties());\n\n rendererContext.registerBrickLifeCycle(brick, brickConf.lifeCycle);\n\n let expandedBrickConf = brickConf;\n if (tplTagName) {\n expandedBrickConf = expandCustomTemplate(\n tplTagName,\n brickConf,\n brick,\n asyncPropertyEntries,\n rendererContext\n );\n } else if (brickName === FORM_RENDERER) {\n expandedBrickConf = expandFormRenderer(\n formData,\n brickConf,\n brick,\n asyncPropertyEntries,\n rendererContext\n );\n }\n\n if (expandedBrickConf.portal) {\n // A portal brick has no slotId.\n brick.slotId = undefined;\n }\n\n let childRuntimeContext: RuntimeContext;\n if (tplTagName) {\n // There is a boundary for `forEachItem` between template internals and externals.\n childRuntimeContext = {\n ...runtimeContext,\n };\n delete childRuntimeContext.forEachItem;\n delete childRuntimeContext.forEachIndex;\n delete childRuntimeContext.forEachSize;\n } else {\n childRuntimeContext = runtimeContext;\n }\n\n const loadChildren = async () => {\n const slots = childrenToSlots(\n expandedBrickConf.children,\n expandedBrickConf.slots\n );\n if (!slots) {\n return;\n }\n const routeSlotFromIndexToSlotId = new Map<number, string>();\n const rendered = await Promise.all(\n Object.entries(slots).map(([childSlotId, slotConf], index) => {\n if (slotConf.type !== \"routes\") {\n return renderBricks(\n brick,\n (slotConf as SlotConfOfBricks).bricks,\n childRuntimeContext,\n rendererContext,\n parentRoutes,\n menuRequestReturnNode,\n childSlotId,\n tplStack,\n undefined,\n initialTracker\n );\n }\n\n const parentRoute = parentRoutes[parentRoutes.length - 1] as\n | RouteConfOfBricks\n | undefined;\n if (parentRoute?.incrementalSubRoutes) {\n routeSlotFromIndexToSlotId.set(index, childSlotId);\n rendererContext.performIncrementalRender(\n slotConf,\n parentRoutes,\n async (location, prevLocation) => {\n const { homepage } = childRuntimeContext.app;\n const { pathname } = location;\n // Ignore if any one of homepage and parent routes not matched.\n if (\n !matchHomepage(homepage, pathname) ||\n !parentRoutes.every((route) => {\n let prevMatch: MatchResult | null;\n let newMatch: MatchResult | null;\n return (\n (prevMatch = matchRoute(\n route,\n homepage,\n prevLocation.pathname\n )) &&\n (newMatch = matchRoute(route, homepage, pathname)) &&\n (route !== parentRoute ||\n isEqual(prevMatch.params, newMatch.params))\n );\n })\n ) {\n return false;\n }\n\n const [\n scopedRuntimeContext,\n tplStateStoreScope,\n formStateStoreScope,\n ] = createScopedRuntimeContext({\n ...childRuntimeContext,\n location,\n query: new URLSearchParams(location.search),\n });\n\n let failed = false;\n let incrementalOutput: RenderOutput;\n let scopedStores: DataStore<\"STATE\" | \"FORM_STATE\">[] = [];\n\n try {\n incrementalOutput = await renderRoutes(\n brick,\n slotConf.routes,\n scopedRuntimeContext,\n rendererContext,\n parentRoutes,\n menuRequestReturnNode,\n childSlotId,\n true\n );\n\n // Do not ignore incremental rendering even if all sub-routes are missed.\n // Since parent route is matched.\n if (incrementalOutput.route) {\n // Bailout if redirect or unauthenticated is set\n if (rendererContext.reBailout(incrementalOutput)) {\n return true;\n }\n\n scopedStores = [\n ...tplStateStoreScope,\n ...formStateStoreScope,\n ];\n await postAsyncRender(\n incrementalOutput,\n scopedRuntimeContext,\n [scopedRuntimeContext.ctxStore, ...scopedStores]\n );\n }\n\n await rendererContext.reMergeMenuRequestNodes(\n menuRequestReturnNode,\n slotConf.routes,\n incrementalOutput.menuRequestNode\n );\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\"Incremental sub-router failed:\", error);\n\n const result = await rendererContext.reCatch(error, brick);\n if (!result) {\n return true;\n }\n ({ failed, output: incrementalOutput } = result);\n\n // Assert: no errors will be throw\n await rendererContext.reMergeMenuRequestNodes(\n menuRequestReturnNode,\n slotConf.routes,\n incrementalOutput.menuRequestNode\n );\n }\n\n rendererContext.reRender(\n childSlotId,\n [],\n incrementalOutput.node,\n brick\n );\n\n if (!failed) {\n scopedRuntimeContext.ctxStore.mountAsyncData(\n incrementalOutput.route\n );\n for (const store of scopedStores) {\n store.mountAsyncData();\n }\n }\n\n // When result is null, it means the incremental rendering is tried but routes missed.\n // In this case, we should continue to re-render the parent routes.\n return incrementalOutput.route ? true : null;\n }\n );\n }\n\n return renderRoutes(\n brick,\n slotConf.routes,\n childRuntimeContext,\n rendererContext,\n parentRoutes,\n menuRequestReturnNode,\n childSlotId,\n undefined,\n initialTracker\n );\n })\n );\n\n const childrenOutput: RenderOutput = {\n ...output,\n node: undefined,\n blockingList: [],\n menuRequestNode: undefined,\n };\n rendered.forEach((item, index) => {\n if (routeSlotFromIndexToSlotId.has(index)) {\n // Memoize a render node before it's been merged.\n rendererContext.memoize(\n routeSlotFromIndexToSlotId.get(index),\n [],\n item.node,\n brick\n );\n }\n mergeRenderOutput(childrenOutput, item);\n mergeSiblingRenderMenuRequest(childrenOutput, item);\n });\n if (childrenOutput.node) {\n brick.child = childrenOutput.node;\n }\n mergeRenderOutput(output, {\n ...childrenOutput,\n node: undefined,\n });\n\n appendMenuRequestNode(\n menuRequestReturnNode,\n (output.menuRequestNode = childrenOutput.menuRequestNode)\n );\n };\n blockingList.push(loadChildren());\n\n await Promise.all(blockingList);\n\n return output;\n}\n\nfunction isGeneralizedTrackAll(brickIf: unknown): boolean {\n return typeof brickIf === \"string\"\n ? isTrackAll(brickIf)\n : isPreEvaluated(brickIf) &&\n // istanbul ignore next: covered by e2e tests\n isTrackAll(getPreEvaluatedRaw(brickIf));\n}\n\ntype ValidControlBrick = \":forEach\" | \":if\" | \":switch\";\n\nfunction ensureValidControlBrick(\n brick: string\n): asserts brick is ValidControlBrick {\n if (brick !== \":forEach\" && brick !== \":if\" && brick !== \":switch\") {\n throw new Error(`Unknown storyboard control node: \"${brick}\"`);\n }\n}\n\nasync function renderForEach(\n returnNode: RenderReturnNode,\n dataSource: unknown[],\n bricks: BrickConf[],\n runtimeContext: RuntimeContext,\n rendererContext: RendererContext,\n parentRoutes: RouteConf[],\n menuRequestReturnNode: MenuRequestNode,\n slotId: string | undefined,\n tplStack: Map<string, number>,\n keyPath: number[],\n initialTracker?: InitialTracker\n): Promise<RenderOutput> {\n const output = getEmptyRenderOutput();\n\n const size = dataSource.length;\n const rendered = await Promise.all(\n dataSource.map((item, i) =>\n Promise.all(\n bricks.map((brickConf, j) =>\n renderBrick(\n returnNode,\n brickConf,\n {\n ...runtimeContext,\n forEachItem: item,\n forEachIndex: i,\n forEachSize: size,\n },\n rendererContext,\n parentRoutes,\n menuRequestReturnNode,\n slotId,\n keyPath.concat(i * size + j),\n tplStack && new Map(tplStack),\n initialTracker\n )\n )\n )\n )\n );\n\n // 多层构件并行异步转换,但转换的结果按原顺序串行合并。\n rendered.flat().forEach((item, index) => {\n if (item.hasTrackingControls) {\n // Memoize a render node before it's been merged.\n rendererContext.memoize(\n slotId,\n keyPath.concat(index),\n item.node,\n returnNode\n );\n }\n mergeRenderOutput(output, item);\n });\n\n return output;\n}\n\nexport function getDataStores(runtimeContext: RuntimeContext) {\n return [\n runtimeContext.ctxStore,\n ...runtimeContext.tplStateStoreMap.values(),\n ...runtimeContext.formStateStoreMap.values(),\n ];\n}\n\nexport function postAsyncRender(\n output: RenderOutput,\n runtimeContext: RuntimeContext,\n stores: DataStore<DataStoreType>[]\n) {\n flushStableLoadBricks();\n\n return Promise.all([\n ...output.blockingList,\n ...stores.map((store) => store.waitForAll()),\n ...runtimeContext.pendingPermissionsPreCheck,\n ]);\n}\n\nexport function createScopedRuntimeContext(\n runtimeContext: RuntimeContext\n): [\n scopedRuntimeContext: RuntimeContext,\n tplStateStoreScope: DataStore<\"STATE\">[],\n formStateStoreScope: DataStore<\"FORM_STATE\">[],\n] {\n const tplStateStoreScope: DataStore<\"STATE\">[] = [];\n const formStateStoreScope: DataStore<\"FORM_STATE\">[] = [];\n const scopedRuntimeContext: RuntimeContext = {\n ...runtimeContext,\n tplStateStoreScope,\n formStateStoreScope,\n };\n return [scopedRuntimeContext, tplStateStoreScope, formStateStoreScope];\n}\n\nfunction loadMenu(\n menuConf: MenuConf | undefined,\n runtimeContext: RuntimeContext\n) {\n if (!menuConf) {\n return;\n }\n\n // istanbul ignore next\n if ((menuConf as { type?: \"brick\" }).type === \"brick\") {\n // eslint-disable-next-line no-console\n console.error(\"Set menu with brick is dropped in v3:\", menuConf);\n throw new Error(\"Set menu with brick is dropped in v3\");\n }\n\n // istanbul ignore next\n if (menuConf.type === \"resolve\") {\n // eslint-disable-next-line no-console\n console.warn(\"Set menu with resolve is not supported in v3 yet:\", menuConf);\n return;\n }\n\n return asyncComputeRealValue(\n menuConf,\n runtimeContext\n ) as Promise<StaticMenuConf>;\n}\n\nfunction mergeRenderOutput(\n output: RenderOutput,\n newOutput: RenderOutput\n): void {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { blockingList, node, menuRequestNode, hasTrackingControls, ...rest } =\n newOutput;\n output.blockingList.push(...blockingList);\n\n if (node) {\n if (output.node) {\n let last = output.node;\n while (last.sibling) {\n last = last.sibling;\n }\n last.sibling = node;\n } else {\n output.node = node;\n }\n }\n\n Object.assign(output, rest);\n}\n\nfunction mergeSiblingRenderMenuRequest(\n output: RenderOutput,\n newOutput: RenderOutput\n) {\n const menuRequestNode = newOutput.menuRequestNode;\n if (menuRequestNode) {\n if (output.menuRequestNode) {\n let last = output.menuRequestNode;\n while (last.sibling) {\n last = last.sibling;\n }\n last.sibling = menuRequestNode;\n } else {\n output.menuRequestNode = menuRequestNode;\n }\n }\n}\n\nfunction appendMenuRequestNode(\n menuRequestReturnNode: MenuRequestNode,\n menuRequestNode: MenuRequestNode | undefined\n) {\n if (!menuRequestNode) {\n return;\n }\n if (menuRequestReturnNode.child) {\n let last = menuRequestReturnNode.child;\n while (last.sibling) {\n last = last.sibling;\n }\n last.sibling = menuRequestNode;\n } else {\n menuRequestReturnNode.child = menuRequestNode;\n }\n}\n\nfunction getEmptyRenderOutput(): RenderOutput {\n return { blockingList: [] };\n}\n\nexport function childrenToSlots(\n children: BrickConf[] | undefined,\n originalSlots: SlotsConf | undefined\n) {\n let newSlots = originalSlots;\n // istanbul ignore next\n if (\n process.env.NODE_ENV === \"development\" &&\n children &&\n !Array.isArray(children)\n ) {\n // eslint-disable-next-line no-console\n console.warn(\n \"Specified brick children but not array:\",\n `<${typeof children}>`,\n children\n );\n }\n if (Array.isArray(children) && !newSlots) {\n newSlots = {};\n for (const child of children) {\n const slot = child.slot ?? \"\";\n if (!hasOwnProperty(newSlots, slot)) {\n newSlots[slot] = {\n type: \"bricks\",\n bricks: [],\n };\n }\n (newSlots[slot] as SlotConfOfBricks).bricks.push(child);\n }\n }\n return newSlots;\n}\n\nfunction catchLoad(\n promise: Promise<unknown>,\n type: \"brick\" | \"processors\" | \"script\" | \"stylesheet\",\n name: string,\n unknownPolicy: RendererContext[\"unknownBricks\"]\n) {\n return unknownPolicy === \"silent\"\n ? promise.catch((e) => {\n // eslint-disable-next-line no-console\n console.error(`Load %s \"%s\" failed:`, type, name, e);\n })\n : promise;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -297,14 +297,16 @@ class RendererContext {
|
|
|
297
297
|
current.return = returnNode;
|
|
298
298
|
current = current.sibling;
|
|
299
299
|
}
|
|
300
|
-
if (
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
300
|
+
if (fragment.hasChildNodes()) {
|
|
301
|
+
if (returnNode.tag === _enums.RenderTag.ROOT) {
|
|
302
|
+
var _returnNode$container;
|
|
303
|
+
(_returnNode$container = returnNode.container) === null || _returnNode$container === void 0 || _returnNode$container.insertBefore(fragment, insertBeforeChild);
|
|
304
|
+
} else {
|
|
305
|
+
var _returnNode$element;
|
|
306
|
+
(_returnNode$element = returnNode.element) === null || _returnNode$element === void 0 || _returnNode$element.insertBefore(fragment, insertBeforeChild);
|
|
307
|
+
}
|
|
306
308
|
}
|
|
307
|
-
if (portalFragment.
|
|
309
|
+
if (portalFragment.hasChildNodes()) {
|
|
308
310
|
var _root;
|
|
309
311
|
let root = node;
|
|
310
312
|
while (root && root.return) {
|
|
@@ -441,7 +443,7 @@ function _unmountBricks(bricks) {
|
|
|
441
443
|
|
|
442
444
|
// Clear intersection observers
|
|
443
445
|
for (const brick of bricks) {
|
|
444
|
-
var _brick$element, _brick$element2;
|
|
446
|
+
var _brick$element, _brick$element2, _brick$disposes;
|
|
445
447
|
const observers = (0, _classPrivateFieldGet2.default)(_observers, this).get(brick);
|
|
446
448
|
if (observers !== null && observers !== void 0 && observers.length) {
|
|
447
449
|
for (const observer of observers) {
|
|
@@ -452,9 +454,11 @@ function _unmountBricks(bricks) {
|
|
|
452
454
|
}
|
|
453
455
|
(0, _bindTemplateProxy.unbindTemplateProxy)(brick);
|
|
454
456
|
(_brick$element = brick.element) === null || _brick$element === void 0 || delete _brick$element.$$tplStateStore;
|
|
455
|
-
|
|
456
457
|
// Also remove the element
|
|
457
458
|
(_brick$element2 = brick.element) === null || _brick$element2 === void 0 || _brick$element2.remove();
|
|
459
|
+
// Dispose context listeners
|
|
460
|
+
(_brick$disposes = brick.disposes) === null || _brick$disposes === void 0 || _brick$disposes.forEach(dispose => dispose());
|
|
461
|
+
delete brick.disposes;
|
|
458
462
|
}
|
|
459
463
|
|
|
460
464
|
// Dispatch unmount events
|