159 lines
5.1 KiB
JavaScript
159 lines
5.1 KiB
JavaScript
"use strict";
|
|
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;
|
|
}
|
|
});
|
|
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;
|
|
}
|
|
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 + '');
|
|
}
|
|
}
|
|
});
|
|
});
|
|
});
|
|
var _default = singletonRouter;
|
|
exports.default = _default;
|
|
function useRouter() {
|
|
const router = _react.default.useContext(_routerContext.RouterContext);
|
|
if (!router) {
|
|
throw new Error('Error: NextRouter was not mounted. https://nextjs.org/docs/messages/next-router-not-mounted');
|
|
}
|
|
return router;
|
|
}
|
|
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
|