UNPKG

3.69 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.invokeCallbacks = invokeCallbacks;
7exports.addRouteChangeStartListener = addRouteChangeStartListener;
8exports.removeRouteChangeStartListener = removeRouteChangeStartListener;
9exports.addRouteChangeEndListener = addRouteChangeEndListener;
10exports.removeRouteChangeEndListener = removeRouteChangeEndListener;
11exports._invokeRouteChangeStartCallbacks = _invokeRouteChangeStartCallbacks;
12exports._invokeRouteChangeEndCallbacks = _invokeRouteChangeEndCallbacks;
13
14var _prefixUrl = require('./prefix-url');
15
16function _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
18var ALL_PATHS = '*';
19var startListeners = _defineProperty({}, ALL_PATHS, []);
20var endListeners = _defineProperty({}, ALL_PATHS, []);
21
22function normalizePathname(pathname) {
23 if (pathname !== ALL_PATHS && !(0, _prefixUrl.isUrlPrefixed)(pathname)) {
24 pathname = (0, _prefixUrl.prefixUrl)(pathname);
25 }
26 return pathname.replace(/\/$/, '');
27}
28
29function 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
49function 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
73function 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
87function addRouteChangeStartListener(pathnameOrListener, maybeListener) {
88 return addListener(pathnameOrListener, maybeListener, startListeners, removeRouteChangeStartListener);
89}
90
91function removeRouteChangeStartListener(pathnameOrListener, maybeListener) {
92 removeListener(pathnameOrListener, maybeListener, startListeners);
93}
94
95function addRouteChangeEndListener(pathnameOrListener, maybeListener) {
96 return addListener(pathnameOrListener, maybeListener, endListeners, removeRouteChangeEndListener);
97}
98
99function removeRouteChangeEndListener(pathnameOrListener, maybeListener) {
100 removeListener(pathnameOrListener, maybeListener, endListeners);
101}
102
103function _invokeRouteChangeStartCallbacks(nextPathname) {
104 return invokeCallbacks(nextPathname, startListeners);
105}
106
107function _invokeRouteChangeEndCallbacks(nextPathname) {
108 return invokeCallbacks(nextPathname, endListeners);
109}
110
111function noop() {}
\No newline at end of file