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.
Files changed (84) hide show
  1. package/dist/Swup.cjs +1 -1
  2. package/dist/Swup.cjs.map +1 -1
  3. package/dist/Swup.modern.js +1 -1
  4. package/dist/Swup.modern.js.map +1 -1
  5. package/dist/Swup.module.js +1 -1
  6. package/dist/Swup.module.js.map +1 -1
  7. package/dist/Swup.umd.js +1 -1
  8. package/dist/Swup.umd.js.map +1 -1
  9. package/dist/types/Swup.d.ts +8 -5
  10. package/dist/types/Swup.d.ts.map +1 -0
  11. package/dist/types/config/version.d.ts +1 -0
  12. package/dist/types/config/version.d.ts.map +1 -0
  13. package/dist/types/helpers/Location.d.ts +1 -0
  14. package/dist/types/helpers/Location.d.ts.map +1 -0
  15. package/dist/types/helpers/classify.d.ts +1 -0
  16. package/dist/types/helpers/classify.d.ts.map +1 -0
  17. package/dist/types/helpers/createHistoryRecord.d.ts +1 -0
  18. package/dist/types/helpers/createHistoryRecord.d.ts.map +1 -0
  19. package/dist/types/helpers/delegateEvent.d.ts +3 -2
  20. package/dist/types/helpers/delegateEvent.d.ts.map +1 -0
  21. package/dist/types/helpers/getCurrentUrl.d.ts +1 -0
  22. package/dist/types/helpers/getCurrentUrl.d.ts.map +1 -0
  23. package/dist/types/helpers/matchPath.d.ts +2 -1
  24. package/dist/types/helpers/matchPath.d.ts.map +1 -0
  25. package/dist/types/helpers/updateHistoryRecord.d.ts +1 -0
  26. package/dist/types/helpers/updateHistoryRecord.d.ts.map +1 -0
  27. package/dist/types/helpers.d.ts +1 -0
  28. package/dist/types/helpers.d.ts.map +1 -0
  29. package/dist/types/index.d.ts +4 -2
  30. package/dist/types/index.d.ts.map +1 -0
  31. package/dist/types/modules/Cache.d.ts +3 -2
  32. package/dist/types/modules/Cache.d.ts.map +1 -0
  33. package/dist/types/modules/Classes.d.ts +2 -1
  34. package/dist/types/modules/Classes.d.ts.map +1 -0
  35. package/dist/types/modules/Hooks.d.ts +30 -29
  36. package/dist/types/modules/Hooks.d.ts.map +1 -0
  37. package/dist/types/modules/Visit.d.ts +4 -2
  38. package/dist/types/modules/Visit.d.ts.map +1 -0
  39. package/dist/types/modules/animatePageIn.d.ts +2 -1
  40. package/dist/types/modules/animatePageIn.d.ts.map +1 -0
  41. package/dist/types/modules/animatePageOut.d.ts +2 -1
  42. package/dist/types/modules/animatePageOut.d.ts.map +1 -0
  43. package/dist/types/modules/awaitAnimations.d.ts +3 -1
  44. package/dist/types/modules/awaitAnimations.d.ts.map +1 -0
  45. package/dist/types/modules/fetchPage.d.ts +2 -1
  46. package/dist/types/modules/fetchPage.d.ts.map +1 -0
  47. package/dist/types/modules/getAnchorElement.d.ts +1 -0
  48. package/dist/types/modules/getAnchorElement.d.ts.map +1 -0
  49. package/dist/types/modules/navigate.d.ts +4 -3
  50. package/dist/types/modules/navigate.d.ts.map +1 -0
  51. package/dist/types/modules/plugins.d.ts +2 -1
  52. package/dist/types/modules/plugins.d.ts.map +1 -0
  53. package/dist/types/modules/renderPage.d.ts +3 -2
  54. package/dist/types/modules/renderPage.d.ts.map +1 -0
  55. package/dist/types/modules/replaceContent.d.ts +4 -2
  56. package/dist/types/modules/replaceContent.d.ts.map +1 -0
  57. package/dist/types/modules/resolveUrl.d.ts +2 -1
  58. package/dist/types/modules/resolveUrl.d.ts.map +1 -0
  59. package/dist/types/modules/scrollToContent.d.ts +2 -1
  60. package/dist/types/modules/scrollToContent.d.ts.map +1 -0
  61. package/dist/types/utils/index.d.ts +1 -0
  62. package/dist/types/utils/index.d.ts.map +1 -0
  63. package/dist/types/utils.d.ts +1 -0
  64. package/dist/types/utils.d.ts.map +1 -0
  65. package/package.json +3 -1
  66. package/src/Swup.ts +14 -6
  67. package/src/helpers/delegateEvent.ts +6 -2
  68. package/src/helpers/matchPath.ts +1 -1
  69. package/src/helpers/updateHistoryRecord.ts +1 -1
  70. package/src/index.ts +13 -8
  71. package/src/modules/Cache.ts +2 -2
  72. package/src/modules/Classes.ts +1 -1
  73. package/src/modules/Hooks.ts +41 -41
  74. package/src/modules/Visit.ts +3 -2
  75. package/src/modules/animatePageIn.ts +1 -1
  76. package/src/modules/animatePageOut.ts +1 -1
  77. package/src/modules/awaitAnimations.ts +2 -1
  78. package/src/modules/fetchPage.ts +1 -1
  79. package/src/modules/navigate.ts +5 -3
  80. package/src/modules/plugins.ts +1 -1
  81. package/src/modules/renderPage.ts +2 -2
  82. package/src/modules/replaceContent.ts +3 -2
  83. package/src/modules/resolveUrl.ts +1 -1
  84. 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, { DelegateEventHandler, DelegateOptions, EventType } from 'delegate-it';
