diff --git a/CHANGELOG.md b/CHANGELOG.md index 380fcedc..79b01d3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.4.0 + +* Merging [#58](https://github.com/krasimir/navigo/pull/58) where we can prevent the handler calling from a before hook. + ## 3.3.3 * Another try fixing [#57](https://github.com/krasimir/navigo/issues/57) - now if we have `noHash=false` the hash part of the URL is removed and we are no longer considering it while comparing the last resolved URL. diff --git a/lib/navigo.js b/lib/navigo.js index 3b02cc92..d086598b 100644 --- a/lib/navigo.js +++ b/lib/navigo.js @@ -173,6 +173,9 @@ return /******/ (function(modules) { // webpackBootstrap if (route && route.hooks && _typeof(route.hooks) === 'object') { if (route.hooks.before) { route.hooks.before(function () { + var shouldRoute = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + if (!shouldRoute) return; handler(); route.hooks.after && route.hooks.after(); }); diff --git a/lib/navigo.js.map b/lib/navigo.js.map index 4ffd6bb2..e623658c 100644 --- a/lib/navigo.js.map +++ b/lib/navigo.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 476a401825ba05cde63e","webpack:///./src/index.js"],"names":["PARAMETER_REGEXP","WILDCARD_REGEXP","REPLACE_VARIABLE_REGEXP","REPLACE_WILDCARD","FOLLOWED_BY_SLASH_REGEXP","clean","s","RegExp","replace","regExpResultToParams","match","names","length","slice","reduce","params","value","index","replaceDynamicURLParts","route","paramNames","regexp","full","dots","name","push","getUrlDepth","url","split","compareUrlDepth","urlA","urlB","findMatchedRoutes","routes","map","filter","m","root","matched","u","fallbackURL","substr","current","isPushStateAvailable","window","history","pushState","isHashChangeAPIAvailable","extractGETParameters","useHash","onlyURL","query","GETParameters","join","manageHooks","handler","hooks","before","after","Navigo","r","_routes","_useHash","_paused","_destroyed","_lastRouteResolved","_notFoundHandler","_defaultHandler","_usePushState","_listen","updatePageLinks","prototype","helpers","navigate","path","absolute","to","_getRoot","resolve","location","href","on","args","_add","orderedRoutes","Object","keys","sort","forEach","notFound","_cLoc","destroy","clearTimeout","_listenningInterval","onpopstate","self","document","_findLinks","link","hasListenerAttached","addEventListener","e","getAttribute","preventDefault","generate","data","result","key","pause","status","disableIfAPINotAvailable","uses","as","onhashchange","cached","check","setTimeout","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 476a401825ba05cde63e\n **/","const PARAMETER_REGEXP = /([:*])(\\w+)/g;\nconst WILDCARD_REGEXP = /\\*/g;\nconst REPLACE_VARIABLE_REGEXP = '([^\\/]+)';\nconst REPLACE_WILDCARD = '(?:.*)';\nconst FOLLOWED_BY_SLASH_REGEXP = '(?:\\/$|$)';\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(PARAMETER_REGEXP, function (full, dots, name) {\n paramNames.push(name);\n return REPLACE_VARIABLE_REGEXP;\n })\n .replace(WILDCARD_REGEXP, REPLACE_WILDCARD) + FOLLOWED_BY_SLASH_REGEXP\n );\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(urlA) < getUrlDepth(urlB);\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 isPushStateAvailable() {\n return !!(\n typeof window !== 'undefined' &&\n window.history &&\n window.history.pushState\n );\n}\n\nfunction isHashChangeAPIAvailable() {\n return !!(\n typeof window !== 'undefined' &&\n 'onhashchange' in window\n );\n}\n\nfunction extractGETParameters(url, useHash) {\n var [ onlyURL, ...query ] = url.split(/\\?(.*)?$/);\n\n if (!useHash) {\n onlyURL = onlyURL.split('#')[0];\n }\n return { onlyURL, GETParameters: query.join('') };\n}\n\nfunction manageHooks(handler, route) {\n if (route && route.hooks && typeof route.hooks === 'object') {\n if (route.hooks.before) {\n route.hooks.before(() => {\n handler();\n route.hooks.after && route.hooks.after();\n });\n } else if (route.hooks.after) {\n handler();\n route.hooks.after && route.hooks.after();\n }\n return;\n }\n handler();\n};\n\nfunction Navigo(r, useHash) {\n this._routes = [];\n this.root = useHash && r ? r.replace(/\\/$/, '/#') : (r || null);\n this._useHash = useHash;\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._listen();\n this.updatePageLinks();\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() + '/' : '') + clean(path);\n to = to.replace(/([^:])(\\/{2,})/g, '$1/');\n history[this._paused ? 'replaceState' : 'pushState']({}, '', to);\n this.resolve();\n } else if (typeof window !== 'undefined') {\n window.location.href = window.location.href.replace(/#(.*)$/, '') + '#' + 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 this._defaultHandler = { handler: args[1], 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._add(route, args[0][route]);\n });\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(/^\\/#/, '/');\n }\n let { onlyURL, GETParameters } = extractGETParameters(url, this._useHash);\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);\n return m;\n } else if (this._defaultHandler && (onlyURL === '' || onlyURL === '/')) {\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 typeof window !== 'undefined' ? window.onpopstate = null : null;\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.getAttribute('href');\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 return 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 link: function (path) {\n return this._getRoot() + path;\n },\n pause: function (status) {\n this._paused = status;\n },\n disableIfAPINotAvailable: function () {\n if (!isPushStateAvailable()) {\n this.destroy();\n }\n },\n _add: function (route, handler = null, hooks = null) {\n if (typeof handler === 'object') {\n this._routes.push({ route, handler: handler.uses, name: handler.as, hooks: hooks });\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.onpopstate = () => {\n this.resolve();\n };\n } else if (isHashChangeAPIAvailable()) {\n window.onhashchange = () => {\n this.resolve();\n };\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 return window.location.href;\n }\n return '';\n },\n _findLinks: function () {\n return [].slice.call(document.querySelectorAll('[data-navigo]'));\n }\n};\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 82e96a995527d04082a0","webpack:///./src/index.js"],"names":["PARAMETER_REGEXP","WILDCARD_REGEXP","REPLACE_VARIABLE_REGEXP","REPLACE_WILDCARD","FOLLOWED_BY_SLASH_REGEXP","clean","s","RegExp","replace","regExpResultToParams","match","names","length","slice","reduce","params","value","index","replaceDynamicURLParts","route","paramNames","regexp","full","dots","name","push","getUrlDepth","url","split","compareUrlDepth","urlA","urlB","findMatchedRoutes","routes","map","filter","m","root","matched","u","fallbackURL","substr","current","isPushStateAvailable","window","history","pushState","isHashChangeAPIAvailable","extractGETParameters","useHash","onlyURL","query","GETParameters","join","manageHooks","handler","hooks","before","shouldRoute","after","Navigo","r","_routes","_useHash","_paused","_destroyed","_lastRouteResolved","_notFoundHandler","_defaultHandler","_usePushState","_listen","updatePageLinks","prototype","helpers","navigate","path","absolute","to","_getRoot","resolve","location","href","on","args","_add","orderedRoutes","Object","keys","sort","forEach","notFound","_cLoc","destroy","clearTimeout","_listenningInterval","onpopstate","self","document","_findLinks","link","hasListenerAttached","addEventListener","e","getAttribute","preventDefault","generate","data","result","key","pause","status","disableIfAPINotAvailable","uses","as","onhashchange","cached","check","setTimeout","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 82e96a995527d04082a0\n **/","const PARAMETER_REGEXP = /([:*])(\\w+)/g;\nconst WILDCARD_REGEXP = /\\*/g;\nconst REPLACE_VARIABLE_REGEXP = '([^\\/]+)';\nconst REPLACE_WILDCARD = '(?:.*)';\nconst FOLLOWED_BY_SLASH_REGEXP = '(?:\\/$|$)';\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(PARAMETER_REGEXP, function (full, dots, name) {\n paramNames.push(name);\n return REPLACE_VARIABLE_REGEXP;\n })\n .replace(WILDCARD_REGEXP, REPLACE_WILDCARD) + FOLLOWED_BY_SLASH_REGEXP\n );\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(urlA) < getUrlDepth(urlB);\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 isPushStateAvailable() {\n return !!(\n typeof window !== 'undefined' &&\n window.history &&\n window.history.pushState\n );\n}\n\nfunction isHashChangeAPIAvailable() {\n return !!(\n typeof window !== 'undefined' &&\n 'onhashchange' in window\n );\n}\n\nfunction extractGETParameters(url, useHash) {\n var [ onlyURL, ...query ] = url.split(/\\?(.*)?$/);\n\n if (!useHash) {\n onlyURL = onlyURL.split('#')[0];\n }\n return { onlyURL, GETParameters: query.join('') };\n}\n\nfunction manageHooks(handler, route) {\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();\n });\n } else if (route.hooks.after) {\n handler();\n route.hooks.after && route.hooks.after();\n }\n return;\n }\n handler();\n};\n\nfunction Navigo(r, useHash) {\n this._routes = [];\n this.root = useHash && r ? r.replace(/\\/$/, '/#') : (r || null);\n this._useHash = useHash;\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._listen();\n this.updatePageLinks();\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() + '/' : '') + clean(path);\n to = to.replace(/([^:])(\\/{2,})/g, '$1/');\n history[this._paused ? 'replaceState' : 'pushState']({}, '', to);\n this.resolve();\n } else if (typeof window !== 'undefined') {\n window.location.href = window.location.href.replace(/#(.*)$/, '') + '#' + 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 this._defaultHandler = { handler: args[1], 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._add(route, args[0][route]);\n });\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(/^\\/#/, '/');\n }\n let { onlyURL, GETParameters } = extractGETParameters(url, this._useHash);\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);\n return m;\n } else if (this._defaultHandler && (onlyURL === '' || onlyURL === '/')) {\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 typeof window !== 'undefined' ? window.onpopstate = null : null;\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.getAttribute('href');\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 return 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 link: function (path) {\n return this._getRoot() + path;\n },\n pause: function (status) {\n this._paused = status;\n },\n disableIfAPINotAvailable: function () {\n if (!isPushStateAvailable()) {\n this.destroy();\n }\n },\n _add: function (route, handler = null, hooks = null) {\n if (typeof handler === 'object') {\n this._routes.push({ route, handler: handler.uses, name: handler.as, hooks: hooks });\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.onpopstate = () => {\n this.resolve();\n };\n } else if (isHashChangeAPIAvailable()) {\n window.onhashchange = () => {\n this.resolve();\n };\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 return window.location.href;\n }\n return '';\n },\n _findLinks: function () {\n return [].slice.call(document.querySelectorAll('[data-navigo]'));\n }\n};\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 aab778b6..68af7a92 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,s=t.match(o),a=i(s,r);return!!s&&{match:s,route:e,params:a}}).filter(function(t){return t})}function h(t,e){return l(t,e)[0]||!1}function f(t,e){var n=l(t,e.filter(function(t){var e=r(t.route);return""!==e&&"*"!==e})),o=r(t);return n.length>0?n.map(function(e){return r(t.substr(0,e.match.index))}).reduce(function(t,e){return e.length=2)"/"===n[0]?this._defaultHandler={handler:n[1],hooks:n[2]}:this._add(n[0],n[1],n[2]);else if("object"===y(n[0])){var r=Object.keys(n[0]).sort(a);r.forEach(function(e){t._add(e,n[0][e])})}return 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(/^\/#/,"/"));var u=p(i,this._useHash),s=u.onlyURL,a=u.GETParameters;return!(this._paused||this._lastRouteResolved&&s===this._lastRouteResolved.url&&a===this._lastRouteResolved.query)&&((o=h(s,this._routes))?(this._lastRouteResolved={url:s,query:a},e=o.route.handler,_(function(){o.route.route instanceof RegExp?e.apply(void 0,n(o.match.slice(1,o.match.length))):e(o.params,a)},o.route),o):!this._defaultHandler||""!==s&&"/"!==s?(this._notFoundHandler&&_(function(){r._lastRouteResolved={url:s,query:a},r._notFoundHandler.handler(a)},this._notFoundHandler),!1):(_(function(){r._lastRouteResolved={url:s,query:a},r._defaultHandler.handler(a)},this._defaultHandler),!0))},destroy:function(){this._routes=[],this._destroyed=!0,clearTimeout(this._listenningInterval),"undefined"!=typeof window?window.onpopstate=null:null},updatePageLinks:function(){var t=this;"undefined"!=typeof document&&this._findLinks().forEach(function(e){e.hasListenerAttached||(e.addEventListener("click",function(n){var o=e.getAttribute("href");t._destroyed||(n.preventDefault(),t.navigate(r(o)))}),e.hasListenerAttached=!0)})},generate:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return 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},"")},link:function(t){return this._getRoot()+t},pause:function(t){this._paused=t},disableIfAPINotAvailable:function(){c()||this.destroy()},_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"object"===("undefined"==typeof e?"undefined":y(e))?this._routes.push({route:t,handler:e.uses,name:e.as,hooks:n}):this._routes.push({route:t,handler:e,hooks:n}),this._add},_getRoot:function(){return null!==this.root?this.root:(this.root=f(this._cLoc(),this._routes),this.root)},_listen:function(){var t=this;this._usePushState?window.onpopstate=function(){t.resolve()}:d()?window.onhashchange=function(){t.resolve()}:!function(){var e=t._cLoc(),n=void 0,o=void 0;(o=function(){n=t._cLoc(),e!==n&&(e=n,t.resolve()),t._listenningInterval=setTimeout(o,200)})()}()},_cLoc:function(){return"undefined"!=typeof window?window.location.href:""},_findLinks:function(){return[].slice.call(document.querySelectorAll("[data-navigo]"))}},e["default"]=v,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,s=t.match(o),a=i(s,r);return!!s&&{match:s,route:e,params:a}}).filter(function(t){return t})}function h(t,e){return l(t,e)[0]||!1}function f(t,e){var n=l(t,e.filter(function(t){var e=r(t.route);return""!==e&&"*"!==e})),o=r(t);return n.length>0?n.map(function(e){return r(t.substr(0,e.match.index))}).reduce(function(t,e){return e.length0&&void 0!==arguments[0])||arguments[0];n&&(t(),e.hooks.after&&e.hooks.after())}):e.hooks.after&&(t(),e.hooks.after&&e.hooks.after())):void t()}function v(t,e){this._routes=[],this.root=e&&t?t.replace(/\/$/,"/#"):t||null,this._useHash=e,this._paused=!1,this._destroyed=!1,this._lastRouteResolved=null,this._notFoundHandler=null,this._defaultHandler=null,this._usePushState=!e&&d(),this._listen(),this.updatePageLinks()}Object.defineProperty(e,"__esModule",{value:!0});var y="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},g=/([:*])(\w+)/g,m=/\*/g,w="([^/]+)",R="(?:.*)",b="(?:/$|$)";v.prototype={helpers:{match:h,root:f,clean:r},navigate:function(t,e){var n;return t=t||"",this._usePushState?(n=(e?"":this._getRoot()+"/")+r(t),n=n.replace(/([^:])(\/{2,})/g,"$1/"),history[this._paused?"replaceState":"pushState"]({},"",n),this.resolve()):"undefined"!=typeof window&&(window.location.href=window.location.href.replace(/#(.*)$/,"")+"#"+t),this},on:function(){for(var t=this,e=arguments.length,n=Array(e),o=0;o=2)"/"===n[0]?this._defaultHandler={handler:n[1],hooks:n[2]}:this._add(n[0],n[1],n[2]);else if("object"===y(n[0])){var r=Object.keys(n[0]).sort(a);r.forEach(function(e){t._add(e,n[0][e])})}return 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(/^\/#/,"/"));var u=p(i,this._useHash),s=u.onlyURL,a=u.GETParameters;return!(this._paused||this._lastRouteResolved&&s===this._lastRouteResolved.url&&a===this._lastRouteResolved.query)&&((o=h(s,this._routes))?(this._lastRouteResolved={url:s,query:a},e=o.route.handler,_(function(){o.route.route instanceof RegExp?e.apply(void 0,n(o.match.slice(1,o.match.length))):e(o.params,a)},o.route),o):!this._defaultHandler||""!==s&&"/"!==s?(this._notFoundHandler&&_(function(){r._lastRouteResolved={url:s,query:a},r._notFoundHandler.handler(a)},this._notFoundHandler),!1):(_(function(){r._lastRouteResolved={url:s,query:a},r._defaultHandler.handler(a)},this._defaultHandler),!0))},destroy:function(){this._routes=[],this._destroyed=!0,clearTimeout(this._listenningInterval),"undefined"!=typeof window?window.onpopstate=null:null},updatePageLinks:function(){var t=this;"undefined"!=typeof document&&this._findLinks().forEach(function(e){e.hasListenerAttached||(e.addEventListener("click",function(n){var o=e.getAttribute("href");t._destroyed||(n.preventDefault(),t.navigate(r(o)))}),e.hasListenerAttached=!0)})},generate:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return 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},"")},link:function(t){return this._getRoot()+t},pause:function(t){this._paused=t},disableIfAPINotAvailable:function(){d()||this.destroy()},_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"object"===("undefined"==typeof e?"undefined":y(e))?this._routes.push({route:t,handler:e.uses,name:e.as,hooks:n}):this._routes.push({route:t,handler:e,hooks:n}),this._add},_getRoot:function(){return null!==this.root?this.root:(this.root=f(this._cLoc(),this._routes),this.root)},_listen:function(){var t=this;this._usePushState?window.onpopstate=function(){t.resolve()}:c()?window.onhashchange=function(){t.resolve()}:!function(){var e=t._cLoc(),n=void 0,o=void 0;(o=function(){n=t._cLoc(),e!==n&&(e=n,t.resolve()),t._listenningInterval=setTimeout(o,200)})()}()},_cLoc:function(){return"undefined"!=typeof window?window.location.href:""},_findLinks:function(){return[].slice.call(document.querySelectorAll("[data-navigo]"))}},e["default"]=v,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 e46324fe..caa08232 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 6166328632c0486a7b5b","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","_toArray","clean","s","RegExp","replace","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","getUrlDepth","url","split","compareUrlDepth","urlA","urlB","findMatchedRoutes","routes","arguments","undefined","map","_replaceDynamicURLPar","filter","matched","u","fallbackURL","substr","current","isPushStateAvailable","window","history","pushState","isHashChangeAPIAvailable","extractGETParameters","useHash","_url$split","_url$split2","onlyURL","query","GETParameters","join","manageHooks","handler","hooks","_typeof","before","after","Navigo","r","_routes","_useHash","_paused","_destroyed","_lastRouteResolved","_notFoundHandler","_defaultHandler","_usePushState","_listen","updatePageLinks","Object","defineProperty","Symbol","iterator","obj","constructor","prototype","helpers","navigate","path","absolute","to","_getRoot","resolve","location","href","on","_this","_len","args","_key","_add","orderedRoutes","keys","sort","forEach","notFound","_this2","_cLoc","_extractGETParameters","destroy","clearTimeout","_listenningInterval","onpopstate","self","document","_findLinks","link","hasListenerAttached","addEventListener","e","getAttribute","preventDefault","generate","data","result","key","pause","status","disableIfAPINotAvailable","uses","as","_this3","onhashchange","cached","check","setTimeout","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 _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); }\n\t\n\tvar PARAMETER_REGEXP = /([:*])(\\w+)/g;\n\tvar WILDCARD_REGEXP = /\\*/g;\n\tvar REPLACE_VARIABLE_REGEXP = '([^\\/]+)';\n\tvar REPLACE_WILDCARD = '(?:.*)';\n\tvar FOLLOWED_BY_SLASH_REGEXP = '(?:\\/$|$)';\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(PARAMETER_REGEXP, function (full, dots, name) {\n\t paramNames.push(name);\n\t return REPLACE_VARIABLE_REGEXP;\n\t }).replace(WILDCARD_REGEXP, REPLACE_WILDCARD) + FOLLOWED_BY_SLASH_REGEXP);\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(urlA) < getUrlDepth(urlB);\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 isPushStateAvailable() {\n\t return !!(typeof window !== 'undefined' && window.history && window.history.pushState);\n\t}\n\t\n\tfunction isHashChangeAPIAvailable() {\n\t return !!(typeof window !== 'undefined' && 'onhashchange' in window);\n\t}\n\t\n\tfunction extractGETParameters(url, useHash) {\n\t var _url$split = url.split(/\\?(.*)?$/),\n\t _url$split2 = _toArray(_url$split),\n\t onlyURL = _url$split2[0],\n\t query = _url$split2.slice(1);\n\t\n\t if (!useHash) {\n\t onlyURL = onlyURL.split('#')[0];\n\t }\n\t return { onlyURL: onlyURL, GETParameters: query.join('') };\n\t}\n\t\n\tfunction manageHooks(handler, route) {\n\t if (route && route.hooks && _typeof(route.hooks) === 'object') {\n\t if (route.hooks.before) {\n\t route.hooks.before(function () {\n\t handler();\n\t route.hooks.after && route.hooks.after();\n\t });\n\t } else if (route.hooks.after) {\n\t handler();\n\t route.hooks.after && route.hooks.after();\n\t }\n\t return;\n\t }\n\t handler();\n\t};\n\t\n\tfunction Navigo(r, useHash) {\n\t this._routes = [];\n\t this.root = useHash && r ? r.replace(/\\/$/, '/#') : r || null;\n\t this._useHash = useHash;\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._listen();\n\t this.updatePageLinks();\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() + '/' : '') + clean(path);\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 window.location.href = window.location.href.replace(/#(.*)$/, '') + '#' + 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 this._defaultHandler = { handler: args[1], 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._add(route, args[0][route]);\n\t });\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(/^\\/#/, '/');\n\t }\n\t\n\t var _extractGETParameters = extractGETParameters(url, this._useHash),\n\t onlyURL = _extractGETParameters.onlyURL,\n\t GETParameters = _extractGETParameters.GETParameters;\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);\n\t return m;\n\t } else if (this._defaultHandler && (onlyURL === '' || onlyURL === '/')) {\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 typeof window !== 'undefined' ? window.onpopstate = null : null;\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.getAttribute('href');\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 return 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 link: function link(path) {\n\t return this._getRoot() + path;\n\t },\n\t pause: function pause(status) {\n\t this._paused = status;\n\t },\n\t disableIfAPINotAvailable: function disableIfAPINotAvailable() {\n\t if (!isPushStateAvailable()) {\n\t this.destroy();\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 handler === 'undefined' ? 'undefined' : _typeof(handler)) === 'object') {\n\t this._routes.push({ route: route, handler: handler.uses, name: handler.as, hooks: hooks });\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.onpopstate = function () {\n\t _this3.resolve();\n\t };\n\t } else if (isHashChangeAPIAvailable()) {\n\t window.onhashchange = function () {\n\t _this3.resolve();\n\t };\n\t } else {\n\t (function () {\n\t var cached = _this3._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 },\n\t _cLoc: function _cLoc() {\n\t if (typeof window !== 'undefined') {\n\t return 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};\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 6166328632c0486a7b5b\n **/","const PARAMETER_REGEXP = /([:*])(\\w+)/g;\nconst WILDCARD_REGEXP = /\\*/g;\nconst REPLACE_VARIABLE_REGEXP = '([^\\/]+)';\nconst REPLACE_WILDCARD = '(?:.*)';\nconst FOLLOWED_BY_SLASH_REGEXP = '(?:\\/$|$)';\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(PARAMETER_REGEXP, function (full, dots, name) {\n paramNames.push(name);\n return REPLACE_VARIABLE_REGEXP;\n })\n .replace(WILDCARD_REGEXP, REPLACE_WILDCARD) + FOLLOWED_BY_SLASH_REGEXP\n );\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(urlA) < getUrlDepth(urlB);\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 isPushStateAvailable() {\n return !!(\n typeof window !== 'undefined' &&\n window.history &&\n window.history.pushState\n );\n}\n\nfunction isHashChangeAPIAvailable() {\n return !!(\n typeof window !== 'undefined' &&\n 'onhashchange' in window\n );\n}\n\nfunction extractGETParameters(url, useHash) {\n var [ onlyURL, ...query ] = url.split(/\\?(.*)?$/);\n\n if (!useHash) {\n onlyURL = onlyURL.split('#')[0];\n }\n return { onlyURL, GETParameters: query.join('') };\n}\n\nfunction manageHooks(handler, route) {\n if (route && route.hooks && typeof route.hooks === 'object') {\n if (route.hooks.before) {\n route.hooks.before(() => {\n handler();\n route.hooks.after && route.hooks.after();\n });\n } else if (route.hooks.after) {\n handler();\n route.hooks.after && route.hooks.after();\n }\n return;\n }\n handler();\n};\n\nfunction Navigo(r, useHash) {\n this._routes = [];\n this.root = useHash && r ? r.replace(/\\/$/, '/#') : (r || null);\n this._useHash = useHash;\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._listen();\n this.updatePageLinks();\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() + '/' : '') + clean(path);\n to = to.replace(/([^:])(\\/{2,})/g, '$1/');\n history[this._paused ? 'replaceState' : 'pushState']({}, '', to);\n this.resolve();\n } else if (typeof window !== 'undefined') {\n window.location.href = window.location.href.replace(/#(.*)$/, '') + '#' + 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 this._defaultHandler = { handler: args[1], 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._add(route, args[0][route]);\n });\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(/^\\/#/, '/');\n }\n let { onlyURL, GETParameters } = extractGETParameters(url, this._useHash);\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);\n return m;\n } else if (this._defaultHandler && (onlyURL === '' || onlyURL === '/')) {\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 typeof window !== 'undefined' ? window.onpopstate = null : null;\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.getAttribute('href');\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 return 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 link: function (path) {\n return this._getRoot() + path;\n },\n pause: function (status) {\n this._paused = status;\n },\n disableIfAPINotAvailable: function () {\n if (!isPushStateAvailable()) {\n this.destroy();\n }\n },\n _add: function (route, handler = null, hooks = null) {\n if (typeof handler === 'object') {\n this._routes.push({ route, handler: handler.uses, name: handler.as, hooks: hooks });\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.onpopstate = () => {\n this.resolve();\n };\n } else if (isHashChangeAPIAvailable()) {\n window.onhashchange = () => {\n this.resolve();\n };\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 return window.location.href;\n }\n return '';\n },\n _findLinks: function () {\n return [].slice.call(document.querySelectorAll('[data-navigo]'));\n }\n};\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 ca90813ab84471b97827","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","_toArray","clean","s","RegExp","replace","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","getUrlDepth","url","split","compareUrlDepth","urlA","urlB","findMatchedRoutes","routes","arguments","undefined","map","_replaceDynamicURLPar","filter","matched","u","fallbackURL","substr","current","isPushStateAvailable","window","history","pushState","isHashChangeAPIAvailable","extractGETParameters","useHash","_url$split","_url$split2","onlyURL","query","GETParameters","join","manageHooks","handler","hooks","_typeof","before","shouldRoute","after","Navigo","r","_routes","_useHash","_paused","_destroyed","_lastRouteResolved","_notFoundHandler","_defaultHandler","_usePushState","_listen","updatePageLinks","Object","defineProperty","Symbol","iterator","obj","constructor","prototype","helpers","navigate","path","absolute","to","_getRoot","resolve","location","href","on","_this","_len","args","_key","_add","orderedRoutes","keys","sort","forEach","notFound","_this2","_cLoc","_extractGETParameters","destroy","clearTimeout","_listenningInterval","onpopstate","self","document","_findLinks","link","hasListenerAttached","addEventListener","e","getAttribute","preventDefault","generate","data","result","key","pause","status","disableIfAPINotAvailable","uses","as","_this3","onhashchange","cached","check","setTimeout","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 _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); }\n\t\n\tvar PARAMETER_REGEXP = /([:*])(\\w+)/g;\n\tvar WILDCARD_REGEXP = /\\*/g;\n\tvar REPLACE_VARIABLE_REGEXP = '([^\\/]+)';\n\tvar REPLACE_WILDCARD = '(?:.*)';\n\tvar FOLLOWED_BY_SLASH_REGEXP = '(?:\\/$|$)';\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(PARAMETER_REGEXP, function (full, dots, name) {\n\t paramNames.push(name);\n\t return REPLACE_VARIABLE_REGEXP;\n\t }).replace(WILDCARD_REGEXP, REPLACE_WILDCARD) + FOLLOWED_BY_SLASH_REGEXP);\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(urlA) < getUrlDepth(urlB);\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 isPushStateAvailable() {\n\t return !!(typeof window !== 'undefined' && window.history && window.history.pushState);\n\t}\n\t\n\tfunction isHashChangeAPIAvailable() {\n\t return !!(typeof window !== 'undefined' && 'onhashchange' in window);\n\t}\n\t\n\tfunction extractGETParameters(url, useHash) {\n\t var _url$split = url.split(/\\?(.*)?$/),\n\t _url$split2 = _toArray(_url$split),\n\t onlyURL = _url$split2[0],\n\t query = _url$split2.slice(1);\n\t\n\t if (!useHash) {\n\t onlyURL = onlyURL.split('#')[0];\n\t }\n\t return { onlyURL: onlyURL, GETParameters: query.join('') };\n\t}\n\t\n\tfunction manageHooks(handler, route) {\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();\n\t });\n\t } else if (route.hooks.after) {\n\t handler();\n\t route.hooks.after && route.hooks.after();\n\t }\n\t return;\n\t }\n\t handler();\n\t};\n\t\n\tfunction Navigo(r, useHash) {\n\t this._routes = [];\n\t this.root = useHash && r ? r.replace(/\\/$/, '/#') : r || null;\n\t this._useHash = useHash;\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._listen();\n\t this.updatePageLinks();\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() + '/' : '') + clean(path);\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 window.location.href = window.location.href.replace(/#(.*)$/, '') + '#' + 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 this._defaultHandler = { handler: args[1], 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._add(route, args[0][route]);\n\t });\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(/^\\/#/, '/');\n\t }\n\t\n\t var _extractGETParameters = extractGETParameters(url, this._useHash),\n\t onlyURL = _extractGETParameters.onlyURL,\n\t GETParameters = _extractGETParameters.GETParameters;\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);\n\t return m;\n\t } else if (this._defaultHandler && (onlyURL === '' || onlyURL === '/')) {\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 typeof window !== 'undefined' ? window.onpopstate = null : null;\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.getAttribute('href');\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 return 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 link: function link(path) {\n\t return this._getRoot() + path;\n\t },\n\t pause: function pause(status) {\n\t this._paused = status;\n\t },\n\t disableIfAPINotAvailable: function disableIfAPINotAvailable() {\n\t if (!isPushStateAvailable()) {\n\t this.destroy();\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 handler === 'undefined' ? 'undefined' : _typeof(handler)) === 'object') {\n\t this._routes.push({ route: route, handler: handler.uses, name: handler.as, hooks: hooks });\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.onpopstate = function () {\n\t _this3.resolve();\n\t };\n\t } else if (isHashChangeAPIAvailable()) {\n\t window.onhashchange = function () {\n\t _this3.resolve();\n\t };\n\t } else {\n\t (function () {\n\t var cached = _this3._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 },\n\t _cLoc: function _cLoc() {\n\t if (typeof window !== 'undefined') {\n\t return 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};\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 ca90813ab84471b97827\n **/","const PARAMETER_REGEXP = /([:*])(\\w+)/g;\nconst WILDCARD_REGEXP = /\\*/g;\nconst REPLACE_VARIABLE_REGEXP = '([^\\/]+)';\nconst REPLACE_WILDCARD = '(?:.*)';\nconst FOLLOWED_BY_SLASH_REGEXP = '(?:\\/$|$)';\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(PARAMETER_REGEXP, function (full, dots, name) {\n paramNames.push(name);\n return REPLACE_VARIABLE_REGEXP;\n })\n .replace(WILDCARD_REGEXP, REPLACE_WILDCARD) + FOLLOWED_BY_SLASH_REGEXP\n );\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(urlA) < getUrlDepth(urlB);\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 isPushStateAvailable() {\n return !!(\n typeof window !== 'undefined' &&\n window.history &&\n window.history.pushState\n );\n}\n\nfunction isHashChangeAPIAvailable() {\n return !!(\n typeof window !== 'undefined' &&\n 'onhashchange' in window\n );\n}\n\nfunction extractGETParameters(url, useHash) {\n var [ onlyURL, ...query ] = url.split(/\\?(.*)?$/);\n\n if (!useHash) {\n onlyURL = onlyURL.split('#')[0];\n }\n return { onlyURL, GETParameters: query.join('') };\n}\n\nfunction manageHooks(handler, route) {\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();\n });\n } else if (route.hooks.after) {\n handler();\n route.hooks.after && route.hooks.after();\n }\n return;\n }\n handler();\n};\n\nfunction Navigo(r, useHash) {\n this._routes = [];\n this.root = useHash && r ? r.replace(/\\/$/, '/#') : (r || null);\n this._useHash = useHash;\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._listen();\n this.updatePageLinks();\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() + '/' : '') + clean(path);\n to = to.replace(/([^:])(\\/{2,})/g, '$1/');\n history[this._paused ? 'replaceState' : 'pushState']({}, '', to);\n this.resolve();\n } else if (typeof window !== 'undefined') {\n window.location.href = window.location.href.replace(/#(.*)$/, '') + '#' + 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 this._defaultHandler = { handler: args[1], 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._add(route, args[0][route]);\n });\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(/^\\/#/, '/');\n }\n let { onlyURL, GETParameters } = extractGETParameters(url, this._useHash);\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);\n return m;\n } else if (this._defaultHandler && (onlyURL === '' || onlyURL === '/')) {\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 typeof window !== 'undefined' ? window.onpopstate = null : null;\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.getAttribute('href');\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 return 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 link: function (path) {\n return this._getRoot() + path;\n },\n pause: function (status) {\n this._paused = status;\n },\n disableIfAPINotAvailable: function () {\n if (!isPushStateAvailable()) {\n this.destroy();\n }\n },\n _add: function (route, handler = null, hooks = null) {\n if (typeof handler === 'object') {\n this._routes.push({ route, handler: handler.uses, name: handler.as, hooks: hooks });\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.onpopstate = () => {\n this.resolve();\n };\n } else if (isHashChangeAPIAvailable()) {\n window.onhashchange = () => {\n this.resolve();\n };\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 return window.location.href;\n }\n return '';\n },\n _findLinks: function () {\n return [].slice.call(document.querySelectorAll('[data-navigo]'));\n }\n};\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 a8844c36..b9aff305 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "navigo", - "version": "3.3.3", + "version": "3.4.0", "description": "A simple vanilla JavaScript router with a fallback for older browsers", "main": "lib/navigo.js", "jsnext:main": "src/index.js",