@next-core/runtime 1.62.0 → 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.
Files changed (36) hide show
  1. package/dist/cjs/internal/Renderer.js +69 -50
  2. package/dist/cjs/internal/Renderer.js.map +1 -1
  3. package/dist/cjs/internal/RendererContext.js +99 -117
  4. package/dist/cjs/internal/RendererContext.js.map +1 -1
  5. package/dist/cjs/internal/Runtime.js +2 -2
  6. package/dist/cjs/internal/Runtime.js.map +1 -1
  7. package/dist/cjs/internal/compute/getNextStateOfUseBrick.js +1 -0
  8. package/dist/cjs/internal/compute/getNextStateOfUseBrick.js.map +1 -1
  9. package/dist/cjs/internal/enums.js +1 -1
  10. package/dist/cjs/internal/enums.js.map +1 -1
  11. package/dist/cjs/internal/interfaces.js.map +1 -1
  12. package/dist/cjs/internal/mount.js +12 -5
  13. package/dist/cjs/internal/mount.js.map +1 -1
  14. package/dist/cjs/internal/secret_internals.js +10 -7
  15. package/dist/cjs/internal/secret_internals.js.map +1 -1
  16. package/dist/esm/internal/Renderer.js +71 -53
  17. package/dist/esm/internal/Renderer.js.map +1 -1
  18. package/dist/esm/internal/RendererContext.js +99 -117
  19. package/dist/esm/internal/RendererContext.js.map +1 -1
  20. package/dist/esm/internal/Runtime.js +2 -2
  21. package/dist/esm/internal/Runtime.js.map +1 -1
  22. package/dist/esm/internal/compute/getNextStateOfUseBrick.js +1 -0
  23. package/dist/esm/internal/compute/getNextStateOfUseBrick.js.map +1 -1
  24. package/dist/esm/internal/enums.js +1 -1
  25. package/dist/esm/internal/enums.js.map +1 -1
  26. package/dist/esm/internal/interfaces.js.map +1 -1
  27. package/dist/esm/internal/mount.js +12 -5
  28. package/dist/esm/internal/mount.js.map +1 -1
  29. package/dist/esm/internal/secret_internals.js +10 -7
  30. package/dist/esm/internal/secret_internals.js.map +1 -1
  31. package/dist/types/internal/Renderer.d.ts +2 -3
  32. package/dist/types/internal/RendererContext.d.ts +1 -2
  33. package/dist/types/internal/enums.d.ts +1 -1
  34. package/dist/types/internal/interfaces.d.ts +5 -7
  35. package/dist/types/tsdoc-metadata.json +1 -1
  36. package/package.json +12 -12
@@ -101,7 +101,7 @@ export async function renderRoutes(returnNode, routes, _runtimeContext, renderer
101
101
  if (route.type === "routes") {
102
102
  newOutput = await renderRoutes(returnNode, route.routes, runtimeContext, rendererContext, routePath, menuRequestNode, slotId, undefined, initialTracker);
103
103
  } else {
104
- newOutput = await renderBricks(returnNode, route.bricks, runtimeContext, rendererContext, routePath, menuRequestNode, slotId, undefined, undefined, initialTracker);
104
+ newOutput = await renderBricks(returnNode, route.bricks, runtimeContext, rendererContext, routePath, menuRequestNode, slotId, undefined, initialTracker);
105
105
  }
106
106
  mergeRenderOutput(output, newOutput);
107
107
  appendMenuRequestNode(menuRequestNode, newOutput.menuRequestNode);
@@ -110,27 +110,21 @@ export async function renderRoutes(returnNode, routes, _runtimeContext, renderer
110
110
  }
111
111
  return output;
112
112
  }
