@tanstack/vue-router 1.167.1 → 1.167.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/esm/Asset.js +107 -151
  2. package/dist/esm/Asset.js.map +1 -1
  3. package/dist/esm/Body.js +15 -24
  4. package/dist/esm/Body.js.map +1 -1
  5. package/dist/esm/CatchBoundary.js +112 -130
  6. package/dist/esm/CatchBoundary.js.map +1 -1
  7. package/dist/esm/ClientOnly.js +59 -29
  8. package/dist/esm/ClientOnly.js.map +1 -1
  9. package/dist/esm/HeadContent.dev.js +29 -23
  10. package/dist/esm/HeadContent.dev.js.map +1 -1
  11. package/dist/esm/HeadContent.js +21 -16
  12. package/dist/esm/HeadContent.js.map +1 -1
  13. package/dist/esm/Html.js +42 -61
  14. package/dist/esm/Html.js.map +1 -1
  15. package/dist/esm/Match.js +238 -319
  16. package/dist/esm/Match.js.map +1 -1
  17. package/dist/esm/Matches.js +127 -170
  18. package/dist/esm/Matches.js.map +1 -1
  19. package/dist/esm/RouterProvider.js +50 -65
  20. package/dist/esm/RouterProvider.js.map +1 -1
  21. package/dist/esm/ScriptOnce.js +31 -36
  22. package/dist/esm/ScriptOnce.js.map +1 -1
  23. package/dist/esm/Scripts.js +79 -101
  24. package/dist/esm/Scripts.js.map +1 -1
  25. package/dist/esm/ScrollRestoration.js +25 -29
  26. package/dist/esm/ScrollRestoration.js.map +1 -1
  27. package/dist/esm/Transitioner.js +146 -164
  28. package/dist/esm/Transitioner.js.map +1 -1
  29. package/dist/esm/awaited.js +27 -34
  30. package/dist/esm/awaited.js.map +1 -1
  31. package/dist/esm/fileRoute.js +90 -92
  32. package/dist/esm/fileRoute.js.map +1 -1
  33. package/dist/esm/headContentUtils.js +92 -123
  34. package/dist/esm/headContentUtils.js.map +1 -1
  35. package/dist/esm/index.dev.js +16 -118
  36. package/dist/esm/index.js +18 -119
  37. package/dist/esm/lazyRouteComponent.js +69 -82
  38. package/dist/esm/lazyRouteComponent.js.map +1 -1
  39. package/dist/esm/link.js +364 -385
  40. package/dist/esm/link.js.map +1 -1
  41. package/dist/esm/matchContext.js +16 -11
  42. package/dist/esm/matchContext.js.map +1 -1
  43. package/dist/esm/not-found.js +30 -40
  44. package/dist/esm/not-found.js.map +1 -1
  45. package/dist/esm/renderRouteNotFound.js +20 -15
  46. package/dist/esm/renderRouteNotFound.js.map +1 -1
  47. package/dist/esm/route.js +196 -174
  48. package/dist/esm/route.js.map +1 -1
  49. package/dist/esm/router.js +11 -11
  50. package/dist/esm/router.js.map +1 -1
  51. package/dist/esm/routerContext.js +10 -7
  52. package/dist/esm/routerContext.js.map +1 -1
  53. package/dist/esm/scroll-restoration.js +39 -50
  54. package/dist/esm/scroll-restoration.js.map +1 -1
  55. package/dist/esm/ssr/RouterClient.js +29 -43
  56. package/dist/esm/ssr/RouterClient.js.map +1 -1
  57. package/dist/esm/ssr/RouterServer.js +29 -32
  58. package/dist/esm/ssr/RouterServer.js.map +1 -1
  59. package/dist/esm/ssr/client.js +1 -4
  60. package/dist/esm/ssr/defaultRenderHandler.js +11 -13
  61. package/dist/esm/ssr/defaultRenderHandler.js.map +1 -1
  62. package/dist/esm/ssr/defaultStreamHandler.js +12 -15
  63. package/dist/esm/ssr/defaultStreamHandler.js.map +1 -1
  64. package/dist/esm/ssr/renderRouterToStream.js +47 -65
  65. package/dist/esm/ssr/renderRouterToStream.js.map +1 -1
  66. package/dist/esm/ssr/renderRouterToString.js +24 -32
  67. package/dist/esm/ssr/renderRouterToString.js.map +1 -1
  68. package/dist/esm/ssr/server.js +3 -10
  69. package/dist/esm/useBlocker.js +243 -287
  70. package/dist/esm/useBlocker.js.map +1 -1
  71. package/dist/esm/useCanGoBack.js +6 -5
  72. package/dist/esm/useCanGoBack.js.map +1 -1
  73. package/dist/esm/useLoaderData.js +12 -11
  74. package/dist/esm/useLoaderData.js.map +1 -1
  75. package/dist/esm/useLoaderDeps.js +12 -14
  76. package/dist/esm/useLoaderDeps.js.map +1 -1
  77. package/dist/esm/useLocation.js +6 -7
  78. package/dist/esm/useLocation.js.map +1 -1
  79. package/dist/esm/useMatch.js +27 -35
  80. package/dist/esm/useMatch.js.map +1 -1
  81. package/dist/esm/useNavigate.js +18 -24
  82. package/dist/esm/useNavigate.js.map +1 -1
  83. package/dist/esm/useParams.js +13 -12
  84. package/dist/esm/useParams.js.map +1 -1
  85. package/dist/esm/useRouteContext.js +9 -8
  86. package/dist/esm/useRouteContext.js.map +1 -1
  87. package/dist/esm/useRouter.js +9 -8
  88. package/dist/esm/useRouter.js.map +1 -1
  89. package/dist/esm/useRouterState.js +18 -22
  90. package/dist/esm/useRouterState.js.map +1 -1
  91. package/dist/esm/useSearch.js +13 -12
  92. package/dist/esm/useSearch.js.map +1 -1
  93. package/dist/esm/utils.js +59 -38
  94. package/dist/esm/utils.js.map +1 -1
  95. package/package.json +3 -3
  96. package/dist/esm/index.dev.js.map +0 -1
  97. package/dist/esm/index.js.map +0 -1
  98. package/dist/esm/ssr/client.js.map +0 -1
  99. package/dist/esm/ssr/server.js.map +0 -1
@@ -1,295 +1,251 @@
1
- import * as Vue from "vue";
2
1
  import { useRouter } from "./useRouter.js";
