wevu 7.0.0 → 7.0.1

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/dev/package.mjs +1 -1
  2. package/dist/dev/router/backNavigation.mjs +1 -1
  3. package/dist/dev/router/createRouter.mjs +55 -14
  4. package/dist/dev/router/createRouter.mjs.map +1 -1
  5. package/dist/dev/router/initialNavigation.mjs +131 -5
  6. package/dist/dev/router/initialNavigation.mjs.map +1 -1
  7. package/dist/dev/router/navigationApi.mjs +1 -1
  8. package/dist/dev/router/navigationResult.mjs +1 -1
  9. package/dist/dev/router/navigationTarget.mjs +2 -2
  10. package/dist/dev/router/navigationTargetHelpers.mjs +1 -1
  11. package/dist/dev/router/types.mjs.map +1 -1
  12. package/dist/dev/router/useRoute.mjs +13 -0
  13. package/dist/dev/router/useRoute.mjs.map +1 -1
  14. package/dist/dev/router.mjs +1 -1
  15. package/dist/dev/routerInternal/snapshots.mjs +3 -1
  16. package/dist/dev/routerInternal/snapshots.mjs.map +1 -1
  17. package/dist/dev/runtime/register/component/lifecycle.mjs +13 -55
  18. package/dist/dev/runtime/register/component/lifecycle.mjs.map +1 -1
  19. package/dist/dev/runtime/register/component/registerDefinition.mjs +19 -21
  20. package/dist/dev/runtime/register/component/registerDefinition.mjs.map +1 -1
  21. package/dist/package.mjs +1 -1
  22. package/dist/router/backNavigation.mjs +1 -1
  23. package/dist/router/createRouter.mjs +1 -1
  24. package/dist/router/initialNavigation.mjs +1 -1
  25. package/dist/router/navigationApi.mjs +1 -1
  26. package/dist/router/navigationResult.mjs +1 -1
  27. package/dist/router/navigationTarget.mjs +1 -1
  28. package/dist/router/navigationTargetHelpers.mjs +1 -1
  29. package/dist/router/types.d.mts +10 -1
  30. package/dist/router/useRoute.mjs +1 -1
  31. package/dist/router.d.mts +2 -2
  32. package/dist/router.mjs +1 -1
  33. package/dist/routerInternal/snapshots.mjs +1 -1
  34. package/dist/runtime/register/component/lifecycle.mjs +1 -1
  35. package/dist/runtime/register/component/registerDefinition.mjs +1 -1
  36. package/package.json +6 -6
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var version = "7.0.0";
2
+ var version = "7.0.1";
3
3
 
4
4
  //#endregion
5
5
  export { version };
@@ -1,7 +1,7 @@
1
1
  import { getCurrentMiniProgramPages } from "../runtime/platform.mjs";
2
+ import { resolvePageRoute } from "../routerInternal/location.mjs";
2
3
  import { NavigationFailureType } from "./types.mjs";
3
4
  import { createNavigationFailure, runNavigationGuards } from "./navigationCore.mjs";
4
- import { resolvePageRoute } from "../routerInternal/location.mjs";
5
5
  import { createNavigationRunResult } from "./navigationResult.mjs";
6
6
 
7
7
  //#region src/router/backNavigation.ts
@@ -1,7 +1,7 @@
1
1
  import { getMiniProgramGlobalObject } from "../runtime/platform.mjs";
2
2
  import { setActiveRouter } from "./instance.mjs";
3
- import { registerInitialNavigationRunner } from "./initialNavigation.mjs";
4
- import { installRouteStateSyncOnNativeRouter } from "./routeSync.mjs";
3
+ import { DEFAULT_INITIAL_NAVIGATION_TIMEOUT, registerInitialNavigationRunner } from "./initialNavigation.mjs";
4
+ import { installRouteStateSyncOnNativeRouter, notifyRouteStateSync } from "./routeSync.mjs";
5
5
  import { resolvePath } from "../routerInternal/path.mjs";
6
6
  import { parseQuery, stringifyQuery } from "../routerInternal/query.mjs";
7
7
  import { resolveCurrentRoute } from "../routerInternal/location.mjs";
@@ -11,7 +11,7 @@ import { warnDuplicateRouteEntries } from "../routerInternal/recordsWarnings.mjs
11
11
  import { createNamedRouteLookup, resolveRouteOptionEntries } from "../routerInternal/records.mjs";
12
12
  import { cloneRouteMeta, cloneRouteParams, createRouterOptionsSnapshot, normalizeRouteRecordMatched, snapshotRouteLocation } from "../routerInternal/snapshots.mjs";
13
13
  import { createNavigationResultController } from "./navigationResult.mjs";
14
- import { runBackNavigationGuards } from "./backNavigation.mjs";
14
+ import { resolveBackNavigationTarget, runBackNavigationGuards } from "./backNavigation.mjs";
15
15
  import { navigateWithTarget } from "./navigationTarget.mjs";
16
16
  import { createNavigationApi } from "./navigationApi.mjs";
17
17
  import { resolveRouteLocation } from "./resolve.mjs";
@@ -23,7 +23,7 @@ import { createRouteStateController, useNativeRouter } from "./useRoute.mjs";
23
23
  * @description 创建高阶路由导航器(对齐 Vue Router 的 createRouter 心智)
24
24
  */
