@weapp-vite/web 1.5.6 → 2.0.0

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 (66) hide show
  1. package/README.md +22 -0
  2. package/dist/css/wxss.mjs +2 -1
  3. package/dist/css/wxss.mjs.map +1 -1
  4. package/dist/index.d.mts +2 -1
  5. package/dist/index.mjs +2 -1
  6. package/dist/plugin/hostTypes.d.mts +74 -0
  7. package/dist/plugin/index.d.mts +2 -74
  8. package/dist/plugin/index.mjs +9 -2
  9. package/dist/plugin/index.mjs.map +1 -1
  10. package/dist/plugin/sfcHmr.mjs +19 -0
  11. package/dist/plugin/sfcHmr.mjs.map +1 -0
  12. package/dist/plugin/vueSfc.mjs +12 -9
  13. package/dist/plugin/vueSfc.mjs.map +1 -1
  14. package/dist/runtime/appStyle.mjs +25 -0
  15. package/dist/runtime/appStyle.mjs.map +1 -0
  16. package/dist/runtime/component/element.mjs +39 -19
  17. package/dist/runtime/component/element.mjs.map +1 -1
  18. package/dist/runtime/component/events.mjs +34 -3
  19. package/dist/runtime/component/events.mjs.map +1 -1
  20. package/dist/runtime/component/publicInstance.mjs +7 -3
  21. package/dist/runtime/component/publicInstance.mjs.map +1 -1
  22. package/dist/runtime/component/state.mjs +7 -0
  23. package/dist/runtime/component/state.mjs.map +1 -1
  24. package/dist/runtime/component/types.d.mts +2 -0
  25. package/dist/runtime/component/utils.mjs +23 -3
  26. package/dist/runtime/component/utils.mjs.map +1 -1
  27. package/dist/runtime/componentEvents.mjs +37 -0
  28. package/dist/runtime/componentEvents.mjs.map +1 -0
  29. package/dist/runtime/eventBinding.mjs +5 -2
  30. package/dist/runtime/eventBinding.mjs.map +1 -1
  31. package/dist/runtime/index.d.mts +2 -1
  32. package/dist/runtime/index.mjs +2 -1
  33. package/dist/runtime/index.mjs.map +1 -1
  34. package/dist/runtime/legacyTemplate/dom.mjs +2 -7
  35. package/dist/runtime/legacyTemplate/dom.mjs.map +1 -1
  36. package/dist/runtime/nativeComponents/canvas/index.mjs +12 -3
  37. package/dist/runtime/nativeComponents/canvas/index.mjs.map +1 -1
  38. package/dist/runtime/polyfill/index.d.mts +2 -1
  39. package/dist/runtime/polyfill/index.mjs +15 -1
  40. package/dist/runtime/polyfill/index.mjs.map +1 -1
  41. package/dist/runtime/polyfill/routeRuntime/dom.mjs +5 -0
  42. package/dist/runtime/polyfill/routeRuntime/dom.mjs.map +1 -1
  43. package/dist/runtime/polyfill/routeRuntime/events.d.mts +29 -0
  44. package/dist/runtime/polyfill/routeRuntime/events.mjs +123 -0
  45. package/dist/runtime/polyfill/routeRuntime/events.mjs.map +1 -0
  46. package/dist/runtime/polyfill/routeRuntime/history.d.mts +3 -1
  47. package/dist/runtime/polyfill/routeRuntime/history.mjs +4 -1
  48. package/dist/runtime/polyfill/routeRuntime/history.mjs.map +1 -1
  49. package/dist/runtime/polyfill/routeRuntime/lifecycle.mjs +9 -0
  50. package/dist/runtime/polyfill/routeRuntime/lifecycle.mjs.map +1 -1
  51. package/dist/runtime/polyfill/routeRuntime/options.mjs.map +1 -1
  52. package/dist/runtime/polyfill/routeRuntime/scroll.mjs +20 -3
  53. package/dist/runtime/polyfill/routeRuntime/scroll.mjs.map +1 -1
  54. package/dist/runtime/polyfill/routeRuntime/stack.mjs +60 -19
  55. package/dist/runtime/polyfill/routeRuntime/stack.mjs.map +1 -1
  56. package/dist/runtime/polyfill/routeRuntime.d.mts +1 -1
  57. package/dist/runtime/polyfill/routeRuntime.mjs +32 -12
  58. package/dist/runtime/polyfill/routeRuntime.mjs.map +1 -1
  59. package/dist/runtime/polyfill.d.mts +2 -1
  60. package/dist/runtime/renderContext.mjs +3 -2
  61. package/dist/runtime/renderContext.mjs.map +1 -1
  62. package/dist/runtime/wevu.mjs +2 -0
  63. package/dist/runtime/wevu.mjs.map +1 -1
  64. package/dist/shared/wxml.mjs +5 -1
  65. package/dist/shared/wxml.mjs.map +1 -1
  66. package/package.json +14 -12
@@ -1,5 +1,6 @@
1
1
  import { ensureAppContainer, onDocumentReady } from "../../appShell/container.mjs";
2
2
  import { bindPageScrollOwner, getPageContainer, restoreEntryScrollPosition, setEntryScrollOwner } from "./scroll.mjs";
3
+ import { cancelEntryRoute } from "./events.mjs";
3
4
  import { attachRouteMeta } from "./lifecycle.mjs";
4
5
 
5
6
  //#region src/runtime/polyfill/routeRuntime/dom.ts
@@ -27,6 +28,8 @@ function setEntryActiveInDom(entry, active) {
27
28
  applyEntryVisibility(entry);
28
29
  }