2
+ import * as Vue from "vue";
3
+ //#region src/useBlocker.tsx
3
4
  function _resolveBlockerOpts(opts, condition) {
4
- if (opts === void 0) {
5
- return {
6
- shouldBlockFn: () => true,
7
- withResolver: false
8
- };
9
- }
10
- if ("shouldBlockFn" in opts) {
11
- return opts;
12
- }
13
- if (typeof opts === "function") {
14
- const shouldBlock2 = Boolean(condition ?? true);
15
- const _customBlockerFn2 = async () => {
16
- if (shouldBlock2) return await opts();
17
- return false;
18
- };
19
- return {
20
- shouldBlockFn: _customBlockerFn2,
21
- enableBeforeUnload: shouldBlock2,
22
- withResolver: false
23
- };
24
- }
25
- const shouldBlock = Boolean(opts.condition ?? true);
26
- const fn = opts.blockerFn;
27
- const _customBlockerFn = async () => {
28
- if (shouldBlock && fn !== void 0) {
29
- return await fn();
30
- }
31
- return shouldBlock;
32
- };
33
- return {
34
- shouldBlockFn: _customBlockerFn,
35
- enableBeforeUnload: shouldBlock,
36
- withResolver: fn === void 0
37
- };
5
+ if (opts === void 0) return {
6
+ shouldBlockFn: () => true,
7
+ withResolver: false
8
+ };
9
+ if ("shouldBlockFn" in opts) return opts;
10
+ if (typeof opts === "function") {
11
+ const shouldBlock = Boolean(condition ?? true);
12
+ const _customBlockerFn = async () => {
13
+ if (shouldBlock) return await opts();
14
+ return false;
15
+ };
16
+ return {
17
+ shouldBlockFn: _customBlockerFn,
18
+ enableBeforeUnload: shouldBlock,
19
+ withResolver: false
20
+ };
21
+ }
22
+ const shouldBlock = Boolean(opts.condition ?? true);
23
+ const fn = opts.blockerFn;
24
+ const _customBlockerFn = async () => {
25
+ if (shouldBlock && fn !== void 0) return await fn();
26
+ return shouldBlock;
27
+ };
28
+ return {
29
+ shouldBlockFn: _customBlockerFn,
30
+ enableBeforeUnload: shouldBlock,
31
+ withResolver: fn === void 0
32
+ };
38
33
  }
34
+ /**
35
+ * @deprecated Use the shouldBlockFn property instead
36
+ */
37
+ /**
38
+ * @deprecated Use the UseBlockerOpts object syntax instead
39
+ */
39
40
  function useBlocker(opts, condition) {
40
- const {
41
- shouldBlockFn,
42
- enableBeforeUnload = true,
43
- disabled = false,
44
- withResolver = false
45
- } = _resolveBlockerOpts(opts, condition);
46
- const router = useRouter();
47
- const {
48
- history
49
- } = router;
50
- const resolver = Vue.ref({
51
- status: "idle",
52
- current: void 0,
53
- next: void 0,
54
- action: void 0,
55
- proceed: void 0,
56
- reset: void 0
57
- });
58
- Vue.watchEffect((onCleanup) => {
59
- const blockerFnComposed = async (blockerFnArgs) => {
60
- function getLocation(location) {
61
- const parsedLocation = router.parseLocation(location);
62
- const matchedRoutes = router.getMatchedRoutes(parsedLocation.pathname);
63
- if (matchedRoutes.foundRoute === void 0) {
64
- return {
65
- routeId: "__notFound__",
66
- fullPath: parsedLocation.pathname,
67
- pathname: parsedLocation.pathname,
68
- params: matchedRoutes.routeParams,
69
- search: parsedLocation.search
70
- };
71
- }
72
- return {
73
- routeId: matchedRoutes.foundRoute.id,
74
- fullPath: matchedRoutes.foundRoute.fullPath,
75
- pathname: parsedLocation.pathname,
76
- params: matchedRoutes.routeParams,
77
- search: parsedLocation.search
78
- };
79
- }
80
- const current = getLocation(blockerFnArgs.currentLocation);
81
- const next = getLocation(blockerFnArgs.nextLocation);
82
- if (current.routeId === "__notFound__" && next.routeId !== "__notFound__") {
83
- return false;
84
- }
85
- const shouldBlock = await shouldBlockFn({
86
- action: blockerFnArgs.action,
87
- current,
88
- next
89
- });
90
- if (!withResolver) {
91
- return shouldBlock;
92
- }
93
- if (!shouldBlock) {
94
- return false;
95
- }
96
- const promise = new Promise((resolve) => {
97
- resolver.value = {
98
- status: "blocked",
99
- current,
100
- next,
101
- action: blockerFnArgs.action,
102
- proceed: () => resolve(false),
103
- reset: () => resolve(true)
104
- };
105
- });
106
- const canNavigateAsync = await promise;
107
- resolver.value = {
108
- status: "idle",
109
- current: void 0,
110
- next: void 0,
111
- action: void 0,
112
- proceed: void 0,
113
- reset: void 0
114
- };
115
- return canNavigateAsync;
116
- };
117
- if (disabled) {
118
- return;
119
- }
120
- const unsubscribe = history.block({
121
- blockerFn: blockerFnComposed,
122
- enableBeforeUnload
123
- });
124
- onCleanup(() => {
125
- if (unsubscribe) unsubscribe();
126
- });
127
- });
128
- return withResolver ? resolver : void 0;
41
+ const { shouldBlockFn, enableBeforeUnload = true, disabled = false, withResolver = false } = _resolveBlockerOpts(opts, condition);
42
+ const router = useRouter();
43
+ const { history } = router;
44
+ const resolver = Vue.ref({
45
+ status: "idle",
46
+ current: void 0,
47
+ next: void 0,
48
+ action: void 0,
49
+ proceed: void 0,
50
+ reset: void 0
51
+ });
52
+ Vue.watchEffect((onCleanup) => {
53
+ const blockerFnComposed = async (blockerFnArgs) => {
54
+ function getLocation(location) {
55
+ const parsedLocation = router.parseLocation(location);
56
+ const matchedRoutes = router.getMatchedRoutes(parsedLocation.pathname);
57
+ if (matchedRoutes.foundRoute === void 0) return {
58
+ routeId: "__notFound__",
59
+ fullPath: parsedLocation.pathname,
60
+ pathname: parsedLocation.pathname,
61
+ params: matchedRoutes.routeParams,
62
+ search: parsedLocation.search
63
+ };
64
+ return {
65
+ routeId: matchedRoutes.foundRoute.id,
66
+ fullPath: matchedRoutes.foundRoute.fullPath,
67
+ pathname: parsedLocation.pathname,
68
+ params: matchedRoutes.routeParams,
69
+ search: parsedLocation.search
70
+ };
71
+ }
72
+ const current = getLocation(blockerFnArgs.currentLocation);
73
+ const next = getLocation(blockerFnArgs.nextLocation);
74
+ if (current.routeId === "__notFound__" && next.routeId !== "__notFound__") return false;
75
+ const shouldBlock = await shouldBlockFn({
76
+ action: blockerFnArgs.action,
77
+ current,
78
+ next
79
+ });
80
+ if (!withResolver) return shouldBlock;
81
+ if (!shouldBlock) return false;
82
+ const canNavigateAsync = await new Promise((resolve) => {
83
+ resolver.value = {
84
+ status: "blocked",
85
+ current,
86
+ next,
87
+ action: blockerFnArgs.action,
88
+ proceed: () => resolve(false),
89
+ reset: () => resolve(true)
90
+ };
91
+ });
92
+ resolver.value = {
93
+ status: "idle",
94
+ current: void 0,
95
+ next: void 0,
96
+ action: void 0,
97
+ proceed: void 0,
98
+ reset: void 0
99
+ };
100
+ return canNavigateAsync;
101
+ };
102
+ if (disabled) return;
103
+ const unsubscribe = history.block({
104
+ blockerFn: blockerFnComposed,
105
+ enableBeforeUnload
106
+ });
107
+ onCleanup(() => {
108
+ if (unsubscribe) unsubscribe();
109
+ });
110
+ });
111
+ return withResolver ? resolver : void 0;
129
112
  }
