@modern-js/app-tools 2.4.0 → 2.5.0-alpha.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 (276) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/dist/cjs/analyze/constants.js +100 -0
  3. package/dist/cjs/analyze/generateCode.js +251 -0
  4. package/dist/cjs/analyze/getBundleEntry.js +101 -0
  5. package/dist/cjs/analyze/getClientRoutes/getRoutes.js +225 -0
  6. package/dist/cjs/analyze/getClientRoutes/getRoutesLegacy.js +221 -0
  7. package/dist/cjs/analyze/getClientRoutes/index.js +30 -0
  8. package/dist/cjs/analyze/getClientRoutes/utils.js +58 -0
  9. package/dist/cjs/analyze/getFileSystemEntry.js +131 -0
  10. package/dist/cjs/analyze/getHtmlTemplate.js +124 -0
  11. package/dist/cjs/analyze/getServerRoutes.js +174 -0
  12. package/dist/cjs/analyze/index.js +294 -0
  13. package/dist/cjs/analyze/isDefaultExportFunction.js +71 -0
  14. package/dist/cjs/analyze/makeLegalIdentifier.js +36 -0
  15. package/dist/cjs/analyze/nestedRoutes.js +179 -0
  16. package/dist/cjs/analyze/templates.js +330 -0
  17. package/dist/cjs/analyze/utils.js +152 -0
  18. package/dist/cjs/builder/builder-rspack/index.js +31 -0
  19. package/dist/cjs/builder/builder-webpack/builderPlugins/compatModern.js +64 -0
  20. package/dist/cjs/builder/builder-webpack/index.js +78 -0
  21. package/dist/cjs/builder/builder-webpack/webpackPlugins/RouterPlugin.js +120 -0
  22. package/dist/cjs/builder/builder-webpack/webpackPlugins/index.js +17 -0
  23. package/dist/cjs/builder/generator/createBuilderOptions.js +47 -0
  24. package/dist/cjs/builder/generator/createBuilderProviderConfig.js +49 -0
  25. package/dist/cjs/builder/generator/getBuilderTargets.js +39 -0
  26. package/dist/cjs/builder/generator/index.js +58 -0
  27. package/dist/cjs/builder/index.js +46 -0
  28. package/dist/cjs/builder/shared/builderPlugins/adapterModern.js +230 -0
  29. package/dist/cjs/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.js +50 -0
  30. package/dist/cjs/builder/shared/bundlerPlugins/HtmlBottomTemplate.js +57 -0
  31. package/dist/cjs/builder/shared/createCopyPattern.js +75 -0
  32. package/dist/cjs/builder/shared/index.js +19 -0
  33. package/dist/cjs/builder/shared/loaders/serverModuleLoader.js +28 -0
  34. package/dist/cjs/builder/shared/types.js +15 -0
  35. package/dist/cjs/commands/build.js +75 -0
  36. package/dist/cjs/commands/deploy.js +31 -0
  37. package/dist/cjs/commands/dev.js +91 -0
  38. package/dist/cjs/commands/index.js +19 -0
  39. package/dist/cjs/commands/inspect.js +41 -0
  40. package/dist/cjs/commands/serve.js +63 -0
  41. package/dist/cjs/config/default.js +186 -0
  42. package/dist/cjs/config/index.js +19 -0
  43. package/dist/cjs/config/initialize/index.js +35 -0
  44. package/dist/cjs/config/initialize/inits.js +161 -0
  45. package/dist/cjs/config/legacy/createHtmlConfig.js +58 -0
  46. package/dist/cjs/config/legacy/createOutputConfig.js +91 -0
  47. package/dist/cjs/config/legacy/createSourceConfig.js +62 -0
  48. package/dist/cjs/config/legacy/createToolsConfig.js +65 -0
  49. package/dist/cjs/config/legacy/index.js +75 -0
  50. package/dist/cjs/defineConfig.js +33 -0
  51. package/dist/cjs/exports/server.js +27 -0
  52. package/dist/cjs/hooks.js +54 -0
  53. package/dist/cjs/index.js +198 -0
  54. package/dist/cjs/initialize/index.js +102 -0
  55. package/dist/cjs/locale/en.js +59 -0
  56. package/dist/cjs/locale/index.js +33 -0
  57. package/dist/cjs/locale/zh.js +59 -0
  58. package/dist/cjs/schema/Schema.js +63 -0
  59. package/dist/cjs/schema/index.js +118 -0
  60. package/dist/cjs/schema/legacy.js +169 -0
  61. package/dist/cjs/types/config/deploy.js +15 -0
  62. package/dist/cjs/types/config/dev.js +15 -0
  63. package/dist/cjs/types/config/experiments.js +15 -0
  64. package/dist/cjs/types/config/html.js +15 -0
  65. package/dist/cjs/types/config/index.js +17 -0
  66. package/dist/cjs/types/config/output.js +15 -0
  67. package/dist/cjs/types/config/performance.js +15 -0
  68. package/dist/cjs/types/config/security.js +15 -0
  69. package/dist/cjs/types/config/source.js +15 -0
  70. package/dist/cjs/types/config/tools.js +15 -0
  71. package/dist/cjs/types/hooks.js +15 -0
  72. package/dist/cjs/types/index.js +19 -0
  73. package/dist/cjs/types/legacyConfig/deploy.js +15 -0
  74. package/dist/cjs/types/legacyConfig/dev.js +15 -0
  75. package/dist/cjs/types/legacyConfig/index.js +15 -0
  76. package/dist/cjs/types/legacyConfig/output.js +15 -0
  77. package/dist/cjs/types/legacyConfig/source.js +15 -0
  78. package/dist/cjs/types/legacyConfig/tools.js +15 -0
  79. package/dist/cjs/types/utils.js +15 -0
  80. package/dist/cjs/utils/config.js +115 -0
  81. package/dist/cjs/utils/createServer.js +70 -0
  82. package/dist/cjs/utils/env.js +38 -0
  83. package/dist/cjs/utils/generateWatchFiles.js +63 -0
  84. package/dist/cjs/utils/getSelectedEntries.js +61 -0
  85. package/dist/cjs/utils/getServerInternalPlugins.js +41 -0
  86. package/dist/cjs/utils/language.js +31 -0
  87. package/dist/cjs/utils/printInstructions.js +34 -0
  88. package/dist/cjs/utils/restart.js +45 -0
  89. package/dist/cjs/utils/routes.js +39 -0
  90. package/dist/cjs/utils/types.js +15 -0
  91. package/dist/esm/analyze/constants.js +42 -0
  92. package/dist/esm/analyze/generateCode.js +486 -0
  93. package/dist/esm/analyze/getBundleEntry.js +64 -0
  94. package/dist/esm/analyze/getClientRoutes/getRoutes.js +233 -0
  95. package/dist/esm/analyze/getClientRoutes/getRoutesLegacy.js +231 -0
  96. package/dist/esm/analyze/getClientRoutes/index.js +3 -0
  97. package/dist/esm/analyze/getClientRoutes/utils.js +23 -0
  98. package/dist/esm/analyze/getFileSystemEntry.js +107 -0
  99. package/dist/esm/analyze/getHtmlTemplate.js +302 -0
  100. package/dist/esm/analyze/getServerRoutes.js +224 -0
  101. package/dist/esm/analyze/index.js +703 -0
  102. package/dist/esm/analyze/isDefaultExportFunction.js +47 -0
  103. package/dist/esm/analyze/makeLegalIdentifier.js +13 -0
  104. package/dist/esm/analyze/nestedRoutes.js +409 -0
  105. package/dist/esm/analyze/templates.js +466 -0
  106. package/dist/esm/analyze/utils.js +374 -0
  107. package/dist/esm/builder/builder-rspack/index.js +6 -0
  108. package/dist/esm/builder/builder-webpack/builderPlugins/compatModern.js +64 -0
  109. package/dist/esm/builder/builder-webpack/index.js +301 -0
  110. package/dist/esm/builder/builder-webpack/webpackPlugins/RouterPlugin.js +346 -0
  111. package/dist/esm/builder/builder-webpack/webpackPlugins/index.js +1 -0
  112. package/dist/esm/builder/generator/createBuilderOptions.js +41 -0
  113. package/dist/esm/builder/generator/createBuilderProviderConfig.js +70 -0
  114. package/dist/esm/builder/generator/getBuilderTargets.js +16 -0
  115. package/dist/esm/builder/generator/index.js +199 -0
  116. package/dist/esm/builder/index.js +175 -0
  117. package/dist/esm/builder/shared/builderPlugins/adapterModern.js +300 -0
  118. package/dist/esm/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.js +110 -0
  119. package/dist/esm/builder/shared/bundlerPlugins/HtmlBottomTemplate.js +72 -0
  120. package/dist/esm/builder/shared/createCopyPattern.js +40 -0
  121. package/dist/esm/builder/shared/index.js +3 -0
  122. package/dist/esm/builder/shared/loaders/serverModuleLoader.js +5 -0
  123. package/dist/esm/builder/shared/types.js +1 -0
  124. package/dist/esm/commands/build.js +291 -0
  125. package/dist/esm/commands/deploy.js +154 -0
  126. package/dist/esm/commands/dev.js +301 -0
  127. package/dist/esm/commands/index.js +3 -0
  128. package/dist/esm/commands/inspect.js +149 -0
  129. package/dist/esm/commands/serve.js +199 -0
  130. package/dist/esm/config/default.js +210 -0
  131. package/dist/esm/config/index.js +3 -0
  132. package/dist/esm/config/initialize/index.js +10 -0
  133. package/dist/esm/config/initialize/inits.js +211 -0
  134. package/dist/esm/config/legacy/createHtmlConfig.js +19 -0
  135. package/dist/esm/config/legacy/createOutputConfig.js +41 -0
  136. package/dist/esm/config/legacy/createSourceConfig.js +42 -0
  137. package/dist/esm/config/legacy/createToolsConfig.js +23 -0
  138. package/dist/esm/config/legacy/index.js +38 -0
  139. package/dist/esm/defineConfig.js +61 -0
  140. package/dist/esm/exports/server.js +2 -0
  141. package/dist/esm/hooks.js +29 -0
  142. package/dist/esm/index.js +713 -0
  143. package/dist/esm/initialize/index.js +284 -0
  144. package/dist/esm/locale/en.js +38 -0
  145. package/dist/esm/locale/index.js +9 -0
  146. package/dist/esm/locale/zh.js +38 -0
  147. package/dist/esm/schema/Schema.js +273 -0
  148. package/dist/esm/schema/index.js +181 -0
  149. package/dist/esm/schema/legacy.js +337 -0
  150. package/dist/esm/types/config/deploy.js +1 -0
  151. package/dist/esm/types/config/dev.js +1 -0
  152. package/dist/esm/types/config/experiments.js +1 -0
  153. package/dist/esm/types/config/html.js +1 -0
  154. package/dist/esm/types/config/index.js +1 -0
  155. package/dist/esm/types/config/output.js +1 -0
  156. package/dist/esm/types/config/performance.js +1 -0
  157. package/dist/esm/types/config/security.js +1 -0
  158. package/dist/esm/types/config/source.js +1 -0
  159. package/dist/esm/types/config/tools.js +1 -0
  160. package/dist/esm/types/hooks.js +1 -0
  161. package/dist/esm/types/index.js +3 -0
  162. package/dist/esm/types/legacyConfig/deploy.js +1 -0
  163. package/dist/esm/types/legacyConfig/dev.js +1 -0
  164. package/dist/esm/types/legacyConfig/index.js +1 -0
  165. package/dist/esm/types/legacyConfig/output.js +1 -0
  166. package/dist/esm/types/legacyConfig/source.js +1 -0
  167. package/dist/esm/types/legacyConfig/tools.js +1 -0
  168. package/dist/esm/types/utils.js +1 -0
  169. package/dist/esm/utils/config.js +302 -0
  170. package/dist/esm/utils/createServer.js +258 -0
  171. package/dist/esm/utils/env.js +13 -0
  172. package/dist/esm/utils/generateWatchFiles.js +214 -0
  173. package/dist/esm/utils/getSelectedEntries.js +186 -0
  174. package/dist/esm/utils/getServerInternalPlugins.js +210 -0
  175. package/dist/esm/utils/language.js +6 -0
  176. package/dist/esm/utils/printInstructions.js +152 -0
  177. package/dist/esm/utils/restart.js +187 -0
  178. package/dist/esm/utils/routes.js +153 -0
  179. package/dist/esm/utils/types.js +1 -0
  180. package/dist/esm-node/analyze/constants.js +56 -0
  181. package/dist/esm-node/analyze/generateCode.js +227 -0
  182. package/dist/esm-node/analyze/getBundleEntry.js +77 -0
  183. package/dist/esm-node/analyze/getClientRoutes/getRoutes.js +201 -0
  184. package/dist/esm-node/analyze/getClientRoutes/getRoutesLegacy.js +197 -0
  185. package/dist/esm-node/analyze/getClientRoutes/index.js +6 -0
  186. package/dist/esm-node/analyze/getClientRoutes/utils.js +31 -0
  187. package/dist/esm-node/analyze/getFileSystemEntry.js +109 -0
  188. package/dist/esm-node/analyze/getHtmlTemplate.js +95 -0
  189. package/dist/esm-node/analyze/getServerRoutes.js +154 -0
  190. package/dist/esm-node/analyze/index.js +285 -0
  191. package/dist/esm-node/analyze/isDefaultExportFunction.js +42 -0
  192. package/dist/esm-node/analyze/makeLegalIdentifier.js +13 -0
  193. package/dist/esm-node/analyze/nestedRoutes.js +150 -0
  194. package/dist/esm-node/analyze/templates.js +297 -0
  195. package/dist/esm-node/analyze/utils.js +121 -0
  196. package/dist/esm-node/builder/builder-rspack/index.js +8 -0
  197. package/dist/esm-node/builder/builder-webpack/builderPlugins/compatModern.js +41 -0
  198. package/dist/esm-node/builder/builder-webpack/index.js +51 -0
  199. package/dist/esm-node/builder/builder-webpack/webpackPlugins/RouterPlugin.js +96 -0
  200. package/dist/esm-node/builder/builder-webpack/webpackPlugins/index.js +1 -0
  201. package/dist/esm-node/builder/generator/createBuilderOptions.js +24 -0
  202. package/dist/esm-node/builder/generator/createBuilderProviderConfig.js +26 -0
  203. package/dist/esm-node/builder/generator/getBuilderTargets.js +21 -0
  204. package/dist/esm-node/builder/generator/index.js +29 -0
  205. package/dist/esm-node/builder/index.js +17 -0
  206. package/dist/esm-node/builder/shared/builderPlugins/adapterModern.js +202 -0
  207. package/dist/esm-node/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.js +27 -0
  208. package/dist/esm-node/builder/shared/bundlerPlugins/HtmlBottomTemplate.js +34 -0
  209. package/dist/esm-node/builder/shared/createCopyPattern.js +46 -0
  210. package/dist/esm-node/builder/shared/index.js +3 -0
  211. package/dist/esm-node/builder/shared/loaders/serverModuleLoader.js +7 -0
  212. package/dist/esm-node/builder/shared/types.js +0 -0
  213. package/dist/esm-node/commands/build.js +52 -0
  214. package/dist/esm-node/commands/deploy.js +8 -0
  215. package/dist/esm-node/commands/dev.js +72 -0
  216. package/dist/esm-node/commands/index.js +3 -0
  217. package/dist/esm-node/commands/inspect.js +18 -0
  218. package/dist/esm-node/commands/serve.js +34 -0
  219. package/dist/esm-node/config/default.js +162 -0
  220. package/dist/esm-node/config/index.js +3 -0
  221. package/dist/esm-node/config/initialize/index.js +12 -0
  222. package/dist/esm-node/config/initialize/inits.js +136 -0
  223. package/dist/esm-node/config/legacy/createHtmlConfig.js +35 -0
  224. package/dist/esm-node/config/legacy/createOutputConfig.js +68 -0
  225. package/dist/esm-node/config/legacy/createSourceConfig.js +39 -0
  226. package/dist/esm-node/config/legacy/createToolsConfig.js +42 -0
  227. package/dist/esm-node/config/legacy/index.js +51 -0
  228. package/dist/esm-node/defineConfig.js +9 -0
  229. package/dist/esm-node/exports/server.js +4 -0
  230. package/dist/esm-node/hooks.js +35 -0
  231. package/dist/esm-node/index.js +172 -0
  232. package/dist/esm-node/initialize/index.js +91 -0
  233. package/dist/esm-node/locale/en.js +36 -0
  234. package/dist/esm-node/locale/index.js +9 -0
  235. package/dist/esm-node/locale/zh.js +36 -0
  236. package/dist/esm-node/schema/Schema.js +40 -0
  237. package/dist/esm-node/schema/index.js +88 -0
  238. package/dist/esm-node/schema/legacy.js +148 -0
  239. package/dist/esm-node/types/config/deploy.js +0 -0
  240. package/dist/esm-node/types/config/dev.js +0 -0
  241. package/dist/esm-node/types/config/experiments.js +0 -0
  242. package/dist/esm-node/types/config/html.js +0 -0
  243. package/dist/esm-node/types/config/index.js +1 -0
  244. package/dist/esm-node/types/config/output.js +0 -0
  245. package/dist/esm-node/types/config/performance.js +0 -0
  246. package/dist/esm-node/types/config/security.js +0 -0
  247. package/dist/esm-node/types/config/source.js +0 -0
  248. package/dist/esm-node/types/config/tools.js +0 -0
  249. package/dist/esm-node/types/hooks.js +0 -0
  250. package/dist/esm-node/types/index.js +3 -0
  251. package/dist/esm-node/types/legacyConfig/deploy.js +0 -0
  252. package/dist/esm-node/types/legacyConfig/dev.js +0 -0
  253. package/dist/esm-node/types/legacyConfig/index.js +0 -0
  254. package/dist/esm-node/types/legacyConfig/output.js +0 -0
  255. package/dist/esm-node/types/legacyConfig/source.js +0 -0
  256. package/dist/esm-node/types/legacyConfig/tools.js +0 -0
  257. package/dist/esm-node/types/utils.js +0 -0
  258. package/dist/esm-node/utils/config.js +88 -0
  259. package/dist/esm-node/utils/createServer.js +37 -0
  260. package/dist/esm-node/utils/env.js +15 -0
  261. package/dist/esm-node/utils/generateWatchFiles.js +33 -0
  262. package/dist/esm-node/utils/getSelectedEntries.js +38 -0
  263. package/dist/esm-node/utils/getServerInternalPlugins.js +18 -0
  264. package/dist/esm-node/utils/language.js +8 -0
  265. package/dist/esm-node/utils/printInstructions.js +11 -0
  266. package/dist/esm-node/utils/restart.js +22 -0
  267. package/dist/esm-node/utils/routes.js +10 -0
  268. package/dist/esm-node/utils/types.js +0 -0
  269. package/dist/js/modern/analyze/nestedRoutes.js +1 -10
  270. package/dist/js/node/analyze/nestedRoutes.js +1 -10
  271. package/dist/js/treeshaking/analyze/nestedRoutes.js +1 -10
  272. package/dist/types/analyze/templates.d.ts +3 -1
  273. package/dist/types/types/config/tools.d.ts +1 -1
  274. package/dist/types/types/hooks.d.ts +5 -4
  275. package/dist/types/types/index.d.ts +3 -1
  276. package/package.json +30 -31
