@modern-js/runtime 2.0.0-beta.0 → 2.0.0-beta.1

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 (204) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/dist/js/modern/cli/index.js +3 -5
  3. package/dist/js/modern/core/app-config.js +2 -1
  4. package/dist/js/modern/core/compatible.js +63 -46
  5. package/dist/js/modern/core/index.js +3 -2
  6. package/dist/js/modern/core/loader/loaderManager.js +12 -34
  7. package/dist/js/modern/core/loader/useLoader.js +8 -26
  8. package/dist/js/modern/core/plugin.js +6 -28
  9. package/dist/js/modern/document/Body.js +17 -0
  10. package/dist/js/modern/document/DocumentContext.js +6 -0
  11. package/dist/js/modern/document/DocumentStructrueContext.js +7 -0
  12. package/dist/js/modern/document/Head.js +24 -0
  13. package/dist/js/modern/document/Html.js +92 -0
  14. package/dist/js/modern/document/Root.js +31 -0
  15. package/dist/js/modern/document/Scripts.js +10 -0
  16. package/dist/js/modern/document/cli/index.js +130 -0
  17. package/dist/js/modern/document/constants.js +19 -0
  18. package/dist/js/modern/document/index.js +8 -0
  19. package/dist/js/modern/index.js +1 -1
  20. package/dist/js/modern/router/cli/index.js +0 -16
  21. package/dist/js/modern/router/runtime/plugin.js +0 -9
  22. package/dist/js/modern/router/runtime/plugin.node.js +18 -24
  23. package/dist/js/modern/router/runtime/root/index.js +19 -0
  24. package/dist/js/modern/router/runtime/root/load.js +61 -0
  25. package/dist/js/modern/router/runtime/utils.js +16 -35
  26. package/dist/js/modern/router/runtime/withRouter.js +1 -3
  27. package/dist/js/modern/ssr/cli/index.js +2 -23
  28. package/dist/js/modern/ssr/index.js +23 -34
  29. package/dist/js/modern/ssr/index.node.js +0 -13
  30. package/dist/js/modern/ssr/prefetch.js +0 -7
  31. package/dist/js/modern/ssr/react/prerender/index.js +2 -23
  32. package/dist/js/modern/ssr/react/prerender/util.js +2 -17
  33. package/dist/js/modern/ssr/react/withCallback/index.js +0 -1
  34. package/dist/js/modern/ssr/serverRender/helmet.js +12 -20
  35. package/dist/js/modern/ssr/serverRender/index.js +1 -2
  36. package/dist/js/modern/ssr/serverRender/renderToStream/buildTemplate.after.js +5 -5
  37. package/dist/js/modern/ssr/serverRender/renderToStream/bulidTemplate.before.js +45 -11
  38. package/dist/js/modern/ssr/serverRender/renderToStream/index.js +6 -39
  39. package/dist/js/modern/ssr/serverRender/renderToStream/loadable.js +0 -2
  40. package/dist/js/modern/ssr/serverRender/renderToStream/renderToPipe.js +26 -15
  41. package/dist/js/modern/ssr/serverRender/renderToStream/template.js +14 -18
  42. package/dist/js/modern/ssr/serverRender/renderToString/entry.js +2 -34
  43. package/dist/js/modern/ssr/serverRender/renderToString/index.js +0 -2
  44. package/dist/js/modern/ssr/serverRender/renderToString/loadable.js +0 -10
  45. package/dist/js/modern/ssr/serverRender/renderToString/reduce.js +0 -2
  46. package/dist/js/modern/ssr/serverRender/renderToString/template.js +0 -15
  47. package/dist/js/modern/ssr/serverRender/renderToString/type.js +0 -1
  48. package/dist/js/modern/ssr/serverRender/utils.js +2 -6
  49. package/dist/js/modern/ssr/utils.js +0 -11
  50. package/dist/js/modern/state/cli/index.js +0 -10
  51. package/dist/js/modern/state/runtime/plugin.js +1 -14
  52. package/dist/js/node/cli/index.js +3 -13
  53. package/dist/js/node/common.js +0 -2
  54. package/dist/js/node/core/app-config.js +2 -5
  55. package/dist/js/node/core/compatible.js +63 -64
  56. package/dist/js/node/core/index.js +0 -16
  57. package/dist/js/node/core/loader/index.js +0 -2
  58. package/dist/js/node/core/loader/loaderManager.js +12 -37
  59. package/dist/js/node/core/loader/useLoader.js +8 -31
  60. package/dist/js/node/core/plugin.js +5 -34
  61. package/dist/js/node/document/Body.js +26 -0
  62. package/dist/js/node/document/DocumentContext.js +14 -0
  63. package/dist/js/node/document/DocumentStructrueContext.js +15 -0
  64. package/dist/js/node/document/Head.js +33 -0
  65. package/dist/js/node/document/Html.js +98 -0
  66. package/dist/js/node/document/Root.js +41 -0
  67. package/dist/js/node/document/Scripts.js +17 -0
  68. package/dist/js/node/document/cli/index.js +140 -0
  69. package/dist/js/node/document/constants.js +36 -0
  70. package/dist/js/node/document/index.js +93 -0
  71. package/dist/js/node/exports/head.js +0 -5
  72. package/dist/js/node/exports/loadable.js +0 -5
  73. package/dist/js/node/exports/server.js +0 -2
  74. package/dist/js/node/exports/styled.js +0 -5
  75. package/dist/js/node/index.js +0 -8
  76. package/dist/js/node/router/cli/index.js +0 -20
  77. package/dist/js/node/router/index.js +0 -4
  78. package/dist/js/node/router/runtime/DefaultNotFound.js +1 -5
  79. package/dist/js/node/router/runtime/index.js +0 -5
  80. package/dist/js/node/router/runtime/plugin.js +0 -17
  81. package/dist/js/node/router/runtime/plugin.node.js +16 -38
  82. package/dist/js/node/router/runtime/root/index.js +26 -0
  83. package/dist/js/node/router/runtime/root/load.js +69 -0
  84. package/dist/js/node/router/runtime/utils.js +16 -44
  85. package/dist/js/node/router/runtime/withRouter.js +0 -9
  86. package/dist/js/node/runtime-context.js +0 -2
  87. package/dist/js/node/ssr/cli/index.js +2 -26
  88. package/dist/js/node/ssr/index.js +23 -45
  89. package/dist/js/node/ssr/index.node.js +0 -23
  90. package/dist/js/node/ssr/prefetch.js +0 -11
  91. package/dist/js/node/ssr/react/index.js +0 -2
  92. package/dist/js/node/ssr/react/nossr/index.js +0 -6
  93. package/dist/js/node/ssr/react/prerender/index.js +2 -30
  94. package/dist/js/node/ssr/react/prerender/util.js +2 -25
  95. package/dist/js/node/ssr/react/withCallback/index.js +1 -4
  96. package/dist/js/node/ssr/serverRender/helmet.js +13 -20
  97. package/dist/js/node/ssr/serverRender/index.js +1 -4
  98. package/dist/js/node/ssr/serverRender/renderToStream/buildTemplate.after.js +5 -9
  99. package/dist/js/node/ssr/serverRender/renderToStream/buildTemplate.share.js +0 -1
  100. package/dist/js/node/ssr/serverRender/renderToStream/bulidTemplate.before.js +43 -15
  101. package/dist/js/node/ssr/serverRender/renderToStream/index.js +6 -48
  102. package/dist/js/node/ssr/serverRender/renderToStream/loadable.js +0 -4
  103. package/dist/js/node/ssr/serverRender/renderToStream/renderToPipe.js +26 -17
  104. package/dist/js/node/ssr/serverRender/renderToStream/styledComponent.js +0 -2
  105. package/dist/js/node/ssr/serverRender/renderToStream/template.js +16 -23
  106. package/dist/js/node/ssr/serverRender/renderToString/entry.js +2 -51
  107. package/dist/js/node/ssr/serverRender/renderToString/index.js +0 -10
  108. package/dist/js/node/ssr/serverRender/renderToString/loadable.js +0 -14
  109. package/dist/js/node/ssr/serverRender/renderToString/reduce.js +0 -3
  110. package/dist/js/node/ssr/serverRender/renderToString/styledComponent.js +0 -3
  111. package/dist/js/node/ssr/serverRender/renderToString/template.js +0 -18
  112. package/dist/js/node/ssr/serverRender/renderToString/type.js +0 -1
  113. package/dist/js/node/ssr/serverRender/types.js +0 -1
  114. package/dist/js/node/ssr/serverRender/utils.js +2 -8
  115. package/dist/js/node/ssr/utils.js +0 -20
  116. package/dist/js/node/state/cli/index.js +0 -15
  117. package/dist/js/node/state/index.js +0 -4
  118. package/dist/js/node/state/plugins.js +0 -11
  119. package/dist/js/node/state/runtime/index.js +0 -7
  120. package/dist/js/node/state/runtime/plugin.js +1 -25
  121. package/dist/js/treeshaking/cli/index.js +3 -3
  122. package/dist/js/treeshaking/core/app-config.js +2 -1
  123. package/dist/js/treeshaking/core/compatible.js +66 -63
  124. package/dist/js/treeshaking/core/index.js +3 -2
  125. package/dist/js/treeshaking/core/loader/loaderManager.js +19 -51
  126. package/dist/js/treeshaking/core/loader/useLoader.js +11 -28
  127. package/dist/js/treeshaking/core/plugin.js +6 -51
  128. package/dist/js/treeshaking/document/Body.js +14 -0
  129. package/dist/js/treeshaking/document/DocumentContext.js +6 -0
  130. package/dist/js/treeshaking/document/DocumentStructrueContext.js +7 -0
  131. package/dist/js/treeshaking/document/Head.js +21 -0
  132. package/dist/js/treeshaking/document/Html.js +104 -0
  133. package/dist/js/treeshaking/document/Root.js +24 -0
  134. package/dist/js/treeshaking/document/Scripts.js +10 -0
  135. package/dist/js/treeshaking/document/cli/index.js +170 -0
  136. package/dist/js/treeshaking/document/constants.js +16 -0
  137. package/dist/js/treeshaking/document/index.js +8 -0
  138. package/dist/js/treeshaking/index.js +1 -1
  139. package/dist/js/treeshaking/router/cli/index.js +6 -18
  140. package/dist/js/treeshaking/router/runtime/plugin.js +5 -13
  141. package/dist/js/treeshaking/router/runtime/plugin.node.js +23 -36
  142. package/dist/js/treeshaking/router/runtime/root/index.js +17 -0
  143. package/dist/js/treeshaking/router/runtime/root/load.js +102 -0
  144. package/dist/js/treeshaking/router/runtime/utils.js +21 -39
  145. package/dist/js/treeshaking/router/runtime/withRouter.js +1 -0
  146. package/dist/js/treeshaking/ssr/cli/index.js +9 -31
  147. package/dist/js/treeshaking/ssr/index.js +26 -40
  148. package/dist/js/treeshaking/ssr/index.node.js +12 -29
  149. package/dist/js/treeshaking/ssr/prefetch.js +0 -13
  150. package/dist/js/treeshaking/ssr/react/nossr/index.js +3 -4
  151. package/dist/js/treeshaking/ssr/react/prerender/index.js +2 -21
  152. package/dist/js/treeshaking/ssr/react/prerender/util.js +3 -20
  153. package/dist/js/treeshaking/ssr/react/withCallback/index.js +1 -2
  154. package/dist/js/treeshaking/ssr/serverRender/helmet.js +12 -11
  155. package/dist/js/treeshaking/ssr/serverRender/index.js +1 -9
  156. package/dist/js/treeshaking/ssr/serverRender/renderToStream/buildTemplate.after.js +5 -6
  157. package/dist/js/treeshaking/ssr/serverRender/renderToStream/bulidTemplate.before.js +46 -15
  158. package/dist/js/treeshaking/ssr/serverRender/renderToStream/index.js +9 -79
  159. package/dist/js/treeshaking/ssr/serverRender/renderToStream/loadable.js +3 -5
  160. package/dist/js/treeshaking/ssr/serverRender/renderToStream/renderToPipe.js +46 -35
  161. package/dist/js/treeshaking/ssr/serverRender/renderToStream/template.js +17 -24
  162. package/dist/js/treeshaking/ssr/serverRender/renderToString/entry.js +20 -73
  163. package/dist/js/treeshaking/ssr/serverRender/renderToString/index.js +2 -6
  164. package/dist/js/treeshaking/ssr/serverRender/renderToString/loadable.js +5 -16
  165. package/dist/js/treeshaking/ssr/serverRender/renderToString/reduce.js +0 -2
  166. package/dist/js/treeshaking/ssr/serverRender/renderToString/template.js +2 -18
  167. package/dist/js/treeshaking/ssr/serverRender/renderToString/type.js +0 -1
  168. package/dist/js/treeshaking/ssr/serverRender/utils.js +5 -10
  169. package/dist/js/treeshaking/ssr/utils.js +8 -17
  170. package/dist/js/treeshaking/state/cli/index.js +3 -10
  171. package/dist/js/treeshaking/state/runtime/plugin.js +2 -10
  172. package/dist/types/cli/index.d.ts +0 -2
  173. package/dist/types/core/compatible.d.ts +5 -5
  174. package/dist/types/core/index.d.ts +1 -1
  175. package/dist/types/core/loader/loaderManager.d.ts +0 -1
  176. package/dist/types/core/loader/useLoader.d.ts +0 -5
  177. package/dist/types/core/plugin.d.ts +1 -13
  178. package/dist/types/document/Body.d.ts +4 -0
  179. package/dist/types/document/DocumentContext.d.ts +13 -0
  180. package/dist/types/document/DocumentStructrueContext.d.ts +10 -0
  181. package/dist/types/document/Head.d.ts +5 -0
  182. package/dist/types/document/Html.d.ts +4 -0
  183. package/dist/types/document/Root.d.ts +8 -0
  184. package/dist/types/document/Scripts.d.ts +2 -0
  185. package/dist/types/document/cli/index.d.ts +3 -0
  186. package/dist/types/document/constants.d.ts +14 -0
  187. package/dist/types/document/index.d.ts +8 -0
  188. package/dist/types/exports/server.d.ts +3 -3
  189. package/dist/types/index.d.ts +1 -1
  190. package/dist/types/router/cli/index.d.ts +0 -2
  191. package/dist/types/router/runtime/root/index.d.ts +8 -0
  192. package/dist/types/router/runtime/root/load.d.ts +22 -0
  193. package/dist/types/router/runtime/types.d.ts +0 -2
  194. package/dist/types/runtime-context.d.ts +1 -0
  195. package/dist/types/ssr/cli/index.d.ts +0 -2
  196. package/dist/types/ssr/prefetch.d.ts +2 -2
  197. package/dist/types/ssr/serverRender/renderToStream/buildTemplate.after.d.ts +3 -2
  198. package/dist/types/ssr/serverRender/renderToStream/bulidTemplate.before.d.ts +2 -1
  199. package/dist/types/ssr/serverRender/renderToStream/renderToPipe.d.ts +3 -3
  200. package/dist/types/ssr/serverRender/renderToStream/template.d.ts +2 -2
  201. package/dist/types/ssr/serverRender/types.d.ts +1 -4
  202. package/dist/types/state/cli/index.d.ts +0 -2
  203. package/dist/types/state/types.d.ts +0 -1
  204. package/package.json +19 -11
