@modern-js/runtime 2.57.1 → 2.57.2-alpha.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/dist/cjs/cli/ssr/index.js +14 -1
- package/dist/cjs/core/browser/hydrate.js +9 -25
- package/dist/cjs/core/browser/index.js +3 -5
- package/dist/cjs/core/compatible.js +6 -19
- package/dist/cjs/core/react/index.js +1 -10
- package/dist/cjs/core/react/wrapper.js +44 -0
- package/dist/cjs/core/server/stream/shared.js +4 -16
- package/dist/cjs/core/server/string/index.js +4 -6
- package/dist/cjs/core/server/string/prefetch.js +7 -21
- package/dist/esm/cli/ssr/index.js +16 -1
- package/dist/esm/core/browser/hydrate.js +9 -15
- package/dist/esm/core/browser/index.js +3 -5
- package/dist/esm/core/compatible.js +5 -22
- package/dist/esm/core/react/index.js +2 -14
- package/dist/esm/core/react/wrapper.js +10 -0
- package/dist/esm/core/server/stream/shared.js +4 -6
- package/dist/esm/core/server/string/index.js +4 -6
- package/dist/esm/core/server/string/prefetch.js +7 -11
- package/dist/esm-node/cli/ssr/index.js +14 -1
- package/dist/esm-node/core/browser/hydrate.js +9 -15
- package/dist/esm-node/core/browser/index.js +3 -5
- package/dist/esm-node/core/compatible.js +6 -19
- package/dist/esm-node/core/react/index.js +2 -11
- package/dist/esm-node/core/react/wrapper.js +10 -0
- package/dist/esm-node/core/server/stream/shared.js +4 -6
- package/dist/esm-node/core/server/string/index.js +4 -6
- package/dist/esm-node/core/server/string/prefetch.js +7 -11
- package/dist/index.js +635 -0
- package/dist/types/core/compatible.d.ts +1 -1
- package/dist/types/core/react/index.d.ts +1 -1
- package/dist/types/core/react/wrapper.d.ts +3 -0
- package/package.json +5 -5
package/dist/index.js
ADDED
|
@@ -0,0 +1,635 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __defProps = Object.defineProperties;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
7
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
8
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
9
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
10
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
11
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
12
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
13
|
+
var __spreadValues = (a, b) => {
|
|
14
|
+
for (var prop in b || (b = {}))
|
|
15
|
+
if (__hasOwnProp.call(b, prop))
|
|
16
|
+
__defNormalProp(a, prop, b[prop]);
|
|
17
|
+
if (__getOwnPropSymbols)
|
|
18
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
19
|
+
if (__propIsEnum.call(b, prop))
|
|
20
|
+
__defNormalProp(a, prop, b[prop]);
|
|
21
|
+
}
|
|
22
|
+
return a;
|
|
23
|
+
};
|
|
24
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
25
|
+
var __objRest = (source, exclude) => {
|
|
26
|
+
var target = {};
|
|
27
|
+
for (var prop in source)
|
|
28
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
29
|
+
target[prop] = source[prop];
|
|
30
|
+
if (source != null && __getOwnPropSymbols)
|
|
31
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
32
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
33
|
+
target[prop] = source[prop];
|
|
34
|
+
}
|
|
35
|
+
return target;
|
|
36
|
+
};
|
|
37
|
+
var __export = (target, all) => {
|
|
38
|
+
for (var name in all)
|
|
39
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
40
|
+
};
|
|
41
|
+
var __copyProps = (to, from, except, desc) => {
|
|
42
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
43
|
+
for (let key of __getOwnPropNames(from))
|
|
44
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
45
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
46
|
+
}
|
|
47
|
+
return to;
|
|
48
|
+
};
|
|
49
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
50
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
51
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
52
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
53
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
54
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
55
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
56
|
+
mod
|
|
57
|
+
));
|
|
58
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
59
|
+
var __async = (__this, __arguments, generator) => {
|
|
60
|
+
return new Promise((resolve, reject) => {
|
|
61
|
+
var fulfilled = (value) => {
|
|
62
|
+
try {
|
|
63
|
+
step(generator.next(value));
|
|
64
|
+
} catch (e) {
|
|
65
|
+
reject(e);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
var rejected = (value) => {
|
|
69
|
+
try {
|
|
70
|
+
step(generator.throw(value));
|
|
71
|
+
} catch (e) {
|
|
72
|
+
reject(e);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
76
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// src/index.ts
|
|
81
|
+
var src_exports = {};
|
|
82
|
+
__export(src_exports, {
|
|
83
|
+
RuntimeReactContext: () => RuntimeReactContext,
|
|
84
|
+
bootstrap: () => bootstrap,
|
|
85
|
+
createApp: () => createApp,
|
|
86
|
+
defineConfig: () => defineConfig,
|
|
87
|
+
defineRuntimeConfig: () => defineRuntimeConfig,
|
|
88
|
+
isBrowser: () => isBrowser,
|
|
89
|
+
useLoader: () => useLoader_default,
|
|
90
|
+
useRuntimeContext: () => useRuntimeContext
|
|
91
|
+
});
|
|
92
|
+
module.exports = __toCommonJS(src_exports);
|
|
93
|
+
|
|
94
|
+
// src/common.ts
|
|
95
|
+
var isBrowser = () => typeof window !== "undefined" && window.name !== "nodejs";
|
|
96
|
+
|
|
97
|
+
// src/core/index.ts
|
|
98
|
+
var core_exports = {};
|
|
99
|
+
__export(core_exports, {
|
|
100
|
+
RuntimeReactContext: () => RuntimeReactContext,
|
|
101
|
+
ServerRouterContext: () => ServerRouterContext,
|
|
102
|
+
bootstrap: () => bootstrap,
|
|
103
|
+
createApp: () => createApp,
|
|
104
|
+
defineConfig: () => defineConfig,
|
|
105
|
+
defineRuntimeConfig: () => defineRuntimeConfig,
|
|
106
|
+
getConfig: () => getConfig,
|
|
107
|
+
runtime: () => runtime,
|
|
108
|
+
useLoader: () => useLoader_default,
|
|
109
|
+
useRuntimeContext: () => useRuntimeContext
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// src/core/plugin/base.ts
|
|
113
|
+
var import_plugin = require("@modern-js/plugin");
|
|
114
|
+
var client = (0, import_plugin.createAsyncPipeline)();
|
|
115
|
+
var server = (0, import_plugin.createAsyncPipeline)();
|
|
116
|
+
var hoc = (0, import_plugin.createPipeline)();
|
|
117
|
+
var init = (0, import_plugin.createAsyncPipeline)();
|
|
118
|
+
var pickContext = (0, import_plugin.createPipeline)();
|
|
119
|
+
var runtimeHooks = {
|
|
120
|
+
hoc,
|
|
121
|
+
init,
|
|
122
|
+
client,
|
|
123
|
+
server,
|
|
124
|
+
pickContext
|
|
125
|
+
};
|
|
126
|
+
var createRuntime = () => (0, import_plugin.createManager)(runtimeHooks);
|
|
127
|
+
var runtime = createRuntime();
|
|
128
|
+
|
|
129
|
+
// src/core/plugin/runner.ts
|
|
130
|
+
var globalRunner;
|
|
131
|
+
function setGlobalRunner(runner) {
|
|
132
|
+
globalRunner = runner;
|
|
133
|
+
}
|
|
134
|
+
function getGlobalRunner() {
|
|
135
|
+
if (globalRunner) {
|
|
136
|
+
return globalRunner;
|
|
137
|
+
}
|
|
138
|
+
const runner = runtime.init();
|
|
139
|
+
setGlobalRunner(runner);
|
|
140
|
+
return runner;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// src/core/plugin/index.ts
|
|
144
|
+
function registerPlugin(internalPlugins, runtimeConfig, customRuntime) {
|
|
145
|
+
const { plugins = [] } = runtimeConfig || {};
|
|
146
|
+
(customRuntime || runtime).usePlugin(...internalPlugins, ...plugins);
|
|
147
|
+
const runner = (customRuntime || runtime).init();
|
|
148
|
+
setGlobalRunner(runner);
|
|
149
|
+
return runner;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// src/core/config.ts
|
|
153
|
+
var APP_CONFIG_SYMBOL = "config";
|
|
154
|
+
var getConfig = (Component) => (
|
|
155
|
+
// @ts-expect-error
|
|
156
|
+
Component[APP_CONFIG_SYMBOL]
|
|
157
|
+
);
|
|
158
|
+
var defineConfig = (Component, config) => {
|
|
159
|
+
Component[APP_CONFIG_SYMBOL] = config;
|
|
160
|
+
return Component;
|
|
161
|
+
};
|
|
162
|
+
var defineRuntimeConfig = (config) => config;
|
|
163
|
+
|
|
164
|
+
// src/core/compatible.tsx
|
|
165
|
+
var import_react2 = __toESM(require("react"));
|
|
166
|
+
var import_hoist_non_react_statics = __toESM(require("hoist-non-react-statics"));
|
|
167
|
+
var import_constants2 = require("@modern-js/utils/universal/constants");
|
|
168
|
+
|
|
169
|
+
// src/core/context/runtime.ts
|
|
170
|
+
var import_react = require("react");
|
|
171
|
+
var import_constants = require("@modern-js/utils/universal/constants");
|
|
172
|
+
|
|
173
|
+
// src/core/loader/loaderManager.ts
|
|
174
|
+
var import_invariant = __toESM(require("invariant"));
|
|
175
|
+
var createGetId = () => {
|
|
176
|
+
const idCache = /* @__PURE__ */ new Map();
|
|
177
|
+
return (objectId) => {
|
|
178
|
+
const cachedId = idCache.get(objectId);
|
|
179
|
+
if (cachedId) {
|
|
180
|
+
return cachedId;
|
|
181
|
+
}
|
|
182
|
+
const id = JSON.stringify(objectId);
|
|
183
|
+
(0, import_invariant.default)(id, "params should be not null value");
|
|
184
|
+
idCache.set(objectId, id);
|
|
185
|
+
return id;
|
|
186
|
+
};
|
|
187
|
+
};
|
|
188
|
+
var createLoader = (id, initialData = {
|
|
189
|
+
loading: false,
|
|
190
|
+
reloading: false,
|
|
191
|
+
data: void 0,
|
|
192
|
+
error: void 0
|
|
193
|
+
}, loaderFn, skip = false) => {
|
|
194
|
+
let promise;
|
|
195
|
+
let status = 0 /* idle */;
|
|
196
|
+
let { data, error } = initialData;
|
|
197
|
+
let hasLoaded = false;
|
|
198
|
+
const handlers = /* @__PURE__ */ new Set();
|
|
199
|
+
const load = () => __async(void 0, null, function* () {
|
|
200
|
+
if (skip) {
|
|
201
|
+
return promise;
|
|
202
|
+
}
|
|
203
|
+
if (status === 1 /* loading */) {
|
|
204
|
+
return promise;
|
|
205
|
+
}
|
|
206
|
+
status = 1 /* loading */;
|
|
207
|
+
notify();
|
|
208
|
+
promise = loaderFn().then((value) => {
|
|
209
|
+
data = value;
|
|
210
|
+
error = null;
|
|
211
|
+
status = 2 /* fulfilled */;
|
|
212
|
+
}).catch((e) => {
|
|
213
|
+
error = e;
|
|
214
|
+
data = null;
|
|
215
|
+
status = 3 /* rejected */;
|
|
216
|
+
}).finally(() => {
|
|
217
|
+
promise = null;
|
|
218
|
+
hasLoaded = true;
|
|
219
|
+
notify();
|
|
220
|
+
});
|
|
221
|
+
return promise;
|
|
222
|
+
});
|
|
223
|
+
const getResult = () => ({
|
|
224
|
+
loading: !hasLoaded && status === 1 /* loading */,
|
|
225
|
+
reloading: hasLoaded && status === 1 /* loading */,
|
|
226
|
+
data,
|
|
227
|
+
error: error instanceof Error ? `${error.message}` : error,
|
|
228
|
+
// redundant fields for ssr log
|
|
229
|
+
_error: error
|
|
230
|
+
});
|
|
231
|
+
const notify = () => {
|
|
232
|
+
[...handlers].forEach((handler) => {
|
|
233
|
+
handler(status, getResult());
|
|
234
|
+
});
|
|
235
|
+
};
|
|
236
|
+
const onChange = (handler) => {
|
|
237
|
+
handlers.add(handler);
|
|
238
|
+
return () => {
|
|
239
|
+
handlers.delete(handler);
|
|
240
|
+
};
|
|
241
|
+
};
|
|
242
|
+
return {
|
|
243
|
+
get result() {
|
|
244
|
+
return getResult();
|
|
245
|
+
},
|
|
246
|
+
get promise() {
|
|
247
|
+
return promise;
|
|
248
|
+
},
|
|
249
|
+
onChange,
|
|
250
|
+
load
|
|
251
|
+
};
|
|
252
|
+
};
|
|
253
|
+
var createLoaderManager = (initialDataMap, managerOptions = {}) => {
|
|
254
|
+
const { skipStatic = false, skipNonStatic = false } = managerOptions;
|
|
255
|
+
const loadersMap = /* @__PURE__ */ new Map();
|
|
256
|
+
const getId = createGetId();
|
|
257
|
+
const add = (loaderFn, loaderOptions) => {
|
|
258
|
+
const id = getId(loaderOptions.params);
|
|
259
|
+
let loader = loadersMap.get(id);
|
|
260
|
+
const cache = loaderOptions._cache;
|
|
261
|
+
if (!loader || cache === false) {
|
|
262
|
+
const ignoreNonStatic = skipNonStatic && !loaderOptions.static;
|
|
263
|
+
const ignoreStatic = skipStatic && loaderOptions.static;
|
|
264
|
+
const skipExec = ignoreNonStatic || ignoreStatic;
|
|
265
|
+
loader = createLoader(
|
|
266
|
+
id,
|
|
267
|
+
typeof initialDataMap[id] !== "undefined" ? initialDataMap[id] : { data: loaderOptions.initialData },
|
|
268
|
+
loaderFn,
|
|
269
|
+
// Todo whether static loader is exec when CSR
|
|
270
|
+
skipExec
|
|
271
|
+
);
|
|
272
|
+
loadersMap.set(id, loader);
|
|
273
|
+
}
|
|
274
|
+
return id;
|
|
275
|
+
};
|
|
276
|
+
const get = (id) => loadersMap.get(id);
|
|
277
|
+
const hasPendingLoaders = () => {
|
|
278
|
+
for (const loader of loadersMap.values()) {
|
|
279
|
+
const { promise } = loader;
|
|
280
|
+
if (promise instanceof Promise) {
|
|
281
|
+
return true;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return false;
|
|
285
|
+
};
|
|
286
|
+
const awaitPendingLoaders = () => __async(void 0, null, function* () {
|
|
287
|
+
const pendingLoaders = [];
|
|
288
|
+
for (const [id, loader] of loadersMap) {
|
|
289
|
+
const { promise } = loader;
|
|
290
|
+
if (promise instanceof Promise) {
|
|
291
|
+
pendingLoaders.push([id, loader]);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
yield Promise.all(pendingLoaders.map((item) => item[1].promise));
|
|
295
|
+
return pendingLoaders.reduce(
|
|
296
|
+
(res, [id, loader]) => {
|
|
297
|
+
res[id] = loader.result;
|
|
298
|
+
return res;
|
|
299
|
+
},
|
|
300
|
+
{}
|
|
301
|
+
);
|
|
302
|
+
});
|
|
303
|
+
return {
|
|
304
|
+
hasPendingLoaders,
|
|
305
|
+
awaitPendingLoaders,
|
|
306
|
+
add,
|
|
307
|
+
get
|
|
308
|
+
};
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
// src/core/context/runtime.ts
|
|
312
|
+
var RuntimeReactContext = (0, import_react.createContext)({});
|
|
313
|
+
var ServerRouterContext = (0, import_react.createContext)({});
|
|
314
|
+
|
|
315
|
+
// src/core/compatible.tsx
|
|
316
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
317
|
+
var IS_REACT18 = process.env.IS_REACT18 === "true";
|
|
318
|
+
function isClientArgs(id) {
|
|
319
|
+
return typeof id === "string" || typeof HTMLElement !== "undefined" && id instanceof HTMLElement;
|
|
320
|
+
}
|
|
321
|
+
var getInitialContext = (runner) => ({
|
|
322
|
+
loaderManager: createLoaderManager({}),
|
|
323
|
+
runner,
|
|
324
|
+
isBrowser: true,
|
|
325
|
+
routeManifest: typeof window !== "undefined" && window[import_constants2.ROUTE_MANIFEST]
|
|
326
|
+
});
|
|
327
|
+
var createApp = ({
|
|
328
|
+
plugins,
|
|
329
|
+
runtime: runtime3,
|
|
330
|
+
props: globalProps
|
|
331
|
+
}) => {
|
|
332
|
+
const runner = registerPlugin(plugins, { plugins: [] }, runtime3);
|
|
333
|
+
return (App) => {
|
|
334
|
+
const WrapperComponent = (props) => {
|
|
335
|
+
return import_react2.default.createElement(
|
|
336
|
+
App || import_react2.default.Fragment,
|
|
337
|
+
App ? __spreadValues({}, props) : null,
|
|
338
|
+
App ? props.children : import_react2.default.Children.map(
|
|
339
|
+
props.children,
|
|
340
|
+
(child) => import_react2.default.isValidElement(child) ? import_react2.default.cloneElement(child, __spreadValues(__spreadValues({}, child.props), props)) : child
|
|
341
|
+
)
|
|
342
|
+
);
|
|
343
|
+
};
|
|
344
|
+
if (App) {
|
|
345
|
+
(0, import_hoist_non_react_statics.default)(WrapperComponent, App);
|
|
346
|
+
}
|
|
347
|
+
const HOCApp = runner.hoc(
|
|
348
|
+
{ App: WrapperComponent, config: globalProps || {} },
|
|
349
|
+
{
|
|
350
|
+
onLast: ({ App: App2 }) => {
|
|
351
|
+
const WrapComponent = (_a) => {
|
|
352
|
+
var _b = _a, { context } = _b, props = __objRest(_b, ["context"]);
|
|
353
|
+
let contextValue = context;
|
|
354
|
+
if (!(contextValue == null ? void 0 : contextValue.runner)) {
|
|
355
|
+
contextValue = getInitialContext(runner);
|
|
356
|
+
runner.init(
|
|
357
|
+
{ context: contextValue },
|
|
358
|
+
{
|
|
359
|
+
onLast: ({ context: context1 }) => {
|
|
360
|
+
var _a2;
|
|
361
|
+
return (_a2 = App2 == null ? void 0 : App2.init) == null ? void 0 : _a2.call(App2, context1);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
);
|
|
365
|
+
}
|
|
366
|
+
const mergedProps = __spreadValues(__spreadValues({}, props), globalProps);
|
|
367
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(RuntimeReactContext.Provider, { value: contextValue, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(App2, __spreadValues({}, mergedProps)) });
|
|
368
|
+
};
|
|
369
|
+
return (0, import_hoist_non_react_statics.default)(WrapComponent, App2);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
);
|
|
373
|
+
return HOCApp;
|
|
374
|
+
};
|
|
375
|
+
};
|
|
376
|
+
var bootstrap = (BootApp, id, root, ReactDOM) => __async(void 0, null, function* () {
|
|
377
|
+
var _a, _b, _c, _d, _e, _f;
|
|
378
|
+
const App = BootApp;
|
|
379
|
+
const runner = getGlobalRunner();
|
|
380
|
+
const context = getInitialContext(runner);
|
|
381
|
+
const runInit = (_context) => runner.init(
|
|
382
|
+
{ context: _context },
|
|
383
|
+
{
|
|
384
|
+
onLast: ({ context: context1 }) => {
|
|
385
|
+
var _a2;
|
|
386
|
+
return (_a2 = App == null ? void 0 : App.init) == null ? void 0 : _a2.call(App, context1);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
);
|
|
390
|
+
if (!id) {
|
|
391
|
+
return import_react2.default.createElement(App, {
|
|
392
|
+
context
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
const isBrowser2 = typeof window !== "undefined" && window.name !== "nodejs";
|
|
396
|
+
if (isBrowser2) {
|
|
397
|
+
if (isClientArgs(id)) {
|
|
398
|
+
const ssrData = window._SSR_DATA;
|
|
399
|
+
const loadersData = ((_a = ssrData == null ? void 0 : ssrData.data) == null ? void 0 : _a.loadersData) || {};
|
|
400
|
+
const initialLoadersState = Object.keys(loadersData).reduce(
|
|
401
|
+
(res, key) => {
|
|
402
|
+
const loaderData = loadersData[key];
|
|
403
|
+
if (loaderData.loading !== false) {
|
|
404
|
+
return res;
|
|
405
|
+
}
|
|
406
|
+
res[key] = loaderData;
|
|
407
|
+
return res;
|
|
408
|
+
},
|
|
409
|
+
{}
|
|
410
|
+
);
|
|
411
|
+
Object.assign(context, __spreadValues({
|
|
412
|
+
loaderManager: createLoaderManager(initialLoadersState, {
|
|
413
|
+
skipStatic: true
|
|
414
|
+
})
|
|
415
|
+
}, ssrData ? { ssrContext: ssrData == null ? void 0 : ssrData.context } : {}));
|
|
416
|
+
context.initialData = (_b = ssrData == null ? void 0 : ssrData.data) == null ? void 0 : _b.initialData;
|
|
417
|
+
const initialData = yield runInit(context);
|
|
418
|
+
if (initialData) {
|
|
419
|
+
context.initialData = initialData;
|
|
420
|
+
}
|
|
421
|
+
const rootElement = typeof id !== "string" ? id : document.getElementById(id || "root");
|
|
422
|
+
if (!ReactDOM) {
|
|
423
|
+
throw Error("The `bootstrap` need provide `ReactDOM` parameter");
|
|
424
|
+
}
|
|
425
|
+
const ModernRender = (App2) => {
|
|
426
|
+
if (IS_REACT18) {
|
|
427
|
+
if (root) {
|
|
428
|
+
root.render(App2);
|
|
429
|
+
} else if (ReactDOM.createRoot) {
|
|
430
|
+
ReactDOM.createRoot(rootElement).render(App2);
|
|
431
|
+
} else {
|
|
432
|
+
throw Error(
|
|
433
|
+
"The `bootstrap` `ReactDOM` parameter needs to provide the `createRoot` method"
|
|
434
|
+
);
|
|
435
|
+
}
|
|
436
|
+
} else {
|
|
437
|
+
if (!ReactDOM.render) {
|
|
438
|
+
throw Error(
|
|
439
|
+
"The `bootstrap` `ReactDOM` parameter needs to provide the `render` method"
|
|
440
|
+
);
|
|
441
|
+
}
|
|
442
|
+
ReactDOM.render(App2, rootElement);
|
|
443
|
+
}
|
|
444
|
+
};
|
|
445
|
+
const ModernHydrate = (App2, callback) => {
|
|
446
|
+
if (IS_REACT18) {
|
|
447
|
+
if (!ReactDOM.hydrateRoot) {
|
|
448
|
+
throw Error(
|
|
449
|
+
"The `bootstrap` `ReactDOM` parameter needs to provide the `hydrateRoot` method"
|
|
450
|
+
);
|
|
451
|
+
}
|
|
452
|
+
ReactDOM.hydrateRoot(rootElement, App2);
|
|
453
|
+
} else {
|
|
454
|
+
if (!ReactDOM.hydrate) {
|
|
455
|
+
throw Error(
|
|
456
|
+
"The `bootstrap` `ReactDOM` parameter needs to provide the `hydrate` method"
|
|
457
|
+
);
|
|
458
|
+
}
|
|
459
|
+
ReactDOM.hydrate(App2, rootElement, callback);
|
|
460
|
+
}
|
|
461
|
+
};
|
|
462
|
+
return runner.client(
|
|
463
|
+
{
|
|
464
|
+
App,
|
|
465
|
+
context,
|
|
466
|
+
ModernRender,
|
|
467
|
+
ModernHydrate
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
onLast: ({ App: App2 }) => {
|
|
471
|
+
ModernRender(import_react2.default.createElement(App2, { context }));
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
);
|
|
475
|
+
} else {
|
|
476
|
+
throw Error(
|
|
477
|
+
"`bootstrap` needs id in browser environment, it needs to be string or element"
|
|
478
|
+
);
|
|
479
|
+
}
|
|
480
|
+
} else {
|
|
481
|
+
Object.assign(context, {
|
|
482
|
+
ssrContext: id,
|
|
483
|
+
isBrowser: false,
|
|
484
|
+
loaderManager: createLoaderManager(
|
|
485
|
+
{},
|
|
486
|
+
{
|
|
487
|
+
skipNonStatic: id.staticGenerate,
|
|
488
|
+
// if not static generate, only non-static loader can exec on prod env
|
|
489
|
+
skipStatic: process.env.NODE_ENV === "production" && !id.staticGenerate
|
|
490
|
+
}
|
|
491
|
+
)
|
|
492
|
+
});
|
|
493
|
+
const isRedirectResponse = (result) => {
|
|
494
|
+
var _a2;
|
|
495
|
+
if (typeof Response !== "undefined" && // fix: ssg workflow doesn't inject Web Response
|
|
496
|
+
result instanceof Response && result.status >= 300 && result.status <= 399) {
|
|
497
|
+
const { status } = result;
|
|
498
|
+
const redirectUrl = result.headers.get("Location") || "/";
|
|
499
|
+
const { ssrContext } = context;
|
|
500
|
+
if (ssrContext) {
|
|
501
|
+
ssrContext.res && (ssrContext.res.statusCode = status);
|
|
502
|
+
(_a2 = ssrContext.res) == null ? void 0 : _a2.setHeader("Location", redirectUrl);
|
|
503
|
+
ssrContext.redirection = ssrContext.redirection || {};
|
|
504
|
+
ssrContext.redirection.status = status;
|
|
505
|
+
ssrContext.redirection.url = redirectUrl;
|
|
506
|
+
}
|
|
507
|
+
return true;
|
|
508
|
+
}
|
|
509
|
+
return false;
|
|
510
|
+
};
|
|
511
|
+
const initialData = yield runInit(context);
|
|
512
|
+
if (!isRedirectResponse(initialData)) {
|
|
513
|
+
context.initialData = initialData;
|
|
514
|
+
if (((_c = context.routerContext) == null ? void 0 : _c.statusCode) && ((_d = context.routerContext) == null ? void 0 : _d.statusCode) !== 200) {
|
|
515
|
+
(_f = context.ssrContext) == null ? void 0 : _f.response.status((_e = context.routerContext) == null ? void 0 : _e.statusCode);
|
|
516
|
+
}
|
|
517
|
+
return runner.server({
|
|
518
|
+
App,
|
|
519
|
+
context
|
|
520
|
+
});
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
var useRuntimeContext = () => {
|
|
525
|
+
const context = (0, import_react2.useContext)(RuntimeReactContext);
|
|
526
|
+
const memoizedContext = (0, import_react2.useMemo)(
|
|
527
|
+
() => context.runner.pickContext(
|
|
528
|
+
{ context, pickedContext: {} },
|
|
529
|
+
{
|
|
530
|
+
onLast: ({ pickedContext }) => pickedContext
|
|
531
|
+
}
|
|
532
|
+
),
|
|
533
|
+
[context]
|
|
534
|
+
);
|
|
535
|
+
return memoizedContext;
|
|
536
|
+
};
|
|
537
|
+
|
|
538
|
+
// src/core/loader/useLoader.ts
|
|
539
|
+
var import_react3 = require("react");
|
|
540
|
+
var import_invariant2 = __toESM(require("invariant"));
|
|
541
|
+
var useLoader = (loaderFn, options = { params: void 0 }) => {
|
|
542
|
+
const context = (0, import_react3.useContext)(RuntimeReactContext);
|
|
543
|
+
const isSSRRender = Boolean(context.ssr);
|
|
544
|
+
const { loaderManager } = context;
|
|
545
|
+
const loaderRef = (0, import_react3.useRef)();
|
|
546
|
+
const unlistenLoaderChangeRef = (0, import_react3.useRef)(null);
|
|
547
|
+
if (isSSRRender && Object.prototype.hasOwnProperty.call(options, "_cache")) {
|
|
548
|
+
delete options._cache;
|
|
549
|
+
}
|
|
550
|
+
const load = (0, import_react3.useCallback)(
|
|
551
|
+
(params) => {
|
|
552
|
+
var _a, _b, _c, _d, _e, _f;
|
|
553
|
+
if (typeof params === "undefined") {
|
|
554
|
+
return (_a = loaderRef.current) == null ? void 0 : _a.load();
|
|
555
|
+
}
|
|
556
|
+
const id = loaderManager.add(
|
|
557
|
+
() => {
|
|
558
|
+
try {
|
|
559
|
+
const res2 = loaderFn(context, params);
|
|
560
|
+
if (res2 instanceof Promise) {
|
|
561
|
+
return res2;
|
|
562
|
+
}
|
|
563
|
+
return Promise.resolve(res2);
|
|
564
|
+
} catch (e) {
|
|
565
|
+
return Promise.reject(e);
|
|
566
|
+
}
|
|
567
|
+
},
|
|
568
|
+
__spreadProps(__spreadValues({}, options), {
|
|
569
|
+
params
|
|
570
|
+
})
|
|
571
|
+
);
|
|
572
|
+
loaderRef.current = loaderManager.get(id);
|
|
573
|
+
(_b = unlistenLoaderChangeRef.current) == null ? void 0 : _b.call(unlistenLoaderChangeRef);
|
|
574
|
+
if (isSSRRender) {
|
|
575
|
+
return void 0;
|
|
576
|
+
}
|
|
577
|
+
if (options.skip) {
|
|
578
|
+
return void 0;
|
|
579
|
+
}
|
|
580
|
+
if (context._hydration && ((_e = (_d = (_c = window == null ? void 0 : window._SSR_DATA) == null ? void 0 : _c.data) == null ? void 0 : _d.loadersData[id]) == null ? void 0 : _e.error) === null) {
|
|
581
|
+
return void 0;
|
|
582
|
+
}
|
|
583
|
+
const res = loaderRef.current.load();
|
|
584
|
+
unlistenLoaderChangeRef.current = (_f = loaderRef.current) == null ? void 0 : _f.onChange(
|
|
585
|
+
(_status, _result) => {
|
|
586
|
+
var _a2, _b2;
|
|
587
|
+
setResult(_result);
|
|
588
|
+
if (_status === 2 /* fulfilled */) {
|
|
589
|
+
(_a2 = options == null ? void 0 : options.onSuccess) == null ? void 0 : _a2.call(options, _result.data);
|
|
590
|
+
}
|
|
591
|
+
if (_status === 3 /* rejected */) {
|
|
592
|
+
(_b2 = options == null ? void 0 : options.onError) == null ? void 0 : _b2.call(options, _result.error);
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
);
|
|
596
|
+
return res;
|
|
597
|
+
},
|
|
598
|
+
[options.skip]
|
|
599
|
+
);
|
|
600
|
+
(0, import_react3.useEffect)(
|
|
601
|
+
() => () => {
|
|
602
|
+
var _a;
|
|
603
|
+
(_a = unlistenLoaderChangeRef.current) == null ? void 0 : _a.call(unlistenLoaderChangeRef);
|
|
604
|
+
},
|
|
605
|
+
[]
|
|
606
|
+
);
|
|
607
|
+
(0, import_react3.useMemo)(() => {
|
|
608
|
+
var _a;
|
|
609
|
+
const p = (_a = options.params) != null ? _a : loaderFn.id;
|
|
610
|
+
(0, import_invariant2.default)(
|
|
611
|
+
typeof p !== "undefined" && p !== null,
|
|
612
|
+
"Params is required in useLoader"
|
|
613
|
+
);
|
|
614
|
+
load(p);
|
|
615
|
+
}, [options.params]);
|
|
616
|
+
const [result, setResult] = (0, import_react3.useState)(loaderRef.current.result);
|
|
617
|
+
return __spreadProps(__spreadValues({}, result), {
|
|
618
|
+
reload: load
|
|
619
|
+
});
|
|
620
|
+
};
|
|
621
|
+
var useLoader_default = useLoader;
|
|
622
|
+
|
|
623
|
+
// src/core/index.ts
|
|
624
|
+
__reExport(core_exports, require("@modern-js/plugin"));
|
|
625
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
626
|
+
0 && (module.exports = {
|
|
627
|
+
RuntimeReactContext,
|
|
628
|
+
bootstrap,
|
|
629
|
+
createApp,
|
|
630
|
+
defineConfig,
|
|
631
|
+
defineRuntimeConfig,
|
|
632
|
+
isBrowser,
|
|
633
|
+
useLoader,
|
|
634
|
+
useRuntimeContext
|
|
635
|
+
});
|
|
@@ -11,7 +11,7 @@ export type CreateAppOptions = {
|
|
|
11
11
|
runtime?: typeof runtime;
|
|
12
12
|
props?: any;
|
|
13
13
|
};
|
|
14
|
-
export declare const createApp: ({ plugins, runtime, props: globalProps, }: CreateAppOptions) => (App?: React.ComponentType<any>) => (
|
|
14
|
+
export declare const createApp: ({ plugins, runtime, props: globalProps, }: CreateAppOptions) => (App?: React.ComponentType<any>) => (props: any) => JSX.Element;
|
|
15
15
|
type BootStrap<T = unknown> = (App: React.ComponentType, id: string | HTMLElement | RuntimeContext, root?: any, ReactDOM?: {
|
|
16
16
|
render?: Renderer;
|
|
17
17
|
hydrate?: Renderer;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
export declare function createRoot(UserApp?: React.ComponentType | null):
|
|
2
|
+
export declare function createRoot(UserApp?: React.ComponentType | null): React.ComponentType<any>;
|
package/package.json
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"modern",
|
|
16
16
|
"modern.js"
|
|
17
17
|
],
|
|
18
|
-
"version": "2.57.
|
|
18
|
+
"version": "2.57.2-alpha.0",
|
|
19
19
|
"engines": {
|
|
20
20
|
"node": ">=14.17.6"
|
|
21
21
|
},
|
|
@@ -200,9 +200,9 @@
|
|
|
200
200
|
"styled-components": "^5.3.1",
|
|
201
201
|
"@swc/helpers": "0.5.3",
|
|
202
202
|
"@modern-js/plugin": "2.57.1",
|
|
203
|
+
"@modern-js/utils": "2.57.1",
|
|
203
204
|
"@modern-js/types": "2.57.1",
|
|
204
205
|
"@modern-js/plugin-data-loader": "2.57.1",
|
|
205
|
-
"@modern-js/utils": "2.57.1",
|
|
206
206
|
"@modern-js/runtime-utils": "2.57.1"
|
|
207
207
|
},
|
|
208
208
|
"peerDependencies": {
|
|
@@ -210,7 +210,7 @@
|
|
|
210
210
|
"react-dom": ">=17"
|
|
211
211
|
},
|
|
212
212
|
"devDependencies": {
|
|
213
|
-
"@rsbuild/core": "1.0.1-beta.
|
|
213
|
+
"@rsbuild/core": "1.0.1-beta.9",
|
|
214
214
|
"@types/cookie": "0.5.1",
|
|
215
215
|
"@remix-run/web-fetch": "^4.1.3",
|
|
216
216
|
"@testing-library/react": "^13.4.0",
|
|
@@ -227,9 +227,9 @@
|
|
|
227
227
|
"typescript": "^5",
|
|
228
228
|
"webpack": "^5.93.0",
|
|
229
229
|
"@modern-js/app-tools": "2.57.1",
|
|
230
|
+
"@modern-js/core": "2.57.1",
|
|
230
231
|
"@scripts/build": "2.57.1",
|
|
231
|
-
"@scripts/jest-config": "2.57.1"
|
|
232
|
-
"@modern-js/core": "2.57.1"
|
|
232
|
+
"@scripts/jest-config": "2.57.1"
|
|
233
233
|
},
|
|
234
234
|
"sideEffects": false,
|
|
235
235
|
"publishConfig": {
|