next
Version:
The React Framework
155 lines (153 loc) • 5.07 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 _interop_require_default = require("@swc/helpers/lib/_interop_require_default.js").default;
var _react = _interop_require_default(require("react"));
var _router = _interop_require_default(require("../shared/lib/router/router"));
var _routerContext = require("../shared/lib/router-context");
var _isError = _interop_require_default(require("../lib/is-error"));
var _withRouter = _interop_require_default(require("./with-router"));
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;
}
if ((typeof exports.default === 'function' || (typeof exports.default === 'object' && exports.default !== null)) && typeof exports.default.__esModule === 'undefined') {
Object.defineProperty(exports.default, '__esModule', { value: true });
Object.assign(exports.default, exports);
module.exports = exports.default;
}
//# sourceMappingURL=router.js.map
;