@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,63 @@
1
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
+
3
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
+
5
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
+
7
+ import { createManager, createPipeline, createAsyncPipeline } from '@modern-js/plugin';
8
+ import { createLoaderManager } from "./loader/loaderManager";
9
+ const hoc = createPipeline(); // eslint-disable-next-line @typescript-eslint/no-empty-interface
10
+
11
+ const provide = createPipeline();
12
+ const client = createAsyncPipeline();
13
+ const server = createAsyncPipeline();
14
+ const init = createAsyncPipeline();
15
+ const pickContext = createPipeline();
16
+ const runtimeHooks = {
17
+ hoc,
18
+ provide,
19
+ client,
20
+ server,
21
+ init,
22
+ pickContext
23
+ };
24
+ /** All hooks of runtime plugin. */
25
+
26
+ export const createRuntime = () => createManager(runtimeHooks);
27
+ /**
28
+ * register init hook. It would be revoked both ssr and csr.
29
+ */
30
+
31
+ const registerInit = (App, _init) => {
32
+ const originalInit = App.init;
33
+
34
+ App.init = async context => {
35
+ if (!context.loaderManager) {
36
+ context.loaderManager = createLoaderManager({});
37
+ }
38
+
39
+ await Promise.all([originalInit === null || originalInit === void 0 ? void 0 : originalInit(context), _init === null || _init === void 0 ? void 0 : _init(context)]);
40
+ };
41
+ };
42
+ /**
43
+ * register prefetch hook. It would be revoked both ssr and csr.
44
+ * But if ssr success, It wont exec in csr again.
45
+ * If ssr prefetch failed, It will fallback to exec in csr.
46
+ */
47
+
48
+
49
+ const registerPrefetch = (App, prefetch) => {
50
+ const originalPrefetch = App.prefetch;
51
+
52
+ App.prefetch = async context => {
53
+ const originResult = await (originalPrefetch === null || originalPrefetch === void 0 ? void 0 : originalPrefetch(context));
54
+ const result = await (prefetch === null || prefetch === void 0 ? void 0 : prefetch(context));
55
+ return _objectSpread(_objectSpread({}, originResult), result);
56
+ };
57
+ };
58
+
59
+ export const runtime = createRuntime();
60
+ export const {
61
+ createPlugin
62
+ } = runtime;
63
+ export { registerInit, registerPrefetch };
@@ -0,0 +1,2 @@
1
+ import { createContext } from 'react';
2
+ export const 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";
@@ -7,8 +7,8 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
7
7
  import React, { useContext } from 'react';
8
8
  import { createBrowserHistory, createHashHistory } from 'history';
9
9
  import { Router, StaticRouter } from 'react-router-dom';
10
- import { RuntimeReactContext } from '@modern-js/runtime-core';
11
10
  import hoistNonReactStatics from 'hoist-non-react-statics';
11
+ import { RuntimeReactContext } from "../../core";
12
12
  import { isBrowser } from "../../common";
13
13
  import { renderRoutes, getLocation, urlJoin } from "./utils";
14
14
  import { jsx as _jsx } from "react/jsx-runtime";
@@ -67,11 +67,13 @@ export function renderRoutes(routesConfig, extraProps = {}) {
67
67
  });
68
68
  }
