{"version":3,"file":"navigo.min.js","sources":["../src/index.js"],"sourcesContent":["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 this._genericHooks = null;\n this._historyAPIUpdateMethod = 'pushState';\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]] = decodeURIComponent(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 route.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(clean(route.route));\n var match = url.replace(/^\\/+/, '/').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 = routes.map(\n route => route.route === '' || route.route === '*' ? url : url.split(new RegExp(route.route + '($|\\/)'))[0]\n );\n var fallbackURL = clean(url);\n\n if (matched.length > 1) {\n return matched.reduce((result, url) => {\n if (result.length > url.length) result = url;\n return result;\n }, matched[0]);\n } else if (matched.length === 1) {\n return matched[0];\n }\n return fallbackURL;\n}\n\nfunction isHashChangeAPIAvailable() {\n return typeof window !== 'undefined' && 'onhashchange' in window;\n}\n\nfunction extractGETParameters(url) {\n return url.split(/\\?(.*)?$/).slice(1).join('');\n}\n\nfunction getOnlyURL(url, useHash, hash) {\n var onlyURL = url, split;\n var cleanGETParam = str => str.split(/\\?(.*)?$/)[0];\n\n if (typeof hash === 'undefined') {\n // To preserve BC\n hash = '#';\n }\n\n if (isPushStateAvailable() && !useHash) {\n onlyURL = cleanGETParam(url).split(hash)[0];\n } else {\n split = url.split(hash);\n onlyURL = split.length > 1 ? cleanGETParam(split[1]) : cleanGETParam(split[0]);\n }\n\n return onlyURL;\n}\n\nfunction manageHooks(handler, hooks, params) {\n if (hooks && typeof hooks === 'object') {\n if (hooks.before) {\n hooks.before((shouldRoute = true) => {\n if (!shouldRoute) return;\n handler();\n hooks.after && hooks.after(params);\n }, params);\n return;\n } else if (hooks.after) {\n handler();\n hooks.after && hooks.after(params);\n return;\n }\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 return split.length < 2 || split[1] === '';\n}\n\nNavigo.prototype = {\n helpers: {\n match,\n root,\n clean,\n getOnlyURL\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._historyAPIUpdateMethod]({}, '', 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 (this._paused) return false;\n\n if (\n this._lastRouteResolved &&\n onlyURL === this._lastRouteResolved.url &&\n GETParameters === this._lastRouteResolved.query\n ) {\n if (this._lastRouteResolved.hooks && this._lastRouteResolved.hooks.already) {\n this._lastRouteResolved.hooks.already(this._lastRouteResolved.params);\n }\n return false;\n }\n\n m = match(onlyURL, this._routes);\n\n if (m) {\n this._callLeave();\n this._lastRouteResolved = {\n url: onlyURL,\n query: GETParameters,\n hooks: m.route.hooks,\n params: m.params,\n name: m.route.name\n };\n handler = m.route.handler;\n manageHooks(() => {\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.hooks, m.params, this._genericHooks);\n }, this._genericHooks, 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 manageHooks(() => {\n this._callLeave();\n this._lastRouteResolved = { url: onlyURL, query: GETParameters, hooks: this._defaultHandler.hooks };\n this._defaultHandler.handler(GETParameters);\n }, this._defaultHandler.hooks);\n }, this._genericHooks);\n return true;\n } else if (this._notFoundHandler) {\n manageHooks(() => {\n manageHooks(() => {\n this._callLeave();\n this._lastRouteResolved = { url: onlyURL, query: GETParameters, hooks: this._notFoundHandler.hooks };\n this._notFoundHandler.handler(GETParameters);\n }, this._notFoundHandler.hooks);\n }, this._genericHooks);\n }\n return false;\n },\n destroy: function () {\n this._routes = [];\n this._destroyed = true;\n this._lastRouteResolved = null;\n this._genericHooks = null;\n clearTimeout(this._listeningInterval);\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 if((e.ctrlKey || e.metaKey) && e.target.tagName.toLowerCase() == 'a'){ return false; }\n var location = self.getLinkPath(link);\n\n if (!self._destroyed) {\n e.preventDefault();\n self.navigate(location.replace(/\\/+$/, '').replace(/^\\/+/, '/'));\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.toString().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 if (status) {\n this._historyAPIUpdateMethod = 'replaceState';\n } else {\n this._historyAPIUpdateMethod = 'pushState';\n }\n },\n resume: function () {\n this.pause(false);\n },\n historyAPIUpdateMethod: function (value) {\n if (typeof value === 'undefined') return this._historyAPIUpdateMethod;\n this._historyAPIUpdateMethod = value;\n return value;\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.getAttribute('href');\n },\n hooks(hooks) {\n this._genericHooks = hooks;\n },\n _add: function (route, handler = null, hooks = null) {\n if (typeof route === 'string') {\n route = encodeURI(route);\n }\n this._routes.push(\n typeof handler === 'object' ? {\n route,\n handler: handler.uses,\n name: handler.as,\n hooks: hooks || handler.hooks\n } : { route, handler, hooks: hooks }\n );\n\n return this._add;\n },\n _getRoot: function () {\n if (this.root !== null) return this.root;\n this.root = root(this._cLoc().split('?')[0], 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._listeningInterval = 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 _callLeave() {\n const lastRouteResolved = this._lastRouteResolved;\n\n if (lastRouteResolved && lastRouteResolved.hooks && lastRouteResolved.hooks.leave) {\n lastRouteResolved.hooks.leave(lastRouteResolved.params);\n }\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"],"names":["isPushStateAvailable","window","history","pushState","Navigo","r","useHash","hash","root","_routes","_useHash","_hash","_paused","_destroyed","_lastRouteResolved","_notFoundHandler","_defaultHandler","_usePushState","_onLocationChange","this","bind","_genericHooks","_historyAPIUpdateMethod","replace","_cLoc","split","_listen","updatePageLinks","clean","s","RegExp","getUrlDepth","url","length","compareUrlDepth","urlA","urlB","match","routes","map","route","paramNames","regexp","PARAMETER_REGEXP","full","dots","name","push","REPLACE_VARIABLE_REGEXP","WILDCARD_REGEXP","REPLACE_WILDCARD","FOLLOWED_BY_SLASH_REGEXP","MATCH_REGEXP_FLAGS","replaceDynamicURLParts","params","names","slice","reduce","value","index","decodeURIComponent","regExpResultToParams","filter","m","findMatchedRoutes","matched","fallbackURL","result","getOnlyURL","cleanGETParam","str","manageHooks","handler","hooks","before","after","prototype","path","absolute","to","_getRoot","resolve","location","href","args","func","_typeof","uses","_add","Object","keys","sort","forEach","on","current","GETParameters","join","extractGETParameters","onlyURL","query","already","_callLeave","_this2","isHashedRoot","_listeningInterval","removeEventListener","self","document","_findLinks","link","hasListenerAttached","addEventListener","e","ctrlKey","metaKey","target","tagName","toLowerCase","getLinkPath","preventDefault","navigate","data","key","toString","status","pause","destroy","getAttribute","encodeURI","as","cached","check","_this3","setTimeout","__NAVIGO_WINDOW_LOCATION_MOCK__","call","querySelectorAll","lastRouteResolved","leave"],"mappings":"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"}