@modern-js/runtime 1.4.4 → 1.16.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 (88) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/dist/js/modern/cli/index.js +6 -6
  3. package/dist/js/modern/core/app-config.js +10 -0
  4. package/dist/js/modern/core/compatible.js +241 -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 +34 -13
  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/react/withCallback/index.js +17 -0
  19. package/dist/js/modern/ssr/serverRender/helmet.js +2 -2
  20. package/dist/js/modern/ssr/serverRender/index.js +1 -1
  21. package/dist/js/modern/ssr/serverRender/styledComponent.js +1 -1
  22. package/dist/js/modern/ssr/utils.js +9 -3
  23. package/dist/js/modern/state/runtime/plugin.js +1 -1
  24. package/dist/js/node/cli/index.js +5 -5
  25. package/dist/js/node/core/app-config.js +22 -0
  26. package/dist/js/node/core/compatible.js +271 -0
  27. package/dist/js/node/core/index.js +111 -0
  28. package/dist/js/node/core/loader/index.js +15 -0
  29. package/dist/js/node/core/loader/loaderManager.js +201 -0
  30. package/dist/js/node/core/loader/useLoader.js +118 -0
  31. package/dist/js/node/core/plugin.js +79 -0
  32. package/dist/js/node/core/runtime-context.js +11 -0
  33. package/dist/js/node/exports/styled.js +5 -5
  34. package/dist/js/node/index.js +10 -10
  35. package/dist/js/node/router/runtime/plugin.js +3 -3
  36. package/dist/js/node/router/runtime/utils.js +3 -1
  37. package/dist/js/node/ssr/index.js +37 -15
  38. package/dist/js/node/ssr/index.node.js +2 -2
  39. package/dist/js/node/ssr/react/withCallback/index.js +27 -0
  40. package/dist/js/node/ssr/serverRender/helmet.js +2 -2
  41. package/dist/js/node/ssr/serverRender/index.js +2 -2
  42. package/dist/js/node/ssr/serverRender/styledComponent.js +2 -2
  43. package/dist/js/node/ssr/utils.js +9 -3
  44. package/dist/js/node/state/runtime/plugin.js +3 -3
  45. package/dist/js/treeshaking/cli/index.js +6 -6
  46. package/dist/js/treeshaking/core/app-config.js +13 -0
  47. package/dist/js/treeshaking/core/compatible.js +297 -0
  48. package/dist/js/treeshaking/core/index.js +7 -0
  49. package/dist/js/treeshaking/core/loader/index.js +1 -0
  50. package/dist/js/treeshaking/core/loader/loaderManager.js +267 -0
  51. package/dist/js/treeshaking/core/loader/useLoader.js +107 -0
  52. package/dist/js/treeshaking/core/plugin.js +105 -0
  53. package/dist/js/treeshaking/core/runtime-context.js +2 -0
  54. package/dist/js/treeshaking/exports/styled.js +2 -2
  55. package/dist/js/treeshaking/index.js +1 -1
  56. package/dist/js/treeshaking/router/runtime/plugin.js +1 -1
  57. package/dist/js/treeshaking/router/runtime/utils.js +3 -1
  58. package/dist/js/treeshaking/ssr/index.js +45 -33
  59. package/dist/js/treeshaking/ssr/index.node.js +1 -1
  60. package/dist/js/treeshaking/ssr/prefetch.js +2 -2
  61. package/dist/js/treeshaking/ssr/react/withCallback/index.js +16 -0
  62. package/dist/js/treeshaking/ssr/serverRender/helmet.js +2 -2
  63. package/dist/js/treeshaking/ssr/serverRender/index.js +1 -1
  64. package/dist/js/treeshaking/ssr/serverRender/styledComponent.js +1 -1
  65. package/dist/js/treeshaking/ssr/utils.js +8 -3
  66. package/dist/js/treeshaking/state/runtime/plugin.js +1 -1
  67. package/dist/types/core/app-config.d.ts +6 -0
  68. package/dist/types/core/compatible.d.ts +17 -0
  69. package/dist/types/core/index.d.ts +9 -0
  70. package/dist/types/core/loader/index.d.ts +2 -0
  71. package/dist/types/core/loader/loaderManager.d.ts +57 -0
  72. package/dist/types/core/loader/useLoader.d.ts +54 -0
  73. package/dist/types/core/plugin.d.ts +215 -0
  74. package/dist/types/core/runtime-context.d.ts +13 -0
  75. package/dist/types/exports/styled.d.ts +2 -2
  76. package/dist/types/index.d.ts +4 -9
  77. package/dist/types/router/runtime/plugin.d.ts +1 -1
  78. package/dist/types/ssr/index.d.ts +2 -2
  79. package/dist/types/ssr/index.node.d.ts +1 -1
  80. package/dist/types/ssr/prefetch.d.ts +2 -2
  81. package/dist/types/ssr/react/nossr/index.d.ts +1 -1
  82. package/dist/types/ssr/react/withCallback/index.d.ts +5 -0
  83. package/dist/types/ssr/serverRender/entry.d.ts +1 -1
  84. package/dist/types/ssr/serverRender/index.d.ts +1 -1
  85. package/dist/types/ssr/serverRender/type.d.ts +1 -1
  86. package/dist/types/state/runtime/plugin.d.ts +2 -2
  87. package/lib/types.d.ts +10 -0
  88. package/package.json +39 -27
