@modern-js/runtime 1.4.3 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/js/modern/cli/index.js +1 -3
  3. package/dist/js/modern/core/app-config.js +10 -0
  4. package/dist/js/modern/core/compatible.js +218 -0
  5. package/dist/js/modern/core/index.js +7 -0
  6. package/dist/js/modern/core/loader/index.js +1 -0
  7. package/dist/js/modern/core/loader/loaderManager.js +189 -0
  8. package/dist/js/modern/core/loader/useLoader.js +105 -0
  9. package/dist/js/modern/core/plugin.js +63 -0
  10. package/dist/js/modern/core/runtime-context.js +2 -0
  11. package/dist/js/modern/exports/styled.js +2 -2
  12. package/dist/js/modern/index.js +1 -1
  13. package/dist/js/modern/router/runtime/plugin.js +1 -1
  14. package/dist/js/modern/router/runtime/utils.js +3 -1
  15. package/dist/js/modern/ssr/index.js +4 -0
  16. package/dist/js/modern/ssr/index.node.js +1 -1
  17. package/dist/js/modern/ssr/prefetch.js +2 -2
  18. package/dist/js/modern/ssr/serverRender/index.js +1 -1
  19. package/dist/js/modern/ssr/serverRender/styledComponent.js +1 -1
  20. package/dist/js/modern/ssr/utils.js +9 -3
  21. package/dist/js/modern/state/cli/index.js +1 -1
  22. package/dist/js/modern/state/runtime/plugin.js +1 -1
  23. package/dist/js/node/cli/index.js +1 -3
  24. package/dist/js/node/core/app-config.js +22 -0
  25. package/dist/js/node/core/compatible.js +247 -0
  26. package/dist/js/node/core/index.js +111 -0
  27. package/dist/js/node/core/loader/index.js +15 -0
  28. package/dist/js/node/core/loader/loaderManager.js +201 -0
  29. package/dist/js/node/core/loader/useLoader.js +118 -0
  30. package/dist/js/node/core/plugin.js +79 -0
  31. package/dist/js/node/core/runtime-context.js +11 -0
  32. package/dist/js/node/exports/styled.js +5 -5
  33. package/dist/js/node/index.js +10 -10
  34. package/dist/js/node/router/runtime/plugin.js +3 -3
  35. package/dist/js/node/router/runtime/utils.js +3 -1
  36. package/dist/js/node/ssr/index.js +4 -0
  37. package/dist/js/node/ssr/index.node.js +2 -2
  38. package/dist/js/node/ssr/serverRender/index.js +2 -2
  39. package/dist/js/node/ssr/serverRender/styledComponent.js +2 -2
  40. package/dist/js/node/ssr/utils.js +9 -3
  41. package/dist/js/node/state/cli/index.js +1 -1
  42. package/dist/js/node/state/runtime/plugin.js +3 -3
  43. package/dist/js/treeshaking/cli/index.js +1 -3
  44. package/dist/js/treeshaking/core/app-config.js +13 -0
  45. package/dist/js/treeshaking/core/compatible.js +255 -0
  46. package/dist/js/treeshaking/core/index.js +7 -0
  47. package/dist/js/treeshaking/core/loader/index.js +1 -0
  48. package/dist/js/treeshaking/core/loader/loaderManager.js +267 -0
  49. package/dist/js/treeshaking/core/loader/useLoader.js +107 -0
  50. package/dist/js/treeshaking/core/plugin.js +105 -0
  51. package/dist/js/treeshaking/core/runtime-context.js +2 -0
  52. package/dist/js/treeshaking/exports/styled.js +2 -2
  53. package/dist/js/treeshaking/index.js +1 -1
  54. package/dist/js/treeshaking/router/runtime/plugin.js +1 -1
  55. package/dist/js/treeshaking/router/runtime/utils.js +3 -1
  56. package/dist/js/treeshaking/ssr/index.js +4 -0
  57. package/dist/js/treeshaking/ssr/index.node.js +1 -1
  58. package/dist/js/treeshaking/ssr/prefetch.js +2 -2
  59. package/dist/js/treeshaking/ssr/serverRender/index.js +1 -1
  60. package/dist/js/treeshaking/ssr/serverRender/styledComponent.js +1 -1
  61. package/dist/js/treeshaking/ssr/utils.js +8 -3
  62. package/dist/js/treeshaking/state/cli/index.js +1 -1
  63. package/dist/js/treeshaking/state/runtime/plugin.js +1 -1
  64. package/dist/types/core/app-config.d.ts +6 -0
  65. package/dist/types/core/compatible.d.ts +13 -0
  66. package/dist/types/core/index.d.ts +9 -0
  67. package/dist/types/core/loader/index.d.ts +2 -0
  68. package/dist/types/core/loader/loaderManager.d.ts +57 -0
  69. package/dist/types/core/loader/useLoader.d.ts +54 -0
  70. package/dist/types/core/plugin.d.ts +208 -0
  71. package/dist/types/core/runtime-context.d.ts +13 -0
  72. package/dist/types/exports/styled.d.ts +2 -2
  73. package/dist/types/index.d.ts +4 -9
  74. package/dist/types/router/runtime/plugin.d.ts +1 -1
  75. package/dist/types/ssr/index.d.ts +2 -2
  76. package/dist/types/ssr/index.node.d.ts +1 -1
  77. package/dist/types/ssr/prefetch.d.ts +2 -2
  78. package/dist/types/ssr/serverRender/entry.d.ts +1 -1
  79. package/dist/types/ssr/serverRender/index.d.ts +1 -1
  80. package/dist/types/ssr/serverRender/type.d.ts +1 -1
  81. package/dist/types/state/runtime/plugin.d.ts +2 -2
  82. package/lib/types.d.ts +10 -0
  83. package/package.json +36 -26