113
- export async function renderBricks(returnNode, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, keyPath, initialTracker) {
113
+ export async function renderBricks(returnNode, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, initialTracker) {
114
114
  setupRootRuntimeContext(bricks, runtimeContext, true);
115
115
  const output = getEmptyRenderOutput();
116
- const kPath = keyPath !== null && keyPath !== void 0 ? keyPath : [];
117
116
  // 多个构件并行异步转换,但转换的结果按原顺序串行合并。
118
- 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)));
119
- rendered.forEach((item, index) => {
120
- if (item.hasTrackingControls) {
121
- // Memoize a render node before it's been merged.
122
- rendererContext.memoize(slotId, kPath.concat(index), item.node, returnNode);
123
- }
117
+ const rendered = await Promise.all(bricks.map(brickConf => renderBrick(returnNode, brickConf, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack && new Map(tplStack), initialTracker)));
118
+ rendered.forEach(item => {
124
119
  mergeRenderOutput(output, item);
125
120
  });
126
121
  return output;
127
122
  }
128
123
  export async function renderBrick(returnNode, brickConf, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId) {
129
- let keyPath = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : [];
130
- let tplStack = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : new Map();
131
- let initialTracker = arguments.length > 9 ? arguments[9] : undefined;
124
+ let tplStack = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : new Map();
125
+ let initialTracker = arguments.length > 8 ? arguments[8] : undefined;
132
126
  try {
133
- return await legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, keyPath, tplStack, initialTracker);
127
+ return await legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, initialTracker);
134
128
  } catch (error) {
135
129
  if (brickConf.errorBoundary) {
136
130
  // eslint-disable-next-line no-console
@@ -144,7 +138,7 @@ export async function renderBrick(returnNode, brickConf, _runtimeContext, render
144
138
  }
145
139
  }
146
140
  }
147
- async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, keyPath, tplStack, initialTracker) {
141
+ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, initialTracker) {
148
142
  var _hooks$checkPermissio2, _runtimeContext$app;
149
143
  const output = getEmptyRenderOutput();
150
144
  if (!brickConf.brick) {
@@ -182,7 +176,7 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
182
176
  ...acc,
183
177
  [symbol]: brickConf[symbol]
184
178
  }), {})
185
- }, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, keyPath, tplStack, initialTracker);
179
+ }, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, initialTracker);
186
180
  }
187
181
  const tplStateStoreId = brickConf[symbolForTplStateStoreId];
188
182
  const formStateStoreId = brickConf[symbolForFormStateStoreId];
@@ -244,26 +238,41 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
244
238
 
245
239
  // Then, get the bricks in that matched slot.
246
240
  const bricks = slots && hasOwnProperty(slots, slot) && ((_slots$slot = slots[slot]) === null || _slots$slot === void 0 ? void 0 : _slots$slot.bricks);
241
+ const output = getEmptyRenderOutput();
242
+ const controlNode = {
243
+ tag: RenderTag.ABSTRACT,
244
+ return: returnNode
245
+ };
246
+ output.node = controlNode;
247
247
  if (!Array.isArray(bricks)) {
248
- return getEmptyRenderOutput();
248
+ return output;
249
249
  }
250
+ let childrenOutput;
250
251
  switch (brickName) {
251
252
  case ":forEach":
252
253
  {
253
254
  if (!Array.isArray(computedDataSource)) {
254
- return getEmptyRenderOutput();
255
+ break;
255
256
  }
256
- return renderForEach(returnNode, computedDataSource, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, keyPath, tracker);
257
+ childrenOutput = await renderForEach(controlNode, computedDataSource, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, tracker);
258
+ break;
257
259
  }
258
260
  case ":if":
259
261
  case ":switch":
260
262
  {
261
- return renderBricks(returnNode, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, keyPath, tracker);
263
+ childrenOutput = await renderBricks(controlNode, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, tracker);
262
264
  }
263
265
  }
266
+ if (childrenOutput) {
267
+ controlNode.child = childrenOutput.node;
268
+ mergeRenderOutput(output, {
269
+ ...childrenOutput,
270
+ node: undefined
271
+ });
272
+ }
273
+ return output;
264
274
  };
265
275
  const renderControlNode = async _ref => {
266
- var _ref2, _ref2$node;
267
276
  let {
268
277
  type,
269
278
  runtimeContext,
@@ -304,14 +313,9 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
304
313
  throw new Error(`Maximum rerender stack overflowed (iid: ${brickConf.iid})`);
305
314
  }
306
315
  }
307
- (_ref2$node = (_ref2 = rawOutput).node) !== null && _ref2$node !== void 0 ? _ref2$node : _ref2.node = {
308
- tag: RenderTag.PLACEHOLDER,
309
- return: returnNode,
310
- tracking
311
- };
312
316
  return rawOutput;
313
317
  };