@@ -0,0 +1,31 @@
1
+ import path from "path";
2
+ import { createDebugger, findExists, fs } from "@modern-js/utils";
3
+ import {
4
+ JS_EXTENSIONS,
5
+ FILE_SYSTEM_ROUTES_LAYOUT,
6
+ FILE_SYSTEM_ROUTES_GLOBAL_LAYOUT,
7
+ FILE_SYSTEM_ROUTES_IGNORED_REGEX
8
+ } from "../constants";
9
+ const debug = createDebugger("get-client-routes");
10
+ const findLayout = (dir) => findExists(
11
+ JS_EXTENSIONS.map(
12
+ (ext) => path.resolve(dir, `${FILE_SYSTEM_ROUTES_LAYOUT}${ext}`)
13
+ )
14
+ );
15
+ const getRouteWeight = (route) => route === "*" ? 999 : route.split(":").length - 1;
16
+ const shouldSkip = (file) => {
17
+ if (fs.statSync(file).isDirectory()) {
18
+ return false;
19
+ }
20
+ const ext = path.extname(file);
21
+ if (FILE_SYSTEM_ROUTES_IGNORED_REGEX.test(file) || !JS_EXTENSIONS.includes(ext) || FILE_SYSTEM_ROUTES_GLOBAL_LAYOUT === path.basename(file, ext)) {
22
+ return true;
23
+ }
24
+ return false;
25
+ };
26
+ export {
27
+ debug,
28
+ findLayout,
29
+ getRouteWeight,
30
+ shouldSkip
31
+ };
@@ -0,0 +1,109 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { findExists, ensureAbsolutePath } from "@modern-js/utils";
4
+ import { isDefaultExportFunction } from "./isDefaultExportFunction";
5
+ import {
6
+ JS_EXTENSIONS,
7
+ INDEX_FILE_NAME,
8
+ APP_FILE_NAME,
9
+ PAGES_DIR_NAME,
10
+ FILE_SYSTEM_ROUTES_GLOBAL_LAYOUT,
11
+ NESTED_ROUTES_DIR
12
+ } from "./constants";
13
+ const hasIndex = (dir) => findExists(
14
+ JS_EXTENSIONS.map((ext) => path.resolve(dir, `${INDEX_FILE_NAME}${ext}`))
15
+ );
16
+ const hasApp = (dir) => findExists(
17
+ JS_EXTENSIONS.map((ext) => path.resolve(dir, `${APP_FILE_NAME}${ext}`))
18
+ );
19
+ const hasPages = (dir) => fs.existsSync(path.join(dir, PAGES_DIR_NAME));
20
+ const hasNestedRoutes = (dir) => fs.existsSync(path.join(dir, NESTED_ROUTES_DIR));
21
+ const isBundleEntry = (dir) => hasApp(dir) || hasPages(dir) || hasIndex(dir) || hasNestedRoutes(dir);
22
+ const scanDir = (dirs) => dirs.map((dir) => {
23
+ const indexFile = hasIndex(dir);
24
+ const customBootstrap = isDefaultExportFunction(indexFile) ? indexFile : false;
25
+ const entryName = path.basename(dir);
26
+ if (indexFile && !customBootstrap) {
27
+ return {
28
+ entryName,
29
+ entry: indexFile,
30
+ absoluteEntryDir: path.resolve(dir),
31
+ isAutoMount: false
32
+ };
33
+ }
34
+ const isHasApp = hasApp(dir);
35
+ if (isHasApp) {
36
+ return {
37
+ entryName,
38
+ entry: path.join(dir, APP_FILE_NAME),
39
+ isAutoMount: true,
40
+ absoluteEntryDir: path.resolve(dir),
41
+ customBootstrap
42
+ };
43
+ }
44
+ const isHasNestedRoutes = hasNestedRoutes(dir);
45
+ const isHasPages = hasPages(dir);
46
+ if (isHasNestedRoutes || isHasPages) {
47
+ const entrypoint = {
48
+ entryName,
49
+ entry: "",
50
+ fileSystemRoutes: {
51
+ globalApp: findExists(
52
+ JS_EXTENSIONS.map(
53
+ (ext) => path.resolve(
54
+ dir,
55
+ `./${PAGES_DIR_NAME}/${FILE_SYSTEM_ROUTES_GLOBAL_LAYOUT}${ext}`
56
+ )
57
+ )
58
+ )
59
+ },
60
+ isAutoMount: true,
61
+ absoluteEntryDir: path.resolve(dir),
62
+ customBootstrap
63
+ };
64
+ if (isHasPages) {
65
+ entrypoint.entry = path.join(dir, PAGES_DIR_NAME);
66
+ entrypoint.pageRoutesEntry = entrypoint.entry;
67
+ }
68
+ if (isHasNestedRoutes) {
69
+ entrypoint.entry = path.join(dir, NESTED_ROUTES_DIR);
70
+ entrypoint.nestedRoutesEntry = entrypoint.entry;
71
+ }
72
+ return entrypoint;
73
+ }
74
+ return {
75
+ entryName,
76
+ entry: indexFile,
77
+ absoluteEntryDir: path.resolve(dir),
78
+ isAutoMount: false
79
+ };
80
+ });
81
+ const getFileSystemEntry = (appContext, config) => {
82
+ const { appDirectory } = appContext;
83
+ const {
84
+ source: { entriesDir, disableEntryDirs }
85
+ } = config;
86
+ let disabledDirs = [];
87
+ if (disableEntryDirs && Array.isArray(disableEntryDirs)) {
88
+ disabledDirs = disableEntryDirs == null ? void 0 : disableEntryDirs.map(
89
+ (dir) => ensureAbsolutePath(appDirectory, dir)
90
+ );
91
+ }
92
+ const src = ensureAbsolutePath(appDirectory, entriesDir || "");
93
+ if (fs.existsSync(src)) {
94
+ if (fs.statSync(src).isDirectory()) {
95
+ return scanDir(
96
+ isBundleEntry(src) ? [src] : fs.readdirSync(src).map((file) => path.join(src, file)).filter(
97
+ (file) => fs.statSync(file).isDirectory() && isBundleEntry(file) && !disabledDirs.includes(file)
98
+ )
99
+ );
100
+ } else {
101
+ throw Error(`source.entriesDir accept a directory.`);
102
+ }
103
+ } else {
104
+ throw Error(`src dir ${entriesDir} not found.`);
105
+ }
106
+ };
107
+ export {
108
+ getFileSystemEntry
109
+ };
@@ -0,0 +1,95 @@
1
+ import path from "path";
2
+ import { fs, findExists, MAIN_ENTRY_NAME } from "@modern-js/utils";
3
+ import { HTML_PARTIALS_EXTENSIONS, HTML_PARTIALS_FOLDER } from "./constants";
4
+ import * as templates from "./templates";
5
+ var PartialPosition = /* @__PURE__ */ ((PartialPosition2) => {
6
+ PartialPosition2["TOP"] = "top";
7
+ PartialPosition2["HEAD"] = "head";
8
+ PartialPosition2["BODY"] = "body";
9
+ PartialPosition2["BOTTOM"] = "bottom";
10
+ PartialPosition2["INDEX"] = "index";
11
+ return PartialPosition2;
12
+ })(PartialPosition || {});
13
+ const findPartials = (dir, entryName, position) => {
14
+ if (fs.existsSync(dir)) {
15
+ const base = findExists(
16
+ HTML_PARTIALS_EXTENSIONS.map(
17
+ (ext) => path.resolve(dir, `${position}${ext}`)
18
+ )
19
+ );
20
+ const file = entryName ? findExists(
21
+ HTML_PARTIALS_EXTENSIONS.map(
22
+ (ext) => path.resolve(dir, entryName, `${position}${ext}`)
23
+ )
24
+ ) || base : base;
25
+ return file ? { file, content: fs.readFileSync(file, "utf8") } : null;
26
+ }
27
+ return null;
28
+ };
29
+ const getHtmlTemplate = async (entrypoints, api, {
30
+ appContext,
31
+ config
32
+ }) => {
33
+ const { appDirectory, internalDirectory } = appContext;
34
+ const {
35
+ source: { configDir }
36
+ } = config;
37
+ const htmlDir = path.resolve(
38
+ appDirectory,
39
+ configDir || "",
40
+ HTML_PARTIALS_FOLDER
41
+ );
42
+ const htmlTemplates = {};
43
+ for (const entrypoint of entrypoints) {
44
+ const { entryName } = entrypoint;
45
+ const name = entrypoints.length === 1 && entryName === MAIN_ENTRY_NAME ? "" : entryName;
46
+ const customIndexTemplate = findPartials(
47
+ htmlDir,
48
+ name,
49
+ "index" /* INDEX */
50
+ );
51
+ if (customIndexTemplate) {
52
+ htmlTemplates[entryName] = customIndexTemplate.file;
53
+ } else {
54
+ const hookRunners = api.useHookRunners();
55
+ const { partials } = await hookRunners.htmlPartials({
56
+ entrypoint,
57
+ partials: [
58
+ "top" /* TOP */,
59
+ "head" /* HEAD */,
60
+ "body" /* BODY */
61
+ ].reduce(
62
+ (previous, position) => {
63
+ const found = findPartials(htmlDir, name, position);
64
+ previous[position] = found ? [found.content] : [];
65
+ return previous;
66
+ },
67
+ {
68
+ top: [],
69
+ head: [],
70
+ body: []
71
+ }
72
+ )
73
+ });
74
+ const templatePath = path.resolve(
75
+ internalDirectory,
76
+ entryName,
77
+ "index.html"
78
+ );
79
+ fs.outputFileSync(templatePath, templates.html(partials), "utf8");
80
+ htmlTemplates[entryName] = templatePath;
81
+ const bottomTemplate = findPartials(
82
+ htmlDir,
83
+ name,
84
+ "bottom" /* BOTTOM */
85
+ );
86
+ if (bottomTemplate) {
87
+ htmlTemplates[`__${entryName}-bottom__`] = bottomTemplate.content;
88
+ }
89
+ }
90
+ }
91
+ return htmlTemplates;
92
+ };
93
+ export {
94
+ getHtmlTemplate
95
+ };
@@ -0,0 +1,154 @@
1
+ import path from "path";
2
+ import fs from "fs";
3
+ import {
4
+ urlJoin,
5
+ isPlainObject,
6
+ removeLeadingSlash,
7
+ getEntryOptions,
8
+ SERVER_BUNDLE_DIRECTORY,
9
+ MAIN_ENTRY_NAME,
10
+ removeTailSlash,
11
+ SERVER_WORKER_BUNDLE_DIRECTORY
12
+ } from "@modern-js/utils";
13
+ import { walkDirectory } from "./utils";
14
+ const applyBaseUrl = (baseUrl, routes) => {
15
+ if (baseUrl) {
16
+ if (Array.isArray(baseUrl)) {
17
+ return baseUrl.reduce(
18
+ (previous, current) => [...previous, ...applyBaseUrl(current, routes)],
19
+ []
20
+ );
21
+ } else {
22
+ return routes.map((route) => {
23
+ const urlPath = urlJoin(baseUrl, route.urlPath);
24
+ return {
25
+ ...route,
26
+ urlPath: urlPath === "/" ? urlPath : removeTailSlash(urlPath)
27
+ };
28
+ });
29
+ }
30
+ }
31
+ return routes;
32
+ };
33
+ const applyRouteOptions = (original, routeOptions) => {
34
+ const { route, disableSpa } = routeOptions;
35
+ original.isSPA = !disableSpa;
36
+ !original.isSPA && (original.entryPath = path.dirname(original.entryPath));
37
+ let routes;
38
+ if (route) {
39
+ if (Array.isArray(route)) {
40
+ routes = route.map((url) => {
41
+ if (isPlainObject(url)) {
42
+ const { path: urlPath, ...other } = url;
43
+ return {
44
+ ...original,
45
+ ...other,
46
+ urlPath
47
+ };
48
+ } else {
49
+ return {
50
+ ...original,
51
+ urlPath: url
52
+ };
53
+ }
54
+ });
55
+ } else if (isPlainObject(route)) {
56
+ const { path: urlPath, ...other } = route;
57
+ routes = [
58
+ {
59
+ ...original,
60
+ ...other,
61
+ urlPath
62
+ }
63
+ ];
64
+ } else {
65
+ routes = [
66
+ {
67
+ ...original,
68
+ urlPath: route
69
+ }
70
+ ];
71
+ }
72
+ } else {
73
+ routes = [original];
74
+ }
75
+ return routes;
76
+ };
77
+ const collectHtmlRoutes = (entrypoints, appContext, config) => {
78
+ const {
79
+ html: { disableHtmlFolder },
80
+ output: { distPath: { html: htmlPath } = {} },
81
+ server: { baseUrl, routes, ssr, ssrByEntries, worker }
82
+ } = config;
83
+ const { packageName } = appContext;
84
+ let htmlRoutes = entrypoints.reduce(
85
+ (previous, { entryName }) => {
86
+ const entryOptions = getEntryOptions(
87
+ entryName,
88
+ ssr,
89
+ ssrByEntries,
90
+ packageName
91
+ );
92
+ const isSSR = Boolean(entryOptions);
93
+ const isWorker = Boolean(worker);
94
+ const { resHeaders } = (routes == null ? void 0 : routes[entryName]) || {};
95
+ let route = {
96
+ urlPath: `/${entryName === MAIN_ENTRY_NAME ? "" : entryName}`,
97
+ entryName,
98
+ entryPath: removeLeadingSlash(
99
+ path.posix.normalize(
100
+ `${htmlPath}/${entryName}${disableHtmlFolder ? ".html" : "/index.html"}`
101
+ )
102
+ ),
103
+ isSPA: true,
104
+ isSSR,
105
+ responseHeaders: resHeaders,
106
+ worker: isWorker ? `${SERVER_WORKER_BUNDLE_DIRECTORY}/${entryName}.js` : void 0,
107
+ bundle: isSSR ? `${SERVER_BUNDLE_DIRECTORY}/${entryName}.js` : void 0
108
+ };
109
+ if (routes == null ? void 0 : routes.hasOwnProperty(entryName)) {
110
+ const routeOptions = isPlainObject(routes[entryName]) ? routes[entryName] : { route: routes[entryName] };
111
+ route = applyRouteOptions(route, routeOptions);
112
+ }
113
+ return Array.isArray(route) ? [...previous, ...route] : [...previous, route];
114
+ },
115
+ []
116
+ );
117
+ htmlRoutes = applyBaseUrl(baseUrl, htmlRoutes);
118
+ return htmlRoutes;
119
+ };
120
+ const collectStaticRoutes = (appContext, config) => {
121
+ const { appDirectory } = appContext;
122
+ const {
123
+ source: { configDir },
124
+ server: { publicRoutes = {} }
125
+ } = config;
126
+ const publicFolder = path.resolve(appDirectory, configDir || "", "public");
127
+ return fs.existsSync(publicFolder) ? walkDirectory(publicFolder).map((filePath) => {
128
+ const urlPath = `${urlJoin(
129
+ toPosix(filePath).slice(toPosix(publicFolder).length)
130
+ )}`;
131
+ return {
132
+ urlPath: publicRoutes[removeLeadingSlash(urlPath)] || urlPath,
133
+ isSPA: true,
134
+ isSSR: false,
135
+ entryPath: toPosix(
136
+ path.relative(
137
+ path.resolve(appDirectory, configDir || ""),
138
+ filePath
139
+ )
140
+ )
141
+ };
142
+ }) : [];
143
+ };
144
+ const getServerRoutes = (entrypoints, {
145
+ appContext,
146
+ config
147
+ }) => [
148
+ ...collectHtmlRoutes(entrypoints, appContext, config),
149
+ ...collectStaticRoutes(appContext, config)
150
+ ];
151
+ const toPosix = (pathStr) => pathStr.split(path.sep).join(path.posix.sep);
152
+ export {
153
+ getServerRoutes
154
+ };
@@ -0,0 +1,285 @@
1
+ import * as path from "path";
2
+ import {
3
+ createDebugger,
4
+ findExists,
5
+ fs,
6
+ getEntryOptions,
7
+ isApiOnly,
8
+ minimist,
9
+ getCommand,
10
+ isDevCommand
11
+ } from "@modern-js/utils";
12
+ import { cloneDeep } from "@modern-js/utils/lodash";
13
+ import { printInstructions } from "../utils/printInstructions";
14
+ import { generateRoutes } from "../utils/routes";
15
+ import { emitResolvedConfig } from "../utils/config";
16
+ import { getSelectedEntries } from "../utils/getSelectedEntries";
17
+ import { initialNormalizedConfig } from "../config";
18
+ import { createBuilderGenerator } from "../builder";
19
+ import {
20
+ getServerLoadersFile,
21
+ isPageComponentFile,
22
+ parseModule,
23
+ replaceWithAlias
24
+ } from "./utils";
25
+ import {
26
+ APP_CONFIG_NAME,
27
+ APP_INIT_EXPORTED,
28
+ APP_INIT_IMPORTED
29
+ } from "./constants";
30
+ const debug = createDebugger("plugin-analyze");
31
+ var analyze_default = ({
32
+ bundler
33
+ }) => ({
34
+ name: "@modern-js/plugin-analyze",
35
+ setup: (api) => {
36
+ let pagesDir = [];
37
+ let nestedRouteEntries = [];
38
+ let originEntrypoints = [];
39
+ return {
40
+ async prepare() {
41
+ var _a;
42
+ let appContext = api.useAppContext();
43
+ const resolvedConfig = api.useResolvedConfigContext();
44
+ const hookRunners = api.useHookRunners();
45
+ try {
46
+ fs.emptydirSync(appContext.internalDirectory);
47
+ } catch {
48
+ }
49
+ const apiOnly = await isApiOnly(
50
+ appContext.appDirectory,
51
+ (_a = resolvedConfig.source) == null ? void 0 : _a.entriesDir
52
+ );
53
+ await hookRunners.addRuntimeExports();
54
+ if (apiOnly) {
55
+ const { routes: routes2 } = await hookRunners.modifyServerRoutes({
56
+ routes: []
57
+ });
58
+ debug(`server routes: %o`, routes2);
59
+ appContext = {
60
+ ...appContext,
61
+ apiOnly,
62
+ serverRoutes: routes2
63
+ };
64
+ api.setAppContext(appContext);
65
+ return;
66
+ }
67
+ const [
68
+ { getBundleEntry },
69
+ { getServerRoutes },
70
+ { generateCode },
71
+ { getHtmlTemplate }
72
+ ] = await Promise.all([
73
+ import("./getBundleEntry"),
74
+ import("./getServerRoutes"),
75
+ import("./generateCode"),
76
+ import("./getHtmlTemplate")
77
+ ]);
78
+ const entrypoints = getBundleEntry(appContext, resolvedConfig);
79
+ debug(`entrypoints: %o`, entrypoints);
80
+ const initialRoutes = getServerRoutes(entrypoints, {
81
+ appContext,
82
+ config: resolvedConfig
83
+ });
84
+ const { routes } = await hookRunners.modifyServerRoutes({
85
+ routes: initialRoutes
86
+ });
87
+ debug(`server routes: %o`, routes);
88
+ appContext = {
89
+ ...appContext,
90
+ entrypoints,
91
+ serverRoutes: routes
92
+ };
93
+ api.setAppContext(appContext);
94
+ nestedRouteEntries = entrypoints.map((point) => point.nestedRoutesEntry).filter(Boolean);
95
+ pagesDir = entrypoints.map((point) => point.entry).filter(Boolean).concat(nestedRouteEntries);
96
+ originEntrypoints = cloneDeep(entrypoints);
97
+ await generateCode(appContext, resolvedConfig, entrypoints, api);
98
+ const htmlTemplates = await getHtmlTemplate(entrypoints, api, {
99
+ appContext,
100
+ config: resolvedConfig
101
+ });
102
+ debug(`html templates: %o`, htmlTemplates);
103
+ await hookRunners.addDefineTypes();
104
+ debug(`add Define Types`);
105
+ let checkedEntries = entrypoints.map((point) => point.entryName);
106
+ if (isDevCommand()) {
107
+ const { entry } = minimist(process.argv.slice(2));
108
+ checkedEntries = await getSelectedEntries(
109
+ typeof entry === "string" ? entry.split(",") : entry,
110
+ entrypoints
111
+ );
112
+ }
113
+ appContext = {
114
+ ...appContext,
115
+ entrypoints,
116
+ checkedEntries,
117
+ apiOnly,
118
+ serverRoutes: routes,
119
+ htmlTemplates
120
+ };
121
+ api.setAppContext(appContext);
122
+ const command = getCommand();
123
+ const buildCommands = ["dev", "start", "build", "inspect", "deploy"];
124
+ if (buildCommands.includes(command)) {
125
+ const normalizedConfig = api.useResolvedConfigContext();
126
+ const createBuilderForModern = await createBuilderGenerator(bundler);
127
+ const builder = await createBuilderForModern({
128
+ normalizedConfig,
129
+ appContext,
130
+ async onBeforeBuild({ bundlerConfigs }) {
131
+ const hookRunners2 = api.useHookRunners();
132
+ await generateRoutes(appContext);
133
+ await hookRunners2.beforeBuild({
134
+ bundlerConfigs
135
+ });
136
+ },
137
+ async onAfterBuild({ stats }) {
138
+ const hookRunners2 = api.useHookRunners();
139
+ await hookRunners2.afterBuild({ stats });
140
+ await emitResolvedConfig(
141
+ appContext.appDirectory,
142
+ normalizedConfig
143
+ );
144
+ },
145
+ async onDevCompileDone({ isFirstCompile }) {
146
+ const hookRunners2 = api.useHookRunners();
147
+ if (process.stdout.isTTY || isFirstCompile) {
148
+ hookRunners2.afterDev();
149
+ if (isFirstCompile) {
150
+ printInstructions(hookRunners2, appContext, normalizedConfig);
151
+ }
152
+ }
153
+ },
154
+ async onBeforeCreateCompiler({ bundlerConfigs }) {
155
+ const hookRunners2 = api.useHookRunners();
156
+ await hookRunners2.beforeCreateCompiler({
157
+ bundlerConfigs
158
+ });
159
+ },
160
+ async onAfterCreateCompiler({ compiler }) {
161
+ const hookRunners2 = api.useHookRunners();
162
+ await hookRunners2.afterCreateCompiler({
163
+ compiler
164
+ });
165
+ }
166
+ });
167
+ builder.addPlugins(resolvedConfig.builderPlugins);
168
+ appContext = {
169
+ ...appContext,
170
+ builder
171
+ };
172
+ api.setAppContext(appContext);
173
+ }
174
+ },
175
+ watchFiles() {
176
+ return pagesDir;
177
+ },
178
+ config() {
179
+ return {
180
+ tools: {
181
+ webpackChain: (chain, { name }) => {
182
+ const appContext = api.useAppContext();
183
+ const resolvedConfig = api.useResolvedConfigContext();
184
+ const { entrypoints, internalDirectory, packageName } = appContext;
185
+ entrypoints.forEach((entrypoint) => {
186
+ const { entryName } = entrypoint;
187
+ const ssr = getEntryOptions(
188
+ entryName,
189
+ resolvedConfig.server.ssr,
190
+ resolvedConfig.server.ssrByEntries,
191
+ packageName
192
+ );
193
+ if (entrypoint.nestedRoutesEntry && ssr && name === "server") {
194
+ const serverLoadersFile = getServerLoadersFile(
195
+ internalDirectory,
196
+ entryName
197
+ );
198
+ chain.entry(`${entryName}-server-loaders`).add(serverLoadersFile);
199
+ chain.resolve.alias.set(
200
+ "@modern-js/plugin-data-loader/runtime",
201
+ require.resolve("@modern-js/plugin-data-loader/runtime")
202
+ );
203
+ }
204
+ });
205
+ }
206
+ }
207
+ };
208
+ },
209
+ resolvedConfig({ resolved }) {
210
+ const appContext = api.useAppContext();
211
+ const config = initialNormalizedConfig(resolved, appContext, bundler);
212
+ return {
213
+ resolved: config
214
+ };
215
+ },
216
+ async modifyEntryImports({ entrypoint, imports }) {
217
+ const appContext = api.useAppContext();
218
+ const { srcDirectory, internalSrcAlias } = appContext;
219
+ const { fileSystemRoutes, nestedRoutesEntry } = entrypoint;
220
+ if (fileSystemRoutes && nestedRoutesEntry) {
221
+ const rootLayoutPath = path.join(nestedRoutesEntry, "layout");
222
+ const rootLayoutFile = findExists(
223
+ [".js", ".ts", ".jsx", ".tsx"].map(
224
+ (ext) => `${rootLayoutPath}${ext}`
225
+ )
226
+ );
227
+ if (rootLayoutFile) {
228
+ const rootLayoutBuffer = await fs.readFile(rootLayoutFile);
229
+ const rootLayout = rootLayoutBuffer.toString();
230
+ const [, moduleExports] = await parseModule({
231
+ source: rootLayout.toString(),
232
+ filename: rootLayoutFile
233
+ });
234
+ const hasAppConfig = moduleExports.some(
235
+ (e) => e.n === APP_CONFIG_NAME
236
+ );
237
+ const generateLayoutPath = replaceWithAlias(
238
+ srcDirectory,
239
+ rootLayoutFile,
240
+ internalSrcAlias
241
+ );
242
+ if (hasAppConfig) {
243
+ imports.push({
244
+ value: generateLayoutPath,
245
+ specifiers: [{ imported: APP_CONFIG_NAME }]
246
+ });
247
+ }
248
+ const hasAppInit = moduleExports.some(
249
+ (e) => e.n === APP_INIT_EXPORTED
250
+ );
251
+ if (hasAppInit) {
252
+ imports.push({
253
+ value: generateLayoutPath,
254
+ specifiers: [
255
+ { imported: APP_INIT_EXPORTED, local: APP_INIT_IMPORTED }
256
+ ]
257
+ });
258
+ }
259
+ }
260
+ }
261
+ return {
262
+ entrypoint,
263
+ imports
264
+ };
265
+ },
266
+ async fileChange(e) {
267
+ const appContext = api.useAppContext();
268
+ const { appDirectory } = appContext;
269
+ const { filename, eventType } = e;
270
+ const isPageFile = (name) => pagesDir.some((pageDir) => name.includes(pageDir));
271
+ const absoluteFilePath = path.resolve(appDirectory, filename);
272
+ const isRouteComponent = isPageFile(absoluteFilePath) && isPageComponentFile(absoluteFilePath);
273
+ if (isRouteComponent && (eventType === "add" || eventType === "unlink")) {
274
+ const resolvedConfig = api.useResolvedConfigContext();
275
+ const { generateCode } = await import("./generateCode");
276
+ const entrypoints = cloneDeep(originEntrypoints);
277
+ generateCode(appContext, resolvedConfig, entrypoints, api);
278
+ }
279
+ }
280
+ };
281
+ }
282
+ });
283
+ export {
284
+ analyze_default as default
285
+ };