@@ -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;
@@ -0,0 +1,105 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
+ import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
3
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
4
+ import { createManager, createPipeline, createAsyncPipeline } from '@modern-js/plugin';
5
+ import { createLoaderManager } from "./loader/loaderManager";
6
+ var hoc = createPipeline(); // eslint-disable-next-line @typescript-eslint/no-empty-interface
7
+
8
+ var provide = createPipeline();
9
+ var client = createAsyncPipeline();
10
+ var server = createAsyncPipeline();
11
+ var init = createAsyncPipeline();
12
+ var pickContext = createPipeline();
13
+ var runtimeHooks = {
14
+ hoc: hoc,
15
+ provide: provide,
16
+ client: client,
17
+ server: server,
18
+ init: init,
19
+ pickContext: pickContext
20
+ };
21
+ /** All hooks of runtime plugin. */
22
+
23
+ export var createRuntime = function createRuntime() {
24
+ return createManager(runtimeHooks);
25
+ };
26
+ /**
27
+ * register init hook. It would be revoked both ssr and csr.
28
+ */
29
+
30
+ var registerInit = function registerInit(App, _init) {
31
+ var originalInit = App.init;
32
+
33
+ App.init = /*#__PURE__*/function () {
34
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(context) {
35
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
36
+ while (1) {
37
+ switch (_context.prev = _context.next) {
38
+ case 0:
39
+ if (!context.loaderManager) {
40
+ context.loaderManager = createLoaderManager({});
41
+ }
42
+
43
+ _context.next = 3;
44
+ return Promise.all([originalInit === null || originalInit === void 0 ? void 0 : originalInit(context), _init === null || _init === void 0 ? void 0 : _init(context)]);
45
+
46
+ case 3:
47
+ case "end":
48
+ return _context.stop();
49
+ }
50
+ }
51
+ }, _callee);
52
+ }));
53
+
54
+ return function (_x) {
55
+ return _ref.apply(this, arguments);
56
+ };
57
+ }();
58
+ };
59
+ /**
60
+ * register prefetch hook. It would be revoked both ssr and csr.
61
+ * But if ssr success, It wont exec in csr again.
62
+ * If ssr prefetch failed, It will fallback to exec in csr.
63
+ */
64
+
65
+
66
+ var registerPrefetch = function registerPrefetch(App, prefetch) {
67
+ var originalPrefetch = App.prefetch;
68
+
69
+ App.prefetch = /*#__PURE__*/function () {
70
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(context) {
71
+ var originResult, result;
72
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
73
+ while (1) {
74
+ switch (_context2.prev = _context2.next) {
75
+ case 0:
76
+ _context2.next = 2;
77
+ return originalPrefetch === null || originalPrefetch === void 0 ? void 0 : originalPrefetch(context);
78
+
79
+ case 2:
80
+ originResult = _context2.sent;
81
+ _context2.next = 5;
82
+ return prefetch === null || prefetch === void 0 ? void 0 : prefetch(context);
83
+
84
+ case 5:
85
+ result = _context2.sent;
86
+ return _context2.abrupt("return", _objectSpread(_objectSpread({}, originResult), result));
87
+
88
+ case 7:
89
+ case "end":
90
+ return _context2.stop();
91
+ }
92
+ }
93
+ }, _callee2);
94
+ }));
95
+
96
+ return function (_x2) {
97
+ return _ref2.apply(this, arguments);
98
+ };
99
+ }();
100
+ };
101
+
102
+ export var runtime = createRuntime();
103
+ var createPlugin = runtime.createPlugin;
104
+ export { createPlugin };
105
+ export { registerInit, registerPrefetch };
@@ -0,0 +1,2 @@
1
+ import { createContext } from 'react';
2
+ export var RuntimeReactContext = /*#__PURE__*/createContext({});
@@ -1,3 +1,3 @@
1
- import styled from '@modern-js/runtime-core/styled';
1
+ import styled from 'styled-components';
2
2
  export default styled;
