@pirxpilot/nanorouter
Version:
Small frontend router
46 lines (37 loc) • 1.33 kB
JavaScript
import assert from 'assert';
import wayfarer from '@pirxpilot/wayfarer';
// electron support
const isLocalFile = /file:\/\//.test(typeof window === 'object' && window.location && window.location.origin);
const stripElectron = /^(file:\/\/|\/)(.*\.html?\/?)?/;
const prefix = /^(http(s)?(:\/\/))?(www\.)?[a-zA-Z0-9-_.]+(:[0-9]{1,5})?(\/{1})?/;
const normalize = /#/;
const suffix = /'[?].*$'/;
export default function nanorouter(opts = {}) {
const router = wayfarer(opts.default || '/404');
return {
on,
emit,
match
};
function on(routename, listener) {
assert(typeof routename === 'string');
routename = routename.replace(/^[#/]/, '');
router.on(routename, listener);
}
function emit(routename) {
assert(typeof routename === 'string');
routename = pathname(routename, isLocalFile);
return router.emit(routename);
}
function match(routename) {
assert(typeof routename === 'string');
routename = pathname(routename, isLocalFile);
return router.match(routename);
}
}
// replace everything in a route but the pathname and hash
function pathname(routename, isElectron) {
if (isElectron) routename = routename.replace(stripElectron, '');
else routename = routename.replace(prefix, '');
return decodeURI(routename.replace(suffix, '').replace(normalize, '/'));
}