UNPKG

4.22 kBJavaScriptView Raw
1"use strict";var _interopRequireWildcard=require("@babel/runtime/helpers/interopRequireWildcard");var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");exports.__esModule=true;exports.useRouter=useRouter;exports.makePublicRouterInstance=makePublicRouterInstance;exports.createRouter=exports.withRouter=exports.default=void 0;var _react=_interopRequireDefault(require("react"));var _router2=_interopRequireWildcard(require("../next-server/lib/router/router"));exports.Router=_router2.default;exports.NextRouter=_router2.NextRouter;var _routerContext=require("../next-server/lib/router-context");var _withRouter=_interopRequireDefault(require("./with-router"));exports.withRouter=_withRouter.default;/* global window */const singletonRouter={router:null,// holds the actual router instance
2readyCallbacks:[],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
3const urlPropertyFields=['pathname','route','query','asPath','components','isFallback','basePath','locale','locales','defaultLocale','isReady','isPreview','isLocaleDomain','domainLocales'];const routerEvents=['routeChangeStart','beforeHistoryChange','routeChangeComplete','routeChangeError','hashChangeStart','hashChangeComplete'];const 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
4Object.defineProperty(singletonRouter,'events',{get(){return _router2.default.events;}});urlPropertyFields.forEach(field=>{// Here we need to use Object.defineProperty because we need to return
5// the property assigned to the actual router
6// The value might get changed as we change routes and this is the
7// proper way to access it
8Object.defineProperty(singletonRouter,field,{get(){const router=getRouter();return router[field];}});});coreMethodFields.forEach(field=>{// We don't really know the types here, so we add them later instead
9;singletonRouter[field]=(...args)=>{const router=getRouter();return router[field](...args);};});routerEvents.forEach(event=>{singletonRouter.ready(()=>{_router2.default.events.on(event,(...args)=>{const eventField=`on${event.charAt(0).toUpperCase()}${event.substring(1)}`;const _singletonRouter=singletonRouter;if(_singletonRouter[eventField]){try{_singletonRouter[eventField](...args);}catch(err){console.error(`Error when running the Router event: ${eventField}`);console.error(`${err.message}\n${err.stack}`);}}});});});function getRouter(){if(!singletonRouter.router){const message='No router instance found.\n'+'You should only use "next/router" on the client side of your app.\n';throw new Error(message);}return singletonRouter.router;}// Export the singletonRouter and this is the public API.
10var _default=singletonRouter;// Reexport the withRoute HOC
11exports.default=_default;function useRouter(){return _react.default.useContext(_routerContext.RouterContext);}// INTERNAL APIS
12// -------------
13// (do not use following exports inside the app)
14// Create a router and assign it as the singleton instance.
15// This is used in client side when we are initilizing the app.
16// This should **not** be used inside the server.
17const createRouter=(...args)=>{singletonRouter.router=new _router2.default(...args);singletonRouter.readyCallbacks.forEach(cb=>cb());singletonRouter.readyCallbacks=[];return singletonRouter.router;};// This function is used to create the `withRouter` router instance
18exports.createRouter=createRouter;function makePublicRouterInstance(router){const _router=router;const instance={};for(const property of urlPropertyFields){if(typeof _router[property]==='object'){instance[property]=Object.assign(Array.isArray(_router[property])?[]:{},_router[property]);// makes sure query is not stateful
19continue;}instance[property]=_router[property];}// Events is a static property on the router, the router doesn't have to be initialized to use it
20instance.events=_router2.default.events;coreMethodFields.forEach(field=>{instance[field]=(...args)=>{return _router[field](...args);};});return instance;}
21//# sourceMappingURL=router.js.map
\No newline at end of file