swup 4.4.0 → 4.4.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.
- package/dist/Swup.cjs +1 -1
- package/dist/Swup.cjs.map +1 -1
- package/dist/Swup.modern.js +1 -1
- package/dist/Swup.modern.js.map +1 -1
- package/dist/Swup.module.js +1 -1
- package/dist/Swup.module.js.map +1 -1
- package/dist/Swup.umd.js +1 -1
- package/dist/Swup.umd.js.map +1 -1
- package/dist/types/Swup.d.ts +8 -5
- package/dist/types/Swup.d.ts.map +1 -0
- package/dist/types/config/version.d.ts +1 -0
- package/dist/types/config/version.d.ts.map +1 -0
- package/dist/types/helpers/Location.d.ts +1 -0
- package/dist/types/helpers/Location.d.ts.map +1 -0
- package/dist/types/helpers/classify.d.ts +1 -0
- package/dist/types/helpers/classify.d.ts.map +1 -0
- package/dist/types/helpers/createHistoryRecord.d.ts +1 -0
- package/dist/types/helpers/createHistoryRecord.d.ts.map +1 -0
- package/dist/types/helpers/delegateEvent.d.ts +3 -2
- package/dist/types/helpers/delegateEvent.d.ts.map +1 -0
- package/dist/types/helpers/getCurrentUrl.d.ts +1 -0
- package/dist/types/helpers/getCurrentUrl.d.ts.map +1 -0
- package/dist/types/helpers/matchPath.d.ts +2 -1
- package/dist/types/helpers/matchPath.d.ts.map +1 -0
- package/dist/types/helpers/updateHistoryRecord.d.ts +1 -0
- package/dist/types/helpers/updateHistoryRecord.d.ts.map +1 -0
- package/dist/types/helpers.d.ts +1 -0
- package/dist/types/helpers.d.ts.map +1 -0
- package/dist/types/index.d.ts +4 -2
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/modules/Cache.d.ts +3 -2
- package/dist/types/modules/Cache.d.ts.map +1 -0
- package/dist/types/modules/Classes.d.ts +2 -1
- package/dist/types/modules/Classes.d.ts.map +1 -0
- package/dist/types/modules/Hooks.d.ts +30 -29
- package/dist/types/modules/Hooks.d.ts.map +1 -0
- package/dist/types/modules/Visit.d.ts +4 -2
- package/dist/types/modules/Visit.d.ts.map +1 -0
- package/dist/types/modules/animatePageIn.d.ts +2 -1
- package/dist/types/modules/animatePageIn.d.ts.map +1 -0
- package/dist/types/modules/animatePageOut.d.ts +2 -1
- package/dist/types/modules/animatePageOut.d.ts.map +1 -0
- package/dist/types/modules/awaitAnimations.d.ts +3 -1
- package/dist/types/modules/awaitAnimations.d.ts.map +1 -0
- package/dist/types/modules/fetchPage.d.ts +2 -1
- package/dist/types/modules/fetchPage.d.ts.map +1 -0
- package/dist/types/modules/getAnchorElement.d.ts +1 -0
- package/dist/types/modules/getAnchorElement.d.ts.map +1 -0
- package/dist/types/modules/navigate.d.ts +4 -3
- package/dist/types/modules/navigate.d.ts.map +1 -0
- package/dist/types/modules/plugins.d.ts +2 -1
- package/dist/types/modules/plugins.d.ts.map +1 -0
- package/dist/types/modules/renderPage.d.ts +3 -2
- package/dist/types/modules/renderPage.d.ts.map +1 -0
- package/dist/types/modules/replaceContent.d.ts +4 -2
- package/dist/types/modules/replaceContent.d.ts.map +1 -0
- package/dist/types/modules/resolveUrl.d.ts +2 -1
- package/dist/types/modules/resolveUrl.d.ts.map +1 -0
- package/dist/types/modules/scrollToContent.d.ts +2 -1
- package/dist/types/modules/scrollToContent.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +1 -0
- package/dist/types/utils/index.d.ts.map +1 -0
- package/dist/types/utils.d.ts +1 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/package.json +3 -1
- package/src/Swup.ts +14 -6
- package/src/helpers/delegateEvent.ts +6 -2
- package/src/helpers/matchPath.ts +1 -1
- package/src/helpers/updateHistoryRecord.ts +1 -1
- package/src/index.ts +13 -8
- package/src/modules/Cache.ts +2 -2
- package/src/modules/Classes.ts +1 -1
- package/src/modules/Hooks.ts +41 -41
- package/src/modules/Visit.ts +3 -2
- package/src/modules/animatePageIn.ts +1 -1
- package/src/modules/animatePageOut.ts +1 -1
- package/src/modules/awaitAnimations.ts +2 -1
- package/src/modules/fetchPage.ts +1 -1
- package/src/modules/navigate.ts +5 -3
- package/src/modules/plugins.ts +1 -1
- package/src/modules/renderPage.ts +2 -2
- package/src/modules/replaceContent.ts +3 -2
- package/src/modules/resolveUrl.ts +1 -1
- package/src/modules/scrollToContent.ts +1 -1
package/src/Swup.ts
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import { DelegateEvent } from 'delegate-it';
|
|
1
|
+
import { type DelegateEvent } from 'delegate-it';
|
|
2
2
|
|
|
3
3
|
import version from './config/version.js';
|
|
4
4
|
|
|
5
5
|
import { delegateEvent, getCurrentUrl, Location, updateHistoryRecord } from './helpers.js';
|
|
6
|
-
import { DelegateEventUnsubscribe } from './helpers/delegateEvent.js';
|
|
6
|
+
import { type DelegateEventUnsubscribe } from './helpers/delegateEvent.js';
|
|
7
7
|
|
|
8
8
|
import { Cache } from './modules/Cache.js';
|
|
9
9
|
import { Classes } from './modules/Classes.js';
|
|
10
|
-
import { Visit, createVisit } from './modules/Visit.js';
|
|
10
|
+
import { type Visit, createVisit } from './modules/Visit.js';
|
|
11
11
|
import { Hooks } from './modules/Hooks.js';
|
|
12
12
|
import { getAnchorElement } from './modules/getAnchorElement.js';
|
|
13
13
|
import { awaitAnimations } from './modules/awaitAnimations.js';
|
|
14
|
-
import { navigate, performNavigation, NavigationToSelfAction } from './modules/navigate.js';
|
|
14
|
+
import { navigate, performNavigation, type NavigationToSelfAction } from './modules/navigate.js';
|
|
15
15
|
import { fetchPage } from './modules/fetchPage.js';
|
|
16
16
|
import { animatePageOut } from './modules/animatePageOut.js';
|
|
17
17
|
import { replaceContent } from './modules/replaceContent.js';
|
|
18
18
|
import { scrollToContent } from './modules/scrollToContent.js';
|
|
19
19
|
import { animatePageIn } from './modules/animatePageIn.js';
|
|
20
20
|
import { renderPage } from './modules/renderPage.js';
|
|
21
|
-
import { use, unuse, findPlugin, Plugin } from './modules/plugins.js';
|
|
21
|
+
import { use, unuse, findPlugin, type Plugin } from './modules/plugins.js';
|
|
22
22
|
import { isSameResolvedUrl, resolveUrl } from './modules/resolveUrl.js';
|
|
23
23
|
import { nextTick } from './utils.js';
|
|
24
|
-
import { HistoryState } from './helpers/createHistoryRecord.js';
|
|
24
|
+
import { type HistoryState } from './helpers/createHistoryRecord.js';
|
|
25
25
|
|
|
26
26
|
/** Options for customizing swup's behavior. */
|
|
27
27
|
export type Options = {
|
|
@@ -96,6 +96,8 @@ export default class Swup {
|
|
|
96
96
|
protected currentHistoryIndex: number;
|
|
97
97
|
/** Delegated event subscription handle */
|
|
98
98
|
protected clickDelegate?: DelegateEventUnsubscribe;
|
|
99
|
+
/** Navigation status */
|
|
100
|
+
protected navigating: boolean = false;
|
|
99
101
|
|
|
100
102
|
/** Install a plugin */
|
|
101
103
|
use = use;
|
|
@@ -257,6 +259,12 @@ export default class Swup {
|
|
|
257
259
|
return;
|
|
258
260
|
}
|
|
259
261
|
|
|
262
|
+
// Ignore if swup is currently navigating towards the link's URL
|
|
263
|
+
if (this.navigating && url === this.visit.to.url) {
|
|
264
|
+
event.preventDefault();
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
|
|
260
268
|
this.visit = this.createVisit({ to: url, hash, el, event });
|
|
261
269
|
|
|
262
270
|
// Exit early if control key pressed
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import delegate, {
|
|
2
|
-
|
|
1
|
+
import delegate, {
|
|
2
|
+
type DelegateEventHandler,
|
|
3
|
+
type DelegateOptions,
|
|
4
|
+
type EventType
|
|
5
|
+
} from 'delegate-it';
|
|
6
|
+
import type { ParseSelector } from 'typed-query-selector/parser.js';
|
|
3
7
|
|
|
4
8
|
export type DelegateEventUnsubscribe = {
|
|
5
9
|
destroy: () => void;
|
package/src/helpers/matchPath.ts
CHANGED
package/src/index.ts
CHANGED
|
@@ -14,12 +14,14 @@ import type {
|
|
|
14
14
|
VisitHistory
|
|
15
15
|
} from './modules/Visit.js';
|
|
16
16
|
import type {
|
|
17
|
-
HookArguments,
|
|
18
|
-
HookDefinitions,
|
|
19
17
|
HookName,
|
|
18
|
+
HookDefinitions,
|
|
19
|
+
HookArguments,
|
|
20
|
+
HookReturnValues,
|
|
21
|
+
HookHandler,
|
|
22
|
+
HookDefaultHandler,
|
|
20
23
|
HookOptions,
|
|
21
|
-
HookUnregister
|
|
22
|
-
Handler
|
|
24
|
+
HookUnregister
|
|
23
25
|
} from './modules/Hooks.js';
|
|
24
26
|
import type { Plugin } from './modules/plugins.js';
|
|
25
27
|
|
|
@@ -32,19 +34,22 @@ export type {
|
|
|
32
34
|
Plugin,
|
|
33
35
|
CacheData,
|
|
34
36
|
PageData,
|
|
37
|
+
Path,
|
|
35
38
|
Visit,
|
|
36
39
|
VisitFrom,
|
|
37
40
|
VisitTo,
|
|
38
41
|
VisitAnimation,
|
|
39
42
|
VisitScroll,
|
|
40
43
|
VisitHistory,
|
|
41
|
-
HookArguments,
|
|
42
|
-
HookDefinitions,
|
|
43
44
|
HookName,
|
|
45
|
+
HookDefinitions,
|
|
46
|
+
HookArguments,
|
|
47
|
+
HookReturnValues,
|
|
48
|
+
HookHandler,
|
|
49
|
+
HookHandler as Handler, // backwards compatibility
|
|
50
|
+
HookDefaultHandler,
|
|
44
51
|
HookOptions,
|
|
45
52
|
HookUnregister,
|
|
46
|
-
Handler,
|
|
47
|
-
Path,
|
|
48
53
|
DelegateEvent,
|
|
49
54
|
DelegateEventHandler,
|
|
50
55
|
DelegateEventUnsubscribe
|
package/src/modules/Cache.ts
CHANGED
package/src/modules/Classes.ts
CHANGED
package/src/modules/Hooks.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { DelegateEvent } from 'delegate-it';
|
|
1
|
+
import type { DelegateEvent } from 'delegate-it';
|
|
2
2
|
|
|
3
|
-
import Swup from '../Swup.js';
|
|
3
|
+
import type Swup from '../Swup.js';
|
|
4
4
|
import { isPromise, runAsPromise } from '../utils.js';
|
|
5
|
-
import { Visit } from './Visit.js';
|
|
6
|
-
import { FetchOptions, PageData } from './fetchPage.js';
|
|
5
|
+
import type { Visit } from './Visit.js';
|
|
6
|
+
import type { FetchOptions, PageData } from './fetchPage.js';
|
|
7
7
|
|
|
8
8
|
export interface HookDefinitions {
|
|
9
9
|
'animation:out:start': undefined;
|
|
@@ -50,7 +50,7 @@ export type HookArguments<T extends HookName> = HookDefinitions[T];
|
|
|
50
50
|
export type HookName = keyof HookDefinitions;
|
|
51
51
|
|
|
52
52
|
/** A generic hook handler. */
|
|
53
|
-
export type
|
|
53
|
+
export type HookHandler<T extends HookName> = (
|
|
54
54
|
/** Context about the current visit. */
|
|
55
55
|
visit: Visit,
|
|
56
56
|
/** Local arguments passed into the handler. */
|
|
@@ -58,17 +58,17 @@ export type Handler<T extends HookName> = (
|
|
|
58
58
|
) => Promise<unknown> | unknown;
|
|
59
59
|
|
|
60
60
|
/** A default hook handler with an expected return type. */
|
|
61
|
-
export type
|
|
61
|
+
export type HookDefaultHandler<T extends HookName> = (
|
|
62
62
|
/** Context about the current visit. */
|
|
63
63
|
visit: Visit,
|
|
64
64
|
/** Local arguments passed into the handler. */
|
|
65
65
|
args: HookArguments<T>,
|
|
66
66
|
/** Default handler to be executed. Available if replacing an internal hook handler. */
|
|
67
|
-
defaultHandler?:
|
|
67
|
+
defaultHandler?: HookDefaultHandler<T>
|
|
68
68
|
) => T extends keyof HookReturnValues ? HookReturnValues[T] : Promise<unknown> | unknown;
|
|
69
69
|
|
|
70
70
|
export type Handlers = {
|
|
71
|
-
[K in HookName]:
|
|
71
|
+
[K in HookName]: HookHandler<K>[];
|
|
72
72
|
};
|
|
73
73
|
|
|
74
74
|
/** Unregister a previously registered hook handler. */
|
|
@@ -88,15 +88,15 @@ export type HookOptions = {
|
|
|
88
88
|
|
|
89
89
|
export type HookRegistration<
|
|
90
90
|
T extends HookName,
|
|
91
|
-
H extends
|
|
91
|
+
H extends HookHandler<T> | HookDefaultHandler<T> = HookHandler<T>
|
|
92
92
|
> = {
|
|
93
93
|
id: number;
|
|
94
94
|
hook: T;
|
|
95
95
|
handler: H;
|
|
96
|
-
defaultHandler?:
|
|
96
|
+
defaultHandler?: HookDefaultHandler<T>;
|
|
97
97
|
} & HookOptions;
|
|
98
98
|
|
|
99
|
-
type HookLedger<T extends HookName> = Map<
|
|
99
|
+
type HookLedger<T extends HookName> = Map<HookHandler<T>, HookRegistration<T>>;
|
|
100
100
|
|
|
101
101
|
interface HookRegistry extends Map<HookName, HookLedger<HookName>> {
|
|
102
102
|
get<K extends HookName>(key: K): HookLedger<K> | undefined;
|
|
@@ -209,15 +209,15 @@ export class Hooks {
|
|
|
209
209
|
*/
|
|
210
210
|
|
|
211
211
|
// Overload: replacing default handler
|
|
212
|
-
on<T extends HookName, O extends HookOptions>(hook: T, handler:
|
|
212
|
+
on<T extends HookName, O extends HookOptions>(hook: T, handler: HookDefaultHandler<T>, options: O & { replace: true }): HookUnregister; // prettier-ignore
|
|
213
213
|
// Overload: passed in handler options
|
|
214
|
-
on<T extends HookName, O extends HookOptions>(hook: T, handler:
|
|
214
|
+
on<T extends HookName, O extends HookOptions>(hook: T, handler: HookHandler<T>, options: O): HookUnregister; // prettier-ignore
|
|
215
215
|
// Overload: no handler options
|
|
216
|
-
on<T extends HookName>(hook: T, handler:
|
|
216
|
+
on<T extends HookName>(hook: T, handler: HookHandler<T>): HookUnregister; // prettier-ignore
|
|
217
217
|
// Implementation
|
|
218
218
|
on<T extends HookName, O extends HookOptions>(
|
|
219
219
|
hook: T,
|
|
220
|
-
handler: O['replace'] extends true ?
|
|
220
|
+
handler: O['replace'] extends true ? HookDefaultHandler<T> : HookHandler<T>,
|
|
221
221
|
options: Partial<O> = {}
|
|
222
222
|
): HookUnregister {
|
|
223
223
|
const ledger = this.get(hook);
|
|
@@ -243,13 +243,13 @@ export class Hooks {
|
|
|
243
243
|
* @see on
|
|
244
244
|
*/
|
|
245
245
|
// Overload: passed in handler options
|
|
246
|
-
before<T extends HookName>(hook: T, handler:
|
|
246
|
+
before<T extends HookName>(hook: T, handler: HookHandler<T>, options: HookOptions): HookUnregister; // prettier-ignore
|
|
247
247
|
// Overload: no handler options
|
|
248
|
-
before<T extends HookName>(hook: T, handler:
|
|
248
|
+
before<T extends HookName>(hook: T, handler: HookHandler<T>): HookUnregister;
|
|
249
249
|
// Implementation
|
|
250
250
|
before<T extends HookName>(
|
|
251
251
|
hook: T,
|
|
252
|
-
handler:
|
|
252
|
+
handler: HookHandler<T>,
|
|
253
253
|
options: HookOptions = {}
|
|
254
254
|
): HookUnregister {
|
|
255
255
|
return this.on(hook, handler, { ...options, before: true });
|
|
@@ -265,13 +265,13 @@ export class Hooks {
|
|
|
265
265
|
* @see on
|
|
266
266
|
*/
|
|
267
267
|
// Overload: passed in handler options
|
|
268
|
-
replace<T extends HookName>(hook: T, handler:
|
|
268
|
+
replace<T extends HookName>(hook: T, handler: HookDefaultHandler<T>, options: HookOptions): HookUnregister; // prettier-ignore
|
|
269
269
|
// Overload: no handler options
|
|
270
|
-
replace<T extends HookName>(hook: T, handler:
|
|
270
|
+
replace<T extends HookName>(hook: T, handler: HookDefaultHandler<T>): HookUnregister; // prettier-ignore
|
|
271
271
|
// Implementation
|
|
272
272
|
replace<T extends HookName>(
|
|
273
273
|
hook: T,
|
|
274
|
-
handler:
|
|
274
|
+
handler: HookDefaultHandler<T>,
|
|
275
275
|
options: HookOptions = {}
|
|
276
276
|
): HookUnregister {
|
|
277
277
|
return this.on(hook, handler, { ...options, replace: true });
|
|
@@ -286,13 +286,13 @@ export class Hooks {
|
|
|
286
286
|
* @see on
|
|
287
287
|
*/
|
|
288
288
|
// Overload: passed in handler options
|
|
289
|
-
once<T extends HookName>(hook: T, handler:
|
|
289
|
+
once<T extends HookName>(hook: T, handler: HookHandler<T>, options: HookOptions): HookUnregister; // prettier-ignore
|
|
290
290
|
// Overload: no handler options
|
|
291
|
-
once<T extends HookName>(hook: T, handler:
|
|
291
|
+
once<T extends HookName>(hook: T, handler: HookHandler<T>): HookUnregister;
|
|
292
292
|
// Implementation
|
|
293
293
|
once<T extends HookName>(
|
|
294
294
|
hook: T,
|
|
295
|
-
handler:
|
|
295
|
+
handler: HookHandler<T>,
|
|
296
296
|
options: HookOptions = {}
|
|
297
297
|
): HookUnregister {
|
|
298
298
|
return this.on(hook, handler, { ...options, once: true });
|
|
@@ -305,11 +305,11 @@ export class Hooks {
|
|
|
305
305
|
* If omitted, all handlers for the hook will be removed.
|
|
306
306
|
*/
|
|
307
307
|
// Overload: unregister a specific handler
|
|
308
|
-
off<T extends HookName>(hook: T, handler:
|
|
308
|
+
off<T extends HookName>(hook: T, handler: HookHandler<T> | HookDefaultHandler<T>): void;
|
|
309
309
|
// Overload: unregister all handlers
|
|
310
310
|
off<T extends HookName>(hook: T): void;
|
|
311
311
|
// Implementation
|
|
312
|
-
off<T extends HookName>(hook: T, handler?:
|
|
312
|
+
off<T extends HookName>(hook: T, handler?: HookHandler<T> | HookDefaultHandler<T>): void {
|
|
313
313
|
const ledger = this.get(hook);
|
|
314
314
|
if (ledger && handler) {
|
|
315
315
|
const deleted = ledger.delete(handler);
|
|
@@ -332,8 +332,8 @@ export class Hooks {
|
|
|
332
332
|
async call<T extends HookName>(
|
|
333
333
|
hook: T,
|
|
334
334
|
args: HookArguments<T>,
|
|
335
|
-
defaultHandler?:
|
|
336
|
-
): Promise<Awaited<ReturnType<
|
|
335
|
+
defaultHandler?: HookDefaultHandler<T>
|
|
336
|
+
): Promise<Awaited<ReturnType<HookDefaultHandler<T>>>> {
|
|
337
337
|
const { before, handler, after } = this.getHandlers(hook, defaultHandler);
|
|
338
338
|
await this.run(before, args);
|
|
339
339
|
const [result] = await this.run(handler, args);
|
|
@@ -353,8 +353,8 @@ export class Hooks {
|
|
|
353
353
|
callSync<T extends HookName>(
|
|
354
354
|
hook: T,
|
|
355
355
|
args: HookArguments<T>,
|
|
356
|
-
defaultHandler?:
|
|
357
|
-
): ReturnType<
|
|
356
|
+
defaultHandler?: HookDefaultHandler<T>
|
|
357
|
+
): ReturnType<HookDefaultHandler<T>> {
|
|
358
358
|
const { before, handler, after } = this.getHandlers(hook, defaultHandler);
|
|
359
359
|
this.runSync(before, args);
|
|
360
360
|
const [result] = this.runSync(handler, args);
|
|
@@ -369,15 +369,15 @@ export class Hooks {
|
|
|
369
369
|
* @param args Arguments to pass to the handler
|
|
370
370
|
*/
|
|
371
371
|
|
|
372
|
-
// Overload: running
|
|
373
|
-
protected async run<T extends HookName>(registrations: HookRegistration<T,
|
|
372
|
+
// Overload: running HookDefaultHandler: expect HookDefaultHandler return type
|
|
373
|
+
protected async run<T extends HookName>(registrations: HookRegistration<T, HookDefaultHandler<T>>[], args: HookArguments<T>): Promise<Awaited<ReturnType<HookDefaultHandler<T>>>[]>; // prettier-ignore
|
|
374
374
|
// Overload: running user handler: expect no specific type
|
|
375
375
|
protected async run<T extends HookName>(registrations: HookRegistration<T>[], args: HookArguments<T>): Promise<unknown[]>; // prettier-ignore
|
|
376
376
|
// Implementation
|
|
377
377
|
protected async run<T extends HookName, R extends HookRegistration<T>[]>(
|
|
378
378
|
registrations: R,
|
|
379
379
|
args: HookArguments<T>
|
|
380
|
-
): Promise<Awaited<ReturnType<
|
|
380
|
+
): Promise<Awaited<ReturnType<HookDefaultHandler<T>>> | unknown[]> {
|
|
381
381
|
const results = [];
|
|
382
382
|
for (const { hook, handler, defaultHandler, once } of registrations) {
|
|
383
383
|
const result = await runAsPromise(handler, [this.swup.visit, args, defaultHandler]);
|
|
@@ -395,18 +395,18 @@ export class Hooks {
|
|
|
395
395
|
* @param args Arguments to pass to the handler
|
|
396
396
|
*/
|
|
397
397
|
|
|
398
|
-
// Overload: running
|
|
399
|
-
protected runSync<T extends HookName>(registrations: HookRegistration<T,
|
|
398
|
+
// Overload: running HookDefaultHandler: expect HookDefaultHandler return type
|
|
399
|
+
protected runSync<T extends HookName>(registrations: HookRegistration<T, HookDefaultHandler<T>>[], args: HookArguments<T> ): ReturnType<HookDefaultHandler<T>>[]; // prettier-ignore
|
|
400
400
|
// Overload: running user handler: expect no specific type
|
|
401
401
|
protected runSync<T extends HookName>(registrations: HookRegistration<T>[], args: HookArguments<T>): unknown[]; // prettier-ignore
|
|
402
402
|
// Implementation
|
|
403
403
|
protected runSync<T extends HookName, R extends HookRegistration<T>[]>(
|
|
404
404
|
registrations: R,
|
|
405
405
|
args: HookArguments<T>
|
|
406
|
-
): (ReturnType<
|
|
406
|
+
): (ReturnType<HookDefaultHandler<T>> | unknown)[] {
|
|
407
407
|
const results = [];
|
|
408
408
|
for (const { hook, handler, defaultHandler, once } of registrations) {
|
|
409
|
-
const result = (handler as
|
|
409
|
+
const result = (handler as HookDefaultHandler<T>)(this.swup.visit, args, defaultHandler); // prettier-ignore
|
|
410
410
|
results.push(result);
|
|
411
411
|
if (isPromise(result)) {
|
|
412
412
|
console.warn(
|
|
@@ -428,7 +428,7 @@ export class Hooks {
|
|
|
428
428
|
* @returns An object with the handlers sorted into `before` and `after` arrays,
|
|
429
429
|
* as well as a flag indicating if the original handler was replaced
|
|
430
430
|
*/
|
|
431
|
-
protected getHandlers<T extends HookName>(hook: T, defaultHandler?:
|
|
431
|
+
protected getHandlers<T extends HookName>(hook: T, defaultHandler?: HookDefaultHandler<T>) {
|
|
432
432
|
const ledger = this.get(hook);
|
|
433
433
|
if (!ledger) {
|
|
434
434
|
return { found: false, before: [], handler: [], after: [], replaced: false };
|
|
@@ -437,7 +437,7 @@ export class Hooks {
|
|
|
437
437
|
const registrations = Array.from(ledger.values());
|
|
438
438
|
|
|
439
439
|
// Let TypeScript know that replaced handlers are default handlers by filtering to true
|
|
440
|
-
const def = (T: HookRegistration<T>): T is HookRegistration<T,
|
|
440
|
+
const def = (T: HookRegistration<T>): T is HookRegistration<T, HookDefaultHandler<T>> => true; // prettier-ignore
|
|
441
441
|
const sort = this.sortRegistrations;
|
|
442
442
|
|
|
443
443
|
// Filter into before, after, and replace handlers
|
|
@@ -448,13 +448,13 @@ export class Hooks {
|
|
|
448
448
|
|
|
449
449
|
// Define main handler registration
|
|
450
450
|
// Created as HookRegistration[] array to allow passing it into hooks.run() directly
|
|
451
|
-
let handler: HookRegistration<T,
|
|
451
|
+
let handler: HookRegistration<T, HookDefaultHandler<T>>[] = [];
|
|
452
452
|
if (defaultHandler) {
|
|
453
453
|
handler = [{ id: 0, hook, handler: defaultHandler }];
|
|
454
454
|
if (replaced) {
|
|
455
455
|
const index = replace.length - 1;
|
|
456
456
|
const replacingHandler = replace[index].handler;
|
|
457
|
-
const createDefaultHandler = (index: number):
|
|
457
|
+
const createDefaultHandler = (index: number): HookDefaultHandler<T> | undefined => {
|
|
458
458
|
const next = replace[index - 1];
|
|
459
459
|
if (next) {
|
|
460
460
|
return (visit, args) =>
|
package/src/modules/Visit.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import Swup
|
|
2
|
-
import {
|
|
1
|
+
import type Swup from '../Swup.js';
|
|
2
|
+
import type { Options } from '../Swup.js';
|
|
3
|
+
import type { HistoryAction, HistoryDirection } from './navigate.js';
|
|
3
4
|
|
|
4
5
|
/** An object holding details about the current visit. */
|
|
5
6
|
export interface Visit {
|
package/src/modules/fetchPage.ts
CHANGED
package/src/modules/navigate.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import Swup from '../Swup.js';
|
|
1
|
+
import type Swup from '../Swup.js';
|
|
2
2
|
import { createHistoryRecord, updateHistoryRecord, getCurrentUrl, Location } from '../helpers.js';
|
|
3
|
-
import { FetchError, FetchOptions, PageData } from './fetchPage.js';
|
|
4
|
-
import { VisitInitOptions } from './Visit.js';
|
|
3
|
+
import { FetchError, type FetchOptions, type PageData } from './fetchPage.js';
|
|
4
|
+
import type { VisitInitOptions } from './Visit.js';
|
|
5
5
|
|
|
6
6
|
export type HistoryAction = 'push' | 'replace';
|
|
7
7
|
export type HistoryDirection = 'forwards' | 'backwards';
|
|
@@ -62,6 +62,7 @@ export async function performNavigation(
|
|
|
62
62
|
this: Swup,
|
|
63
63
|
options: NavigationOptions & FetchOptions = {}
|
|
64
64
|
): Promise<void> {
|
|
65
|
+
this.navigating = true;
|
|
65
66
|
// Save this localy to a) allow ignoring the visit if a new one was started in the meantime
|
|
66
67
|
// and b) avoid unintended modifications to any newer visits
|
|
67
68
|
const visit = this.visit;
|
|
@@ -166,6 +167,7 @@ export async function performNavigation(
|
|
|
166
167
|
// if (visit.to && this.isSameResolvedUrl(visit.to.url, requestedUrl)) {
|
|
167
168
|
// this.visit = this.createVisit({ to: undefined });
|
|
168
169
|
// }
|
|
170
|
+
this.navigating = false;
|
|
169
171
|
} catch (error) {
|
|
170
172
|
// Return early if error is undefined or signals an aborted request
|
|
171
173
|
if (!error || (error as FetchError)?.aborted) {
|
package/src/modules/plugins.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { updateHistoryRecord, getCurrentUrl, classify } from '../helpers.js';
|
|
2
|
-
import Swup from '../Swup.js';
|
|
3
|
-
import { PageData } from './fetchPage.js';
|
|
2
|
+
import type Swup from '../Swup.js';
|
|
3
|
+
import type { PageData } from './fetchPage.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Render the next page: replace the content and update scroll position.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import Swup
|
|
1
|
+
import type Swup from '../Swup.js';
|
|
2
|
+
import type { Options } from '../Swup.js';
|
|
2
3
|
import { query, queryAll } from '../utils.js';
|
|
3
|
-
import { PageData } from './fetchPage.js';
|
|
4
|
+
import type { PageData } from './fetchPage.js';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Perform the replacement of content after loading a page.
|