kdu-router 3.4.0-beta.0 → 3.6.0

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 (49) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +11 -9
  3. package/dist/composables.js +253 -0
  4. package/dist/composables.mjs +244 -0
  5. package/dist/kdu-router.common.js +2682 -2572
  6. package/dist/kdu-router.esm.browser.js +2677 -2563
  7. package/dist/kdu-router.esm.browser.min.js +5 -5
  8. package/dist/kdu-router.esm.js +2685 -2572
  9. package/dist/kdu-router.js +2682 -2573
  10. package/dist/kdu-router.min.js +5 -5
  11. package/ketur/attributes.json +38 -38
  12. package/ketur/tags.json +20 -20
  13. package/package.json +115 -111
  14. package/src/components/link.js +224 -197
  15. package/src/components/view.js +155 -149
  16. package/src/composables/globals.js +34 -0
  17. package/src/composables/guards.js +68 -0
  18. package/src/composables/index.js +3 -0
  19. package/src/composables/useLink.js +113 -0
  20. package/src/composables/utils.js +11 -0
  21. package/src/create-matcher.js +226 -200
  22. package/src/create-route-map.js +220 -205
  23. package/src/entries/cjs.js +3 -0
  24. package/src/entries/esm.js +12 -0
  25. package/src/history/abstract.js +72 -68
  26. package/src/history/base.js +379 -400
  27. package/src/history/hash.js +152 -163
  28. package/src/history/html5.js +99 -94
  29. package/src/index.js +3 -277
  30. package/src/install.js +52 -52
  31. package/src/router.js +293 -0
  32. package/src/util/async.js +18 -18
  33. package/src/util/dom.js +3 -3
  34. package/src/util/errors.js +86 -85
  35. package/src/util/location.js +69 -69
  36. package/src/util/misc.js +6 -6
  37. package/src/util/params.js +37 -37
  38. package/src/util/path.js +74 -74
  39. package/src/util/push-state.js +46 -46
  40. package/src/util/query.js +113 -96
  41. package/src/util/resolve-components.js +109 -109
  42. package/src/util/route.js +151 -132
  43. package/src/util/scroll.js +175 -165
  44. package/src/util/state-key.js +22 -22
  45. package/src/util/warn.js +14 -14
  46. package/types/composables.d.ts +53 -0
  47. package/types/index.d.ts +25 -17
  48. package/types/kdu.d.ts +22 -22
  49. package/types/router.d.ts +564 -170
