router.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. Object.defineProperty(exports, "Router", {
  6. enumerable: true,
  7. get: function() {
  8. return _router.default;
  9. }
  10. });
  11. Object.defineProperty(exports, "withRouter", {
  12. enumerable: true,
  13. get: function() {
  14. return _withRouter.default;
  15. }
  16. });
  17. exports.useRouter = useRouter;
  18. exports.createRouter = createRouter;
  19. exports.makePublicRouterInstance = makePublicRouterInstance;
  20. exports.default = void 0;
  21. var _interop_require_default = require("@swc/helpers/lib/_interop_require_default.js").default;
  22. var _react = _interop_require_default(require("react"));
  23. var _router = _interop_require_default(require("../shared/lib/router/router"));
  24. var _routerContext = require("../shared/lib/router-context");
  25. var _isError = _interop_require_default(require("../lib/is-error"));
  26. var _withRouter = _interop_require_default(require("./with-router"));
  27. const singletonRouter = {
  28. router: null,
  29. readyCallbacks: [],
  30. ready (cb) {
  31. if (this.router) return cb();
  32. if (typeof window !== 'undefined') {
  33. this.readyCallbacks.push(cb);
  34. }
  35. }
  36. };
  37. // Create public properties and methods of the router in the singletonRouter
  38. const urlPropertyFields = [
  39. 'pathname',
  40. 'route',
  41. 'query',
  42. 'asPath',
  43. 'components',
  44. 'isFallback',
  45. 'basePath',
  46. 'locale',
  47. 'locales',
  48. 'defaultLocale',
  49. 'isReady',
  50. 'isPreview',
  51. 'isLocaleDomain',
  52. 'domainLocales',
  53. ];
  54. const routerEvents = [
  55. 'routeChangeStart',
  56. 'beforeHistoryChange',
  57. 'routeChangeComplete',
  58. 'routeChangeError',
  59. 'hashChangeStart',
  60. 'hashChangeComplete',
  61. ];
  62. const coreMethodFields = [
  63. 'push',
  64. 'replace',
  65. 'reload',
  66. 'back',
  67. 'prefetch',
  68. 'beforePopState',
  69. ];
  70. // Events is a static property on the router, the router doesn't have to be initialized to use it
  71. Object.defineProperty(singletonRouter, 'events', {
  72. get () {
  73. return _router.default.events;
  74. }
  75. });
  76. function getRouter() {
  77. if (!singletonRouter.router) {
  78. const message = 'No router instance found.\n' + 'You should only use "next/router" on the client side of your app.\n';
  79. throw new Error(message);
  80. }
  81. return singletonRouter.router;
  82. }
  83. urlPropertyFields.forEach((field)=>{
  84. // Here we need to use Object.defineProperty because we need to return
  85. // the property assigned to the actual router
  86. // The value might get changed as we change routes and this is the
  87. // proper way to access it
  88. Object.defineProperty(singletonRouter, field, {
  89. get () {
  90. const router = getRouter();
  91. return router[field];
  92. }
  93. });
  94. });
  95. coreMethodFields.forEach((field)=>{
  96. singletonRouter[field] = (...args)=>{
  97. const router = getRouter();
  98. return router[field](...args);
  99. };
  100. });
  101. routerEvents.forEach((event)=>{
  102. singletonRouter.ready(()=>{
  103. _router.default.events.on(event, (...args)=>{
  104. const eventField = `on${event.charAt(0).toUpperCase()}${event.substring(1)}`;
  105. const _singletonRouter = singletonRouter;
  106. if (_singletonRouter[eventField]) {
  107. try {
  108. _singletonRouter[eventField](...args);
  109. } catch (err) {
  110. console.error(`Error when running the Router event: ${eventField}`);
  111. console.error((0, _isError).default(err) ? `${err.message}\n${err.stack}` : err + '');
  112. }
  113. }
  114. });
  115. });
  116. });
  117. var _default = singletonRouter;
  118. exports.default = _default;
  119. function useRouter() {
  120. return _react.default.useContext(_routerContext.RouterContext);
  121. }
  122. function createRouter(...args) {
  123. singletonRouter.router = new _router.default(...args);
  124. singletonRouter.readyCallbacks.forEach((cb)=>cb());
  125. singletonRouter.readyCallbacks = [];
  126. return singletonRouter.router;
  127. }
  128. function makePublicRouterInstance(router) {
  129. const scopedRouter = router;
  130. const instance = {};
  131. for (const property of urlPropertyFields){
  132. if (typeof scopedRouter[property] === 'object') {
  133. instance[property] = Object.assign(Array.isArray(scopedRouter[property]) ? [] : {}, scopedRouter[property]) // makes sure query is not stateful
  134. ;
  135. continue;
  136. }
  137. instance[property] = scopedRouter[property];
  138. }
  139. // Events is a static property on the router, the router doesn't have to be initialized to use it
  140. instance.events = _router.default.events;
  141. coreMethodFields.forEach((field)=>{
  142. instance[field] = (...args)=>{
  143. return scopedRouter[field](...args);
  144. };
  145. });
  146. return instance;
  147. }
  148. if ((typeof exports.default === 'function' || (typeof exports.default === 'object' && exports.default !== null)) && typeof exports.default.__esModule === 'undefined') {
  149. Object.defineProperty(exports.default, '__esModule', { value: true });
  150. Object.assign(exports.default, exports);
  151. module.exports = exports.default;
  152. }
  153. //# sourceMappingURL=router.js.map