@next-core/runtime 1.62.1 → 1.62.2

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.
@@ -112,7 +112,7 @@ async function renderRoutes(returnNode, routes, _runtimeContext, rendererContext
112
112
  if (route.type === "routes") {
113
113
  newOutput = await renderRoutes(returnNode, route.routes, runtimeContext, rendererContext, routePath, menuRequestNode, slotId, undefined, initialTracker);
114
114
  } else {
115
- newOutput = await renderBricks(returnNode, route.bricks, runtimeContext, rendererContext, routePath, menuRequestNode, slotId, undefined, undefined, initialTracker);
115
+ newOutput = await renderBricks(returnNode, route.bricks, runtimeContext, rendererContext, routePath, menuRequestNode, slotId, undefined, initialTracker);
116
116
  }
117
117
  mergeRenderOutput(output, newOutput);
118
118
  appendMenuRequestNode(menuRequestNode, newOutput.menuRequestNode);
@@ -121,24 +121,19 @@ async function renderRoutes(returnNode, routes, _runtimeContext, rendererContext
121
121
  }
122
122
  return output;
123
123
  }
124
- async function renderBricks(returnNode, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, keyPath, initialTracker) {
124
+ async function renderBricks(returnNode, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, initialTracker) {
125
125
  (0, _setupRootRuntimeContext.setupRootRuntimeContext)(bricks, runtimeContext, true);
126
126
  const output = getEmptyRenderOutput();
127
- const kPath = keyPath ?? [];
128
127
  // 多个构件并行异步转换,但转换的结果按原顺序串行合并。
129
- 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)));
130
- rendered.forEach((item, index) => {
131
- if (item.hasTrackingControls) {
132
- // Memoize a render node before it's been merged.
133
- rendererContext.memoize(slotId, kPath.concat(index), item.node, returnNode);
134
- }
128
+ const rendered = await Promise.all(bricks.map(brickConf => renderBrick(returnNode, brickConf, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack && new Map(tplStack), initialTracker)));
129
+ rendered.forEach(item => {
135
130
  mergeRenderOutput(output, item);
136
131
  });
137
132
  return output;
138
133
  }
139
- async function renderBrick(returnNode, brickConf, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, keyPath = [], tplStack = new Map(), initialTracker) {
134
+ async function renderBrick(returnNode, brickConf, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack = new Map(), initialTracker) {
140
135
  try {
141
- return await legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, keyPath, tplStack, initialTracker);
136
+ return await legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, initialTracker);
142
137
  } catch (error) {
143
138
  if (brickConf.errorBoundary) {
144
139
  // eslint-disable-next-line no-console
@@ -152,7 +147,7 @@ async function renderBrick(returnNode, brickConf, _runtimeContext, rendererConte
152
147
  }
153
148
  }
154
149
  }
155
- async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, keyPath, tplStack, initialTracker) {
150
+ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, initialTracker) {
156
151
  var _hooks$checkPermissio2, _runtimeContext$app;
157
152
  const output = getEmptyRenderOutput();
158
153
  if (!brickConf.brick) {
@@ -190,7 +185,7 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
190
185
  ...acc,
191
186
  [symbol]: brickConf[symbol]
192
187
  }), {})
193
- }, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, keyPath, tplStack, initialTracker);
188
+ }, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, initialTracker);
194
189
  }
195
190
  const tplStateStoreId = brickConf[_constants.symbolForTplStateStoreId];
196
191
  const formStateStoreId = brickConf[_constants2.symbolForFormStateStoreId];
@@ -251,23 +246,39 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
251
246
 
252
247
  // Then, get the bricks in that matched slot.
253
248
  const bricks = slots && (0, _general.hasOwnProperty)(slots, slot) && ((_slots$slot = slots[slot]) === null || _slots$slot === void 0 ? void 0 : _slots$slot.bricks);
249
+ const output = getEmptyRenderOutput();
250
+ const controlNode = {
251
+ tag: _enums.RenderTag.ABSTRACT,
252
+ return: returnNode
253
+ };
254
+ output.node = controlNode;
254
255
  if (!Array.isArray(bricks)) {
255
- return getEmptyRenderOutput();
256
+ return output;
256
257
  }
258
+ let childrenOutput;
257
259
  switch (brickName) {
258
260
  case ":forEach":
259
261
  {
260
262
  if (!Array.isArray(computedDataSource)) {
261
- return getEmptyRenderOutput();
263
+ break;
262
264
  }
263
- return renderForEach(returnNode, computedDataSource, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, keyPath, tracker);
265
+ childrenOutput = await renderForEach(controlNode, computedDataSource, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, tracker);
266
+ break;
264
267
  }
265
268
  case ":if":
266
269
  case ":switch":
267
270
  {
268
- return renderBricks(returnNode, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, keyPath, tracker);
271
+ childrenOutput = await renderBricks(controlNode, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, tracker);
269
272
  }
270
273
  }