package/src/index.js CHANGED
@@ -1,277 +1,3 @@
1
- /* @flow */
2
-
3
- import { install } from './install'
4
- import { START } from './util/route'
5
- import { assert } from './util/warn'
6
- import { inBrowser } from './util/dom'
7
- import { cleanPath } from './util/path'
8
- import { createMatcher } from './create-matcher'
9
- import { normalizeLocation } from './util/location'
10
- import { supportsPushState } from './util/push-state'
11
- import { handleScroll } from './util/scroll'
12
-
13
- import { HashHistory } from './history/hash'
14
- import { HTML5History } from './history/html5'
15
- import { AbstractHistory } from './history/abstract'
16
-
17
- import type { Matcher } from './create-matcher'
18
-
19
- import { isNavigationFailure, NavigationFailureType } from './util/errors'
20
-
21
- export default class KduRouter {
22
- static install: () => void
23
- static version: string
24
- static isNavigationFailure: Function
25
- static NavigationFailureType: any
26
-
27
- app: any
28
- apps: Array<any>
29
- ready: boolean
30
- readyCbs: Array<Function>
31
- options: RouterOptions
32
- mode: string
33
- history: HashHistory | HTML5History | AbstractHistory
34
- matcher: Matcher
35
- fallback: boolean
36
- beforeHooks: Array<?NavigationGuard>
37
- resolveHooks: Array<?NavigationGuard>
38
- afterHooks: Array<?AfterNavigationHook>
39
-
40
- constructor (options: RouterOptions = {}) {
41
- this.app = null
42
- this.apps = []
43
- this.options = options
44
- this.beforeHooks = []
45
- this.resolveHooks = []
46
- this.afterHooks = []
47
- this.matcher = createMatcher(options.routes || [], this)
48
-
49
- let mode = options.mode || 'hash'
50
- this.fallback =
51
- mode === 'history' && !supportsPushState && options.fallback !== false
52
- if (this.fallback) {
53
- mode = 'hash'
54
- }
55
- if (!inBrowser) {
56
- mode = 'abstract'
57
- }
58
- this.mode = mode
59
-
60
- switch (mode) {
61
- case 'history':
62
- this.history = new HTML5History(this, options.base)
63
- break
64
- case 'hash':
65
- this.history = new HashHistory(this, options.base, this.fallback)
66
- break
67
- case 'abstract':
68
- this.history = new AbstractHistory(this, options.base)
69
- break
70
- default:
71
- if (process.env.NODE_ENV !== 'production') {
72
- assert(false, `invalid mode: ${mode}`)
73
- }
74
- }
75
- }
76
-
77
- match (raw: RawLocation, current?: Route, redirectedFrom?: Location): Route {
78
- return this.matcher.match(raw, current, redirectedFrom)
79
- }
80
-
81
- get currentRoute (): ?Route {
82
- return this.history && this.history.current
83
- }
84
-
85
- init (app: any /* Kdu component instance */) {
86
- process.env.NODE_ENV !== 'production' &&
87
- assert(
88
- install.installed,
89
- `not installed. Make sure to call \`Kdu.use(KduRouter)\` ` +
90
- `before creating root instance.`
91
- )
92
-
93
- this.apps.push(app)
94
-
95
- // set up app destroyed handler
96
- app.$once('hook:destroyed', () => {
97
- // clean out app from this.apps array once destroyed
98
- const index = this.apps.indexOf(app)
99
- if (index > -1) this.apps.splice(index, 1)
100
- // ensure we still have a main app or null if no apps
101
- // we do not release the router so it can be reused
102
- if (this.app === app) this.app = this.apps[0] || null
103
-
104
- if (!this.app) {
105
- // clean up event listeners
106
- this.history.teardownListeners()
107
- }
108
- })
109
-
110
- // main app previously initialized
111
- // return as we don't need to set up new history listener
112
- if (this.app) {
113
- return
114
- }
115
-
116
- this.app = app
117
-
118
- const history = this.history
119
-
120
- if (history instanceof HTML5History || history instanceof HashHistory) {
121
- const handleInitialScroll = routeOrError => {
122
- const from = history.current
123
- const expectScroll = this.options.scrollBehavior
124
- const supportsScroll = supportsPushState && expectScroll
125
-
126
- if (supportsScroll && 'fullPath' in routeOrError) {
127
- handleScroll(this, routeOrError, from, false)
128
- }
129
- }
130
- const setupListeners = routeOrError => {
131
- history.setupListeners()
132
- handleInitialScroll(routeOrError)
133
- }
134
- history.transitionTo(
135
- history.getCurrentLocation(),
136
- setupListeners,
137
- setupListeners
138
- )
139
- }
140
-
141
- history.listen(route => {
142
- this.apps.forEach(app => {
143
- app._route = route
144
- })
145
- })
146
- }
147
-
148
- beforeEach (fn: Function): Function {
149
- return registerHook(this.beforeHooks, fn)
150
- }
151
-
152
- beforeResolve (fn: Function): Function {
153
- return registerHook(this.resolveHooks, fn)
154
- }
155
-
156
- afterEach (fn: Function): Function {
157
- return registerHook(this.afterHooks, fn)
158
- }
159
-
160
- onReady (cb: Function, errorCb?: Function) {
161
- this.history.onReady(cb, errorCb)
162
- }
163
-
164
- onError (errorCb: Function) {
165
- this.history.onError(errorCb)
166
- }
167
-
168
- push (location: RawLocation, onComplete?: Function, onAbort?: Function) {
169
- // $flow-disable-line
170
- if (!onComplete && !onAbort && typeof Promise !== 'undefined') {
171
- return new Promise((resolve, reject) => {
172
- this.history.push(location, resolve, reject)
173
- })
174
- } else {
175
- this.history.push(location, onComplete, onAbort)
176
- }
177
- }
178
-
179
- replace (location: RawLocation, onComplete?: Function, onAbort?: Function) {
180
- // $flow-disable-line
181
- if (!onComplete && !onAbort && typeof Promise !== 'undefined') {
182
- return new Promise((resolve, reject) => {
183
- this.history.replace(location, resolve, reject)
184
- })
185
- } else {
186
- this.history.replace(location, onComplete, onAbort)
187
- }
188
- }
189
-
190
- go (n: number) {
191
- this.history.go(n)
192
- }
193
-
194
- back () {
195
- this.go(-1)
196
- }
197
-
198
- forward () {
199
- this.go(1)
200
- }
201
-
202
- getMatchedComponents (to?: RawLocation | Route): Array<any> {
203
- const route: any = to
204
- ? to.matched
205
- ? to
206
- : this.resolve(to).route
207
- : this.currentRoute
208
- if (!route) {
209
- return []
210
- }
211
- return [].concat.apply(
212
- [],
213
- route.matched.map(m => {
214
- return Object.keys(m.components).map(key => {
215
- return m.components[key]
216
- })
217
- })
218
- )
219
- }
220
-
221
- resolve (
222
- to: RawLocation,
223
- current?: Route,
224
- append?: boolean
225
- ): {
226
- location: Location,
227
- route: Route,
228
- href: string,
229
- // for backwards compat
230
- normalizedTo: Location,
231
- resolved: Route
232
- } {
233
- current = current || this.history.current
234
- const location = normalizeLocation(to, current, append, this)
235
- const route = this.match(location, current)
236
- const fullPath = route.redirectedFrom || route.fullPath
237
- const base = this.history.base
238
- const href = createHref(base, fullPath, this.mode)
239
- return {
240
- location,
241
- route,
242
- href,
243
- // for backwards compat
244
- normalizedTo: location,
245
- resolved: route
246
- }
247
- }
248
-
249
- addRoutes (routes: Array<RouteConfig>) {
250
- this.matcher.addRoutes(routes)
251
- if (this.history.current !== START) {
252
- this.history.transitionTo(this.history.getCurrentLocation())
253
- }
254
- }
255
- }
256
-
257
- function registerHook (list: Array<any>, fn: Function): Function {
258
- list.push(fn)
259
- return () => {
260
- const i = list.indexOf(fn)
261
- if (i > -1) list.splice(i, 1)
262
- }
263
- }
264
-
265
- function createHref (base: string, fullPath: string, mode) {
266
- var path = mode === 'hash' ? '#' + fullPath : fullPath
267
- return base ? cleanPath(base + '/' + path) : path
268
- }
269
-
270
- KduRouter.install = install
271
- KduRouter.version = '__VERSION__'
272
- KduRouter.isNavigationFailure = isNavigationFailure
273
- KduRouter.NavigationFailureType = NavigationFailureType
274
-
275
- if (inBrowser && window.Kdu) {
276
- window.Kdu.use(KduRouter)
277
- }
1
+ import KduRouter from './entries/cjs'
2
+
3
+ export default KduRouter
package/src/install.js CHANGED
@@ -1,52 +1,52 @@
1
- import View from './components/view'
2
- import Link from './components/link'
3
-
4
- export let _Kdu
5
-
6
- export function install (Kdu) {
7
- if (install.installed && _Kdu === Kdu) return
8
- install.installed = true
9
-
10
- _Kdu = Kdu
11
-
12
- const isDef = v => v !== undefined
13
-
14
- const registerInstance = (vm, callVal) => {
15
- let i = vm.$options._parentKnode
16
- if (isDef(i) && isDef(i = i.data) && isDef(i = i.registerRouteInstance)) {
17
- i(vm, callVal)
18
- }
19
- }
20
-
21
- Kdu.mixin({
22
- beforeCreate () {
23
- if (isDef(this.$options.router)) {
24
- this._routerRoot = this
25
- this._router = this.$options.router
26
- this._router.init(this)
27
- Kdu.util.defineReactive(this, '_route', this._router.history.current)
28
- } else {
29
- this._routerRoot = (this.$parent && this.$parent._routerRoot) || this
30
- }
31
- registerInstance(this, this)
32
- },
33
- destroyed () {
34
- registerInstance(this)
35
- }
36
- })
37
-
38
- Object.defineProperty(Kdu.prototype, '$router', {
39
- get () { return this._routerRoot._router }
40
- })
41
-
42
- Object.defineProperty(Kdu.prototype, '$route', {
43
- get () { return this._routerRoot._route }
44
- })
45
-
46
- Kdu.component('RouterView', View)
47
- Kdu.component('RouterLink', Link)
48
-
49
- const strats = Kdu.config.optionMergeStrategies
50
- // use the same hook merging strategy for route hooks
51
- strats.beforeRouteEnter = strats.beforeRouteLeave = strats.beforeRouteUpdate = strats.created
52
- }
1
+ import View from './components/view'
2
+ import Link from './components/link'
3
+
4
+ export let _Kdu
5
+
6
+ export function install (Kdu) {
7
+ if (install.installed && _Kdu === Kdu) return
8
+ install.installed = true
9
+
10
+ _Kdu = Kdu
11
+
12
+ const isDef = v => v !== undefined
13
+
14
+ const registerInstance = (vm, callVal) => {
15
+ let i = vm.$options._parentKnode
16
+ if (isDef(i) && isDef(i = i.data) && isDef(i = i.registerRouteInstance)) {
17
+ i(vm, callVal)
18
+ }
19
+ }
20
+
21
+ Kdu.mixin({
22
+ beforeCreate () {
23
+ if (isDef(this.$options.router)) {
24
+ this._routerRoot = this
25
+ this._router = this.$options.router
26
+ this._router.init(this)
27
+ Kdu.util.defineReactive(this, '_route', this._router.history.current)
28
+ } else {
29
+ this._routerRoot = (this.$parent && this.$parent._routerRoot) || this
30
+ }
31
+ registerInstance(this, this)
32
+ },
33
+ destroyed () {
34
+ registerInstance(this)
35
+ }
36
+ })
37
+
38
+ Object.defineProperty(Kdu.prototype, '$router', {
39
+ get () { return this._routerRoot._router }
40
+ })
41
+
42
+ Object.defineProperty(Kdu.prototype, '$route', {
43
+ get () { return this._routerRoot._route }
44
+ })
45
+
46
+ Kdu.component('RouterView', View)
47
+ Kdu.component('RouterLink', Link)
48
+
49
+ const strats = Kdu.config.optionMergeStrategies
50
+ // use the same hook merging strategy for route hooks
51
+ strats.beforeRouteEnter = strats.beforeRouteLeave = strats.beforeRouteUpdate = strats.created
52
+ }
package/src/router.js ADDED
@@ -0,0 +1,293 @@
1
+ /* @flow */
2
+
3
+ import { install } from './install'
4
+ import { START } from './util/route'
5
+ import { assert, warn } from './util/warn'
6
+ import { inBrowser } from './util/dom'
7
+ import { cleanPath } from './util/path'
8
+ import { createMatcher } from './create-matcher'
9
+ import { normalizeLocation } from './util/location'
10
+ import { supportsPushState } from './util/push-state'
11
+ import { handleScroll } from './util/scroll'
12
+ import { isNavigationFailure, NavigationFailureType } from './util/errors'
13
+
14
+ import { HashHistory } from './history/hash'
15
+ import { HTML5History } from './history/html5'
16
+ import { AbstractHistory } from './history/abstract'
17
+
18
+ import type { Matcher } from './create-matcher'
19
+
20
+ export default class KduRouter {
21
+ static install: () => void
22
+ static version: string
23
+ static isNavigationFailure: Function
24
+ static NavigationFailureType: any
25
+ static START_LOCATION: Route
26
+
27
+ app: any
28
+ apps: Array<any>
29
+ ready: boolean
30
+ readyCbs: Array<Function>
31
+ options: RouterOptions
32
+ mode: string
33
+ history: HashHistory | HTML5History | AbstractHistory
34
+ matcher: Matcher
35
+ fallback: boolean
36
+ beforeHooks: Array<?NavigationGuard>
37
+ resolveHooks: Array<?NavigationGuard>
38
+ afterHooks: Array<?AfterNavigationHook>
39
+
40
+ constructor (options: RouterOptions = {}) {
41
+ if (process.env.NODE_ENV !== 'production') {
42
+ warn(this instanceof KduRouter, `Router must be called with the new operator.`)
43
+ }
44
+ this.app = null
45
+ this.apps = []
46
+ this.options = options
47
+ this.beforeHooks = []
48
+ this.resolveHooks = []
49
+ this.afterHooks = []
50
+ this.matcher = createMatcher(options.routes || [], this)
51
+
52
+ let mode = options.mode || 'hash'
53
+ this.fallback =
54
+ mode === 'history' && !supportsPushState && options.fallback !== false
55
+ if (this.fallback) {
56
+ mode = 'hash'
57
+ }
58
+ if (!inBrowser) {
59
+ mode = 'abstract'
60
+ }
61
+ this.mode = mode
62
+
63
+ switch (mode) {
64
+ case 'history':
65
+ this.history = new HTML5History(this, options.base)
66
+ break
67
+ case 'hash':
68
+ this.history = new HashHistory(this, options.base, this.fallback)
69
+ break
70
+ case 'abstract':
71
+ this.history = new AbstractHistory(this, options.base)
72
+ break
73
+ default:
74
+ if (process.env.NODE_ENV !== 'production') {
75
+ assert(false, `invalid mode: ${mode}`)
76
+ }
77
+ }
78
+ }
79
+
80
+ match (raw: RawLocation, current?: Route, redirectedFrom?: Location): Route {
81
+ return this.matcher.match(raw, current, redirectedFrom)
82
+ }
83
+
84
+ get currentRoute (): ?Route {
85
+ return this.history && this.history.current
86
+ }
87
+
88
+ init (app: any /* Kdu component instance */) {
89
+ process.env.NODE_ENV !== 'production' &&
90
+ assert(
91
+ install.installed,
92
+ `not installed. Make sure to call \`Kdu.use(KduRouter)\` ` +
93
+ `before creating root instance.`
94
+ )
95
+
96
+ this.apps.push(app)
97
+
98
+ // set up app destroyed handler
99
+ app.$once('hook:destroyed', () => {
100
+ // clean out app from this.apps array once destroyed
101
+ const index = this.apps.indexOf(app)
102
+ if (index > -1) this.apps.splice(index, 1)
103
+ // ensure we still have a main app or null if no apps
104
+ // we do not release the router so it can be reused
105
+ if (this.app === app) this.app = this.apps[0] || null
106
+
107
+ if (!this.app) this.history.teardown()
108
+ })
109
+
110
+ // main app previously initialized
111
+ // return as we don't need to set up new history listener
112
+ if (this.app) {
113
+ return
114
+ }
115
+
116
+ this.app = app
117
+
118
+ const history = this.history
119
+
120
+ if (history instanceof HTML5History || history instanceof HashHistory) {
121
+ const handleInitialScroll = routeOrError => {
122
+ const from = history.current
123
+ const expectScroll = this.options.scrollBehavior
124
+ const supportsScroll = supportsPushState && expectScroll
125
+
126
+ if (supportsScroll && 'fullPath' in routeOrError) {
127
+ handleScroll(this, routeOrError, from, false)
128
+ }
129
+ }
130
+ const setupListeners = routeOrError => {
131
+ history.setupListeners()
132
+ handleInitialScroll(routeOrError)
133
+ }
134
+ history.transitionTo(
135
+ history.getCurrentLocation(),
136
+ setupListeners,
137
+ setupListeners
138
+ )
139
+ }
140
+
141
+ history.listen(route => {
142
+ this.apps.forEach(app => {
143
+ app._route = route
144
+ })
145
+ })
146
+ }
147
+
148
+ beforeEach (fn: Function): Function {
149
+ return registerHook(this.beforeHooks, fn)
150
+ }
151
+
152
+ beforeResolve (fn: Function): Function {
153
+ return registerHook(this.resolveHooks, fn)
154
+ }
155
+
156
+ afterEach (fn: Function): Function {
157
+ return registerHook(this.afterHooks, fn)
158
+ }
159
+
160
+ onReady (cb: Function, errorCb?: Function) {
161
+ this.history.onReady(cb, errorCb)
162
+ }
163
+
164
+ onError (errorCb: Function) {
165
+ this.history.onError(errorCb)
166
+ }
167
+
168
+ push (location: RawLocation, onComplete?: Function, onAbort?: Function) {
169
+ // $flow-disable-line
170
+ if (!onComplete && !onAbort && typeof Promise !== 'undefined') {
171
+ return new Promise((resolve, reject) => {
172
+ this.history.push(location, resolve, reject)
173
+ })
174
+ } else {
175
+ this.history.push(location, onComplete, onAbort)
176
+ }
177
+ }
178
+
179
+ replace (location: RawLocation, onComplete?: Function, onAbort?: Function) {
180
+ // $flow-disable-line
181
+ if (!onComplete && !onAbort && typeof Promise !== 'undefined') {
182
+ return new Promise((resolve, reject) => {
183
+ this.history.replace(location, resolve, reject)
184
+ })
185
+ } else {
186
+ this.history.replace(location, onComplete, onAbort)
187
+ }
188
+ }
189
+
190
+ go (n: number) {
191
+ this.history.go(n)
192
+ }
193
+
194
+ back () {
195
+ this.go(-1)
196
+ }
197
+
198
+ forward () {
199
+ this.go(1)
200
+ }
201
+
202
+ getMatchedComponents (to?: RawLocation | Route): Array<any> {
203
+ const route: any = to
204
+ ? to.matched
205
+ ? to
206
+ : this.resolve(to).route
207
+ : this.currentRoute
208
+ if (!route) {
209
+ return []
210
+ }
211
+ return [].concat.apply(
212
+ [],
213
+ route.matched.map(m => {
214
+ return Object.keys(m.components).map(key => {
215
+ return m.components[key]
216
+ })
217
+ })
218
+ )
219
+ }
220
+
221
+ resolve (
222
+ to: RawLocation,
223
+ current?: Route,
224
+ append?: boolean
225
+ ): {
226
+ location: Location,
227
+ route: Route,
228
+ href: string,
229
+ // for backwards compat
230
+ normalizedTo: Location,
231
+ resolved: Route
232
+ } {
233
+ current = current || this.history.current
234
+ const location = normalizeLocation(to, current, append, this)
235
+ const route = this.match(location, current)
236
+ const fullPath = route.redirectedFrom || route.fullPath
237
+ const base = this.history.base
238
+ const href = createHref(base, fullPath, this.mode)
239
+ return {
240
+ location,
241
+ route,
242
+ href,
243
+ // for backwards compat
244
+ normalizedTo: location,
245
+ resolved: route
246
+ }
247
+ }
248
+
249
+ getRoutes () {
250
+ return this.matcher.getRoutes()
251
+ }
252
+
253
+ addRoute (parentOrRoute: string | RouteConfig, route?: RouteConfig) {
254
+ this.matcher.addRoute(parentOrRoute, route)
255
+ if (this.history.current !== START) {
256
+ this.history.transitionTo(this.history.getCurrentLocation())
257
+ }
258
+ }
259
+
260
+ addRoutes (routes: Array<RouteConfig>) {
261
+ if (process.env.NODE_ENV !== 'production') {
262
+ warn(false, 'router.addRoutes() is deprecated and has been removed in Kdu Router 4. Use router.addRoute() instead.')
263
+ }
264
+ this.matcher.addRoutes(routes)
265
+ if (this.history.current !== START) {
266
+ this.history.transitionTo(this.history.getCurrentLocation())
267
+ }
268
+ }
269
+ }
270
+
271
+ function registerHook (list: Array<any>, fn: Function): Function {
272
+ list.push(fn)
273
+ return () => {
274
+ const i = list.indexOf(fn)
275
+ if (i > -1) list.splice(i, 1)
276
+ }
277
+ }
278
+
279
+ function createHref (base: string, fullPath: string, mode) {
280
+ var path = mode === 'hash' ? '#' + fullPath : fullPath
281
+ return base ? cleanPath(base + '/' + path) : path
282
+ }
283
+
284
+ if (inBrowser && window.Kdu) {
285
+ window.Kdu.use(KduRouter)
286
+ }
287
+
288
+ // We cannot remove this as it would be a breaking change
289
+ KduRouter.install = install
290
+ KduRouter.version = '__VERSION__'
291
+ KduRouter.isNavigationFailure = isNavigationFailure
292
+ KduRouter.NavigationFailureType = NavigationFailureType
293
+ KduRouter.START_LOCATION = START
package/src/util/async.js CHANGED
@@ -1,18 +1,18 @@
1
- /* @flow */
2
-
3
- export function runQueue (queue: Array<?NavigationGuard>, fn: Function, cb: Function) {
4
- const step = index => {
5
- if (index >= queue.length) {
6
- cb()
7
- } else {
8
- if (queue[index]) {
9
- fn(queue[index], () => {
10
- step(index + 1)
11
- })
12
- } else {
13
- step(index + 1)
14
- }
15
- }
16
- }
17
- step(0)
18
- }
1
+ /* @flow */
2
+
3
+ export function runQueue (queue: Array<?NavigationGuard>, fn: Function, cb: Function) {
4
+ const step = index => {
5
+ if (index >= queue.length) {
6
+ cb()
7
+ } else {
8
+ if (queue[index]) {
9
+ fn(queue[index], () => {
10
+ step(index + 1)
11
+ })
12
+ } else {
13
+ step(index + 1)
14
+ }
15
+ }
16
+ }
17
+ step(0)
18
+ }