@modern-js/app-tools 2.58.3 → 2.59.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 (222) hide show
  1. package/dist/cjs/builder/generator/index.js +2 -3
  2. package/dist/cjs/builder/shared/builderPlugins/index.js +1 -3
  3. package/dist/cjs/commands/dev.js +1 -1
  4. package/dist/cjs/index.js +10 -3
  5. package/dist/cjs/plugins/analyze/getFileSystemEntry.js +50 -44
  6. package/dist/esm/builder/builder-rspack/adapterCopy.js +166 -0
  7. package/dist/esm/builder/builder-rspack/index.js +34 -0
  8. package/dist/esm/builder/builder-webpack/adapterModern.js +29 -0
  9. package/dist/esm/builder/builder-webpack/createCopyPattern.js +43 -0
  10. package/dist/esm/builder/builder-webpack/index.js +52 -0
  11. package/dist/esm/builder/generator/createBuilderProviderConfig.js +37 -0
  12. package/dist/esm/builder/generator/getBuilderEnvironments.js +81 -0
  13. package/dist/esm/builder/generator/index.js +93 -0
  14. package/dist/esm/builder/index.js +45 -0
  15. package/dist/esm/builder/shared/builderPlugins/adapterBasic.js +85 -0
  16. package/dist/esm/builder/shared/builderPlugins/adapterHtml.js +126 -0
  17. package/dist/esm/builder/shared/builderPlugins/adapterSSR.js +261 -0
  18. package/dist/esm/builder/shared/builderPlugins/index.js +3 -0
  19. package/dist/esm/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.js +51 -0
  20. package/dist/esm/builder/shared/bundlerPlugins/HtmlBottomTemplate.js +37 -0
  21. package/dist/esm/builder/shared/bundlerPlugins/RouterPlugin.js +314 -0
  22. package/dist/esm/builder/shared/bundlerPlugins/index.js +3 -0
  23. package/dist/esm/builder/shared/createCopyInfo.js +14 -0
  24. package/dist/esm/builder/shared/index.js +3 -0
  25. package/dist/esm/builder/shared/loaders/serverModuleLoader.js +7 -0
  26. package/dist/esm/builder/shared/types.js +0 -0
  27. package/dist/esm/commands/build.js +140 -0
  28. package/dist/esm/commands/deploy.js +48 -0
  29. package/dist/esm/commands/dev.js +193 -0
  30. package/dist/esm/commands/index.js +411 -0
  31. package/dist/esm/commands/inspect.js +28 -0
  32. package/dist/esm/commands/serve.js +94 -0
  33. package/dist/esm/config/default.js +190 -0
  34. package/dist/esm/config/index.js +3 -0
  35. package/dist/esm/config/initialize/index.js +9 -0
  36. package/dist/esm/config/initialize/inits.js +89 -0
  37. package/dist/esm/config/legacy/createHtmlConfig.js +21 -0
  38. package/dist/esm/config/legacy/createOutputConfig.js +45 -0
  39. package/dist/esm/config/legacy/createSourceConfig.js +46 -0
  40. package/dist/esm/config/legacy/createToolsConfig.js +28 -0
  41. package/dist/esm/config/legacy/index.js +43 -0
  42. package/dist/esm/defineConfig.js +16 -0
  43. package/dist/esm/esm/esbuild-loader.mjs +20 -0
  44. package/dist/esm/esm/register-esm.mjs +66 -0
  45. package/dist/esm/esm/ts-node-loader.mjs +21 -0
  46. package/dist/esm/esm/utils.mjs +43 -0
  47. package/dist/esm/exports/server.js +4 -0
  48. package/dist/esm/hooks.js +34 -0
  49. package/dist/esm/index.js +246 -0
  50. package/dist/esm/locale/en.js +43 -0
  51. package/dist/esm/locale/index.js +12 -0
  52. package/dist/esm/locale/zh.js +43 -0
  53. package/dist/esm/plugins/analyze/constants.js +14 -0
  54. package/dist/esm/plugins/analyze/getBundleEntry.js +102 -0
  55. package/dist/esm/plugins/analyze/getFileSystemEntry.js +266 -0
  56. package/dist/esm/plugins/analyze/getHtmlTemplate.js +178 -0
  57. package/dist/esm/plugins/analyze/getServerRoutes.js +132 -0
  58. package/dist/esm/plugins/analyze/index.js +380 -0
  59. package/dist/esm/plugins/analyze/isDefaultExportFunction.js +49 -0
  60. package/dist/esm/plugins/analyze/templates.js +6 -0
  61. package/dist/esm/plugins/analyze/utils.js +101 -0
  62. package/dist/esm/plugins/deploy/dependencies/index.js +615 -0
  63. package/dist/esm/plugins/deploy/dependencies/utils.js +421 -0
  64. package/dist/esm/plugins/deploy/exports.js +4 -0
  65. package/dist/esm/plugins/deploy/index.js +135 -0
  66. package/dist/esm/plugins/deploy/platforms/netlify-entry.js +11 -0
  67. package/dist/esm/plugins/deploy/platforms/netlify-entry.mjs +1 -0
  68. package/dist/esm/plugins/deploy/platforms/netlify-handler.js +205 -0
  69. package/dist/esm/plugins/deploy/platforms/netlify.js +327 -0
  70. package/dist/esm/plugins/deploy/platforms/node-entry.js +108 -0
  71. package/dist/esm/plugins/deploy/platforms/node.js +161 -0
  72. package/dist/esm/plugins/deploy/platforms/platform.js +0 -0
  73. package/dist/esm/plugins/deploy/platforms/vercel-entry.js +11 -0
  74. package/dist/esm/plugins/deploy/platforms/vercel-entry.mjs +3 -0
  75. package/dist/esm/plugins/deploy/platforms/vercel-handler.js +206 -0
  76. package/dist/esm/plugins/deploy/platforms/vercel.js +261 -0
  77. package/dist/esm/plugins/deploy/utils.js +47 -0
  78. package/dist/esm/plugins/initialize/index.js +119 -0
  79. package/dist/esm/plugins/serverBuild.js +87 -0
  80. package/dist/esm/types/config/deploy.js +0 -0
  81. package/dist/esm/types/config/dev.js +0 -0
  82. package/dist/esm/types/config/experiments.js +0 -0
  83. package/dist/esm/types/config/html.js +0 -0
  84. package/dist/esm/types/config/index.js +1 -0
  85. package/dist/esm/types/config/output.js +0 -0
  86. package/dist/esm/types/config/performance.js +0 -0
  87. package/dist/esm/types/config/security.js +0 -0
  88. package/dist/esm/types/config/source.js +0 -0
  89. package/dist/esm/types/config/testing.js +0 -0
  90. package/dist/esm/types/config/tools.js +0 -0
  91. package/dist/esm/types/hooks.js +0 -0
  92. package/dist/esm/types/index.js +3 -0
  93. package/dist/esm/types/legacyConfig/deploy.js +0 -0
  94. package/dist/esm/types/legacyConfig/dev.js +0 -0
  95. package/dist/esm/types/legacyConfig/index.js +0 -0
  96. package/dist/esm/types/legacyConfig/output.js +0 -0
  97. package/dist/esm/types/legacyConfig/source.js +0 -0
  98. package/dist/esm/types/legacyConfig/testing.js +0 -0
  99. package/dist/esm/types/legacyConfig/tools.js +0 -0
  100. package/dist/esm/types/utils.js +0 -0
  101. package/dist/esm/utils/config.js +122 -0
  102. package/dist/esm/utils/createServer.js +58 -0
  103. package/dist/esm/utils/env.js +16 -0
  104. package/dist/esm/utils/generateWatchFiles.js +71 -0
  105. package/dist/esm/utils/getSelectedEntries.js +67 -0
  106. package/dist/esm/utils/loadPlugins.js +74 -0
  107. package/dist/esm/utils/printInstructions.js +32 -0
  108. package/dist/esm/utils/register.js +188 -0
  109. package/dist/esm/utils/restart.js +67 -0
  110. package/dist/esm/utils/routes.js +42 -0
  111. package/dist/esm/utils/types.js +0 -0
  112. package/dist/esm-node/builder/builder-rspack/adapterCopy.js +67 -0
  113. package/dist/esm-node/builder/builder-rspack/index.js +12 -0
  114. package/dist/esm-node/builder/builder-webpack/adapterModern.js +26 -0
  115. package/dist/esm-node/builder/builder-webpack/createCopyPattern.js +41 -0
  116. package/dist/esm-node/builder/builder-webpack/index.js +20 -0
  117. package/dist/esm-node/builder/generator/createBuilderProviderConfig.js +44 -0
  118. package/dist/esm-node/builder/generator/getBuilderEnvironments.js +60 -0
  119. package/dist/esm-node/builder/generator/index.js +36 -0
  120. package/dist/esm-node/builder/index.js +11 -0
  121. package/dist/esm-node/builder/shared/builderPlugins/adapterBasic.js +48 -0
  122. package/dist/esm-node/builder/shared/builderPlugins/adapterHtml.js +60 -0
  123. package/dist/esm-node/builder/shared/builderPlugins/adapterSSR.js +151 -0
  124. package/dist/esm-node/builder/shared/builderPlugins/index.js +3 -0
  125. package/dist/esm-node/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.js +30 -0
  126. package/dist/esm-node/builder/shared/bundlerPlugins/HtmlBottomTemplate.js +31 -0
  127. package/dist/esm-node/builder/shared/bundlerPlugins/RouterPlugin.js +228 -0
  128. package/dist/esm-node/builder/shared/bundlerPlugins/index.js +3 -0
  129. package/dist/esm-node/builder/shared/createCopyInfo.js +14 -0
  130. package/dist/esm-node/builder/shared/index.js +3 -0
  131. package/dist/esm-node/builder/shared/loaders/serverModuleLoader.js +7 -0
  132. package/dist/esm-node/builder/shared/types.js +0 -0
  133. package/dist/esm-node/commands/build.js +64 -0
  134. package/dist/esm-node/commands/deploy.js +12 -0
  135. package/dist/esm-node/commands/dev.js +105 -0
  136. package/dist/esm-node/commands/index.js +92 -0
  137. package/dist/esm-node/commands/inspect.js +15 -0
  138. package/dist/esm-node/commands/serve.js +52 -0
  139. package/dist/esm-node/config/default.js +197 -0
  140. package/dist/esm-node/config/index.js +3 -0
  141. package/dist/esm-node/config/initialize/index.js +9 -0
  142. package/dist/esm-node/config/initialize/inits.js +79 -0
  143. package/dist/esm-node/config/legacy/createHtmlConfig.js +21 -0
  144. package/dist/esm-node/config/legacy/createOutputConfig.js +45 -0
  145. package/dist/esm-node/config/legacy/createSourceConfig.js +29 -0
  146. package/dist/esm-node/config/legacy/createToolsConfig.js +28 -0
  147. package/dist/esm-node/config/legacy/index.js +43 -0
  148. package/dist/esm-node/defineConfig.js +13 -0
  149. package/dist/esm-node/esm/esbuild-loader.mjs +20 -0
  150. package/dist/esm-node/esm/register-esm.mjs +66 -0
  151. package/dist/esm-node/esm/ts-node-loader.mjs +21 -0
  152. package/dist/esm-node/esm/utils.mjs +43 -0
  153. package/dist/esm-node/exports/server.js +4 -0
  154. package/dist/esm-node/hooks.js +34 -0
  155. package/dist/esm-node/index.js +131 -0
  156. package/dist/esm-node/locale/en.js +43 -0
  157. package/dist/esm-node/locale/index.js +12 -0
  158. package/dist/esm-node/locale/zh.js +43 -0
  159. package/dist/esm-node/plugins/analyze/constants.js +14 -0
  160. package/dist/esm-node/plugins/analyze/getBundleEntry.js +61 -0
  161. package/dist/esm-node/plugins/analyze/getFileSystemEntry.js +106 -0
  162. package/dist/esm-node/plugins/analyze/getHtmlTemplate.js +74 -0
  163. package/dist/esm-node/plugins/analyze/getServerRoutes.js +132 -0
  164. package/dist/esm-node/plugins/analyze/index.js +166 -0
  165. package/dist/esm-node/plugins/analyze/isDefaultExportFunction.js +47 -0
  166. package/dist/esm-node/plugins/analyze/templates.js +24 -0
  167. package/dist/esm-node/plugins/analyze/utils.js +68 -0
  168. package/dist/esm-node/plugins/deploy/dependencies/index.js +202 -0
  169. package/dist/esm-node/plugins/deploy/dependencies/utils.js +137 -0
  170. package/dist/esm-node/plugins/deploy/exports.js +4 -0
  171. package/dist/esm-node/plugins/deploy/index.js +44 -0
  172. package/dist/esm-node/plugins/deploy/platforms/netlify-entry.js +11 -0
  173. package/dist/esm-node/plugins/deploy/platforms/netlify-entry.mjs +1 -0
  174. package/dist/esm-node/plugins/deploy/platforms/netlify-handler.js +71 -0
  175. package/dist/esm-node/plugins/deploy/platforms/netlify.js +117 -0
  176. package/dist/esm-node/plugins/deploy/platforms/node-entry.js +44 -0
  177. package/dist/esm-node/plugins/deploy/platforms/node.js +72 -0
  178. package/dist/esm-node/plugins/deploy/platforms/platform.js +0 -0
  179. package/dist/esm-node/plugins/deploy/platforms/vercel-entry.js +11 -0
  180. package/dist/esm-node/plugins/deploy/platforms/vercel-entry.mjs +3 -0
  181. package/dist/esm-node/plugins/deploy/platforms/vercel-handler.js +72 -0
  182. package/dist/esm-node/plugins/deploy/platforms/vercel.js +129 -0
  183. package/dist/esm-node/plugins/deploy/utils.js +44 -0
  184. package/dist/esm-node/plugins/initialize/index.js +84 -0
  185. package/dist/esm-node/plugins/serverBuild.js +58 -0
  186. package/dist/esm-node/types/config/deploy.js +0 -0
  187. package/dist/esm-node/types/config/dev.js +0 -0
  188. package/dist/esm-node/types/config/experiments.js +0 -0
  189. package/dist/esm-node/types/config/html.js +0 -0
  190. package/dist/esm-node/types/config/index.js +1 -0
  191. package/dist/esm-node/types/config/output.js +0 -0
  192. package/dist/esm-node/types/config/performance.js +0 -0
  193. package/dist/esm-node/types/config/security.js +0 -0
  194. package/dist/esm-node/types/config/source.js +0 -0
  195. package/dist/esm-node/types/config/testing.js +0 -0
  196. package/dist/esm-node/types/config/tools.js +0 -0
  197. package/dist/esm-node/types/hooks.js +0 -0
  198. package/dist/esm-node/types/index.js +3 -0
  199. package/dist/esm-node/types/legacyConfig/deploy.js +0 -0
  200. package/dist/esm-node/types/legacyConfig/dev.js +0 -0
  201. package/dist/esm-node/types/legacyConfig/index.js +0 -0
  202. package/dist/esm-node/types/legacyConfig/output.js +0 -0
  203. package/dist/esm-node/types/legacyConfig/source.js +0 -0
  204. package/dist/esm-node/types/legacyConfig/testing.js +0 -0
  205. package/dist/esm-node/types/legacyConfig/tools.js +0 -0
  206. package/dist/esm-node/types/utils.js +0 -0
  207. package/dist/esm-node/utils/config.js +49 -0
  208. package/dist/esm-node/utils/createServer.js +26 -0
  209. package/dist/esm-node/utils/env.js +16 -0
  210. package/dist/esm-node/utils/generateWatchFiles.js +30 -0
  211. package/dist/esm-node/utils/getSelectedEntries.js +34 -0
  212. package/dist/esm-node/utils/loadPlugins.js +22 -0
  213. package/dist/esm-node/utils/printInstructions.js +11 -0
  214. package/dist/esm-node/utils/register.js +96 -0
  215. package/dist/esm-node/utils/restart.js +22 -0
  216. package/dist/esm-node/utils/routes.js +21 -0
  217. package/dist/esm-node/utils/types.js +0 -0
  218. package/dist/types/builder/shared/builderPlugins/index.d.ts +0 -1
  219. package/dist/types/index.d.ts +1 -1
  220. package/package.json +20 -20
  221. package/dist/cjs/builder/shared/builderPlugins/adapterWorker.js +0 -51
  222. package/dist/types/builder/shared/builderPlugins/adapterWorker.d.ts +0 -2