2
- import { ParseSelector } from 'typed-query-selector/parser.js';
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;
@@ -8,7 +8,7 @@ import type {
8
8
  MatchFunction
9
9
  } from 'path-to-regexp';
10
10
 
11
- export { Path };
11
+ export { type Path };
12
12
 
13
13
  /** Create a match function from a path pattern that checks if a URLs matches it. */
14
14
  export const matchPath = <P extends object = object>(
@@ -1,4 +1,4 @@
1
- import { HistoryState } from './createHistoryRecord.js';
1
+ import type { HistoryState } from './createHistoryRecord.js';
2
2
  import { getCurrentUrl } from './getCurrentUrl.js';
3
3
 
4
4
  /** Update the current history record with a custom swup identifier. */
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
@@ -1,6 +1,6 @@
1
- import Swup from '../Swup.js';
1
+ import type Swup from '../Swup.js';
2
2
  import { Location } from '../helpers.js';
3
- import { PageData } from './fetchPage.js';
3
+ import { type PageData } from './fetchPage.js';
4
4
 
5
5
  export interface CacheData extends PageData {}
6
6
 
@@ -1,4 +1,4 @@
1
- import Swup from '../Swup.js';
1
+ import type Swup from '../Swup.js';
2
2
  import { queryAll } from '../utils.js';
3
3
 
4
4
  export class Classes {
@@ -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 Handler<T extends HookName> = (
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 DefaultHandler<T extends HookName> = (
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?: DefaultHandler<T>
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]: Handler<K>[];
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 Handler<T> | DefaultHandler<T> = Handler<T>
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?: DefaultHandler<T>;
96
+ defaultHandler?: HookDefaultHandler<T>;
97
97
  } & HookOptions;
98
98
 
99
- type HookLedger<T extends HookName> = Map<Handler<T>, HookRegistration<T>>;
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: DefaultHandler<T>, options: O & { replace: true }): HookUnregister; // prettier-ignore
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: Handler<T>, options: O): HookUnregister; // prettier-ignore
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: Handler<T>): HookUnregister; // prettier-ignore
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 ? DefaultHandler<T> : Handler<T>,
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: Handler<T>, options: HookOptions): HookUnregister;
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: Handler<T>): HookUnregister;
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: Handler<T>,
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: DefaultHandler<T>, options: HookOptions): HookUnregister; // prettier-ignore
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: DefaultHandler<T>): HookUnregister; // prettier-ignore
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: DefaultHandler<T>,
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: Handler<T>, options: HookOptions): HookUnregister;
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: Handler<T>): HookUnregister;
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: Handler<T>,
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: Handler<T> | DefaultHandler<T>): void;
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?: Handler<T> | DefaultHandler<T>): void {
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?: DefaultHandler<T>
336
- ): Promise<Awaited<ReturnType<DefaultHandler<T>>>> {
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?: DefaultHandler<T>
357
- ): ReturnType<DefaultHandler<T>> {
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 DefaultHandler: expect DefaultHandler return type
373
- protected async run<T extends HookName>(registrations: HookRegistration<T, DefaultHandler<T>>[], args: HookArguments<T>): Promise<Awaited<ReturnType<DefaultHandler<T>>>[]>; // prettier-ignore
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<DefaultHandler<T>>> | unknown[]> {
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 DefaultHandler: expect DefaultHandler return type
399
- protected runSync<T extends HookName>(registrations: HookRegistration<T, DefaultHandler<T>>[], args: HookArguments<T> ): ReturnType<DefaultHandler<T>>[]; // prettier-ignore
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<DefaultHandler<T>> | unknown)[] {
406
+ ): (ReturnType<HookDefaultHandler<T>> | unknown)[] {
407
407
  const results = [];
408
408
  for (const { hook, handler, defaultHandler, once } of registrations) {
409
- const result = (handler as DefaultHandler<T>)(this.swup.visit, args, defaultHandler);
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?: DefaultHandler<T>) {
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, DefaultHandler<T>> => true;
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, DefaultHandler<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): DefaultHandler<T> | undefined => {
457
+ const createDefaultHandler = (index: number): HookDefaultHandler<T> | undefined => {
458
458
  const next = replace[index - 1];
459
459
  if (next) {
460
460
  return (visit, args) =>
@@ -1,5 +1,6 @@
1
- import Swup, { Options } from '../Swup.js';
2
- import { HistoryAction, HistoryDirection } from './navigate.js';
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 {
@@ -1,4 +1,4 @@
1
- import Swup from '../Swup.js';
1
+ import type Swup from '../Swup.js';
2
2
  import { nextTick } from '../utils.js';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- import Swup from '../Swup.js';
1
+ import type Swup from '../Swup.js';
2
2
  import { classify } from '../helpers.js';
3
3
 
4
4
  /**
@@ -1,5 +1,6 @@
1
1
  import { queryAll, toMs } from '../utils.js';
2
- import Swup, { Options } from '../Swup.js';
2
+ import type Swup from '../Swup.js';
3
+ import type { Options } from '../Swup.js';
3
4
 
4
5
  const TRANSITION = 'transition';
5
6
  const ANIMATION = 'animation';
@@ -1,4 +1,4 @@
1
- import Swup from '../Swup.js';
1
+ import type Swup from '../Swup.js';
2
2
  import { Location } from '../helpers.js';
3
3
 
4
4
  /** A page object as used by swup and its cache. */
@@ -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) {
@@ -1,4 +1,4 @@
1
- import Swup from '../Swup.js';
1
+ import type Swup from '../Swup.js';
2
2
 
3
3
  export type Plugin = {
4
4
  /** Identify as a swup plugin */
@@ -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, { Options } from '../Swup.js';
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.
@@ -1,4 +1,4 @@
1
- import Swup from '../Swup.js';
1
+ import type Swup from '../Swup.js';
2
2
 
3
3
  /**
4
4
  * Utility function to validate and run the global option 'resolveUrl'
@@ -1,4 +1,4 @@
1
- import Swup from '../Swup.js';
1
+ import type Swup from '../Swup.js';
2
2
 
3
3
  /**
4
4
  * Update the scroll position after page render.