274
+ if (childrenOutput) {
275
+ controlNode.child = childrenOutput.node;
276
+ mergeRenderOutput(output, {
277
+ ...childrenOutput,
278
+ node: undefined
279
+ });
280
+ }
281
+ return output;
271
282
  };
272
283
  const renderControlNode = async ({
273
284
  type,
@@ -275,7 +286,6 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
275
286
  tplStateStoreScope,
276
287
  formStateStoreScope
277
288
  }) => {
278
- var _ref;
279
289
  let changedAfterInitial = false;
280
290
  const tracker = {
281
291
  disposes: [],
@@ -310,14 +320,9 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
310
320
  throw new Error(`Maximum rerender stack overflowed (iid: ${brickConf.iid})`);
311
321
  }
312
322
  }
313
- (_ref = rawOutput).node ?? (_ref.node = {
314
- tag: _enums.RenderTag.PLACEHOLDER,
315
- return: returnNode,
316
- tracking
317
- });
318
323
  return rawOutput;
319
324
  };
320
- const controlledOutput = await renderControlNode({
325
+ let controlledOutput = await renderControlNode({
321
326
  type: "initial",
322
327
  runtimeContext
323
328
  });
@@ -326,7 +331,6 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
326
331
  onUnmount
327
332
  } = brickConf.lifeCycle ?? {};
328
333
  if (tracking) {
329
- controlledOutput.hasTrackingControls = true;
330
334
  let renderId = 0;
331
335
  const listener = async () => {
332
336
  const currentRenderId = ++renderId;
@@ -347,7 +351,8 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
347
351
  }
348
352
  }));
349
353
  }