@@ -0,0 +1,74 @@
1
+ import path from "path";
2
+ import { fs, findExists } from "@modern-js/utils";
3
+ import { HTML_PARTIALS_EXTENSIONS, HTML_PARTIALS_FOLDER } from "./constants";
4
+ import * as templates from "./templates";
5
+ var PartialPosition;
6
+ (function(PartialPosition2) {
7
+ PartialPosition2["TOP"] = "top";
8
+ PartialPosition2["HEAD"] = "head";
9
+ PartialPosition2["BODY"] = "body";
10
+ PartialPosition2["BOTTOM"] = "bottom";
11
+ PartialPosition2["INDEX"] = "index";
12
+ })(PartialPosition || (PartialPosition = {}));
13
+ const findPartials = (dir, entryName, position) => {
14
+ if (fs.existsSync(dir)) {
15
+ const base = findExists(HTML_PARTIALS_EXTENSIONS.map((ext) => path.resolve(dir, `${position}${ext}`)));
16
+ const file = entryName ? findExists(HTML_PARTIALS_EXTENSIONS.map((ext) => path.resolve(dir, entryName, `${position}${ext}`))) || base : base;
17
+ return file ? {
18
+ file,
19
+ content: fs.readFileSync(file, "utf8")
20
+ } : null;
21
+ }
22
+ return null;
23
+ };
24
+ const getHtmlTemplate = async (entrypoints, api, { appContext, config }) => {
25
+ const { appDirectory, internalDirectory } = appContext;
26
+ const { source: { configDir } } = config;
27
+ const htmlDir = path.resolve(appDirectory, configDir || "", HTML_PARTIALS_FOLDER);
28
+ const htmlTemplates = {};
29
+ const partialsByEntrypoint = {};
30
+ for (const entrypoint of entrypoints) {
31
+ const { entryName, isMainEntry } = entrypoint;
32
+ const name = entrypoints.length === 1 && isMainEntry ? "" : entryName;
33
+ const customIndexTemplate = findPartials(htmlDir, name, "index");
34
+ if (customIndexTemplate) {
35
+ htmlTemplates[entryName] = customIndexTemplate.file;
36
+ } else {
37
+ const hookRunners = api.useHookRunners();
38
+ const { partials } = await hookRunners.htmlPartials({
39
+ entrypoint,
40
+ partials: [
41
+ "top",
42
+ "head",
43
+ "body"
44
+ ].reduce((previous, position) => {
45
+ const found = findPartials(htmlDir, name, position);
46
+ previous[position] = found ? [
47
+ found.content
48
+ ] : [];
49
+ return previous;
50
+ }, {
51
+ top: [],
52
+ head: [],
53
+ body: []
54
+ })
55
+ });
56
+ const templatePath = path.resolve(internalDirectory, entryName, "index.html");
57
+ fs.outputFileSync(templatePath, templates.html(partials), "utf8");
58
+ htmlTemplates[entryName] = templatePath;
59
+ partialsByEntrypoint[entryName] = partials;
60
+ const bottomTemplate = findPartials(htmlDir, name, "bottom");
61
+ if (bottomTemplate) {
62
+ htmlTemplates[`__${entryName}-bottom__`] = bottomTemplate.content;
63
+ }
64
+ }
65
+ }
66
+ api.setAppContext({
67
+ ...api.useAppContext(),
68
+ partialsByEntrypoint
69
+ });
70
+ return htmlTemplates;
71
+ };
72
+ export {
73
+ getHtmlTemplate
74
+ };
@@ -0,0 +1,132 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { SERVER_BUNDLE_DIRECTORY, SERVER_WORKER_BUNDLE_DIRECTORY, getEntryOptions, isPlainObject, removeLeadingSlash, removeTailSlash, urlJoin } from "@modern-js/utils";
4
+ import { isMainEntry } from "../../utils/routes";
5
+ import { walkDirectory } from "./utils";
6
+ const applyBaseUrl = (baseUrl, routes) => {
7
+ if (baseUrl) {
8
+ if (Array.isArray(baseUrl)) {
9
+ return baseUrl.reduce((previous, current) => [
10
+ ...previous,
11
+ ...applyBaseUrl(current, routes)
12
+ ], []);
13
+ } else {
14
+ return routes.map((route) => {
15
+ const urlPath = urlJoin(baseUrl, route.urlPath);
16
+ return {
17
+ ...route,
18
+ urlPath: urlPath === "/" ? urlPath : removeTailSlash(urlPath)
19
+ };
20
+ });
21
+ }
22
+ }
23
+ return routes;
24
+ };
25
+ const applyRouteOptions = (original, routeOptions) => {
26
+ const { route, disableSpa } = routeOptions;
27
+ original.isSPA = !disableSpa;
28
+ !original.isSPA && (original.entryPath = path.dirname(original.entryPath));
29
+ let routes;
30
+ if (route) {
31
+ if (Array.isArray(route)) {
32
+ routes = route.map((url) => {
33
+ if (isPlainObject(url)) {
34
+ const { path: urlPath, ...other } = url;
35
+ return {
36
+ ...original,
37
+ ...other,
38
+ urlPath
39
+ };
40
+ } else {
41
+ return {
42
+ ...original,
43
+ urlPath: url
44
+ };
45
+ }
46
+ });
47
+ } else if (isPlainObject(route)) {
48
+ const { path: urlPath, ...other } = route;
49
+ routes = [
50
+ {
51
+ ...original,
52
+ ...other,
53
+ urlPath
54
+ }
55
+ ];
56
+ } else {
57
+ routes = [
58
+ {
59
+ ...original,
60
+ urlPath: route
61
+ }
62
+ ];
63
+ }
64
+ } else {
65
+ routes = [
66
+ original
67
+ ];
68
+ }
69
+ return routes;
70
+ };
71
+ const collectHtmlRoutes = (entrypoints, appContext, config) => {
72
+ var _deploy_worker;
73
+ const { source: { mainEntryName }, html: { disableHtmlFolder }, output: { distPath: { html: htmlPath } = {} }, server: { baseUrl, routes, ssr, ssrByEntries }, deploy } = config;
74
+ const { packageName } = appContext;
75
+ const workerSSR = deploy === null || deploy === void 0 ? void 0 : (_deploy_worker = deploy.worker) === null || _deploy_worker === void 0 ? void 0 : _deploy_worker.ssr;
76
+ let htmlRoutes = entrypoints.reduce((previous, { entryName }) => {
77
+ const isMain = isMainEntry(entryName, mainEntryName);
78
+ const entryOptions = getEntryOptions(entryName, isMain, ssr, ssrByEntries, packageName);
79
+ const isSSR = Boolean(entryOptions);
80
+ const isWorker = Boolean(workerSSR);
81
+ const isStream = typeof entryOptions === "object" && entryOptions.mode === "stream";
82
+ const { resHeaders } = (routes === null || routes === void 0 ? void 0 : routes[entryName]) || {};
83
+ let route = {
84
+ urlPath: `/${isMain ? "" : entryName}`,
85
+ entryName,
86
+ entryPath: removeLeadingSlash(path.posix.normalize(`${htmlPath}/${entryName}${disableHtmlFolder ? ".html" : "/index.html"}`)),
87
+ isSPA: true,
88
+ isStream,
89
+ isSSR,
90
+ responseHeaders: resHeaders,
91
+ worker: isWorker ? `${SERVER_WORKER_BUNDLE_DIRECTORY}/${entryName}.js` : void 0,
92
+ bundle: isSSR ? `${SERVER_BUNDLE_DIRECTORY}/${entryName}.js` : void 0
93
+ };
94
+ if (routes === null || routes === void 0 ? void 0 : routes.hasOwnProperty(entryName)) {
95
+ const routeOptions = isPlainObject(routes[entryName]) ? routes[entryName] : {
96
+ route: routes[entryName]
97
+ };
98
+ route = applyRouteOptions(route, routeOptions);
99
+ }
100
+ return Array.isArray(route) ? [
101
+ ...previous,
102
+ ...route
103
+ ] : [
104
+ ...previous,
105
+ route
106
+ ];
107
+ }, []);
108
+ htmlRoutes = applyBaseUrl(baseUrl, htmlRoutes);
109
+ return htmlRoutes;
110
+ };
111
+ const collectStaticRoutes = (appContext, config) => {
112
+ const { appDirectory } = appContext;
113
+ const { source: { configDir }, server: { publicRoutes = {} } } = config;
114
+ const publicFolder = path.resolve(appDirectory, configDir || "", "public");
115
+ return fs.existsSync(publicFolder) ? walkDirectory(publicFolder).map((filePath) => {
116
+ const urlPath = `${urlJoin(toPosix(filePath).slice(toPosix(publicFolder).length))}`;
117
+ return {
118
+ urlPath: publicRoutes[removeLeadingSlash(urlPath)] || urlPath,
119
+ isSPA: true,
120
+ isSSR: false,
121
+ entryPath: toPosix(path.relative(path.resolve(appDirectory, configDir || ""), filePath))
122
+ };
123
+ }) : [];
124
+ };
125
+ const getServerRoutes = (entrypoints, { appContext, config }) => [
126
+ ...collectHtmlRoutes(entrypoints, appContext, config),
127
+ ...collectStaticRoutes(appContext, config)
128
+ ];
129
+ const toPosix = (pathStr) => pathStr.split(path.sep).join(path.posix.sep);
130
+ export {
131
+ getServerRoutes
132
+ };
@@ -0,0 +1,166 @@
1
+ import * as path from "path";
2
+ import { fs, createDebugger, getArgv, isApiOnly, isDevCommand, minimist } from "@modern-js/utils";
3
+ import { createBuilderGenerator } from "../../builder";
4
+ import { initialNormalizedConfig } from "../../config";
5
+ import { emitResolvedConfig } from "../../utils/config";
6
+ import { getSelectedEntries } from "../../utils/getSelectedEntries";
7
+ import { printInstructions } from "../../utils/printInstructions";
8
+ import { generateRoutes } from "../../utils/routes";
9
+ import { checkIsBuildCommands } from "./utils";
10
+ const debug = createDebugger("plugin-analyze");
11
+ var analyze_default = ({ bundler }) => ({
12
+ name: "@modern-js/plugin-analyze",
13
+ post: [
14
+ "@modern-js/runtime"
15
+ ],
16
+ setup: (api) => {
17
+ let pagesDir = [];
18
+ let nestedRouteEntries = [];
19
+ return {
20
+ async prepare() {
21
+ var _resolvedConfig_source;
22
+ let appContext = api.useAppContext();
23
+ const resolvedConfig = api.useResolvedConfigContext();
24
+ const hookRunners = api.useHookRunners();
25
+ try {
26
+ if (checkIsBuildCommands()) {
27
+ fs.emptydirSync(appContext.internalDirectory);
28
+ }
29
+ } catch {
30
+ }
31
+ const apiOnly = await isApiOnly(appContext.appDirectory, (_resolvedConfig_source = resolvedConfig.source) === null || _resolvedConfig_source === void 0 ? void 0 : _resolvedConfig_source.entriesDir, appContext.apiDirectory);
32
+ await hookRunners.addRuntimeExports();
33
+ if (apiOnly) {
34
+ const { routes: routes2 } = await hookRunners.modifyServerRoutes({
35
+ routes: []
36
+ });
37
+ debug(`server routes: %o`, routes2);
38
+ appContext = {
39
+ ...api.useAppContext(),
40
+ apiOnly,
41
+ serverRoutes: routes2
42
+ };
43
+ api.setAppContext(appContext);
44
+ return;
45
+ }
46
+ const [{ getBundleEntry }, { getServerRoutes }, { getHtmlTemplate }] = await Promise.all([
47
+ import("./getBundleEntry.js"),
48
+ import("./getServerRoutes.js"),
49
+ import("./getHtmlTemplate.js")
50
+ ]);
51
+ const { entrypoints } = await hookRunners.modifyEntrypoints({
52
+ entrypoints: await getBundleEntry(hookRunners, appContext, resolvedConfig)
53
+ });
54
+ debug(`entrypoints: %o`, entrypoints);
55
+ const initialRoutes = getServerRoutes(entrypoints, {
56
+ appContext,
57
+ config: resolvedConfig
58
+ });
59
+ const { routes } = await hookRunners.modifyServerRoutes({
60
+ routes: initialRoutes
61
+ });
62
+ debug(`server routes: %o`, routes);
63
+ appContext = {
64
+ ...api.useAppContext(),
65
+ entrypoints,
66
+ serverRoutes: routes
67
+ };
68
+ api.setAppContext(appContext);
69
+ nestedRouteEntries = entrypoints.map((point) => point.nestedRoutesEntry).filter(Boolean);
70
+ pagesDir = entrypoints.map((point) => point.entry).filter((entry) => entry && !path.extname(entry)).concat(nestedRouteEntries);
71
+ const htmlTemplates = await getHtmlTemplate(entrypoints, api, {
72
+ appContext,
73
+ config: resolvedConfig
74
+ });
75
+ debug(`html templates: %o`, htmlTemplates);
76
+ await hookRunners.addDefineTypes();
77
+ debug(`add Define Types`);
78
+ let checkedEntries = entrypoints.map((point) => point.entryName);
79
+ if (isDevCommand()) {
80
+ const { entry } = minimist(getArgv());
81
+ checkedEntries = await getSelectedEntries(typeof entry === "string" ? entry.split(",") : entry, entrypoints);
82
+ }
83
+ appContext = {
84
+ ...api.useAppContext(),
85
+ entrypoints,
86
+ checkedEntries,
87
+ apiOnly,
88
+ serverRoutes: routes,
89
+ htmlTemplates
90
+ };
91
+ api.setAppContext(appContext);
92
+ if (checkIsBuildCommands()) {
93
+ await hookRunners.generateEntryCode({
94
+ entrypoints
95
+ });
96
+ const normalizedConfig = api.useResolvedConfigContext();
97
+ const createBuilderForModern = await createBuilderGenerator(bundler);
98
+ const builder = await createBuilderForModern({
99
+ normalizedConfig,
100
+ appContext
101
+ });
102
+ builder.onBeforeBuild(async ({ bundlerConfigs, isFirstCompile }) => {
103
+ if (!isFirstCompile) {
104
+ return;
105
+ }
106
+ const hookRunners2 = api.useHookRunners();
107
+ await generateRoutes(appContext);
108
+ await hookRunners2.beforeBuild({
109
+ bundlerConfigs
110
+ });
111
+ });
112
+ builder.onAfterBuild(async ({ stats }) => {
113
+ const hookRunners2 = api.useHookRunners();
114
+ await hookRunners2.afterBuild({
115
+ stats
116
+ });
117
+ await emitResolvedConfig(appContext.appDirectory, normalizedConfig);
118
+ });
119
+ builder.onDevCompileDone(async ({ isFirstCompile }) => {
120
+ const hookRunners2 = api.useHookRunners();
121
+ hookRunners2.afterDev({
122
+ isFirstCompile
123
+ });
124
+ if (isFirstCompile) {
125
+ printInstructions(hookRunners2, appContext, normalizedConfig);
126
+ }
127
+ });
128
+ builder.onBeforeCreateCompiler(async ({ bundlerConfigs }) => {
129
+ const hookRunners2 = api.useHookRunners();
130
+ await hookRunners2.beforeCreateCompiler({
131
+ bundlerConfigs
132
+ });
133
+ });
134
+ builder.onAfterCreateCompiler(async ({ compiler }) => {
135
+ const hookRunners2 = api.useHookRunners();
136
+ await hookRunners2.afterCreateCompiler({
137
+ compiler
138
+ });
139
+ });
140
+ builder.addPlugins(resolvedConfig.builderPlugins);
141
+ appContext = {
142
+ ...api.useAppContext(),
143
+ builder
144
+ };
145
+ api.setAppContext(appContext);
146
+ }
147
+ },
148
+ watchFiles() {
149
+ return {
150
+ files: pagesDir,
151
+ isPrivate: true
152
+ };
153
+ },
154
+ resolvedConfig({ resolved }) {
155
+ const appContext = api.useAppContext();
156
+ const config = initialNormalizedConfig(resolved, appContext, bundler);
157
+ return {
158
+ resolved: config
159
+ };
160
+ }
161
+ };
162
+ }
163
+ });
164
+ export {
165
+ analyze_default as default
166
+ };
@@ -0,0 +1,47 @@
1
+ import fs from "fs";
2
+ import { parse } from "@babel/parser";
3
+ import traverse from "@babel/traverse";
4
+ import * as t from "@babel/types";
5
+ const isFunction = (node) => t.isFunctionDeclaration(node) || t.isFunctionExpression(node) || t.isArrowFunctionExpression(node);
6
+ const isDefaultExportFunction = (file) => {
7
+ if (!file || !fs.existsSync(file)) {
8
+ return false;
9
+ }
10
+ const ast = parse(fs.readFileSync(file, "utf8"), {
11
+ sourceType: "unambiguous",
12
+ plugins: [
13
+ "jsx",
14
+ "typescript",
15
+ "classProperties",
16
+ "dynamicImport",
17
+ "exportDefaultFrom",
18
+ "exportNamespaceFrom",
19
+ "decorators-legacy",
20
+ "functionBind",
21
+ "classPrivateMethods",
22
+ [
23
+ "pipelineOperator",
24
+ {
25
+ proposal: "minimal"
26
+ }
27
+ ],
28
+ "optionalChaining",
29
+ "optionalCatchBinding",
30
+ "objectRestSpread",
31
+ "numericSeparator"
32
+ ]
33
+ });
34
+ let isExportFunction = false;
35
+ traverse(ast, {
36
+ ExportDefaultDeclaration: (path) => {
37
+ const { declaration } = path.node;
38
+ if (isFunction(declaration)) {
39
+ isExportFunction = true;
40
+ }
41
+ }
42
+ });
43
+ return isExportFunction;
44
+ };
45
+ export {
46
+ isDefaultExportFunction
47
+ };
@@ -0,0 +1,24 @@
1
+ const html = (partials) => `
2
+ <!DOCTYPE html>
3
+ <html>
4
+ <head>
5
+
6
+ ${partials.top.join("\n")}
7
+
8
+ ${partials.head.join("\n")}
9
+
10
+ </head>
11
+
12
+ <body>
13
+ <div id="<%= mountId %>"><!--<?- html ?>--></div>
14
+ ${partials.body.join("\n")}
15
+ <!--<?- chunksMap.js ?>-->
16
+ <!--<?- SSRDataScript ?>-->
17
+ <!--<?- bottomTemplate ?>-->
18
+ </body>
19
+
20
+ </html>
21
+ `;
22
+ export {
23
+ html
24
+ };
@@ -0,0 +1,68 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { JS_EXTENSIONS, getCommand, normalizeToPosixPath } from "@modern-js/utils";
4
+ import { parse } from "es-module-lexer";
5
+ import { transform } from "esbuild";
6
+ const walkDirectory = (dir) => fs.readdirSync(dir).reduce((previous, filename) => {
7
+ const filePath = path.join(dir, filename);
8
+ if (fs.statSync(filePath).isDirectory()) {
9
+ return [
10
+ ...previous,
11
+ ...walkDirectory(filePath)
12
+ ];
13
+ } else {
14
+ return [
15
+ ...previous,
16
+ filePath
17
+ ];
18
+ }
19
+ }, []);
20
+ const replaceWithAlias = (base, filePath, alias) => {
21
+ if (filePath.includes(base)) {
22
+ return normalizeToPosixPath(path.join(alias, path.relative(base, filePath)));
23
+ } else {
24
+ return filePath;
25
+ }
26
+ };
27
+ const parseModule = async ({ source, filename }) => {
28
+ let content = source;
29
+ if (JS_EXTENSIONS.some((ext) => filename.endsWith(ext))) {
30
+ const result = await transform(content, {
31
+ loader: path.extname(filename).slice(1),
32
+ format: "esm"
33
+ });
34
+ content = result.code;
35
+ }
36
+ return await parse(content);
37
+ };
38
+ const getServerCombinedModueFile = (internalDirectory, entryName) => {
39
+ return path.join(internalDirectory, entryName, "server-loader-combined.js");
40
+ };
41
+ const checkIsBuildCommands = () => {
42
+ const buildCommands = [
43
+ "dev",
44
+ "start",
45
+ "build",
46
+ "inspect",
47
+ "deploy",
48
+ "dev-worker"
49
+ ];
50
+ const command = getCommand();
51
+ return buildCommands.includes(command);
52
+ };
53
+ const isSubDirOrEqual = (parent, child) => {
54
+ if (parent === child) {
55
+ return true;
56
+ }
57
+ const relative = path.relative(parent, child);
58
+ const isSubdir = relative && !relative.startsWith("..") && !path.isAbsolute(relative);
59
+ return Boolean(isSubdir);
60
+ };
61
+ export {
62
+ checkIsBuildCommands,
63
+ getServerCombinedModueFile,
64
+ isSubDirOrEqual,
65
+ parseModule,
66
+ replaceWithAlias,
67
+ walkDirectory
68
+ };