@@ -1,12 +1,8 @@
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
1
  import { createManager, createPipeline, createAsyncPipeline } from '@modern-js/plugin';
8
2
  import { createLoaderManager } from "./loader/loaderManager";
9
- const hoc = createPipeline(); // eslint-disable-next-line @typescript-eslint/no-empty-interface
3
+ const hoc = createPipeline();
4
+
5
+ // eslint-disable-next-line @typescript-eslint/no-empty-interface
10
6
 
11
7
  const provide = createPipeline();
12
8
  const client = createAsyncPipeline();
@@ -21,43 +17,25 @@ const runtimeHooks = {
21
17
  init,
22
18
  pickContext
23
19
  };
20
+
24
21
  /** All hooks of runtime plugin. */
25
22
 
26
23
  export const createRuntime = () => createManager(runtimeHooks);
24
+
27
25
  /**
28
26
  * register init hook. It would be revoked both ssr and csr.
29
27
  */
30
-
31
28
  const registerInit = (App, _init) => {
32
29
  const originalInit = App.init;
33
-
34
30
  App.init = async context => {
35
31
  if (!context.loaderManager) {
36
32
  context.loaderManager = createLoaderManager({});
37
33
  }
38
-
39
34
  await Promise.all([originalInit === null || originalInit === void 0 ? void 0 : originalInit(context), _init === null || _init === void 0 ? void 0 : _init(context)]);
40
35
  };
41
36
  };
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
37
  export const runtime = createRuntime();