130
- const BlockImpl = Vue.defineComponent({
131
- name: "Block",
132
- props: {
133
- shouldBlockFn: {
134
- type: Function,
135
- required: false
136
- },
137
- enableBeforeUnload: {
138
- type: [Boolean, Function],
139
- default: true
140
- },
141
- disabled: {
142
- type: Boolean,
143
- default: false
144
- },
145
- withResolver: {
146
- type: Boolean,
147
- default: false
148
- },
149
- // Legacy props
150
- blockerFn: {
151
- type: Function,
152
- required: false
153
- },
154
- condition: {
155
- type: [Boolean, Object],
156
- required: false
157
- }
158
- },
159
- setup(props, {
160
- slots
161
- }) {
162
- const blockerArgs = Vue.computed(() => {
163
- if (props.shouldBlockFn) {
164
- return {
165
- shouldBlockFn: props.shouldBlockFn,
166
- enableBeforeUnload: props.enableBeforeUnload,
167
- disabled: props.disabled,
168
- withResolver: props.withResolver
169
- };
170
- }
171
- const shouldBlock = Boolean(props.condition ?? true);
172
- const fn = props.blockerFn;
173
- const _customBlockerFn = async () => {
174
- if (shouldBlock && fn !== void 0) {
175
- return await fn();
176
- }
177
- return shouldBlock;
178
- };
179
- return {
180
- shouldBlockFn: _customBlockerFn,
181
- enableBeforeUnload: shouldBlock,
182
- disabled: props.disabled,
183
- withResolver: fn === void 0
184
- };
185
- });
186
- const router = useRouter();
187
- const {
188
- history
189
- } = router;
190
- const resolver = Vue.ref({
191
- status: "idle",
192
- current: void 0,
193
- next: void 0,
194
- action: void 0,
195
- proceed: void 0,
196
- reset: void 0
197
- });
198
- Vue.watchEffect((onCleanup) => {
199
- const args = blockerArgs.value;
200
- if (args.disabled) {
201
- return;
202
- }
203
- const blockerFnComposed = async (blockerFnArgs) => {
204
- function getLocation(location) {
205
- const parsedLocation = router.parseLocation(location);
206
- const matchedRoutes = router.getMatchedRoutes(parsedLocation.pathname);
207
- if (matchedRoutes.foundRoute === void 0) {
208
- return {
209
- routeId: "__notFound__",
210
- fullPath: parsedLocation.pathname,
211
- pathname: parsedLocation.pathname,
212
- params: matchedRoutes.routeParams,
213
- search: parsedLocation.search
214
- };
215
- }
216
- return {
217
- routeId: matchedRoutes.foundRoute.id,
218
- fullPath: matchedRoutes.foundRoute.fullPath,
219
- pathname: parsedLocation.pathname,
220
- params: matchedRoutes.routeParams,
221
- search: parsedLocation.search
222
- };
223
- }
224
- const current = getLocation(blockerFnArgs.currentLocation);
225
- const next = getLocation(blockerFnArgs.nextLocation);
226
- if (current.routeId === "__notFound__" && next.routeId !== "__notFound__") {
227
- return false;
228
- }
229
- const shouldBlock = await args.shouldBlockFn({
230
- action: blockerFnArgs.action,
231
- current,
232
- next
233
- });
234
- if (!args.withResolver) {
235
- return shouldBlock;
236
- }
237
- if (!shouldBlock) {
238
- return false;
239
- }
240
- const promise = new Promise((resolve) => {
241
- resolver.value = {
242
- status: "blocked",
243
- current,
244
- next,
245
- action: blockerFnArgs.action,
246
- proceed: () => resolve(false),
247
- reset: () => resolve(true)
248
- };
249
- });
250
- const canNavigateAsync = await promise;
251
- resolver.value = {
252
- status: "idle",
253
- current: void 0,
254
- next: void 0,
255
- action: void 0,
256
- proceed: void 0,
257
- reset: void 0
258
- };
259
- return canNavigateAsync;
260
- };
261
- const unsubscribe = history.block({
262
- blockerFn: blockerFnComposed,
263
- enableBeforeUnload: args.enableBeforeUnload
264
- });
265
- onCleanup(() => {
266
- if (unsubscribe) unsubscribe();
267
- });
268
- });
269
- return () => {
270
- const defaultSlot = slots.default;
271
- if (!defaultSlot) {
272
- return Vue.h(Vue.Fragment, null);
273
- }
274
- const slotContent = defaultSlot(resolver.value);
275
- return Vue.h(Vue.Fragment, null, slotContent);
276
- };
277
- }
113
+ var BlockImpl = Vue.defineComponent({
114
+ name: "Block",
115
+ props: {
116
+ shouldBlockFn: {
117
+ type: Function,
118
+ required: false
119
+ },
120
+ enableBeforeUnload: {
121
+ type: [Boolean, Function],
122
+ default: true
123
+ },
124
+ disabled: {
125
+ type: Boolean,
126
+ default: false
127
+ },
128
+ withResolver: {
129
+ type: Boolean,
130
+ default: false
131
+ },
132
+ blockerFn: {
133
+ type: Function,
134
+ required: false
135
+ },
136
+ condition: {
137
+ type: [Boolean, Object],
138
+ required: false
139
+ }
140
+ },
141
+ setup(props, { slots }) {
142
+ const blockerArgs = Vue.computed(() => {
143
+ if (props.shouldBlockFn) return {
144
+ shouldBlockFn: props.shouldBlockFn,
145
+ enableBeforeUnload: props.enableBeforeUnload,
146
+ disabled: props.disabled,
147
+ withResolver: props.withResolver
148
+ };
149
+ const shouldBlock = Boolean(props.condition ?? true);
150
+ const fn = props.blockerFn;
151
+ const _customBlockerFn = async () => {
152
+ if (shouldBlock && fn !== void 0) return await fn();
153
+ return shouldBlock;
154
+ };
155
+ return {
156
+ shouldBlockFn: _customBlockerFn,
157
+ enableBeforeUnload: shouldBlock,
158
+ disabled: props.disabled,
159
+ withResolver: fn === void 0
160
+ };
161
+ });
162
+ const router = useRouter();
163
+ const { history } = router;
164
+ const resolver = Vue.ref({
165
+ status: "idle",
166
+ current: void 0,
167
+ next: void 0,
168
+ action: void 0,
169
+ proceed: void 0,
170
+ reset: void 0
171
+ });
172
+ Vue.watchEffect((onCleanup) => {
173
+ const args = blockerArgs.value;
174
+ if (args.disabled) return;
175
+ const blockerFnComposed = async (blockerFnArgs) => {
176
+ function getLocation(location) {
177
+ const parsedLocation = router.parseLocation(location);
178
+ const matchedRoutes = router.getMatchedRoutes(parsedLocation.pathname);
179
+ if (matchedRoutes.foundRoute === void 0) return {
180
+ routeId: "__notFound__",
181
+ fullPath: parsedLocation.pathname,
182
+ pathname: parsedLocation.pathname,
183
+ params: matchedRoutes.routeParams,
184
+ search: parsedLocation.search
185
+ };
186
+ return {
187
+ routeId: matchedRoutes.foundRoute.id,
188
+ fullPath: matchedRoutes.foundRoute.fullPath,
189
+ pathname: parsedLocation.pathname,
190
+ params: matchedRoutes.routeParams,
191
+ search: parsedLocation.search
192
+ };
193
+ }
194
+ const current = getLocation(blockerFnArgs.currentLocation);
195
+ const next = getLocation(blockerFnArgs.nextLocation);
196
+ if (current.routeId === "__notFound__" && next.routeId !== "__notFound__") return false;
197
+ const shouldBlock = await args.shouldBlockFn({
198
+ action: blockerFnArgs.action,
199
+ current,
200
+ next
201
+ });
202
+ if (!args.withResolver) return shouldBlock;
203
+ if (!shouldBlock) return false;
204
+ const canNavigateAsync = await new Promise((resolve) => {
205
+ resolver.value = {
206
+ status: "blocked",
207
+ current,
208
+ next,
209
+ action: blockerFnArgs.action,
210
+ proceed: () => resolve(false),
211
+ reset: () => resolve(true)
212
+ };
213
+ });
214
+ resolver.value = {
215
+ status: "idle",
216
+ current: void 0,
217
+ next: void 0,
218
+ action: void 0,
219
+ proceed: void 0,
220
+ reset: void 0
221
+ };
222
+ return canNavigateAsync;
223
+ };
224
+ const unsubscribe = history.block({
225
+ blockerFn: blockerFnComposed,
226
+ enableBeforeUnload: args.enableBeforeUnload
227
+ });
228
+ onCleanup(() => {
229
+ if (unsubscribe) unsubscribe();
230
+ });
231
+ });
232
+ return () => {
233
+ const defaultSlot = slots.default;
234
+ if (!defaultSlot) return Vue.h(Vue.Fragment, null);
235
+ const slotContent = defaultSlot(resolver.value);
236
+ return Vue.h(Vue.Fragment, null, slotContent);
237
+ };
238
+ }
278
239
  });
240
+ /**
241
+ * @deprecated Use the UseBlockerOpts property instead
242
+ */
279
243
  function Block(opts) {
280
- const {
281
- children,
282
- ...rest
283
- } = opts;
284
- const slots = children ? typeof children === "function" ? {
285
- default: children
286
- } : {
287
- default: () => children
288
- } : void 0;
289
- return Vue.h(BlockImpl, rest, slots);
244
+ const { children, ...rest } = opts;
245
+ const slots = children ? typeof children === "function" ? { default: children } : { default: () => children } : void 0;
246
+ return Vue.h(BlockImpl, rest, slots);
290
247
  }
291
- export {
292
- Block,
293
- useBlocker
294
- };
295
- //# sourceMappingURL=useBlocker.js.map
248
+ //#endregion
249
+ export { Block, useBlocker };
250
+
251
+ //# sourceMappingURL=useBlocker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useBlocker.js","sources":["../../src/useBlocker.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport { useRouter } from './useRouter'\nimport type {\n BlockerFnArgs,\n HistoryAction,\n HistoryLocation,\n} from '@tanstack/history'\nimport type {\n AnyRoute,\n AnyRouter,\n ParseRoute,\n RegisteredRouter,\n} from '@tanstack/router-core'\n\ninterface ShouldBlockFnLocation<\n out TRouteId,\n out TFullPath,\n out TAllParams,\n out TFullSearchSchema,\n> {\n routeId: TRouteId\n fullPath: TFullPath\n pathname: string\n params: TAllParams\n search: TFullSearchSchema\n}\n\ntype AnyShouldBlockFnLocation = ShouldBlockFnLocation<any, any, any, any>\ntype MakeShouldBlockFnLocationUnion<\n TRouter extends AnyRouter = RegisteredRouter,\n TRoute extends AnyRoute = ParseRoute<TRouter['routeTree']>,\n> = TRoute extends any\n ? ShouldBlockFnLocation<\n TRoute['id'],\n TRoute['fullPath'],\n TRoute['types']['allParams'],\n TRoute['types']['fullSearchSchema']\n >\n : never\n\ntype BlockerResolver<TRouter extends AnyRouter = RegisteredRouter> =\n | {\n status: 'blocked'\n current: MakeShouldBlockFnLocationUnion<TRouter>\n next: MakeShouldBlockFnLocationUnion<TRouter>\n action: HistoryAction\n proceed: () => void\n reset: () => void\n }\n | {\n status: 'idle'\n current: undefined\n next: undefined\n action: undefined\n proceed: undefined\n reset: undefined\n }\n\ntype ShouldBlockFnArgs<TRouter extends AnyRouter = RegisteredRouter> = {\n current: MakeShouldBlockFnLocationUnion<TRouter>\n next: MakeShouldBlockFnLocationUnion<TRouter>\n action: HistoryAction\n}\n\nexport type ShouldBlockFn<TRouter extends AnyRouter = RegisteredRouter> = (\n args: ShouldBlockFnArgs<TRouter>,\n) => boolean | Promise<boolean>\nexport type UseBlockerOpts<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = boolean,\n> = {\n shouldBlockFn: ShouldBlockFn<TRouter>\n enableBeforeUnload?: boolean | (() => boolean)\n disabled?: boolean\n withResolver?: TWithResolver\n}\n\ntype LegacyBlockerFn = () => Promise<any> | any\ntype LegacyBlockerOpts = {\n blockerFn?: LegacyBlockerFn\n condition?: boolean | any\n}\n\nfunction _resolveBlockerOpts(\n opts?: UseBlockerOpts | LegacyBlockerOpts | LegacyBlockerFn,\n condition?: boolean | any,\n): UseBlockerOpts {\n if (opts === undefined) {\n return {\n shouldBlockFn: () => true,\n withResolver: false,\n }\n }\n\n if ('shouldBlockFn' in opts) {\n return opts\n }\n\n if (typeof opts === 'function') {\n const shouldBlock = Boolean(condition ?? true)\n\n const _customBlockerFn = async () => {\n if (shouldBlock) return await opts()\n return false\n }\n\n return {\n shouldBlockFn: _customBlockerFn,\n enableBeforeUnload: shouldBlock,\n withResolver: false,\n }\n }\n\n const shouldBlock = Boolean(opts.condition ?? true)\n const fn = opts.blockerFn\n\n const _customBlockerFn = async () => {\n if (shouldBlock && fn !== undefined) {\n return await fn()\n }\n return shouldBlock\n }\n\n return {\n shouldBlockFn: _customBlockerFn,\n enableBeforeUnload: shouldBlock,\n withResolver: fn === undefined,\n }\n}\n\nexport function useBlocker<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = false,\n>(\n opts: UseBlockerOpts<TRouter, TWithResolver>,\n): TWithResolver extends true ? Vue.Ref<BlockerResolver<TRouter>> : void\n\n/**\n * @deprecated Use the shouldBlockFn property instead\n */\nexport function useBlocker(\n blockerFnOrOpts?: LegacyBlockerOpts,\n): Vue.Ref<BlockerResolver>\n\n/**\n * @deprecated Use the UseBlockerOpts object syntax instead\n */\nexport function useBlocker(\n blockerFn?: LegacyBlockerFn,\n condition?: boolean | any,\n): Vue.Ref<BlockerResolver>\n\nexport function useBlocker(\n opts?: UseBlockerOpts | LegacyBlockerOpts | LegacyBlockerFn,\n condition?: boolean | any,\n): Vue.Ref<BlockerResolver> | void {\n const {\n shouldBlockFn,\n enableBeforeUnload = true,\n disabled = false,\n withResolver = false,\n } = _resolveBlockerOpts(opts, condition)\n\n const router = useRouter()\n const { history } = router\n\n const resolver = Vue.ref<BlockerResolver>({\n status: 'idle',\n current: undefined,\n next: undefined,\n action: undefined,\n proceed: undefined,\n reset: undefined,\n })\n\n Vue.watchEffect((onCleanup) => {\n const blockerFnComposed = async (blockerFnArgs: BlockerFnArgs) => {\n function getLocation(\n location: HistoryLocation,\n ): AnyShouldBlockFnLocation {\n const parsedLocation = router.parseLocation(location)\n const matchedRoutes = router.getMatchedRoutes(parsedLocation.pathname)\n if (matchedRoutes.foundRoute === undefined) {\n return {\n routeId: '__notFound__',\n fullPath: parsedLocation.pathname,\n pathname: parsedLocation.pathname,\n params: matchedRoutes.routeParams,\n search: parsedLocation.search,\n }\n }\n return {\n routeId: matchedRoutes.foundRoute.id,\n fullPath: matchedRoutes.foundRoute.fullPath,\n pathname: parsedLocation.pathname,\n params: matchedRoutes.routeParams,\n search: parsedLocation.search,\n }\n }\n\n const current = getLocation(blockerFnArgs.currentLocation)\n const next = getLocation(blockerFnArgs.nextLocation)\n\n // Allow navigation away from 404 pages to valid routes\n if (\n current.routeId === '__notFound__' &&\n next.routeId !== '__notFound__'\n ) {\n return false\n }\n\n const shouldBlock = await shouldBlockFn({\n action: blockerFnArgs.action,\n current,\n next,\n })\n if (!withResolver) {\n return shouldBlock\n }\n\n if (!shouldBlock) {\n return false\n }\n\n const promise = new Promise<boolean>((resolve) => {\n resolver.value = {\n status: 'blocked',\n current,\n next,\n action: blockerFnArgs.action,\n proceed: () => resolve(false),\n reset: () => resolve(true),\n }\n })\n\n const canNavigateAsync = await promise\n resolver.value = {\n status: 'idle',\n current: undefined,\n next: undefined,\n action: undefined,\n proceed: undefined,\n reset: undefined,\n }\n\n return canNavigateAsync\n }\n\n if (disabled) {\n return\n }\n\n const unsubscribe = history.block({\n blockerFn: blockerFnComposed,\n enableBeforeUnload,\n })\n\n onCleanup(() => {\n if (unsubscribe) unsubscribe()\n })\n })\n\n return withResolver ? resolver : undefined\n}\n\nconst _resolvePromptBlockerArgs = (\n props: PromptProps | LegacyPromptProps,\n): UseBlockerOpts => {\n if ('shouldBlockFn' in props) {\n return { ...props }\n }\n\n const shouldBlock = Boolean(props.condition ?? true)\n const fn = props.blockerFn\n\n const _customBlockerFn = async () => {\n if (shouldBlock && fn !== undefined) {\n return await fn()\n }\n return shouldBlock\n }\n\n return {\n shouldBlockFn: _customBlockerFn,\n enableBeforeUnload: shouldBlock,\n withResolver: fn === undefined,\n }\n}\n\n// Internal Block implementation as a proper Vue component for reactivity\nconst BlockImpl = Vue.defineComponent({\n name: 'Block',\n props: {\n shouldBlockFn: {\n type: Function as Vue.PropType<ShouldBlockFn<any>>,\n required: false,\n },\n enableBeforeUnload: {\n type: [Boolean, Function] as Vue.PropType<boolean | (() => boolean)>,\n default: true,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n withResolver: {\n type: Boolean,\n default: false,\n },\n // Legacy props\n blockerFn: {\n type: Function as Vue.PropType<LegacyBlockerFn>,\n required: false,\n },\n condition: {\n type: [Boolean, Object] as Vue.PropType<boolean | any>,\n required: false,\n },\n },\n setup(props, { slots }) {\n // Create a computed that resolves the blocker args reactively\n const blockerArgs = Vue.computed<UseBlockerOpts>(() => {\n if (props.shouldBlockFn) {\n return {\n shouldBlockFn: props.shouldBlockFn,\n enableBeforeUnload: props.enableBeforeUnload,\n disabled: props.disabled,\n withResolver: props.withResolver,\n }\n }\n\n // Legacy handling\n const shouldBlock = Boolean(props.condition ?? true)\n const fn = props.blockerFn\n\n const _customBlockerFn = async () => {\n if (shouldBlock && fn !== undefined) {\n return await fn()\n }\n return shouldBlock\n }\n\n return {\n shouldBlockFn: _customBlockerFn,\n enableBeforeUnload: shouldBlock,\n disabled: props.disabled,\n withResolver: fn === undefined,\n }\n })\n\n // Use a reactive useBlocker that re-subscribes when args change\n const router = useRouter()\n const { history } = router\n\n const resolver = Vue.ref<BlockerResolver>({\n status: 'idle',\n current: undefined,\n next: undefined,\n action: undefined,\n proceed: undefined,\n reset: undefined,\n })\n\n Vue.watchEffect((onCleanup) => {\n const args = blockerArgs.value\n\n if (args.disabled) {\n return\n }\n\n const blockerFnComposed = async (blockerFnArgs: BlockerFnArgs) => {\n function getLocation(\n location: HistoryLocation,\n ): AnyShouldBlockFnLocation {\n const parsedLocation = router.parseLocation(location)\n const matchedRoutes = router.getMatchedRoutes(parsedLocation.pathname)\n if (matchedRoutes.foundRoute === undefined) {\n return {\n routeId: '__notFound__',\n fullPath: parsedLocation.pathname,\n pathname: parsedLocation.pathname,\n params: matchedRoutes.routeParams,\n search: parsedLocation.search,\n }\n }\n return {\n routeId: matchedRoutes.foundRoute.id,\n fullPath: matchedRoutes.foundRoute.fullPath,\n pathname: parsedLocation.pathname,\n params: matchedRoutes.routeParams,\n search: parsedLocation.search,\n }\n }\n\n const current = getLocation(blockerFnArgs.currentLocation)\n const next = getLocation(blockerFnArgs.nextLocation)\n\n // Allow navigation away from 404 pages to valid routes\n if (\n current.routeId === '__notFound__' &&\n next.routeId !== '__notFound__'\n ) {\n return false\n }\n\n const shouldBlock = await args.shouldBlockFn({\n action: blockerFnArgs.action,\n current,\n next,\n })\n if (!args.withResolver) {\n return shouldBlock\n }\n\n if (!shouldBlock) {\n return false\n }\n\n const promise = new Promise<boolean>((resolve) => {\n resolver.value = {\n status: 'blocked',\n current,\n next,\n action: blockerFnArgs.action,\n proceed: () => resolve(false),\n reset: () => resolve(true),\n }\n })\n\n const canNavigateAsync = await promise\n resolver.value = {\n status: 'idle',\n current: undefined,\n next: undefined,\n action: undefined,\n proceed: undefined,\n reset: undefined,\n }\n\n return canNavigateAsync\n }\n\n const unsubscribe = history.block({\n blockerFn: blockerFnComposed,\n enableBeforeUnload: args.enableBeforeUnload,\n })\n\n onCleanup(() => {\n if (unsubscribe) unsubscribe()\n })\n })\n\n return () => {\n const defaultSlot = slots.default\n if (!defaultSlot) {\n return Vue.h(Vue.Fragment, null)\n }\n\n // If slot is a function that takes resolver, call it with the resolver\n const slotContent = defaultSlot(resolver.value as any)\n return Vue.h(Vue.Fragment, null, slotContent)\n }\n },\n})\n\nexport function Block<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = boolean,\n>(opts: PromptProps<TRouter, TWithResolver>): Vue.VNode\n\n/**\n * @deprecated Use the UseBlockerOpts property instead\n */\nexport function Block(opts: LegacyPromptProps): Vue.VNode\n\nexport function Block(opts: PromptProps | LegacyPromptProps): Vue.VNode {\n const { children, ...rest } = opts\n\n // Convert children to slot format for the component\n const slots = children\n ? typeof children === 'function'\n ? { default: children }\n : { default: () => children }\n : undefined\n\n return Vue.h(BlockImpl, rest as any, slots)\n}\n\ntype LegacyPromptProps = {\n blockerFn?: LegacyBlockerFn\n condition?: boolean | any\n children?: Vue.VNode | ((params: BlockerResolver) => Vue.VNode)\n}\n\ntype PromptProps<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = boolean,\n TParams = TWithResolver extends true ? BlockerResolver<TRouter> : void,\n> = UseBlockerOpts<TRouter, TWithResolver> & {\n children?: Vue.VNode | ((params: TParams) => Vue.VNode)\n}\n"],"names":["_resolveBlockerOpts","opts","condition","undefined","shouldBlockFn","withResolver","shouldBlock","Boolean","_customBlockerFn","enableBeforeUnload","fn","blockerFn","useBlocker","disabled","router","useRouter","history","resolver","Vue","ref","status","current","next","action","proceed","reset","watchEffect","onCleanup","blockerFnComposed","blockerFnArgs","getLocation","location","parsedLocation","parseLocation","matchedRoutes","getMatchedRoutes","pathname","foundRoute","routeId","fullPath","params","routeParams","search","id","currentLocation","nextLocation","promise","Promise","resolve","value","canNavigateAsync","unsubscribe","block","BlockImpl","defineComponent","name","props","type","Function","required","default","Object","setup","slots","blockerArgs","computed","args","defaultSlot","h","Fragment","slotContent","Block","children","rest"],"mappings":"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"}
1
+ {"version":3,"file":"useBlocker.js","names":["Vue","useRouter","_resolveBlockerOpts","opts","condition","undefined","shouldBlockFn","withResolver","shouldBlock","Boolean","_customBlockerFn","enableBeforeUnload","fn","blockerFn","useBlocker","disabled","router","history","resolver","ref","status","current","next","action","proceed","reset","watchEffect","onCleanup","blockerFnComposed","blockerFnArgs","getLocation","location","parsedLocation","parseLocation","matchedRoutes","getMatchedRoutes","pathname","foundRoute","routeId","fullPath","params","routeParams","search","id","currentLocation","nextLocation","promise","Promise","resolve","value","canNavigateAsync","unsubscribe","block","_resolvePromptBlockerArgs","props","BlockImpl","defineComponent","name","type","Function","required","default","Object","setup","slots","blockerArgs","computed","args","defaultSlot","h","Fragment","slotContent","Block","children","rest"],"sources":["../../src/useBlocker.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport { useRouter } from './useRouter'\nimport type {\n BlockerFnArgs,\n HistoryAction,\n HistoryLocation,\n} from '@tanstack/history'\nimport type {\n AnyRoute,\n AnyRouter,\n ParseRoute,\n RegisteredRouter,\n} from '@tanstack/router-core'\n\ninterface ShouldBlockFnLocation<\n out TRouteId,\n out TFullPath,\n out TAllParams,\n out TFullSearchSchema,\n> {\n routeId: TRouteId\n fullPath: TFullPath\n pathname: string\n params: TAllParams\n search: TFullSearchSchema\n}\n\ntype AnyShouldBlockFnLocation = ShouldBlockFnLocation<any, any, any, any>\ntype MakeShouldBlockFnLocationUnion<\n TRouter extends AnyRouter = RegisteredRouter,\n TRoute extends AnyRoute = ParseRoute<TRouter['routeTree']>,\n> = TRoute extends any\n ? ShouldBlockFnLocation<\n TRoute['id'],\n TRoute['fullPath'],\n TRoute['types']['allParams'],\n TRoute['types']['fullSearchSchema']\n >\n : never\n\ntype BlockerResolver<TRouter extends AnyRouter = RegisteredRouter> =\n | {\n status: 'blocked'\n current: MakeShouldBlockFnLocationUnion<TRouter>\n next: MakeShouldBlockFnLocationUnion<TRouter>\n action: HistoryAction\n proceed: () => void\n reset: () => void\n }\n | {\n status: 'idle'\n current: undefined\n next: undefined\n action: undefined\n proceed: undefined\n reset: undefined\n }\n\ntype ShouldBlockFnArgs<TRouter extends AnyRouter = RegisteredRouter> = {\n current: MakeShouldBlockFnLocationUnion<TRouter>\n next: MakeShouldBlockFnLocationUnion<TRouter>\n action: HistoryAction\n}\n\nexport type ShouldBlockFn<TRouter extends AnyRouter = RegisteredRouter> = (\n args: ShouldBlockFnArgs<TRouter>,\n) => boolean | Promise<boolean>\nexport type UseBlockerOpts<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = boolean,\n> = {\n shouldBlockFn: ShouldBlockFn<TRouter>\n enableBeforeUnload?: boolean | (() => boolean)\n disabled?: boolean\n withResolver?: TWithResolver\n}\n\ntype LegacyBlockerFn = () => Promise<any> | any\ntype LegacyBlockerOpts = {\n blockerFn?: LegacyBlockerFn\n condition?: boolean | any\n}\n\nfunction _resolveBlockerOpts(\n opts?: UseBlockerOpts | LegacyBlockerOpts | LegacyBlockerFn,\n condition?: boolean | any,\n): UseBlockerOpts {\n if (opts === undefined) {\n return {\n shouldBlockFn: () => true,\n withResolver: false,\n }\n }\n\n if ('shouldBlockFn' in opts) {\n return opts\n }\n\n if (typeof opts === 'function') {\n const shouldBlock = Boolean(condition ?? true)\n\n const _customBlockerFn = async () => {\n if (shouldBlock) return await opts()\n return false\n }\n\n return {\n shouldBlockFn: _customBlockerFn,\n enableBeforeUnload: shouldBlock,\n withResolver: false,\n }\n }\n\n const shouldBlock = Boolean(opts.condition ?? true)\n const fn = opts.blockerFn\n\n const _customBlockerFn = async () => {\n if (shouldBlock && fn !== undefined) {\n return await fn()\n }\n return shouldBlock\n }\n\n return {\n shouldBlockFn: _customBlockerFn,\n enableBeforeUnload: shouldBlock,\n withResolver: fn === undefined,\n }\n}\n\nexport function useBlocker<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = false,\n>(\n opts: UseBlockerOpts<TRouter, TWithResolver>,\n): TWithResolver extends true ? Vue.Ref<BlockerResolver<TRouter>> : void\n\n/**\n * @deprecated Use the shouldBlockFn property instead\n */\nexport function useBlocker(\n blockerFnOrOpts?: LegacyBlockerOpts,\n): Vue.Ref<BlockerResolver>\n\n/**\n * @deprecated Use the UseBlockerOpts object syntax instead\n */\nexport function useBlocker(\n blockerFn?: LegacyBlockerFn,\n condition?: boolean | any,\n): Vue.Ref<BlockerResolver>\n\nexport function useBlocker(\n opts?: UseBlockerOpts | LegacyBlockerOpts | LegacyBlockerFn,\n condition?: boolean | any,\n): Vue.Ref<BlockerResolver> | void {\n const {\n shouldBlockFn,\n enableBeforeUnload = true,\n disabled = false,\n withResolver = false,\n } = _resolveBlockerOpts(opts, condition)\n\n const router = useRouter()\n const { history } = router\n\n const resolver = Vue.ref<BlockerResolver>({\n status: 'idle',\n current: undefined,\n next: undefined,\n action: undefined,\n proceed: undefined,\n reset: undefined,\n })\n\n Vue.watchEffect((onCleanup) => {\n const blockerFnComposed = async (blockerFnArgs: BlockerFnArgs) => {\n function getLocation(\n location: HistoryLocation,\n ): AnyShouldBlockFnLocation {\n const parsedLocation = router.parseLocation(location)\n const matchedRoutes = router.getMatchedRoutes(parsedLocation.pathname)\n if (matchedRoutes.foundRoute === undefined) {\n return {\n routeId: '__notFound__',\n fullPath: parsedLocation.pathname,\n pathname: parsedLocation.pathname,\n params: matchedRoutes.routeParams,\n search: parsedLocation.search,\n }\n }\n return {\n routeId: matchedRoutes.foundRoute.id,\n fullPath: matchedRoutes.foundRoute.fullPath,\n pathname: parsedLocation.pathname,\n params: matchedRoutes.routeParams,\n search: parsedLocation.search,\n }\n }\n\n const current = getLocation(blockerFnArgs.currentLocation)\n const next = getLocation(blockerFnArgs.nextLocation)\n\n // Allow navigation away from 404 pages to valid routes\n if (\n current.routeId === '__notFound__' &&\n next.routeId !== '__notFound__'\n ) {\n return false\n }\n\n const shouldBlock = await shouldBlockFn({\n action: blockerFnArgs.action,\n current,\n next,\n })\n if (!withResolver) {\n return shouldBlock\n }\n\n if (!shouldBlock) {\n return false\n }\n\n const promise = new Promise<boolean>((resolve) => {\n resolver.value = {\n status: 'blocked',\n current,\n next,\n action: blockerFnArgs.action,\n proceed: () => resolve(false),\n reset: () => resolve(true),\n }\n })\n\n const canNavigateAsync = await promise\n resolver.value = {\n status: 'idle',\n current: undefined,\n next: undefined,\n action: undefined,\n proceed: undefined,\n reset: undefined,\n }\n\n return canNavigateAsync\n }\n\n if (disabled) {\n return\n }\n\n const unsubscribe = history.block({\n blockerFn: blockerFnComposed,\n enableBeforeUnload,\n })\n\n onCleanup(() => {\n if (unsubscribe) unsubscribe()\n })\n })\n\n return withResolver ? resolver : undefined\n}\n\nconst _resolvePromptBlockerArgs = (\n props: PromptProps | LegacyPromptProps,\n): UseBlockerOpts => {\n if ('shouldBlockFn' in props) {\n return { ...props }\n }\n\n const shouldBlock = Boolean(props.condition ?? true)\n const fn = props.blockerFn\n\n const _customBlockerFn = async () => {\n if (shouldBlock && fn !== undefined) {\n return await fn()\n }\n return shouldBlock\n }\n\n return {\n shouldBlockFn: _customBlockerFn,\n enableBeforeUnload: shouldBlock,\n withResolver: fn === undefined,\n }\n}\n\n// Internal Block implementation as a proper Vue component for reactivity\nconst BlockImpl = Vue.defineComponent({\n name: 'Block',\n props: {\n shouldBlockFn: {\n type: Function as Vue.PropType<ShouldBlockFn<any>>,\n required: false,\n },\n enableBeforeUnload: {\n type: [Boolean, Function] as Vue.PropType<boolean | (() => boolean)>,\n default: true,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n withResolver: {\n type: Boolean,\n default: false,\n },\n // Legacy props\n blockerFn: {\n type: Function as Vue.PropType<LegacyBlockerFn>,\n required: false,\n },\n condition: {\n type: [Boolean, Object] as Vue.PropType<boolean | any>,\n required: false,\n },\n },\n setup(props, { slots }) {\n // Create a computed that resolves the blocker args reactively\n const blockerArgs = Vue.computed<UseBlockerOpts>(() => {\n if (props.shouldBlockFn) {\n return {\n shouldBlockFn: props.shouldBlockFn,\n enableBeforeUnload: props.enableBeforeUnload,\n disabled: props.disabled,\n withResolver: props.withResolver,\n }\n }\n\n // Legacy handling\n const shouldBlock = Boolean(props.condition ?? true)\n const fn = props.blockerFn\n\n const _customBlockerFn = async () => {\n if (shouldBlock && fn !== undefined) {\n return await fn()\n }\n return shouldBlock\n }\n\n return {\n shouldBlockFn: _customBlockerFn,\n enableBeforeUnload: shouldBlock,\n disabled: props.disabled,\n withResolver: fn === undefined,\n }\n })\n\n // Use a reactive useBlocker that re-subscribes when args change\n const router = useRouter()\n const { history } = router\n\n const resolver = Vue.ref<BlockerResolver>({\n status: 'idle',\n current: undefined,\n next: undefined,\n action: undefined,\n proceed: undefined,\n reset: undefined,\n })\n\n Vue.watchEffect((onCleanup) => {\n const args = blockerArgs.value\n\n if (args.disabled) {\n return\n }\n\n const blockerFnComposed = async (blockerFnArgs: BlockerFnArgs) => {\n function getLocation(\n location: HistoryLocation,\n ): AnyShouldBlockFnLocation {\n const parsedLocation = router.parseLocation(location)\n const matchedRoutes = router.getMatchedRoutes(parsedLocation.pathname)\n if (matchedRoutes.foundRoute === undefined) {\n return {\n routeId: '__notFound__',\n fullPath: parsedLocation.pathname,\n pathname: parsedLocation.pathname,\n params: matchedRoutes.routeParams,\n search: parsedLocation.search,\n }\n }\n return {\n routeId: matchedRoutes.foundRoute.id,\n fullPath: matchedRoutes.foundRoute.fullPath,\n pathname: parsedLocation.pathname,\n params: matchedRoutes.routeParams,\n search: parsedLocation.search,\n }\n }\n\n const current = getLocation(blockerFnArgs.currentLocation)\n const next = getLocation(blockerFnArgs.nextLocation)\n\n // Allow navigation away from 404 pages to valid routes\n if (\n current.routeId === '__notFound__' &&\n next.routeId !== '__notFound__'\n ) {\n return false\n }\n\n const shouldBlock = await args.shouldBlockFn({\n action: blockerFnArgs.action,\n current,\n next,\n })\n if (!args.withResolver) {\n return shouldBlock\n }\n\n if (!shouldBlock) {\n return false\n }\n\n const promise = new Promise<boolean>((resolve) => {\n resolver.value = {\n status: 'blocked',\n current,\n next,\n action: blockerFnArgs.action,\n proceed: () => resolve(false),\n reset: () => resolve(true),\n }\n })\n\n const canNavigateAsync = await promise\n resolver.value = {\n status: 'idle',\n current: undefined,\n next: undefined,\n action: undefined,\n proceed: undefined,\n reset: undefined,\n }\n\n return canNavigateAsync\n }\n\n const unsubscribe = history.block({\n blockerFn: blockerFnComposed,\n enableBeforeUnload: args.enableBeforeUnload,\n })\n\n onCleanup(() => {\n if (unsubscribe) unsubscribe()\n })\n })\n\n return () => {\n const defaultSlot = slots.default\n if (!defaultSlot) {\n return Vue.h(Vue.Fragment, null)\n }\n\n // If slot is a function that takes resolver, call it with the resolver\n const slotContent = defaultSlot(resolver.value as any)\n return Vue.h(Vue.Fragment, null, slotContent)\n }\n },\n})\n\nexport function Block<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = boolean,\n>(opts: PromptProps<TRouter, TWithResolver>): Vue.VNode\n\n/**\n * @deprecated Use the UseBlockerOpts property instead\n */\nexport function Block(opts: LegacyPromptProps): Vue.VNode\n\nexport function Block(opts: PromptProps | LegacyPromptProps): Vue.VNode {\n const { children, ...rest } = opts\n\n // Convert children to slot format for the component\n const slots = children\n ? typeof children === 'function'\n ? { default: children }\n : { default: () => children }\n : undefined\n\n return Vue.h(BlockImpl, rest as any, slots)\n}\n\ntype LegacyPromptProps = {\n blockerFn?: LegacyBlockerFn\n condition?: boolean | any\n children?: Vue.VNode | ((params: BlockerResolver) => Vue.VNode)\n}\n\ntype PromptProps<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = boolean,\n TParams = TWithResolver extends true ? BlockerResolver<TRouter> : void,\n> = UseBlockerOpts<TRouter, TWithResolver> & {\n children?: Vue.VNode | ((params: TParams) => Vue.VNode)\n}\n"],"mappings":"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"}