UNPKG

aurelia-bootstrap

Version:
327 lines (244 loc) 9.94 kB
/* */ define(['exports', 'aurelia-pal', 'aurelia-history'], function (exports, _aureliaPal, _aureliaHistory) { 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.BrowserHistory = exports.DefaultLinkHandler = exports.LinkHandler = undefined; exports.configure = configure; var _class, _temp; function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var LinkHandler = exports.LinkHandler = function () { function LinkHandler() { } LinkHandler.prototype.activate = function activate(history) {}; LinkHandler.prototype.deactivate = function deactivate() {}; return LinkHandler; }(); var DefaultLinkHandler = exports.DefaultLinkHandler = function (_LinkHandler) { _inherits(DefaultLinkHandler, _LinkHandler); function DefaultLinkHandler() { var _this = _possibleConstructorReturn(this, _LinkHandler.call(this)); _this.handler = function (e) { var _DefaultLinkHandler$g = DefaultLinkHandler.getEventInfo(e); var shouldHandleEvent = _DefaultLinkHandler$g.shouldHandleEvent; var href = _DefaultLinkHandler$g.href; if (shouldHandleEvent) { e.preventDefault(); _this.history.navigate(href); } }; return _this; } DefaultLinkHandler.prototype.activate = function activate(history) { if (history._hasPushState) { this.history = history; _aureliaPal.DOM.addEventListener('click', this.handler, true); } }; DefaultLinkHandler.prototype.deactivate = function deactivate() { _aureliaPal.DOM.removeEventListener('click', this.handler); }; DefaultLinkHandler.getEventInfo = function getEventInfo(event) { var info = { shouldHandleEvent: false, href: null, anchor: null }; var target = DefaultLinkHandler.findClosestAnchor(event.target); if (!target || !DefaultLinkHandler.targetIsThisWindow(target)) { return info; } if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) { return info; } var href = target.getAttribute('href'); info.anchor = target; info.href = href; var leftButtonClicked = event.which === 1; var isRelative = href && !(href.charAt(0) === '#' || /^[a-z]+:/i.test(href)); info.shouldHandleEvent = leftButtonClicked && isRelative; return info; }; DefaultLinkHandler.findClosestAnchor = function findClosestAnchor(el) { while (el) { if (el.tagName === 'A') { return el; } el = el.parentNode; } }; DefaultLinkHandler.targetIsThisWindow = function targetIsThisWindow(target) { var targetWindow = target.getAttribute('target'); var win = _aureliaPal.PLATFORM.global; return !targetWindow || targetWindow === win.name || targetWindow === '_self' || targetWindow === 'top' && win === win.top; }; return DefaultLinkHandler; }(LinkHandler); function configure(config) { config.singleton(_aureliaHistory.History, BrowserHistory); config.transient(LinkHandler, DefaultLinkHandler); } var BrowserHistory = exports.BrowserHistory = (_temp = _class = function (_History) { _inherits(BrowserHistory, _History); function BrowserHistory(linkHandler) { var _this2 = _possibleConstructorReturn(this, _History.call(this)); _this2._isActive = false; _this2._checkUrlCallback = _this2._checkUrl.bind(_this2); _this2.location = _aureliaPal.PLATFORM.location; _this2.history = _aureliaPal.PLATFORM.history; _this2.linkHandler = linkHandler; return _this2; } BrowserHistory.prototype.activate = function activate(options) { if (this._isActive) { throw new Error('History has already been activated.'); } var wantsPushState = !!options.pushState; this._isActive = true; this.options = Object.assign({}, { root: '/' }, this.options, options); this.root = ('/' + this.options.root + '/').replace(rootStripper, '/'); this._wantsHashChange = this.options.hashChange !== false; this._hasPushState = !!(this.options.pushState && this.history && this.history.pushState); var eventName = void 0; if (this._hasPushState) { eventName = 'popstate'; } else if (this._wantsHashChange) { eventName = 'hashchange'; } _aureliaPal.PLATFORM.addEventListener(eventName, this._checkUrlCallback); if (this._wantsHashChange && wantsPushState) { var loc = this.location; var atRoot = loc.pathname.replace(/[^\/]$/, '$&/') === this.root; if (!this._hasPushState && !atRoot) { this.fragment = this._getFragment(null, true); this.location.replace(this.root + this.location.search + '#' + this.fragment); return true; } else if (this._hasPushState && atRoot && loc.hash) { this.fragment = this._getHash().replace(routeStripper, ''); this.history.replaceState({}, _aureliaPal.DOM.title, this.root + this.fragment + loc.search); } } if (!this.fragment) { this.fragment = this._getFragment(); } this.linkHandler.activate(this); if (!this.options.silent) { return this._loadUrl(); } }; BrowserHistory.prototype.deactivate = function deactivate() { _aureliaPal.PLATFORM.removeEventListener('popstate', this._checkUrlCallback); _aureliaPal.PLATFORM.removeEventListener('hashchange', this._checkUrlCallback); this._isActive = false; this.linkHandler.deactivate(); }; BrowserHistory.prototype.getAbsoluteRoot = function getAbsoluteRoot() { var origin = createOrigin(this.location.protocol, this.location.hostname, this.location.port); return '' + origin + this.root; }; BrowserHistory.prototype.navigate = function navigate(fragment) { var _ref = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var _ref$trigger = _ref.trigger; var trigger = _ref$trigger === undefined ? true : _ref$trigger; var _ref$replace = _ref.replace; var replace = _ref$replace === undefined ? false : _ref$replace; if (fragment && absoluteUrl.test(fragment)) { this.location.href = fragment; return true; } if (!this._isActive) { return false; } fragment = this._getFragment(fragment || ''); if (this.fragment === fragment && !replace) { return false; } this.fragment = fragment; var url = this.root + fragment; if (fragment === '' && url !== '/') { url = url.slice(0, -1); } if (this._hasPushState) { url = url.replace('//', '/'); this.history[replace ? 'replaceState' : 'pushState']({}, _aureliaPal.DOM.title, url); } else if (this._wantsHashChange) { updateHash(this.location, fragment, replace); } else { return this.location.assign(url); } if (trigger) { return this._loadUrl(fragment); } }; BrowserHistory.prototype.navigateBack = function navigateBack() { this.history.back(); }; BrowserHistory.prototype.setTitle = function setTitle(title) { _aureliaPal.DOM.title = title; }; BrowserHistory.prototype._getHash = function _getHash() { return this.location.hash.substr(1); }; BrowserHistory.prototype._getFragment = function _getFragment(fragment, forcePushState) { var root = void 0; if (!fragment) { if (this._hasPushState || !this._wantsHashChange || forcePushState) { fragment = this.location.pathname + this.location.search; root = this.root.replace(trailingSlash, ''); if (!fragment.indexOf(root)) { fragment = fragment.substr(root.length); } } else { fragment = this._getHash(); } } return '/' + fragment.replace(routeStripper, ''); }; BrowserHistory.prototype._checkUrl = function _checkUrl() { var current = this._getFragment(); if (current !== this.fragment) { this._loadUrl(); } }; BrowserHistory.prototype._loadUrl = function _loadUrl(fragmentOverride) { var fragment = this.fragment = this._getFragment(fragmentOverride); return this.options.routeHandler ? this.options.routeHandler(fragment) : false; }; return BrowserHistory; }(_aureliaHistory.History), _class.inject = [LinkHandler], _temp); var routeStripper = /^#?\/*|\s+$/g; var rootStripper = /^\/+|\/+$/g; var trailingSlash = /\/$/; var absoluteUrl = /^([a-z][a-z0-9+\-.]*:)?\/\//i; function updateHash(location, fragment, replace) { if (replace) { var _href = location.href.replace(/(javascript:|#).*$/, ''); location.replace(_href + '#' + fragment); } else { location.hash = '#' + fragment; } } function createOrigin(protocol, hostname, port) { return protocol + '//' + hostname + (port ? ':' + port : ''); } });