29
30
  function unmountEntryFromDom(entry) {
31
+ cancelEntryRoute(entry);
32
+ entry.destroyed = true;
30
33
  setEntryScrollOwner(entry, false);
31
34
  const element = entry.element;
32
35
  if (!element) {
@@ -41,6 +44,7 @@ function mountEntryToDom(entry, pageRegistry, onBeforeMount) {
41
44
  const record = pageRegistry.get(entry.id);
42
45
  if (!record || entry.element) return;
43
46
  onDocumentReady(() => {
47
+ if (entry.destroyed) return;
44
48
  const container = ensureAppContainer();
45
49
  if (!container) return;
46
50
  bindPageScrollOwner(container);
@@ -57,6 +61,7 @@ function mountEntryToDom(entry, pageRegistry, onBeforeMount) {
57
61
  });
58
62
  container.append(element);
59
63
  if (entry.active) restoreEntryScrollPosition(entry);
64
+ entry.onRouteMounted?.();
60
65
  });
61
66
  }
62
67
 
@@ -1 +1 @@
1
- {"version":3,"file":"dom.mjs","names":[],"sources":["../../../../src/runtime/polyfill/routeRuntime/dom.ts"],"sourcesContent":["import type { ComponentPublicInstance } from '../../component'\nimport type { PageRecord, PageStackEntry } from './options'\nimport { ensureAppContainer, onDocumentReady } from '../../appShell/container'\nimport { attachRouteMeta } from './lifecycle'\nimport {\n bindPageScrollOwner,\n restoreEntryScrollPosition,\n setEntryScrollOwner,\n} from './scroll'\n\nfunction applyEntryVisibility(entry: PageStackEntry) {\n const element = entry.element\n if (!element) {\n return\n }\n const currentStyle = element.getAttribute('style') ?? ''\n const styleWithoutDisplay = currentStyle\n .replace(/(?:^|;)\\s*display\\s*:[^;]*/gi, '')\n .replace(/^;|;$/g, '')\n const setDisplay = (display: 'block' | 'none') => {\n element.setAttribute('style', `${styleWithoutDisplay}${styleWithoutDisplay ? ';' : ''}display:${display};`)\n }\n element.setAttribute('data-weapp-page-active', entry.active ? 'true' : 'false')\n setEntryScrollOwner(entry, entry.active)\n if (entry.active) {\n setDisplay('block')\n element.removeAttribute('hidden')\n element.removeAttribute('aria-hidden')\n return\n }\n // 自定义页面元素挂载时带有内联 display,必须同步清零才能真正隐藏。\n setDisplay('none')\n element.setAttribute('hidden', '')\n element.setAttribute('aria-hidden', 'true')\n}\n\nexport function setEntryActiveInDom(entry: PageStackEntry, active: boolean) {\n entry.active = active\n applyEntryVisibility(entry)\n}\n\nexport function unmountEntryFromDom(entry: PageStackEntry) {\n setEntryScrollOwner(entry, false)\n const element = entry.element\n if (!element) {\n entry.instance = undefined\n return\n }\n if (element.parentNode) {\n element.parentNode.removeChild(element)\n }\n entry.element = undefined\n entry.instance = undefined\n}\n\nexport function mountEntryToDom(\n entry: PageStackEntry,\n pageRegistry: Map<string, PageRecord>,\n onBeforeMount: (entry: PageStackEntry) => void,\n) {\n const record = pageRegistry.get(entry.id)\n if (!record || entry.element) {\n return\n }\n onDocumentReady(() => {\n const container = ensureAppContainer()\n if (!container) {\n return\n }\n bindPageScrollOwner(container)\n onBeforeMount(entry)\n const element = document.createElement(record.tag) as HTMLElement & ComponentPublicInstance\n element.setAttribute('data-weapp-page', entry.id)\n element.setAttribute('style', 'display:block;min-height:100%;box-sizing:border-box;padding-bottom:var(--weapp-tab-bar-inset, 0px);padding-top:var(--weapp-tab-bar-top-inset, 0px);')\n entry.element = element\n applyEntryVisibility(entry)\n attachRouteMeta(element, {\n id: entry.id,\n query: entry.query,\n entry,\n })\n container.append(element)\n if (entry.active) {\n restoreEntryScrollPosition(entry)\n }\n })\n}\n\nexport { getPageContainer } from './scroll'\n"],"mappings":";;;;;AAUA,SAAS,qBAAqB,OAAuB;CACnD,MAAM,UAAU,MAAM;CACtB,IAAI,CAAC,SACH;CAGF,MAAM,uBADe,QAAQ,aAAa,OAAO,KAAK,GACd,CACrC,QAAQ,gCAAgC,EAAE,CAAC,CAC3C,QAAQ,UAAU,EAAE;CACvB,MAAM,cAAc,YAA8B;EAChD,QAAQ,aAAa,SAAS,GAAG,sBAAsB,sBAAsB,MAAM,GAAG,UAAU,QAAQ,EAAE;CAC5G;CACA,QAAQ,aAAa,0BAA0B,MAAM,SAAS,SAAS,OAAO;CAC9E,oBAAoB,OAAO,MAAM,MAAM;CACvC,IAAI,MAAM,QAAQ;EAChB,WAAW,OAAO;EAClB,QAAQ,gBAAgB,QAAQ;EAChC,QAAQ,gBAAgB,aAAa;EACrC;CACF;CAEA,WAAW,MAAM;CACjB,QAAQ,aAAa,UAAU,EAAE;CACjC,QAAQ,aAAa,eAAe,MAAM;AAC5C;AAEA,SAAgB,oBAAoB,OAAuB,QAAiB;CAC1E,MAAM,SAAS;CACf,qBAAqB,KAAK;AAC5B;AAEA,SAAgB,oBAAoB,OAAuB;CACzD,oBAAoB,OAAO,KAAK;CAChC,MAAM,UAAU,MAAM;CACtB,IAAI,CAAC,SAAS;EACZ,MAAM,WAAW;EACjB;CACF;CACA,IAAI,QAAQ,YACV,QAAQ,WAAW,YAAY,OAAO;CAExC,MAAM,UAAU;CAChB,MAAM,WAAW;AACnB;AAEA,SAAgB,gBACd,OACA,cACA,eACA;CACA,MAAM,SAAS,aAAa,IAAI,MAAM,EAAE;CACxC,IAAI,CAAC,UAAU,MAAM,SACnB;CAEF,sBAAsB;EACpB,MAAM,YAAY,mBAAmB;EACrC,IAAI,CAAC,WACH;EAEF,oBAAoB,SAAS;EAC7B,cAAc,KAAK;EACnB,MAAM,UAAU,SAAS,cAAc,OAAO,GAAG;EACjD,QAAQ,aAAa,mBAAmB,MAAM,EAAE;EAChD,QAAQ,aAAa,SAAS,qJAAqJ;EACnL,MAAM,UAAU;EAChB,qBAAqB,KAAK;EAC1B,gBAAgB,SAAS;GACvB,IAAI,MAAM;GACV,OAAO,MAAM;GACb;EACF,CAAC;EACD,UAAU,OAAO,OAAO;EACxB,IAAI,MAAM,QACR,2BAA2B,KAAK;CAEpC,CAAC;AACH"}
1
+ {"version":3,"file":"dom.mjs","names":[],"sources":["../../../../src/runtime/polyfill/routeRuntime/dom.ts"],"sourcesContent":["import type { ComponentPublicInstance } from '../../component'\nimport type { PageRecord, PageStackEntry } from './options'\nimport { ensureAppContainer, onDocumentReady } from '../../appShell/container'\nimport { cancelEntryRoute } from './events'\nimport { attachRouteMeta } from './lifecycle'\nimport {\n bindPageScrollOwner,\n restoreEntryScrollPosition,\n setEntryScrollOwner,\n} from './scroll'\n\nfunction applyEntryVisibility(entry: PageStackEntry) {\n const element = entry.element\n if (!element) {\n return\n }\n const currentStyle = element.getAttribute('style') ?? ''\n const styleWithoutDisplay = currentStyle\n .replace(/(?:^|;)\\s*display\\s*:[^;]*/gi, '')\n .replace(/^;|;$/g, '')\n const setDisplay = (display: 'block' | 'none') => {\n element.setAttribute('style', `${styleWithoutDisplay}${styleWithoutDisplay ? ';' : ''}display:${display};`)\n }\n element.setAttribute('data-weapp-page-active', entry.active ? 'true' : 'false')\n setEntryScrollOwner(entry, entry.active)\n if (entry.active) {\n setDisplay('block')\n element.removeAttribute('hidden')\n element.removeAttribute('aria-hidden')\n return\n }\n // 自定义页面元素挂载时带有内联 display,必须同步清零才能真正隐藏。\n setDisplay('none')\n element.setAttribute('hidden', '')\n element.setAttribute('aria-hidden', 'true')\n}\n\nexport function setEntryActiveInDom(entry: PageStackEntry, active: boolean) {\n entry.active = active\n applyEntryVisibility(entry)\n}\n\nexport function unmountEntryFromDom(entry: PageStackEntry) {\n cancelEntryRoute(entry)\n entry.destroyed = true\n setEntryScrollOwner(entry, false)\n const element = entry.element\n if (!element) {\n entry.instance = undefined\n return\n }\n if (element.parentNode) {\n element.parentNode.removeChild(element)\n }\n entry.element = undefined\n entry.instance = undefined\n}\n\nexport function mountEntryToDom(\n entry: PageStackEntry,\n pageRegistry: Map<string, PageRecord>,\n onBeforeMount: (entry: PageStackEntry) => void,\n) {\n const record = pageRegistry.get(entry.id)\n if (!record || entry.element) {\n return\n }\n onDocumentReady(() => {\n if (entry.destroyed) {\n return\n }\n const container = ensureAppContainer()\n if (!container) {\n return\n }\n bindPageScrollOwner(container)\n onBeforeMount(entry)\n const element = document.createElement(record.tag) as HTMLElement & ComponentPublicInstance\n element.setAttribute('data-weapp-page', entry.id)\n element.setAttribute('style', 'display:block;min-height:100%;box-sizing:border-box;padding-bottom:var(--weapp-tab-bar-inset, 0px);padding-top:var(--weapp-tab-bar-top-inset, 0px);')\n entry.element = element\n applyEntryVisibility(entry)\n attachRouteMeta(element, {\n id: entry.id,\n query: entry.query,\n entry,\n })\n container.append(element)\n if (entry.active) {\n restoreEntryScrollPosition(entry)\n }\n entry.onRouteMounted?.()\n })\n}\n\nexport { getPageContainer } from './scroll'\n"],"mappings":";;;;;;AAWA,SAAS,qBAAqB,OAAuB;CACnD,MAAM,UAAU,MAAM;CACtB,IAAI,CAAC,SACH;CAGF,MAAM,uBADe,QAAQ,aAAa,OAAO,KAAK,GACd,CACrC,QAAQ,gCAAgC,EAAE,CAAC,CAC3C,QAAQ,UAAU,EAAE;CACvB,MAAM,cAAc,YAA8B;EAChD,QAAQ,aAAa,SAAS,GAAG,sBAAsB,sBAAsB,MAAM,GAAG,UAAU,QAAQ,EAAE;CAC5G;CACA,QAAQ,aAAa,0BAA0B,MAAM,SAAS,SAAS,OAAO;CAC9E,oBAAoB,OAAO,MAAM,MAAM;CACvC,IAAI,MAAM,QAAQ;EAChB,WAAW,OAAO;EAClB,QAAQ,gBAAgB,QAAQ;EAChC,QAAQ,gBAAgB,aAAa;EACrC;CACF;CAEA,WAAW,MAAM;CACjB,QAAQ,aAAa,UAAU,EAAE;CACjC,QAAQ,aAAa,eAAe,MAAM;AAC5C;AAEA,SAAgB,oBAAoB,OAAuB,QAAiB;CAC1E,MAAM,SAAS;CACf,qBAAqB,KAAK;AAC5B;AAEA,SAAgB,oBAAoB,OAAuB;CACzD,iBAAiB,KAAK;CACtB,MAAM,YAAY;CAClB,oBAAoB,OAAO,KAAK;CAChC,MAAM,UAAU,MAAM;CACtB,IAAI,CAAC,SAAS;EACZ,MAAM,WAAW;EACjB;CACF;CACA,IAAI,QAAQ,YACV,QAAQ,WAAW,YAAY,OAAO;CAExC,MAAM,UAAU;CAChB,MAAM,WAAW;AACnB;AAEA,SAAgB,gBACd,OACA,cACA,eACA;CACA,MAAM,SAAS,aAAa,IAAI,MAAM,EAAE;CACxC,IAAI,CAAC,UAAU,MAAM,SACnB;CAEF,sBAAsB;EACpB,IAAI,MAAM,WACR;EAEF,MAAM,YAAY,mBAAmB;EACrC,IAAI,CAAC,WACH;EAEF,oBAAoB,SAAS;EAC7B,cAAc,KAAK;EACnB,MAAM,UAAU,SAAS,cAAc,OAAO,GAAG;EACjD,QAAQ,aAAa,mBAAmB,MAAM,EAAE;EAChD,QAAQ,aAAa,SAAS,qJAAqJ;EACnL,MAAM,UAAU;EAChB,qBAAqB,KAAK;EAC1B,gBAAgB,SAAS;GACvB,IAAI,MAAM;GACV,OAAO,MAAM;GACb;EACF,CAAC;EACD,UAAU,OAAO,OAAO;EACxB,IAAI,MAAM,QACR,2BAA2B,KAAK;EAElC,MAAM,iBAAiB;CACzB,CAAC;AACH"}
@@ -0,0 +1,29 @@
1
+ import { ComponentPublicInstance } from "../../component/types.mjs";
2
+ import "../../component/index.mjs";
3
+ import "./options.mjs";
4
+ //#region src/runtime/polyfill/routeRuntime/events.d.ts
5
+ export type AppRouteOpenType = 'appLaunch' | 'navigateTo' | 'redirectTo' | 'navigateBack' | 'switchTab' | 'reLaunch';
6
+ export interface AppRouteEvent {
7
+ routeEventId: string;
8
+ path: string;
9
+ query: Record<string, string>;
10
+ openType: AppRouteOpenType;
11
+ webviewId: number;
12
+ renderer: 'webview';
13
+ page?: ComponentPublicInstance;
14
+ }
15
+ export interface BeforePageUnloadEvent extends AppRouteEvent {
16
+ page: ComponentPublicInstance;
17
+ }
18
+ export type AppRouteCallback = (event: AppRouteEvent) => void;
19
+ export type BeforePageUnloadCallback = (event: BeforePageUnloadEvent) => void;
20
+ export declare function onBeforeAppRoute(callback: AppRouteCallback): void;
21
+ export declare function offBeforeAppRoute(callback?: AppRouteCallback): void;
22
+ export declare function onAppRoute(callback: AppRouteCallback): void;
23
+ export declare function offAppRoute(callback?: AppRouteCallback): void;
24
+ export declare function onAppRouteDone(callback: AppRouteCallback): void;
25
+ export declare function offAppRouteDone(callback?: AppRouteCallback): void;
26
+ export declare function onBeforePageUnload(callback: BeforePageUnloadCallback): void;
27
+ export declare function offBeforePageUnload(callback?: BeforePageUnloadCallback): void;
28
+ //#endregion
29
+ //# sourceMappingURL=events.d.mts.map
@@ -0,0 +1,123 @@
1
+ import { WEVU_HOST_COMMIT_PROMISE_KEY } from "@weapp-core/constants";
2
+
3
+ //#region src/runtime/polyfill/routeRuntime/events.ts
4
+ const beforeCallbacks = /* @__PURE__ */ new Set();
5
+ const routeCallbacks = /* @__PURE__ */ new Set();
6
+ const doneCallbacks = /* @__PURE__ */ new Set();
7
+ const unloadCallbacks = /* @__PURE__ */ new Set();
8
+ const webviewIds = /* @__PURE__ */ new WeakMap();
9
+ let nextWebviewId = 0;
10
+ let nextRouteEventId = 0;
11
+ function onBeforeAppRoute(callback) {
12
+ beforeCallbacks.add(callback);
13
+ }
14
+ function offBeforeAppRoute(callback) {
15
+ if (callback) beforeCallbacks.delete(callback);
16
+ else beforeCallbacks.clear();
17
+ }
18
+ function onAppRoute(callback) {
19
+ routeCallbacks.add(callback);
20
+ }
21
+ function offAppRoute(callback) {
22
+ if (callback) routeCallbacks.delete(callback);
23
+ else routeCallbacks.clear();
24
+ }
25
+ function onAppRouteDone(callback) {
26
+ doneCallbacks.add(callback);
27
+ }
28
+ function offAppRouteDone(callback) {
29
+ if (callback) doneCallbacks.delete(callback);
30
+ else doneCallbacks.clear();
31
+ }
32
+ function onBeforePageUnload(callback) {
33
+ unloadCallbacks.add(callback);
34
+ }
35
+ function offBeforePageUnload(callback) {
36
+ if (callback) unloadCallbacks.delete(callback);
37
+ else unloadCallbacks.clear();
38
+ }
39
+ function emit(callbacks, event) {
40
+ if (!callbacks.size) return;
41
+ for (const callback of [...callbacks]) try {
42
+ callback(event);
43
+ } catch (error) {
44
+ console.error(error);
45
+ }
46
+ }
47
+ function getEntryWebviewId(entry) {
48
+ let id = webviewIds.get(entry);
49
+ if (id === void 0) {
50
+ id = ++nextWebviewId;
51
+ webviewIds.set(entry, id);
52
+ }
53
+ return id;
54
+ }
55
+ function beginAppRoute(entry, openType) {
56
+ const event = {
57
+ routeEventId: `web-route-${++nextRouteEventId}`,
58
+ path: entry.id,
59
+ query: { ...entry.query },
60
+ openType,
61
+ webviewId: getEntryWebviewId(entry),
62
+ renderer: "webview"
63
+ };
64
+ entry.routeEventId = event.routeEventId;
65
+ emit(beforeCallbacks, event);
66
+ return event;
67
+ }
68
+ function emitBeforePageUnload(entry, event) {
69
+ if (entry.instance) emit(unloadCallbacks, {
70
+ ...event,
71
+ path: entry.id,
72
+ query: { ...entry.query },
73
+ webviewId: getEntryWebviewId(entry),
74
+ page: entry.instance
75
+ });
76
+ }
77
+ function cancelEntryRoute(entry) {
78
+ entry.routeEventId = void 0;
79
+ entry.onRouteMounted = void 0;
80
+ entry.onRouteReady = void 0;
81
+ }
82
+ /** 路由成功与页面提交分别由栈操作和真实生命周期确认,不依赖 API Promise 或定时器。 */
83
+ function finishAppRoute(entry, event) {
84
+ const isCurrent = () => entry.active && !entry.destroyed && entry.routeEventId === event.routeEventId;
85
+ const finishReady = async () => {
86
+ if (!isCurrent() || !entry.instance || !entry.ready) return;
87
+ entry.onRouteReady = void 0;
88
+ const page = entry.instance;
89
+ try {
90
+ let commit;
91
+ do {
92
+ commit = page[WEVU_HOST_COMMIT_PROMISE_KEY];
93
+ await commit;
94
+ if (!isCurrent() || entry.instance !== page) return;
95
+ } while (page[WEVU_HOST_COMMIT_PROMISE_KEY] !== commit);
96
+ emit(doneCallbacks, {
97
+ ...event,
98
+ page
99
+ });
100
+ } catch (error) {
101
+ console.error(error);
102
+ }
103
+ };
104
+ const finishMounted = () => {
105
+ if (!isCurrent() || !entry.instance) return;
106
+ entry.onRouteMounted = void 0;
107
+ emit(routeCallbacks, {
108
+ ...event,
109
+ page: entry.instance
110
+ });
111
+ if (!isCurrent()) return;
112
+ entry.onRouteReady = () => {
113
+ finishReady();
114
+ };
115
+ finishReady();
116
+ };
117
+ entry.onRouteMounted = finishMounted;
118
+ if (entry.instance) finishMounted();
119
+ }
120
+
121
+ //#endregion
122
+ export { beginAppRoute, cancelEntryRoute, emitBeforePageUnload, finishAppRoute, getEntryWebviewId, offAppRoute, offAppRouteDone, offBeforeAppRoute, offBeforePageUnload, onAppRoute, onAppRouteDone, onBeforeAppRoute, onBeforePageUnload };
123
+ //# sourceMappingURL=events.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.mjs","names":[],"sources":["../../../../src/runtime/polyfill/routeRuntime/events.ts"],"sourcesContent":["import type { ComponentPublicInstance } from '../../component'\nimport type { PageStackEntry } from './options'\nimport { WEVU_HOST_COMMIT_PROMISE_KEY } from '@weapp-core/constants'\n\nexport type AppRouteOpenType = 'appLaunch' | 'navigateTo' | 'redirectTo' | 'navigateBack' | 'switchTab' | 'reLaunch'\n\nexport interface AppRouteEvent {\n routeEventId: string\n path: string\n query: Record<string, string>\n openType: AppRouteOpenType\n webviewId: number\n renderer: 'webview'\n page?: ComponentPublicInstance\n}\n\nexport interface BeforePageUnloadEvent extends AppRouteEvent {\n page: ComponentPublicInstance\n}\n\nexport type AppRouteCallback = (event: AppRouteEvent) => void\nexport type BeforePageUnloadCallback = (event: BeforePageUnloadEvent) => void\n\nconst beforeCallbacks = new Set<AppRouteCallback>()\nconst routeCallbacks = new Set<AppRouteCallback>()\nconst doneCallbacks = new Set<AppRouteCallback>()\nconst unloadCallbacks = new Set<BeforePageUnloadCallback>()\nconst webviewIds = new WeakMap<PageStackEntry, number>()\nlet nextWebviewId = 0\nlet nextRouteEventId = 0\n\nexport function onBeforeAppRoute(callback: AppRouteCallback) {\n beforeCallbacks.add(callback)\n}\n\nexport function offBeforeAppRoute(callback?: AppRouteCallback) {\n if (callback) {\n beforeCallbacks.delete(callback)\n }\n else {\n beforeCallbacks.clear()\n }\n}\n\nexport function onAppRoute(callback: AppRouteCallback) {\n routeCallbacks.add(callback)\n}\n\nexport function offAppRoute(callback?: AppRouteCallback) {\n if (callback) {\n routeCallbacks.delete(callback)\n }\n else {\n routeCallbacks.clear()\n }\n}\n\nexport function onAppRouteDone(callback: AppRouteCallback) {\n doneCallbacks.add(callback)\n}\n\nexport function offAppRouteDone(callback?: AppRouteCallback) {\n if (callback) {\n doneCallbacks.delete(callback)\n }\n else {\n doneCallbacks.clear()\n }\n}\n\nexport function onBeforePageUnload(callback: BeforePageUnloadCallback) {\n unloadCallbacks.add(callback)\n}\n\nexport function offBeforePageUnload(callback?: BeforePageUnloadCallback) {\n if (callback) {\n unloadCallbacks.delete(callback)\n }\n else {\n unloadCallbacks.clear()\n }\n}\n\nfunction emit<T>(callbacks: Set<(event: T) => void>, event: T) {\n if (!callbacks.size) {\n return\n }\n for (const callback of [...callbacks]) {\n try {\n callback(event)\n }\n catch (error) {\n // eslint-disable-next-line no-console -- 观察者异常仍需可见,但不能中断宿主路由。\n console.error(error)\n }\n }\n}\n\nexport function getEntryWebviewId(entry: PageStackEntry) {\n let id = webviewIds.get(entry)\n if (id === undefined) {\n id = ++nextWebviewId\n webviewIds.set(entry, id)\n }\n return id\n}\n\nexport function beginAppRoute(entry: PageStackEntry, openType: AppRouteOpenType): AppRouteEvent {\n const event: AppRouteEvent = {\n routeEventId: `web-route-${++nextRouteEventId}`,\n path: entry.id,\n query: { ...entry.query },\n openType,\n webviewId: getEntryWebviewId(entry),\n renderer: 'webview',\n }\n entry.routeEventId = event.routeEventId\n emit(beforeCallbacks, event)\n return event\n}\n\nexport function emitBeforePageUnload(entry: PageStackEntry, event: AppRouteEvent) {\n if (entry.instance) {\n emit(unloadCallbacks, {\n ...event,\n path: entry.id,\n query: { ...entry.query },\n webviewId: getEntryWebviewId(entry),\n page: entry.instance,\n })\n }\n}\n\nexport function cancelEntryRoute(entry: PageStackEntry) {\n entry.routeEventId = undefined\n entry.onRouteMounted = undefined\n entry.onRouteReady = undefined\n}\n\n/** 路由成功与页面提交分别由栈操作和真实生命周期确认,不依赖 API Promise 或定时器。 */\nexport function finishAppRoute(entry: PageStackEntry, event: AppRouteEvent) {\n const isCurrent = () => entry.active && !entry.destroyed && entry.routeEventId === event.routeEventId\n const finishReady = async () => {\n if (!isCurrent() || !entry.instance || !entry.ready) {\n return\n }\n entry.onRouteReady = undefined\n const page = entry.instance as ComponentPublicInstance & {\n [WEVU_HOST_COMMIT_PROMISE_KEY]?: Promise<unknown>\n }\n try {\n // onReady/setData 可在首个 Lit 更新期间再请求提交,必须等到当前提交链稳定。\n let commit: unknown\n do {\n commit = page[WEVU_HOST_COMMIT_PROMISE_KEY]\n await commit\n if (!isCurrent() || entry.instance !== page) {\n return\n }\n } while (page[WEVU_HOST_COMMIT_PROMISE_KEY] !== commit)\n emit(doneCallbacks, { ...event, page })\n }\n catch (error) {\n // eslint-disable-next-line no-console -- 渲染失败必须报告,且不能伪造 done。\n console.error(error)\n }\n }\n const finishMounted = () => {\n if (!isCurrent() || !entry.instance) {\n return\n }\n entry.onRouteMounted = undefined\n emit(routeCallbacks, { ...event, page: entry.instance })\n if (!isCurrent()) {\n return\n }\n entry.onRouteReady = () => {\n void finishReady()\n }\n void finishReady()\n }\n entry.onRouteMounted = finishMounted\n if (entry.instance) {\n finishMounted()\n }\n}\n"],"mappings":"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"}
@@ -16,7 +16,9 @@ export interface WebRouteTarget {
16
16
  }
17
17
  export interface WebRouteHistoryState {
18
18
  __weappWebRuntime?: {
19
- stack: WebRouteTarget[];
19
+ stack: Array<WebRouteTarget & {
20
+ webviewId?: number;
21
+ }>;
20
22
  };
21
23
  }
22
24
  export declare function resolveWebRoutingConfig(config?: WebRoutingConfig): ResolvedWebRoutingConfig;
@@ -1,3 +1,5 @@
1
+ import { getEntryWebviewId } from "./events.mjs";
2
+
1
3
  //#region src/runtime/polyfill/routeRuntime/history.ts
2
4
  const DEFAULT_CONFIG = {
3
5
  mode: "memory",
@@ -90,7 +92,8 @@ function formatRouteUrl(target) {
90
92
  function toHistoryState(entries) {
91
93
  return { __weappWebRuntime: { stack: entries.map((entry) => ({
92
94
  id: entry.id,
93
- query: { ...entry.query }
95
+ query: { ...entry.query },
96
+ webviewId: getEntryWebviewId(entry)
94
97
  })) } };
95
98
  }
96
99
  function disposeWebRouting() {
@@ -1 +1 @@
1
- {"version":3,"file":"history.mjs","names":[],"sources":["../../../../src/runtime/polyfill/routeRuntime/history.ts"],"sourcesContent":["import type { PageStackEntry } from './options'\n\nexport type WebRoutingMode = 'memory' | 'history' | 'hash'\n\nexport interface WebRoutingConfig {\n mode?: WebRoutingMode\n /** 部署目录前缀,例如 /mini-program。 */\n base?: string\n}\n\nexport interface ResolvedWebRoutingConfig {\n mode: WebRoutingMode\n base: string\n}\n\nexport interface WebRouteTarget {\n id: string\n query: Record<string, string>\n}\n\nexport interface WebRouteHistoryState {\n __weappWebRuntime?: {\n stack: WebRouteTarget[]\n }\n}\n\nconst DEFAULT_CONFIG: ResolvedWebRoutingConfig = {\n mode: 'memory',\n base: '/',\n}\n\nlet resolvedConfig = { ...DEFAULT_CONFIG }\nlet knownPageIds = new Set<string>()\nlet popstateHandler: (() => void) | undefined\nlet hashchangeHandler: (() => void) | undefined\nlet scrollRestorationHistory: History | undefined\nlet previousScrollRestoration: ScrollRestoration | undefined\n\nfunction normalizeBase(base?: string) {\n if (!base?.trim()) {\n return '/'\n }\n const normalized = base.trim().replace(/\\\\/g, '/').replace(/^\\/*/, '/').replace(/\\/*$/, '')\n return normalized || '/'\n}\n\nexport function resolveWebRoutingConfig(config?: WebRoutingConfig): ResolvedWebRoutingConfig {\n return {\n mode: config?.mode === 'history' || config?.mode === 'hash' ? config.mode : 'memory',\n base: normalizeBase(config?.base),\n }\n}\n\nfunction isBrowserHistoryAvailable() {\n return typeof window !== 'undefined'\n && typeof window.history?.pushState === 'function'\n && typeof window.history?.replaceState === 'function'\n}\n\nfunction bindManualScrollRestoration() {\n if (typeof window === 'undefined' || !('scrollRestoration' in window.history)) {\n return\n }\n scrollRestorationHistory = window.history\n previousScrollRestoration = window.history.scrollRestoration\n window.history.scrollRestoration = 'manual'\n}\n\nfunction restoreBrowserScrollRestoration() {\n if (scrollRestorationHistory && previousScrollRestoration) {\n scrollRestorationHistory.scrollRestoration = previousScrollRestoration\n }\n scrollRestorationHistory = undefined\n previousScrollRestoration = undefined\n}\n\nfunction normalizePath(path: string) {\n const decoded = decodeURIComponent(path || '/')\n const withoutQuery = decoded.split('?')[0]!\n const withoutLeading = withoutQuery.replace(/^\\/+/, '').replace(/\\/+$/, '')\n return withoutLeading.replace(/\\.html$/, '')\n}\n\nfunction parseQuery(search: string) {\n const query: Record<string, string> = {}\n const params = new URLSearchParams(search.startsWith('?') ? search : `?${search}`)\n for (const [key, value] of params.entries()) {\n query[key] = value\n }\n return query\n}\n\nfunction toQueryString(query: Record<string, string>) {\n const params = new URLSearchParams()\n for (const [key, value] of Object.entries(query)) {\n params.set(key, value)\n }\n const search = params.toString()\n return search ? `?${search}` : ''\n}\n\nfunction resolvePageId(path: string) {\n const normalized = normalizePath(path)\n if (knownPageIds.has(normalized)) {\n return normalized\n }\n const indexId = `${normalized}/index`\n if (knownPageIds.has(indexId)) {\n return indexId\n }\n return undefined\n}\n\nfunction resolveTargetFromUrl(url: URL) {\n if (resolvedConfig.mode === 'hash') {\n const rawHash = url.hash.replace(/^#\\/?/, '')\n const [path, query = ''] = rawHash.split('?')\n const id = resolvePageId(path)\n return id ? { id, query: parseQuery(query) } : undefined\n }\n\n const base = resolvedConfig.base === '/' ? '' : resolvedConfig.base\n const matchesBase = !base || url.pathname === base || url.pathname.startsWith(`${base}/`)\n const path = matchesBase ? url.pathname.slice(base.length) : url.pathname\n const id = resolvePageId(path)\n return id ? { id, query: parseQuery(url.search) } : undefined\n}\n\nexport function readWebRouteTarget(pageIds: string[], url?: string): WebRouteTarget | undefined {\n knownPageIds = new Set(pageIds)\n if (resolvedConfig.mode === 'memory' || typeof URL === 'undefined') {\n return undefined\n }\n const runtimeUrl = url ?? (typeof window !== 'undefined' ? window.location.href : undefined)\n if (!runtimeUrl) {\n return undefined\n }\n try {\n return resolveTargetFromUrl(new URL(runtimeUrl, 'http://weapp-vite.local'))\n }\n catch {\n return undefined\n }\n}\n\nfunction formatRouteUrl(target: WebRouteTarget) {\n const query = toQueryString(target.query)\n const path = `${target.id}${query}`\n if (resolvedConfig.mode === 'hash') {\n const prefix = resolvedConfig.base === '/' ? '' : resolvedConfig.base\n return `${prefix}/#/${path}`\n }\n const prefix = resolvedConfig.base === '/' ? '' : resolvedConfig.base\n return `${prefix}/${path}`\n}\n\nfunction toHistoryState(entries: PageStackEntry[]): WebRouteHistoryState {\n return {\n __weappWebRuntime: {\n stack: entries.map(entry => ({\n id: entry.id,\n query: { ...entry.query },\n })),\n },\n }\n}\n\nfunction resolveCurrentUrl() {\n if (typeof window === 'undefined') {\n return undefined\n }\n return `${window.location.pathname}${window.location.search}${window.location.hash}`\n}\n\nexport function disposeWebRouting() {\n if (typeof window !== 'undefined') {\n if (popstateHandler) {\n window.removeEventListener('popstate', popstateHandler)\n }\n if (hashchangeHandler) {\n window.removeEventListener('hashchange', hashchangeHandler)\n }\n }\n popstateHandler = undefined\n hashchangeHandler = undefined\n restoreBrowserScrollRestoration()\n resolvedConfig = { ...DEFAULT_CONFIG }\n knownPageIds = new Set()\n}\n\nexport function configureWebRouting(\n config: WebRoutingConfig | undefined,\n pageIds: string[],\n onPopState: (target: WebRouteTarget | undefined, state: WebRouteHistoryState | undefined) => void,\n) {\n disposeWebRouting()\n resolvedConfig = resolveWebRoutingConfig(config)\n knownPageIds = new Set(pageIds)\n if (resolvedConfig.mode === 'memory' || typeof window === 'undefined') {\n return resolvedConfig\n }\n\n bindManualScrollRestoration()\n\n popstateHandler = () => {\n const state = window.history.state as WebRouteHistoryState | undefined\n onPopState(readWebRouteTarget(pageIds), state)\n }\n window.addEventListener('popstate', popstateHandler)\n if (resolvedConfig.mode === 'hash') {\n hashchangeHandler = () => {\n const state = window.history.state as WebRouteHistoryState | undefined\n onPopState(readWebRouteTarget(pageIds), state)\n }\n window.addEventListener('hashchange', hashchangeHandler)\n }\n return resolvedConfig\n}\n\nexport function syncWebRouting(entries: PageStackEntry[], operation: 'push' | 'replace') {\n if (resolvedConfig.mode === 'memory' || !isBrowserHistoryAvailable() || !entries.length) {\n return\n }\n const target = entries[entries.length - 1]!\n const url = formatRouteUrl({ id: target.id, query: target.query })\n const state = toHistoryState(entries)\n if (operation === 'push') {\n window.history.pushState(state, '', url)\n }\n else {\n window.history.replaceState(state, '', url)\n }\n}\n\nexport function getWebHistoryStack(state: WebRouteHistoryState | undefined) {\n const stack = state?.__weappWebRuntime?.stack\n return Array.isArray(stack) ? stack : undefined\n}\n\nexport function getWebRoutingConfig() {\n return { ...resolvedConfig }\n}\n\nexport function getWebRoutingUrl() {\n return resolveCurrentUrl()\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"history.mjs","names":[],"sources":["../../../../src/runtime/polyfill/routeRuntime/history.ts"],"sourcesContent":["import type { PageStackEntry } from './options'\nimport { getEntryWebviewId } from './events'\n\nexport type WebRoutingMode = 'memory' | 'history' | 'hash'\n\nexport interface WebRoutingConfig {\n mode?: WebRoutingMode\n /** 部署目录前缀,例如 /mini-program。 */\n base?: string\n}\n\nexport interface ResolvedWebRoutingConfig {\n mode: WebRoutingMode\n base: string\n}\n\nexport interface WebRouteTarget {\n id: string\n query: Record<string, string>\n}\n\nexport interface WebRouteHistoryState {\n __weappWebRuntime?: {\n stack: Array<WebRouteTarget & { webviewId?: number }>\n }\n}\n\nconst DEFAULT_CONFIG: ResolvedWebRoutingConfig = {\n mode: 'memory',\n base: '/',\n}\n\nlet resolvedConfig = { ...DEFAULT_CONFIG }\nlet knownPageIds = new Set<string>()\nlet popstateHandler: (() => void) | undefined\nlet hashchangeHandler: (() => void) | undefined\nlet scrollRestorationHistory: History | undefined\nlet previousScrollRestoration: ScrollRestoration | undefined\n\nfunction normalizeBase(base?: string) {\n if (!base?.trim()) {\n return '/'\n }\n const normalized = base.trim().replace(/\\\\/g, '/').replace(/^\\/*/, '/').replace(/\\/*$/, '')\n return normalized || '/'\n}\n\nexport function resolveWebRoutingConfig(config?: WebRoutingConfig): ResolvedWebRoutingConfig {\n return {\n mode: config?.mode === 'history' || config?.mode === 'hash' ? config.mode : 'memory',\n base: normalizeBase(config?.base),\n }\n}\n\nfunction isBrowserHistoryAvailable() {\n return typeof window !== 'undefined'\n && typeof window.history?.pushState === 'function'\n && typeof window.history?.replaceState === 'function'\n}\n\nfunction bindManualScrollRestoration() {\n if (typeof window === 'undefined' || !('scrollRestoration' in window.history)) {\n return\n }\n scrollRestorationHistory = window.history\n previousScrollRestoration = window.history.scrollRestoration\n window.history.scrollRestoration = 'manual'\n}\n\nfunction restoreBrowserScrollRestoration() {\n if (scrollRestorationHistory && previousScrollRestoration) {\n scrollRestorationHistory.scrollRestoration = previousScrollRestoration\n }\n scrollRestorationHistory = undefined\n previousScrollRestoration = undefined\n}\n\nfunction normalizePath(path: string) {\n const decoded = decodeURIComponent(path || '/')\n const withoutQuery = decoded.split('?')[0]!\n const withoutLeading = withoutQuery.replace(/^\\/+/, '').replace(/\\/+$/, '')\n return withoutLeading.replace(/\\.html$/, '')\n}\n\nfunction parseQuery(search: string) {\n const query: Record<string, string> = {}\n const params = new URLSearchParams(search.startsWith('?') ? search : `?${search}`)\n for (const [key, value] of params.entries()) {\n query[key] = value\n }\n return query\n}\n\nfunction toQueryString(query: Record<string, string>) {\n const params = new URLSearchParams()\n for (const [key, value] of Object.entries(query)) {\n params.set(key, value)\n }\n const search = params.toString()\n return search ? `?${search}` : ''\n}\n\nfunction resolvePageId(path: string) {\n const normalized = normalizePath(path)\n if (knownPageIds.has(normalized)) {\n return normalized\n }\n const indexId = `${normalized}/index`\n if (knownPageIds.has(indexId)) {\n return indexId\n }\n return undefined\n}\n\nfunction resolveTargetFromUrl(url: URL) {\n if (resolvedConfig.mode === 'hash') {\n const rawHash = url.hash.replace(/^#\\/?/, '')\n const [path, query = ''] = rawHash.split('?')\n const id = resolvePageId(path)\n return id ? { id, query: parseQuery(query) } : undefined\n }\n\n const base = resolvedConfig.base === '/' ? '' : resolvedConfig.base\n const matchesBase = !base || url.pathname === base || url.pathname.startsWith(`${base}/`)\n const path = matchesBase ? url.pathname.slice(base.length) : url.pathname\n const id = resolvePageId(path)\n return id ? { id, query: parseQuery(url.search) } : undefined\n}\n\nexport function readWebRouteTarget(pageIds: string[], url?: string): WebRouteTarget | undefined {\n knownPageIds = new Set(pageIds)\n if (resolvedConfig.mode === 'memory' || typeof URL === 'undefined') {\n return undefined\n }\n const runtimeUrl = url ?? (typeof window !== 'undefined' ? window.location.href : undefined)\n if (!runtimeUrl) {\n return undefined\n }\n try {\n return resolveTargetFromUrl(new URL(runtimeUrl, 'http://weapp-vite.local'))\n }\n catch {\n return undefined\n }\n}\n\nfunction formatRouteUrl(target: WebRouteTarget) {\n const query = toQueryString(target.query)\n const path = `${target.id}${query}`\n if (resolvedConfig.mode === 'hash') {\n const prefix = resolvedConfig.base === '/' ? '' : resolvedConfig.base\n return `${prefix}/#/${path}`\n }\n const prefix = resolvedConfig.base === '/' ? '' : resolvedConfig.base\n return `${prefix}/${path}`\n}\n\nfunction toHistoryState(entries: PageStackEntry[]): WebRouteHistoryState {\n return {\n __weappWebRuntime: {\n stack: entries.map(entry => ({\n id: entry.id,\n query: { ...entry.query },\n webviewId: getEntryWebviewId(entry),\n })),\n },\n }\n}\n\nfunction resolveCurrentUrl() {\n if (typeof window === 'undefined') {\n return undefined\n }\n return `${window.location.pathname}${window.location.search}${window.location.hash}`\n}\n\nexport function disposeWebRouting() {\n if (typeof window !== 'undefined') {\n if (popstateHandler) {\n window.removeEventListener('popstate', popstateHandler)\n }\n if (hashchangeHandler) {\n window.removeEventListener('hashchange', hashchangeHandler)\n }\n }\n popstateHandler = undefined\n hashchangeHandler = undefined\n restoreBrowserScrollRestoration()\n resolvedConfig = { ...DEFAULT_CONFIG }\n knownPageIds = new Set()\n}\n\nexport function configureWebRouting(\n config: WebRoutingConfig | undefined,\n pageIds: string[],\n onPopState: (target: WebRouteTarget | undefined, state: WebRouteHistoryState | undefined) => void,\n) {\n disposeWebRouting()\n resolvedConfig = resolveWebRoutingConfig(config)\n knownPageIds = new Set(pageIds)\n if (resolvedConfig.mode === 'memory' || typeof window === 'undefined') {\n return resolvedConfig\n }\n\n bindManualScrollRestoration()\n\n popstateHandler = () => {\n const state = window.history.state as WebRouteHistoryState | undefined\n onPopState(readWebRouteTarget(pageIds), state)\n }\n window.addEventListener('popstate', popstateHandler)\n if (resolvedConfig.mode === 'hash') {\n hashchangeHandler = () => {\n const state = window.history.state as WebRouteHistoryState | undefined\n onPopState(readWebRouteTarget(pageIds), state)\n }\n window.addEventListener('hashchange', hashchangeHandler)\n }\n return resolvedConfig\n}\n\nexport function syncWebRouting(entries: PageStackEntry[], operation: 'push' | 'replace') {\n if (resolvedConfig.mode === 'memory' || !isBrowserHistoryAvailable() || !entries.length) {\n return\n }\n const target = entries[entries.length - 1]!\n const url = formatRouteUrl({ id: target.id, query: target.query })\n const state = toHistoryState(entries)\n if (operation === 'push') {\n window.history.pushState(state, '', url)\n }\n else {\n window.history.replaceState(state, '', url)\n }\n}\n\nexport function getWebHistoryStack(state: WebRouteHistoryState | undefined) {\n const stack = state?.__weappWebRuntime?.stack\n return Array.isArray(stack) ? stack : undefined\n}\n\nexport function getWebRoutingConfig() {\n return { ...resolvedConfig }\n}\n\nexport function getWebRoutingUrl() {\n return resolveCurrentUrl()\n}\n"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { getEntryWebviewId } from "./events.mjs";
1
2
  import { WEVU_PAGE_LAYOUT_NAME_KEY, WEVU_PAGE_LAYOUT_PROPS_KEY, WEVU_PAGE_LAYOUT_SETTER_KEY } from "@weapp-core/constants";
2
3
 
3
4
  //#region src/runtime/polyfill/routeRuntime/lifecycle.ts
@@ -39,6 +40,9 @@ function attachRouteMeta(element, meta) {
39
40
  carrier[ROUTE_META_SYMBOL] = meta;
40
41
  carrier.route = meta.id;
41
42
  carrier.options = meta.query;
43
+ carrier.webviewId = getEntryWebviewId(meta.entry);
44
+ carrier.__wxWebviewId__ = carrier.webviewId;
45
+ carrier.renderer = "webview";
42
46
  }
43
47
  function hidePageInstance(instance, record) {
44
48
  const state = getPageState(instance);
@@ -94,6 +98,11 @@ function augmentPageComponentOptions(component, record) {
94
98
  originalReady?.call(this);
95
99
  record.hooks.onReady?.call(this);
96
100
  if (getPageState(this).visible) dispatchPageLifetimeToComponents(this, "show");
101
+ const entry = getRouteMeta(this)?.entry;
102
+ if (entry) {
103
+ entry.ready = true;
104
+ entry.onRouteReady?.();
105
+ }
97
106
  },
98
107
  detached() {
99
108
  originalDetached?.call(this);
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.mjs","names":[],"sources":["../../../../src/runtime/polyfill/routeRuntime/lifecycle.ts"],"sourcesContent":["import type { ComponentOptions, ComponentPublicInstance } from '../../component'\nimport type { PageRecord, RouteMeta } from './options'\nimport { WEVU_PAGE_LAYOUT_NAME_KEY, WEVU_PAGE_LAYOUT_PROPS_KEY, WEVU_PAGE_LAYOUT_SETTER_KEY } from '@weapp-core/constants'\n\nconst ROUTE_META_SYMBOL = Symbol('@weapp-vite/web:route-meta')\nconst PAGE_STATE_SYMBOL = Symbol('@weapp-vite/web:page-state')\n\ninterface RouteMetaCarrier {\n [ROUTE_META_SYMBOL]?: RouteMeta\n route?: string\n options?: Record<string, string>\n}\n\ninterface PageInstanceState {\n loaded: boolean\n visible: boolean\n}\n\ninterface PageStateCarrier {\n [PAGE_STATE_SYMBOL]?: PageInstanceState\n}\n\ntype ComponentPageLifetimeType = 'show' | 'hide' | 'resize'\n\ninterface PageLifetimeAwareComponent extends HTMLElement {\n __weappInvokePageLifetime?: (type: ComponentPageLifetimeType) => void\n renderRoot?: ShadowRoot | HTMLElement\n}\n\nfunction getRouteMeta(instance: ComponentPublicInstance): RouteMeta | undefined {\n return (instance as RouteMetaCarrier)[ROUTE_META_SYMBOL]\n}\n\nfunction getPageState(instance: ComponentPublicInstance): PageInstanceState {\n const target = instance as PageStateCarrier\n target[PAGE_STATE_SYMBOL] ??= { loaded: false, visible: false }\n return target[PAGE_STATE_SYMBOL]!\n}\n\nfunction walkElementsDeep(root: ParentNode, collector: Set<HTMLElement>) {\n const nodes = Array.from((root as ParentNode & { childNodes?: ArrayLike<unknown> }).childNodes ?? [])\n for (const node of nodes) {\n if (!(node instanceof HTMLElement)) {\n continue\n }\n collector.add(node)\n walkElementsDeep(node, collector)\n if (node.shadowRoot) {\n walkElementsDeep(node.shadowRoot, collector)\n }\n }\n}\n\nexport function dispatchPageLifetimeToComponents(\n page: ComponentPublicInstance,\n type: ComponentPageLifetimeType,\n) {\n const host = page as ComponentPublicInstance & {\n renderRoot?: ShadowRoot | HTMLElement\n shadowRoot?: ShadowRoot | null\n }\n const root = host.renderRoot ?? host.shadowRoot ?? host\n if (!root || typeof root.querySelectorAll !== 'function') {\n return\n }\n const elements = new Set<HTMLElement>()\n walkElementsDeep(root, elements)\n for (const element of elements) {\n const component = element as PageLifetimeAwareComponent\n if (typeof component.__weappInvokePageLifetime === 'function') {\n component.__weappInvokePageLifetime(type)\n }\n }\n}\n\nexport function attachRouteMeta(\n element: HTMLElement & ComponentPublicInstance,\n meta: RouteMeta,\n) {\n const carrier = element as RouteMetaCarrier\n carrier[ROUTE_META_SYMBOL] = meta\n carrier.route = meta.id\n carrier.options = meta.query\n}\n\nexport function hidePageInstance(instance: ComponentPublicInstance, record: PageRecord) {\n const state = getPageState(instance)\n if (!state.visible) {\n return\n }\n dispatchPageLifetimeToComponents(instance, 'hide')\n record.hooks.onHide?.call(instance)\n state.visible = false\n}\n\nexport function showPageInstance(instance: ComponentPublicInstance, record: PageRecord) {\n const state = getPageState(instance)\n if (state.visible || !state.loaded) {\n return\n }\n record.hooks.onShow?.call(instance)\n dispatchPageLifetimeToComponents(instance, 'show')\n state.visible = true\n}\n\nexport function augmentPageComponentOptions(component: ComponentOptions, record: PageRecord) {\n const lifetimes = component.lifetimes ?? {}\n const originalCreated = lifetimes?.created\n const originalAttached = lifetimes?.attached\n const originalReady = lifetimes?.ready\n const originalDetached = lifetimes?.detached\n\n const enhanced: ComponentOptions = {\n ...component,\n lifetimes: {\n ...lifetimes,\n created(this: ComponentPublicInstance) {\n originalCreated?.call(this)\n const target = this as ComponentPublicInstance & Record<string, any>\n target[WEVU_PAGE_LAYOUT_SETTER_KEY] = (layout: string | false, props?: Record<string, any>) => {\n target.setData?.({\n [WEVU_PAGE_LAYOUT_NAME_KEY]: layout === false ? '__wv_no_layout' : layout,\n [WEVU_PAGE_LAYOUT_PROPS_KEY]: layout === false ? {} : (props ?? {}),\n })\n }\n getPageState(this)\n record.instances.add(this)\n },\n attached(this: ComponentPublicInstance) {\n originalAttached?.call(this)\n const meta = getRouteMeta(this)\n if (meta?.entry) {\n meta.entry.instance = this\n }\n const state = getPageState(this)\n if (!state.loaded) {\n record.hooks.onLoad?.call(this, meta?.query ?? {})\n state.loaded = true\n }\n if (meta?.entry.active !== false) {\n record.hooks.onShow?.call(this)\n state.visible = true\n }\n },\n ready(this: ComponentPublicInstance) {\n originalReady?.call(this)\n record.hooks.onReady?.call(this)\n if (getPageState(this).visible) {\n dispatchPageLifetimeToComponents(this, 'show')\n }\n },\n detached(this: ComponentPublicInstance) {\n originalDetached?.call(this)\n const meta = getRouteMeta(this)\n if (meta?.entry) {\n meta.entry.instance = undefined\n }\n const state = getPageState(this)\n hidePageInstance(this, record)\n if (state.loaded) {\n record.hooks.onUnload?.call(this)\n }\n state.loaded = false\n state.visible = false\n record.instances.delete(this)\n },\n },\n }\n\n return enhanced\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"lifecycle.mjs","names":[],"sources":["../../../../src/runtime/polyfill/routeRuntime/lifecycle.ts"],"sourcesContent":["import type { ComponentOptions, ComponentPublicInstance } from '../../component'\nimport type { PageRecord, RouteMeta } from './options'\nimport { WEVU_PAGE_LAYOUT_NAME_KEY, WEVU_PAGE_LAYOUT_PROPS_KEY, WEVU_PAGE_LAYOUT_SETTER_KEY } from '@weapp-core/constants'\nimport { getEntryWebviewId } from './events'\n\nconst ROUTE_META_SYMBOL = Symbol('@weapp-vite/web:route-meta')\nconst PAGE_STATE_SYMBOL = Symbol('@weapp-vite/web:page-state')\n\ninterface RouteMetaCarrier {\n [ROUTE_META_SYMBOL]?: RouteMeta\n route?: string\n options?: Record<string, string>\n webviewId?: number\n __wxWebviewId__?: number\n renderer?: 'webview'\n}\n\ninterface PageInstanceState {\n loaded: boolean\n visible: boolean\n}\n\ninterface PageStateCarrier {\n [PAGE_STATE_SYMBOL]?: PageInstanceState\n}\n\ntype ComponentPageLifetimeType = 'show' | 'hide' | 'resize'\n\ninterface PageLifetimeAwareComponent extends HTMLElement {\n __weappInvokePageLifetime?: (type: ComponentPageLifetimeType) => void\n renderRoot?: ShadowRoot | HTMLElement\n}\n\nfunction getRouteMeta(instance: ComponentPublicInstance): RouteMeta | undefined {\n return (instance as RouteMetaCarrier)[ROUTE_META_SYMBOL]\n}\n\nfunction getPageState(instance: ComponentPublicInstance): PageInstanceState {\n const target = instance as PageStateCarrier\n target[PAGE_STATE_SYMBOL] ??= { loaded: false, visible: false }\n return target[PAGE_STATE_SYMBOL]!\n}\n\nfunction walkElementsDeep(root: ParentNode, collector: Set<HTMLElement>) {\n const nodes = Array.from((root as ParentNode & { childNodes?: ArrayLike<unknown> }).childNodes ?? [])\n for (const node of nodes) {\n if (!(node instanceof HTMLElement)) {\n continue\n }\n collector.add(node)\n walkElementsDeep(node, collector)\n if (node.shadowRoot) {\n walkElementsDeep(node.shadowRoot, collector)\n }\n }\n}\n\nexport function dispatchPageLifetimeToComponents(\n page: ComponentPublicInstance,\n type: ComponentPageLifetimeType,\n) {\n const host = page as ComponentPublicInstance & {\n renderRoot?: ShadowRoot | HTMLElement\n shadowRoot?: ShadowRoot | null\n }\n const root = host.renderRoot ?? host.shadowRoot ?? host\n if (!root || typeof root.querySelectorAll !== 'function') {\n return\n }\n const elements = new Set<HTMLElement>()\n walkElementsDeep(root, elements)\n for (const element of elements) {\n const component = element as PageLifetimeAwareComponent\n if (typeof component.__weappInvokePageLifetime === 'function') {\n component.__weappInvokePageLifetime(type)\n }\n }\n}\n\nexport function attachRouteMeta(\n element: HTMLElement & ComponentPublicInstance,\n meta: RouteMeta,\n) {\n const carrier = element as RouteMetaCarrier\n carrier[ROUTE_META_SYMBOL] = meta\n carrier.route = meta.id\n carrier.options = meta.query\n carrier.webviewId = getEntryWebviewId(meta.entry)\n carrier.__wxWebviewId__ = carrier.webviewId\n carrier.renderer = 'webview'\n}\n\nexport function hidePageInstance(instance: ComponentPublicInstance, record: PageRecord) {\n const state = getPageState(instance)\n if (!state.visible) {\n return\n }\n dispatchPageLifetimeToComponents(instance, 'hide')\n record.hooks.onHide?.call(instance)\n state.visible = false\n}\n\nexport function showPageInstance(instance: ComponentPublicInstance, record: PageRecord) {\n const state = getPageState(instance)\n if (state.visible || !state.loaded) {\n return\n }\n record.hooks.onShow?.call(instance)\n dispatchPageLifetimeToComponents(instance, 'show')\n state.visible = true\n}\n\nexport function augmentPageComponentOptions(component: ComponentOptions, record: PageRecord) {\n const lifetimes = component.lifetimes ?? {}\n const originalCreated = lifetimes?.created\n const originalAttached = lifetimes?.attached\n const originalReady = lifetimes?.ready\n const originalDetached = lifetimes?.detached\n\n const enhanced: ComponentOptions = {\n ...component,\n lifetimes: {\n ...lifetimes,\n created(this: ComponentPublicInstance) {\n originalCreated?.call(this)\n const target = this as ComponentPublicInstance & Record<string, any>\n target[WEVU_PAGE_LAYOUT_SETTER_KEY] = (layout: string | false, props?: Record<string, any>) => {\n target.setData?.({\n [WEVU_PAGE_LAYOUT_NAME_KEY]: layout === false ? '__wv_no_layout' : layout,\n [WEVU_PAGE_LAYOUT_PROPS_KEY]: layout === false ? {} : (props ?? {}),\n })\n }\n getPageState(this)\n record.instances.add(this)\n },\n attached(this: ComponentPublicInstance) {\n originalAttached?.call(this)\n const meta = getRouteMeta(this)\n if (meta?.entry) {\n meta.entry.instance = this\n }\n const state = getPageState(this)\n if (!state.loaded) {\n record.hooks.onLoad?.call(this, meta?.query ?? {})\n state.loaded = true\n }\n if (meta?.entry.active !== false) {\n record.hooks.onShow?.call(this)\n state.visible = true\n }\n },\n ready(this: ComponentPublicInstance) {\n originalReady?.call(this)\n record.hooks.onReady?.call(this)\n if (getPageState(this).visible) {\n dispatchPageLifetimeToComponents(this, 'show')\n }\n const entry = getRouteMeta(this)?.entry\n if (entry) {\n entry.ready = true\n entry.onRouteReady?.()\n }\n },\n detached(this: ComponentPublicInstance) {\n originalDetached?.call(this)\n const meta = getRouteMeta(this)\n if (meta?.entry) {\n meta.entry.instance = undefined\n }\n const state = getPageState(this)\n hidePageInstance(this, record)\n if (state.loaded) {\n record.hooks.onUnload?.call(this)\n }\n state.loaded = false\n state.visible = false\n record.instances.delete(this)\n },\n },\n }\n\n return enhanced\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"options.mjs","names":[],"sources":["../../../../src/runtime/polyfill/routeRuntime/options.ts"],"sourcesContent":["import type { NavigationBarConfig } from '../../../compiler/wxml'\nimport type { ComponentOptions, ComponentPublicInstance } from '../../component'\nimport type { TemplateRenderer } from '../../template'\nimport type { MiniProgramAsyncOptions, MiniProgramBaseResult } from '../types'\n\nexport interface RegisterMeta {\n id: string\n template?: TemplateRenderer\n style?: string\n navigationBar?: NavigationBarConfig\n}\n\nexport interface PageHooks {\n onLoad?: (this: ComponentPublicInstance, query: Record<string, string>) => void\n onReady?: (this: ComponentPublicInstance) => void\n onShow?: (this: ComponentPublicInstance) => void\n onHide?: (this: ComponentPublicInstance) => void\n onUnload?: (this: ComponentPublicInstance) => void\n}\n\nexport interface PageRecord {\n tag: string\n hooks: PageHooks\n instances: Set<ComponentPublicInstance>\n navigationBar?: NavigationBarConfig\n}\n\nexport interface ComponentRecord {\n tag: string\n}\n\nexport interface PageStackEntry {\n id: string\n query: Record<string, string>\n active: boolean\n element?: HTMLElement & ComponentPublicInstance\n instance?: ComponentPublicInstance\n scrollTop?: number\n}\n\nexport interface RouteMeta {\n id: string\n query: Record<string, string>\n entry: PageStackEntry\n}\n\ninterface AppLifecycleHooks {\n onLaunch?: (this: AppRuntime, options: AppLaunchOptions) => void\n onShow?: (this: AppRuntime, options: AppLaunchOptions) => void\n onHide?: (this: AppRuntime, options: AppHideOptions) => void\n}\n\nexport type AppRuntime = Record<string, unknown> & Partial<AppLifecycleHooks> & {\n globalData?: Record<string, unknown>\n}\n\nexport interface AppLaunchOptions {\n path: string\n scene: number\n query: Record<string, string>\n referrerInfo: Record<string, unknown>\n}\n\nexport interface AppHideOptions {\n reason: 0 | 1 | 2 | 3\n}\n\nexport type AppHideCallback = (options: AppHideOptions) => void\nexport type AppShowCallback = (options: AppLaunchOptions) => void\n\nexport interface RouteOptions extends MiniProgramAsyncOptions<MiniProgramBaseResult> {\n url: string\n}\n\nexport interface NavigateBackOptions extends MiniProgramAsyncOptions<MiniProgramBaseResult> {\n delta?: number\n}\n\ntype MethodHandler = (this: ComponentPublicInstance, ...args: unknown[]) => unknown\n\nexport type PageRawOptions = ComponentOptions & PageHooks & Record<string, unknown>\nexport type ComponentRawOptions = ComponentOptions & Record<string, unknown>\n\nconst PAGE_LIFECYCLE_KEYS = new Set(['onLoad', 'onReady', 'onShow', 'onHide', 'onUnload'])\nconst RESERVED_PAGE_METHOD_KEYS = new Set([\n 'data',\n 'methods',\n 'lifetimes',\n 'properties',\n 'behaviors',\n 'options',\n 'observers',\n 'mixins',\n ...PAGE_LIFECYCLE_KEYS,\n])\nconst RESERVED_COMPONENT_METHOD_KEYS = new Set([\n 'data',\n 'methods',\n 'lifetimes',\n 'pageLifetimes',\n 'properties',\n 'behaviors',\n 'options',\n 'observers',\n 'mixins',\n])\n\nfunction cloneLifetimes(source: NonNullable<ComponentOptions['lifetimes']>): ComponentOptions['lifetimes'] {\n return {\n ...source,\n }\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\nfunction isMethodHandler(value: unknown): value is MethodHandler {\n return typeof value === 'function'\n}\n\nfunction normalizeMethodBag(\n source: Record<string, unknown> | undefined,\n reserved: Set<string>,\n) {\n const methods: Record<string, MethodHandler> = {}\n const sourceMethods = isRecord(source?.methods) ? source?.methods : undefined\n\n if (sourceMethods) {\n for (const [key, value] of Object.entries(sourceMethods)) {\n if (isMethodHandler(value)) {\n methods[key] = value\n }\n }\n }\n\n if (source) {\n for (const [key, value] of Object.entries(source)) {\n if (reserved.has(key)) {\n continue\n }\n if (isMethodHandler(value) && methods[key] === undefined) {\n methods[key] = value\n }\n }\n }\n return methods\n}\n\nexport function normalizePageOptions(raw: PageRawOptions | undefined): { component: ComponentOptions, hooks: PageHooks } {\n const component = { ...(raw ?? {}) } as ComponentOptions\n component.methods = normalizeMethodBag(raw as Record<string, unknown> | undefined, RESERVED_PAGE_METHOD_KEYS) as ComponentOptions['methods']\n if (raw?.lifetimes) {\n component.lifetimes = cloneLifetimes(raw.lifetimes)\n }\n const hooks: PageHooks = {}\n if (typeof raw?.onLoad === 'function') {\n hooks.onLoad = raw.onLoad as PageHooks['onLoad']\n }\n if (typeof raw?.onReady === 'function') {\n hooks.onReady = raw.onReady as PageHooks['onReady']\n }\n if (typeof raw?.onShow === 'function') {\n hooks.onShow = raw.onShow as PageHooks['onShow']\n }\n if (typeof raw?.onHide === 'function') {\n hooks.onHide = raw.onHide as PageHooks['onHide']\n }\n if (typeof raw?.onUnload === 'function') {\n hooks.onUnload = raw.onUnload as PageHooks['onUnload']\n }\n return { component, hooks }\n}\n\nexport function normalizeComponentOptions(raw: ComponentRawOptions | undefined): ComponentOptions {\n const component = { ...(raw ?? {}) } as ComponentOptions\n component.methods = normalizeMethodBag(raw as Record<string, unknown> | undefined, RESERVED_COMPONENT_METHOD_KEYS) as ComponentOptions['methods']\n if (raw?.lifetimes) {\n component.lifetimes = cloneLifetimes(raw.lifetimes)\n }\n return component\n}\n"],"mappings":";AAoFA,MAAM,4CAA4B,IAAI,IAAI;CACxC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,mBAAG,IAV2B,IAAI;EAAC;EAAU;EAAW;EAAU;EAAU;CAAU,CAUjE;AACvB,CAAC;AACD,MAAM,iDAAiC,IAAI,IAAI;CAC7C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAS,eAAe,QAAmF;CACzG,OAAO,EACL,GAAG,OACL;AACF;AAEA,SAAgB,SAAS,OAAkD;CACzE,OAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,gBAAgB,OAAwC;CAC/D,OAAO,OAAO,UAAU;AAC1B;AAEA,SAAS,mBACP,QACA,UACA;CACA,MAAM,UAAyC,CAAC;CAChD,MAAM,gBAAgB,SAAS,QAAQ,OAAO,IAAI,QAAQ,UAAU;CAEpE,IAAI,eACF;OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,aAAa,GACrD,IAAI,gBAAgB,KAAK,GACvB,QAAQ,OAAO;CAEnB;CAGF,IAAI,QACF,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAAG;EACjD,IAAI,SAAS,IAAI,GAAG,GAClB;EAEF,IAAI,gBAAgB,KAAK,KAAK,QAAQ,SAAS,QAC7C,QAAQ,OAAO;CAEnB;CAEF,OAAO;AACT;AAEA,SAAgB,qBAAqB,KAAoF;CACvH,MAAM,YAAY,EAAE,GAAI,OAAO,CAAC,EAAG;CACnC,UAAU,UAAU,mBAAmB,KAA4C,yBAAyB;CAC5G,IAAI,KAAK,WACP,UAAU,YAAY,eAAe,IAAI,SAAS;CAEpD,MAAM,QAAmB,CAAC;CAC1B,IAAI,OAAO,KAAK,WAAW,YACzB,MAAM,SAAS,IAAI;CAErB,IAAI,OAAO,KAAK,YAAY,YAC1B,MAAM,UAAU,IAAI;CAEtB,IAAI,OAAO,KAAK,WAAW,YACzB,MAAM,SAAS,IAAI;CAErB,IAAI,OAAO,KAAK,WAAW,YACzB,MAAM,SAAS,IAAI;CAErB,IAAI,OAAO,KAAK,aAAa,YAC3B,MAAM,WAAW,IAAI;CAEvB,OAAO;EAAE;EAAW;CAAM;AAC5B;AAEA,SAAgB,0BAA0B,KAAwD;CAChG,MAAM,YAAY,EAAE,GAAI,OAAO,CAAC,EAAG;CACnC,UAAU,UAAU,mBAAmB,KAA4C,8BAA8B;CACjH,IAAI,KAAK,WACP,UAAU,YAAY,eAAe,IAAI,SAAS;CAEpD,OAAO;AACT"}
1
+ {"version":3,"file":"options.mjs","names":[],"sources":["../../../../src/runtime/polyfill/routeRuntime/options.ts"],"sourcesContent":["import type { NavigationBarConfig } from '../../../compiler/wxml'\nimport type { ComponentOptions, ComponentPublicInstance } from '../../component'\nimport type { TemplateRenderer } from '../../template'\nimport type { MiniProgramAsyncOptions, MiniProgramBaseResult } from '../types'\n\nexport interface RegisterMeta {\n id: string\n template?: TemplateRenderer\n style?: string\n navigationBar?: NavigationBarConfig\n}\n\nexport interface PageHooks {\n onLoad?: (this: ComponentPublicInstance, query: Record<string, string>) => void\n onReady?: (this: ComponentPublicInstance) => void\n onShow?: (this: ComponentPublicInstance) => void\n onHide?: (this: ComponentPublicInstance) => void\n onUnload?: (this: ComponentPublicInstance) => void\n}\n\nexport interface PageRecord {\n tag: string\n hooks: PageHooks\n instances: Set<ComponentPublicInstance>\n navigationBar?: NavigationBarConfig\n}\n\nexport interface ComponentRecord {\n tag: string\n}\n\nexport interface PageStackEntry {\n id: string\n query: Record<string, string>\n active: boolean\n element?: HTMLElement & ComponentPublicInstance\n instance?: ComponentPublicInstance\n scrollTop?: number\n destroyed?: boolean\n ready?: boolean\n routeEventId?: string\n onRouteMounted?: () => void\n onRouteReady?: () => void\n}\n\nexport interface RouteMeta {\n id: string\n query: Record<string, string>\n entry: PageStackEntry\n}\n\ninterface AppLifecycleHooks {\n onLaunch?: (this: AppRuntime, options: AppLaunchOptions) => void\n onShow?: (this: AppRuntime, options: AppLaunchOptions) => void\n onHide?: (this: AppRuntime, options: AppHideOptions) => void\n}\n\nexport type AppRuntime = Record<string, unknown> & Partial<AppLifecycleHooks> & {\n globalData?: Record<string, unknown>\n}\n\nexport interface AppLaunchOptions {\n path: string\n scene: number\n query: Record<string, string>\n referrerInfo: Record<string, unknown>\n}\n\nexport interface AppHideOptions {\n reason: 0 | 1 | 2 | 3\n}\n\nexport type AppHideCallback = (options: AppHideOptions) => void\nexport type AppShowCallback = (options: AppLaunchOptions) => void\n\nexport interface RouteOptions extends MiniProgramAsyncOptions<MiniProgramBaseResult> {\n url: string\n}\n\nexport interface NavigateBackOptions extends MiniProgramAsyncOptions<MiniProgramBaseResult> {\n delta?: number\n}\n\ntype MethodHandler = (this: ComponentPublicInstance, ...args: unknown[]) => unknown\n\nexport type PageRawOptions = ComponentOptions & PageHooks & Record<string, unknown>\nexport type ComponentRawOptions = ComponentOptions & Record<string, unknown>\n\nconst PAGE_LIFECYCLE_KEYS = new Set(['onLoad', 'onReady', 'onShow', 'onHide', 'onUnload'])\nconst RESERVED_PAGE_METHOD_KEYS = new Set([\n 'data',\n 'methods',\n 'lifetimes',\n 'properties',\n 'behaviors',\n 'options',\n 'observers',\n 'mixins',\n ...PAGE_LIFECYCLE_KEYS,\n])\nconst RESERVED_COMPONENT_METHOD_KEYS = new Set([\n 'data',\n 'methods',\n 'lifetimes',\n 'pageLifetimes',\n 'properties',\n 'behaviors',\n 'options',\n 'observers',\n 'mixins',\n])\n\nfunction cloneLifetimes(source: NonNullable<ComponentOptions['lifetimes']>): ComponentOptions['lifetimes'] {\n return {\n ...source,\n }\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\nfunction isMethodHandler(value: unknown): value is MethodHandler {\n return typeof value === 'function'\n}\n\nfunction normalizeMethodBag(\n source: Record<string, unknown> | undefined,\n reserved: Set<string>,\n) {\n const methods: Record<string, MethodHandler> = {}\n const sourceMethods = isRecord(source?.methods) ? source?.methods : undefined\n\n if (sourceMethods) {\n for (const [key, value] of Object.entries(sourceMethods)) {\n if (isMethodHandler(value)) {\n methods[key] = value\n }\n }\n }\n\n if (source) {\n for (const [key, value] of Object.entries(source)) {\n if (reserved.has(key)) {\n continue\n }\n if (isMethodHandler(value) && methods[key] === undefined) {\n methods[key] = value\n }\n }\n }\n return methods\n}\n\nexport function normalizePageOptions(raw: PageRawOptions | undefined): { component: ComponentOptions, hooks: PageHooks } {\n const component = { ...(raw ?? {}) } as ComponentOptions\n component.methods = normalizeMethodBag(raw as Record<string, unknown> | undefined, RESERVED_PAGE_METHOD_KEYS) as ComponentOptions['methods']\n if (raw?.lifetimes) {\n component.lifetimes = cloneLifetimes(raw.lifetimes)\n }\n const hooks: PageHooks = {}\n if (typeof raw?.onLoad === 'function') {\n hooks.onLoad = raw.onLoad as PageHooks['onLoad']\n }\n if (typeof raw?.onReady === 'function') {\n hooks.onReady = raw.onReady as PageHooks['onReady']\n }\n if (typeof raw?.onShow === 'function') {\n hooks.onShow = raw.onShow as PageHooks['onShow']\n }\n if (typeof raw?.onHide === 'function') {\n hooks.onHide = raw.onHide as PageHooks['onHide']\n }\n if (typeof raw?.onUnload === 'function') {\n hooks.onUnload = raw.onUnload as PageHooks['onUnload']\n }\n return { component, hooks }\n}\n\nexport function normalizeComponentOptions(raw: ComponentRawOptions | undefined): ComponentOptions {\n const component = { ...(raw ?? {}) } as ComponentOptions\n component.methods = normalizeMethodBag(raw as Record<string, unknown> | undefined, RESERVED_COMPONENT_METHOD_KEYS) as ComponentOptions['methods']\n if (raw?.lifetimes) {\n component.lifetimes = cloneLifetimes(raw.lifetimes)\n }\n return component\n}\n"],"mappings":";AAyFA,MAAM,4CAA4B,IAAI,IAAI;CACxC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,mBAAG,IAV2B,IAAI;EAAC;EAAU;EAAW;EAAU;EAAU;CAAU,CAUjE;AACvB,CAAC;AACD,MAAM,iDAAiC,IAAI,IAAI;CAC7C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAS,eAAe,QAAmF;CACzG,OAAO,EACL,GAAG,OACL;AACF;AAEA,SAAgB,SAAS,OAAkD;CACzE,OAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,gBAAgB,OAAwC;CAC/D,OAAO,OAAO,UAAU;AAC1B;AAEA,SAAS,mBACP,QACA,UACA;CACA,MAAM,UAAyC,CAAC;CAChD,MAAM,gBAAgB,SAAS,QAAQ,OAAO,IAAI,QAAQ,UAAU;CAEpE,IAAI,eACF;OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,aAAa,GACrD,IAAI,gBAAgB,KAAK,GACvB,QAAQ,OAAO;CAEnB;CAGF,IAAI,QACF,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAAG;EACjD,IAAI,SAAS,IAAI,GAAG,GAClB;EAEF,IAAI,gBAAgB,KAAK,KAAK,QAAQ,SAAS,QAC7C,QAAQ,OAAO;CAEnB;CAEF,OAAO;AACT;AAEA,SAAgB,qBAAqB,KAAoF;CACvH,MAAM,YAAY,EAAE,GAAI,OAAO,CAAC,EAAG;CACnC,UAAU,UAAU,mBAAmB,KAA4C,yBAAyB;CAC5G,IAAI,KAAK,WACP,UAAU,YAAY,eAAe,IAAI,SAAS;CAEpD,MAAM,QAAmB,CAAC;CAC1B,IAAI,OAAO,KAAK,WAAW,YACzB,MAAM,SAAS,IAAI;CAErB,IAAI,OAAO,KAAK,YAAY,YAC1B,MAAM,UAAU,IAAI;CAEtB,IAAI,OAAO,KAAK,WAAW,YACzB,MAAM,SAAS,IAAI;CAErB,IAAI,OAAO,KAAK,WAAW,YACzB,MAAM,SAAS,IAAI;CAErB,IAAI,OAAO,KAAK,aAAa,YAC3B,MAAM,WAAW,IAAI;CAEvB,OAAO;EAAE;EAAW;CAAM;AAC5B;AAEA,SAAgB,0BAA0B,KAAwD;CAChG,MAAM,YAAY,EAAE,GAAI,OAAO,CAAC,EAAG;CACnC,UAAU,UAAU,mBAAmB,KAA4C,8BAA8B;CACjH,IAAI,KAAK,WACP,UAAU,YAAY,eAAe,IAAI,SAAS;CAEpD,OAAO;AACT"}
@@ -4,6 +4,19 @@ import { getAppContainer } from "../../appShell/container.mjs";
4
4
  let activeEntry;
5
5
  let boundContainer;
6
6
  let scrollHandler;
7
+ const restorationClaims = /* @__PURE__ */ new WeakMap();
8
+ /** 仅认领新页面首次恢复;保留页面的容器位置仍由宿主维护,显式 pageScrollTo 不受影响。 */
9
+ function claimPageScrollRestoration(page) {
10
+ restorationClaims.set(page, (restorationClaims.get(page) ?? 0) + 1);
11
+ let released = false;
12
+ return () => {
13
+ if (released) return;
14
+ released = true;
15
+ const remaining = (restorationClaims.get(page) ?? 1) - 1;
16
+ if (remaining > 0) restorationClaims.set(page, remaining);
17
+ else restorationClaims.delete(page);
18
+ };
19
+ }
7
20
  function getPageContainer() {
8
21
  return getAppContainer();
9
22
  }
@@ -12,7 +25,8 @@ function captureEntryScrollPosition(entry) {
12
25
  const container = getPageContainer();
13
26
  if (container) entry.scrollTop = container.scrollTop;
14
27
  }
15
- function restoreEntryScrollPosition(entry) {
28
+ function restoreEntryScrollPosition(entry, retained = false) {
29
+ if (!retained && entry.instance && restorationClaims.has(entry.instance)) return;
16
30
  const container = getPageContainer();
17
31
  if (container) container.scrollTop = entry.scrollTop ?? 0;
18
32
  }
@@ -24,7 +38,10 @@ function setEntryScrollOwner(entry, active) {
24
38
  if (activeEntry === entry) activeEntry = void 0;
25
39
  }
26
40
  function recordActiveEntryScrollPosition() {
27
- if (activeEntry) captureEntryScrollPosition(activeEntry);
41
+ if (activeEntry?.active) {
42
+ captureEntryScrollPosition(activeEntry);
43
+ activeEntry.instance?.onPageScroll?.({ scrollTop: activeEntry.scrollTop ?? 0 });
44
+ }
28
45
  }
29
46
  function bindPageScrollOwner(container) {
30
47
  if (boundContainer === container) return;
@@ -35,5 +52,5 @@ function bindPageScrollOwner(container) {
35
52
  }
36
53
 
37
54
  //#endregion
38
- export { bindPageScrollOwner, captureEntryScrollPosition, getPageContainer, recordActiveEntryScrollPosition, restoreEntryScrollPosition, setEntryScrollOwner };
55
+ export { bindPageScrollOwner, captureEntryScrollPosition, claimPageScrollRestoration, getPageContainer, recordActiveEntryScrollPosition, restoreEntryScrollPosition, setEntryScrollOwner };
39
56
  //# sourceMappingURL=scroll.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"scroll.mjs","names":[],"sources":["../../../../src/runtime/polyfill/routeRuntime/scroll.ts"],"sourcesContent":["import type { PageStackEntry } from './options'\nimport { getAppContainer } from '../../appShell/container'\n\ntype ScrollContainer = HTMLElement & Pick<EventTarget, 'addEventListener' | 'removeEventListener'>\n\nlet activeEntry: PageStackEntry | undefined\nlet boundContainer: ScrollContainer | undefined\nlet scrollHandler: (() => void) | undefined\n\nexport function getPageContainer() {\n return getAppContainer()\n}\n\nexport function captureEntryScrollPosition(entry: PageStackEntry) {\n if (!entry.active) {\n return\n }\n const container = getPageContainer()\n if (container) {\n entry.scrollTop = container.scrollTop\n }\n}\n\nexport function restoreEntryScrollPosition(entry: PageStackEntry) {\n const container = getPageContainer()\n if (container) {\n container.scrollTop = entry.scrollTop ?? 0\n }\n}\n\nexport function setEntryScrollOwner(entry: PageStackEntry, active: boolean) {\n if (active) {\n activeEntry = entry\n return\n }\n if (activeEntry === entry) {\n activeEntry = undefined\n }\n}\n\nexport function recordActiveEntryScrollPosition() {\n if (activeEntry) {\n captureEntryScrollPosition(activeEntry)\n }\n}\n\nexport function bindPageScrollOwner(container: ScrollContainer) {\n if (boundContainer === container) {\n return\n }\n if (boundContainer && scrollHandler) {\n boundContainer.removeEventListener('scroll', scrollHandler)\n }\n boundContainer = container\n scrollHandler = recordActiveEntryScrollPosition\n container.addEventListener('scroll', scrollHandler, { passive: true })\n}\n\nexport function disposePageScrollOwner() {\n if (boundContainer && scrollHandler) {\n boundContainer.removeEventListener('scroll', scrollHandler)\n }\n activeEntry = undefined\n boundContainer = undefined\n scrollHandler = undefined\n}\n"],"mappings":";;;AAKA,IAAI;AACJ,IAAI;AACJ,IAAI;AAEJ,SAAgB,mBAAmB;CACjC,OAAO,gBAAgB;AACzB;AAEA,SAAgB,2BAA2B,OAAuB;CAChE,IAAI,CAAC,MAAM,QACT;CAEF,MAAM,YAAY,iBAAiB;CACnC,IAAI,WACF,MAAM,YAAY,UAAU;AAEhC;AAEA,SAAgB,2BAA2B,OAAuB;CAChE,MAAM,YAAY,iBAAiB;CACnC,IAAI,WACF,UAAU,YAAY,MAAM,aAAa;AAE7C;AAEA,SAAgB,oBAAoB,OAAuB,QAAiB;CAC1E,IAAI,QAAQ;EACV,cAAc;EACd;CACF;CACA,IAAI,gBAAgB,OAClB,cAAc;AAElB;AAEA,SAAgB,kCAAkC;CAChD,IAAI,aACF,2BAA2B,WAAW;AAE1C;AAEA,SAAgB,oBAAoB,WAA4B;CAC9D,IAAI,mBAAmB,WACrB;CAEF,IAAI,kBAAkB,eACpB,eAAe,oBAAoB,UAAU,aAAa;CAE5D,iBAAiB;CACjB,gBAAgB;CAChB,UAAU,iBAAiB,UAAU,eAAe,EAAE,SAAS,KAAK,CAAC;AACvE"}
1
+ {"version":3,"file":"scroll.mjs","names":[],"sources":["../../../../src/runtime/polyfill/routeRuntime/scroll.ts"],"sourcesContent":["import type { PageStackEntry } from './options'\nimport { getAppContainer } from '../../appShell/container'\n\ntype ScrollContainer = HTMLElement & Pick<EventTarget, 'addEventListener' | 'removeEventListener'>\n\nlet activeEntry: PageStackEntry | undefined\nlet boundContainer: ScrollContainer | undefined\nlet scrollHandler: (() => void) | undefined\n\nconst restorationClaims = new WeakMap<object, number>()\n\n/** 仅认领新页面首次恢复;保留页面的容器位置仍由宿主维护,显式 pageScrollTo 不受影响。 */\nexport function claimPageScrollRestoration(page: object): () => void {\n restorationClaims.set(page, (restorationClaims.get(page) ?? 0) + 1)\n let released = false\n return () => {\n if (released) {\n return\n }\n released = true\n const remaining = (restorationClaims.get(page) ?? 1) - 1\n if (remaining > 0) {\n restorationClaims.set(page, remaining)\n }\n else {\n restorationClaims.delete(page)\n }\n }\n}\n\nexport function getPageContainer() {\n return getAppContainer()\n}\n\nexport function captureEntryScrollPosition(entry: PageStackEntry) {\n if (!entry.active) {\n return\n }\n const container = getPageContainer()\n if (container) {\n entry.scrollTop = container.scrollTop\n }\n}\n\nexport function restoreEntryScrollPosition(entry: PageStackEntry, retained = false) {\n if (!retained && entry.instance && restorationClaims.has(entry.instance)) {\n return\n }\n const container = getPageContainer()\n if (container) {\n container.scrollTop = entry.scrollTop ?? 0\n }\n}\n\nexport function setEntryScrollOwner(entry: PageStackEntry, active: boolean) {\n if (active) {\n activeEntry = entry\n return\n }\n if (activeEntry === entry) {\n activeEntry = undefined\n }\n}\n\nexport function recordActiveEntryScrollPosition() {\n if (activeEntry?.active) {\n captureEntryScrollPosition(activeEntry)\n const page = activeEntry.instance as (PageStackEntry['instance'] & {\n onPageScroll?: (event: { scrollTop: number }) => void\n }) | undefined\n page?.onPageScroll?.({ scrollTop: activeEntry.scrollTop ?? 0 })\n }\n}\n\nexport function bindPageScrollOwner(container: ScrollContainer) {\n if (boundContainer === container) {\n return\n }\n if (boundContainer && scrollHandler) {\n boundContainer.removeEventListener('scroll', scrollHandler)\n }\n boundContainer = container\n scrollHandler = recordActiveEntryScrollPosition\n container.addEventListener('scroll', scrollHandler, { passive: true })\n}\n\nexport function disposePageScrollOwner() {\n if (boundContainer && scrollHandler) {\n boundContainer.removeEventListener('scroll', scrollHandler)\n }\n activeEntry = undefined\n boundContainer = undefined\n scrollHandler = undefined\n}\n"],"mappings":";;;AAKA,IAAI;AACJ,IAAI;AACJ,IAAI;AAEJ,MAAM,oCAAoB,IAAI,QAAwB;;AAGtD,SAAgB,2BAA2B,MAA0B;CACnE,kBAAkB,IAAI,OAAO,kBAAkB,IAAI,IAAI,KAAK,KAAK,CAAC;CAClE,IAAI,WAAW;CACf,aAAa;EACX,IAAI,UACF;EAEF,WAAW;EACX,MAAM,aAAa,kBAAkB,IAAI,IAAI,KAAK,KAAK;EACvD,IAAI,YAAY,GACd,kBAAkB,IAAI,MAAM,SAAS;OAGrC,kBAAkB,OAAO,IAAI;CAEjC;AACF;AAEA,SAAgB,mBAAmB;CACjC,OAAO,gBAAgB;AACzB;AAEA,SAAgB,2BAA2B,OAAuB;CAChE,IAAI,CAAC,MAAM,QACT;CAEF,MAAM,YAAY,iBAAiB;CACnC,IAAI,WACF,MAAM,YAAY,UAAU;AAEhC;AAEA,SAAgB,2BAA2B,OAAuB,WAAW,OAAO;CAClF,IAAI,CAAC,YAAY,MAAM,YAAY,kBAAkB,IAAI,MAAM,QAAQ,GACrE;CAEF,MAAM,YAAY,iBAAiB;CACnC,IAAI,WACF,UAAU,YAAY,MAAM,aAAa;AAE7C;AAEA,SAAgB,oBAAoB,OAAuB,QAAiB;CAC1E,IAAI,QAAQ;EACV,cAAc;EACd;CACF;CACA,IAAI,gBAAgB,OAClB,cAAc;AAElB;AAEA,SAAgB,kCAAkC;CAChD,IAAI,aAAa,QAAQ;EACvB,2BAA2B,WAAW;EAItC,AAHa,YAAY,UAGnB,eAAe,EAAE,WAAW,YAAY,aAAa,EAAE,CAAC;CAChE;AACF;AAEA,SAAgB,oBAAoB,WAA4B;CAC9D,IAAI,mBAAmB,WACrB;CAEF,IAAI,kBAAkB,eACpB,eAAe,oBAAoB,UAAU,aAAa;CAE5D,iBAAiB;CACjB,gBAAgB;CAChB,UAAU,iBAAiB,UAAU,eAAe,EAAE,SAAS,KAAK,CAAC;AACvE"}