@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.
- package/CHANGELOG.md +43 -0
- package/dist/js/modern/cli/index.js +1 -3
- package/dist/js/modern/core/app-config.js +10 -0
- package/dist/js/modern/core/compatible.js +218 -0
- package/dist/js/modern/core/index.js +7 -0
- package/dist/js/modern/core/loader/index.js +1 -0
- package/dist/js/modern/core/loader/loaderManager.js +189 -0
- package/dist/js/modern/core/loader/useLoader.js +105 -0
- package/dist/js/modern/core/plugin.js +63 -0
- package/dist/js/modern/core/runtime-context.js +2 -0
- package/dist/js/modern/exports/styled.js +2 -2
- package/dist/js/modern/index.js +1 -1
- package/dist/js/modern/router/runtime/plugin.js +1 -1
- package/dist/js/modern/router/runtime/utils.js +3 -1
- package/dist/js/modern/ssr/index.js +4 -0
- package/dist/js/modern/ssr/index.node.js +1 -1
- package/dist/js/modern/ssr/prefetch.js +2 -2
- package/dist/js/modern/ssr/serverRender/index.js +1 -1
- package/dist/js/modern/ssr/serverRender/styledComponent.js +1 -1
- package/dist/js/modern/ssr/utils.js +9 -3
- package/dist/js/modern/state/cli/index.js +1 -1
- package/dist/js/modern/state/runtime/plugin.js +1 -1
- package/dist/js/node/cli/index.js +1 -3
- package/dist/js/node/core/app-config.js +22 -0
- package/dist/js/node/core/compatible.js +247 -0
- package/dist/js/node/core/index.js +111 -0
- package/dist/js/node/core/loader/index.js +15 -0
- package/dist/js/node/core/loader/loaderManager.js +201 -0
- package/dist/js/node/core/loader/useLoader.js +118 -0
- package/dist/js/node/core/plugin.js +79 -0
- package/dist/js/node/core/runtime-context.js +11 -0
- package/dist/js/node/exports/styled.js +5 -5
- package/dist/js/node/index.js +10 -10
- package/dist/js/node/router/runtime/plugin.js +3 -3
- package/dist/js/node/router/runtime/utils.js +3 -1
- package/dist/js/node/ssr/index.js +4 -0
- package/dist/js/node/ssr/index.node.js +2 -2
- package/dist/js/node/ssr/serverRender/index.js +2 -2
- package/dist/js/node/ssr/serverRender/styledComponent.js +2 -2
- package/dist/js/node/ssr/utils.js +9 -3
- package/dist/js/node/state/cli/index.js +1 -1
- package/dist/js/node/state/runtime/plugin.js +3 -3
- package/dist/js/treeshaking/cli/index.js +1 -3
- package/dist/js/treeshaking/core/app-config.js +13 -0
- package/dist/js/treeshaking/core/compatible.js +255 -0
- package/dist/js/treeshaking/core/index.js +7 -0
- package/dist/js/treeshaking/core/loader/index.js +1 -0
- package/dist/js/treeshaking/core/loader/loaderManager.js +267 -0
- package/dist/js/treeshaking/core/loader/useLoader.js +107 -0
- package/dist/js/treeshaking/core/plugin.js +105 -0
- package/dist/js/treeshaking/core/runtime-context.js +2 -0
- package/dist/js/treeshaking/exports/styled.js +2 -2
- package/dist/js/treeshaking/index.js +1 -1
- package/dist/js/treeshaking/router/runtime/plugin.js +1 -1
- package/dist/js/treeshaking/router/runtime/utils.js +3 -1
- package/dist/js/treeshaking/ssr/index.js +4 -0
- package/dist/js/treeshaking/ssr/index.node.js +1 -1
- package/dist/js/treeshaking/ssr/prefetch.js +2 -2
- package/dist/js/treeshaking/ssr/serverRender/index.js +1 -1
- package/dist/js/treeshaking/ssr/serverRender/styledComponent.js +1 -1
- package/dist/js/treeshaking/ssr/utils.js +8 -3
- package/dist/js/treeshaking/state/cli/index.js +1 -1
- package/dist/js/treeshaking/state/runtime/plugin.js +1 -1
- package/dist/types/core/app-config.d.ts +6 -0
- package/dist/types/core/compatible.d.ts +13 -0
- package/dist/types/core/index.d.ts +9 -0
- package/dist/types/core/loader/index.d.ts +2 -0
- package/dist/types/core/loader/loaderManager.d.ts +57 -0
- package/dist/types/core/loader/useLoader.d.ts +54 -0
- package/dist/types/core/plugin.d.ts +208 -0
- package/dist/types/core/runtime-context.d.ts +13 -0
- package/dist/types/exports/styled.d.ts +2 -2
- package/dist/types/index.d.ts +4 -9
- package/dist/types/router/runtime/plugin.d.ts +1 -1
- package/dist/types/ssr/index.d.ts +2 -2
- package/dist/types/ssr/index.node.d.ts +1 -1
- package/dist/types/ssr/prefetch.d.ts +2 -2
- package/dist/types/ssr/serverRender/entry.d.ts +1 -1
- package/dist/types/ssr/serverRender/index.d.ts +1 -1
- package/dist/types/ssr/serverRender/type.d.ts +1 -1
- package/dist/types/state/runtime/plugin.d.ts +2 -2
- package/lib/types.d.ts +10 -0
- 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;
|