From c54d0eb4b018b90d6d15023b041419c7b76e849f Mon Sep 17 00:00:00 2001 From: Krasimir Tsonev Date: Tue, 25 Apr 2017 20:41:06 +0300 Subject: [PATCH] Adding getLinkPath function #120 --- CHANGELOG.md | 4 ++++ README.md | 1 + lib/navigo.js | 5 ++++- lib/navigo.js.map | 2 +- lib/navigo.min.js | 2 +- lib/navigo.min.js.map | 2 +- package.json | 2 +- src/index.js | 5 ++++- test/spec/InBrowser.spec.js | 26 ++++++++++++++++++++++++++ 9 files changed, 43 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2d8ff2b..ea6639c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 4.7.0 + +* Adding `getLinkPath` function to cover [#120](https://github.com/krasimir/navigo/issues/120) + ## 4.6.2 * Fixing a bug in IE9 [#110](https://github.com/krasimir/navigo/pull/110) diff --git a/README.md b/README.md index faa3b368..e37a45d9 100644 --- a/README.md +++ b/README.md @@ -294,6 +294,7 @@ You may provide hooks in two other cases: * `router.updatePageLinks()` - it triggers the `data-navigo` links binding process * `router.notFound(function)` - adding a handler for not-found URL (404 page) * `router.lastRouteResolved()` - returns an object with the format of `{ url: , query: }` matching the latest resolved route +* `router.getLinkPath` - you may overwrite that function to provide a different mechanism for fetching paths from links which are currently on the page (with `data-navigo` attribute) There are couple of static properties. You'll probably never need to touch them but here're they: diff --git a/lib/navigo.js b/lib/navigo.js index 1b365957..d8d29fcb 100644 --- a/lib/navigo.js +++ b/lib/navigo.js @@ -352,7 +352,7 @@ return /******/ (function(modules) { // webpackBootstrap this._findLinks().forEach(function (link) { if (!link.hasListenerAttached) { link.addEventListener('click', function (e) { - var location = link.pathname; + var location = self.getLinkPath(link); if (!self._destroyed) { e.preventDefault(); @@ -399,6 +399,9 @@ return /******/ (function(modules) { // webpackBootstrap lastRouteResolved: function lastRouteResolved() { return this._lastRouteResolved; }, + getLinkPath: function getLinkPath(link) { + return link.pathname || link.getAttribute('href'); + }, _add: function _add(route) { var handler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; diff --git a/lib/navigo.js.map b/lib/navigo.js.map index 8c889da0..72de5eda 100644 --- a/lib/navigo.js.map +++ b/lib/navigo.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 492440af56aed42ab48b","webpack:///./src/index.js"],"names":["isPushStateAvailable","window","history","pushState","Navigo","r","useHash","hash","root","_routes","_useHash","_hash","_paused","_destroyed","_lastRouteResolved","_notFoundHandler","_defaultHandler","_usePushState","_onLocationChange","bind","replace","_cLoc","split","_listen","updatePageLinks","clean","s","RegExp","regExpResultToParams","match","names","length","slice","reduce","params","value","index","replaceDynamicURLParts","route","paramNames","regexp","PARAMETER_REGEXP","full","dots","name","push","REPLACE_VARIABLE_REGEXP","WILDCARD_REGEXP","REPLACE_WILDCARD","FOLLOWED_BY_SLASH_REGEXP","MATCH_REGEXP_FLAGS","getUrlDepth","url","compareUrlDepth","urlA","urlB","findMatchedRoutes","routes","map","filter","m","matched","u","fallbackURL","substr","current","isHashChangeAPIAvailable","extractGETParameters","join","getOnlyURL","onlyURL","manageHooks","handler","hooks","before","shouldRoute","after","isHashedRoot","prototype","helpers","navigate","path","absolute","to","_getRoot","resolve","location","href","on","args","func","uses","_add","orderedRoutes","Object","keys","sort","forEach","off","result","notFound","GETParameters","query","destroy","clearTimeout","_listenningInterval","removeEventListener","self","document","_findLinks","link","hasListenerAttached","addEventListener","e","pathname","preventDefault","generate","data","key","pause","status","resume","disableIfAPINotAvailable","lastRouteResolved","encodeURI","as","cached","check","setTimeout","__NAVIGO_WINDOW_LOCATION_MOCK__","call","querySelectorAll"],"mappings":"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","file":"navigo.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"Navigo\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Navigo\"] = factory();\n\telse\n\t\troot[\"Navigo\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 492440af56aed42ab48b\n **/","function isPushStateAvailable() {\n return !!(\n typeof window !== 'undefined' &&\n window.history &&\n window.history.pushState\n );\n}\n\nfunction Navigo(r, useHash, hash) {\n this.root = null;\n this._routes = [];\n this._useHash = useHash;\n this._hash = typeof hash === 'undefined' ? '#' : hash;\n this._paused = false;\n this._destroyed = false;\n this._lastRouteResolved = null;\n this._notFoundHandler = null;\n this._defaultHandler = null;\n this._usePushState = !useHash && isPushStateAvailable();\n this._onLocationChange = this._onLocationChange.bind(this);\n\n if (r) {\n this.root = useHash ? r.replace(/\\/$/, '/' + this._hash) : r.replace(/\\/$/, '');\n } else if (useHash) {\n this.root = this._cLoc().split(this._hash)[0].replace(/\\/$/, '/' + this._hash);\n }\n\n this._listen();\n this.updatePageLinks();\n}\n\nfunction clean(s) {\n if (s instanceof RegExp) return s;\n return s.replace(/\\/+$/, '').replace(/^\\/+/, '/');\n}\n\nfunction regExpResultToParams(match, names) {\n if (names.length === 0) return null;\n if (!match) return null;\n return match\n .slice(1, match.length)\n .reduce((params, value, index) => {\n if (params === null) params = {};\n params[names[index]] = value;\n return params;\n }, null);\n}\n\nfunction replaceDynamicURLParts(route) {\n var paramNames = [], regexp;\n\n if (route instanceof RegExp) {\n regexp = route;\n } else {\n regexp = new RegExp(\n clean(route)\n .replace(Navigo.PARAMETER_REGEXP, function (full, dots, name) {\n paramNames.push(name);\n return Navigo.REPLACE_VARIABLE_REGEXP;\n })\n .replace(Navigo.WILDCARD_REGEXP, Navigo.REPLACE_WILDCARD) + Navigo.FOLLOWED_BY_SLASH_REGEXP\n , Navigo.MATCH_REGEXP_FLAGS);\n }\n return { regexp, paramNames };\n}\n\nfunction getUrlDepth(url) {\n return url.replace(/\\/$/, '').split('/').length;\n}\n\nfunction compareUrlDepth(urlA, urlB) {\n return getUrlDepth(urlB) - getUrlDepth(urlA);\n}\n\nfunction findMatchedRoutes(url, routes = []) {\n return routes\n .map(route => {\n var { regexp, paramNames } = replaceDynamicURLParts(route.route);\n var match = url.match(regexp);\n var params = regExpResultToParams(match, paramNames);\n\n return match ? { match, route, params } : false;\n })\n .filter(m => m);\n}\n\nfunction match(url, routes) {\n return findMatchedRoutes(url, routes)[0] || false;\n}\n\nfunction root(url, routes) {\n var matched = findMatchedRoutes(\n url,\n routes.filter(route => {\n let u = clean(route.route);\n\n return u !== '' && u !== '*';\n })\n );\n var fallbackURL = clean(url);\n\n if (matched.length > 0) {\n return matched\n .map(m => clean(url.substr(0, m.match.index)))\n .reduce((root, current) => {\n return current.length < root.length ? current : root;\n }, fallbackURL);\n }\n return fallbackURL;\n}\n\nfunction isHashChangeAPIAvailable() {\n return !!(\n typeof window !== 'undefined' &&\n 'onhashchange' in window\n );\n}\n\nfunction extractGETParameters(url) {\n return url.split(/\\?(.*)?$/).slice(1).join('');\n}\n\nfunction getOnlyURL(url, useHash, hash) {\n var onlyURL = url.split(/\\?(.*)?$/)[0];\n\n if (typeof hash === 'undefined') {\n // To preserve BC\n hash = '#';\n }\n\n if (isPushStateAvailable() && !useHash) {\n onlyURL = onlyURL.split(hash)[0];\n }\n\n return onlyURL;\n}\n\nfunction manageHooks(handler, route, params) {\n if (route && route.hooks && typeof route.hooks === 'object') {\n if (route.hooks.before) {\n route.hooks.before((shouldRoute = true) => {\n if (!shouldRoute) return;\n handler();\n route.hooks.after && route.hooks.after(params);\n }, params);\n } else if (route.hooks.after) {\n handler();\n route.hooks.after && route.hooks.after(params);\n }\n return;\n }\n handler();\n};\n\nfunction isHashedRoot(url, useHash, hash) {\n if (isPushStateAvailable() && !useHash) {\n return false;\n }\n\n if (!url.match(hash)) {\n return false;\n }\n\n let split = url.split(hash);\n\n if (split.length < 2 || split[1] === '') {\n return true;\n }\n\n return false;\n};\n\nNavigo.prototype = {\n helpers: {\n match,\n root,\n clean\n },\n navigate: function (path, absolute) {\n var to;\n\n path = path || '';\n if (this._usePushState) {\n to = (!absolute ? this._getRoot() + '/' : '') + path.replace(/^\\/+/, '/');\n to = to.replace(/([^:])(\\/{2,})/g, '$1/');\n history[this._paused ? 'replaceState' : 'pushState']({}, '', to);\n this.resolve();\n } else if (typeof window !== 'undefined') {\n path = path.replace(new RegExp('^' + this._hash), '');\n window.location.href =\n window.location.href\n .replace(/#$/, '')\n .replace(new RegExp(this._hash + '.*$'), '') + this._hash + path;\n }\n return this;\n },\n on: function (...args) {\n if (typeof args[0] === 'function') {\n this._defaultHandler = { handler: args[0], hooks: args[1] };\n } else if (args.length >= 2) {\n if (args[0] === '/') {\n let func = args[1];\n\n if (typeof args[1] === 'object') {\n func = args[1].uses;\n }\n\n this._defaultHandler = { handler: func, hooks: args[2] };\n } else {\n this._add(args[0], args[1], args[2]);\n }\n } else if (typeof args[0] === 'object') {\n let orderedRoutes = Object.keys(args[0]).sort(compareUrlDepth);\n\n orderedRoutes.forEach(route => {\n this.on(route, args[0][route]);\n });\n }\n return this;\n },\n off: function (handler) {\n if (this._defaultHandler !== null && handler === this._defaultHandler.handler) {\n this._defaultHandler = null;\n } else if (this._notFoundHandler !== null && handler === this._notFoundHandler.handler) {\n this._notFoundHandler = null;\n }\n this._routes = this._routes.reduce((result, r) => {\n if (r.handler !== handler) result.push(r);\n return result;\n }, []);\n return this;\n },\n notFound: function (handler, hooks) {\n this._notFoundHandler = { handler, hooks: hooks };\n return this;\n },\n resolve: function (current) {\n var handler, m;\n var url = (current || this._cLoc()).replace(this._getRoot(), '');\n\n if (this._useHash) {\n url = url.replace(new RegExp('^\\/' + this._hash), '/');\n }\n\n let GETParameters = extractGETParameters(current || this._cLoc());\n let onlyURL = getOnlyURL(url, this._useHash, this._hash);\n\n if (\n this._paused ||\n (\n this._lastRouteResolved &&\n onlyURL === this._lastRouteResolved.url &&\n GETParameters === this._lastRouteResolved.query\n )\n ) { return false; }\n\n m = match(onlyURL, this._routes);\n\n if (m) {\n this._lastRouteResolved = { url: onlyURL, query: GETParameters };\n handler = m.route.handler;\n manageHooks(() => {\n m.route.route instanceof RegExp ?\n handler(...(m.match.slice(1, m.match.length))) :\n handler(m.params, GETParameters);\n }, m.route, m.params);\n return m;\n } else if (this._defaultHandler && (\n onlyURL === '' ||\n onlyURL === '/' ||\n onlyURL === this._hash ||\n isHashedRoot(onlyURL, this._useHash, this._hash)\n )) {\n manageHooks(() => {\n this._lastRouteResolved = { url: onlyURL, query: GETParameters };\n this._defaultHandler.handler(GETParameters);\n }, this._defaultHandler);\n return true;\n } else if (this._notFoundHandler) {\n manageHooks(() => {\n this._lastRouteResolved = { url: onlyURL, query: GETParameters };\n this._notFoundHandler.handler(GETParameters);\n }, this._notFoundHandler);\n }\n return false;\n },\n destroy: function () {\n this._routes = [];\n this._destroyed = true;\n clearTimeout(this._listenningInterval);\n if (typeof window !== 'undefined') {\n window.removeEventListener('popstate', this._onLocationChange);\n window.removeEventListener('hashchange', this._onLocationChange);\n }\n },\n updatePageLinks: function () {\n var self = this;\n\n if (typeof document === 'undefined') return;\n\n this._findLinks().forEach(link => {\n if (!link.hasListenerAttached) {\n link.addEventListener('click', function (e) {\n var location = link.pathname;\n\n if (!self._destroyed) {\n e.preventDefault();\n self.navigate(clean(location));\n }\n });\n link.hasListenerAttached = true;\n }\n });\n },\n generate: function (name, data = {}) {\n var result = this._routes.reduce((result, route) => {\n var key;\n\n if (route.name === name) {\n result = route.route;\n for (key in data) {\n result = result.replace(':' + key, data[key]);\n }\n }\n return result;\n }, '');\n\n return this._useHash ? this._hash + result : result;\n },\n link: function (path) {\n return this._getRoot() + path;\n },\n pause: function (status = true) {\n this._paused = status;\n },\n resume: function () {\n this.pause(false);\n },\n disableIfAPINotAvailable: function () {\n if (!isPushStateAvailable()) {\n this.destroy();\n }\n },\n lastRouteResolved() {\n return this._lastRouteResolved;\n },\n _add: function (route, handler = null, hooks = null) {\n if (typeof route === 'string') {\n route = encodeURI(route);\n }\n if (typeof handler === 'object') {\n this._routes.push({\n route,\n handler: handler.uses,\n name: handler.as,\n hooks: hooks || handler.hooks\n });\n } else {\n this._routes.push({ route, handler, hooks: hooks });\n }\n return this._add;\n },\n _getRoot: function () {\n if (this.root !== null) return this.root;\n this.root = root(this._cLoc(), this._routes);\n return this.root;\n },\n _listen: function () {\n if (this._usePushState) {\n window.addEventListener('popstate', this._onLocationChange);\n } else if (isHashChangeAPIAvailable()) {\n window.addEventListener('hashchange', this._onLocationChange);\n } else {\n let cached = this._cLoc(), current, check;\n\n check = () => {\n current = this._cLoc();\n if (cached !== current) {\n cached = current;\n this.resolve();\n }\n this._listenningInterval = setTimeout(check, 200);\n };\n check();\n }\n },\n _cLoc: function () {\n if (typeof window !== 'undefined') {\n if (typeof window.__NAVIGO_WINDOW_LOCATION_MOCK__ !== 'undefined') {\n return window.__NAVIGO_WINDOW_LOCATION_MOCK__;\n }\n return clean(window.location.href);\n }\n return '';\n },\n _findLinks: function () {\n return [].slice.call(document.querySelectorAll('[data-navigo]'));\n },\n _onLocationChange: function () {\n this.resolve();\n }\n};\n\nNavigo.PARAMETER_REGEXP = /([:*])(\\w+)/g;\nNavigo.WILDCARD_REGEXP = /\\*/g;\nNavigo.REPLACE_VARIABLE_REGEXP = '([^\\/]+)';\nNavigo.REPLACE_WILDCARD = '(?:.*)';\nNavigo.FOLLOWED_BY_SLASH_REGEXP = '(?:\\/$|$)';\nNavigo.MATCH_REGEXP_FLAGS = '';\n\nexport default Navigo;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 47a28f12bf256f142645","webpack:///./src/index.js"],"names":["isPushStateAvailable","window","history","pushState","Navigo","r","useHash","hash","root","_routes","_useHash","_hash","_paused","_destroyed","_lastRouteResolved","_notFoundHandler","_defaultHandler","_usePushState","_onLocationChange","bind","replace","_cLoc","split","_listen","updatePageLinks","clean","s","RegExp","regExpResultToParams","match","names","length","slice","reduce","params","value","index","replaceDynamicURLParts","route","paramNames","regexp","PARAMETER_REGEXP","full","dots","name","push","REPLACE_VARIABLE_REGEXP","WILDCARD_REGEXP","REPLACE_WILDCARD","FOLLOWED_BY_SLASH_REGEXP","MATCH_REGEXP_FLAGS","getUrlDepth","url","compareUrlDepth","urlA","urlB","findMatchedRoutes","routes","map","filter","m","matched","u","fallbackURL","substr","current","isHashChangeAPIAvailable","extractGETParameters","join","getOnlyURL","onlyURL","manageHooks","handler","hooks","before","shouldRoute","after","isHashedRoot","prototype","helpers","navigate","path","absolute","to","_getRoot","resolve","location","href","on","args","func","uses","_add","orderedRoutes","Object","keys","sort","forEach","off","result","notFound","GETParameters","query","destroy","clearTimeout","_listenningInterval","removeEventListener","self","document","_findLinks","link","hasListenerAttached","addEventListener","e","getLinkPath","preventDefault","generate","data","key","pause","status","resume","disableIfAPINotAvailable","lastRouteResolved","pathname","getAttribute","encodeURI","as","cached","check","setTimeout","__NAVIGO_WINDOW_LOCATION_MOCK__","call","querySelectorAll"],"mappings":"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","file":"navigo.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"Navigo\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Navigo\"] = factory();\n\telse\n\t\troot[\"Navigo\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 47a28f12bf256f142645\n **/","function isPushStateAvailable() {\n return !!(\n typeof window !== 'undefined' &&\n window.history &&\n window.history.pushState\n );\n}\n\nfunction Navigo(r, useHash, hash) {\n this.root = null;\n this._routes = [];\n this._useHash = useHash;\n this._hash = typeof hash === 'undefined' ? '#' : hash;\n this._paused = false;\n this._destroyed = false;\n this._lastRouteResolved = null;\n this._notFoundHandler = null;\n this._defaultHandler = null;\n this._usePushState = !useHash && isPushStateAvailable();\n this._onLocationChange = this._onLocationChange.bind(this);\n\n if (r) {\n this.root = useHash ? r.replace(/\\/$/, '/' + this._hash) : r.replace(/\\/$/, '');\n } else if (useHash) {\n this.root = this._cLoc().split(this._hash)[0].replace(/\\/$/, '/' + this._hash);\n }\n\n this._listen();\n this.updatePageLinks();\n}\n\nfunction clean(s) {\n if (s instanceof RegExp) return s;\n return s.replace(/\\/+$/, '').replace(/^\\/+/, '/');\n}\n\nfunction regExpResultToParams(match, names) {\n if (names.length === 0) return null;\n if (!match) return null;\n return match\n .slice(1, match.length)\n .reduce((params, value, index) => {\n if (params === null) params = {};\n params[names[index]] = value;\n return params;\n }, null);\n}\n\nfunction replaceDynamicURLParts(route) {\n var paramNames = [], regexp;\n\n if (route instanceof RegExp) {\n regexp = route;\n } else {\n regexp = new RegExp(\n clean(route)\n .replace(Navigo.PARAMETER_REGEXP, function (full, dots, name) {\n paramNames.push(name);\n return Navigo.REPLACE_VARIABLE_REGEXP;\n })\n .replace(Navigo.WILDCARD_REGEXP, Navigo.REPLACE_WILDCARD) + Navigo.FOLLOWED_BY_SLASH_REGEXP\n , Navigo.MATCH_REGEXP_FLAGS);\n }\n return { regexp, paramNames };\n}\n\nfunction getUrlDepth(url) {\n return url.replace(/\\/$/, '').split('/').length;\n}\n\nfunction compareUrlDepth(urlA, urlB) {\n return getUrlDepth(urlB) - getUrlDepth(urlA);\n}\n\nfunction findMatchedRoutes(url, routes = []) {\n return routes\n .map(route => {\n var { regexp, paramNames } = replaceDynamicURLParts(route.route);\n var match = url.match(regexp);\n var params = regExpResultToParams(match, paramNames);\n\n return match ? { match, route, params } : false;\n })\n .filter(m => m);\n}\n\nfunction match(url, routes) {\n return findMatchedRoutes(url, routes)[0] || false;\n}\n\nfunction root(url, routes) {\n var matched = findMatchedRoutes(\n url,\n routes.filter(route => {\n let u = clean(route.route);\n\n return u !== '' && u !== '*';\n })\n );\n var fallbackURL = clean(url);\n\n if (matched.length > 0) {\n return matched\n .map(m => clean(url.substr(0, m.match.index)))\n .reduce((root, current) => {\n return current.length < root.length ? current : root;\n }, fallbackURL);\n }\n return fallbackURL;\n}\n\nfunction isHashChangeAPIAvailable() {\n return !!(\n typeof window !== 'undefined' &&\n 'onhashchange' in window\n );\n}\n\nfunction extractGETParameters(url) {\n return url.split(/\\?(.*)?$/).slice(1).join('');\n}\n\nfunction getOnlyURL(url, useHash, hash) {\n var onlyURL = url.split(/\\?(.*)?$/)[0];\n\n if (typeof hash === 'undefined') {\n // To preserve BC\n hash = '#';\n }\n\n if (isPushStateAvailable() && !useHash) {\n onlyURL = onlyURL.split(hash)[0];\n }\n\n return onlyURL;\n}\n\nfunction manageHooks(handler, route, params) {\n if (route && route.hooks && typeof route.hooks === 'object') {\n if (route.hooks.before) {\n route.hooks.before((shouldRoute = true) => {\n if (!shouldRoute) return;\n handler();\n route.hooks.after && route.hooks.after(params);\n }, params);\n } else if (route.hooks.after) {\n handler();\n route.hooks.after && route.hooks.after(params);\n }\n return;\n }\n handler();\n};\n\nfunction isHashedRoot(url, useHash, hash) {\n if (isPushStateAvailable() && !useHash) {\n return false;\n }\n\n if (!url.match(hash)) {\n return false;\n }\n\n let split = url.split(hash);\n\n if (split.length < 2 || split[1] === '') {\n return true;\n }\n\n return false;\n};\n\nNavigo.prototype = {\n helpers: {\n match,\n root,\n clean\n },\n navigate: function (path, absolute) {\n var to;\n\n path = path || '';\n if (this._usePushState) {\n to = (!absolute ? this._getRoot() + '/' : '') + path.replace(/^\\/+/, '/');\n to = to.replace(/([^:])(\\/{2,})/g, '$1/');\n history[this._paused ? 'replaceState' : 'pushState']({}, '', to);\n this.resolve();\n } else if (typeof window !== 'undefined') {\n path = path.replace(new RegExp('^' + this._hash), '');\n window.location.href =\n window.location.href\n .replace(/#$/, '')\n .replace(new RegExp(this._hash + '.*$'), '') + this._hash + path;\n }\n return this;\n },\n on: function (...args) {\n if (typeof args[0] === 'function') {\n this._defaultHandler = { handler: args[0], hooks: args[1] };\n } else if (args.length >= 2) {\n if (args[0] === '/') {\n let func = args[1];\n\n if (typeof args[1] === 'object') {\n func = args[1].uses;\n }\n\n this._defaultHandler = { handler: func, hooks: args[2] };\n } else {\n this._add(args[0], args[1], args[2]);\n }\n } else if (typeof args[0] === 'object') {\n let orderedRoutes = Object.keys(args[0]).sort(compareUrlDepth);\n\n orderedRoutes.forEach(route => {\n this.on(route, args[0][route]);\n });\n }\n return this;\n },\n off: function (handler) {\n if (this._defaultHandler !== null && handler === this._defaultHandler.handler) {\n this._defaultHandler = null;\n } else if (this._notFoundHandler !== null && handler === this._notFoundHandler.handler) {\n this._notFoundHandler = null;\n }\n this._routes = this._routes.reduce((result, r) => {\n if (r.handler !== handler) result.push(r);\n return result;\n }, []);\n return this;\n },\n notFound: function (handler, hooks) {\n this._notFoundHandler = { handler, hooks: hooks };\n return this;\n },\n resolve: function (current) {\n var handler, m;\n var url = (current || this._cLoc()).replace(this._getRoot(), '');\n\n if (this._useHash) {\n url = url.replace(new RegExp('^\\/' + this._hash), '/');\n }\n\n let GETParameters = extractGETParameters(current || this._cLoc());\n let onlyURL = getOnlyURL(url, this._useHash, this._hash);\n\n if (\n this._paused ||\n (\n this._lastRouteResolved &&\n onlyURL === this._lastRouteResolved.url &&\n GETParameters === this._lastRouteResolved.query\n )\n ) { return false; }\n\n m = match(onlyURL, this._routes);\n\n if (m) {\n this._lastRouteResolved = { url: onlyURL, query: GETParameters };\n handler = m.route.handler;\n manageHooks(() => {\n m.route.route instanceof RegExp ?\n handler(...(m.match.slice(1, m.match.length))) :\n handler(m.params, GETParameters);\n }, m.route, m.params);\n return m;\n } else if (this._defaultHandler && (\n onlyURL === '' ||\n onlyURL === '/' ||\n onlyURL === this._hash ||\n isHashedRoot(onlyURL, this._useHash, this._hash)\n )) {\n manageHooks(() => {\n this._lastRouteResolved = { url: onlyURL, query: GETParameters };\n this._defaultHandler.handler(GETParameters);\n }, this._defaultHandler);\n return true;\n } else if (this._notFoundHandler) {\n manageHooks(() => {\n this._lastRouteResolved = { url: onlyURL, query: GETParameters };\n this._notFoundHandler.handler(GETParameters);\n }, this._notFoundHandler);\n }\n return false;\n },\n destroy: function () {\n this._routes = [];\n this._destroyed = true;\n clearTimeout(this._listenningInterval);\n if (typeof window !== 'undefined') {\n window.removeEventListener('popstate', this._onLocationChange);\n window.removeEventListener('hashchange', this._onLocationChange);\n }\n },\n updatePageLinks: function () {\n var self = this;\n\n if (typeof document === 'undefined') return;\n\n this._findLinks().forEach(link => {\n if (!link.hasListenerAttached) {\n link.addEventListener('click', function (e) {\n var location = self.getLinkPath(link);\n\n if (!self._destroyed) {\n e.preventDefault();\n self.navigate(clean(location));\n }\n });\n link.hasListenerAttached = true;\n }\n });\n },\n generate: function (name, data = {}) {\n var result = this._routes.reduce((result, route) => {\n var key;\n\n if (route.name === name) {\n result = route.route;\n for (key in data) {\n result = result.replace(':' + key, data[key]);\n }\n }\n return result;\n }, '');\n\n return this._useHash ? this._hash + result : result;\n },\n link: function (path) {\n return this._getRoot() + path;\n },\n pause: function (status = true) {\n this._paused = status;\n },\n resume: function () {\n this.pause(false);\n },\n disableIfAPINotAvailable: function () {\n if (!isPushStateAvailable()) {\n this.destroy();\n }\n },\n lastRouteResolved() {\n return this._lastRouteResolved;\n },\n getLinkPath(link) {\n return link.pathname || link.getAttribute('href');\n },\n _add: function (route, handler = null, hooks = null) {\n if (typeof route === 'string') {\n route = encodeURI(route);\n }\n if (typeof handler === 'object') {\n this._routes.push({\n route,\n handler: handler.uses,\n name: handler.as,\n hooks: hooks || handler.hooks\n });\n } else {\n this._routes.push({ route, handler, hooks: hooks });\n }\n return this._add;\n },\n _getRoot: function () {\n if (this.root !== null) return this.root;\n this.root = root(this._cLoc(), this._routes);\n return this.root;\n },\n _listen: function () {\n if (this._usePushState) {\n window.addEventListener('popstate', this._onLocationChange);\n } else if (isHashChangeAPIAvailable()) {\n window.addEventListener('hashchange', this._onLocationChange);\n } else {\n let cached = this._cLoc(), current, check;\n\n check = () => {\n current = this._cLoc();\n if (cached !== current) {\n cached = current;\n this.resolve();\n }\n this._listenningInterval = setTimeout(check, 200);\n };\n check();\n }\n },\n _cLoc: function () {\n if (typeof window !== 'undefined') {\n if (typeof window.__NAVIGO_WINDOW_LOCATION_MOCK__ !== 'undefined') {\n return window.__NAVIGO_WINDOW_LOCATION_MOCK__;\n }\n return clean(window.location.href);\n }\n return '';\n },\n _findLinks: function () {\n return [].slice.call(document.querySelectorAll('[data-navigo]'));\n },\n _onLocationChange: function () {\n this.resolve();\n }\n};\n\nNavigo.PARAMETER_REGEXP = /([:*])(\\w+)/g;\nNavigo.WILDCARD_REGEXP = /\\*/g;\nNavigo.REPLACE_VARIABLE_REGEXP = '([^\\/]+)';\nNavigo.REPLACE_WILDCARD = '(?:.*)';\nNavigo.FOLLOWED_BY_SLASH_REGEXP = '(?:\\/$|$)';\nNavigo.MATCH_REGEXP_FLAGS = '';\n\nexport default Navigo;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/navigo.min.js b/lib/navigo.min.js index 6f3abace..2f589d5f 100644 --- a/lib/navigo.min.js +++ b/lib/navigo.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("Navigo",[],e):"object"==typeof exports?exports.Navigo=e():t.Navigo=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={exports:{},id:o,loaded:!1};return t[o].call(r.exports,r,r.exports,e),r.loaded=!0,r.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e){"use strict";function n(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1&&void 0!==arguments[1]?arguments[1]:[];return e.map(function(e){var n=u(e.route),o=n.regexp,r=n.paramNames,i=t.match(o),a=s(i,r);return!!i&&{match:i,route:e,params:a}}).filter(function(t){return t})}function d(t,e){return l(t,e)[0]||!1}function c(t,e){var n=l(t,e.filter(function(t){var e=i(t.route);return""!==e&&"*"!==e})),o=i(t);return n.length>0?n.map(function(e){return i(t.substr(0,e.match.index))}).reduce(function(t,e){return e.length0&&void 0!==arguments[0])||arguments[0];o&&(t(),e.hooks.after&&e.hooks.after(n))},n):e.hooks.after&&(t(),e.hooks.after&&e.hooks.after(n))):void t()}function g(t,e,n){if(o()&&!e)return!1;if(!t.match(n))return!1;var r=t.split(n);return r.length<2||""===r[1]}Object.defineProperty(e,"__esModule",{value:!0});var R="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};r.prototype={helpers:{match:d,root:c,clean:i},navigate:function(t,e){var n;return t=t||"",this._usePushState?(n=(e?"":this._getRoot()+"/")+t.replace(/^\/+/,"/"),n=n.replace(/([^:])(\/{2,})/g,"$1/"),history[this._paused?"replaceState":"pushState"]({},"",n),this.resolve()):"undefined"!=typeof window&&(t=t.replace(new RegExp("^"+this._hash),""),window.location.href=window.location.href.replace(/#$/,"").replace(new RegExp(this._hash+".*$"),"")+this._hash+t),this},on:function(){for(var t=this,e=arguments.length,n=Array(e),o=0;o=2)if("/"===n[0]){var r=n[1];"object"===R(n[1])&&(r=n[1].uses),this._defaultHandler={handler:r,hooks:n[2]}}else this._add(n[0],n[1],n[2]);else if("object"===R(n[0])){var i=Object.keys(n[0]).sort(h);i.forEach(function(e){t.on(e,n[0][e])})}return this},off:function(t){return null!==this._defaultHandler&&t===this._defaultHandler.handler?this._defaultHandler=null:null!==this._notFoundHandler&&t===this._notFoundHandler.handler&&(this._notFoundHandler=null),this._routes=this._routes.reduce(function(e,n){return n.handler!==t&&e.push(n),e},[]),this},notFound:function(t,e){return this._notFoundHandler={handler:t,hooks:e},this},resolve:function(t){var e,o,r=this,i=(t||this._cLoc()).replace(this._getRoot(),"");this._useHash&&(i=i.replace(new RegExp("^/"+this._hash),"/"));var s=_(t||this._cLoc()),u=p(i,this._useHash,this._hash);return!(this._paused||this._lastRouteResolved&&u===this._lastRouteResolved.url&&s===this._lastRouteResolved.query)&&((o=d(u,this._routes))?(this._lastRouteResolved={url:u,query:s},e=o.route.handler,v(function(){o.route.route instanceof RegExp?e.apply(void 0,n(o.match.slice(1,o.match.length))):e(o.params,s)},o.route,o.params),o):this._defaultHandler&&(""===u||"/"===u||u===this._hash||g(u,this._useHash,this._hash))?(v(function(){r._lastRouteResolved={url:u,query:s},r._defaultHandler.handler(s)},this._defaultHandler),!0):(this._notFoundHandler&&v(function(){r._lastRouteResolved={url:u,query:s},r._notFoundHandler.handler(s)},this._notFoundHandler),!1))},destroy:function(){this._routes=[],this._destroyed=!0,clearTimeout(this._listenningInterval),"undefined"!=typeof window&&(window.removeEventListener("popstate",this._onLocationChange),window.removeEventListener("hashchange",this._onLocationChange))},updatePageLinks:function(){var t=this;"undefined"!=typeof document&&this._findLinks().forEach(function(e){e.hasListenerAttached||(e.addEventListener("click",function(n){var o=e.pathname;t._destroyed||(n.preventDefault(),t.navigate(i(o)))}),e.hasListenerAttached=!0)})},generate:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=this._routes.reduce(function(n,o){var r;if(o.name===t){n=o.route;for(r in e)n=n.replace(":"+r,e[r])}return n},"");return this._useHash?this._hash+n:n},link:function(t){return this._getRoot()+t},pause:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this._paused=t},resume:function(){this.pause(!1)},disableIfAPINotAvailable:function(){o()||this.destroy()},lastRouteResolved:function(){return this._lastRouteResolved},_add:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return"string"==typeof t&&(t=encodeURI(t)),"object"===("undefined"==typeof e?"undefined":R(e))?this._routes.push({route:t,handler:e.uses,name:e.as,hooks:n||e.hooks}):this._routes.push({route:t,handler:e,hooks:n}),this._add},_getRoot:function(){return null!==this.root?this.root:(this.root=c(this._cLoc(),this._routes),this.root)},_listen:function(){var t=this;if(this._usePushState)window.addEventListener("popstate",this._onLocationChange);else if(f())window.addEventListener("hashchange",this._onLocationChange);else{var e=this._cLoc(),n=void 0,o=void 0;o=function(){n=t._cLoc(),e!==n&&(e=n,t.resolve()),t._listenningInterval=setTimeout(o,200)},o()}},_cLoc:function(){return"undefined"!=typeof window?"undefined"!=typeof window.__NAVIGO_WINDOW_LOCATION_MOCK__?window.__NAVIGO_WINDOW_LOCATION_MOCK__:i(window.location.href):""},_findLinks:function(){return[].slice.call(document.querySelectorAll("[data-navigo]"))},_onLocationChange:function(){this.resolve()}},r.PARAMETER_REGEXP=/([:*])(\w+)/g,r.WILDCARD_REGEXP=/\*/g,r.REPLACE_VARIABLE_REGEXP="([^/]+)",r.REPLACE_WILDCARD="(?:.*)",r.FOLLOWED_BY_SLASH_REGEXP="(?:/$|$)",r.MATCH_REGEXP_FLAGS="",e["default"]=r,t.exports=e["default"]}])}); +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("Navigo",[],e):"object"==typeof exports?exports.Navigo=e():t.Navigo=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={exports:{},id:o,loaded:!1};return t[o].call(r.exports,r,r.exports,e),r.loaded=!0,r.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e){"use strict";function n(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1&&void 0!==arguments[1]?arguments[1]:[];return e.map(function(e){var n=u(e.route),o=n.regexp,r=n.paramNames,i=t.match(o),a=s(i,r);return!!i&&{match:i,route:e,params:a}}).filter(function(t){return t})}function d(t,e){return l(t,e)[0]||!1}function c(t,e){var n=l(t,e.filter(function(t){var e=i(t.route);return""!==e&&"*"!==e})),o=i(t);return n.length>0?n.map(function(e){return i(t.substr(0,e.match.index))}).reduce(function(t,e){return e.length0&&void 0!==arguments[0])||arguments[0];o&&(t(),e.hooks.after&&e.hooks.after(n))},n):e.hooks.after&&(t(),e.hooks.after&&e.hooks.after(n))):void t()}function g(t,e,n){if(o()&&!e)return!1;if(!t.match(n))return!1;var r=t.split(n);return r.length<2||""===r[1]}Object.defineProperty(e,"__esModule",{value:!0});var R="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};r.prototype={helpers:{match:d,root:c,clean:i},navigate:function(t,e){var n;return t=t||"",this._usePushState?(n=(e?"":this._getRoot()+"/")+t.replace(/^\/+/,"/"),n=n.replace(/([^:])(\/{2,})/g,"$1/"),history[this._paused?"replaceState":"pushState"]({},"",n),this.resolve()):"undefined"!=typeof window&&(t=t.replace(new RegExp("^"+this._hash),""),window.location.href=window.location.href.replace(/#$/,"").replace(new RegExp(this._hash+".*$"),"")+this._hash+t),this},on:function(){for(var t=this,e=arguments.length,n=Array(e),o=0;o=2)if("/"===n[0]){var r=n[1];"object"===R(n[1])&&(r=n[1].uses),this._defaultHandler={handler:r,hooks:n[2]}}else this._add(n[0],n[1],n[2]);else if("object"===R(n[0])){var i=Object.keys(n[0]).sort(h);i.forEach(function(e){t.on(e,n[0][e])})}return this},off:function(t){return null!==this._defaultHandler&&t===this._defaultHandler.handler?this._defaultHandler=null:null!==this._notFoundHandler&&t===this._notFoundHandler.handler&&(this._notFoundHandler=null),this._routes=this._routes.reduce(function(e,n){return n.handler!==t&&e.push(n),e},[]),this},notFound:function(t,e){return this._notFoundHandler={handler:t,hooks:e},this},resolve:function(t){var e,o,r=this,i=(t||this._cLoc()).replace(this._getRoot(),"");this._useHash&&(i=i.replace(new RegExp("^/"+this._hash),"/"));var s=_(t||this._cLoc()),u=p(i,this._useHash,this._hash);return!(this._paused||this._lastRouteResolved&&u===this._lastRouteResolved.url&&s===this._lastRouteResolved.query)&&((o=d(u,this._routes))?(this._lastRouteResolved={url:u,query:s},e=o.route.handler,v(function(){o.route.route instanceof RegExp?e.apply(void 0,n(o.match.slice(1,o.match.length))):e(o.params,s)},o.route,o.params),o):this._defaultHandler&&(""===u||"/"===u||u===this._hash||g(u,this._useHash,this._hash))?(v(function(){r._lastRouteResolved={url:u,query:s},r._defaultHandler.handler(s)},this._defaultHandler),!0):(this._notFoundHandler&&v(function(){r._lastRouteResolved={url:u,query:s},r._notFoundHandler.handler(s)},this._notFoundHandler),!1))},destroy:function(){this._routes=[],this._destroyed=!0,clearTimeout(this._listenningInterval),"undefined"!=typeof window&&(window.removeEventListener("popstate",this._onLocationChange),window.removeEventListener("hashchange",this._onLocationChange))},updatePageLinks:function(){var t=this;"undefined"!=typeof document&&this._findLinks().forEach(function(e){e.hasListenerAttached||(e.addEventListener("click",function(n){var o=t.getLinkPath(e);t._destroyed||(n.preventDefault(),t.navigate(i(o)))}),e.hasListenerAttached=!0)})},generate:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=this._routes.reduce(function(n,o){var r;if(o.name===t){n=o.route;for(r in e)n=n.replace(":"+r,e[r])}return n},"");return this._useHash?this._hash+n:n},link:function(t){return this._getRoot()+t},pause:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this._paused=t},resume:function(){this.pause(!1)},disableIfAPINotAvailable:function(){o()||this.destroy()},lastRouteResolved:function(){return this._lastRouteResolved},getLinkPath:function(t){return t.pathname||t.getAttribute("href")},_add:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return"string"==typeof t&&(t=encodeURI(t)),"object"===("undefined"==typeof e?"undefined":R(e))?this._routes.push({route:t,handler:e.uses,name:e.as,hooks:n||e.hooks}):this._routes.push({route:t,handler:e,hooks:n}),this._add},_getRoot:function(){return null!==this.root?this.root:(this.root=c(this._cLoc(),this._routes),this.root)},_listen:function(){var t=this;if(this._usePushState)window.addEventListener("popstate",this._onLocationChange);else if(f())window.addEventListener("hashchange",this._onLocationChange);else{var e=this._cLoc(),n=void 0,o=void 0;o=function(){n=t._cLoc(),e!==n&&(e=n,t.resolve()),t._listenningInterval=setTimeout(o,200)},o()}},_cLoc:function(){return"undefined"!=typeof window?"undefined"!=typeof window.__NAVIGO_WINDOW_LOCATION_MOCK__?window.__NAVIGO_WINDOW_LOCATION_MOCK__:i(window.location.href):""},_findLinks:function(){return[].slice.call(document.querySelectorAll("[data-navigo]"))},_onLocationChange:function(){this.resolve()}},r.PARAMETER_REGEXP=/([:*])(\w+)/g,r.WILDCARD_REGEXP=/\*/g,r.REPLACE_VARIABLE_REGEXP="([^/]+)",r.REPLACE_WILDCARD="(?:.*)",r.FOLLOWED_BY_SLASH_REGEXP="(?:/$|$)",r.MATCH_REGEXP_FLAGS="",e["default"]=r,t.exports=e["default"]}])}); //# sourceMappingURL=navigo.min.js.map \ No newline at end of file diff --git a/lib/navigo.min.js.map b/lib/navigo.min.js.map index 064bb14a..0742cdd4 100644 --- a/lib/navigo.min.js.map +++ b/lib/navigo.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///navigo.min.js","webpack:///webpack/bootstrap bd4a92f0610aa930808c","webpack:///./src/index.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_toConsumableArray","arr","Array","isArray","i","arr2","length","from","isPushStateAvailable","window","history","pushState","Navigo","r","useHash","hash","_routes","_useHash","_hash","_paused","_destroyed","_lastRouteResolved","_notFoundHandler","_defaultHandler","_usePushState","_onLocationChange","bind","replace","_cLoc","split","_listen","updatePageLinks","clean","s","RegExp","regExpResultToParams","match","names","slice","reduce","params","value","index","replaceDynamicURLParts","route","regexp","paramNames","PARAMETER_REGEXP","full","dots","name","push","REPLACE_VARIABLE_REGEXP","WILDCARD_REGEXP","REPLACE_WILDCARD","FOLLOWED_BY_SLASH_REGEXP","MATCH_REGEXP_FLAGS","getUrlDepth","url","compareUrlDepth","urlA","urlB","findMatchedRoutes","routes","arguments","undefined","map","_replaceDynamicURLPar","filter","matched","u","fallbackURL","substr","current","isHashChangeAPIAvailable","extractGETParameters","join","getOnlyURL","onlyURL","manageHooks","handler","hooks","_typeof","before","shouldRoute","after","isHashedRoot","Object","defineProperty","Symbol","iterator","obj","constructor","prototype","helpers","navigate","path","absolute","to","_getRoot","resolve","location","href","on","_this","_len","args","_key","func","uses","_add","orderedRoutes","keys","sort","forEach","off","result","notFound","_this2","GETParameters","query","destroy","clearTimeout","_listenningInterval","removeEventListener","self","document","_findLinks","link","hasListenerAttached","addEventListener","e","pathname","preventDefault","generate","data","key","pause","status","resume","disableIfAPINotAvailable","lastRouteResolved","encodeURI","as","_this3","cached","check","setTimeout","__NAVIGO_WINDOW_LOCATION_MOCK__","querySelectorAll"],"mappings":"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","file":"navigo.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"Navigo\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Navigo\"] = factory();\n\telse\n\t\troot[\"Navigo\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"Navigo\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Navigo\"] = factory();\n\telse\n\t\troot[\"Navigo\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\t\n\tfunction isPushStateAvailable() {\n\t return !!(typeof window !== 'undefined' && window.history && window.history.pushState);\n\t}\n\t\n\tfunction Navigo(r, useHash, hash) {\n\t this.root = null;\n\t this._routes = [];\n\t this._useHash = useHash;\n\t this._hash = typeof hash === 'undefined' ? '#' : hash;\n\t this._paused = false;\n\t this._destroyed = false;\n\t this._lastRouteResolved = null;\n\t this._notFoundHandler = null;\n\t this._defaultHandler = null;\n\t this._usePushState = !useHash && isPushStateAvailable();\n\t this._onLocationChange = this._onLocationChange.bind(this);\n\t\n\t if (r) {\n\t this.root = useHash ? r.replace(/\\/$/, '/' + this._hash) : r.replace(/\\/$/, '');\n\t } else if (useHash) {\n\t this.root = this._cLoc().split(this._hash)[0].replace(/\\/$/, '/' + this._hash);\n\t }\n\t\n\t this._listen();\n\t this.updatePageLinks();\n\t}\n\t\n\tfunction clean(s) {\n\t if (s instanceof RegExp) return s;\n\t return s.replace(/\\/+$/, '').replace(/^\\/+/, '/');\n\t}\n\t\n\tfunction regExpResultToParams(match, names) {\n\t if (names.length === 0) return null;\n\t if (!match) return null;\n\t return match.slice(1, match.length).reduce(function (params, value, index) {\n\t if (params === null) params = {};\n\t params[names[index]] = value;\n\t return params;\n\t }, null);\n\t}\n\t\n\tfunction replaceDynamicURLParts(route) {\n\t var paramNames = [],\n\t regexp;\n\t\n\t if (route instanceof RegExp) {\n\t regexp = route;\n\t } else {\n\t regexp = new RegExp(clean(route).replace(Navigo.PARAMETER_REGEXP, function (full, dots, name) {\n\t paramNames.push(name);\n\t return Navigo.REPLACE_VARIABLE_REGEXP;\n\t }).replace(Navigo.WILDCARD_REGEXP, Navigo.REPLACE_WILDCARD) + Navigo.FOLLOWED_BY_SLASH_REGEXP, Navigo.MATCH_REGEXP_FLAGS);\n\t }\n\t return { regexp: regexp, paramNames: paramNames };\n\t}\n\t\n\tfunction getUrlDepth(url) {\n\t return url.replace(/\\/$/, '').split('/').length;\n\t}\n\t\n\tfunction compareUrlDepth(urlA, urlB) {\n\t return getUrlDepth(urlB) - getUrlDepth(urlA);\n\t}\n\t\n\tfunction findMatchedRoutes(url) {\n\t var routes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\t\n\t return routes.map(function (route) {\n\t var _replaceDynamicURLPar = replaceDynamicURLParts(route.route),\n\t regexp = _replaceDynamicURLPar.regexp,\n\t paramNames = _replaceDynamicURLPar.paramNames;\n\t\n\t var match = url.match(regexp);\n\t var params = regExpResultToParams(match, paramNames);\n\t\n\t return match ? { match: match, route: route, params: params } : false;\n\t }).filter(function (m) {\n\t return m;\n\t });\n\t}\n\t\n\tfunction match(url, routes) {\n\t return findMatchedRoutes(url, routes)[0] || false;\n\t}\n\t\n\tfunction root(url, routes) {\n\t var matched = findMatchedRoutes(url, routes.filter(function (route) {\n\t var u = clean(route.route);\n\t\n\t return u !== '' && u !== '*';\n\t }));\n\t var fallbackURL = clean(url);\n\t\n\t if (matched.length > 0) {\n\t return matched.map(function (m) {\n\t return clean(url.substr(0, m.match.index));\n\t }).reduce(function (root, current) {\n\t return current.length < root.length ? current : root;\n\t }, fallbackURL);\n\t }\n\t return fallbackURL;\n\t}\n\t\n\tfunction isHashChangeAPIAvailable() {\n\t return !!(typeof window !== 'undefined' && 'onhashchange' in window);\n\t}\n\t\n\tfunction extractGETParameters(url) {\n\t return url.split(/\\?(.*)?$/).slice(1).join('');\n\t}\n\t\n\tfunction getOnlyURL(url, useHash, hash) {\n\t var onlyURL = url.split(/\\?(.*)?$/)[0];\n\t\n\t if (typeof hash === 'undefined') {\n\t // To preserve BC\n\t hash = '#';\n\t }\n\t\n\t if (isPushStateAvailable() && !useHash) {\n\t onlyURL = onlyURL.split(hash)[0];\n\t }\n\t\n\t return onlyURL;\n\t}\n\t\n\tfunction manageHooks(handler, route, params) {\n\t if (route && route.hooks && _typeof(route.hooks) === 'object') {\n\t if (route.hooks.before) {\n\t route.hooks.before(function () {\n\t var shouldRoute = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\t\n\t if (!shouldRoute) return;\n\t handler();\n\t route.hooks.after && route.hooks.after(params);\n\t }, params);\n\t } else if (route.hooks.after) {\n\t handler();\n\t route.hooks.after && route.hooks.after(params);\n\t }\n\t return;\n\t }\n\t handler();\n\t};\n\t\n\tfunction isHashedRoot(url, useHash, hash) {\n\t if (isPushStateAvailable() && !useHash) {\n\t return false;\n\t }\n\t\n\t if (!url.match(hash)) {\n\t return false;\n\t }\n\t\n\t var split = url.split(hash);\n\t\n\t if (split.length < 2 || split[1] === '') {\n\t return true;\n\t }\n\t\n\t return false;\n\t};\n\t\n\tNavigo.prototype = {\n\t helpers: {\n\t match: match,\n\t root: root,\n\t clean: clean\n\t },\n\t navigate: function navigate(path, absolute) {\n\t var to;\n\t\n\t path = path || '';\n\t if (this._usePushState) {\n\t to = (!absolute ? this._getRoot() + '/' : '') + path.replace(/^\\/+/, '/');\n\t to = to.replace(/([^:])(\\/{2,})/g, '$1/');\n\t history[this._paused ? 'replaceState' : 'pushState']({}, '', to);\n\t this.resolve();\n\t } else if (typeof window !== 'undefined') {\n\t path = path.replace(new RegExp('^' + this._hash), '');\n\t window.location.href = window.location.href.replace(/#$/, '').replace(new RegExp(this._hash + '.*$'), '') + this._hash + path;\n\t }\n\t return this;\n\t },\n\t on: function on() {\n\t var _this = this;\n\t\n\t for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t args[_key] = arguments[_key];\n\t }\n\t\n\t if (typeof args[0] === 'function') {\n\t this._defaultHandler = { handler: args[0], hooks: args[1] };\n\t } else if (args.length >= 2) {\n\t if (args[0] === '/') {\n\t var func = args[1];\n\t\n\t if (_typeof(args[1]) === 'object') {\n\t func = args[1].uses;\n\t }\n\t\n\t this._defaultHandler = { handler: func, hooks: args[2] };\n\t } else {\n\t this._add(args[0], args[1], args[2]);\n\t }\n\t } else if (_typeof(args[0]) === 'object') {\n\t var orderedRoutes = Object.keys(args[0]).sort(compareUrlDepth);\n\t\n\t orderedRoutes.forEach(function (route) {\n\t _this.on(route, args[0][route]);\n\t });\n\t }\n\t return this;\n\t },\n\t off: function off(handler) {\n\t if (this._defaultHandler !== null && handler === this._defaultHandler.handler) {\n\t this._defaultHandler = null;\n\t } else if (this._notFoundHandler !== null && handler === this._notFoundHandler.handler) {\n\t this._notFoundHandler = null;\n\t }\n\t this._routes = this._routes.reduce(function (result, r) {\n\t if (r.handler !== handler) result.push(r);\n\t return result;\n\t }, []);\n\t return this;\n\t },\n\t notFound: function notFound(handler, hooks) {\n\t this._notFoundHandler = { handler: handler, hooks: hooks };\n\t return this;\n\t },\n\t resolve: function resolve(current) {\n\t var _this2 = this;\n\t\n\t var handler, m;\n\t var url = (current || this._cLoc()).replace(this._getRoot(), '');\n\t\n\t if (this._useHash) {\n\t url = url.replace(new RegExp('^\\/' + this._hash), '/');\n\t }\n\t\n\t var GETParameters = extractGETParameters(current || this._cLoc());\n\t var onlyURL = getOnlyURL(url, this._useHash, this._hash);\n\t\n\t if (this._paused || this._lastRouteResolved && onlyURL === this._lastRouteResolved.url && GETParameters === this._lastRouteResolved.query) {\n\t return false;\n\t }\n\t\n\t m = match(onlyURL, this._routes);\n\t\n\t if (m) {\n\t this._lastRouteResolved = { url: onlyURL, query: GETParameters };\n\t handler = m.route.handler;\n\t manageHooks(function () {\n\t m.route.route instanceof RegExp ? handler.apply(undefined, _toConsumableArray(m.match.slice(1, m.match.length))) : handler(m.params, GETParameters);\n\t }, m.route, m.params);\n\t return m;\n\t } else if (this._defaultHandler && (onlyURL === '' || onlyURL === '/' || onlyURL === this._hash || isHashedRoot(onlyURL, this._useHash, this._hash))) {\n\t manageHooks(function () {\n\t _this2._lastRouteResolved = { url: onlyURL, query: GETParameters };\n\t _this2._defaultHandler.handler(GETParameters);\n\t }, this._defaultHandler);\n\t return true;\n\t } else if (this._notFoundHandler) {\n\t manageHooks(function () {\n\t _this2._lastRouteResolved = { url: onlyURL, query: GETParameters };\n\t _this2._notFoundHandler.handler(GETParameters);\n\t }, this._notFoundHandler);\n\t }\n\t return false;\n\t },\n\t destroy: function destroy() {\n\t this._routes = [];\n\t this._destroyed = true;\n\t clearTimeout(this._listenningInterval);\n\t if (typeof window !== 'undefined') {\n\t window.removeEventListener('popstate', this._onLocationChange);\n\t window.removeEventListener('hashchange', this._onLocationChange);\n\t }\n\t },\n\t updatePageLinks: function updatePageLinks() {\n\t var self = this;\n\t\n\t if (typeof document === 'undefined') return;\n\t\n\t this._findLinks().forEach(function (link) {\n\t if (!link.hasListenerAttached) {\n\t link.addEventListener('click', function (e) {\n\t var location = link.pathname;\n\t\n\t if (!self._destroyed) {\n\t e.preventDefault();\n\t self.navigate(clean(location));\n\t }\n\t });\n\t link.hasListenerAttached = true;\n\t }\n\t });\n\t },\n\t generate: function generate(name) {\n\t var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\t\n\t var result = this._routes.reduce(function (result, route) {\n\t var key;\n\t\n\t if (route.name === name) {\n\t result = route.route;\n\t for (key in data) {\n\t result = result.replace(':' + key, data[key]);\n\t }\n\t }\n\t return result;\n\t }, '');\n\t\n\t return this._useHash ? this._hash + result : result;\n\t },\n\t link: function link(path) {\n\t return this._getRoot() + path;\n\t },\n\t pause: function pause() {\n\t var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\t\n\t this._paused = status;\n\t },\n\t resume: function resume() {\n\t this.pause(false);\n\t },\n\t disableIfAPINotAvailable: function disableIfAPINotAvailable() {\n\t if (!isPushStateAvailable()) {\n\t this.destroy();\n\t }\n\t },\n\t lastRouteResolved: function lastRouteResolved() {\n\t return this._lastRouteResolved;\n\t },\n\t\n\t _add: function _add(route) {\n\t var handler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\t var hooks = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\t\n\t if (typeof route === 'string') {\n\t route = encodeURI(route);\n\t }\n\t if ((typeof handler === 'undefined' ? 'undefined' : _typeof(handler)) === 'object') {\n\t this._routes.push({\n\t route: route,\n\t handler: handler.uses,\n\t name: handler.as,\n\t hooks: hooks || handler.hooks\n\t });\n\t } else {\n\t this._routes.push({ route: route, handler: handler, hooks: hooks });\n\t }\n\t return this._add;\n\t },\n\t _getRoot: function _getRoot() {\n\t if (this.root !== null) return this.root;\n\t this.root = root(this._cLoc(), this._routes);\n\t return this.root;\n\t },\n\t _listen: function _listen() {\n\t var _this3 = this;\n\t\n\t if (this._usePushState) {\n\t window.addEventListener('popstate', this._onLocationChange);\n\t } else if (isHashChangeAPIAvailable()) {\n\t window.addEventListener('hashchange', this._onLocationChange);\n\t } else {\n\t var cached = this._cLoc(),\n\t current = void 0,\n\t _check = void 0;\n\t\n\t _check = function check() {\n\t current = _this3._cLoc();\n\t if (cached !== current) {\n\t cached = current;\n\t _this3.resolve();\n\t }\n\t _this3._listenningInterval = setTimeout(_check, 200);\n\t };\n\t _check();\n\t }\n\t },\n\t _cLoc: function _cLoc() {\n\t if (typeof window !== 'undefined') {\n\t if (typeof window.__NAVIGO_WINDOW_LOCATION_MOCK__ !== 'undefined') {\n\t return window.__NAVIGO_WINDOW_LOCATION_MOCK__;\n\t }\n\t return clean(window.location.href);\n\t }\n\t return '';\n\t },\n\t _findLinks: function _findLinks() {\n\t return [].slice.call(document.querySelectorAll('[data-navigo]'));\n\t },\n\t _onLocationChange: function _onLocationChange() {\n\t this.resolve();\n\t }\n\t};\n\t\n\tNavigo.PARAMETER_REGEXP = /([:*])(\\w+)/g;\n\tNavigo.WILDCARD_REGEXP = /\\*/g;\n\tNavigo.REPLACE_VARIABLE_REGEXP = '([^\\/]+)';\n\tNavigo.REPLACE_WILDCARD = '(?:.*)';\n\tNavigo.FOLLOWED_BY_SLASH_REGEXP = '(?:\\/$|$)';\n\tNavigo.MATCH_REGEXP_FLAGS = '';\n\t\n\texports.default = Navigo;\n\tmodule.exports = exports['default'];\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** navigo.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap bd4a92f0610aa930808c\n **/","function isPushStateAvailable() {\n return !!(\n typeof window !== 'undefined' &&\n window.history &&\n window.history.pushState\n );\n}\n\nfunction Navigo(r, useHash, hash) {\n this.root = null;\n this._routes = [];\n this._useHash = useHash;\n this._hash = typeof hash === 'undefined' ? '#' : hash;\n this._paused = false;\n this._destroyed = false;\n this._lastRouteResolved = null;\n this._notFoundHandler = null;\n this._defaultHandler = null;\n this._usePushState = !useHash && isPushStateAvailable();\n this._onLocationChange = this._onLocationChange.bind(this);\n\n if (r) {\n this.root = useHash ? r.replace(/\\/$/, '/' + this._hash) : r.replace(/\\/$/, '');\n } else if (useHash) {\n this.root = this._cLoc().split(this._hash)[0].replace(/\\/$/, '/' + this._hash);\n }\n\n this._listen();\n this.updatePageLinks();\n}\n\nfunction clean(s) {\n if (s instanceof RegExp) return s;\n return s.replace(/\\/+$/, '').replace(/^\\/+/, '/');\n}\n\nfunction regExpResultToParams(match, names) {\n if (names.length === 0) return null;\n if (!match) return null;\n return match\n .slice(1, match.length)\n .reduce((params, value, index) => {\n if (params === null) params = {};\n params[names[index]] = value;\n return params;\n }, null);\n}\n\nfunction replaceDynamicURLParts(route) {\n var paramNames = [], regexp;\n\n if (route instanceof RegExp) {\n regexp = route;\n } else {\n regexp = new RegExp(\n clean(route)\n .replace(Navigo.PARAMETER_REGEXP, function (full, dots, name) {\n paramNames.push(name);\n return Navigo.REPLACE_VARIABLE_REGEXP;\n })\n .replace(Navigo.WILDCARD_REGEXP, Navigo.REPLACE_WILDCARD) + Navigo.FOLLOWED_BY_SLASH_REGEXP\n , Navigo.MATCH_REGEXP_FLAGS);\n }\n return { regexp, paramNames };\n}\n\nfunction getUrlDepth(url) {\n return url.replace(/\\/$/, '').split('/').length;\n}\n\nfunction compareUrlDepth(urlA, urlB) {\n return getUrlDepth(urlB) - getUrlDepth(urlA);\n}\n\nfunction findMatchedRoutes(url, routes = []) {\n return routes\n .map(route => {\n var { regexp, paramNames } = replaceDynamicURLParts(route.route);\n var match = url.match(regexp);\n var params = regExpResultToParams(match, paramNames);\n\n return match ? { match, route, params } : false;\n })\n .filter(m => m);\n}\n\nfunction match(url, routes) {\n return findMatchedRoutes(url, routes)[0] || false;\n}\n\nfunction root(url, routes) {\n var matched = findMatchedRoutes(\n url,\n routes.filter(route => {\n let u = clean(route.route);\n\n return u !== '' && u !== '*';\n })\n );\n var fallbackURL = clean(url);\n\n if (matched.length > 0) {\n return matched\n .map(m => clean(url.substr(0, m.match.index)))\n .reduce((root, current) => {\n return current.length < root.length ? current : root;\n }, fallbackURL);\n }\n return fallbackURL;\n}\n\nfunction isHashChangeAPIAvailable() {\n return !!(\n typeof window !== 'undefined' &&\n 'onhashchange' in window\n );\n}\n\nfunction extractGETParameters(url) {\n return url.split(/\\?(.*)?$/).slice(1).join('');\n}\n\nfunction getOnlyURL(url, useHash, hash) {\n var onlyURL = url.split(/\\?(.*)?$/)[0];\n\n if (typeof hash === 'undefined') {\n // To preserve BC\n hash = '#';\n }\n\n if (isPushStateAvailable() && !useHash) {\n onlyURL = onlyURL.split(hash)[0];\n }\n\n return onlyURL;\n}\n\nfunction manageHooks(handler, route, params) {\n if (route && route.hooks && typeof route.hooks === 'object') {\n if (route.hooks.before) {\n route.hooks.before((shouldRoute = true) => {\n if (!shouldRoute) return;\n handler();\n route.hooks.after && route.hooks.after(params);\n }, params);\n } else if (route.hooks.after) {\n handler();\n route.hooks.after && route.hooks.after(params);\n }\n return;\n }\n handler();\n};\n\nfunction isHashedRoot(url, useHash, hash) {\n if (isPushStateAvailable() && !useHash) {\n return false;\n }\n\n if (!url.match(hash)) {\n return false;\n }\n\n let split = url.split(hash);\n\n if (split.length < 2 || split[1] === '') {\n return true;\n }\n\n return false;\n};\n\nNavigo.prototype = {\n helpers: {\n match,\n root,\n clean\n },\n navigate: function (path, absolute) {\n var to;\n\n path = path || '';\n if (this._usePushState) {\n to = (!absolute ? this._getRoot() + '/' : '') + path.replace(/^\\/+/, '/');\n to = to.replace(/([^:])(\\/{2,})/g, '$1/');\n history[this._paused ? 'replaceState' : 'pushState']({}, '', to);\n this.resolve();\n } else if (typeof window !== 'undefined') {\n path = path.replace(new RegExp('^' + this._hash), '');\n window.location.href =\n window.location.href\n .replace(/#$/, '')\n .replace(new RegExp(this._hash + '.*$'), '') + this._hash + path;\n }\n return this;\n },\n on: function (...args) {\n if (typeof args[0] === 'function') {\n this._defaultHandler = { handler: args[0], hooks: args[1] };\n } else if (args.length >= 2) {\n if (args[0] === '/') {\n let func = args[1];\n\n if (typeof args[1] === 'object') {\n func = args[1].uses;\n }\n\n this._defaultHandler = { handler: func, hooks: args[2] };\n } else {\n this._add(args[0], args[1], args[2]);\n }\n } else if (typeof args[0] === 'object') {\n let orderedRoutes = Object.keys(args[0]).sort(compareUrlDepth);\n\n orderedRoutes.forEach(route => {\n this.on(route, args[0][route]);\n });\n }\n return this;\n },\n off: function (handler) {\n if (this._defaultHandler !== null && handler === this._defaultHandler.handler) {\n this._defaultHandler = null;\n } else if (this._notFoundHandler !== null && handler === this._notFoundHandler.handler) {\n this._notFoundHandler = null;\n }\n this._routes = this._routes.reduce((result, r) => {\n if (r.handler !== handler) result.push(r);\n return result;\n }, []);\n return this;\n },\n notFound: function (handler, hooks) {\n this._notFoundHandler = { handler, hooks: hooks };\n return this;\n },\n resolve: function (current) {\n var handler, m;\n var url = (current || this._cLoc()).replace(this._getRoot(), '');\n\n if (this._useHash) {\n url = url.replace(new RegExp('^\\/' + this._hash), '/');\n }\n\n let GETParameters = extractGETParameters(current || this._cLoc());\n let onlyURL = getOnlyURL(url, this._useHash, this._hash);\n\n if (\n this._paused ||\n (\n this._lastRouteResolved &&\n onlyURL === this._lastRouteResolved.url &&\n GETParameters === this._lastRouteResolved.query\n )\n ) { return false; }\n\n m = match(onlyURL, this._routes);\n\n if (m) {\n this._lastRouteResolved = { url: onlyURL, query: GETParameters };\n handler = m.route.handler;\n manageHooks(() => {\n m.route.route instanceof RegExp ?\n handler(...(m.match.slice(1, m.match.length))) :\n handler(m.params, GETParameters);\n }, m.route, m.params);\n return m;\n } else if (this._defaultHandler && (\n onlyURL === '' ||\n onlyURL === '/' ||\n onlyURL === this._hash ||\n isHashedRoot(onlyURL, this._useHash, this._hash)\n )) {\n manageHooks(() => {\n this._lastRouteResolved = { url: onlyURL, query: GETParameters };\n this._defaultHandler.handler(GETParameters);\n }, this._defaultHandler);\n return true;\n } else if (this._notFoundHandler) {\n manageHooks(() => {\n this._lastRouteResolved = { url: onlyURL, query: GETParameters };\n this._notFoundHandler.handler(GETParameters);\n }, this._notFoundHandler);\n }\n return false;\n },\n destroy: function () {\n this._routes = [];\n this._destroyed = true;\n clearTimeout(this._listenningInterval);\n if (typeof window !== 'undefined') {\n window.removeEventListener('popstate', this._onLocationChange);\n window.removeEventListener('hashchange', this._onLocationChange);\n }\n },\n updatePageLinks: function () {\n var self = this;\n\n if (typeof document === 'undefined') return;\n\n this._findLinks().forEach(link => {\n if (!link.hasListenerAttached) {\n link.addEventListener('click', function (e) {\n var location = link.pathname;\n\n if (!self._destroyed) {\n e.preventDefault();\n self.navigate(clean(location));\n }\n });\n link.hasListenerAttached = true;\n }\n });\n },\n generate: function (name, data = {}) {\n var result = this._routes.reduce((result, route) => {\n var key;\n\n if (route.name === name) {\n result = route.route;\n for (key in data) {\n result = result.replace(':' + key, data[key]);\n }\n }\n return result;\n }, '');\n\n return this._useHash ? this._hash + result : result;\n },\n link: function (path) {\n return this._getRoot() + path;\n },\n pause: function (status = true) {\n this._paused = status;\n },\n resume: function () {\n this.pause(false);\n },\n disableIfAPINotAvailable: function () {\n if (!isPushStateAvailable()) {\n this.destroy();\n }\n },\n lastRouteResolved() {\n return this._lastRouteResolved;\n },\n _add: function (route, handler = null, hooks = null) {\n if (typeof route === 'string') {\n route = encodeURI(route);\n }\n if (typeof handler === 'object') {\n this._routes.push({\n route,\n handler: handler.uses,\n name: handler.as,\n hooks: hooks || handler.hooks\n });\n } else {\n this._routes.push({ route, handler, hooks: hooks });\n }\n return this._add;\n },\n _getRoot: function () {\n if (this.root !== null) return this.root;\n this.root = root(this._cLoc(), this._routes);\n return this.root;\n },\n _listen: function () {\n if (this._usePushState) {\n window.addEventListener('popstate', this._onLocationChange);\n } else if (isHashChangeAPIAvailable()) {\n window.addEventListener('hashchange', this._onLocationChange);\n } else {\n let cached = this._cLoc(), current, check;\n\n check = () => {\n current = this._cLoc();\n if (cached !== current) {\n cached = current;\n this.resolve();\n }\n this._listenningInterval = setTimeout(check, 200);\n };\n check();\n }\n },\n _cLoc: function () {\n if (typeof window !== 'undefined') {\n if (typeof window.__NAVIGO_WINDOW_LOCATION_MOCK__ !== 'undefined') {\n return window.__NAVIGO_WINDOW_LOCATION_MOCK__;\n }\n return clean(window.location.href);\n }\n return '';\n },\n _findLinks: function () {\n return [].slice.call(document.querySelectorAll('[data-navigo]'));\n },\n _onLocationChange: function () {\n this.resolve();\n }\n};\n\nNavigo.PARAMETER_REGEXP = /([:*])(\\w+)/g;\nNavigo.WILDCARD_REGEXP = /\\*/g;\nNavigo.REPLACE_VARIABLE_REGEXP = '([^\\/]+)';\nNavigo.REPLACE_WILDCARD = '(?:.*)';\nNavigo.FOLLOWED_BY_SLASH_REGEXP = '(?:\\/$|$)';\nNavigo.MATCH_REGEXP_FLAGS = '';\n\nexport default Navigo;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///navigo.min.js","webpack:///webpack/bootstrap bfc52c70e2e272b3f016","webpack:///./src/index.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_toConsumableArray","arr","Array","isArray","i","arr2","length","from","isPushStateAvailable","window","history","pushState","Navigo","r","useHash","hash","_routes","_useHash","_hash","_paused","_destroyed","_lastRouteResolved","_notFoundHandler","_defaultHandler","_usePushState","_onLocationChange","bind","replace","_cLoc","split","_listen","updatePageLinks","clean","s","RegExp","regExpResultToParams","match","names","slice","reduce","params","value","index","replaceDynamicURLParts","route","regexp","paramNames","PARAMETER_REGEXP","full","dots","name","push","REPLACE_VARIABLE_REGEXP","WILDCARD_REGEXP","REPLACE_WILDCARD","FOLLOWED_BY_SLASH_REGEXP","MATCH_REGEXP_FLAGS","getUrlDepth","url","compareUrlDepth","urlA","urlB","findMatchedRoutes","routes","arguments","undefined","map","_replaceDynamicURLPar","filter","matched","u","fallbackURL","substr","current","isHashChangeAPIAvailable","extractGETParameters","join","getOnlyURL","onlyURL","manageHooks","handler","hooks","_typeof","before","shouldRoute","after","isHashedRoot","Object","defineProperty","Symbol","iterator","obj","constructor","prototype","helpers","navigate","path","absolute","to","_getRoot","resolve","location","href","on","_this","_len","args","_key","func","uses","_add","orderedRoutes","keys","sort","forEach","off","result","notFound","_this2","GETParameters","query","destroy","clearTimeout","_listenningInterval","removeEventListener","self","document","_findLinks","link","hasListenerAttached","addEventListener","e","getLinkPath","preventDefault","generate","data","key","pause","status","resume","disableIfAPINotAvailable","lastRouteResolved","pathname","getAttribute","encodeURI","as","_this3","cached","check","setTimeout","__NAVIGO_WINDOW_LOCATION_MOCK__","querySelectorAll"],"mappings":"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","file":"navigo.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"Navigo\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Navigo\"] = factory();\n\telse\n\t\troot[\"Navigo\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"Navigo\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Navigo\"] = factory();\n\telse\n\t\troot[\"Navigo\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\t\n\tfunction isPushStateAvailable() {\n\t return !!(typeof window !== 'undefined' && window.history && window.history.pushState);\n\t}\n\t\n\tfunction Navigo(r, useHash, hash) {\n\t this.root = null;\n\t this._routes = [];\n\t this._useHash = useHash;\n\t this._hash = typeof hash === 'undefined' ? '#' : hash;\n\t this._paused = false;\n\t this._destroyed = false;\n\t this._lastRouteResolved = null;\n\t this._notFoundHandler = null;\n\t this._defaultHandler = null;\n\t this._usePushState = !useHash && isPushStateAvailable();\n\t this._onLocationChange = this._onLocationChange.bind(this);\n\t\n\t if (r) {\n\t this.root = useHash ? r.replace(/\\/$/, '/' + this._hash) : r.replace(/\\/$/, '');\n\t } else if (useHash) {\n\t this.root = this._cLoc().split(this._hash)[0].replace(/\\/$/, '/' + this._hash);\n\t }\n\t\n\t this._listen();\n\t this.updatePageLinks();\n\t}\n\t\n\tfunction clean(s) {\n\t if (s instanceof RegExp) return s;\n\t return s.replace(/\\/+$/, '').replace(/^\\/+/, '/');\n\t}\n\t\n\tfunction regExpResultToParams(match, names) {\n\t if (names.length === 0) return null;\n\t if (!match) return null;\n\t return match.slice(1, match.length).reduce(function (params, value, index) {\n\t if (params === null) params = {};\n\t params[names[index]] = value;\n\t return params;\n\t }, null);\n\t}\n\t\n\tfunction replaceDynamicURLParts(route) {\n\t var paramNames = [],\n\t regexp;\n\t\n\t if (route instanceof RegExp) {\n\t regexp = route;\n\t } else {\n\t regexp = new RegExp(clean(route).replace(Navigo.PARAMETER_REGEXP, function (full, dots, name) {\n\t paramNames.push(name);\n\t return Navigo.REPLACE_VARIABLE_REGEXP;\n\t }).replace(Navigo.WILDCARD_REGEXP, Navigo.REPLACE_WILDCARD) + Navigo.FOLLOWED_BY_SLASH_REGEXP, Navigo.MATCH_REGEXP_FLAGS);\n\t }\n\t return { regexp: regexp, paramNames: paramNames };\n\t}\n\t\n\tfunction getUrlDepth(url) {\n\t return url.replace(/\\/$/, '').split('/').length;\n\t}\n\t\n\tfunction compareUrlDepth(urlA, urlB) {\n\t return getUrlDepth(urlB) - getUrlDepth(urlA);\n\t}\n\t\n\tfunction findMatchedRoutes(url) {\n\t var routes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\t\n\t return routes.map(function (route) {\n\t var _replaceDynamicURLPar = replaceDynamicURLParts(route.route),\n\t regexp = _replaceDynamicURLPar.regexp,\n\t paramNames = _replaceDynamicURLPar.paramNames;\n\t\n\t var match = url.match(regexp);\n\t var params = regExpResultToParams(match, paramNames);\n\t\n\t return match ? { match: match, route: route, params: params } : false;\n\t }).filter(function (m) {\n\t return m;\n\t });\n\t}\n\t\n\tfunction match(url, routes) {\n\t return findMatchedRoutes(url, routes)[0] || false;\n\t}\n\t\n\tfunction root(url, routes) {\n\t var matched = findMatchedRoutes(url, routes.filter(function (route) {\n\t var u = clean(route.route);\n\t\n\t return u !== '' && u !== '*';\n\t }));\n\t var fallbackURL = clean(url);\n\t\n\t if (matched.length > 0) {\n\t return matched.map(function (m) {\n\t return clean(url.substr(0, m.match.index));\n\t }).reduce(function (root, current) {\n\t return current.length < root.length ? current : root;\n\t }, fallbackURL);\n\t }\n\t return fallbackURL;\n\t}\n\t\n\tfunction isHashChangeAPIAvailable() {\n\t return !!(typeof window !== 'undefined' && 'onhashchange' in window);\n\t}\n\t\n\tfunction extractGETParameters(url) {\n\t return url.split(/\\?(.*)?$/).slice(1).join('');\n\t}\n\t\n\tfunction getOnlyURL(url, useHash, hash) {\n\t var onlyURL = url.split(/\\?(.*)?$/)[0];\n\t\n\t if (typeof hash === 'undefined') {\n\t // To preserve BC\n\t hash = '#';\n\t }\n\t\n\t if (isPushStateAvailable() && !useHash) {\n\t onlyURL = onlyURL.split(hash)[0];\n\t }\n\t\n\t return onlyURL;\n\t}\n\t\n\tfunction manageHooks(handler, route, params) {\n\t if (route && route.hooks && _typeof(route.hooks) === 'object') {\n\t if (route.hooks.before) {\n\t route.hooks.before(function () {\n\t var shouldRoute = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\t\n\t if (!shouldRoute) return;\n\t handler();\n\t route.hooks.after && route.hooks.after(params);\n\t }, params);\n\t } else if (route.hooks.after) {\n\t handler();\n\t route.hooks.after && route.hooks.after(params);\n\t }\n\t return;\n\t }\n\t handler();\n\t};\n\t\n\tfunction isHashedRoot(url, useHash, hash) {\n\t if (isPushStateAvailable() && !useHash) {\n\t return false;\n\t }\n\t\n\t if (!url.match(hash)) {\n\t return false;\n\t }\n\t\n\t var split = url.split(hash);\n\t\n\t if (split.length < 2 || split[1] === '') {\n\t return true;\n\t }\n\t\n\t return false;\n\t};\n\t\n\tNavigo.prototype = {\n\t helpers: {\n\t match: match,\n\t root: root,\n\t clean: clean\n\t },\n\t navigate: function navigate(path, absolute) {\n\t var to;\n\t\n\t path = path || '';\n\t if (this._usePushState) {\n\t to = (!absolute ? this._getRoot() + '/' : '') + path.replace(/^\\/+/, '/');\n\t to = to.replace(/([^:])(\\/{2,})/g, '$1/');\n\t history[this._paused ? 'replaceState' : 'pushState']({}, '', to);\n\t this.resolve();\n\t } else if (typeof window !== 'undefined') {\n\t path = path.replace(new RegExp('^' + this._hash), '');\n\t window.location.href = window.location.href.replace(/#$/, '').replace(new RegExp(this._hash + '.*$'), '') + this._hash + path;\n\t }\n\t return this;\n\t },\n\t on: function on() {\n\t var _this = this;\n\t\n\t for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t args[_key] = arguments[_key];\n\t }\n\t\n\t if (typeof args[0] === 'function') {\n\t this._defaultHandler = { handler: args[0], hooks: args[1] };\n\t } else if (args.length >= 2) {\n\t if (args[0] === '/') {\n\t var func = args[1];\n\t\n\t if (_typeof(args[1]) === 'object') {\n\t func = args[1].uses;\n\t }\n\t\n\t this._defaultHandler = { handler: func, hooks: args[2] };\n\t } else {\n\t this._add(args[0], args[1], args[2]);\n\t }\n\t } else if (_typeof(args[0]) === 'object') {\n\t var orderedRoutes = Object.keys(args[0]).sort(compareUrlDepth);\n\t\n\t orderedRoutes.forEach(function (route) {\n\t _this.on(route, args[0][route]);\n\t });\n\t }\n\t return this;\n\t },\n\t off: function off(handler) {\n\t if (this._defaultHandler !== null && handler === this._defaultHandler.handler) {\n\t this._defaultHandler = null;\n\t } else if (this._notFoundHandler !== null && handler === this._notFoundHandler.handler) {\n\t this._notFoundHandler = null;\n\t }\n\t this._routes = this._routes.reduce(function (result, r) {\n\t if (r.handler !== handler) result.push(r);\n\t return result;\n\t }, []);\n\t return this;\n\t },\n\t notFound: function notFound(handler, hooks) {\n\t this._notFoundHandler = { handler: handler, hooks: hooks };\n\t return this;\n\t },\n\t resolve: function resolve(current) {\n\t var _this2 = this;\n\t\n\t var handler, m;\n\t var url = (current || this._cLoc()).replace(this._getRoot(), '');\n\t\n\t if (this._useHash) {\n\t url = url.replace(new RegExp('^\\/' + this._hash), '/');\n\t }\n\t\n\t var GETParameters = extractGETParameters(current || this._cLoc());\n\t var onlyURL = getOnlyURL(url, this._useHash, this._hash);\n\t\n\t if (this._paused || this._lastRouteResolved && onlyURL === this._lastRouteResolved.url && GETParameters === this._lastRouteResolved.query) {\n\t return false;\n\t }\n\t\n\t m = match(onlyURL, this._routes);\n\t\n\t if (m) {\n\t this._lastRouteResolved = { url: onlyURL, query: GETParameters };\n\t handler = m.route.handler;\n\t manageHooks(function () {\n\t m.route.route instanceof RegExp ? handler.apply(undefined, _toConsumableArray(m.match.slice(1, m.match.length))) : handler(m.params, GETParameters);\n\t }, m.route, m.params);\n\t return m;\n\t } else if (this._defaultHandler && (onlyURL === '' || onlyURL === '/' || onlyURL === this._hash || isHashedRoot(onlyURL, this._useHash, this._hash))) {\n\t manageHooks(function () {\n\t _this2._lastRouteResolved = { url: onlyURL, query: GETParameters };\n\t _this2._defaultHandler.handler(GETParameters);\n\t }, this._defaultHandler);\n\t return true;\n\t } else if (this._notFoundHandler) {\n\t manageHooks(function () {\n\t _this2._lastRouteResolved = { url: onlyURL, query: GETParameters };\n\t _this2._notFoundHandler.handler(GETParameters);\n\t }, this._notFoundHandler);\n\t }\n\t return false;\n\t },\n\t destroy: function destroy() {\n\t this._routes = [];\n\t this._destroyed = true;\n\t clearTimeout(this._listenningInterval);\n\t if (typeof window !== 'undefined') {\n\t window.removeEventListener('popstate', this._onLocationChange);\n\t window.removeEventListener('hashchange', this._onLocationChange);\n\t }\n\t },\n\t updatePageLinks: function updatePageLinks() {\n\t var self = this;\n\t\n\t if (typeof document === 'undefined') return;\n\t\n\t this._findLinks().forEach(function (link) {\n\t if (!link.hasListenerAttached) {\n\t link.addEventListener('click', function (e) {\n\t var location = self.getLinkPath(link);\n\t\n\t if (!self._destroyed) {\n\t e.preventDefault();\n\t self.navigate(clean(location));\n\t }\n\t });\n\t link.hasListenerAttached = true;\n\t }\n\t });\n\t },\n\t generate: function generate(name) {\n\t var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\t\n\t var result = this._routes.reduce(function (result, route) {\n\t var key;\n\t\n\t if (route.name === name) {\n\t result = route.route;\n\t for (key in data) {\n\t result = result.replace(':' + key, data[key]);\n\t }\n\t }\n\t return result;\n\t }, '');\n\t\n\t return this._useHash ? this._hash + result : result;\n\t },\n\t link: function link(path) {\n\t return this._getRoot() + path;\n\t },\n\t pause: function pause() {\n\t var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\t\n\t this._paused = status;\n\t },\n\t resume: function resume() {\n\t this.pause(false);\n\t },\n\t disableIfAPINotAvailable: function disableIfAPINotAvailable() {\n\t if (!isPushStateAvailable()) {\n\t this.destroy();\n\t }\n\t },\n\t lastRouteResolved: function lastRouteResolved() {\n\t return this._lastRouteResolved;\n\t },\n\t getLinkPath: function getLinkPath(link) {\n\t return link.pathname || link.getAttribute('href');\n\t },\n\t\n\t _add: function _add(route) {\n\t var handler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\t var hooks = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\t\n\t if (typeof route === 'string') {\n\t route = encodeURI(route);\n\t }\n\t if ((typeof handler === 'undefined' ? 'undefined' : _typeof(handler)) === 'object') {\n\t this._routes.push({\n\t route: route,\n\t handler: handler.uses,\n\t name: handler.as,\n\t hooks: hooks || handler.hooks\n\t });\n\t } else {\n\t this._routes.push({ route: route, handler: handler, hooks: hooks });\n\t }\n\t return this._add;\n\t },\n\t _getRoot: function _getRoot() {\n\t if (this.root !== null) return this.root;\n\t this.root = root(this._cLoc(), this._routes);\n\t return this.root;\n\t },\n\t _listen: function _listen() {\n\t var _this3 = this;\n\t\n\t if (this._usePushState) {\n\t window.addEventListener('popstate', this._onLocationChange);\n\t } else if (isHashChangeAPIAvailable()) {\n\t window.addEventListener('hashchange', this._onLocationChange);\n\t } else {\n\t var cached = this._cLoc(),\n\t current = void 0,\n\t _check = void 0;\n\t\n\t _check = function check() {\n\t current = _this3._cLoc();\n\t if (cached !== current) {\n\t cached = current;\n\t _this3.resolve();\n\t }\n\t _this3._listenningInterval = setTimeout(_check, 200);\n\t };\n\t _check();\n\t }\n\t },\n\t _cLoc: function _cLoc() {\n\t if (typeof window !== 'undefined') {\n\t if (typeof window.__NAVIGO_WINDOW_LOCATION_MOCK__ !== 'undefined') {\n\t return window.__NAVIGO_WINDOW_LOCATION_MOCK__;\n\t }\n\t return clean(window.location.href);\n\t }\n\t return '';\n\t },\n\t _findLinks: function _findLinks() {\n\t return [].slice.call(document.querySelectorAll('[data-navigo]'));\n\t },\n\t _onLocationChange: function _onLocationChange() {\n\t this.resolve();\n\t }\n\t};\n\t\n\tNavigo.PARAMETER_REGEXP = /([:*])(\\w+)/g;\n\tNavigo.WILDCARD_REGEXP = /\\*/g;\n\tNavigo.REPLACE_VARIABLE_REGEXP = '([^\\/]+)';\n\tNavigo.REPLACE_WILDCARD = '(?:.*)';\n\tNavigo.FOLLOWED_BY_SLASH_REGEXP = '(?:\\/$|$)';\n\tNavigo.MATCH_REGEXP_FLAGS = '';\n\t\n\texports.default = Navigo;\n\tmodule.exports = exports['default'];\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** navigo.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap bfc52c70e2e272b3f016\n **/","function isPushStateAvailable() {\n return !!(\n typeof window !== 'undefined' &&\n window.history &&\n window.history.pushState\n );\n}\n\nfunction Navigo(r, useHash, hash) {\n this.root = null;\n this._routes = [];\n this._useHash = useHash;\n this._hash = typeof hash === 'undefined' ? '#' : hash;\n this._paused = false;\n this._destroyed = false;\n this._lastRouteResolved = null;\n this._notFoundHandler = null;\n this._defaultHandler = null;\n this._usePushState = !useHash && isPushStateAvailable();\n this._onLocationChange = this._onLocationChange.bind(this);\n\n if (r) {\n this.root = useHash ? r.replace(/\\/$/, '/' + this._hash) : r.replace(/\\/$/, '');\n } else if (useHash) {\n this.root = this._cLoc().split(this._hash)[0].replace(/\\/$/, '/' + this._hash);\n }\n\n this._listen();\n this.updatePageLinks();\n}\n\nfunction clean(s) {\n if (s instanceof RegExp) return s;\n return s.replace(/\\/+$/, '').replace(/^\\/+/, '/');\n}\n\nfunction regExpResultToParams(match, names) {\n if (names.length === 0) return null;\n if (!match) return null;\n return match\n .slice(1, match.length)\n .reduce((params, value, index) => {\n if (params === null) params = {};\n params[names[index]] = value;\n return params;\n }, null);\n}\n\nfunction replaceDynamicURLParts(route) {\n var paramNames = [], regexp;\n\n if (route instanceof RegExp) {\n regexp = route;\n } else {\n regexp = new RegExp(\n clean(route)\n .replace(Navigo.PARAMETER_REGEXP, function (full, dots, name) {\n paramNames.push(name);\n return Navigo.REPLACE_VARIABLE_REGEXP;\n })\n .replace(Navigo.WILDCARD_REGEXP, Navigo.REPLACE_WILDCARD) + Navigo.FOLLOWED_BY_SLASH_REGEXP\n , Navigo.MATCH_REGEXP_FLAGS);\n }\n return { regexp, paramNames };\n}\n\nfunction getUrlDepth(url) {\n return url.replace(/\\/$/, '').split('/').length;\n}\n\nfunction compareUrlDepth(urlA, urlB) {\n return getUrlDepth(urlB) - getUrlDepth(urlA);\n}\n\nfunction findMatchedRoutes(url, routes = []) {\n return routes\n .map(route => {\n var { regexp, paramNames } = replaceDynamicURLParts(route.route);\n var match = url.match(regexp);\n var params = regExpResultToParams(match, paramNames);\n\n return match ? { match, route, params } : false;\n })\n .filter(m => m);\n}\n\nfunction match(url, routes) {\n return findMatchedRoutes(url, routes)[0] || false;\n}\n\nfunction root(url, routes) {\n var matched = findMatchedRoutes(\n url,\n routes.filter(route => {\n let u = clean(route.route);\n\n return u !== '' && u !== '*';\n })\n );\n var fallbackURL = clean(url);\n\n if (matched.length > 0) {\n return matched\n .map(m => clean(url.substr(0, m.match.index)))\n .reduce((root, current) => {\n return current.length < root.length ? current : root;\n }, fallbackURL);\n }\n return fallbackURL;\n}\n\nfunction isHashChangeAPIAvailable() {\n return !!(\n typeof window !== 'undefined' &&\n 'onhashchange' in window\n );\n}\n\nfunction extractGETParameters(url) {\n return url.split(/\\?(.*)?$/).slice(1).join('');\n}\n\nfunction getOnlyURL(url, useHash, hash) {\n var onlyURL = url.split(/\\?(.*)?$/)[0];\n\n if (typeof hash === 'undefined') {\n // To preserve BC\n hash = '#';\n }\n\n if (isPushStateAvailable() && !useHash) {\n onlyURL = onlyURL.split(hash)[0];\n }\n\n return onlyURL;\n}\n\nfunction manageHooks(handler, route, params) {\n if (route && route.hooks && typeof route.hooks === 'object') {\n if (route.hooks.before) {\n route.hooks.before((shouldRoute = true) => {\n if (!shouldRoute) return;\n handler();\n route.hooks.after && route.hooks.after(params);\n }, params);\n } else if (route.hooks.after) {\n handler();\n route.hooks.after && route.hooks.after(params);\n }\n return;\n }\n handler();\n};\n\nfunction isHashedRoot(url, useHash, hash) {\n if (isPushStateAvailable() && !useHash) {\n return false;\n }\n\n if (!url.match(hash)) {\n return false;\n }\n\n let split = url.split(hash);\n\n if (split.length < 2 || split[1] === '') {\n return true;\n }\n\n return false;\n};\n\nNavigo.prototype = {\n helpers: {\n match,\n root,\n clean\n },\n navigate: function (path, absolute) {\n var to;\n\n path = path || '';\n if (this._usePushState) {\n to = (!absolute ? this._getRoot() + '/' : '') + path.replace(/^\\/+/, '/');\n to = to.replace(/([^:])(\\/{2,})/g, '$1/');\n history[this._paused ? 'replaceState' : 'pushState']({}, '', to);\n this.resolve();\n } else if (typeof window !== 'undefined') {\n path = path.replace(new RegExp('^' + this._hash), '');\n window.location.href =\n window.location.href\n .replace(/#$/, '')\n .replace(new RegExp(this._hash + '.*$'), '') + this._hash + path;\n }\n return this;\n },\n on: function (...args) {\n if (typeof args[0] === 'function') {\n this._defaultHandler = { handler: args[0], hooks: args[1] };\n } else if (args.length >= 2) {\n if (args[0] === '/') {\n let func = args[1];\n\n if (typeof args[1] === 'object') {\n func = args[1].uses;\n }\n\n this._defaultHandler = { handler: func, hooks: args[2] };\n } else {\n this._add(args[0], args[1], args[2]);\n }\n } else if (typeof args[0] === 'object') {\n let orderedRoutes = Object.keys(args[0]).sort(compareUrlDepth);\n\n orderedRoutes.forEach(route => {\n this.on(route, args[0][route]);\n });\n }\n return this;\n },\n off: function (handler) {\n if (this._defaultHandler !== null && handler === this._defaultHandler.handler) {\n this._defaultHandler = null;\n } else if (this._notFoundHandler !== null && handler === this._notFoundHandler.handler) {\n this._notFoundHandler = null;\n }\n this._routes = this._routes.reduce((result, r) => {\n if (r.handler !== handler) result.push(r);\n return result;\n }, []);\n return this;\n },\n notFound: function (handler, hooks) {\n this._notFoundHandler = { handler, hooks: hooks };\n return this;\n },\n resolve: function (current) {\n var handler, m;\n var url = (current || this._cLoc()).replace(this._getRoot(), '');\n\n if (this._useHash) {\n url = url.replace(new RegExp('^\\/' + this._hash), '/');\n }\n\n let GETParameters = extractGETParameters(current || this._cLoc());\n let onlyURL = getOnlyURL(url, this._useHash, this._hash);\n\n if (\n this._paused ||\n (\n this._lastRouteResolved &&\n onlyURL === this._lastRouteResolved.url &&\n GETParameters === this._lastRouteResolved.query\n )\n ) { return false; }\n\n m = match(onlyURL, this._routes);\n\n if (m) {\n this._lastRouteResolved = { url: onlyURL, query: GETParameters };\n handler = m.route.handler;\n manageHooks(() => {\n m.route.route instanceof RegExp ?\n handler(...(m.match.slice(1, m.match.length))) :\n handler(m.params, GETParameters);\n }, m.route, m.params);\n return m;\n } else if (this._defaultHandler && (\n onlyURL === '' ||\n onlyURL === '/' ||\n onlyURL === this._hash ||\n isHashedRoot(onlyURL, this._useHash, this._hash)\n )) {\n manageHooks(() => {\n this._lastRouteResolved = { url: onlyURL, query: GETParameters };\n this._defaultHandler.handler(GETParameters);\n }, this._defaultHandler);\n return true;\n } else if (this._notFoundHandler) {\n manageHooks(() => {\n this._lastRouteResolved = { url: onlyURL, query: GETParameters };\n this._notFoundHandler.handler(GETParameters);\n }, this._notFoundHandler);\n }\n return false;\n },\n destroy: function () {\n this._routes = [];\n this._destroyed = true;\n clearTimeout(this._listenningInterval);\n if (typeof window !== 'undefined') {\n window.removeEventListener('popstate', this._onLocationChange);\n window.removeEventListener('hashchange', this._onLocationChange);\n }\n },\n updatePageLinks: function () {\n var self = this;\n\n if (typeof document === 'undefined') return;\n\n this._findLinks().forEach(link => {\n if (!link.hasListenerAttached) {\n link.addEventListener('click', function (e) {\n var location = self.getLinkPath(link);\n\n if (!self._destroyed) {\n e.preventDefault();\n self.navigate(clean(location));\n }\n });\n link.hasListenerAttached = true;\n }\n });\n },\n generate: function (name, data = {}) {\n var result = this._routes.reduce((result, route) => {\n var key;\n\n if (route.name === name) {\n result = route.route;\n for (key in data) {\n result = result.replace(':' + key, data[key]);\n }\n }\n return result;\n }, '');\n\n return this._useHash ? this._hash + result : result;\n },\n link: function (path) {\n return this._getRoot() + path;\n },\n pause: function (status = true) {\n this._paused = status;\n },\n resume: function () {\n this.pause(false);\n },\n disableIfAPINotAvailable: function () {\n if (!isPushStateAvailable()) {\n this.destroy();\n }\n },\n lastRouteResolved() {\n return this._lastRouteResolved;\n },\n getLinkPath(link) {\n return link.pathname || link.getAttribute('href');\n },\n _add: function (route, handler = null, hooks = null) {\n if (typeof route === 'string') {\n route = encodeURI(route);\n }\n if (typeof handler === 'object') {\n this._routes.push({\n route,\n handler: handler.uses,\n name: handler.as,\n hooks: hooks || handler.hooks\n });\n } else {\n this._routes.push({ route, handler, hooks: hooks });\n }\n return this._add;\n },\n _getRoot: function () {\n if (this.root !== null) return this.root;\n this.root = root(this._cLoc(), this._routes);\n return this.root;\n },\n _listen: function () {\n if (this._usePushState) {\n window.addEventListener('popstate', this._onLocationChange);\n } else if (isHashChangeAPIAvailable()) {\n window.addEventListener('hashchange', this._onLocationChange);\n } else {\n let cached = this._cLoc(), current, check;\n\n check = () => {\n current = this._cLoc();\n if (cached !== current) {\n cached = current;\n this.resolve();\n }\n this._listenningInterval = setTimeout(check, 200);\n };\n check();\n }\n },\n _cLoc: function () {\n if (typeof window !== 'undefined') {\n if (typeof window.__NAVIGO_WINDOW_LOCATION_MOCK__ !== 'undefined') {\n return window.__NAVIGO_WINDOW_LOCATION_MOCK__;\n }\n return clean(window.location.href);\n }\n return '';\n },\n _findLinks: function () {\n return [].slice.call(document.querySelectorAll('[data-navigo]'));\n },\n _onLocationChange: function () {\n this.resolve();\n }\n};\n\nNavigo.PARAMETER_REGEXP = /([:*])(\\w+)/g;\nNavigo.WILDCARD_REGEXP = /\\*/g;\nNavigo.REPLACE_VARIABLE_REGEXP = '([^\\/]+)';\nNavigo.REPLACE_WILDCARD = '(?:.*)';\nNavigo.FOLLOWED_BY_SLASH_REGEXP = '(?:\\/$|$)';\nNavigo.MATCH_REGEXP_FLAGS = '';\n\nexport default Navigo;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/package.json b/package.json index 7974ecd1..347bce8a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "navigo", - "version": "4.6.2", + "version": "4.7.0", "description": "A simple vanilla JavaScript router with a fallback for older browsers", "main": "lib/navigo.js", "jsnext:main": "src/index.js", diff --git a/src/index.js b/src/index.js index 712bd093..4fd60689 100644 --- a/src/index.js +++ b/src/index.js @@ -301,7 +301,7 @@ Navigo.prototype = { this._findLinks().forEach(link => { if (!link.hasListenerAttached) { link.addEventListener('click', function (e) { - var location = link.pathname; + var location = self.getLinkPath(link); if (!self._destroyed) { e.preventDefault(); @@ -344,6 +344,9 @@ Navigo.prototype = { lastRouteResolved() { return this._lastRouteResolved; }, + getLinkPath(link) { + return link.pathname || link.getAttribute('href'); + }, _add: function (route, handler = null, hooks = null) { if (typeof route === 'string') { route = encodeURI(route); diff --git a/test/spec/InBrowser.spec.js b/test/spec/InBrowser.spec.js index fb98ffb6..8dcfe54b 100644 --- a/test/spec/InBrowser.spec.js +++ b/test/spec/InBrowser.spec.js @@ -352,4 +352,30 @@ describe('Given the Navigo library on the page', function () { .and.to.be.calledWith('answer=42'); }); }); + describe('and the problem described in #120', function () { + it('should use a custom function for fetching link\'s url', function () { + var event = new MouseEvent('click', { + 'view': window, + 'bubbles': true, + 'cancelable': true + }); + var link = document.createElement('LINK'); + var body = document.querySelector('body'); + + link.setAttribute('id', 'myLink'); + link.setAttribute('href', 'overview/getting-started'); + link.setAttribute('data-custom-url', 'foo/bar'); + link.setAttribute('data-navigo', 'yes'); + body.appendChild(link); + + router = new Navigo(null, true); + router.getLinkPath = function (link) { + return link.getAttribute('data-custom-url'); + }; + link.dispatchEvent(event); + + expect(window.location.href.split('#')[1]).to.be.equal('foo/bar'); + body.removeChild(link); + }); + }); });