You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			248 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			JavaScript
		
	
		
		
			
		
	
	
			248 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			JavaScript
		
	
| 
											9 months ago
										 | // TODO: Remove use of `any` type.
 | ||
|  | /** | ||
|  | @copyright (c) 2017-present James Kyle <me@thejameskyle.com> | ||
|  |  MIT License | ||
|  |  Permission is hereby granted, free of charge, to any person obtaining | ||
|  | a copy of this software and associated documentation files (the | ||
|  | "Software"), to deal in the Software without restriction, including | ||
|  | without limitation the rights to use, copy, modify, merge, publish, | ||
|  | distribute, sublicense, and/or sell copies of the Software, and to | ||
|  | permit persons to whom the Software is furnished to do so, subject to | ||
|  | the following conditions: | ||
|  |  The above copyright notice and this permission notice shall be | ||
|  | included in all copies or substantial portions of the Software. | ||
|  |  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
|  | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
|  | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
|  | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | ||
|  | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | ||
|  | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | ||
|  | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE | ||
|  | */ // https://github.com/jamiebuilds/react-loadable/blob/v5.5.0/src/index.js
 | ||
|  | // Modified to be compatible with webpack 4 / Next.js
 | ||
|  | "use strict"; | ||
|  | Object.defineProperty(exports, "__esModule", { | ||
|  |     value: true | ||
|  | }); | ||
|  | Object.defineProperty(exports, "default", { | ||
|  |     enumerable: true, | ||
|  |     get: function() { | ||
|  |         return _default; | ||
|  |     } | ||
|  | }); | ||
|  | const _interop_require_default = require("@swc/helpers/_/_interop_require_default"); | ||
|  | const _react = /*#__PURE__*/ _interop_require_default._(require("react")); | ||
|  | const _loadablecontextsharedruntime = require("./loadable-context.shared-runtime"); | ||
|  | function resolve(obj) { | ||
|  |     return obj && obj.default ? obj.default : obj; | ||
|  | } | ||
|  | const ALL_INITIALIZERS = []; | ||
|  | const READY_INITIALIZERS = []; | ||
|  | let initialized = false; | ||
|  | function load(loader) { | ||
|  |     let promise = loader(); | ||
|  |     let state = { | ||
|  |         loading: true, | ||
|  |         loaded: null, | ||
|  |         error: null | ||
|  |     }; | ||
|  |     state.promise = promise.then((loaded)=>{ | ||
|  |         state.loading = false; | ||
|  |         state.loaded = loaded; | ||
|  |         return loaded; | ||
|  |     }).catch((err)=>{ | ||
|  |         state.loading = false; | ||
|  |         state.error = err; | ||
|  |         throw err; | ||
|  |     }); | ||
|  |     return state; | ||
|  | } | ||
|  | function createLoadableComponent(loadFn, options) { | ||
|  |     let opts = Object.assign({ | ||
|  |         loader: null, | ||
|  |         loading: null, | ||
|  |         delay: 200, | ||
|  |         timeout: null, | ||
|  |         webpack: null, | ||
|  |         modules: null | ||
|  |     }, options); | ||
|  |     /** @type LoadableSubscription */ let subscription = null; | ||
|  |     function init() { | ||
|  |         if (!subscription) { | ||
|  |             // eslint-disable-next-line @typescript-eslint/no-use-before-define
 | ||
|  |             const sub = new LoadableSubscription(loadFn, opts); | ||
|  |             subscription = { | ||
|  |                 getCurrentValue: sub.getCurrentValue.bind(sub), | ||
|  |                 subscribe: sub.subscribe.bind(sub), | ||
|  |                 retry: sub.retry.bind(sub), | ||
|  |                 promise: sub.promise.bind(sub) | ||
|  |             }; | ||
|  |         } | ||
|  |         return subscription.promise(); | ||
|  |     } | ||
|  |     // Server only
 | ||
|  |     if (typeof window === "undefined") { | ||
|  |         ALL_INITIALIZERS.push(init); | ||
|  |     } | ||
|  |     // Client only
 | ||
|  |     if (!initialized && typeof window !== "undefined") { | ||
|  |         // require.resolveWeak check is needed for environments that don't have it available like Jest
 | ||
|  |         const moduleIds = opts.webpack && typeof require.resolveWeak === "function" ? opts.webpack() : opts.modules; | ||
|  |         if (moduleIds) { | ||
|  |             READY_INITIALIZERS.push((ids)=>{ | ||
|  |                 for (const moduleId of moduleIds){ | ||
|  |                     if (ids.includes(moduleId)) { | ||
|  |                         return init(); | ||
|  |                     } | ||
|  |                 } | ||
|  |             }); | ||
|  |         } | ||
|  |     } | ||
|  |     function useLoadableModule() { | ||
|  |         init(); | ||
|  |         const context = _react.default.useContext(_loadablecontextsharedruntime.LoadableContext); | ||
|  |         if (context && Array.isArray(opts.modules)) { | ||
|  |             opts.modules.forEach((moduleName)=>{ | ||
|  |                 context(moduleName); | ||
|  |             }); | ||
|  |         } | ||
|  |     } | ||
|  |     function LoadableComponent(props, ref) { | ||
|  |         useLoadableModule(); | ||
|  |         const state = _react.default.useSyncExternalStore(subscription.subscribe, subscription.getCurrentValue, subscription.getCurrentValue); | ||
|  |         _react.default.useImperativeHandle(ref, ()=>({ | ||
|  |                 retry: subscription.retry | ||
|  |             }), []); | ||
|  |         return _react.default.useMemo(()=>{ | ||
|  |             if (state.loading || state.error) { | ||
|  |                 return /*#__PURE__*/ _react.default.createElement(opts.loading, { | ||
|  |                     isLoading: state.loading, | ||
|  |                     pastDelay: state.pastDelay, | ||
|  |                     timedOut: state.timedOut, | ||
|  |                     error: state.error, | ||
|  |                     retry: subscription.retry | ||
|  |                 }); | ||
|  |             } else if (state.loaded) { | ||
|  |                 return /*#__PURE__*/ _react.default.createElement(resolve(state.loaded), props); | ||
|  |             } else { | ||
|  |                 return null; | ||
|  |             } | ||
|  |         }, [ | ||
|  |             props, | ||
|  |             state | ||
|  |         ]); | ||
|  |     } | ||
|  |     LoadableComponent.preload = ()=>init(); | ||
|  |     LoadableComponent.displayName = "LoadableComponent"; | ||
|  |     return /*#__PURE__*/ _react.default.forwardRef(LoadableComponent); | ||
|  | } | ||
|  | class LoadableSubscription { | ||
|  |     promise() { | ||
|  |         return this._res.promise; | ||
|  |     } | ||
|  |     retry() { | ||
|  |         this._clearTimeouts(); | ||
|  |         this._res = this._loadFn(this._opts.loader); | ||
|  |         this._state = { | ||
|  |             pastDelay: false, | ||
|  |             timedOut: false | ||
|  |         }; | ||
|  |         const { _res: res, _opts: opts } = this; | ||
|  |         if (res.loading) { | ||
|  |             if (typeof opts.delay === "number") { | ||
|  |                 if (opts.delay === 0) { | ||
|  |                     this._state.pastDelay = true; | ||
|  |                 } else { | ||
|  |                     this._delay = setTimeout(()=>{ | ||
|  |                         this._update({ | ||
|  |                             pastDelay: true | ||
|  |                         }); | ||
|  |                     }, opts.delay); | ||
|  |                 } | ||
|  |             } | ||
|  |             if (typeof opts.timeout === "number") { | ||
|  |                 this._timeout = setTimeout(()=>{ | ||
|  |                     this._update({ | ||
|  |                         timedOut: true | ||
|  |                     }); | ||
|  |                 }, opts.timeout); | ||
|  |             } | ||
|  |         } | ||
|  |         this._res.promise.then(()=>{ | ||
|  |             this._update({}); | ||
|  |             this._clearTimeouts(); | ||
|  |         }).catch((_err)=>{ | ||
|  |             this._update({}); | ||
|  |             this._clearTimeouts(); | ||
|  |         }); | ||
|  |         this._update({}); | ||
|  |     } | ||
|  |     _update(partial) { | ||
|  |         this._state = { | ||
|  |             ...this._state, | ||
|  |             error: this._res.error, | ||
|  |             loaded: this._res.loaded, | ||
|  |             loading: this._res.loading, | ||
|  |             ...partial | ||
|  |         }; | ||
|  |         this._callbacks.forEach((callback)=>callback()); | ||
|  |     } | ||
|  |     _clearTimeouts() { | ||
|  |         clearTimeout(this._delay); | ||
|  |         clearTimeout(this._timeout); | ||
|  |     } | ||
|  |     getCurrentValue() { | ||
|  |         return this._state; | ||
|  |     } | ||
|  |     subscribe(callback) { | ||
|  |         this._callbacks.add(callback); | ||
|  |         return ()=>{ | ||
|  |             this._callbacks.delete(callback); | ||
|  |         }; | ||
|  |     } | ||
|  |     constructor(loadFn, opts){ | ||
|  |         this._loadFn = loadFn; | ||
|  |         this._opts = opts; | ||
|  |         this._callbacks = new Set(); | ||
|  |         this._delay = null; | ||
|  |         this._timeout = null; | ||
|  |         this.retry(); | ||
|  |     } | ||
|  | } | ||
|  | function Loadable(opts) { | ||
|  |     return createLoadableComponent(load, opts); | ||
|  | } | ||
|  | function flushInitializers(initializers, ids) { | ||
|  |     let promises = []; | ||
|  |     while(initializers.length){ | ||
|  |         let init = initializers.pop(); | ||
|  |         promises.push(init(ids)); | ||
|  |     } | ||
|  |     return Promise.all(promises).then(()=>{ | ||
|  |         if (initializers.length) { | ||
|  |             return flushInitializers(initializers, ids); | ||
|  |         } | ||
|  |     }); | ||
|  | } | ||
|  | Loadable.preloadAll = ()=>{ | ||
|  |     return new Promise((resolveInitializers, reject)=>{ | ||
|  |         flushInitializers(ALL_INITIALIZERS).then(resolveInitializers, reject); | ||
|  |     }); | ||
|  | }; | ||
|  | Loadable.preloadReady = (ids)=>{ | ||
|  |     if (ids === void 0) ids = []; | ||
|  |     return new Promise((resolvePreload)=>{ | ||
|  |         const res = ()=>{ | ||
|  |             initialized = true; | ||
|  |             return resolvePreload(); | ||
|  |         }; | ||
|  |         // We always will resolve, errors should be handled within loading UIs.
 | ||
|  |         flushInitializers(READY_INITIALIZERS, ids).then(res, res); | ||
|  |     }); | ||
|  | }; | ||
|  | if (typeof window !== "undefined") { | ||
|  |     window.__NEXT_PRELOADREADY = Loadable.preloadReady; | ||
|  | } | ||
|  | const _default = Loadable; | ||
|  | 
 | ||
|  | //# sourceMappingURL=loadable.shared-runtime.js.map
 |