next
Version:
The React Framework
156 lines (155 loc) • 4.78 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "Router", {
enumerable: true,
get: function() {
return _router.default;
}
});
Object.defineProperty(exports, "withRouter", {
enumerable: true,
get: function() {
return _withRouter.default;
}
});
exports.useRouter = useRouter;
exports.createRouter = createRouter;
exports.makePublicRouterInstance = makePublicRouterInstance;
exports.default = void 0;
var _react = _interopRequireDefault(require("react"));
var _router = _interopRequireDefault(require("../shared/lib/router/router"));
var _routerContext = require("../shared/lib/router-context");
var _isError = _interopRequireDefault(require("../lib/is-error"));
var _withRouter = _interopRequireDefault(require("./with-router"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const singletonRouter = {
router: null,
readyCallbacks: [],
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
const 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
Object.defineProperty(singletonRouter, 'events', {
get () {
return _router.default.events;
}
});
urlPropertyFields.forEach((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
Object.defineProperty(singletonRouter, field, {
get () {
const router = getRouter();
return router[field];
}
});
});
coreMethodFields.forEach((field)=>{
singletonRouter[field] = (...args)=>{
const router = getRouter();
return router[field](...args);
};
});
routerEvents.forEach((event)=>{
singletonRouter.ready(()=>{
_router.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((0, _isError).default(err) ? `${err.message}\n${err.stack}` : err + '');
}
}
});
});
});
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;
}
var _default = singletonRouter;
exports.default = _default;
function useRouter() {
return _react.default.useContext(_routerContext.RouterContext);
}
function createRouter(...args) {
singletonRouter.router = new _router.default(...args);
singletonRouter.readyCallbacks.forEach((cb)=>cb()
);
singletonRouter.readyCallbacks = [];
return singletonRouter.router;
}
function makePublicRouterInstance(router) {
const scopedRouter = router;
const instance = {
};
for (const property of urlPropertyFields){
if (typeof scopedRouter[property] === 'object') {
instance[property] = Object.assign(Array.isArray(scopedRouter[property]) ? [] : {
}, scopedRouter[property]) // makes sure query is not stateful
;
continue;
}
instance[property] = scopedRouter[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;
coreMethodFields.forEach((field)=>{
instance[field] = (...args)=>{
return scopedRouter[field](...args);
};
});
return instance;
}
//# sourceMappingURL=router.js.map
;