60
38
  export const {
61
39
  createPlugin
62
40
  } = runtime;
63
- export { registerInit, registerPrefetch };
41
+ export { registerInit };
@@ -0,0 +1,17 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2
+ import React, { useContext } from 'react';
3
+ import { DOCUMENT_CHUNKSMAP_PLACEHOLDER, DOCUMENT_SSRDATASCRIPT_PLACEHOLDER } from "./constants";
4
+ import { DocumentStructrueContext } from "./DocumentStructrueContext";
5
+ import { DefaultRoot } from "./Root";
6
+ import { jsxs as _jsxs } from "react/jsx-runtime";
7
+ export function Body(props) {
8
+ const {
9
+ hasSetRoot
10
+ } = useContext(DocumentStructrueContext);
11
+ const {
12
+ children
13
+ } = props;
14
+ return /*#__PURE__*/_jsxs("body", {
15
+ children: [hasSetRoot ? null : DefaultRoot, children, `${DOCUMENT_CHUNKSMAP_PLACEHOLDER}`, `${DOCUMENT_SSRDATASCRIPT_PLACEHOLDER}`]
16
+ });
17
+ }
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export const DocumentContext = /*#__PURE__*/React.createContext({
3
+ config: {},
4
+ templateParams: {},
5
+ processEnv: {}
6
+ });
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ export const DocumentStructrueContext = /*#__PURE__*/React.createContext({
3
+ hasSetHead: false,
4
+ hasSetScripts: false,
5
+ hasSetBody: false,
6
+ hasSetRoot: false
7
+ });
@@ -0,0 +1,24 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2
+ import React, { useContext } from 'react';
3
+ import { DocumentStructrueContext } from "./DocumentStructrueContext";
4
+ import { Scripts } from "./Scripts";
5
+ import { DOCUMENT_META_PLACEHOLDER } from "./constants";
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ import { jsxs as _jsxs } from "react/jsx-runtime";
8
+ export function Head(props) {
9
+ const {
10
+ hasSetScripts
11
+ } = useContext(DocumentStructrueContext);
12
+ const {
13
+ children
14
+ } = props;
15
+ // todo: verify the children
16
+ return /*#__PURE__*/_jsxs("head", {
17
+ children: [`${DOCUMENT_META_PLACEHOLDER}`, !hasSetScripts && /*#__PURE__*/_jsx(Scripts, {}), children]
18
+ });
19
+ }
20
+ export function DefaultHead() {
21
+ return /*#__PURE__*/_jsx("head", {
22
+ children: `${DOCUMENT_META_PLACEHOLDER}`
23
+ });
24
+ }
@@ -0,0 +1,92 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2
+ import React from 'react';
3
+ import { Body } from "./Body";
4
+ import { DocumentStructrueContext } from "./DocumentStructrueContext";
5
+ import { Head } from "./Head";
6
+
7
+ /**
8
+ * get the directly son element
9
+ */
10
+ import { jsxs as _jsxs } from "react/jsx-runtime";
11
+ import { jsx as _jsx } from "react/jsx-runtime";
12
+ function findTargetChild(tag, children) {
13
+ return children.find(item => getEleType(item) === tag);
14
+ }
15
+
16
+ /**
17
+ * get the type of react element
18
+ */
19
+ function getEleType(ele) {
20
+ // fixme: 非 react 的类型,有点儿问题。
21
+ return typeof (ele === null || ele === void 0 ? void 0 : ele.type) === 'function' ? ele.type.name : ele === null || ele === void 0 ? void 0 : ele.type;
22
+ }
23
+
24
+ /**
25
+ * get the children(grandChild included) with target type
26
+ * @param tag the element type
27
+ * @param children son element
28
+ * @returns target element
29
+ */
30
+ function findTargetElement(tag, children) {
31
+ if (children.length === 0) {
32
+ return null;
33
+ }
34
+ let nextChildren = [];
35
+ for (const item of children) {
36
+ var _item$props;
37
+ if (tag === getEleType(item)) {
38
+ return item;
39
+ }
40
+ if (item !== null && item !== void 0 && (_item$props = item.props) !== null && _item$props !== void 0 && _item$props.children) {
41
+ nextChildren = nextChildren.concat(item.props.children);
42
+ }
43
+ }
44
+ return findTargetElement(tag, nextChildren);
45
+ }
46
+ export function Html(props) {
47
+ const {
48
+ children
49
+ } = props;
50
+
51
+ // deal with the component with default
52
+ const hasSetHead = Boolean(findTargetChild('Head', children));
53
+ const hasSetScripts = Boolean(findTargetElement('Scripts', children));
54
+ const hasSetBody = Boolean(findTargetChild('Body', children));
55
+ const hasSetRoot = Boolean(findTargetElement('Root', children));
56
+ const notMissMustChild = [hasSetHead, hasSetBody
57
+ // hasSetScripts,
58
+ // hasSetRoot,
59
+ ].every(item => item);
60
+
61
+ // todo: or throw an error
62
+ if (!notMissMustChild) {
63
+ return /*#__PURE__*/_jsx("html", {
64
+ children: /*#__PURE__*/_jsxs("body", {
65
+ style: {
66
+ color: 'red'
67
+ },
68
+ children: [`Miss the `, [hasSetHead, hasSetBody
69
+ // hasSetScripts,
70
+ // hasSetRoot,
71
+ ].map((item, index) => {
72
+ return item ? null : ['Head', 'Body'
73
+ // 'Scripts',
74
+ // 'Root',
75
+ ][index];
76
+ }), ` Element`]
77
+ })
78
+ });
79
+ }
80
+ return /*#__PURE__*/_jsx("html", {
81
+ children: /*#__PURE__*/_jsxs(DocumentStructrueContext.Provider, {
82
+ value: {
83
+ hasSetHead,
84
+ hasSetScripts,
85
+ hasSetRoot,
86
+ hasSetBody,
87
+ docChild: children
88
+ },
89
+ children: [!hasSetHead && /*#__PURE__*/_jsx(Head, {}), !hasSetBody && /*#__PURE__*/_jsx(Body, {}), children]
90
+ })
91
+ });
92
+ }
@@ -0,0 +1,31 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2
+ import React, { useContext } from 'react';
3
+ import { DocumentContext } from "./DocumentContext";
4
+ import { DOCUMENT_SSR_PLACEHOLDER } from "./constants";
5
+ import { jsxs as _jsxs } from "react/jsx-runtime";
6
+ export function Root(props) {
7
+ const {
8
+ rootId,
9
+ children
10
+ } = props;
11
+ const {
12
+ templateParams: {
13
+ mountId = 'root'
14
+ }
15
+ } = useContext(DocumentContext);
16
+ return /*#__PURE__*/_jsxs("div", {
17
+ id: `${rootId || mountId}`,
18
+ children: [`${DOCUMENT_SSR_PLACEHOLDER}`, children]
19
+ });
20
+ }
21
+ export function DefaultRoot(props) {
22
+ const {
23
+ templateParams: {
24
+ mountId
25
+ }
26
+ } = useContext(DocumentContext);
27
+ return /*#__PURE__*/_jsxs("div", {
28
+ id: `${mountId}`,
29
+ children: [`${DOCUMENT_SSR_PLACEHOLDER}`, props.children]
30
+ });
31
+ }
@@ -0,0 +1,10 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2
+ import React from 'react';
3
+ import { DOCUMENT_SCRIPTS_PLACEHOLDER } from "./constants";
4
+ import { Fragment as _Fragment } from "react/jsx-runtime";
5
+ import { jsx as _jsx } from "react/jsx-runtime";
6
+ export function Scripts() {
7
+ return /*#__PURE__*/_jsx(_Fragment, {
8
+ children: `${DOCUMENT_SCRIPTS_PLACEHOLDER}`
9
+ });
10
+ }
@@ -0,0 +1,130 @@
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
+ 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; }
3
+ 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; }
4
+ import path from 'path';
5
+ import React from 'react';
6
+ import ReactDomServer from 'react-dom/server';
7
+ import { build } from 'esbuild';
8
+ import { createDebugger, findExists } from '@modern-js/utils';
9
+ import { DocumentContext } from "../DocumentContext";
10
+ import { DOCUMENT_SCRIPTS_PLACEHOLDER, DOCUMENT_FILE_NAME, DOCUMENT_META_PLACEHOLDER, PLACEHOLDER_REPLACER_MAP, DOC_EXT, DOCUMENT_SSR_PLACEHOLDER, DOCUMENT_CHUNKSMAP_PLACEHOLDER, DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, HTML_SEPARATOR } from "../constants";
11
+ const debug = createDebugger('html_genarate');
12
+ const getDocumenByEntryName = function getDocumenByEntryName(entrypoints, entryName) {
13
+ var _entrypoints$find;
14
+ const entryDir = (_entrypoints$find = entrypoints.find(item => item.entryName === entryName)) === null || _entrypoints$find === void 0 ? void 0 : _entrypoints$find.absoluteEntryDir;
15
+ const docFile = findExists(DOC_EXT.map(item => `${entryDir}${path.sep}${DOCUMENT_FILE_NAME}.${item}`));
16
+ return docFile || undefined;
17
+ };
18
+ export default (() => ({
19
+ name: '@modern-js/plugin-document',
20
+ pre: ['@modern-js/plugin-analyze'],
21
+ setup: async api => {
22
+ // get params for document.tsx
23
+ function getDocParams(params) {
24
+ const {
25
+ config,
26
+ templateParameters,
27
+ entryName
28
+ } = params;
29
+ // for enough params, devide as:process, config, templateParams
30
+ return {
31
+ processEnv: process.env,
32
+ config: {
33
+ output: config.output
34
+ },
35
+ entryName,
36
+ templateParams: templateParameters
37
+ };
38
+ }
39
+ const documentEntry = (entryName, templateParameters) => {
40
+ const {
41
+ entrypoints,
42
+ internalDirectory
43
+ } = api.useAppContext();
44
+ // search the document.[tsx|jsx|js|ts] under entry
45
+ // if not, use main as default
46
+ let documentFilePath = getDocumenByEntryName(entrypoints, entryName);
47
+ if (!documentFilePath) {
48
+ documentFilePath = getDocumenByEntryName(entrypoints, 'main');
49
+ }
50
+ // if no document file, do nothing as default
51
+ if (!documentFilePath) {
52
+ return null;
53
+ }
54
+ return async ({
55
+ htmlWebpackPlugin
56
+ }) => {
57
+ const documentParams = getDocParams({
58
+ config: api.useConfigContext(),
59
+ entryName,
60
+ templateParameters
61
+ });
62
+ const htmlOutputFile = path.join(internalDirectory, `./document/_${entryName}.html.js`);
63
+ // transform document file to html string
64
+ await build({
65
+ entryPoints: [documentFilePath],
66
+ // write: false,
67
+ outfile: htmlOutputFile,
68
+ platform: 'node',
69
+ target: 'es6',
70
+ loader: {
71
+ '.ts': 'ts',
72
+ '.tsx': 'tsx'
73
+ },
74
+ bundle: true,
75
+ plugins: [{
76
+ name: 'make-all-packages-external',
77
+ setup(build) {
78
+ // https://github.com/evanw/esbuild/issues/619#issuecomment-751995294
79
+ build.onResolve({
80
+ filter: /^[^./]|^\.[^./]|^\.\.[^/]/
81
+ }, args => {
82
+ let external = true;
83
+ // FIXME: windows external entrypoint
84
+ if (args.kind === 'entry-point') {
85
+ external = false;
86
+ }
87
+ return {
88
+ path: args.path,
89
+ external
90
+ };
91
+ });
92
+ }
93
+ }]
94
+ });
95
+ const Document = (await import(htmlOutputFile)).default;
96
+ const HTMLElement = /*#__PURE__*/React.createElement(DocumentContext.Provider, {
97
+ value: documentParams
98
+ }, /*#__PURE__*/React.createElement(Document, null));
99
+ const html = ReactDomServer.renderToStaticMarkup(HTMLElement);
100
+ debug("entry %s's document jsx rendered html: %o", entryName, html);
101
+ const scripts = [htmlWebpackPlugin.tags.headTags.filter(item => item.tagName === 'script').join(''), htmlWebpackPlugin.tags.bodyTags.toString()].join('');
102
+ const metas = [templateParameters.meta, htmlWebpackPlugin.tags.headTags.filter(item => item.tagName !== 'script').join('')].join('');
103
+
104
+ // replace the html placeholder while transfer string to jsx component is not a easy way
105
+ return `<!DOCTYPE html>${html}`.replace(DOCUMENT_META_PLACEHOLDER, metas).replace(DOCUMENT_SSR_PLACEHOLDER, HTML_SEPARATOR).replace(DOCUMENT_SCRIPTS_PLACEHOLDER, scripts).replace(DOCUMENT_CHUNKSMAP_PLACEHOLDER, PLACEHOLDER_REPLACER_MAP[DOCUMENT_CHUNKSMAP_PLACEHOLDER]).replace(DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, PLACEHOLDER_REPLACER_MAP[DOCUMENT_SSRDATASCRIPT_PLACEHOLDER]);
106
+ };
107
+ };
108
+ return {
109
+ config: () => {
110
+ return {
111
+ tools: {
112
+ htmlPlugin: (options, entry) => {
113
+ // just for reuse the baseParames calculate by builder:
114
+ // https://github.com/modern-js-dev/modern.js/blob/1abb452a87ae1adbcf8da47d62c05da39cbe4d69/packages/builder/builder-webpack-provider/src/plugins/html.ts#L69-L103
115
+ const hackParameters = typeof (options === null || options === void 0 ? void 0 : options.templateParameters) === 'function' ? options === null || options === void 0 ? void 0 : options.templateParameters({}, {}, {}, {}) : _objectSpread({}, options === null || options === void 0 ? void 0 : options.templateParameters);
116
+ const templateContent = documentEntry(entry.entryName,
117
+ // options,
118
+ hackParameters);
119
+ const documentHtmlOptions = templateContent ? {
120
+ templateContent,
121
+ inject: false
122
+ } : {};
123
+ return _objectSpread(_objectSpread({}, options), documentHtmlOptions);
124
+ }
125
+ }
126
+ };
127
+ }
128
+ };
129
+ }
130
+ }));
@@ -0,0 +1,19 @@
1
+ export const DOC_EXT = ['jsx', 'tsx', 'ts', 'js'];
2
+ export const DOCUMENT_META_PLACEHOLDER = encodeURIComponent('<%= meta %>');
3
+ export const HTML_SEPARATOR = '<!--<?- html ?>-->';
4
+ export const HTML_CHUNKSMAP_SEPARATOR = '<!--<?- chunksMap.js ?>-->';
5
+ export const HTML_SSRDATASCRIPT_SEPARATOR = '<!--<?- SSRDataScript ?>-->';
6
+ // export const HTML_BOTTOMTPL_SEPARATOR = '<!--<?- bottomTemplate ?>-->'; // document jsx not need bottom
7
+
8
+ export const DOCUMENT_SSR_PLACEHOLDER = encodeURIComponent(HTML_SEPARATOR);
9
+ export const DOCUMENT_CHUNKSMAP_PLACEHOLDER = encodeURIComponent(HTML_CHUNKSMAP_SEPARATOR);
10
+ export const DOCUMENT_SSRDATASCRIPT_PLACEHOLDER = encodeURIComponent(HTML_SSRDATASCRIPT_SEPARATOR);
11
+ export const DOCUMENT_FILE_NAME = 'document';
12
+ export const DOCUMENT_SCRIPTS_PLACEHOLDER = encodeURIComponent('<!-- chunk scripts placeholder -->');
13
+ export const DOCUMENT_NO_SCRIPTE_PLACEHOLDER = encodeURIComponent('<!-- no-script -->');
14
+ export const PLACEHOLDER_REPLACER_MAP = {
15
+ [DOCUMENT_NO_SCRIPTE_PLACEHOLDER]: `We're sorry but react app doesn't work properly without JavaScript enabled. Please enable it to continue.`,
16
+ [DOCUMENT_SSR_PLACEHOLDER]: HTML_SEPARATOR,
17
+ [DOCUMENT_CHUNKSMAP_PLACEHOLDER]: HTML_CHUNKSMAP_SEPARATOR,
18
+ [DOCUMENT_SSRDATASCRIPT_PLACEHOLDER]: HTML_SSRDATASCRIPT_SEPARATOR
19
+ };
@@ -0,0 +1,8 @@
1
+ export * from "./Html";
2
+ export * from "./DocumentContext";
3
+ export * from "./DocumentStructrueContext";
4
+ export * from "./Head";
5
+ export * from "./Body";
6
+ export * from "./Root";
7
+ export * from "./Scripts";
8
+ export * from "./constants";
@@ -1,2 +1,2 @@
1
1
  export { isBrowser } from "./common";
