UNPKG

1.29 kBJavaScriptView Raw
1const assert = require('assert')
2const sliced = require('sliced')
3const trie = require('./trie')
4
5module.exports = Wayfarer
6
7// create a router
8// str -> obj
9function Wayfarer (dft) {
10 if (!(this instanceof Wayfarer)) return new Wayfarer(dft)
11
12 const _default = (dft || '').replace(/^\//, '')
13 const _trie = trie()
14
15 emit._trie = _trie
16 emit.emit = emit
17 emit.on = on
18 emit._wayfarer = true
19
20 return emit
21
22 // define a route
23 // (str, fn) -> obj
24 function on (route, cb) {
25 assert.equal(typeof route, 'string')
26 assert.equal(typeof cb, 'function')
27
28 route = route || '/'
29
30 if (cb && cb._wayfarer && cb._trie) {
31 _trie.mount(route, cb._trie.trie)
32 } else {
33 const node = _trie.create(route)
34 node.cb = cb
35 }
36
37 return emit
38 }
39
40 // match and call a route
41 // (str, obj?) -> null
42 function emit (route) {
43 assert.notEqual(route, undefined, "'route' must be defined")
44 const args = sliced(arguments)
45
46 const node = _trie.match(route)
47 if (node && node.cb) {
48 args[0] = node.params
49 return node.cb.apply(null, args)
50 }
51
52 const dft = _trie.match(_default)
53 if (dft && dft.cb) {
54 args[0] = dft.params
55 return dft.cb.apply(null, args)
56 }
57
58 throw new Error("route '" + route + "' did not match")
59 }
60}