UNPKG

@tdb/web

Version:

Common condiguration for serving a web-site and testing web-based UI components.

208 lines (168 loc) 6.88 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports._rewriteUrlForNextExport = _rewriteUrlForNextExport; exports.makePublicRouterInstance = makePublicRouterInstance; Object.defineProperty(exports, "withRouter", { enumerable: true, get: function get() { return _withRouter.default; } }); exports.Router = exports.createRouter = exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/objectSpread")); var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/typeof")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray")); var _construct2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/construct")); var _defineProperty = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/define-property")); var _router = _interopRequireDefault(require("./router")); var _utils = require("../utils"); var _withRouter = _interopRequireDefault(require("./with-router")); /* global window */ var SingletonRouter = { router: null, // holds the actual router instance readyCallbacks: [], ready: function ready(cb) { if (this.router) return cb(); if (typeof window !== 'undefined') { this.readyCallbacks.push(cb); } } }; // Create public properties and methods of the router in the SingletonRouter var urlPropertyFields = ['pathname', 'route', 'query', 'asPath']; var propertyFields = ['components']; var routerEvents = ['routeChangeStart', 'beforeHistoryChange', 'routeChangeComplete', 'routeChangeError', 'hashChangeStart', 'hashChangeComplete']; var coreMethodFields = ['push', 'replace', 'reload', 'back', 'prefetch', 'beforePopState']; // Events is a static property on the router, the router doesn't have to be initialized to use it Object.defineProperty(SingletonRouter, 'events', { get: function get() { return _router.default.events; } }); propertyFields.concat(urlPropertyFields).forEach(function (field) { // Here we need to use Object.defineProperty because, we need to return // the property assigned to the actual router // The value might get changed as we change routes and this is the // proper way to access it (0, _defineProperty.default)(SingletonRouter, field, { get: function get() { throwIfNoRouter(); return SingletonRouter.router[field]; } }); }); coreMethodFields.forEach(function (field) { SingletonRouter[field] = function () { var _SingletonRouter$rout; throwIfNoRouter(); return (_SingletonRouter$rout = SingletonRouter.router)[field].apply(_SingletonRouter$rout, arguments); }; }); routerEvents.forEach(function (event) { SingletonRouter.ready(function () { _router.default.events.on(event, function () { var eventField = "on".concat(event.charAt(0).toUpperCase()).concat(event.substring(1)); if (SingletonRouter[eventField]) { try { SingletonRouter[eventField].apply(SingletonRouter, arguments); } catch (err) { console.error("Error when running the Router event: ".concat(eventField)); console.error("".concat(err.message, "\n").concat(err.stack)); } } }); }); }); var warnAboutRouterOnAppUpdated = (0, _utils.execOnce)(function () { console.warn("Router.onAppUpdated is removed - visit https://err.sh/zeit/next.js/no-on-app-updated-hook for more information."); }); Object.defineProperty(SingletonRouter, 'onAppUpdated', { get: function get() { return null; }, set: function set() { warnAboutRouterOnAppUpdated(); return null; } }); function throwIfNoRouter() { if (!SingletonRouter.router) { var message = 'No router instance found.\n' + 'You should only use "next/router" inside the client side of your app.\n'; throw new Error(message); } } // Export the SingletonRouter and this is the public API. var _default = SingletonRouter; // Reexport the withRoute HOC exports.default = _default; // INTERNAL APIS // ------------- // (do not use following exports inside the app) // Create a router and assign it as the singleton instance. // This is used in client side when we are initilizing the app. // This should **not** use inside the server. var createRouter = function createRouter() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } SingletonRouter.router = (0, _construct2.default)(_router.default, args); SingletonRouter.readyCallbacks.forEach(function (cb) { return cb(); }); SingletonRouter.readyCallbacks = []; return SingletonRouter.router; }; // Export the actual Router class, which is usually used inside the server exports.createRouter = createRouter; var Router = _router.default; exports.Router = Router; function _rewriteUrlForNextExport(url) { var _url$split = url.split('#'), _url$split2 = (0, _slicedToArray2.default)(_url$split, 2), hash = _url$split2[1]; url = url.replace(/#.*/, ''); var _url$split3 = url.split('?'), _url$split4 = (0, _slicedToArray2.default)(_url$split3, 2), path = _url$split4[0], qs = _url$split4[1]; path = path.replace(/\/$/, ''); var newPath = path; // Append a trailing slash if this path does not have an extension if (!/\.[^/]+\/?$/.test(path)) { newPath = "".concat(path, "/"); } if (qs) { newPath = "".concat(newPath, "?").concat(qs); } if (hash) { newPath = "".concat(newPath, "#").concat(hash); } return newPath; } // This function is used to create the `withRouter` router instance function makePublicRouterInstance(router) { var instance = {}; for (var _i = 0; _i < urlPropertyFields.length; _i++) { var property = urlPropertyFields[_i]; if ((0, _typeof2.default)(router[property]) === 'object') { instance[property] = (0, _objectSpread2.default)({}, router[property]); // makes sure query is not stateful continue; } instance[property] = router[property]; } // Events is a static property on the router, the router doesn't have to be initialized to use it instance.events = _router.default.events; propertyFields.forEach(function (field) { // Here we need to use Object.defineProperty because, we need to return // the property assigned to the actual router // The value might get changed as we change routes and this is the // proper way to access it (0, _defineProperty.default)(instance, field, { get: function get() { return router[field]; } }); }); coreMethodFields.forEach(function (field) { instance[field] = function () { return router[field].apply(router, arguments); }; }); return instance; }