69
69
  export function getLocation(serverContext) {
70
+ var _url$replace;
71
+
70
72
  const {
71
73
  pathname,
72
74
  url
73
75
  } = (serverContext === null || serverContext === void 0 ? void 0 : serverContext.request) || {};
74
- const cleanUrl = url.replace('http://', '').replace('https://', '');
76
+ const cleanUrl = url === null || url === void 0 ? void 0 : (_url$replace = url.replace('http://', '')) === null || _url$replace === void 0 ? void 0 : _url$replace.replace('https://', '');
75
77
  const index = (cleanUrl || '').indexOf(pathname);
76
78
 
77
79
  if (index === -1) {
@@ -4,11 +4,13 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
4
4
 
5
5
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
6
 
7
- import ReactDOM from 'react-dom';
8
7
  import { loadableReady } from '@loadable/component';
8
+ import hoistNonReactStatics from 'hoist-non-react-statics';
9
9
  import { RenderLevel } from "./serverRender/type";
10
+ import { WithCallback } from "./react/withCallback";
10
11
  import { formatClient, mockResponse } from "./utils";
11
12
  import { jsx as _jsx } from "react/jsx-runtime";
13
+ const IS_REACT18 = process.env.IS_REACT18 === 'true';
12
14
 
13
15
  const ssr = () => ({
14
16
  name: '@modern-js/plugin-ssr',
@@ -18,37 +20,52 @@ const ssr = () => ({
18
20
  client: async ({
19
21
  App,
20
22
  context,
21
- rootElement
23
+ ModernRender,
24
+ ModernHydrate
22
25
  }) => {
23
26
  var _window, _window$_SSR_DATA;
24
27
 
25
28
  const 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;
26
29
 
27
30
  if (renderLevel === RenderLevel.CLIENT_RENDER) {
28
- var _prefetch, _ref;
29
-
30
- await (App === null || App === void 0 ? void 0 : (_prefetch = (_ref = App).prefetch) === null || _prefetch === void 0 ? void 0 : _prefetch.call(_ref, context));
31
- ReactDOM.render( /*#__PURE__*/_jsx(App, {
31
+ // prefetch block render while csr
32
+ // await (App as any)?.prefetch?.(context);
33
+ ModernRender( /*#__PURE__*/_jsx(App, {
32
34
  context: context
33
- }), rootElement);
35
+ }));
34
36
  } else if (renderLevel === RenderLevel.SERVER_RENDER) {
35
37
  loadableReady(() => {
36
38
  const hydrateContext = _objectSpread(_objectSpread({}, context), {}, {
37
39
  _hydration: true
38
40
  });
39
41
 
40
- ReactDOM.hydrate( /*#__PURE__*/_jsx(App, {
41
- context: hydrateContext
42
- }), rootElement, () => {
42
+ const callback = () => {
43
43
  // won't cause component re-render because context's reference identity doesn't change
44
44
  delete hydrateContext._hydration;
45
- });
45
+ }; // callback: https://github.com/reactwg/react-18/discussions/5
46
+
47
+
48
+ if (IS_REACT18) {
49
+ let SSRApp = () => /*#__PURE__*/_jsx(WithCallback, {
50
+ callback: callback,
51
+ children: /*#__PURE__*/_jsx(App, {
52
+ context: hydrateContext
53
+ })
54
+ });
55
+
56
+ SSRApp = hoistNonReactStatics(SSRApp, App);
57
+ ModernHydrate( /*#__PURE__*/_jsx(SSRApp, {}));
58
+ } else {
59
+ ModernHydrate( /*#__PURE__*/_jsx(App, {
60
+ context: hydrateContext
61
+ }), callback);
62
+ }
46
63
  });
47
64
  } else {
48
65
  // unknown renderlevel or renderlevel is server prefetch.
49
- ReactDOM.render( /*#__PURE__*/_jsx(App, {
66
+ ModernHydrate( /*#__PURE__*/_jsx(App, {
50
67
  context: context
51
- }), rootElement);
68
+ }));
52
69
  }
53
70
  },
54
71
 
@@ -60,6 +77,10 @@ const ssr = () => ({
60
77
  const 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;
61
78
 
62
79
  if (!request) {
80
+ context.ssrContext = _objectSpread(_objectSpread({}, context.ssrContext), {}, {
81
+ response: mockResp,
82
+ request: formatClient({})
83
+ });
63
84
  return next({
64
85
  context
65
86
  });
@@ -8,7 +8,7 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
8
8
 
9
9
  /* eslint-disable @typescript-eslint/no-require-imports */
10
10
  import path from 'path';
11
- import { registerPrefetch } from '@modern-js/runtime-core';
11
+ import { registerPrefetch } from "../core";
12
12
  import { isBrowser } from "../common";
13
13
  import prefetch from "./prefetch";
14
14
  import { formatServer } from "./utils";
@@ -3,10 +3,10 @@ import fs from 'fs';
3
3
  import { renderToStaticMarkup } from 'react-dom/server';
4
4
  import { run } from '@modern-js/utils/ssr';
5
5
  import { LOADABLE_STATS_FILE } from '@modern-js/utils/constants';
6
- import { ChunkExtractor } from '@loadable/server'; // todo: SSRContext
7
-
6
+ import { ChunkExtractor } from '@loadable/server';
8
7
  import { jsx as _jsx } from "react/jsx-runtime";
9
8
 
9
+ // todo: SSRContext
10
10
  const prefetch = async (App, context) => run(context.ssrContext.request.headers, async () => {
11
11
  var _context$store;
12
12
 
@@ -0,0 +1,17 @@
1
+ // See https://github.com/reactwg/react-18/discussions/5#discussioncomment-2276079
2
+ import { useRef, useLayoutEffect } from 'react';
3
+ export const WithCallback = ({
4
+ callback,
5
+ children
6
+ }) => {
7
+ const once = useRef(false);
8
+ useLayoutEffect(() => {
9
+ if (once.current) {
10
+ return;
11
+ }
12
+
13
+ once.current = true;
14
+ callback();
15
+ }, [callback]);
16
+ return children;
17
+ };
@@ -2,8 +2,8 @@
2
2
  const RE_HTML_ATTR = /<html[^>]*>/;
3
3
  const RE_BODY_ATTR = /<body[^>]*>/;
4
4
  const RE_LAST_IN_HEAD = /<\/head>/;
5
- const RE_TITLE = /<title[^>]*>([\s\S\n\r]*?)<\/title>/g;
6
- const TEST_TITLE_CONTENT = /(?<=<title[^>]*>)([\s\S\n\r]*?)([.|\S])([\s\S\n\r]*?)(?=<\/title>)/g; // 通过 react-helmet 修改模板
5
+ const RE_TITLE = /<title[^>]*>([\s\S\n\r]*?)<\/title>/;
6
+ const TEST_TITLE_CONTENT = /(?<=<title[^>]*>)([\s\S\n\r]*?)([.|\S])([\s\S\n\r]*?)(?=<\/title>)/; // 通过 react-helmet 修改模板
7
7
 
8
8
  export default function helmet(content, helmetData) {
9
9
  let result = content;
@@ -1,5 +1,5 @@
1
- import { RuntimeContext } from '@modern-js/runtime-core';
2
1
  import { run } from '@modern-js/utils/ssr';
2
+ import { RuntimeContext } from "../../core";
3
3
  import { PreRender } from "../react/prerender";
4
4
  import SSREntry from "./entry";
5
5
  import { time } from "./measure";
@@ -1,4 +1,4 @@
1
- import { ServerStyleSheet } from '@modern-js/runtime-core/styled';
1
+ import { ServerStyleSheet } from 'styled-components';
2
2
  export const toHtml = (jsx, renderer, next) => {
3
3
  const sheet = new ServerStyleSheet();
4
4
  const html = next(sheet.collectStyles(jsx));
@@ -19,19 +19,25 @@ export const formatServer = request => {
19
19
 
20
20
  const getQuery = () => window.location.search.substring(1).split('&').reduce((res, item) => {
21
21
  const [key, value] = item.split('=');
22
- res[key] = value;
22
+
23
+ if (key) {
24
+ res[key] = value;
25
+ }
26
+
23
27
  return res;
24
28
  }, {});
25
29
 
26
30
  export const formatClient = request => {
31
+ var _request$headers, _request$headers2;
32
+
27
33
  return {
28
34
  params: request.params || {},
29
35
  host: request.host || location.host,
30
36
  pathname: request.pathname || location.pathname,
31
37
  headers: request.headers || {},
32
38
  cookieMap: request.cookieMap || {},
33
- cookie: request.headers.cookie || document.cookie,
34
- userAgent: request.headers['user-agent'] || navigator.userAgent,
39
+ cookie: ((_request$headers = request.headers) === null || _request$headers === void 0 ? void 0 : _request$headers.cookie) || document.cookie,
40
+ userAgent: ((_request$headers2 = request.headers) === null || _request$headers2 === void 0 ? void 0 : _request$headers2['user-agent']) || navigator.userAgent,
35
41
  referer: request.referer || document.referrer,
36
42
  query: request.query || getQuery(),
37
43
  url: location.href
@@ -5,10 +5,10 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
5
5
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
6
 
7
7
  import { useContext } from 'react';
8
- import { RuntimeReactContext } from '@modern-js/runtime-core';
9
8
  import { createStore } from '@modern-js-reduck/store';
10
9
  import { Provider } from '@modern-js-reduck/react';
11
10
  import hoistNonReactStatics from 'hoist-non-react-statics';
11
+ import { RuntimeReactContext } from "../../core";
12
12
  import { isBrowser } from "../../common";
13
13
  import { jsx as _jsx } from "react/jsx-runtime";
14
14
 
@@ -25,8 +25,9 @@ var _default = () => ({
25
25
  let runtimeExportsUtils = {};
26
26
  return {
27
27
  config() {
28
- const dir = api.useAppContext().internalDirectory;
28
+ const dir = api.useAppContext().internalDirectory || '';
29
29
  runtimeExportsUtils = (0, _utils.createRuntimeExportsUtils)(dir, 'index');
30
+ process.env.IS_REACT18 = (0, _utils.isReact18)(_path.default.join(dir, '../../')).toString();
30
31
  return {
31
32
  runtime: {},
32
33
  runtimeByEntries: {},
@@ -39,10 +40,9 @@ var _default = () => ({
39
40
  * But it will not be installed under the user project.
40
41
  * So need to add alias
41
42
  */
42
- 'styled-components': require.resolve('styled-components', {
43
- paths: [require.resolve('@modern-js/runtime-core')]
44
- })
45
- }
43
+ 'styled-components': require.resolve('styled-components')
44
+ },
45
+ envVars: ['IS_REACT18']
46
46
  }
47
47
  };
48
48
  },
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getConfig = exports.defineConfig = void 0;
7
+ const APP_CONFIG_SYMBOL = 'config';
8
+
9
+ const getConfig = Component => // eslint-disable-next-line @typescript-eslint/ban-ts-comment
10
+ // @ts-expect-error
11
+ Component[APP_CONFIG_SYMBOL];
12
+
13
+ exports.getConfig = getConfig;
14
+
15
+ const defineConfig = (Component, config) => {
16
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
17
+ // @ts-expect-error
18
+ Component[APP_CONFIG_SYMBOL] = config;
19
+ return Component;
20
+ };
21
+
22
+ exports.defineConfig = defineConfig;
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useRuntimeContext = exports.createApp = exports.bootstrap = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _reactDom = _interopRequireDefault(require("react-dom"));
11
+
12
+ var _hoistNonReactStatics = _interopRequireDefault(require("hoist-non-react-statics"));
13
+
14
+ var _plugin = require("./plugin");
15
+
16
+ var _runtimeContext = require("./runtime-context");
17
+
18
+ var _loaderManager = require("./loader/loaderManager");
19
+
20
+ var _jsxRuntime = require("react/jsx-runtime");
21
+
22
+ const _excluded = ["context"];
23
+
24
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
+
26
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
+
28
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
29
+
30
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
31
+
32
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
33
+
34
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
35
+
36
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
37
+
38
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
39
+
40
+ const IS_REACT18 = process.env.IS_REACT18 === 'true';
41
+
42
+ function isClientArgs(id) {
43
+ return typeof id === 'string' || typeof HTMLElement !== 'undefined' && id instanceof HTMLElement;
44
+ }
45
+
46
+ const runnerMap = new WeakMap();
47
+
48
+ const getInitialContext = runner => ({
49
+ loaderManager: (0, _loaderManager.createLoaderManager)({}),
50
+ runner,
51
+ isBrowser: true
52
+ });
53
+
54
+ const createApp = ({
55
+ plugins
56
+ }) => {
57
+ const appRuntime = _plugin.runtime.clone();
58
+
59
+ appRuntime.usePlugin(...plugins);
60
+ return App => {
61
+ const runner = appRuntime.init();
62
+
63
+ const WrapperComponent = props => {
64
+ const element = /*#__PURE__*/_react.default.createElement(App || _react.default.Fragment, _objectSpread({}, props), props.children);
65
+
66
+ const context = (0, _react.useContext)(_runtimeContext.RuntimeReactContext);
67
+ return runner.provide({
68
+ element,
69
+ props: _objectSpread({}, props),
70
+ context
71
+ }, {
72
+ onLast: ({
73
+ element
74
+ }) => element
75
+ });
76
+ };
77
+
78
+ if (App) {
79
+ (0, _hoistNonReactStatics.default)(WrapperComponent, App);
80
+ }
81
+
82
+ const HOCApp = runner.hoc({
83
+ App: WrapperComponent
84
+ }, {
85
+ onLast: ({
86
+ App
87
+ }) => {
88
+ const WrapComponent = _ref => {
89
+ var _contextValue;
90
+
91
+ let {
92
+ context
93
+ } = _ref,
94
+ props = _objectWithoutProperties(_ref, _excluded);
95
+
96
+ let contextValue = context; // We should construct the context, when root component is not passed into `bootstrap`.
97
+
98
+ if (!((_contextValue = contextValue) !== null && _contextValue !== void 0 && _contextValue.runner)) {
99
+ contextValue = getInitialContext(runner);
100
+ runner.init({
101
+ context: contextValue
102
+ }, {
103
+ onLast: ({
104
+ context: context1
105
+ }) => {
106
+ var _App$init;
107
+
108
+ return App === null || App === void 0 ? void 0 : (_App$init = App.init) === null || _App$init === void 0 ? void 0 : _App$init.call(App, context1);
109
+ }
110
+ });
111
+ }
112
+
113
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_runtimeContext.RuntimeReactContext.Provider, {
114
+ value: contextValue,
115
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(App, _objectSpread({}, props))
116
+ });
117
+ };
118
+
119
+ return (0, _hoistNonReactStatics.default)(WrapComponent, App);
120
+ }
121
+ });
122
+ runnerMap.set(HOCApp, runner);
123
+ return HOCApp;
124
+ };
125
+ };
126
+
127
+ exports.createApp = createApp;
128
+
129
+ const bootstrap = async (BootApp,
130
+ /**
131
+ * When csr, id is root id.
132
+ * When ssr, id is serverContext
133
+ */
134
+ id,
135
+ /**
136
+ * root.render need use root to run function
137
+ */
138
+ root, render = _reactDom.default.render, hydrate = _reactDom.default.hydrate) => {
139
+ let App = BootApp;
140
+ let runner = runnerMap.get(App); // ensure Component used is created by `createApp`
141
+
142
+ if (!runner) {
143
+ App = createApp({
144
+ plugins: []
145
+ })(App);
146
+ runner = runnerMap.get(App);
147
+ }
148
+
149
+ const context = getInitialContext(runner);
150
+
151
+ const runInit = _context => runner.init({
152
+ context: _context
153
+ }, {
154
+ onLast: ({
155
+ context: context1
156
+ }) => {
157
+ var _App, _App$init2;
158
+
159
+ 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);
160
+ }
161
+ }); // don't mount the App, let user in charge of it.
162
+
163
+
164
+ if (!id) {
165
+ return /*#__PURE__*/_react.default.createElement(App, {
166
+ context
167
+ });
168
+ }
169
+
170
+ const isBrowser = typeof window !== 'undefined' && window.name !== 'nodejs';
171
+
172
+ if (isBrowser) {
173
+ if (isClientArgs(id)) {
174
+ var _ssrData$data, _ssrData$data2;
175
+
176
+ const ssrData = window._SSR_DATA;
177
+ const loadersData = (ssrData === null || ssrData === void 0 ? void 0 : (_ssrData$data = ssrData.data) === null || _ssrData$data === void 0 ? void 0 : _ssrData$data.loadersData) || {};
178
+ const initialLoadersState = Object.keys(loadersData).reduce((res, key) => {
179
+ const loaderData = loadersData[key];
180
+
181
+ if (loaderData.loading !== false) {
182
+ return res;
183
+ }
184
+
185
+ res[key] = loaderData;
186
+ return res;
187
+ }, {});
188
+ Object.assign(context, _objectSpread({
189
+ loaderManager: (0, _loaderManager.createLoaderManager)(initialLoadersState, {
190
+ skipStatic: true
191
+ })
192
+ }, ssrData ? {
193
+ ssrContext: ssrData === null || ssrData === void 0 ? void 0 : ssrData.context
194
+ } : {}));
195
+ context.initialData = ssrData === null || ssrData === void 0 ? void 0 : (_ssrData$data2 = ssrData.data) === null || _ssrData$data2 === void 0 ? void 0 : _ssrData$data2.initialData;
196
+ const initialData = await runInit(context);
197
+
198
+ if (initialData) {
199
+ context.initialData = initialData;
200
+ }
201
+
202
+ const rootElement = typeof id !== 'string' ? id : document.getElementById(id || 'root'); // https://reactjs.org/blog/2022/03/08/react-18-upgrade-guide.html
203
+
204
+ const ModernRender = App => {
205
+ if (IS_REACT18) {
206
+ root.render(App);
207
+ } else {
208
+ render(App, rootElement);
209
+ }
210
+ };
211
+
212
+ const ModernHydrate = (App, callback) => {
213
+ if (IS_REACT18) {
214
+ hydrate(rootElement, App);
215
+ } else {
216
+ hydrate(App, rootElement, callback);
217
+ }
218
+ };
219
+
220
+ return runner.client({
221
+ App,
222
+ context,
223
+ ModernRender,
224
+ ModernHydrate
225
+ }, {
226
+ onLast: ({
227
+ App
228
+ }) => {
229
+ ModernRender( /*#__PURE__*/_react.default.createElement(App, {
230
+ context
231
+ }));
232
+ }
233
+ });
234
+ } else {
235
+ throw Error('`bootstrap` needs id in browser environment, it needs to be string or element');
236
+ }
237
+ } else {
238
+ Object.assign(context, {
239
+ ssrContext: id,
240
+ isBrowser: false,
241
+ loaderManager: (0, _loaderManager.createLoaderManager)({}, {
242
+ skipNonStatic: id.staticGenerate,
243
+ // if not static generate, only non-static loader can exec on prod env
244
+ skipStatic: process.env.NODE_ENV === 'production' && !id.staticGenerate
245
+ })
246
+ });
247
+ const initialData = await runInit(context);
248
+ context.initialData = initialData;
249
+ return runner.server({
250
+ App,
251
+ context
252
+ });
253
+ }
254
+ };
255
+
256
+ exports.bootstrap = bootstrap;
257
+
258
+ const useRuntimeContext = () => {
259
+ const context = (0, _react.useContext)(_runtimeContext.RuntimeReactContext);
260
+ const memoizedContext = (0, _react.useMemo)(() => context.runner.pickContext({
261
+ context,
262
+ pickedContext: {}
263
+ }, {
264
+ onLast: ({
265
+ pickedContext
266
+ }) => pickedContext
267
+ }), [context]);
268
+ return memoizedContext;
269
+ };
270
+
271
+ exports.useRuntimeContext = useRuntimeContext;