@@ -0,0 +1,13 @@
1
+ var APP_CONFIG_SYMBOL = 'config';
2
+ export var getConfig = function getConfig(Component) {
3
+ return (// eslint-disable-next-line @typescript-eslint/ban-ts-comment
4
+ // @ts-expect-error
5
+ Component[APP_CONFIG_SYMBOL]
6
+ );
7
+ };
8
+ export var defineConfig = function defineConfig(Component, config) {
9
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
10
+ // @ts-expect-error
11
+ Component[APP_CONFIG_SYMBOL] = config;
12
+ return Component;
13
+ };
@@ -0,0 +1,255 @@
1
+ import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
+ import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
4
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
5
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
6
+ var _excluded = ["context"];
7
+ import React, { useContext, useMemo } from 'react';
8
+ import ReactDOM from 'react-dom';
9
+ import hoistNonReactStatics from 'hoist-non-react-statics';
10
+ import { runtime } from "./plugin";
11
+ import { RuntimeReactContext } from "./runtime-context";
12
+ import { createLoaderManager } from "./loader/loaderManager";
13
+ import { jsx as _jsx } from "react/jsx-runtime";
14
+
15
+ function isClientArgs(id) {
16
+ return typeof id === 'string' || typeof HTMLElement !== 'undefined' && id instanceof HTMLElement;
17
+ }
18
+
19
+ var runnerMap = new WeakMap();
20
+
21
+ var getInitialContext = function getInitialContext(runner) {
22
+ return {
23
+ loaderManager: createLoaderManager({}),
24
+ runner: runner,
25
+ isBrowser: true
26
+ };
27
+ };
28
+
29
+ export var createApp = function createApp(_ref) {
30
+ var plugins = _ref.plugins;
31
+ var appRuntime = runtime.clone();
32
+ appRuntime.usePlugin.apply(appRuntime, _toConsumableArray(plugins));
33
+ return function (App) {
34
+ var runner = appRuntime.init();
35
+
36
+ var WrapperComponent = function WrapperComponent(props) {
37
+ var element = /*#__PURE__*/React.createElement(App || React.Fragment, _objectSpread({}, props), props.children);
38
+ var context = useContext(RuntimeReactContext);
39
+ return runner.provide({
40
+ element: element,
41
+ props: _objectSpread({}, props),
42
+ context: context
43
+ }, {
44
+ onLast: function onLast(_ref2) {
45
+ var element = _ref2.element;
46
+ return element;
47
+ }
48
+ });
49
+ };
50
+
51
+ if (App) {
52
+ hoistNonReactStatics(WrapperComponent, App);
53
+ }
54
+
55
+ var HOCApp = runner.hoc({
56
+ App: WrapperComponent
57
+ }, {
58
+ onLast: function onLast(_ref3) {
59
+ var App = _ref3.App;
60
+
61
+ var WrapComponent = function WrapComponent(_ref4) {
62
+ var _contextValue;
63
+
64
+ var context = _ref4.context,
65
+ props = _objectWithoutProperties(_ref4, _excluded);
66
+
67
+ var contextValue = context; // We should construct the context, when root component is not passed into `bootstrap`.
68
+
69
+ if (!((_contextValue = contextValue) !== null && _contextValue !== void 0 && _contextValue.runner)) {
70
+ contextValue = getInitialContext(runner);
71
+ runner.init({
72
+ context: contextValue
73
+ }, {
74
+ onLast: function onLast(_ref5) {
75
+ var _App$init;
76
+
77
+ var context1 = _ref5.context;
78
+ return App === null || App === void 0 ? void 0 : (_App$init = App.init) === null || _App$init === void 0 ? void 0 : _App$init.call(App, context1);
79
+ }
80
+ });
81
+ }
82
+
83
+ return /*#__PURE__*/_jsx(RuntimeReactContext.Provider, {
84
+ value: contextValue,
85
+ children: /*#__PURE__*/_jsx(App, _objectSpread({}, props))
86
+ });
87
+ };
88
+
89
+ return hoistNonReactStatics(WrapComponent, App);
90
+ }
91
+ });
92
+ runnerMap.set(HOCApp, runner);
93
+ return HOCApp;
94
+ };
95
+ };
96
+ export var bootstrap = /*#__PURE__*/function () {
97
+ var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(BootApp,
98
+ /**
99
+ * When csr, id is root id.
100
+ * When ssr, id is serverContext
101
+ */
102
+ id) {
103
+ var App, runner, context, runInit, isBrowser, _ssrData$data, _ssrData$data2, ssrData, loadersData, initialLoadersState, initialData, _initialData;
104
+
105
+ return _regeneratorRuntime().wrap(function _callee$(_context2) {
106
+ while (1) {
107
+ switch (_context2.prev = _context2.next) {
108
+ case 0:
109
+ App = BootApp;
110
+ runner = runnerMap.get(App); // ensure Component used is created by `createApp`
111
+
112
+ if (!runner) {
113
+ App = createApp({
114
+ plugins: []
115
+ })(App);
116
+ runner = runnerMap.get(App);
117
+ }
118
+
119
+ context = getInitialContext(runner);
120
+
121
+ runInit = function runInit(_context) {
122
+ return runner.init({
123
+ context: _context
124
+ }, {
125
+ onLast: function onLast(_ref7) {
126
+ var _App, _App$init2;
127
+
128
+ var context1 = _ref7.context;
129
+ return (_App = App) === null || _App === void 0 ? void 0 : (_App$init2 = _App.init) === null || _App$init2 === void 0 ? void 0 : _App$init2.call(_App, context1);
130
+ }
131
+ });
132
+ }; // don't mount the App, let user in charge of it.
133
+
134
+
135
+ if (id) {
136
+ _context2.next = 7;
137
+ break;
138
+ }
139
+
140
+ return _context2.abrupt("return", /*#__PURE__*/React.createElement(App, {
141
+ context: context
142
+ }));
143
+
144
+ case 7:
145
+ isBrowser = typeof window !== 'undefined' && window.name !== 'nodejs';
146
+
147
+ if (!isBrowser) {
148
+ _context2.next = 25;
149
+ break;
150
+ }
151
+
152
+ if (!isClientArgs(id)) {
153
+ _context2.next = 22;
154
+ break;
155
+ }
156
+
157
+ ssrData = window._SSR_DATA;
158
+ loadersData = (ssrData === null || ssrData === void 0 ? void 0 : (_ssrData$data = ssrData.data) === null || _ssrData$data === void 0 ? void 0 : _ssrData$data.loadersData) || {};
159
+ initialLoadersState = Object.keys(loadersData).reduce(function (res, key) {
160
+ var loaderData = loadersData[key];
161
+
162
+ if (loaderData.loading !== false) {
163
+ return res;
164
+ }
165
+
166
+ res[key] = loaderData;
167
+ return res;
168
+ }, {});
169
+ Object.assign(context, _objectSpread({
170
+ loaderManager: createLoaderManager(initialLoadersState, {
171
+ skipStatic: true
172
+ })
173
+ }, ssrData ? {
174
+ ssrContext: ssrData === null || ssrData === void 0 ? void 0 : ssrData.context
175
+ } : {}));
176
+ context.initialData = ssrData === null || ssrData === void 0 ? void 0 : (_ssrData$data2 = ssrData.data) === null || _ssrData$data2 === void 0 ? void 0 : _ssrData$data2.initialData;
177
+ _context2.next = 17;
178
+ return runInit(context);
179
+
180
+ case 17:
181
+ initialData = _context2.sent;
182
+
183
+ if (initialData) {
184
+ context.initialData = initialData;
185
+ }
186
+
187
+ return _context2.abrupt("return", runner.client({
188
+ App: App,
189
+ context: context,
190
+ rootElement: typeof id !== 'string' ? id : document.getElementById(id || 'root')
191
+ }, {
192
+ onLast: function onLast(_ref8) {
193
+ var App = _ref8.App,
194
+ rootElement = _ref8.rootElement;
195
+ ReactDOM.render( /*#__PURE__*/React.createElement(App, {
196
+ context: context
197
+ }), rootElement);
198
+ }
199
+ }));
200
+
201
+ case 22:
202
+ throw Error('`bootstrap` needs id in browser environment, it needs to be string or element');
203
+
204
+ case 23:
205
+ _context2.next = 31;
206
+ break;
207
+
208
+ case 25:
209
+ Object.assign(context, {
210
+ ssrContext: id,
211
+ isBrowser: false,
212
+ loaderManager: createLoaderManager({}, {
213
+ skipNonStatic: id.staticGenerate,
214
+ // if not static generate, only non-static loader can exec on prod env
215
+ skipStatic: process.env.NODE_ENV === 'production' && !id.staticGenerate
216
+ })
217
+ });
218
+ _context2.next = 28;
219
+ return runInit(context);
220
+
221
+ case 28:
222
+ _initialData = _context2.sent;
223
+ context.initialData = _initialData;
224
+ return _context2.abrupt("return", runner.server({
225
+ App: App,
226
+ context: context
227
+ }));
228
+
229
+ case 31:
230
+ case "end":
231
+ return _context2.stop();
232
+ }
233
+ }
234
+ }, _callee);
235
+ }));
236
+
237
+ return function bootstrap(_x, _x2) {
238
+ return _ref6.apply(this, arguments);
239
+ };
240
+ }();
241
+ export var useRuntimeContext = function useRuntimeContext() {
242
+ var context = useContext(RuntimeReactContext);
243
+ var memoizedContext = useMemo(function () {
244
+ return context.runner.pickContext({
245
+ context: context,
246
+ pickedContext: {}
247
+ }, {
248
+ onLast: function onLast(_ref9) {
249
+ var pickedContext = _ref9.pickedContext;
250
+ return pickedContext;
251
+ }
252
+ });
253
+ }, [context]);
254
+ return memoizedContext;
255
+ };
@@ -0,0 +1,7 @@
1
+ export { createPlugin, createRuntime, runtime, registerInit, registerPrefetch } from "./plugin";
2
+ export { defineConfig, getConfig } from "./app-config";
3
+ // compatible
4
+ export * from "./compatible";
5
+ export { RuntimeReactContext } from "./runtime-context";
6
+ export * from "./loader";
7
+ export * from '@modern-js/plugin';
@@ -0,0 +1 @@
1
+ export { default as useLoader } from "./useLoader";
@@ -0,0 +1,267 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
3
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
4
+ import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
5
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
6
+ import invariant from 'invariant';
7
+
8
+ /**
9
+ * Calc id from string or object
10
+ */
11
+ var createGetId = function createGetId() {
12
+ var idCache = new Map();
13
+ return function (objectId) {
14
+ var cachedId = idCache.get(objectId);
15
+
16
+ if (cachedId) {
17
+ return cachedId;
18
+ } // WARNING: id should be unique after serialize.
19
+
20
+
21
+ var id = JSON.stringify(objectId);
22
+ invariant(id, 'params should be not null value');
23
+ idCache.set(objectId, id);
24
+ return id;
25
+ };
26
+ };
27
+
28
+ export var LoaderStatus;
29
+
30
+ (function (LoaderStatus) {
31
+ LoaderStatus[LoaderStatus["idle"] = 0] = "idle";
32
+ LoaderStatus[LoaderStatus["loading"] = 1] = "loading";
33
+ LoaderStatus[LoaderStatus["fulfilled"] = 2] = "fulfilled";
34
+ LoaderStatus[LoaderStatus["rejected"] = 3] = "rejected";
35
+ })(LoaderStatus || (LoaderStatus = {}));
36
+
37
+ var createLoader = function createLoader(id) {
38
+ var initialData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
39
+ loading: false,
40
+ reloading: false,
41
+ data: undefined,
42
+ error: undefined
43
+ };
44
+ var loaderFn = arguments.length > 2 ? arguments[2] : undefined;
45
+ var skip = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
46
+ var promise;
47
+ var status = LoaderStatus.idle;
48
+ var data = initialData.data,
49
+ error = initialData.error;
50
+ var hasLoaded = false;
51
+ var handlers = new Set();
52
+
53
+ var load = /*#__PURE__*/function () {
54
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
55
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
56
+ while (1) {
57
+ switch (_context.prev = _context.next) {
58
+ case 0:
59
+ if (!skip) {
60
+ _context.next = 2;
61
+ break;
62
+ }
63
+
64
+ return _context.abrupt("return", promise);
65
+
66
+ case 2:
67
+ if (!(status === LoaderStatus.loading)) {
68
+ _context.next = 4;
69
+ break;
70
+ }
71
+
72
+ return _context.abrupt("return", promise);
73
+
74
+ case 4:
75
+ status = LoaderStatus.loading;
76
+ notify();
77
+ promise = loaderFn().then(function (value) {
78
+ data = value;
79
+ error = null;
80
+ status = LoaderStatus.fulfilled;
81
+ })["catch"](function (e) {
82
+ error = e;
83
+ data = null;
84
+ status = LoaderStatus.rejected;
85
+ })["finally"](function () {
86
+ promise = null;
87
+ hasLoaded = true;
88
+ notify();
89
+ });
90
+ return _context.abrupt("return", promise);
91
+
92
+ case 8:
93
+ case "end":
94
+ return _context.stop();
95
+ }
96
+ }
97
+ }, _callee);
98
+ }));
99
+
100
+ return function load() {
101
+ return _ref.apply(this, arguments);
102
+ };
103
+ }();
104
+
105
+ var getResult = function getResult() {
106
+ return {
107
+ loading: !hasLoaded && status === LoaderStatus.loading,
108
+ reloading: hasLoaded && status === LoaderStatus.loading,
109
+ data: data,
110
+ error: error instanceof Error ? "".concat(error.message) : error,
111
+ // redundant fields for ssr log
112
+ _error: error
113
+ };
114
+ };
115
+
116
+ var notify = function notify() {
117
+ // don't iterate handlers directly, since it could be modified during iteration
118
+ _toConsumableArray(handlers).forEach(function (handler) {
119
+ handler(status, getResult());
120
+ });
121
+ };
122
+
123
+ var onChange = function onChange(handler) {
124
+ handlers.add(handler);
125
+ return function () {
126
+ handlers["delete"](handler);
127
+ };
128
+ };
129
+
130
+ return {
131
+ get result() {
132
+ return getResult();
133
+ },
134
+
135
+ get promise() {
136
+ return promise;
137
+ },
138
+
139
+ onChange: onChange,
140
+ load: load
141
+ };
142
+ };
143
+
144
+ /**
145
+ * Create loaders manager. It's returned instance will add to context
146
+ * @param initialDataMap used to initialing loader data
147
+ */
148
+ export var createLoaderManager = function createLoaderManager(initialDataMap) {
149
+ var managerOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
150
+ var _managerOptions$skipS = managerOptions.skipStatic,
151
+ skipStatic = _managerOptions$skipS === void 0 ? false : _managerOptions$skipS,
152
+ _managerOptions$skipN = managerOptions.skipNonStatic,
153
+ skipNonStatic = _managerOptions$skipN === void 0 ? false : _managerOptions$skipN;
154
+ var loadersMap = new Map();
155
+ var getId = createGetId();
156
+
157
+ var add = function add(loaderFn, loaderOptions) {
158
+ var id = getId(loaderOptions.params);
159
+ var loader = loadersMap.get(id); // private property for opting out loader cache, maybe change in future
160
+
161
+ var cache = loaderOptions._cache;
162
+
163
+ if (!loader || cache === false) {
164
+ // ignore non-static loader on static phase
165
+ var ignoreNonStatic = skipNonStatic && !loaderOptions["static"]; // ignore static loader on non-static phase
166
+
167
+ var ignoreStatic = skipStatic && loaderOptions["static"];
168
+ var skipExec = ignoreNonStatic || ignoreStatic;
169
+ loader = createLoader(id, typeof initialDataMap[id] !== 'undefined' ? initialDataMap[id] : {
170
+ data: loaderOptions.initialData
171
+ }, loaderFn, // Todo whether static loader is exec when CSR
172
+ skipExec);
173
+ loadersMap.set(id, loader);
174
+ }
175
+
176
+ return id;
177
+ };
178
+
179
+ var get = function get(id) {
180
+ return loadersMap.get(id);
181
+ }; // check if there has pending loaders
182
+
183
+
184
+ var hasPendingLoaders = function hasPendingLoaders() {
185
+ var _iterator = _createForOfIteratorHelper(loadersMap.values()),
186
+ _step;
187
+
188
+ try {
189
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
190
+ var loader = _step.value;
191
+ var promise = loader.promise;
192
+
193
+ if (promise instanceof Promise) {
194
+ return true;
195
+ }
196
+ }
197
+ } catch (err) {
198
+ _iterator.e(err);
199
+ } finally {
200
+ _iterator.f();
201
+ }
202
+
203
+ return false;
204
+ }; // waiting for all pending loaders to be settled
205
+
206
+
207
+ var awaitPendingLoaders = /*#__PURE__*/function () {
208
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
209
+ var pendingLoaders, _iterator2, _step2, _step2$value, id, loader, promise;
210
+
211
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
212
+ while (1) {
213
+ switch (_context2.prev = _context2.next) {
214
+ case 0:
215
+ pendingLoaders = [];
216
+ _iterator2 = _createForOfIteratorHelper(loadersMap);
217
+
218
+ try {
219
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
220
+ _step2$value = _slicedToArray(_step2.value, 2), id = _step2$value[0], loader = _step2$value[1];
221
+ promise = loader.promise;
222
+
223
+ if (promise instanceof Promise) {
224
+ pendingLoaders.push([id, loader]);
225
+ }
226
+ }
227
+ } catch (err) {
228
+ _iterator2.e(err);
229
+ } finally {
230
+ _iterator2.f();
231
+ }
232
+
233
+ _context2.next = 5;
234
+ return Promise.all(pendingLoaders.map(function (item) {
235
+ return item[1].promise;
236
+ }));
237
+
238
+ case 5:
239
+ return _context2.abrupt("return", pendingLoaders.reduce(function (res, _ref3) {
240
+ var _ref4 = _slicedToArray(_ref3, 2),
241
+ id = _ref4[0],
242
+ loader = _ref4[1];
243
+
244
+ res[id] = loader.result;
245
+ return res;
246
+ }, {}));
247
+
248
+ case 6:
249
+ case "end":
250
+ return _context2.stop();
251
+ }
252
+ }
253
+ }, _callee2);
254
+ }));
255
+
256
+ return function awaitPendingLoaders() {
257
+ return _ref2.apply(this, arguments);
258
+ };
259
+ }();
260
+
261
+ return {
262
+ hasPendingLoaders: hasPendingLoaders,
263
+ awaitPendingLoaders: awaitPendingLoaders,
264
+ add: add,
265
+ get: get
266
+ };
267
+ };
@@ -0,0 +1,107 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
3
+ import { useContext, useRef, useMemo, useState, useCallback, useEffect } from 'react';
4
+ import invariant from 'invariant';
5
+ import { RuntimeReactContext } from "../runtime-context";
6
+ import { LoaderStatus } from "./loaderManager";
7
+
8
+ var useLoader = function useLoader(loaderFn) {
9
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
10
+ params: undefined
11
+ };
12
+ var context = useContext(RuntimeReactContext);
13
+ var isSSRRender = Boolean(context.ssr);
14
+ var loaderManager = context.loaderManager;
15
+ var loaderRef = useRef();
16
+ var unlistenLoaderChangeRef = useRef(null); // SSR render should ignore `_cache` prop
17
+
18
+ if (isSSRRender && Object.prototype.hasOwnProperty.call(options, '_cache')) {
19
+ delete options._cache;
20
+ }
21
+
22
+ var load = useCallback(function (params) {
23
+ var _unlistenLoaderChange, _window, _window$_SSR_DATA, _window$_SSR_DATA$dat, _window$_SSR_DATA$dat2, _loaderRef$current2;
24
+
25
+ if (typeof params === 'undefined') {
26
+ var _loaderRef$current;
27
+
28
+ return (_loaderRef$current = loaderRef.current) === null || _loaderRef$current === void 0 ? void 0 : _loaderRef$current.load();
29
+ }
30
+
31
+ var id = loaderManager.add(function () {
32
+ try {
33
+ var _res = loaderFn(context, params);
34
+
35
+ if (_res instanceof Promise) {
36
+ return _res;
37
+ }
38
+
39
+ return Promise.resolve(_res);
40
+ } catch (e) {
41
+ return Promise.reject(e);
42
+ }
43
+ }, _objectSpread(_objectSpread({}, options), {}, {
44
+ params: params
45
+ }));
46
+ loaderRef.current = loaderManager.get(id); // unsubscribe old loader onChange event
47
+
48
+ (_unlistenLoaderChange = unlistenLoaderChangeRef.current) === null || _unlistenLoaderChange === void 0 ? void 0 : _unlistenLoaderChange.call(unlistenLoaderChangeRef);
49
+
50
+ if (isSSRRender) {
51
+ return undefined;
52
+ } // skip this loader, then try to unlisten loader change
53
+
54
+
55
+ if (options.skip) {
56
+ return undefined;
57
+ } // do not load data again in CSR hydrate stage if SSR data exists
58
+
59
+
60
+ if (context._hydration && ((_window = window) === null || _window === void 0 ? void 0 : (_window$_SSR_DATA = _window._SSR_DATA) === null || _window$_SSR_DATA === void 0 ? void 0 : (_window$_SSR_DATA$dat = _window$_SSR_DATA.data) === null || _window$_SSR_DATA$dat === void 0 ? void 0 : (_window$_SSR_DATA$dat2 = _window$_SSR_DATA$dat.loadersData[id]) === null || _window$_SSR_DATA$dat2 === void 0 ? void 0 : _window$_SSR_DATA$dat2.error) === null) {
61
+ return undefined;
62
+ }
63
+
64
+ var res = loaderRef.current.load();
65
+ unlistenLoaderChangeRef.current = (_loaderRef$current2 = loaderRef.current) === null || _loaderRef$current2 === void 0 ? void 0 : _loaderRef$current2.onChange(function (_status, _result) {
66
+ setResult(_result);
67
+
68
+ if (_status === LoaderStatus.fulfilled) {
69
+ var _options$onSuccess;
70
+
71
+ options === null || options === void 0 ? void 0 : (_options$onSuccess = options.onSuccess) === null || _options$onSuccess === void 0 ? void 0 : _options$onSuccess.call(options, _result.data);
72
+ }
73
+
74
+ if (_status === LoaderStatus.rejected) {
75
+ var _options$onError;
76
+
77
+ options === null || options === void 0 ? void 0 : (_options$onError = options.onError) === null || _options$onError === void 0 ? void 0 : _options$onError.call(options, _result.error);
78
+ }
79
+ });
80
+ return res;
81
+ }, [options.skip]);
82
+ useEffect(function () {
83
+ return function () {
84
+ var _unlistenLoaderChange2;
85
+
86
+ (_unlistenLoaderChange2 = unlistenLoaderChangeRef.current) === null || _unlistenLoaderChange2 === void 0 ? void 0 : _unlistenLoaderChange2.call(unlistenLoaderChangeRef);
87
+ };
88
+ }, []);
89
+ useMemo(function () {
90
+ var _options$params;
91
+
92
+ var p = (_options$params = options.params) !== null && _options$params !== void 0 ? _options$params : loaderFn.id;
93
+ invariant(typeof p !== 'undefined' && p !== null, 'Params is required in useLoader');
94
+ load(p);
95
+ }, [options.params]);
96
+
97
+ var _useState = useState(loaderRef.current.result),
98
+ _useState2 = _slicedToArray(_useState, 2),
99
+ result = _useState2[0],
100
+ setResult = _useState2[1];
101
+
102
+ return _objectSpread(_objectSpread({}, result), {}, {
103
+ reload: load
104
+ });
105
+ };
106
+
107
+ export default useLoader;