350
- rendererContext.reRender(slotId, keyPath, reControlledOutput.node, returnNode);
354
+ rendererContext.reRender(returnNode, reControlledOutput.node, controlledOutput.node);
355
+ controlledOutput = reControlledOutput;
351
356
  if (onMount) {
352
357
  (0, _bindListeners.listenerFactory)(onMount, scopedRuntimeContext)(new CustomEvent("mount", {
353
358
  detail: {
@@ -530,10 +535,16 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
530
535
  return;
531
536
  }
532
537
  const routeSlotFromIndexToSlotId = new Map();
533
- const rendered = await Promise.all(Object.entries(slots).map(([childSlotId, slotConf], index) => {
538
+ const rendered = await Promise.all(Object.entries(slots).map(async ([childSlotId, slotConf], index) => {
534
539
  if (slotConf.type !== "routes") {
535
- return renderBricks(brick, slotConf.bricks, childRuntimeContext, rendererContext, parentRoutes, menuRequestReturnNode, childSlotId, tplStack, undefined, initialTracker);
540
+ return renderBricks(brick, slotConf.bricks, childRuntimeContext, rendererContext, parentRoutes, menuRequestReturnNode, childSlotId, tplStack, initialTracker);
536
541
  }
542
+ let lastOutput = getEmptyRenderOutput();
543
+ const controlNode = {
544
+ tag: _enums.RenderTag.ABSTRACT,
545
+ return: brick
546
+ };
547
+ lastOutput.node = controlNode;
537
548
  const parentRoute = parentRoutes[parentRoutes.length - 1];
538
549
  if (parentRoute !== null && parentRoute !== void 0 && parentRoute.incrementalSubRoutes) {
539
550
  routeSlotFromIndexToSlotId.set(index, childSlotId);
@@ -560,8 +571,14 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
560
571
  let failed = false;
561
572
  let incrementalOutput;
562
573
  let scopedStores = [];
574
+ const newOutput = getEmptyRenderOutput();
575
+ const newControlNode = {
576
+ tag: _enums.RenderTag.ABSTRACT,
577
+ return: brick
578
+ };
579
+ newOutput.node = newControlNode;
563
580
  try {
564
- incrementalOutput = await renderRoutes(brick, slotConf.routes, scopedRuntimeContext, rendererContext, parentRoutes, menuRequestReturnNode, childSlotId, true);
581
+ incrementalOutput = await renderRoutes(newControlNode, slotConf.routes, scopedRuntimeContext, rendererContext, parentRoutes, menuRequestReturnNode, childSlotId, true);
565
582
 
566
583
  // Do not ignore incremental rendering even if all sub-routes are missed.
567
584
  // Since parent route is matched.
@@ -573,11 +590,10 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
573
590
  scopedStores = [...tplStateStoreScope, ...formStateStoreScope];
574
591
  await postAsyncRender(incrementalOutput, scopedRuntimeContext, [scopedRuntimeContext.ctxStore, ...scopedStores]);
575
592
  }
576
- await rendererContext.reMergeMenuRequestNodes(menuRequestReturnNode, slotConf.routes, incrementalOutput.menuRequestNode);
577
593
  } catch (error) {
578
594
  // eslint-disable-next-line no-console
579
595
  console.error("Incremental sub-router failed:", error);
580
- const result = await rendererContext.reCatch(error, brick);
596
+ const result = await rendererContext.reCatch(error, newControlNode);
581
597
  if (!result) {
582
598
  return true;
583
599
  }
@@ -585,11 +601,16 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
585
601
  failed,
586
602
  output: incrementalOutput
587
603
  } = result);
588
-
589
- // Assert: no errors will be throw
590
- await rendererContext.reMergeMenuRequestNodes(menuRequestReturnNode, slotConf.routes, incrementalOutput.menuRequestNode);
591
604
  }
592
- rendererContext.reRender(childSlotId, [], incrementalOutput.node, brick);
605
+ newControlNode.child = incrementalOutput.node;
606
+ mergeRenderOutput(newOutput, {
607
+ ...incrementalOutput,
608
+ node: undefined
609
+ });
610
+ // Assert: no errors will be throw
611
+ await rendererContext.reMergeMenuRequestNodes(menuRequestReturnNode, slotConf.routes, incrementalOutput.menuRequestNode);
612
+ rendererContext.reRender(brick, newControlNode, lastOutput.node);
613
+ lastOutput = newOutput;
593
614
  if (!failed) {
594
615
  scopedRuntimeContext.ctxStore.mountAsyncData(incrementalOutput.route);
595
616
  for (const store of scopedStores) {
@@ -601,7 +622,14 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
601
622
  return true;
602
623
  });
603
624
  }
604
- return renderRoutes(brick, slotConf.routes, childRuntimeContext, rendererContext, parentRoutes, menuRequestReturnNode, childSlotId, undefined, initialTracker);
625
+ const routesOutput = await renderRoutes(controlNode, slotConf.routes, childRuntimeContext, rendererContext, parentRoutes, menuRequestReturnNode, childSlotId, undefined, initialTracker);
626
+ controlNode.child = routesOutput.node;
627
+ mergeRenderOutput(output, {
628
+ ...routesOutput,
629
+ node: undefined
630
+ });
631
+ appendMenuRequestNode(menuRequestReturnNode, output.menuRequestNode = routesOutput.menuRequestNode);
632
+ return lastOutput;
605
633
  }));
606
634
  const childrenOutput = {
607
635
  ...output,
@@ -609,11 +637,7 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
609
637
  blockingList: [],
610
638
  menuRequestNode: undefined
611
639
  };
612
- rendered.forEach((item, index) => {
613
- if (routeSlotFromIndexToSlotId.has(index)) {
614
- // Memoize a render node before it's been merged.
615
- rendererContext.memoize(routeSlotFromIndexToSlotId.get(index), [], item.node, brick);
616
- }
640
+ rendered.forEach(item => {
617
641
  mergeRenderOutput(childrenOutput, item);
618
642
  mergeSiblingRenderMenuRequest(childrenOutput, item);
619
643
  });
@@ -640,22 +664,18 @@ function ensureValidControlBrick(brick) {
640
664
  throw new Error(`Unknown storyboard control node: "${brick}"`);
641
665
  }
642
666
  }
643
- async function renderForEach(returnNode, dataSource, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, keyPath, initialTracker) {
667
+ async function renderForEach(returnNode, dataSource, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, initialTracker) {
644
668
  const output = getEmptyRenderOutput();
645
669
  const size = dataSource.length;
646
- const rendered = await Promise.all(dataSource.map((item, i) => Promise.all(bricks.map((brickConf, j) => renderBrick(returnNode, brickConf, {
670
+ const rendered = await Promise.all(dataSource.map((item, i) => Promise.all(bricks.map(brickConf => renderBrick(returnNode, brickConf, {
647
671
  ...runtimeContext,
648
672
  forEachItem: item,
649
673
  forEachIndex: i,
650
674
  forEachSize: size
651
- }, rendererContext, parentRoutes, menuRequestReturnNode, slotId, keyPath.concat(i * size + j), tplStack && new Map(tplStack), initialTracker)))));
675
+ }, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack && new Map(tplStack), initialTracker)))));
652
676
 
653
677
  // 多层构件并行异步转换,但转换的结果按原顺序串行合并。
654
- rendered.flat().forEach((item, index) => {
655
- if (item.hasTrackingControls) {
656
- // Memoize a render node before it's been merged.
657
- rendererContext.memoize(slotId, keyPath.concat(index), item.node, returnNode);
658
- }
678
+ rendered.flat().forEach(item => {
659
679
  mergeRenderOutput(output, item);
660
680
  });
661
681
  return output;
@@ -702,7 +722,6 @@ function mergeRenderOutput(output, newOutput) {
702
722
  blockingList,
703
723
  node,
704
724
  menuRequestNode,
705
- hasTrackingControls,
706
725
  ...rest
707
726
  } = newOutput;
708
727
  output.blockingList.push(...blockingList);