UNPKG

next

Version:

The React Framework

79 lines (78 loc) 2.94 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "default", { enumerable: true, get: function() { return _default; } }); const _jsxruntime = require("react/jsx-runtime"); const _react = require("react"); const _dynamicbailouttocsr = require("./dynamic-bailout-to-csr"); const _preloadchunks = require("./preload-chunks"); // Normalize loader to return the module as form { default: Component } for `React.lazy`. // Also for backward compatible since next/dynamic allows to resolve a component directly with loader // Client component reference proxy need to be converted to a module. function convertModule(mod) { // Check "default" prop before accessing it, as it could be client reference proxy that could break it reference. // Cases: // mod: { default: Component } // mod: Component // mod: { default: proxy(Component) } // mod: proxy(Component) const hasDefault = mod && 'default' in mod; return { default: hasDefault ? mod.default : mod }; } const defaultOptions = { loader: ()=>Promise.resolve(convertModule(()=>null)), loading: null, ssr: true }; function Loadable(options) { const opts = { ...defaultOptions, ...options }; const Lazy = /*#__PURE__*/ (0, _react.lazy)(()=>opts.loader().then(convertModule)); const Loading = opts.loading; function LoadableComponent(props) { const fallbackElement = Loading ? /*#__PURE__*/ (0, _jsxruntime.jsx)(Loading, { isLoading: true, pastDelay: true, error: null }) : null; // If it's non-SSR or provided a loading component, wrap it in a suspense boundary const hasSuspenseBoundary = !opts.ssr || !!opts.loading; const Wrap = hasSuspenseBoundary ? _react.Suspense : _react.Fragment; const wrapProps = hasSuspenseBoundary ? { fallback: fallbackElement } : {}; const children = opts.ssr ? /*#__PURE__*/ (0, _jsxruntime.jsxs)(_jsxruntime.Fragment, { children: [ typeof window === 'undefined' ? /*#__PURE__*/ (0, _jsxruntime.jsx)(_preloadchunks.PreloadChunks, { moduleIds: opts.modules }) : null, /*#__PURE__*/ (0, _jsxruntime.jsx)(Lazy, { ...props }) ] }) : /*#__PURE__*/ (0, _jsxruntime.jsx)(_dynamicbailouttocsr.BailoutToCSR, { reason: "next/dynamic", children: /*#__PURE__*/ (0, _jsxruntime.jsx)(Lazy, { ...props }) }); return /*#__PURE__*/ (0, _jsxruntime.jsx)(Wrap, { ...wrapProps, children: children }); } LoadableComponent.displayName = 'LoadableComponent'; return LoadableComponent; } const _default = Loadable; //# sourceMappingURL=loadable.js.map