25
25
  function createRouter(options = {}) {
26
- var _options$maxRedirects, _options$paramsMode, _options$rejectOnErro, _options$parseQuery, _options$stringifyQue, _options$tabBarEntrie;
26
+ var _options$maxRedirects, _options$initialNavig, _options$paramsMode, _options$rejectOnErro, _options$parseQuery, _options$stringifyQue, _options$tabBarEntrie;
27
27
  const nativeRouter = useNativeRouter();
28
28
  installRouteStateSyncOnNativeRouter(getMiniProgramGlobalObject());
29
29
  const beforeEachGuards = /* @__PURE__ */ new Set();
@@ -31,6 +31,8 @@ function createRouter(options = {}) {
31
31
  const afterEachHooks = /* @__PURE__ */ new Set();
32
32
  const errorHandlers = /* @__PURE__ */ new Set();
33
33
  const maxRedirects = (_options$maxRedirects = options.maxRedirects) !== null && _options$maxRedirects !== void 0 ? _options$maxRedirects : 10;
34
+ const initialNavigationMode = options.initialNavigationMode === "blocking" ? "blocking" : "eager";
35
+ const initialNavigationTimeout = Number.isFinite(options.initialNavigationTimeout) && ((_options$initialNavig = options.initialNavigationTimeout) !== null && _options$initialNavig !== void 0 ? _options$initialNavig : 0) > 0 ? Math.max(1, Math.trunc(options.initialNavigationTimeout)) : DEFAULT_INITIAL_NAVIGATION_TIMEOUT;
34
36
  const paramsMode = (_options$paramsMode = options.paramsMode) !== null && _options$paramsMode !== void 0 ? _options$paramsMode : "loose";
35
37
  const rejectOnError = (_options$rejectOnErro = options.rejectOnError) !== null && _options$rejectOnErro !== void 0 ? _options$rejectOnErro : true;
36
38
  const routeResolveCodec = {
@@ -45,7 +47,10 @@ function createRouter(options = {}) {
45
47
  const tabBarPathSet = new Set(normalizedTabBarEntries);
46
48
  const routeRegistry = createRouteRegistry(namedRouteLookup);
47
49
  let managedNavigationCount = 0;
48
- const routerOptions = createRouterOptionsSnapshot(normalizedTabBarEntries, routeRegistry.getRoutes(), paramsMode, maxRedirects, routeResolveCodec, rejectOnError);
50
+ let activeManagedRoutePath;
51
+ let pendingManagedRouteSyncPath;
52
+ let pendingExternalRouteSyncPath;
53
+ const routerOptions = createRouterOptionsSnapshot(normalizedTabBarEntries, routeRegistry.getRoutes(), paramsMode, maxRedirects, initialNavigationMode, initialNavigationTimeout, routeResolveCodec, rejectOnError);
49
54
  function enrichRouteRecordState(routeLocation) {
50
55
  const resolved = { ...routeLocation };
51
56
  resolved.href = resolved.fullPath;
@@ -73,7 +78,15 @@ function createRouter(options = {}) {
73
78
  return payload.source === "page" || payload.source === "native" && payload.method === "navigateBack";
74
79
  }
75
80
  function beforeRouteStateSync(nextRoute, payload) {
76
- if (managedNavigationCount > 0 || !isExternalBackSync(payload) || nextRoute.fullPath === route.fullPath) return;
81
+ if (managedNavigationCount > 0 || !isExternalBackSync(payload)) return;
82
+ if (pendingExternalRouteSyncPath !== void 0) return;
83
+ if (pendingManagedRouteSyncPath !== void 0) {
84
+ const expectedPath = pendingManagedRouteSyncPath;
85
+ pendingManagedRouteSyncPath = void 0;
86
+ if (nextRoute.fullPath === expectedPath) return;
87
+ }
88
+ if (nextRoute.fullPath === route.fullPath) return;
89
+ pendingExternalRouteSyncPath = nextRoute.fullPath;
77
90
  const from = snapshotRouteLocation(route);
78
91
  runBackNavigationGuards({
79
92
  target: nextRoute,
@@ -84,6 +97,8 @@ function createRouter(options = {}) {
84
97
  resolveWithCodec
85
98
  }).then((result) => {
86
99
  return emitObservedNavigationAfterEach === null || emitObservedNavigationAfterEach === void 0 ? void 0 : emitObservedNavigationAfterEach(result);
100
+ }).finally(() => {
101
+ pendingExternalRouteSyncPath = void 0;
87
102
  });
88
103
  }
89
104
  route = createRouteStateController({
@@ -112,19 +127,38 @@ function createRouter(options = {}) {
112
127
  resolveWithCodec,
113
128
  settleNavigationResult: navigationResultController.settleNavigationResult
114
129
  });
115
- async function runManagedNavigation(navigation) {
130
+ async function runManagedNavigation(navigation, targetPath) {
131
+ const previousRoutePath = route.fullPath;
132
+ if (targetPath) activeManagedRoutePath = targetPath;
116
133
  managedNavigationCount += 1;
117
134
  try {
118
- return await navigation();
135
+ const result = await navigation();
136
+ if (route.fullPath !== previousRoutePath) pendingManagedRouteSyncPath = route.fullPath;
137
+ return result;
119
138
  } finally {
120
139
  managedNavigationCount -= 1;
140
+ if (managedNavigationCount <= 0) activeManagedRoutePath = void 0;
141
+ }
142
+ }
143
+ function resolveManagedRoutePath(to) {
144
+ try {
145
+ return resolveWithCodec(to, route.path).fullPath;
146
+ } catch (_unused) {
147
+ return;
121
148
  }
122
149
  }
123
- async function runInitialNavigation(page, query) {
150
+ async function runInitialNavigation(page, query, isActive = () => true) {
124
151
  return runManagedNavigation(async () => {
125
152
  const from = snapshotRouteLocation(route);
126
153
  const target = enrichRouteRecordState(resolveCurrentRoute(query, page));
127
154
  if (!target.path) return;
155
+ if (activeManagedRoutePath === target.fullPath) {
156
+ notifyRouteStateSync({
157
+ route: target,
158
+ source: "router"
159
+ });
160
+ return;
161
+ }
128
162
  const result = await navigateWithTarget({
129
163
  mode: "push",
130
164
  target,
@@ -140,6 +174,7 @@ function createRouter(options = {}) {
140
174
  executeNative: false,
141
175
  allowSameLocation: true
142
176
  });
177
+ if (!isActive()) return;
143
178
  return navigationResultController.settleNavigationResult(result);
144
179
  });
145
180
  }
@@ -181,10 +216,16 @@ function createRouter(options = {}) {
181
216
  isReady() {
182
217
  return readyPromise;
183
218
  },
184
- push: (to) => runManagedNavigation(() => navigationApi.push(to)),
185
- replace: (to) => runManagedNavigation(() => navigationApi.replace(to)),
186
- back: (delta) => runManagedNavigation(() => navigationApi.back(delta)),
187
- go: (delta) => runManagedNavigation(() => navigationApi.go(delta)),
219
+ push: (to) => runManagedNavigation(() => navigationApi.push(to), resolveManagedRoutePath(to)),
220
+ replace: (to) => runManagedNavigation(() => navigationApi.replace(to), resolveManagedRoutePath(to)),
221
+ back: (delta) => {
222
+ var _resolveBackNavigatio;
223
+ return runManagedNavigation(() => navigationApi.back(delta), (_resolveBackNavigatio = resolveBackNavigationTarget(delta !== null && delta !== void 0 ? delta : 1, route, resolveWithCodec)) === null || _resolveBackNavigatio === void 0 ? void 0 : _resolveBackNavigatio.fullPath);
224
+ },
225
+ go: (delta) => {
226
+ var _resolveBackNavigatio2;
227
+ return runManagedNavigation(() => navigationApi.go(delta), delta < 0 ? (_resolveBackNavigatio2 = resolveBackNavigationTarget(Math.abs(delta), route, resolveWithCodec)) === null || _resolveBackNavigatio2 === void 0 ? void 0 : _resolveBackNavigatio2.fullPath : void 0);
228
+ },
188
229
  forward: () => runManagedNavigation(() => navigationApi.forward()),
189
230
  hasRoute: routeRegistry.hasRoute,
190
231
  getRoutes: routeRegistry.getRoutes,
@@ -197,7 +238,7 @@ function createRouter(options = {}) {
197
238
  onError
198
239
  };
199
240
  setActiveRouter(router);
200
- registerInitialNavigationRunner(router, runInitialNavigation);
241
+ registerInitialNavigationRunner(router, runInitialNavigation, initialNavigationTimeout, initialNavigationMode);
201
242
  return router;
202
243
  }
203
244
 
@@ -1 +1 @@
1
- {"version":3,"file":"createRouter.mjs","names":[],"sources":["../../../src/router/createRouter.ts"],"sourcesContent":["import type { RouteResolveCodec } from '../routerInternal/shared'\nimport type { NavigationRunResult } from './navigationResult'\nimport type { RouteStateSyncPayload } from './routeSync'\nimport type {\n LocationQueryRaw,\n NavigationAfterEach,\n NavigationErrorHandler,\n NavigationGuard,\n RouteLocationNormalizedLoaded,\n RouteLocationRaw,\n RouterNavigation,\n UseRouterOptions,\n} from './types'\nimport {\n cloneRouteMeta,\n cloneRouteParams,\n createNamedRouteLookup,\n createRouterOptionsSnapshot,\n mergeMatchedRouteMeta,\n normalizeRouteRecordMatched,\n parseQuery,\n resolveCurrentRoute,\n resolveMatchedRouteRecord,\n resolveNamedRouteLocation,\n resolvePath,\n resolveRouteOptionEntries,\n snapshotRouteLocation,\n stringifyQuery,\n warnDuplicateRouteEntries,\n} from '../routerInternal/shared'\nimport { getMiniProgramGlobalObject } from '../runtime/platform'\nimport { runBackNavigationGuards } from './backNavigation'\nimport { registerInitialNavigationRunner } from './initialNavigation'\nimport { setActiveRouter } from './instance'\nimport { createNavigationApi } from './navigationApi'\nimport { createNavigationResultController } from './navigationResult'\nimport { navigateWithTarget } from './navigationTarget'\nimport { resolveRouteLocation } from './resolve'\nimport { createRouteRegistry } from './routeRegistry'\nimport { installRouteStateSyncOnNativeRouter } from './routeSync'\nimport { createRouteStateController, useNativeRouter } from './useRoute'\n\n/**\n * @description 创建高阶路由导航器(对齐 Vue Router 的 createRouter 心智)\n */\nexport function createRouter(options: UseRouterOptions = {}): RouterNavigation {\n const nativeRouter = useNativeRouter()\n installRouteStateSyncOnNativeRouter(getMiniProgramGlobalObject())\n const beforeEachGuards = new Set<NavigationGuard>()\n const beforeResolveGuards = new Set<NavigationGuard>()\n const afterEachHooks = new Set<NavigationAfterEach>()\n const errorHandlers = new Set<NavigationErrorHandler>()\n const maxRedirects = options.maxRedirects ?? 10\n const paramsMode = options.paramsMode ?? 'loose'\n const rejectOnError = options.rejectOnError ?? true\n const routeResolveCodec: RouteResolveCodec = {\n parseQuery: options.parseQuery ?? parseQuery,\n stringifyQuery: options.stringifyQuery ?? stringifyQuery,\n }\n const readyPromise = Promise.resolve()\n const routeEntries = resolveRouteOptionEntries(options)\n warnDuplicateRouteEntries(routeEntries)\n const namedRouteLookup = createNamedRouteLookup(routeEntries)\n const normalizedTabBarEntries = (options.tabBarEntries ?? [])\n .map(path => resolvePath(path, ''))\n .filter(Boolean)\n const tabBarPathSet = new Set(normalizedTabBarEntries)\n const routeRegistry = createRouteRegistry(namedRouteLookup)\n let managedNavigationCount = 0\n const routerOptions = createRouterOptionsSnapshot(\n normalizedTabBarEntries,\n routeRegistry.getRoutes(),\n paramsMode,\n maxRedirects,\n routeResolveCodec,\n rejectOnError,\n )\n\n function enrichRouteRecordState(routeLocation: RouteLocationNormalizedLoaded): RouteLocationNormalizedLoaded {\n const resolved = { ...routeLocation }\n resolved.href = resolved.fullPath\n const matchedResult = resolveMatchedRouteRecord(resolved, namedRouteLookup)\n if (matchedResult) {\n const matchedRecord = matchedResult.record\n if (resolved.name === undefined) {\n resolved.name = matchedRecord.name\n }\n const mergedRouteMeta = mergeMatchedRouteMeta(matchedResult.matchedRecords)\n if (mergedRouteMeta !== undefined) {\n resolved.meta = cloneRouteMeta(mergedRouteMeta)\n }\n if (matchedResult.params && Object.keys(resolved.params).length === 0) {\n resolved.params = cloneRouteParams(matchedResult.params)\n }\n resolved.matched = matchedResult.matchedRecords.map((record, index, records) => {\n const leafMatchedPath = index === records.length - 1\n ? matchedResult.matchedPath\n : undefined\n return normalizeRouteRecordMatched(record, leafMatchedPath)\n })\n }\n else {\n resolved.matched = []\n }\n return resolved\n }\n\n function resolveWithCodec(to: RouteLocationRaw, currentPath: string): RouteLocationNormalizedLoaded {\n const rawTo = typeof to === 'string'\n ? to\n : resolveNamedRouteLocation(to, namedRouteLookup, paramsMode)\n return enrichRouteRecordState(resolveRouteLocation(rawTo, currentPath, routeResolveCodec))\n }\n\n let route: Readonly<RouteLocationNormalizedLoaded>\n let emitObservedNavigationAfterEach: ((result: NavigationRunResult) => Promise<void>) | undefined\n\n function isExternalBackSync(payload: RouteStateSyncPayload): boolean {\n return payload.source === 'page'\n || (payload.source === 'native' && payload.method === 'navigateBack')\n }\n\n function beforeRouteStateSync(\n nextRoute: RouteLocationNormalizedLoaded,\n payload: RouteStateSyncPayload,\n ) {\n if (\n managedNavigationCount > 0\n || !isExternalBackSync(payload)\n || nextRoute.fullPath === route.fullPath\n ) {\n return\n }\n\n const from = snapshotRouteLocation(route)\n void runBackNavigationGuards({\n target: nextRoute,\n from,\n nativeRouter,\n beforeEachGuards,\n beforeResolveGuards,\n resolveWithCodec,\n }).then((result) => {\n return emitObservedNavigationAfterEach?.(result)\n })\n }\n\n const routeController = createRouteStateController({\n beforeRouteStateSync,\n resolveRoute: enrichRouteRecordState,\n })\n route = routeController.route\n\n function resolve(to: RouteLocationRaw): RouteLocationNormalizedLoaded {\n return resolveWithCodec(to, route.path)\n }\n\n const navigationResultController = createNavigationResultController({\n afterEachHooks,\n errorHandlers,\n nativeRouter,\n rejectOnError,\n })\n emitObservedNavigationAfterEach = navigationResultController.emitNavigationAfterEach\n\n const navigationApi = createNavigationApi({\n nativeRouter,\n route,\n routeResolveCodec,\n namedRouteLookup,\n beforeEachGuards,\n beforeResolveGuards,\n maxRedirects,\n tabBarPathSet,\n resolveWithCodec,\n settleNavigationResult: navigationResultController.settleNavigationResult,\n })\n\n async function runManagedNavigation<T>(navigation: () => Promise<T>): Promise<T> {\n managedNavigationCount += 1\n try {\n return await navigation()\n }\n finally {\n managedNavigationCount -= 1\n }\n }\n\n async function runInitialNavigation(page: Parameters<typeof resolveCurrentRoute>[1], query?: LocationQueryRaw) {\n return runManagedNavigation(async () => {\n const from = snapshotRouteLocation(route)\n const target = enrichRouteRecordState(resolveCurrentRoute(query, page))\n if (!target.path) {\n return undefined\n }\n const result = await navigateWithTarget({\n mode: 'push',\n target,\n from,\n nativeRouter,\n routeResolveCodec,\n namedRouteLookup,\n beforeEachGuards,\n beforeResolveGuards,\n maxRedirects,\n tabBarPathSet,\n resolveWithCodec,\n executeNative: false,\n allowSameLocation: true,\n })\n return navigationResultController.settleNavigationResult(result)\n })\n }\n\n function beforeEach(guard: NavigationGuard): () => void {\n beforeEachGuards.add(guard)\n return () => {\n beforeEachGuards.delete(guard)\n }\n }\n\n function beforeResolve(guard: NavigationGuard): () => void {\n beforeResolveGuards.add(guard)\n return () => {\n beforeResolveGuards.delete(guard)\n }\n }\n\n function afterEach(hook: NavigationAfterEach): () => void {\n afterEachHooks.add(hook)\n return () => {\n afterEachHooks.delete(hook)\n }\n }\n\n function onError(handler: NavigationErrorHandler): () => void {\n errorHandlers.add(handler)\n return () => {\n errorHandlers.delete(handler)\n }\n }\n\n const router: RouterNavigation = {\n nativeRouter,\n options: routerOptions,\n currentRoute: route,\n install(app?: unknown): void {\n setActiveRouter(router)\n const globalProperties = (app as { config?: { globalProperties?: Record<string, unknown> } } | undefined)?.config?.globalProperties\n if (globalProperties) {\n globalProperties.$router = router\n }\n },\n resolve,\n isReady(): Promise<void> {\n return readyPromise\n },\n push: to => runManagedNavigation(() => navigationApi.push(to)),\n replace: to => runManagedNavigation(() => navigationApi.replace(to)),\n back: delta => runManagedNavigation(() => navigationApi.back(delta)),\n go: delta => runManagedNavigation(() => navigationApi.go(delta)),\n forward: () => runManagedNavigation(() => navigationApi.forward()),\n hasRoute: routeRegistry.hasRoute,\n getRoutes: routeRegistry.getRoutes,\n addRoute: routeRegistry.addRoute,\n removeRoute: routeRegistry.removeRoute,\n clearRoutes: routeRegistry.clearRoutes,\n beforeEach,\n beforeResolve,\n afterEach,\n onError,\n }\n\n setActiveRouter(router)\n registerInitialNavigationRunner(router, runInitialNavigation)\n return router\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA6CA,SAAgB,aAAa,UAA4B,CAAC,GAAqB;;CAC7E,MAAM,eAAe,gBAAgB;CACrC,oCAAoC,2BAA2B,CAAC;CAChE,MAAM,mCAAmB,IAAI,IAAqB;CAClD,MAAM,sCAAsB,IAAI,IAAqB;CACrD,MAAM,iCAAiB,IAAI,IAAyB;CACpD,MAAM,gCAAgB,IAAI,IAA4B;CACtD,MAAM,wCAAe,QAAQ,qFAAgB;CAC7C,MAAM,oCAAa,QAAQ,+EAAc;CACzC,MAAM,yCAAgB,QAAQ,sFAAiB;CAC/C,MAAM,oBAAuC;EAC3C,mCAAY,QAAQ,+EAAc;EAClC,yCAAgB,QAAQ,uFAAkB;CAC5C;CACA,MAAM,eAAe,QAAQ,QAAQ;CACrC,MAAM,eAAe,0BAA0B,OAAO;CACtD,0BAA0B,YAAY;CACtC,MAAM,mBAAmB,uBAAuB,YAAY;CAC5D,MAAM,oDAA2B,QAAQ,sFAAiB,CAAC,EAAC,CACzD,KAAI,SAAQ,YAAY,MAAM,EAAE,CAAC,CAAC,CAClC,OAAO,OAAO;CACjB,MAAM,gBAAgB,IAAI,IAAI,uBAAuB;CACrD,MAAM,gBAAgB,oBAAoB,gBAAgB;CAC1D,IAAI,yBAAyB;CAC7B,MAAM,gBAAgB,4BACpB,yBACA,cAAc,UAAU,GACxB,YACA,cACA,mBACA,aACF;CAEA,SAAS,uBAAuB,eAA6E;EAC3G,MAAM,WAAW,EAAE,GAAG,cAAc;EACpC,SAAS,OAAO,SAAS;EACzB,MAAM,gBAAgB,0BAA0B,UAAU,gBAAgB;EAC1E,IAAI,eAAe;GACjB,MAAM,gBAAgB,cAAc;GACpC,IAAI,SAAS,SAAS,QACpB,SAAS,OAAO,cAAc;GAEhC,MAAM,kBAAkB,sBAAsB,cAAc,cAAc;GAC1E,IAAI,oBAAoB,QACtB,SAAS,OAAO,eAAe,eAAe;GAEhD,IAAI,cAAc,UAAU,OAAO,KAAK,SAAS,MAAM,CAAC,CAAC,WAAW,GAClE,SAAS,SAAS,iBAAiB,cAAc,MAAM;GAEzD,SAAS,UAAU,cAAc,eAAe,KAAK,QAAQ,OAAO,YAAY;IAC9E,MAAM,kBAAkB,UAAU,QAAQ,SAAS,IAC/C,cAAc,cACd;IACJ,OAAO,4BAA4B,QAAQ,eAAe;GAC5D,CAAC;EACH,OAEE,SAAS,UAAU,CAAC;EAEtB,OAAO;CACT;CAEA,SAAS,iBAAiB,IAAsB,aAAoD;EAClG,MAAM,QAAQ,OAAO,OAAO,WACxB,KACA,0BAA0B,IAAI,kBAAkB,UAAU;EAC9D,OAAO,uBAAuB,qBAAqB,OAAO,aAAa,iBAAiB,CAAC;CAC3F;CAEA,IAAI;CACJ,IAAI;CAEJ,SAAS,mBAAmB,SAAyC;EACnE,OAAO,QAAQ,WAAW,UACpB,QAAQ,WAAW,YAAY,QAAQ,WAAW;CAC1D;CAEA,SAAS,qBACP,WACA,SACA;EACA,IACE,yBAAyB,KACtB,CAAC,mBAAmB,OAAO,KAC3B,UAAU,aAAa,MAAM,UAEhC;EAGF,MAAM,OAAO,sBAAsB,KAAK;EACxC,AAAK,wBAAwB;GAC3B,QAAQ;GACR;GACA;GACA;GACA;GACA;EACF,CAAC,CAAC,CAAC,MAAM,WAAW;GAClB,yGAAO,gCAAkC,MAAM;EACjD,CAAC;CACH;CAMA,QAJwB,2BAA2B;EACjD;EACA,cAAc;CAChB,CACsB,CAAC,CAAC;CAExB,SAAS,QAAQ,IAAqD;EACpE,OAAO,iBAAiB,IAAI,MAAM,IAAI;CACxC;CAEA,MAAM,6BAA6B,iCAAiC;EAClE;EACA;EACA;EACA;CACF,CAAC;CACD,kCAAkC,2BAA2B;CAE7D,MAAM,gBAAgB,oBAAoB;EACxC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,wBAAwB,2BAA2B;CACrD,CAAC;CAED,eAAe,qBAAwB,YAA0C;EAC/E,0BAA0B;EAC1B,IAAI;GACF,OAAO,MAAM,WAAW;EAC1B,UACQ;GACN,0BAA0B;EAC5B;CACF;CAEA,eAAe,qBAAqB,MAAiD,OAA0B;EAC7G,OAAO,qBAAqB,YAAY;GACtC,MAAM,OAAO,sBAAsB,KAAK;GACxC,MAAM,SAAS,uBAAuB,oBAAoB,OAAO,IAAI,CAAC;GACtE,IAAI,CAAC,OAAO,MACV;GAEF,MAAM,SAAS,MAAM,mBAAmB;IACtC,MAAM;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,eAAe;IACf,mBAAmB;GACrB,CAAC;GACD,OAAO,2BAA2B,uBAAuB,MAAM;EACjE,CAAC;CACH;CAEA,SAAS,WAAW,OAAoC;EACtD,iBAAiB,IAAI,KAAK;EAC1B,aAAa;GACX,iBAAiB,OAAO,KAAK;EAC/B;CACF;CAEA,SAAS,cAAc,OAAoC;EACzD,oBAAoB,IAAI,KAAK;EAC7B,aAAa;GACX,oBAAoB,OAAO,KAAK;EAClC;CACF;CAEA,SAAS,UAAU,MAAuC;EACxD,eAAe,IAAI,IAAI;EACvB,aAAa;GACX,eAAe,OAAO,IAAI;EAC5B;CACF;CAEA,SAAS,QAAQ,SAA6C;EAC5D,cAAc,IAAI,OAAO;EACzB,aAAa;GACX,cAAc,OAAO,OAAO;EAC9B;CACF;CAEA,MAAM,SAA2B;EAC/B;EACA,SAAS;EACT,cAAc;EACd,QAAQ,KAAqB;;GAC3B,gBAAgB,MAAM;GACtB,MAAM,gEAAoB,IAAiF,0DAAQ;GACnH,IAAI,kBACF,iBAAiB,UAAU;EAE/B;EACA;EACA,UAAyB;GACvB,OAAO;EACT;EACA,OAAM,OAAM,2BAA2B,cAAc,KAAK,EAAE,CAAC;EAC7D,UAAS,OAAM,2BAA2B,cAAc,QAAQ,EAAE,CAAC;EACnE,OAAM,UAAS,2BAA2B,cAAc,KAAK,KAAK,CAAC;EACnE,KAAI,UAAS,2BAA2B,cAAc,GAAG,KAAK,CAAC;EAC/D,eAAe,2BAA2B,cAAc,QAAQ,CAAC;EACjE,UAAU,cAAc;EACxB,WAAW,cAAc;EACzB,UAAU,cAAc;EACxB,aAAa,cAAc;EAC3B,aAAa,cAAc;EAC3B;EACA;EACA;EACA;CACF;CAEA,gBAAgB,MAAM;CACtB,gCAAgC,QAAQ,oBAAoB;CAC5D,OAAO;AACT"}
1
+ {"version":3,"file":"createRouter.mjs","names":[],"sources":["../../../src/router/createRouter.ts"],"sourcesContent":["import type { RouteResolveCodec } from '../routerInternal/shared'\nimport type { NavigationRunResult } from './navigationResult'\nimport type { RouteStateSyncPayload } from './routeSync'\nimport type {\n InitialNavigationMode,\n LocationQueryRaw,\n NavigationAfterEach,\n NavigationErrorHandler,\n NavigationGuard,\n RouteLocationNormalizedLoaded,\n RouteLocationRaw,\n RouterNavigation,\n UseRouterOptions,\n} from './types'\nimport {\n cloneRouteMeta,\n cloneRouteParams,\n createNamedRouteLookup,\n createRouterOptionsSnapshot,\n mergeMatchedRouteMeta,\n normalizeRouteRecordMatched,\n parseQuery,\n resolveCurrentRoute,\n resolveMatchedRouteRecord,\n resolveNamedRouteLocation,\n resolvePath,\n resolveRouteOptionEntries,\n snapshotRouteLocation,\n stringifyQuery,\n warnDuplicateRouteEntries,\n} from '../routerInternal/shared'\nimport { getMiniProgramGlobalObject } from '../runtime/platform'\nimport { resolveBackNavigationTarget, runBackNavigationGuards } from './backNavigation'\nimport { DEFAULT_INITIAL_NAVIGATION_TIMEOUT, registerInitialNavigationRunner } from './initialNavigation'\nimport { setActiveRouter } from './instance'\nimport { createNavigationApi } from './navigationApi'\nimport { createNavigationResultController } from './navigationResult'\nimport { navigateWithTarget } from './navigationTarget'\nimport { resolveRouteLocation } from './resolve'\nimport { createRouteRegistry } from './routeRegistry'\nimport { installRouteStateSyncOnNativeRouter, notifyRouteStateSync } from './routeSync'\nimport { createRouteStateController, useNativeRouter } from './useRoute'\n\n/**\n * @description 创建高阶路由导航器(对齐 Vue Router 的 createRouter 心智)\n */\nexport function createRouter(options: UseRouterOptions = {}): RouterNavigation {\n const nativeRouter = useNativeRouter()\n installRouteStateSyncOnNativeRouter(getMiniProgramGlobalObject())\n const beforeEachGuards = new Set<NavigationGuard>()\n const beforeResolveGuards = new Set<NavigationGuard>()\n const afterEachHooks = new Set<NavigationAfterEach>()\n const errorHandlers = new Set<NavigationErrorHandler>()\n const maxRedirects = options.maxRedirects ?? 10\n const initialNavigationMode: InitialNavigationMode = options.initialNavigationMode === 'blocking' ? 'blocking' : 'eager'\n const initialNavigationTimeout = Number.isFinite(options.initialNavigationTimeout) && (options.initialNavigationTimeout ?? 0) > 0\n ? Math.max(1, Math.trunc(options.initialNavigationTimeout!))\n : DEFAULT_INITIAL_NAVIGATION_TIMEOUT\n const paramsMode = options.paramsMode ?? 'loose'\n const rejectOnError = options.rejectOnError ?? true\n const routeResolveCodec: RouteResolveCodec = {\n parseQuery: options.parseQuery ?? parseQuery,\n stringifyQuery: options.stringifyQuery ?? stringifyQuery,\n }\n const readyPromise = Promise.resolve()\n const routeEntries = resolveRouteOptionEntries(options)\n warnDuplicateRouteEntries(routeEntries)\n const namedRouteLookup = createNamedRouteLookup(routeEntries)\n const normalizedTabBarEntries = (options.tabBarEntries ?? [])\n .map(path => resolvePath(path, ''))\n .filter(Boolean)\n const tabBarPathSet = new Set(normalizedTabBarEntries)\n const routeRegistry = createRouteRegistry(namedRouteLookup)\n let managedNavigationCount = 0\n let activeManagedRoutePath: string | undefined\n let pendingManagedRouteSyncPath: string | undefined\n let pendingExternalRouteSyncPath: string | undefined\n const routerOptions = createRouterOptionsSnapshot(\n normalizedTabBarEntries,\n routeRegistry.getRoutes(),\n paramsMode,\n maxRedirects,\n initialNavigationMode,\n initialNavigationTimeout,\n routeResolveCodec,\n rejectOnError,\n )\n\n function enrichRouteRecordState(routeLocation: RouteLocationNormalizedLoaded): RouteLocationNormalizedLoaded {\n const resolved = { ...routeLocation }\n resolved.href = resolved.fullPath\n const matchedResult = resolveMatchedRouteRecord(resolved, namedRouteLookup)\n if (matchedResult) {\n const matchedRecord = matchedResult.record\n if (resolved.name === undefined) {\n resolved.name = matchedRecord.name\n }\n const mergedRouteMeta = mergeMatchedRouteMeta(matchedResult.matchedRecords)\n if (mergedRouteMeta !== undefined) {\n resolved.meta = cloneRouteMeta(mergedRouteMeta)\n }\n if (matchedResult.params && Object.keys(resolved.params).length === 0) {\n resolved.params = cloneRouteParams(matchedResult.params)\n }\n resolved.matched = matchedResult.matchedRecords.map((record, index, records) => {\n const leafMatchedPath = index === records.length - 1\n ? matchedResult.matchedPath\n : undefined\n return normalizeRouteRecordMatched(record, leafMatchedPath)\n })\n }\n else {\n resolved.matched = []\n }\n return resolved\n }\n\n function resolveWithCodec(to: RouteLocationRaw, currentPath: string): RouteLocationNormalizedLoaded {\n const rawTo = typeof to === 'string'\n ? to\n : resolveNamedRouteLocation(to, namedRouteLookup, paramsMode)\n return enrichRouteRecordState(resolveRouteLocation(rawTo, currentPath, routeResolveCodec))\n }\n\n let route: Readonly<RouteLocationNormalizedLoaded>\n let emitObservedNavigationAfterEach: ((result: NavigationRunResult) => Promise<void>) | undefined\n\n function isExternalBackSync(payload: RouteStateSyncPayload): boolean {\n return payload.source === 'page'\n || (payload.source === 'native' && payload.method === 'navigateBack')\n }\n\n function beforeRouteStateSync(\n nextRoute: RouteLocationNormalizedLoaded,\n payload: RouteStateSyncPayload,\n ) {\n if (managedNavigationCount > 0 || !isExternalBackSync(payload)) {\n return\n }\n\n if (pendingExternalRouteSyncPath !== undefined) {\n return\n }\n\n if (pendingManagedRouteSyncPath !== undefined) {\n const expectedPath = pendingManagedRouteSyncPath\n pendingManagedRouteSyncPath = undefined\n if (nextRoute.fullPath === expectedPath) {\n return\n }\n }\n\n if (nextRoute.fullPath === route.fullPath) {\n return\n }\n\n pendingExternalRouteSyncPath = nextRoute.fullPath\n const from = snapshotRouteLocation(route)\n void runBackNavigationGuards({\n target: nextRoute,\n from,\n nativeRouter,\n beforeEachGuards,\n beforeResolveGuards,\n resolveWithCodec,\n }).then((result) => {\n return emitObservedNavigationAfterEach?.(result)\n }).finally(() => {\n pendingExternalRouteSyncPath = undefined\n })\n }\n\n const routeController = createRouteStateController({\n beforeRouteStateSync,\n resolveRoute: enrichRouteRecordState,\n })\n route = routeController.route\n\n function resolve(to: RouteLocationRaw): RouteLocationNormalizedLoaded {\n return resolveWithCodec(to, route.path)\n }\n\n const navigationResultController = createNavigationResultController({\n afterEachHooks,\n errorHandlers,\n nativeRouter,\n rejectOnError,\n })\n emitObservedNavigationAfterEach = navigationResultController.emitNavigationAfterEach\n\n const navigationApi = createNavigationApi({\n nativeRouter,\n route,\n routeResolveCodec,\n namedRouteLookup,\n beforeEachGuards,\n beforeResolveGuards,\n maxRedirects,\n tabBarPathSet,\n resolveWithCodec,\n settleNavigationResult: navigationResultController.settleNavigationResult,\n })\n\n async function runManagedNavigation<T>(navigation: () => Promise<T>, targetPath?: string): Promise<T> {\n const previousRoutePath = route.fullPath\n if (targetPath) {\n activeManagedRoutePath = targetPath\n }\n managedNavigationCount += 1\n try {\n const result = await navigation()\n if (route.fullPath !== previousRoutePath) {\n pendingManagedRouteSyncPath = route.fullPath\n }\n return result\n }\n finally {\n managedNavigationCount -= 1\n if (managedNavigationCount <= 0) {\n activeManagedRoutePath = undefined\n }\n }\n }\n\n function resolveManagedRoutePath(to: RouteLocationRaw): string | undefined {\n try {\n return resolveWithCodec(to, route.path).fullPath\n }\n catch {\n return undefined\n }\n }\n\n async function runInitialNavigation(\n page: Parameters<typeof resolveCurrentRoute>[1],\n query?: LocationQueryRaw,\n isActive: () => boolean = () => true,\n ) {\n return runManagedNavigation(async () => {\n const from = snapshotRouteLocation(route)\n const target = enrichRouteRecordState(resolveCurrentRoute(query, page))\n if (!target.path) {\n return undefined\n }\n if (activeManagedRoutePath === target.fullPath) {\n notifyRouteStateSync({\n route: target,\n source: 'router',\n })\n return undefined\n }\n const result = await navigateWithTarget({\n mode: 'push',\n target,\n from,\n nativeRouter,\n routeResolveCodec,\n namedRouteLookup,\n beforeEachGuards,\n beforeResolveGuards,\n maxRedirects,\n tabBarPathSet,\n resolveWithCodec,\n executeNative: false,\n allowSameLocation: true,\n })\n if (!isActive()) {\n return undefined\n }\n return navigationResultController.settleNavigationResult(result)\n })\n }\n\n function beforeEach(guard: NavigationGuard): () => void {\n beforeEachGuards.add(guard)\n return () => {\n beforeEachGuards.delete(guard)\n }\n }\n\n function beforeResolve(guard: NavigationGuard): () => void {\n beforeResolveGuards.add(guard)\n return () => {\n beforeResolveGuards.delete(guard)\n }\n }\n\n function afterEach(hook: NavigationAfterEach): () => void {\n afterEachHooks.add(hook)\n return () => {\n afterEachHooks.delete(hook)\n }\n }\n\n function onError(handler: NavigationErrorHandler): () => void {\n errorHandlers.add(handler)\n return () => {\n errorHandlers.delete(handler)\n }\n }\n\n const router: RouterNavigation = {\n nativeRouter,\n options: routerOptions,\n currentRoute: route,\n install(app?: unknown): void {\n setActiveRouter(router)\n const globalProperties = (app as { config?: { globalProperties?: Record<string, unknown> } } | undefined)?.config?.globalProperties\n if (globalProperties) {\n globalProperties.$router = router\n }\n },\n resolve,\n isReady(): Promise<void> {\n return readyPromise\n },\n push: to => runManagedNavigation(() => navigationApi.push(to), resolveManagedRoutePath(to)),\n replace: to => runManagedNavigation(() => navigationApi.replace(to), resolveManagedRoutePath(to)),\n back: delta => runManagedNavigation(\n () => navigationApi.back(delta),\n resolveBackNavigationTarget(delta ?? 1, route, resolveWithCodec)?.fullPath,\n ),\n go: delta => runManagedNavigation(\n () => navigationApi.go(delta),\n delta < 0\n ? resolveBackNavigationTarget(Math.abs(delta), route, resolveWithCodec)?.fullPath\n : undefined,\n ),\n forward: () => runManagedNavigation(() => navigationApi.forward()),\n hasRoute: routeRegistry.hasRoute,\n getRoutes: routeRegistry.getRoutes,\n addRoute: routeRegistry.addRoute,\n removeRoute: routeRegistry.removeRoute,\n clearRoutes: routeRegistry.clearRoutes,\n beforeEach,\n beforeResolve,\n afterEach,\n onError,\n }\n\n setActiveRouter(router)\n registerInitialNavigationRunner(router, runInitialNavigation, initialNavigationTimeout, initialNavigationMode)\n return router\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA8CA,SAAgB,aAAa,UAA4B,CAAC,GAAqB;;CAC7E,MAAM,eAAe,gBAAgB;CACrC,oCAAoC,2BAA2B,CAAC;CAChE,MAAM,mCAAmB,IAAI,IAAqB;CAClD,MAAM,sCAAsB,IAAI,IAAqB;CACrD,MAAM,iCAAiB,IAAI,IAAyB;CACpD,MAAM,gCAAgB,IAAI,IAA4B;CACtD,MAAM,wCAAe,QAAQ,qFAAgB;CAC7C,MAAM,wBAA+C,QAAQ,0BAA0B,aAAa,aAAa;CACjH,MAAM,2BAA2B,OAAO,SAAS,QAAQ,wBAAwB,+BAAM,QAAQ,iGAA4B,KAAK,IAC5H,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,wBAAyB,CAAC,IACzD;CACJ,MAAM,oCAAa,QAAQ,+EAAc;CACzC,MAAM,yCAAgB,QAAQ,sFAAiB;CAC/C,MAAM,oBAAuC;EAC3C,mCAAY,QAAQ,+EAAc;EAClC,yCAAgB,QAAQ,uFAAkB;CAC5C;CACA,MAAM,eAAe,QAAQ,QAAQ;CACrC,MAAM,eAAe,0BAA0B,OAAO;CACtD,0BAA0B,YAAY;CACtC,MAAM,mBAAmB,uBAAuB,YAAY;CAC5D,MAAM,oDAA2B,QAAQ,sFAAiB,CAAC,EAAC,CACzD,KAAI,SAAQ,YAAY,MAAM,EAAE,CAAC,CAAC,CAClC,OAAO,OAAO;CACjB,MAAM,gBAAgB,IAAI,IAAI,uBAAuB;CACrD,MAAM,gBAAgB,oBAAoB,gBAAgB;CAC1D,IAAI,yBAAyB;CAC7B,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,MAAM,gBAAgB,4BACpB,yBACA,cAAc,UAAU,GACxB,YACA,cACA,uBACA,0BACA,mBACA,aACF;CAEA,SAAS,uBAAuB,eAA6E;EAC3G,MAAM,WAAW,EAAE,GAAG,cAAc;EACpC,SAAS,OAAO,SAAS;EACzB,MAAM,gBAAgB,0BAA0B,UAAU,gBAAgB;EAC1E,IAAI,eAAe;GACjB,MAAM,gBAAgB,cAAc;GACpC,IAAI,SAAS,SAAS,QACpB,SAAS,OAAO,cAAc;GAEhC,MAAM,kBAAkB,sBAAsB,cAAc,cAAc;GAC1E,IAAI,oBAAoB,QACtB,SAAS,OAAO,eAAe,eAAe;GAEhD,IAAI,cAAc,UAAU,OAAO,KAAK,SAAS,MAAM,CAAC,CAAC,WAAW,GAClE,SAAS,SAAS,iBAAiB,cAAc,MAAM;GAEzD,SAAS,UAAU,cAAc,eAAe,KAAK,QAAQ,OAAO,YAAY;IAC9E,MAAM,kBAAkB,UAAU,QAAQ,SAAS,IAC/C,cAAc,cACd;IACJ,OAAO,4BAA4B,QAAQ,eAAe;GAC5D,CAAC;EACH,OAEE,SAAS,UAAU,CAAC;EAEtB,OAAO;CACT;CAEA,SAAS,iBAAiB,IAAsB,aAAoD;EAClG,MAAM,QAAQ,OAAO,OAAO,WACxB,KACA,0BAA0B,IAAI,kBAAkB,UAAU;EAC9D,OAAO,uBAAuB,qBAAqB,OAAO,aAAa,iBAAiB,CAAC;CAC3F;CAEA,IAAI;CACJ,IAAI;CAEJ,SAAS,mBAAmB,SAAyC;EACnE,OAAO,QAAQ,WAAW,UACpB,QAAQ,WAAW,YAAY,QAAQ,WAAW;CAC1D;CAEA,SAAS,qBACP,WACA,SACA;EACA,IAAI,yBAAyB,KAAK,CAAC,mBAAmB,OAAO,GAC3D;EAGF,IAAI,iCAAiC,QACnC;EAGF,IAAI,gCAAgC,QAAW;GAC7C,MAAM,eAAe;GACrB,8BAA8B;GAC9B,IAAI,UAAU,aAAa,cACzB;EAEJ;EAEA,IAAI,UAAU,aAAa,MAAM,UAC/B;EAGF,+BAA+B,UAAU;EACzC,MAAM,OAAO,sBAAsB,KAAK;EACxC,AAAK,wBAAwB;GAC3B,QAAQ;GACR;GACA;GACA;GACA;GACA;EACF,CAAC,CAAC,CAAC,MAAM,WAAW;GAClB,yGAAO,gCAAkC,MAAM;EACjD,CAAC,CAAC,CAAC,cAAc;GACf,+BAA+B;EACjC,CAAC;CACH;CAMA,QAJwB,2BAA2B;EACjD;EACA,cAAc;CAChB,CACsB,CAAC,CAAC;CAExB,SAAS,QAAQ,IAAqD;EACpE,OAAO,iBAAiB,IAAI,MAAM,IAAI;CACxC;CAEA,MAAM,6BAA6B,iCAAiC;EAClE;EACA;EACA;EACA;CACF,CAAC;CACD,kCAAkC,2BAA2B;CAE7D,MAAM,gBAAgB,oBAAoB;EACxC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,wBAAwB,2BAA2B;CACrD,CAAC;CAED,eAAe,qBAAwB,YAA8B,YAAiC;EACpG,MAAM,oBAAoB,MAAM;EAChC,IAAI,YACF,yBAAyB;EAE3B,0BAA0B;EAC1B,IAAI;GACF,MAAM,SAAS,MAAM,WAAW;GAChC,IAAI,MAAM,aAAa,mBACrB,8BAA8B,MAAM;GAEtC,OAAO;EACT,UACQ;GACN,0BAA0B;GAC1B,IAAI,0BAA0B,GAC5B,yBAAyB;EAE7B;CACF;CAEA,SAAS,wBAAwB,IAA0C;EACzE,IAAI;GACF,OAAO,iBAAiB,IAAI,MAAM,IAAI,CAAC,CAAC;EAC1C,kBACM;GACJ;EACF;CACF;CAEA,eAAe,qBACb,MACA,OACA,iBAAgC,MAChC;EACA,OAAO,qBAAqB,YAAY;GACtC,MAAM,OAAO,sBAAsB,KAAK;GACxC,MAAM,SAAS,uBAAuB,oBAAoB,OAAO,IAAI,CAAC;GACtE,IAAI,CAAC,OAAO,MACV;GAEF,IAAI,2BAA2B,OAAO,UAAU;IAC9C,qBAAqB;KACnB,OAAO;KACP,QAAQ;IACV,CAAC;IACD;GACF;GACA,MAAM,SAAS,MAAM,mBAAmB;IACtC,MAAM;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,eAAe;IACf,mBAAmB;GACrB,CAAC;GACD,IAAI,CAAC,SAAS,GACZ;GAEF,OAAO,2BAA2B,uBAAuB,MAAM;EACjE,CAAC;CACH;CAEA,SAAS,WAAW,OAAoC;EACtD,iBAAiB,IAAI,KAAK;EAC1B,aAAa;GACX,iBAAiB,OAAO,KAAK;EAC/B;CACF;CAEA,SAAS,cAAc,OAAoC;EACzD,oBAAoB,IAAI,KAAK;EAC7B,aAAa;GACX,oBAAoB,OAAO,KAAK;EAClC;CACF;CAEA,SAAS,UAAU,MAAuC;EACxD,eAAe,IAAI,IAAI;EACvB,aAAa;GACX,eAAe,OAAO,IAAI;EAC5B;CACF;CAEA,SAAS,QAAQ,SAA6C;EAC5D,cAAc,IAAI,OAAO;EACzB,aAAa;GACX,cAAc,OAAO,OAAO;EAC9B;CACF;CAEA,MAAM,SAA2B;EAC/B;EACA,SAAS;EACT,cAAc;EACd,QAAQ,KAAqB;;GAC3B,gBAAgB,MAAM;GACtB,MAAM,gEAAoB,IAAiF,0DAAQ;GACnH,IAAI,kBACF,iBAAiB,UAAU;EAE/B;EACA;EACA,UAAyB;GACvB,OAAO;EACT;EACA,OAAM,OAAM,2BAA2B,cAAc,KAAK,EAAE,GAAG,wBAAwB,EAAE,CAAC;EAC1F,UAAS,OAAM,2BAA2B,cAAc,QAAQ,EAAE,GAAG,wBAAwB,EAAE,CAAC;EAChG,OAAM,UAAS;;qCACP,cAAc,KAAK,KAAK,4BAC9B,4BAA4B,6CAAS,GAAG,OAAO,gBAAgB,iFAAG,QACpE;;EACA,KAAI,UAAS;;qCACL,cAAc,GAAG,KAAK,GAC5B,QAAQ,8BACJ,4BAA4B,KAAK,IAAI,KAAK,GAAG,OAAO,gBAAgB,mFAAG,WACvE,MACN;;EACA,eAAe,2BAA2B,cAAc,QAAQ,CAAC;EACjE,UAAU,cAAc;EACxB,WAAW,cAAc;EACzB,UAAU,cAAc;EACxB,aAAa,cAAc;EAC3B,aAAa,cAAc;EAC3B;EACA;EACA;EACA;CACF;CAEA,gBAAgB,MAAM;CACtB,gCAAgC,QAAQ,sBAAsB,0BAA0B,qBAAqB;CAC7G,OAAO;AACT"}
@@ -1,15 +1,141 @@
1
1
  import { getActiveRouter } from "./instance.mjs";
2
+ import { WEVU_INITIAL_NAVIGATION_TIMEOUT_MARKER } from "@weapp-core/constants";
2
3
 
3
4
  //#region src/router/initialNavigation.ts
5
+ const DEFAULT_INITIAL_NAVIGATION_TIMEOUT = 1e4;
4
6
  const initialNavigationRunners = /* @__PURE__ */ new WeakMap();
5
- function registerInitialNavigationRunner(router, runner) {
6
- initialNavigationRunners.set(router, runner);
7
+ const initialNavigationControllers = /* @__PURE__ */ new WeakMap();
8
+ function normalizeTimeout(timeoutMs) {
9
+ return Number.isFinite(timeoutMs) && timeoutMs > 0 ? Math.max(1, Math.trunc(timeoutMs)) : DEFAULT_INITIAL_NAVIGATION_TIMEOUT;
7
10
  }
8
- function getInitialNavigationRunner() {
11
+ function snapshotPage(instance) {
12
+ return {
13
+ route: typeof instance.route === "string" ? instance.route : void 0,
14
+ __route__: typeof instance.__route__ === "string" ? instance.__route__ : void 0,
15
+ options: instance.options && typeof instance.options === "object" ? { ...instance.options } : void 0
16
+ };
17
+ }
18
+ function snapshotQuery(query) {
19
+ if (!query || typeof query !== "object") return;
20
+ return Object.fromEntries(Object.entries(query).map(([key, value]) => [key, Array.isArray(value) ? [...value] : value]));
21
+ }
22
+ function registerInitialNavigationRunner(router, runner, timeoutMs = DEFAULT_INITIAL_NAVIGATION_TIMEOUT, mode = "blocking") {
23
+ initialNavigationRunners.set(router, {
24
+ runner,
25
+ mode,
26
+ timeoutMs: normalizeTimeout(timeoutMs)
27
+ });
28
+ }
29
+ function getInitialNavigationTimeout() {
30
+ var _initialNavigationRun2, _initialNavigationRun3;
9
31
  const router = getActiveRouter();
10
- return router ? initialNavigationRunners.get(router) : void 0;
32
+ return router ? (_initialNavigationRun2 = (_initialNavigationRun3 = initialNavigationRunners.get(router)) === null || _initialNavigationRun3 === void 0 ? void 0 : _initialNavigationRun3.timeoutMs) !== null && _initialNavigationRun2 !== void 0 ? _initialNavigationRun2 : DEFAULT_INITIAL_NAVIGATION_TIMEOUT : DEFAULT_INITIAL_NAVIGATION_TIMEOUT;
33
+ }
34
+ function isNavigationFailureResult(result) {
35
+ return Boolean(result && typeof result === "object" && result.__wevuNavigationFailure);
36
+ }
37
+ function ensureInitialNavigation(instance, query, options = {}) {
38
+ const existing = initialNavigationControllers.get(instance);
39
+ if (existing) {
40
+ if (options.onComplete && existing.blocking) existing.subscribe(options.onComplete);
41
+ if (options.start !== false) existing.start(query);
42
+ return existing.blocking ? existing.promise : void 0;
43
+ }
44
+ const router = getActiveRouter();
45
+ const registration = router ? initialNavigationRunners.get(router) : void 0;
46
+ let pendingRunner = registration === null || registration === void 0 ? void 0 : registration.runner;
47
+ if (!pendingRunner) return;
48
+ const blocking = (registration === null || registration === void 0 ? void 0 : registration.mode) === "blocking";
49
+ let page = snapshotPage(instance);
50
+ let initialQuery = snapshotQuery(query);
51
+ let currentStatus = "idle";
52
+ let timeoutHandle;
53
+ const timeoutMs = getInitialNavigationTimeout();
54
+ let resolveNavigation;
55
+ const completionCallbacks = /* @__PURE__ */ new Set();
56
+ const promise = new Promise((resolve) => {
57
+ resolveNavigation = resolve;
58
+ });
59
+ const settle = (status, shouldMount) => {
60
+ if (currentStatus !== "idle" && currentStatus !== "running") return;
61
+ currentStatus = status;
62
+ if (timeoutHandle !== void 0) {
63
+ clearTimeout(timeoutHandle);
64
+ timeoutHandle = void 0;
65
+ }
66
+ const callbacks = [...completionCallbacks];
67
+ completionCallbacks.clear();
68
+ pendingRunner = void 0;
69
+ page = void 0;
70
+ initialQuery = void 0;
71
+ resolveNavigation(shouldMount);
72
+ queueMicrotask(() => {
73
+ if (currentStatus !== "allowed" && currentStatus !== "timed-out") return;
74
+ for (const entry of callbacks) if (entry.active) {
75
+ entry.callback(shouldMount);
76
+ entry.active = false;
77
+ }
78
+ });
79
+ };
80
+ const controller = {
81
+ promise,
82
+ blocking,
83
+ status: () => currentStatus,
84
+ subscribe(callback) {
85
+ const entry = {
86
+ callback,
87
+ active: true
88
+ };
89
+ if (currentStatus !== "idle" && currentStatus !== "running") queueMicrotask(() => {
90
+ if (entry.active && (currentStatus === "allowed" || currentStatus === "timed-out")) {
91
+ callback(currentStatus === "allowed" || currentStatus === "timed-out");
92
+ entry.active = false;
93
+ }
94
+ });
95
+ else completionCallbacks.add(entry);
96
+ return () => {
97
+ entry.active = false;
98
+ completionCallbacks.delete(entry);
99
+ };
100
+ },
101
+ start(startQuery) {
102
+ if (currentStatus !== "idle") return;
103
+ currentStatus = "running";
104
+ if (blocking) timeoutHandle = setTimeout(() => {
105
+ var _ref, _page$route;
106
+ if (currentStatus !== "running") return;
107
+ console.warn(`${WEVU_INITIAL_NAVIGATION_TIMEOUT_MARKER} initial navigation exceeded ${timeoutMs}ms; mounting page`, (_ref = (_page$route = page === null || page === void 0 ? void 0 : page.route) !== null && _page$route !== void 0 ? _page$route : page === null || page === void 0 ? void 0 : page.__route__) !== null && _ref !== void 0 ? _ref : "");
108
+ settle("timed-out", true);
109
+ }, timeoutMs);
110
+ const runnerPage = page;
111
+ const runnerQuery = snapshotQuery(startQuery !== null && startQuery !== void 0 ? startQuery : initialQuery);
112
+ const runner = pendingRunner;
113
+ pendingRunner = void 0;
114
+ if (!runner || !runnerPage) {
115
+ settle("aborted", false);
116
+ return;
117
+ }
118
+ runner(runnerPage, runnerQuery, () => currentStatus === "running").then((result) => {
119
+ const failed = isNavigationFailureResult(result);
120
+ settle(failed ? "aborted" : "allowed", !failed);
121
+ }, () => {
122
+ settle("aborted", false);
123
+ });
124
+ },
125
+ cancel() {
126
+ settle("cancelled", false);
127
+ }
128
+ };
129
+ initialNavigationControllers.set(instance, controller);
130
+ if (options.onComplete && blocking) controller.subscribe(options.onComplete);
131
+ if (options.start !== false) controller.start(query);
132
+ return blocking ? promise : void 0;
133
+ }
134
+ function cancelInitialNavigation(instance) {
135
+ var _initialNavigationCon3;
136
+ (_initialNavigationCon3 = initialNavigationControllers.get(instance)) === null || _initialNavigationCon3 === void 0 || _initialNavigationCon3.cancel();
11
137
  }
12
138
 
13
139
  //#endregion
14
- export { getInitialNavigationRunner, registerInitialNavigationRunner };
140
+ export { DEFAULT_INITIAL_NAVIGATION_TIMEOUT, cancelInitialNavigation, ensureInitialNavigation, getInitialNavigationTimeout, registerInitialNavigationRunner };
15
141
  //# sourceMappingURL=initialNavigation.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"initialNavigation.mjs","names":[],"sources":["../../../src/router/initialNavigation.ts"],"sourcesContent":["import type { MiniProgramPageLike } from '../routerInternal/shared'\nimport type { LocationQueryRaw, NavigationFailure } from './types'\nimport { getActiveRouter } from './instance'\n\nexport type InitialNavigationRunner = (\n page: MiniProgramPageLike,\n query?: LocationQueryRaw,\n) => Promise<void | NavigationFailure>\n\nconst initialNavigationRunners = new WeakMap<object, InitialNavigationRunner>()\n\nexport function registerInitialNavigationRunner(\n router: object,\n runner: InitialNavigationRunner,\n) {\n initialNavigationRunners.set(router, runner)\n}\n\nexport function getInitialNavigationRunner(): InitialNavigationRunner | undefined {\n const router = getActiveRouter()\n return router ? initialNavigationRunners.get(router) : undefined\n}\n"],"mappings":";;;AASA,MAAM,2CAA2B,IAAI,QAAyC;AAE9E,SAAgB,gCACd,QACA,QACA;CACA,yBAAyB,IAAI,QAAQ,MAAM;AAC7C;AAEA,SAAgB,6BAAkE;CAChF,MAAM,SAAS,gBAAgB;CAC/B,OAAO,SAAS,yBAAyB,IAAI,MAAM,IAAI;AACzD"}
1
+ {"version":3,"file":"initialNavigation.mjs","names":[],"sources":["../../../src/router/initialNavigation.ts"],"sourcesContent":["import type { MiniProgramPageLike } from '../routerInternal/shared'\nimport type { InitialNavigationMode, LocationQueryRaw, NavigationFailure } from './types'\nimport { WEVU_INITIAL_NAVIGATION_TIMEOUT_MARKER } from '@weapp-core/constants'\nimport { getActiveRouter } from './instance'\n\nexport const DEFAULT_INITIAL_NAVIGATION_TIMEOUT = 10_000\n\nexport type InitialNavigationStatus = 'idle' | 'running' | 'allowed' | 'aborted' | 'timed-out' | 'cancelled'\n\ninterface InitialNavigationRunnerRegistration {\n runner: InitialNavigationRunner\n mode: InitialNavigationMode\n timeoutMs: number\n}\n\nexport type InitialNavigationRunner = (\n page: MiniProgramPageLike,\n query?: LocationQueryRaw,\n isActive?: () => boolean,\n) => Promise<void | NavigationFailure>\n\ninterface InitialNavigationController {\n readonly promise: Promise<boolean>\n readonly blocking: boolean\n readonly status: () => InitialNavigationStatus\n subscribe: (callback: (shouldMount: boolean) => void) => () => void\n start: (query?: LocationQueryRaw) => void\n cancel: () => void\n}\n\nconst initialNavigationRunners = new WeakMap<object, InitialNavigationRunnerRegistration>()\nconst initialNavigationControllers = new WeakMap<object, InitialNavigationController>()\n\nfunction normalizeTimeout(timeoutMs: number) {\n return Number.isFinite(timeoutMs) && timeoutMs > 0\n ? Math.max(1, Math.trunc(timeoutMs))\n : DEFAULT_INITIAL_NAVIGATION_TIMEOUT\n}\n\nfunction snapshotPage(instance: MiniProgramPageLike): MiniProgramPageLike {\n return {\n route: typeof instance.route === 'string' ? instance.route : undefined,\n __route__: typeof instance.__route__ === 'string' ? instance.__route__ : undefined,\n options: instance.options && typeof instance.options === 'object'\n ? { ...instance.options }\n : undefined,\n }\n}\n\nfunction snapshotQuery(query: LocationQueryRaw | undefined): LocationQueryRaw | undefined {\n if (!query || typeof query !== 'object') {\n return undefined\n }\n return Object.fromEntries(Object.entries(query).map(([key, value]) => [\n key,\n Array.isArray(value) ? [...value] : value,\n ]))\n}\n\nexport function registerInitialNavigationRunner(\n router: object,\n runner: InitialNavigationRunner,\n timeoutMs = DEFAULT_INITIAL_NAVIGATION_TIMEOUT,\n mode: InitialNavigationMode = 'blocking',\n) {\n initialNavigationRunners.set(router, {\n runner,\n mode,\n timeoutMs: normalizeTimeout(timeoutMs),\n })\n}\n\nexport function getInitialNavigationRunner(): InitialNavigationRunner | undefined {\n const router = getActiveRouter()\n return router ? initialNavigationRunners.get(router)?.runner : undefined\n}\n\nexport function getInitialNavigationTimeout() {\n const router = getActiveRouter()\n return router ? initialNavigationRunners.get(router)?.timeoutMs ?? DEFAULT_INITIAL_NAVIGATION_TIMEOUT : DEFAULT_INITIAL_NAVIGATION_TIMEOUT\n}\n\nexport function getInitialNavigationMode(): InitialNavigationMode {\n const router = getActiveRouter()\n return router ? initialNavigationRunners.get(router)?.mode ?? 'eager' : 'eager'\n}\n\nfunction isNavigationFailureResult(result: void | NavigationFailure): result is NavigationFailure {\n return Boolean(result && typeof result === 'object' && (result as NavigationFailure).__wevuNavigationFailure)\n}\n\nexport function getInitialNavigationPromise(instance: MiniProgramPageLike) {\n return initialNavigationControllers.get(instance as object)?.promise\n}\n\nexport function getInitialNavigationStatus(instance: MiniProgramPageLike) {\n return initialNavigationControllers.get(instance as object)?.status()\n}\n\nexport function ensureInitialNavigation(\n instance: MiniProgramPageLike,\n query?: LocationQueryRaw,\n options: { start?: boolean, onComplete?: (shouldMount: boolean) => void } = {},\n) {\n const existing = initialNavigationControllers.get(instance as object)\n if (existing) {\n if (options.onComplete && existing.blocking) {\n existing.subscribe(options.onComplete)\n }\n if (options.start !== false) {\n existing.start(query)\n }\n return existing.blocking ? existing.promise : undefined\n }\n\n const router = getActiveRouter()\n const registration = router ? initialNavigationRunners.get(router) : undefined\n let pendingRunner = registration?.runner\n if (!pendingRunner) {\n return undefined\n }\n const blocking = registration?.mode === 'blocking'\n\n let page: MiniProgramPageLike | undefined = snapshotPage(instance)\n let initialQuery = snapshotQuery(query)\n let currentStatus: InitialNavigationStatus = 'idle'\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined\n const timeoutMs = getInitialNavigationTimeout()\n let resolveNavigation!: (shouldMount: boolean) => void\n const completionCallbacks = new Set<{ callback: (shouldMount: boolean) => void, active: boolean }>()\n const promise = new Promise<boolean>((resolve) => {\n resolveNavigation = resolve\n })\n\n const settle = (status: Exclude<InitialNavigationStatus, 'idle' | 'running'>, shouldMount: boolean) => {\n if (currentStatus !== 'idle' && currentStatus !== 'running') {\n return\n }\n currentStatus = status\n if (timeoutHandle !== undefined) {\n clearTimeout(timeoutHandle)\n timeoutHandle = undefined\n }\n const callbacks = [...completionCallbacks]\n completionCallbacks.clear()\n pendingRunner = undefined\n page = undefined\n initialQuery = undefined\n resolveNavigation(shouldMount)\n queueMicrotask(() => {\n if (currentStatus !== 'allowed' && currentStatus !== 'timed-out') {\n return\n }\n for (const entry of callbacks) {\n if (entry.active) {\n entry.callback(shouldMount)\n entry.active = false\n }\n }\n })\n }\n\n const controller: InitialNavigationController = {\n promise,\n blocking,\n status: () => currentStatus,\n subscribe(callback) {\n const entry = { callback, active: true }\n if (currentStatus !== 'idle' && currentStatus !== 'running') {\n queueMicrotask(() => {\n if (entry.active && (currentStatus === 'allowed' || currentStatus === 'timed-out')) {\n callback(currentStatus === 'allowed' || currentStatus === 'timed-out')\n entry.active = false\n }\n })\n }\n else {\n completionCallbacks.add(entry)\n }\n return () => {\n entry.active = false\n completionCallbacks.delete(entry)\n }\n },\n start(startQuery?: LocationQueryRaw) {\n if (currentStatus !== 'idle') {\n return\n }\n currentStatus = 'running'\n if (blocking) {\n timeoutHandle = setTimeout(() => {\n if (currentStatus !== 'running') {\n return\n }\n // 超时是可恢复的运行时诊断,保留稳定 marker 供宿主和 E2E 观测。\n // eslint-disable-next-line no-console\n console.warn(`${WEVU_INITIAL_NAVIGATION_TIMEOUT_MARKER} initial navigation exceeded ${timeoutMs}ms; mounting page`, page?.route ?? page?.__route__ ?? '')\n settle('timed-out', true)\n }, timeoutMs)\n }\n const runnerPage = page\n const runnerQuery = snapshotQuery(startQuery ?? initialQuery)\n const runner = pendingRunner\n pendingRunner = undefined\n if (!runner || !runnerPage) {\n settle('aborted', false)\n return\n }\n void runner(runnerPage, runnerQuery, () => currentStatus === 'running').then((result) => {\n const failed = isNavigationFailureResult(result)\n settle(failed ? 'aborted' : 'allowed', !failed)\n }, () => {\n settle('aborted', false)\n })\n },\n cancel() {\n settle('cancelled', false)\n },\n }\n\n initialNavigationControllers.set(instance as object, controller)\n if (options.onComplete && blocking) {\n controller.subscribe(options.onComplete)\n }\n if (options.start !== false) {\n controller.start(query)\n }\n return blocking ? promise : undefined\n}\n\nexport function cancelInitialNavigation(instance: MiniProgramPageLike) {\n initialNavigationControllers.get(instance as object)?.cancel()\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
+ import { snapshotRouteLocation } from "../routerInternal/snapshots.mjs";
1
2
  import { NavigationFailureType } from "./types.mjs";
2
3
  import { createNavigationFailure, executeNavigationMethod, isNavigationFailure } from "./navigationCore.mjs";
3
- import { snapshotRouteLocation } from "../routerInternal/snapshots.mjs";
4
4
  import { createNavigationRunResult } from "./navigationResult.mjs";
5
5
  import { resolveBackNavigationTarget, runBackNavigationGuards } from "./backNavigation.mjs";
6
6
  import { createForwardNotSupportedFailure } from "./navigationTargetHelpers.mjs";
@@ -1,5 +1,5 @@
1
- import { runAfterEachHooks, runNavigationErrorHooks, shouldEmitNavigationError } from "./navigationCore.mjs";
2
1
  import { notifyRouteStateSync } from "./routeSync.mjs";
2
+ import { runAfterEachHooks, runNavigationErrorHooks, shouldEmitNavigationError } from "./navigationCore.mjs";
3
3
 
4
4
  //#region src/router/navigationResult.ts
5
5
  function createNavigationRunResult(mode, from, to, failure) {
@@ -1,8 +1,8 @@
1
- import { NavigationFailureType } from "./types.mjs";
2
- import { createNavigationFailure, executeNavigationMethod, isNavigationFailure, runNavigationGuards } from "./navigationCore.mjs";
3
1
  import { createAbsoluteRoutePath } from "../routerInternal/path.mjs";
4
2
  import { resolveMatchedRouteRecord } from "../routerInternal/matching.mjs";
5
3
  import { createNativeRouteUrl, hasLocationQuery } from "../routerInternal/snapshots.mjs";
4
+ import { NavigationFailureType } from "./types.mjs";
5
+ import { createNavigationFailure, executeNavigationMethod, isNavigationFailure, runNavigationGuards } from "./navigationCore.mjs";
6
6
  import { createNavigationRunResult } from "./navigationResult.mjs";
7
7
  import { applyRedirectedFrom, createDuplicatedFailure, createHashOnlyNavigationFailure, createTabBarQueryFailure, createTooManyRedirectsFailure, resolveRouteRecordRedirect } from "./navigationTargetHelpers.mjs";
8
8
 
@@ -1,6 +1,6 @@
1
+ import { cloneRouteLocationRedirectedFrom, createRedirectedFromSnapshot } from "../routerInternal/snapshots.mjs";
1
2
  import { NavigationFailureType } from "./types.mjs";
2
3
  import { createNavigationFailure, isNavigationRedirectCandidate } from "./navigationCore.mjs";
3
- import { cloneRouteLocationRedirectedFrom, createRedirectedFromSnapshot } from "../routerInternal/snapshots.mjs";
4
4
 
5
5
  //#region src/router/navigationTargetHelpers.ts
6
6
  function createDuplicatedFailure(target, from) {
@@ -1 +1 @@
1
- {"version":3,"file":"types.mjs","names":[],"sources":["../../../src/router/types.ts"],"sourcesContent":["import type {\n SetupContextRouter,\n TypedRouterTabBarUrl,\n} from '../runtime/types/props'\n\nexport type LocationQueryValue = string | null\nexport type LocationQueryValueRaw = LocationQueryValue | number | boolean | undefined\nexport type LocationQuery = Record<string, LocationQueryValue | LocationQueryValue[]>\nexport type LocationQueryRaw = Record<string, LocationQueryValueRaw | LocationQueryValueRaw[]>\nexport type RouteParamValue = string\nexport type RouteParamValueRaw = RouteParamValue | number | boolean | null | undefined\nexport type RouteParams = Record<string, RouteParamValue | RouteParamValue[]>\nexport type RouteParamsRaw = Record<string, RouteParamValueRaw | RouteParamValueRaw[]>\nexport type RouteParamsMode = 'loose' | 'strict'\nexport type RouteQueryParser = (search: string) => LocationQueryRaw | LocationQuery\nexport type RouteQueryStringifier = (query: LocationQueryRaw | LocationQuery) => string\nexport type RouteMeta = Record<string, unknown>\nexport interface NamedRouteRecord {\n name: string\n path: string\n}\nexport interface RouteRecordInput {\n name?: string\n path: string\n meta?: RouteMeta\n alias?: string | readonly string[]\n children?: readonly RouteRecordInput[]\n beforeEnter?: NavigationGuard | readonly NavigationGuard[]\n redirect?: RouteRecordRedirect\n}\nexport type NamedRoutes = Readonly<Record<string, string>> | readonly RouteRecordRaw[]\n\nexport type RouteLocationRaw = string | {\n path?: string\n fullPath?: string\n query?: LocationQueryRaw\n hash?: string\n name?: string\n params?: RouteParamsRaw\n}\n\nexport interface RouteLocationNormalizedLoaded {\n path: string\n fullPath: string\n query: LocationQuery\n hash: string\n name?: string\n meta?: RouteMeta\n href?: string\n matched?: readonly RouteRecordMatched[]\n redirectedFrom?: RouteLocationRedirectedFrom\n params: RouteParams\n}\n\nexport const NavigationFailureType = {\n unknown: 1,\n aborted: 4,\n cancelled: 8,\n duplicated: 16,\n} as const\n\nexport type NavigationFailureTypeValue = (typeof NavigationFailureType)[keyof typeof NavigationFailureType]\n\nexport interface NavigationFailure extends Error {\n readonly __wevuNavigationFailure: true\n readonly type: NavigationFailureTypeValue\n readonly to?: RouteLocationNormalizedLoaded\n readonly from?: RouteLocationNormalizedLoaded\n readonly cause?: unknown\n}\n\nexport type NavigationMode = 'push' | 'replace' | 'back'\nexport interface NavigationRedirect {\n to: RouteLocationRaw\n replace?: boolean\n}\nexport type RouteRecordRedirect = RouteLocationRaw | NavigationRedirect | ((\n to: RouteLocationNormalizedLoaded,\n from: RouteLocationNormalizedLoaded,\n) => RouteLocationRaw | NavigationRedirect | Promise<RouteLocationRaw | NavigationRedirect>)\nexport interface RouteRecordRaw extends Omit<RouteRecordInput, 'name' | 'children'>, NamedRouteRecord {\n children?: readonly RouteRecordRaw[]\n}\n\nexport interface RouteRecordMatched {\n name: string\n path: string\n aliasPath?: string\n meta?: RouteMeta\n}\n\nexport interface RouteLocationRedirectedFrom {\n path: string\n fullPath: string\n query: LocationQuery\n hash: string\n name?: string\n meta?: RouteMeta\n href?: string\n matched?: readonly RouteRecordMatched[]\n params: RouteParams\n}\n\nexport type NavigationGuardResult = void | boolean | NavigationFailure | RouteLocationRaw | NavigationRedirect\nexport type NavigationGuard = (\n to: RouteLocationNormalizedLoaded | undefined,\n from: RouteLocationNormalizedLoaded,\n context?: NavigationGuardContext,\n) => NavigationGuardResult | Promise<NavigationGuardResult>\nexport type NavigationAfterEach = (\n to: RouteLocationNormalizedLoaded | undefined,\n from: RouteLocationNormalizedLoaded,\n failure?: NavigationFailure,\n context?: NavigationAfterEachContext,\n) => void | Promise<void>\n\nexport interface NavigationGuardContext {\n readonly mode: NavigationMode\n readonly to?: RouteLocationNormalizedLoaded\n readonly from: RouteLocationNormalizedLoaded\n readonly nativeRouter: SetupContextRouter\n}\n\nexport interface NavigationAfterEachContext {\n readonly mode: NavigationMode\n readonly to?: RouteLocationNormalizedLoaded\n readonly from: RouteLocationNormalizedLoaded\n readonly nativeRouter: SetupContextRouter\n readonly failure?: NavigationFailure\n}\n\nexport interface NavigationErrorContext {\n readonly mode: NavigationMode\n readonly to?: RouteLocationNormalizedLoaded\n readonly from: RouteLocationNormalizedLoaded\n readonly nativeRouter: SetupContextRouter\n readonly failure: NavigationFailure\n}\n\nexport type NavigationErrorHandler = (\n error: unknown,\n context: NavigationErrorContext,\n) => void | Promise<void>\n\nexport interface UseRouterOptions {\n tabBarEntries?: readonly (TypedRouterTabBarUrl | string)[]\n /**\n * Vue Router 对齐入口:推荐使用 `routes`\n */\n routes?: readonly RouteRecordInput[]\n /**\n * 兼容入口:支持对象 map 或路由记录数组\n */\n namedRoutes?: NamedRoutes\n paramsMode?: RouteParamsMode\n maxRedirects?: number\n parseQuery?: RouteQueryParser\n stringifyQuery?: RouteQueryStringifier\n /**\n * 异常型导航失败时是否以 Promise reject 抛出失败对象。\n *\n * - `true`:更贴近 Vue Router 心智(默认)\n * - `false`:始终以返回值形式携带失败对象\n */\n rejectOnError?: boolean\n}\n\nexport interface RouterNavigation {\n readonly nativeRouter: SetupContextRouter\n readonly options: Readonly<UseRouterOptions>\n readonly currentRoute: Readonly<RouteLocationNormalizedLoaded>\n install: (app?: unknown) => void\n resolve: (to: RouteLocationRaw) => RouteLocationNormalizedLoaded\n isReady: () => Promise<void>\n push: (to: RouteLocationRaw) => Promise<void | NavigationFailure>\n replace: (to: RouteLocationRaw) => Promise<void | NavigationFailure>\n back: (delta?: number) => Promise<void | NavigationFailure>\n go: (delta: number) => Promise<void | NavigationFailure>\n forward: () => Promise<void | NavigationFailure>\n hasRoute: (name: string) => boolean\n getRoutes: () => readonly RouteRecordRaw[]\n addRoute: AddRoute\n removeRoute: (name: string) => void\n clearRoutes: () => void\n beforeEach: (guard: NavigationGuard) => () => void\n beforeResolve: (guard: NavigationGuard) => () => void\n afterEach: (hook: NavigationAfterEach) => () => void\n onError: (handler: NavigationErrorHandler) => () => void\n}\n\nexport interface AddRoute {\n (route: RouteRecordRaw): () => void\n (parentName: string, route: RouteRecordRaw): () => void\n}\n"],"mappings":";AAsDA,MAAa,wBAAwB;CACnC,SAAS;CACT,SAAS;CACT,WAAW;CACX,YAAY;AACd"}
1
+ {"version":3,"file":"types.mjs","names":[],"sources":["../../../src/router/types.ts"],"sourcesContent":["import type {\n SetupContextRouter,\n TypedRouterTabBarUrl,\n} from '../runtime/types/props'\n\nexport type LocationQueryValue = string | null\nexport type LocationQueryValueRaw = LocationQueryValue | number | boolean | undefined\nexport type LocationQuery = Record<string, LocationQueryValue | LocationQueryValue[]>\nexport type LocationQueryRaw = Record<string, LocationQueryValueRaw | LocationQueryValueRaw[]>\nexport type RouteParamValue = string\nexport type RouteParamValueRaw = RouteParamValue | number | boolean | null | undefined\nexport type RouteParams = Record<string, RouteParamValue | RouteParamValue[]>\nexport type RouteParamsRaw = Record<string, RouteParamValueRaw | RouteParamValueRaw[]>\nexport type RouteParamsMode = 'loose' | 'strict'\nexport type RouteQueryParser = (search: string) => LocationQueryRaw | LocationQuery\nexport type RouteQueryStringifier = (query: LocationQueryRaw | LocationQuery) => string\nexport type RouteMeta = Record<string, unknown>\nexport interface NamedRouteRecord {\n name: string\n path: string\n}\nexport interface RouteRecordInput {\n name?: string\n path: string\n meta?: RouteMeta\n alias?: string | readonly string[]\n children?: readonly RouteRecordInput[]\n beforeEnter?: NavigationGuard | readonly NavigationGuard[]\n redirect?: RouteRecordRedirect\n}\nexport type NamedRoutes = Readonly<Record<string, string>> | readonly RouteRecordRaw[]\n\nexport type RouteLocationRaw = string | {\n path?: string\n fullPath?: string\n query?: LocationQueryRaw\n hash?: string\n name?: string\n params?: RouteParamsRaw\n}\n\nexport interface RouteLocationNormalizedLoaded {\n path: string\n fullPath: string\n query: LocationQuery\n hash: string\n name?: string\n meta?: RouteMeta\n href?: string\n matched?: readonly RouteRecordMatched[]\n redirectedFrom?: RouteLocationRedirectedFrom\n params: RouteParams\n}\n\nexport const NavigationFailureType = {\n unknown: 1,\n aborted: 4,\n cancelled: 8,\n duplicated: 16,\n} as const\n\nexport type NavigationFailureTypeValue = (typeof NavigationFailureType)[keyof typeof NavigationFailureType]\n\nexport interface NavigationFailure extends Error {\n readonly __wevuNavigationFailure: true\n readonly type: NavigationFailureTypeValue\n readonly to?: RouteLocationNormalizedLoaded\n readonly from?: RouteLocationNormalizedLoaded\n readonly cause?: unknown\n}\n\nexport type NavigationMode = 'push' | 'replace' | 'back'\nexport type InitialNavigationMode = 'eager' | 'blocking'\nexport interface NavigationRedirect {\n to: RouteLocationRaw\n replace?: boolean\n}\nexport type RouteRecordRedirect = RouteLocationRaw | NavigationRedirect | ((\n to: RouteLocationNormalizedLoaded,\n from: RouteLocationNormalizedLoaded,\n) => RouteLocationRaw | NavigationRedirect | Promise<RouteLocationRaw | NavigationRedirect>)\nexport interface RouteRecordRaw extends Omit<RouteRecordInput, 'name' | 'children'>, NamedRouteRecord {\n children?: readonly RouteRecordRaw[]\n}\n\nexport interface RouteRecordMatched {\n name: string\n path: string\n aliasPath?: string\n meta?: RouteMeta\n}\n\nexport interface RouteLocationRedirectedFrom {\n path: string\n fullPath: string\n query: LocationQuery\n hash: string\n name?: string\n meta?: RouteMeta\n href?: string\n matched?: readonly RouteRecordMatched[]\n params: RouteParams\n}\n\nexport type NavigationGuardResult = void | boolean | NavigationFailure | RouteLocationRaw | NavigationRedirect\nexport type NavigationGuard = (\n to: RouteLocationNormalizedLoaded | undefined,\n from: RouteLocationNormalizedLoaded,\n context?: NavigationGuardContext,\n) => NavigationGuardResult | Promise<NavigationGuardResult>\nexport type NavigationAfterEach = (\n to: RouteLocationNormalizedLoaded | undefined,\n from: RouteLocationNormalizedLoaded,\n failure?: NavigationFailure,\n context?: NavigationAfterEachContext,\n) => void | Promise<void>\n\nexport interface NavigationGuardContext {\n readonly mode: NavigationMode\n readonly to?: RouteLocationNormalizedLoaded\n readonly from: RouteLocationNormalizedLoaded\n readonly nativeRouter: SetupContextRouter\n}\n\nexport interface NavigationAfterEachContext {\n readonly mode: NavigationMode\n readonly to?: RouteLocationNormalizedLoaded\n readonly from: RouteLocationNormalizedLoaded\n readonly nativeRouter: SetupContextRouter\n readonly failure?: NavigationFailure\n}\n\nexport interface NavigationErrorContext {\n readonly mode: NavigationMode\n readonly to?: RouteLocationNormalizedLoaded\n readonly from: RouteLocationNormalizedLoaded\n readonly nativeRouter: SetupContextRouter\n readonly failure: NavigationFailure\n}\n\nexport type NavigationErrorHandler = (\n error: unknown,\n context: NavigationErrorContext,\n) => void | Promise<void>\n\nexport interface UseRouterOptions {\n tabBarEntries?: readonly (TypedRouterTabBarUrl | string)[]\n /**\n * Vue Router 对齐入口:推荐使用 `routes`\n */\n routes?: readonly RouteRecordInput[]\n /**\n * 兼容入口:支持对象 map 或路由记录数组\n */\n namedRoutes?: NamedRoutes\n paramsMode?: RouteParamsMode\n maxRedirects?: number\n /**\n * 首屏导航守卫模式。默认立即挂载页面,只有明确配置 `blocking` 时才等待守卫完成。\n */\n initialNavigationMode?: InitialNavigationMode\n /**\n * blocking 首屏导航守卫的最大等待时间(毫秒),超时后放行页面挂载。\n */\n initialNavigationTimeout?: number\n parseQuery?: RouteQueryParser\n stringifyQuery?: RouteQueryStringifier\n /**\n * 异常型导航失败时是否以 Promise reject 抛出失败对象。\n *\n * - `true`:更贴近 Vue Router 心智(默认)\n * - `false`:始终以返回值形式携带失败对象\n */\n rejectOnError?: boolean\n}\n\nexport interface RouterNavigation {\n readonly nativeRouter: SetupContextRouter\n readonly options: Readonly<UseRouterOptions>\n readonly currentRoute: Readonly<RouteLocationNormalizedLoaded>\n install: (app?: unknown) => void\n resolve: (to: RouteLocationRaw) => RouteLocationNormalizedLoaded\n isReady: () => Promise<void>\n push: (to: RouteLocationRaw) => Promise<void | NavigationFailure>\n replace: (to: RouteLocationRaw) => Promise<void | NavigationFailure>\n back: (delta?: number) => Promise<void | NavigationFailure>\n go: (delta: number) => Promise<void | NavigationFailure>\n forward: () => Promise<void | NavigationFailure>\n hasRoute: (name: string) => boolean\n getRoutes: () => readonly RouteRecordRaw[]\n addRoute: AddRoute\n removeRoute: (name: string) => void\n clearRoutes: () => void\n beforeEach: (guard: NavigationGuard) => () => void\n beforeResolve: (guard: NavigationGuard) => () => void\n afterEach: (hook: NavigationAfterEach) => () => void\n onError: (handler: NavigationErrorHandler) => () => void\n}\n\nexport interface AddRoute {\n (route: RouteRecordRaw): () => void\n (parentName: string, route: RouteRecordRaw): () => void\n}\n"],"mappings":";AAsDA,MAAa,wBAAwB;CACnC,SAAS;CACT,SAAS;CACT,WAAW;CACX,YAAY;AACd"}
@@ -1,5 +1,6 @@
1
1
  import { reactive } from "../reactivity/reactive.mjs";
2
2
  import { readonly } from "../reactivity/readonly.mjs";
3
+ import { getCurrentMiniProgramPages } from "../runtime/platform.mjs";
3
4
  import { getCurrentSetupContext } from "../runtime/hooks/base.mjs";
4
5
  import { onLoad, onReady, onRouteDone, onShow, onUnload } from "../runtime/hooks/register.mjs";
5
6
  import { getActiveRouter } from "./instance.mjs";
@@ -10,6 +11,16 @@ import { useNativePageRouter as useNativePageRouter$1, useNativeRouter as useNat
10
11
  import { resolveRouteLocation } from "./resolve.mjs";
11
12
 
12
13
  //#region src/router/useRoute.ts
14
+ function isPageLikeInstance(instance) {
15
+ return typeof instance.route === "string" || typeof instance.__route__ === "string";
16
+ }
17
+ function shouldSyncRouteStateForInstance(instance, isPageController, payload) {
18
+ if ((payload === null || payload === void 0 ? void 0 : payload.source) === "router") return true;
19
+ if (!isPageController) return true;
20
+ if (payload === null || payload === void 0 ? void 0 : payload.page) return payload.page === instance;
21
+ const pages = getCurrentMiniProgramPages();
22
+ return pages[pages.length - 1] === instance;
23
+ }
13
24
  function applyRouteState(routeState, nextRoute) {
14
25
  routeState.path = nextRoute.path;
15
26
  routeState.fullPath = nextRoute.fullPath;
@@ -37,6 +48,7 @@ function createRouteStateController(options = {}) {
37
48
  return (_getActiveRouter$reso = (_getActiveRouter = getActiveRouter()) === null || _getActiveRouter === void 0 ? void 0 : _getActiveRouter.resolve(route)) !== null && _getActiveRouter$reso !== void 0 ? _getActiveRouter$reso : route;
38
49
  });
39
50
  const currentRoute = resolveRoute(resolveCurrentRoute(void 0, fallbackPage));
51
+ const isPageController = isPageLikeInstance(fallbackPage) || getCurrentMiniProgramPages().includes(fallbackPage);
40
52
  const routeState = reactive({
41
53
  path: currentRoute.path,
42
54
  fullPath: currentRoute.fullPath,
@@ -66,6 +78,7 @@ function createRouteStateController(options = {}) {
66
78
  syncRoute();
67
79
  });
68
80
  const unregisterRouteStateSync = registerRouteStateSyncHandler((payload) => {
81
+ if (!shouldSyncRouteStateForInstance(fallbackPage, isPageController, payload)) return;
69
82
  if (payload === null || payload === void 0 ? void 0 : payload.route) {
70
83
  syncRoute(void 0, payload.route, payload);
71
84
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"useRoute.mjs","names":["useNativeRouterInternal","useNativePageRouterInternal"],"sources":["../../../src/router/useRoute.ts"],"sourcesContent":["import type { MiniProgramPageLifetime } from '../runtime/types'\nimport type { SetupContextRouter } from '../runtime/types/props'\nimport type { RouteStateSyncPayload } from './routeSync'\nimport type { LocationQueryRaw, RouteLocationNormalizedLoaded } from './types'\nimport { reactive, readonly } from '../reactivity'\nimport { cloneLocationQuery, cloneRouteLocationRedirectedFrom, cloneRouteMeta, cloneRouteParams, cloneRouteRecordMatchedList, resolveCurrentRoute, resolvePageRoute } from '../routerInternal/shared'\nimport { getCurrentSetupContext, onLoad, onReady, onRouteDone, onShow, onUnload } from '../runtime/hooks'\nimport {\n useNativePageRouter as useNativePageRouterInternal,\n useNativeRouter as useNativeRouterInternal,\n} from '../runtime/vueCompat'\nimport { getActiveRouter } from './instance'\nimport { resolveRouteLocation } from './resolve'\nimport { registerRouteStateSyncHandler } from './routeSync'\n\nexport interface UseRouteOptions {\n resolveRoute?: (route: RouteLocationNormalizedLoaded) => RouteLocationNormalizedLoaded\n}\n\ninterface RouteStateControllerOptions extends UseRouteOptions {\n beforeRouteStateSync?: (\n nextRoute: RouteLocationNormalizedLoaded,\n payload: RouteStateSyncPayload,\n ) => void\n}\n\nexport interface RouteStateController {\n route: Readonly<RouteLocationNormalizedLoaded>\n}\n\nfunction applyRouteState(\n routeState: RouteLocationNormalizedLoaded,\n nextRoute: RouteLocationNormalizedLoaded,\n) {\n routeState.path = nextRoute.path\n routeState.fullPath = nextRoute.fullPath\n routeState.query = cloneLocationQuery(nextRoute.query)\n routeState.hash = nextRoute.hash\n routeState.params = cloneRouteParams(nextRoute.params)\n if (nextRoute.name === undefined) {\n delete (routeState as Partial<RouteLocationNormalizedLoaded>).name\n }\n else {\n routeState.name = nextRoute.name\n }\n if (nextRoute.meta === undefined) {\n delete (routeState as Partial<RouteLocationNormalizedLoaded>).meta\n }\n else {\n routeState.meta = cloneRouteMeta(nextRoute.meta)\n }\n if (nextRoute.href === undefined) {\n delete (routeState as Partial<RouteLocationNormalizedLoaded>).href\n }\n else {\n routeState.href = nextRoute.href\n }\n if (nextRoute.matched === undefined) {\n delete (routeState as Partial<RouteLocationNormalizedLoaded>).matched\n }\n else {\n routeState.matched = cloneRouteRecordMatchedList(nextRoute.matched)\n }\n if (nextRoute.redirectedFrom === undefined) {\n delete (routeState as Partial<RouteLocationNormalizedLoaded>).redirectedFrom\n }\n else {\n routeState.redirectedFrom = cloneRouteLocationRedirectedFrom(nextRoute.redirectedFrom)\n }\n}\n\nexport function createRouteStateController(options: RouteStateControllerOptions = {}): RouteStateController {\n const setupContext = getCurrentSetupContext()\n if (!setupContext) {\n throw new Error('useRoute() 必须在 setup() 的同步阶段调用')\n }\n\n const fallbackPage = setupContext.instance\n const resolveRoute = options.resolveRoute\n ?? ((route: RouteLocationNormalizedLoaded) => getActiveRouter()?.resolve(route) ?? route)\n const currentRoute = resolveRoute(resolveCurrentRoute(undefined, fallbackPage))\n const routeState = reactive<RouteLocationNormalizedLoaded>({\n path: currentRoute.path,\n fullPath: currentRoute.fullPath,\n query: cloneLocationQuery(currentRoute.query),\n hash: currentRoute.hash,\n params: cloneRouteParams(currentRoute.params),\n })\n applyRouteState(routeState, currentRoute)\n\n function syncRoute(\n queryOverride?: LocationQueryRaw,\n routeOverride?: RouteLocationNormalizedLoaded,\n payload?: RouteStateSyncPayload,\n ) {\n const nextRoute = routeOverride\n ? resolveRoute(routeOverride)\n : resolveRoute(resolveCurrentRoute(queryOverride, fallbackPage))\n if (payload) {\n options.beforeRouteStateSync?.(nextRoute, payload)\n }\n applyRouteState(routeState, nextRoute)\n }\n\n onLoad((query: Parameters<NonNullable<MiniProgramPageLifetime['onLoad']>>[0]) => {\n syncRoute(query as unknown as LocationQueryRaw)\n })\n onReady(() => {\n syncRoute()\n })\n onShow(() => {\n syncRoute()\n })\n onRouteDone(() => {\n syncRoute()\n })\n const unregisterRouteStateSync = registerRouteStateSyncHandler((payload) => {\n if (payload?.route) {\n syncRoute(undefined, payload.route, payload)\n return\n }\n if (payload?.page) {\n syncRoute(undefined, resolvePageRoute(payload.page), payload)\n return\n }\n if (payload?.url) {\n syncRoute(undefined, resolveRouteLocation(payload.url, routeState.path), payload)\n return\n }\n syncRoute(undefined, undefined, payload)\n })\n onUnload(() => {\n unregisterRouteStateSync()\n })\n\n return {\n route: readonly(routeState) as Readonly<RouteLocationNormalizedLoaded>,\n }\n}\n\nexport function useRoute(options: UseRouteOptions = {}): Readonly<RouteLocationNormalizedLoaded> {\n return createRouteStateController(options).route\n}\n\n/**\n * @description 获取当前组件路径语义的原生 Router\n */\nexport function useNativeRouter(): SetupContextRouter {\n return useNativeRouterInternal()\n}\n\n/**\n * @description 获取当前页面路径语义的原生 Page Router\n */\nexport function useNativePageRouter(): SetupContextRouter {\n return useNativePageRouterInternal()\n}\n"],"mappings":";;;;;;;;;;;;AA8BA,SAAS,gBACP,YACA,WACA;CACA,WAAW,OAAO,UAAU;CAC5B,WAAW,WAAW,UAAU;CAChC,WAAW,QAAQ,mBAAmB,UAAU,KAAK;CACrD,WAAW,OAAO,UAAU;CAC5B,WAAW,SAAS,iBAAiB,UAAU,MAAM;CACrD,IAAI,UAAU,SAAS,QACrB,OAAQ,WAAsD;MAG9D,WAAW,OAAO,UAAU;CAE9B,IAAI,UAAU,SAAS,QACrB,OAAQ,WAAsD;MAG9D,WAAW,OAAO,eAAe,UAAU,IAAI;CAEjD,IAAI,UAAU,SAAS,QACrB,OAAQ,WAAsD;MAG9D,WAAW,OAAO,UAAU;CAE9B,IAAI,UAAU,YAAY,QACxB,OAAQ,WAAsD;MAG9D,WAAW,UAAU,4BAA4B,UAAU,OAAO;CAEpE,IAAI,UAAU,mBAAmB,QAC/B,OAAQ,WAAsD;MAG9D,WAAW,iBAAiB,iCAAiC,UAAU,cAAc;AAEzF;AAEA,SAAgB,2BAA2B,UAAuC,CAAC,GAAyB;;CAC1G,MAAM,eAAe,uBAAuB;CAC5C,IAAI,CAAC,cACH,MAAM,IAAI,MAAM,gCAAgC;CAGlD,MAAM,eAAe,aAAa;CAClC,MAAM,wCAAe,QAAQ,uFACtB,UAAyC;;sEAAgB,uEAAG,QAAQ,KAAK,0EAAK;CAAI;CACzF,MAAM,eAAe,aAAa,oBAAoB,QAAW,YAAY,CAAC;CAC9E,MAAM,aAAa,SAAwC;EACzD,MAAM,aAAa;EACnB,UAAU,aAAa;EACvB,OAAO,mBAAmB,aAAa,KAAK;EAC5C,MAAM,aAAa;EACnB,QAAQ,iBAAiB,aAAa,MAAM;CAC9C,CAAC;CACD,gBAAgB,YAAY,YAAY;CAExC,SAAS,UACP,eACA,eACA,SACA;EACA,MAAM,YAAY,gBACd,aAAa,aAAa,IAC1B,aAAa,oBAAoB,eAAe,YAAY,CAAC;EACjE,IAAI,SAAS;;GACX,iCAAQ,0GAAuB,WAAW,OAAO;EACnD;EACA,gBAAgB,YAAY,SAAS;CACvC;CAEA,QAAQ,UAAyE;EAC/E,UAAU,KAAoC;CAChD,CAAC;CACD,cAAc;EACZ,UAAU;CACZ,CAAC;CACD,aAAa;EACX,UAAU;CACZ,CAAC;CACD,kBAAkB;EAChB,UAAU;CACZ,CAAC;CACD,MAAM,2BAA2B,+BAA+B,YAAY;EAC1E,sDAAI,QAAS,OAAO;GAClB,UAAU,QAAW,QAAQ,OAAO,OAAO;GAC3C;EACF;EACA,sDAAI,QAAS,MAAM;GACjB,UAAU,QAAW,iBAAiB,QAAQ,IAAI,GAAG,OAAO;GAC5D;EACF;EACA,sDAAI,QAAS,KAAK;GAChB,UAAU,QAAW,qBAAqB,QAAQ,KAAK,WAAW,IAAI,GAAG,OAAO;GAChF;EACF;EACA,UAAU,QAAW,QAAW,OAAO;CACzC,CAAC;CACD,eAAe;EACb,yBAAyB;CAC3B,CAAC;CAED,OAAO,EACL,OAAO,SAAS,UAAU,EAC5B;AACF;AAEA,SAAgB,SAAS,UAA2B,CAAC,GAA4C;CAC/F,OAAO,2BAA2B,OAAO,CAAC,CAAC;AAC7C;;;;AAKA,SAAgB,kBAAsC;CACpD,OAAOA,kBAAwB;AACjC;;;;AAKA,SAAgB,sBAA0C;CACxD,OAAOC,sBAA4B;AACrC"}
1
+ {"version":3,"file":"useRoute.mjs","names":["useNativeRouterInternal","useNativePageRouterInternal"],"sources":["../../../src/router/useRoute.ts"],"sourcesContent":["import type { MiniProgramPageLifetime } from '../runtime/types'\nimport type { SetupContextRouter } from '../runtime/types/props'\nimport type { RouteStateSyncPayload } from './routeSync'\nimport type { LocationQueryRaw, RouteLocationNormalizedLoaded } from './types'\nimport { reactive, readonly } from '../reactivity'\nimport { cloneLocationQuery, cloneRouteLocationRedirectedFrom, cloneRouteMeta, cloneRouteParams, cloneRouteRecordMatchedList, resolveCurrentRoute, resolvePageRoute } from '../routerInternal/shared'\nimport { getCurrentSetupContext, onLoad, onReady, onRouteDone, onShow, onUnload } from '../runtime/hooks'\nimport { getCurrentMiniProgramPages } from '../runtime/platform'\nimport {\n useNativePageRouter as useNativePageRouterInternal,\n useNativeRouter as useNativeRouterInternal,\n} from '../runtime/vueCompat'\nimport { getActiveRouter } from './instance'\nimport { resolveRouteLocation } from './resolve'\nimport { registerRouteStateSyncHandler } from './routeSync'\n\nexport interface UseRouteOptions {\n resolveRoute?: (route: RouteLocationNormalizedLoaded) => RouteLocationNormalizedLoaded\n}\n\ninterface RouteStateControllerOptions extends UseRouteOptions {\n beforeRouteStateSync?: (\n nextRoute: RouteLocationNormalizedLoaded,\n payload: RouteStateSyncPayload,\n ) => void\n}\n\nexport interface RouteStateController {\n route: Readonly<RouteLocationNormalizedLoaded>\n}\n\nfunction isPageLikeInstance(instance: Record<string, any>): boolean {\n return typeof instance.route === 'string' || typeof instance.__route__ === 'string'\n}\n\nfunction shouldSyncRouteStateForInstance(\n instance: Record<string, any>,\n isPageController: boolean,\n payload: RouteStateSyncPayload | undefined,\n): boolean {\n if (payload?.source === 'router') {\n return true\n }\n\n // 页面级 route controller 只处理当前页面的广播,避免 DevTools 在 onUnload/onShow\n // 交错时让隐藏页面重复执行导航守卫。组件级 controller 仍接收全局同步。\n if (!isPageController) {\n return true\n }\n\n if (payload?.page) {\n return payload.page === instance\n }\n\n const pages = getCurrentMiniProgramPages()\n return pages[pages.length - 1] === instance\n}\n\nfunction applyRouteState(\n routeState: RouteLocationNormalizedLoaded,\n nextRoute: RouteLocationNormalizedLoaded,\n) {\n routeState.path = nextRoute.path\n routeState.fullPath = nextRoute.fullPath\n routeState.query = cloneLocationQuery(nextRoute.query)\n routeState.hash = nextRoute.hash\n routeState.params = cloneRouteParams(nextRoute.params)\n if (nextRoute.name === undefined) {\n delete (routeState as Partial<RouteLocationNormalizedLoaded>).name\n }\n else {\n routeState.name = nextRoute.name\n }\n if (nextRoute.meta === undefined) {\n delete (routeState as Partial<RouteLocationNormalizedLoaded>).meta\n }\n else {\n routeState.meta = cloneRouteMeta(nextRoute.meta)\n }\n if (nextRoute.href === undefined) {\n delete (routeState as Partial<RouteLocationNormalizedLoaded>).href\n }\n else {\n routeState.href = nextRoute.href\n }\n if (nextRoute.matched === undefined) {\n delete (routeState as Partial<RouteLocationNormalizedLoaded>).matched\n }\n else {\n routeState.matched = cloneRouteRecordMatchedList(nextRoute.matched)\n }\n if (nextRoute.redirectedFrom === undefined) {\n delete (routeState as Partial<RouteLocationNormalizedLoaded>).redirectedFrom\n }\n else {\n routeState.redirectedFrom = cloneRouteLocationRedirectedFrom(nextRoute.redirectedFrom)\n }\n}\n\nexport function createRouteStateController(options: RouteStateControllerOptions = {}): RouteStateController {\n const setupContext = getCurrentSetupContext()\n if (!setupContext) {\n throw new Error('useRoute() 必须在 setup() 的同步阶段调用')\n }\n\n const fallbackPage = setupContext.instance\n const resolveRoute = options.resolveRoute\n ?? ((route: RouteLocationNormalizedLoaded) => getActiveRouter()?.resolve(route) ?? route)\n const currentRoute = resolveRoute(resolveCurrentRoute(undefined, fallbackPage))\n const isPageController = isPageLikeInstance(fallbackPage)\n || getCurrentMiniProgramPages().includes(fallbackPage)\n const routeState = reactive<RouteLocationNormalizedLoaded>({\n path: currentRoute.path,\n fullPath: currentRoute.fullPath,\n query: cloneLocationQuery(currentRoute.query),\n hash: currentRoute.hash,\n params: cloneRouteParams(currentRoute.params),\n })\n applyRouteState(routeState, currentRoute)\n\n function syncRoute(\n queryOverride?: LocationQueryRaw,\n routeOverride?: RouteLocationNormalizedLoaded,\n payload?: RouteStateSyncPayload,\n ) {\n const nextRoute = routeOverride\n ? resolveRoute(routeOverride)\n : resolveRoute(resolveCurrentRoute(queryOverride, fallbackPage))\n if (payload) {\n options.beforeRouteStateSync?.(nextRoute, payload)\n }\n applyRouteState(routeState, nextRoute)\n }\n\n onLoad((query: Parameters<NonNullable<MiniProgramPageLifetime['onLoad']>>[0]) => {\n syncRoute(query as unknown as LocationQueryRaw)\n })\n onReady(() => {\n syncRoute()\n })\n onShow(() => {\n syncRoute()\n })\n onRouteDone(() => {\n syncRoute()\n })\n const unregisterRouteStateSync = registerRouteStateSyncHandler((payload) => {\n if (!shouldSyncRouteStateForInstance(fallbackPage, isPageController, payload)) {\n return\n }\n if (payload?.route) {\n syncRoute(undefined, payload.route, payload)\n return\n }\n if (payload?.page) {\n syncRoute(undefined, resolvePageRoute(payload.page), payload)\n return\n }\n if (payload?.url) {\n syncRoute(undefined, resolveRouteLocation(payload.url, routeState.path), payload)\n return\n }\n syncRoute(undefined, undefined, payload)\n })\n onUnload(() => {\n unregisterRouteStateSync()\n })\n\n return {\n route: readonly(routeState) as Readonly<RouteLocationNormalizedLoaded>,\n }\n}\n\nexport function useRoute(options: UseRouteOptions = {}): Readonly<RouteLocationNormalizedLoaded> {\n return createRouteStateController(options).route\n}\n\n/**\n * @description 获取当前组件路径语义的原生 Router\n */\nexport function useNativeRouter(): SetupContextRouter {\n return useNativeRouterInternal()\n}\n\n/**\n * @description 获取当前页面路径语义的原生 Page Router\n */\nexport function useNativePageRouter(): SetupContextRouter {\n return useNativePageRouterInternal()\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
+ import { parseQuery, stringifyQuery } from "./routerInternal/query.mjs";
1
2
  import { NavigationFailureType } from "./router/types.mjs";
2
3
  import { createNavigationFailure, isNavigationFailure } from "./router/navigationCore.mjs";
3
- import { parseQuery, stringifyQuery } from "./routerInternal/query.mjs";
4
4
  import { resolveRouteLocation } from "./router/resolve.mjs";
5
5
  import { useNativePageRouter, useNativeRouter, useRoute } from "./router/useRoute.mjs";
6
6
  import { createRouter } from "./router/createRouter.mjs";
@@ -19,7 +19,7 @@ function freezeRouteRecordRawSnapshot(routeRecord) {
19
19
  if (routeRecord.redirect !== void 0) snapshot.redirect = routeRecord.redirect;
20
20
  return Object.freeze(snapshot);
21
21
  }
22
- function createRouterOptionsSnapshot(normalizedTabBarEntries, normalizedNamedRoutes, paramsMode, maxRedirects, routeResolveCodec, rejectOnError) {
22
+ function createRouterOptionsSnapshot(normalizedTabBarEntries, normalizedNamedRoutes, paramsMode, maxRedirects, initialNavigationMode, initialNavigationTimeout, routeResolveCodec, rejectOnError) {
23
23
  const tabBarEntriesSnapshot = Object.freeze(normalizedTabBarEntries.map((path) => createAbsoluteRoutePath(path)));
24
24
  const routesSnapshot = Object.freeze(normalizedNamedRoutes.map(freezeRouteRecordRawSnapshot));
25
25
  return Object.freeze({
@@ -28,6 +28,8 @@ function createRouterOptionsSnapshot(normalizedTabBarEntries, normalizedNamedRou
28
28
  namedRoutes: routesSnapshot,
29
29
  paramsMode,
30
30
  maxRedirects,
31
+ initialNavigationMode,
32
+ initialNavigationTimeout,
31
33
  parseQuery: routeResolveCodec.parseQuery,
32
34
  stringifyQuery: routeResolveCodec.stringifyQuery,
33
35
  rejectOnError