314
- const controlledOutput = await renderControlNode({
318
+ let controlledOutput = await renderControlNode({
315
319
  type: "initial",
316
320
  runtimeContext
317
321
  });
@@ -321,7 +325,6 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
321
325
  } = (_brickConf$lifeCycle = brickConf.lifeCycle) !== null && _brickConf$lifeCycle !== void 0 ? _brickConf$lifeCycle : {};
322
326
  if (tracking) {
323
327
  var _runtimeBrick$dispose;
324
- controlledOutput.hasTrackingControls = true;
325
328
  let renderId = 0;
326
329
  const listener = async () => {
327
330
  const currentRenderId = ++renderId;
@@ -342,7 +345,8 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
342
345
  }
343
346
  }));
344
347
  }
345
- rendererContext.reRender(slotId, keyPath, reControlledOutput.node, returnNode);
348
+ rendererContext.reRender(returnNode, reControlledOutput.node, controlledOutput.node);
349
+ controlledOutput = reControlledOutput;
346
350
  if (onMount) {
347
351
  listenerFactory(onMount, scopedRuntimeContext)(new CustomEvent("mount", {
348
352
  detail: {
@@ -527,11 +531,17 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
527
531
  return;
528
532
  }
529
533
  const routeSlotFromIndexToSlotId = new Map();
530
- const rendered = await Promise.all(Object.entries(slots).map((_ref3, index) => {
531
- let [childSlotId, slotConf] = _ref3;
534
+ const rendered = await Promise.all(Object.entries(slots).map(async (_ref2, index) => {
535
+ let [childSlotId, slotConf] = _ref2;
532
536
  if (slotConf.type !== "routes") {
533
- return renderBricks(brick, slotConf.bricks, childRuntimeContext, rendererContext, parentRoutes, menuRequestReturnNode, childSlotId, tplStack, undefined, initialTracker);
537
+ return renderBricks(brick, slotConf.bricks, childRuntimeContext, rendererContext, parentRoutes, menuRequestReturnNode, childSlotId, tplStack, initialTracker);
534
538
  }
539
+ let lastOutput = getEmptyRenderOutput();
540
+ const controlNode = {
541
+ tag: RenderTag.ABSTRACT,
542
+ return: brick
543
+ };
544
+ lastOutput.node = controlNode;
535
545
  const parentRoute = parentRoutes[parentRoutes.length - 1];
536
546
  if (parentRoute !== null && parentRoute !== void 0 && parentRoute.incrementalSubRoutes) {
537
547
  routeSlotFromIndexToSlotId.set(index, childSlotId);
@@ -558,8 +568,14 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
558
568
  let failed = false;
559
569
  let incrementalOutput;
560
570
  let scopedStores = [];
571
+ const newOutput = getEmptyRenderOutput();
572
+ const newControlNode = {
573
+ tag: RenderTag.ABSTRACT,
574
+ return: brick
575
+ };
576
+ newOutput.node = newControlNode;
561
577
  try {
562
- incrementalOutput = await renderRoutes(brick, slotConf.routes, scopedRuntimeContext, rendererContext, parentRoutes, menuRequestReturnNode, childSlotId, true);
578
+ incrementalOutput = await renderRoutes(newControlNode, slotConf.routes, scopedRuntimeContext, rendererContext, parentRoutes, menuRequestReturnNode, childSlotId, true);
563
579
 
564
580
  // Do not ignore incremental rendering even if all sub-routes are missed.
565
581
  // Since parent route is matched.
@@ -571,11 +587,10 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
571
587
  scopedStores = [...tplStateStoreScope, ...formStateStoreScope];
572
588
  await postAsyncRender(incrementalOutput, scopedRuntimeContext, [scopedRuntimeContext.ctxStore, ...scopedStores]);
573
589
  }
574
- await rendererContext.reMergeMenuRequestNodes(menuRequestReturnNode, slotConf.routes, incrementalOutput.menuRequestNode);
575
590
  } catch (error) {
576
591
  // eslint-disable-next-line no-console
577
592
  console.error("Incremental sub-router failed:", error);
578
- const result = await rendererContext.reCatch(error, brick);
593
+ const result = await rendererContext.reCatch(error, newControlNode);
579
594
  if (!result) {
580
595
  return true;
581
596
  }
@@ -583,11 +598,16 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
583
598
  failed,
584
599
  output: incrementalOutput
585
600
  } = result);
586
-
587
- // Assert: no errors will be throw
588
- await rendererContext.reMergeMenuRequestNodes(menuRequestReturnNode, slotConf.routes, incrementalOutput.menuRequestNode);
589
601
  }
590
- rendererContext.reRender(childSlotId, [], incrementalOutput.node, brick);
602
+ newControlNode.child = incrementalOutput.node;
603
+ mergeRenderOutput(newOutput, {
604
+ ...incrementalOutput,
605
+ node: undefined
606
+ });
607
+ // Assert: no errors will be throw
608
+ await rendererContext.reMergeMenuRequestNodes(menuRequestReturnNode, slotConf.routes, incrementalOutput.menuRequestNode);
609
+ rendererContext.reRender(brick, newControlNode, lastOutput.node);
610
+ lastOutput = newOutput;
591
611
  if (!failed) {
592
612
  scopedRuntimeContext.ctxStore.mountAsyncData(incrementalOutput.route);
593
613
  for (const store of scopedStores) {
@@ -599,7 +619,14 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
599
619
  return true;
600
620
  });
601
621
  }
602
- return renderRoutes(brick, slotConf.routes, childRuntimeContext, rendererContext, parentRoutes, menuRequestReturnNode, childSlotId, undefined, initialTracker);
622
+ const routesOutput = await renderRoutes(controlNode, slotConf.routes, childRuntimeContext, rendererContext, parentRoutes, menuRequestReturnNode, childSlotId, undefined, initialTracker);
623
+ controlNode.child = routesOutput.node;
624
+ mergeRenderOutput(output, {
625
+ ...routesOutput,
626
+ node: undefined
627
+ });
628
+ appendMenuRequestNode(menuRequestReturnNode, output.menuRequestNode = routesOutput.menuRequestNode);
629
+ return lastOutput;
603
630
  }));
604
631
  const childrenOutput = {
605
632
  ...output,
@@ -607,11 +634,7 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
607
634
  blockingList: [],
608
635
  menuRequestNode: undefined
609
636
  };
610
- rendered.forEach((item, index) => {
611
- if (routeSlotFromIndexToSlotId.has(index)) {
612
- // Memoize a render node before it's been merged.
613
- rendererContext.memoize(routeSlotFromIndexToSlotId.get(index), [], item.node, brick);
614
- }
637
+ rendered.forEach(item => {
615
638
  mergeRenderOutput(childrenOutput, item);
616
639
  mergeSiblingRenderMenuRequest(childrenOutput, item);
617
640
  });
@@ -638,22 +661,18 @@ function ensureValidControlBrick(brick) {
638
661
  throw new Error(`Unknown storyboard control node: "${brick}"`);
639
662
  }
640
663
  }
641
- async function renderForEach(returnNode, dataSource, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, keyPath, initialTracker) {
664
+ async function renderForEach(returnNode, dataSource, bricks, runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack, initialTracker) {
642
665
  const output = getEmptyRenderOutput();
643
666
  const size = dataSource.length;
644
- const rendered = await Promise.all(dataSource.map((item, i) => Promise.all(bricks.map((brickConf, j) => renderBrick(returnNode, brickConf, {
667
+ const rendered = await Promise.all(dataSource.map((item, i) => Promise.all(bricks.map(brickConf => renderBrick(returnNode, brickConf, {
645
668
  ...runtimeContext,
646
669
  forEachItem: item,
647
670
  forEachIndex: i,
648
671
  forEachSize: size
649
- }, rendererContext, parentRoutes, menuRequestReturnNode, slotId, keyPath.concat(i * size + j), tplStack && new Map(tplStack), initialTracker)))));
672
+ }, rendererContext, parentRoutes, menuRequestReturnNode, slotId, tplStack && new Map(tplStack), initialTracker)))));
650
673
 
651
674
  // 多层构件并行异步转换,但转换的结果按原顺序串行合并。
652
- rendered.flat().forEach((item, index) => {
653
- if (item.hasTrackingControls) {
654
- // Memoize a render node before it's been merged.
655
- rendererContext.memoize(slotId, keyPath.concat(index), item.node, returnNode);
656
- }
675
+ rendered.flat().forEach(item => {
657
676
  mergeRenderOutput(output, item);
658
677
  });
659
678
  return output;
@@ -700,7 +719,6 @@ function mergeRenderOutput(output, newOutput) {
700
719
  blockingList,
701
720
  node,
702
721
  menuRequestNode,
703
- hasTrackingControls,
704
722
  ...rest
705
723
  } = newOutput;
706
724
  output.blockingList.push(...blockingList);