1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.invokeCallbacks = invokeCallbacks;
|
7 | exports.addRouteChangeStartListener = addRouteChangeStartListener;
|
8 | exports.removeRouteChangeStartListener = removeRouteChangeStartListener;
|
9 | exports.addRouteChangeEndListener = addRouteChangeEndListener;
|
10 | exports.removeRouteChangeEndListener = removeRouteChangeEndListener;
|
11 | exports._invokeRouteChangeStartCallbacks = _invokeRouteChangeStartCallbacks;
|
12 | exports._invokeRouteChangeEndCallbacks = _invokeRouteChangeEndCallbacks;
|
13 |
|
14 | var _prefixUrl = require('./prefix-url');
|
15 |
|
16 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
17 |
|
18 | var ALL_PATHS = '*';
|
19 | var startListeners = _defineProperty({}, ALL_PATHS, []);
|
20 | var endListeners = _defineProperty({}, ALL_PATHS, []);
|
21 |
|
22 | function normalizePathname(pathname) {
|
23 | if (pathname !== ALL_PATHS && !(0, _prefixUrl.isUrlPrefixed)(pathname)) {
|
24 | pathname = (0, _prefixUrl.prefixUrl)(pathname);
|
25 | }
|
26 | return pathname.replace(/\/$/, '');
|
27 | }
|
28 |
|
29 | function addListener(pathnameOrListener, maybeListener, registry, remover) {
|
30 | var listener = void 0;
|
31 | var pathname = void 0;
|
32 | if (typeof pathnameOrListener === 'function') {
|
33 | listener = pathnameOrListener;
|
34 | pathname = ALL_PATHS;
|
35 | } else {
|
36 | listener = maybeListener;
|
37 | pathname = pathnameOrListener;
|
38 | }
|
39 | pathname = normalizePathname(pathname);
|
40 | if (!registry[pathname]) {
|
41 | registry[pathname] = [];
|
42 | }
|
43 | registry[pathname].push(listener || noop);
|
44 | return function () {
|
45 | return remover(pathname, listener);
|
46 | };
|
47 | }
|
48 |
|
49 | function removeListener(pathnameOrListener, maybeListener, registry) {
|
50 | var listener = void 0;
|
51 | var pathname = void 0;
|
52 | if (typeof pathnameOrListener === 'function' || !pathnameOrListener) {
|
53 | listener = pathnameOrListener;
|
54 | pathname = ALL_PATHS;
|
55 | } else {
|
56 | listener = maybeListener;
|
57 | pathname = pathnameOrListener;
|
58 | }
|
59 | pathname = normalizePathname(pathname);
|
60 | if (!listener) {
|
61 | registry[pathname] = [];
|
62 | return;
|
63 | }
|
64 | var listeners = registry[pathname];
|
65 | for (var i = 0, l = listeners.length; i < l; i++) {
|
66 | if (listeners[i] === listener) {
|
67 | listeners.splice(i, 1);
|
68 | return;
|
69 | }
|
70 | }
|
71 | }
|
72 |
|
73 | function invokeCallbacks(nextPathname, registery) {
|
74 | nextPathname = normalizePathname(nextPathname);
|
75 | var promisesToKeep = [Promise.resolve()];
|
76 | if (registery[nextPathname]) {
|
77 | registery[nextPathname].forEach(function (callback) {
|
78 | promisesToKeep.push(Promise.resolve(callback(nextPathname)));
|
79 | });
|
80 | }
|
81 | registery[ALL_PATHS].forEach(function (callback) {
|
82 | promisesToKeep.push(Promise.resolve(callback(nextPathname)));
|
83 | });
|
84 | return Promise.all(promisesToKeep);
|
85 | }
|
86 |
|
87 | function addRouteChangeStartListener(pathnameOrListener, maybeListener) {
|
88 | return addListener(pathnameOrListener, maybeListener, startListeners, removeRouteChangeStartListener);
|
89 | }
|
90 |
|
91 | function removeRouteChangeStartListener(pathnameOrListener, maybeListener) {
|
92 | removeListener(pathnameOrListener, maybeListener, startListeners);
|
93 | }
|
94 |
|
95 | function addRouteChangeEndListener(pathnameOrListener, maybeListener) {
|
96 | return addListener(pathnameOrListener, maybeListener, endListeners, removeRouteChangeEndListener);
|
97 | }
|
98 |
|
99 | function removeRouteChangeEndListener(pathnameOrListener, maybeListener) {
|
100 | removeListener(pathnameOrListener, maybeListener, endListeners);
|
101 | }
|
102 |
|
103 | function _invokeRouteChangeStartCallbacks(nextPathname) {
|
104 | return invokeCallbacks(nextPathname, startListeners);
|
105 | }
|
106 |
|
107 | function _invokeRouteChangeEndCallbacks(nextPathname) {
|
108 | return invokeCallbacks(nextPathname, endListeners);
|
109 | }
|
110 |
|
111 | function noop() {} |
\ | No newline at end of file |