2
- export { createApp, createPlugin, useLoader, bootstrap, RuntimeReactContext, registerPrefetch, defineConfig, registerInit, useRuntimeContext } from "./core";
2
+ export { createApp, createPlugin, useLoader, bootstrap, RuntimeReactContext, defineConfig, registerInit, useRuntimeContext } from "./core";
@@ -1,9 +1,6 @@
1
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
2
  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
3
  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
4
  import { getEntryOptions, createRuntimeExportsUtils, PLUGIN_SCHEMAS } from '@modern-js/utils';
8
5
  const PLUGIN_IDENTIFIER = 'router';
9
6
  const ROUTES_IDENTIFIER = 'routes';
@@ -25,17 +22,14 @@ export default (() => ({
25
22
  }
26
23
  };
27
24
  },
28
-
29
25
  validateSchema() {
30
26
  return PLUGIN_SCHEMAS['@modern-js/plugin-router'];
31
27
  },
32
-
33
28
  modifyEntryImports({
34
29
  entrypoint,
35
30
  imports
36
31
  }) {
37
32
  var _userConfig$runtime, _userConfig$runtime$r;
38
-
39
33
  const {
40
34
  entryName,
41
35
  fileSystemRoutes
@@ -47,7 +41,6 @@ export default (() => ({
47
41
  } = api.useAppContext();
48
42
  const runtimeConfig = getEntryOptions(entryName, userConfig.runtime, userConfig.runtimeByEntries, packageName);
49
43
  runtimeConfigMap.set(entryName, runtimeConfig);
50
-
51
44
  if (runtimeConfig !== null && runtimeConfig !== void 0 && runtimeConfig.router) {
52
45
  if (!isLegacy) {
53
46
  imports.push({
@@ -60,19 +53,16 @@ export default (() => ({
60
53
  } else if (fileSystemRoutes) {
61
54
  throw new Error(`should enable runtime.router for entry ${entryName}`);
62
55
  }
63
-
64
56
  return {
65
57
  entrypoint,
66
58
  imports
67
59
  };
68
60
  },
69
-
70
61
  modifyEntryRuntimePlugins({
71
62
  entrypoint,
72
63
  plugins
73
64
  }) {
74
65
  var _userConfig$runtime2, _userConfig$runtime2$;
75
-
76
66
  const {
77
67
  entryName,
78
68
  fileSystemRoutes
@@ -83,7 +73,6 @@ export default (() => ({
83
73
  const userConfig = api.useResolvedConfigContext();
84
74
  const isLegacy = Boolean(userConfig === null || userConfig === void 0 ? void 0 : (_userConfig$runtime2 = userConfig.runtime) === null || _userConfig$runtime2 === void 0 ? void 0 : (_userConfig$runtime2$ = _userConfig$runtime2.router) === null || _userConfig$runtime2$ === void 0 ? void 0 : _userConfig$runtime2$.legacy);
85
75
  const runtimeConfig = runtimeConfigMap.get(entryName);
86
-
87
76
  if (runtimeConfig.router && !isLegacy) {
88
77
  // Todo: plugin-router best to only handle manage client route.
89
78
  // here support base server route usage, part for compatibility
@@ -97,24 +86,19 @@ export default (() => ({
97
86
  })).replace(/"routesConfig"\s*:\s*"((\S|\s)+)"/g, '"routesConfig": $1,')
98
87
  });
99
88
  }
100
-
101
89
  return {
102
90
  entrypoint,
103
91
  plugins
104
92
  };
105
93
  },
106
-
107
94
  addRuntimeExports() {
108
95
  var _userConfig$runtime3, _userConfig$runtime3$;
109
-
110
96
  const userConfig = api.useResolvedConfigContext();
111
97
  const isLegacy = Boolean(userConfig === null || userConfig === void 0 ? void 0 : (_userConfig$runtime3 = userConfig.runtime) === null || _userConfig$runtime3 === void 0 ? void 0 : (_userConfig$runtime3$ = _userConfig$runtime3.router) === null || _userConfig$runtime3$ === void 0 ? void 0 : _userConfig$runtime3$.legacy);
112
-
113
98
  if (!isLegacy) {
114
99
  pluginsExportsUtils.addExport(`export { default as router } from '@modern-js/runtime/router'`);
115
100
  }
116
101
  }
117
-
118
102
  };
119
103
  }
120
104
  }));
@@ -1,9 +1,6 @@
1
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
2
  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
3
  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
4
  import React from 'react';
8
5
  import { createBrowserRouter, createHashRouter, RouterProvider, createRoutesFromElements } from 'react-router-dom';
9
6
  import hoistNonReactStatics from 'hoist-non-react-statics';
@@ -16,7 +13,6 @@ export const routerPlugin = ({
16
13
  createRoutes
17
14
  }) => {
18
15
  const select = pathname => _serverBase.find(baseUrl => pathname.search(baseUrl) === 0) || '/';
19
-
20
16
  return {
21
17
  name: '@modern-js/plugin-router',
22
18
  setup: () => {
@@ -31,11 +27,9 @@ export const routerPlugin = ({
31
27
  App
32
28
  });
33
29
  }
34
-
35
30
  const getRouteApp = () => {
36
31
  return props => {
37
32
  var _window$_SERVER_DATA;
38
-
39
33
  const routeElements = renderRoutes(routesConfig);
40
34
  const routes = createRoutes ? createRoutes() : createRoutesFromElements(routeElements);
41
35
  const baseUrl = ((_window$_SERVER_DATA = window._SERVER_DATA) === null || _window$_SERVER_DATA === void 0 ? void 0 : _window$_SERVER_DATA.router.baseUrl) || select(location.pathname);
@@ -51,15 +45,12 @@ export const routerPlugin = ({
51
45
  }));
52
46
  };
53
47
  };
54
-
55
48
  const RouteApp = getRouteApp();
56
-
57
49
  if (routesConfig.globalApp) {
58
50
  return next({
59
51
  App: hoistNonReactStatics(RouteApp, routesConfig.globalApp)
60
52
  });
61
53
  }
62
-
63
54
  return next({
64
55
  App: RouteApp
65
56
  });