3
- export * from '@modern-js/runtime-core/styled';
3
+ export * from 'styled-components';
@@ -1 +1 @@
1
- export { createApp, createPlugin, useLoader, bootstrap, RuntimeReactContext, registerPrefetch, defineConfig, registerInit, useRuntimeContext } from '@modern-js/runtime-core';
1
+ export { createApp, createPlugin, useLoader, bootstrap, RuntimeReactContext, registerPrefetch, defineConfig, registerInit, useRuntimeContext } from "./core";
@@ -2,8 +2,8 @@ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
2
  import React, { useContext } from 'react';
3
3
  import { createBrowserHistory, createHashHistory } from 'history';
4
4
  import { Router, StaticRouter } from 'react-router-dom';
5
- import { RuntimeReactContext } from '@modern-js/runtime-core';
6
5
  import hoistNonReactStatics from 'hoist-non-react-statics';
6
+ import { RuntimeReactContext } from "../../core";
7
7
  import { isBrowser } from "../../common";
8
8
  import { renderRoutes, getLocation, urlJoin } from "./utils";
9
9
  import { jsx as _jsx } from "react/jsx-runtime";
@@ -60,11 +60,13 @@ export function renderRoutes(routesConfig) {
60
60
  });
61
61
  }
62
62
  export function getLocation(serverContext) {
63
+ var _url$replace;
64
+
63
65
  var _ref2 = (serverContext === null || serverContext === void 0 ? void 0 : serverContext.request) || {},
64
66
  pathname = _ref2.pathname,
65
67
  url = _ref2.url;
66
68
 
67
- var cleanUrl = url.replace('http://', '').replace('https://', '');
69
+ var cleanUrl = url === null || url === void 0 ? void 0 : (_url$replace = url.replace('http://', '')) === null || _url$replace === void 0 ? void 0 : _url$replace.replace('https://', '');
68
70
  var index = (cleanUrl || '').indexOf(pathname);
69
71
 
70
72
  if (index === -1) {
@@ -1,11 +1,13 @@
1
1
  import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
2
2
  import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
3
3
  import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
4
- import ReactDOM from 'react-dom';
5
4
  import { loadableReady } from '@loadable/component';
5
+ import hoistNonReactStatics from 'hoist-non-react-statics';
6
6
  import { RenderLevel } from "./serverRender/type";
7
+ import { WithCallback } from "./react/withCallback";
7
8
  import { formatClient, mockResponse } from "./utils";
8
9
  import { jsx as _jsx } from "react/jsx-runtime";
10
+ var IS_REACT18 = process.env.IS_REACT18 === 'true';
9
11
 
10
12
  var ssr = function ssr() {
11
13
  return {
@@ -17,52 +19,58 @@ var ssr = function ssr() {
17
19
  var _client = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
18
20
  var _window, _window$_SSR_DATA;
19
21
 
20
- var App, context, rootElement, renderLevel, _prefetch, _ref2;
21
-
22
+ var App, context, ModernRender, ModernHydrate, renderLevel;
22
23
  return _regeneratorRuntime().wrap(function _callee$(_context) {
23
24
  while (1) {
24
25
  switch (_context.prev = _context.next) {
25
26
  case 0:
26
- App = _ref.App, context = _ref.context, rootElement = _ref.rootElement;
27
+ App = _ref.App, context = _ref.context, ModernRender = _ref.ModernRender, ModernHydrate = _ref.ModernHydrate;
27
28
  renderLevel = (_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.renderLevel;
28
29
 
29
- if (!(renderLevel === RenderLevel.CLIENT_RENDER)) {
30
- _context.next = 8;
31
- break;
32
- }
33
-
34
- _context.next = 5;
35
- return App === null || App === void 0 ? void 0 : (_prefetch = (_ref2 = App).prefetch) === null || _prefetch === void 0 ? void 0 : _prefetch.call(_ref2, context);
36
-
37
- case 5:
38
- ReactDOM.render( /*#__PURE__*/_jsx(App, {
39
- context: context
40
- }), rootElement);
41
- _context.next = 9;
42
- break;
43
-
44
- case 8:
45
- if (renderLevel === RenderLevel.SERVER_RENDER) {
30
+ if (renderLevel === RenderLevel.CLIENT_RENDER) {
31
+ // prefetch block render while csr
32
+ // await (App as any)?.prefetch?.(context);
33
+ ModernRender( /*#__PURE__*/_jsx(App, {
34
+ context: context
35
+ }));
36
+ } else if (renderLevel === RenderLevel.SERVER_RENDER) {
46
37
  loadableReady(function () {
47
38
  var hydrateContext = _objectSpread(_objectSpread({}, context), {}, {
48
39
  _hydration: true
49
40
  });
50
41
 
51
- ReactDOM.hydrate( /*#__PURE__*/_jsx(App, {
52
- context: hydrateContext
53
- }), rootElement, function () {
42
+ var callback = function callback() {
54
43
  // won't cause component re-render because context's reference identity doesn't change
55
44
  delete hydrateContext._hydration;
56
- });
45
+ }; // callback: https://github.com/reactwg/react-18/discussions/5
46
+
47
+
48
+ if (IS_REACT18) {
49
+ var SSRApp = function SSRApp() {
50
+ return /*#__PURE__*/_jsx(WithCallback, {
51
+ callback: callback,
52
+ children: /*#__PURE__*/_jsx(App, {
53
+ context: hydrateContext
54
+ })
55
+ });
56
+ };
57
+
58
+ SSRApp = hoistNonReactStatics(SSRApp, App);
59
+ ModernHydrate( /*#__PURE__*/_jsx(SSRApp, {}));
60
+ } else {
61
+ ModernHydrate( /*#__PURE__*/_jsx(App, {
62
+ context: hydrateContext
63
+ }), callback);
64
+ }
57
65
  });
58
66
  } else {
59
67
  // unknown renderlevel or renderlevel is server prefetch.
60
- ReactDOM.render( /*#__PURE__*/_jsx(App, {
68
+ ModernHydrate( /*#__PURE__*/_jsx(App, {
61
69
  context: context
62
- }), rootElement);
70
+ }));
63
71
  }
64
72
 
65
- case 9:
73
+ case 3:
66
74
  case "end":
67
75
  return _context.stop();
68
76
  }
@@ -76,13 +84,17 @@ var ssr = function ssr() {
76
84
 
77
85
  return client;
78
86
  }(),
79
- init: function init(_ref3, next) {
87
+ init: function init(_ref2, next) {
80
88
  var _window2, _window2$_SSR_DATA, _window2$_SSR_DATA$co;
81
89
 
82
- var context = _ref3.context;
90
+ var context = _ref2.context;
83
91
  var request = (_window2 = window) === null || _window2 === void 0 ? void 0 : (_window2$_SSR_DATA = _window2._SSR_DATA) === null || _window2$_SSR_DATA === void 0 ? void 0 : (_window2$_SSR_DATA$co = _window2$_SSR_DATA.context) === null || _window2$_SSR_DATA$co === void 0 ? void 0 : _window2$_SSR_DATA$co.request;
84
92
 
85
93
  if (!request) {
94
+ context.ssrContext = _objectSpread(_objectSpread({}, context.ssrContext), {}, {
95
+ response: mockResp,
96
+ request: formatClient({})
97
+ });
86
98
  return next({
87
99
  context: context
88
100
  });
@@ -94,11 +106,11 @@ var ssr = function ssr() {
94
106
  context: context
95
107
  });
96
108
  },
97
- pickContext: function pickContext(_ref4, next) {
109
+ pickContext: function pickContext(_ref3, next) {
98
110
  var _window3, _window3$_SSR_DATA, _window3$_SSR_DATA$co;
99
111
 
100
- var context = _ref4.context,
101
- pickedContext = _ref4.pickedContext;
112
+ var context = _ref3.context,
113
+ pickedContext = _ref3.pickedContext;
102
114
  var request = (_window3 = window) === null || _window3 === void 0 ? void 0 : (_window3$_SSR_DATA = _window3._SSR_DATA) === null || _window3$_SSR_DATA === void 0 ? void 0 : (_window3$_SSR_DATA$co = _window3$_SSR_DATA.context) === null || _window3$_SSR_DATA$co === void 0 ? void 0 : _window3$_SSR_DATA$co.request;
103
115
  var initialData = context.initialData;
104
116
 
@@ -6,7 +6,7 @@ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
6
6
 
7
7
  /* eslint-disable @typescript-eslint/no-require-imports */
8
8
  import path from 'path';
9
- import { registerPrefetch } from '@modern-js/runtime-core';
9
+ import { registerPrefetch } from "../core";
10
10
  import { isBrowser } from "../common";
11
11
  import prefetch from "./prefetch";
12
12
  import { formatServer } from "./utils";
@@ -5,10 +5,10 @@ import fs from 'fs';
5
5
  import { renderToStaticMarkup } from 'react-dom/server';
6
6
  import { run } from '@modern-js/utils/ssr';
7
7
  import { LOADABLE_STATS_FILE } from '@modern-js/utils/constants';
8
- import { ChunkExtractor } from '@loadable/server'; // todo: SSRContext
9
-
8
+ import { ChunkExtractor } from '@loadable/server';
10
9
  import { jsx as _jsx } from "react/jsx-runtime";
11
10
 
11
+ // todo: SSRContext
12
12
  var prefetch = /*#__PURE__*/function () {
13
13
  var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(App, context) {
14
14
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {