@modern-js/app-tools 2.0.0-beta.2 → 2.0.0-canary.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +251 -0
- package/bin/modern.js +10 -1
- package/dist/js/modern/analyze/constants.js +38 -16
- package/dist/js/modern/analyze/generateCode.js +271 -211
- package/dist/js/modern/analyze/getBundleEntry.js +31 -32
- package/dist/js/modern/analyze/getClientRoutes/getRoutes.js +93 -49
- package/dist/js/modern/analyze/getClientRoutes/getRoutesLegacy.js +89 -47
- package/dist/js/modern/analyze/getClientRoutes/index.js +6 -2
- package/dist/js/modern/analyze/getClientRoutes/utils.js +23 -10
- package/dist/js/modern/analyze/getFileSystemEntry.js +43 -22
- package/dist/js/modern/analyze/getHtmlTemplate.js +89 -49
- package/dist/js/modern/analyze/getServerRoutes.js +122 -126
- package/dist/js/modern/analyze/index.js +193 -159
- package/dist/js/modern/analyze/isDefaultExportFunction.js +30 -16
- package/dist/js/modern/analyze/makeLegalIdentifier.js +10 -11
- package/dist/js/modern/analyze/nestedRoutes.js +110 -53
- package/dist/js/modern/analyze/templates.js +190 -77
- package/dist/js/modern/analyze/utils.js +98 -51
- package/dist/js/modern/builder/builderPlugins/compatModern.js +124 -107
- package/dist/js/modern/builder/index.js +123 -86
- package/dist/js/modern/builder/loaders/routerLoader.js +17 -0
- package/dist/js/modern/builder/loaders/serverModuleLoader.js +7 -0
- package/dist/js/modern/builder/share.js +22 -20
- package/dist/js/modern/builder/webpackPlugins/htmlAsyncChunkPlugin.js +23 -22
- package/dist/js/modern/builder/webpackPlugins/htmlBottomTemplate.js +31 -27
- package/dist/js/modern/builder/webpackPlugins/routerPlugin.js +98 -84
- package/dist/js/modern/commands/build.js +67 -42
- package/dist/js/modern/commands/deploy.js +27 -4
- package/dist/js/modern/commands/dev.js +93 -47
- package/dist/js/modern/commands/index.js +1 -1
- package/dist/js/modern/commands/inspect.js +30 -5
- package/dist/js/modern/commands/start.js +37 -16
- package/dist/js/modern/config/default.js +103 -114
- package/dist/js/modern/config/index.js +8 -2
- package/dist/js/modern/config/initial/createHtmlConfig.js +5 -2
- package/dist/js/modern/config/initial/createOutputConfig.js +11 -9
- package/dist/js/modern/config/initial/createSourceConfig.js +5 -2
- package/dist/js/modern/config/initial/createToolsConfig.js +7 -6
- package/dist/js/modern/config/initial/index.js +9 -4
- package/dist/js/modern/config/initial/inits.js +109 -73
- package/dist/js/modern/config/initial/transformNormalizedConfig.js +6 -3
- package/dist/js/modern/defineConfig.js +26 -11
- package/dist/js/modern/exports/server.js +4 -1
- package/dist/js/modern/hooks.js +10 -3
- package/dist/js/modern/index.js +140 -89
- package/dist/js/modern/initialize/index.js +98 -51
- package/dist/js/modern/locale/en.js +20 -21
- package/dist/js/modern/locale/index.js +6 -6
- package/dist/js/modern/locale/zh.js +21 -22
- package/dist/js/modern/schema/Schema.js +6 -5
- package/dist/js/modern/schema/index.js +51 -100
- package/dist/js/modern/schema/legacy.js +96 -231
- package/dist/js/modern/types/config/index.js +0 -1
- package/dist/js/modern/types/index.js +0 -1
- package/dist/js/modern/types/legacyConfig/output.js +0 -1
- package/dist/js/modern/utils/commands.js +5 -2
- package/dist/js/modern/utils/config.js +102 -41
- package/dist/js/modern/utils/createFileWatcher.js +84 -51
- package/dist/js/modern/utils/createServer.js +63 -17
- package/dist/js/modern/utils/getSpecifiedEntries.js +46 -19
- package/dist/js/modern/utils/language.js +6 -3
- package/dist/js/modern/utils/printInstructions.js +27 -8
- package/dist/js/modern/utils/restart.js +43 -16
- package/dist/js/modern/utils/routes.js +29 -12
- package/dist/js/node/analyze/constants.js +54 -35
- package/dist/js/node/analyze/generateCode.js +290 -228
- package/dist/js/node/analyze/getBundleEntry.js +55 -44
- package/dist/js/node/analyze/getClientRoutes/getRoutes.js +132 -76
- package/dist/js/node/analyze/getClientRoutes/getRoutesLegacy.js +128 -74
- package/dist/js/node/analyze/getClientRoutes/index.js +23 -17
- package/dist/js/node/analyze/getClientRoutes/utils.js +44 -21
- package/dist/js/node/analyze/getFileSystemEntry.js +70 -39
- package/dist/js/node/analyze/getHtmlTemplate.js +116 -61
- package/dist/js/node/analyze/getServerRoutes.js +143 -137
- package/dist/js/node/analyze/index.js +240 -174
- package/dist/js/node/analyze/isDefaultExportFunction.js +55 -26
- package/dist/js/node/analyze/makeLegalIdentifier.js +27 -15
- package/dist/js/node/analyze/nestedRoutes.js +140 -67
- package/dist/js/node/analyze/templates.js +211 -84
- package/dist/js/node/analyze/utils.js +123 -62
- package/dist/js/node/builder/builderPlugins/compatModern.js +152 -120
- package/dist/js/node/builder/index.js +151 -95
- package/dist/js/node/builder/loaders/routerLoader.js +36 -0
- package/dist/js/node/builder/loaders/serverModuleLoader.js +26 -0
- package/dist/js/node/builder/share.js +45 -25
- package/dist/js/node/builder/webpackPlugins/htmlAsyncChunkPlugin.js +39 -26
- package/dist/js/node/builder/webpackPlugins/htmlBottomTemplate.js +47 -31
- package/dist/js/node/builder/webpackPlugins/routerPlugin.js +116 -90
- package/dist/js/node/commands/build.js +89 -52
- package/dist/js/node/commands/deploy.js +45 -10
- package/dist/js/node/commands/dev.js +115 -61
- package/dist/js/node/commands/index.js +19 -38
- package/dist/js/node/commands/inspect.js +48 -11
- package/dist/js/node/commands/start.js +65 -27
- package/dist/js/node/config/default.js +119 -118
- package/dist/js/node/config/index.js +25 -29
- package/dist/js/node/config/initial/createHtmlConfig.js +22 -6
- package/dist/js/node/config/initial/createOutputConfig.js +28 -13
- package/dist/js/node/config/initial/createSourceConfig.js +22 -6
- package/dist/js/node/config/initial/createToolsConfig.js +24 -10
- package/dist/js/node/config/initial/index.js +28 -17
- package/dist/js/node/config/initial/inits.js +126 -81
- package/dist/js/node/config/initial/transformNormalizedConfig.js +31 -15
- package/dist/js/node/defineConfig.js +43 -17
- package/dist/js/node/exports/server.js +21 -10
- package/dist/js/node/hooks.js +44 -29
- package/dist/js/node/index.js +190 -130
- package/dist/js/node/initialize/index.js +116 -61
- package/dist/js/node/locale/en.js +36 -25
- package/dist/js/node/locale/index.js +27 -15
- package/dist/js/node/locale/zh.js +37 -26
- package/dist/js/node/schema/Schema.js +23 -10
- package/dist/js/node/schema/index.js +77 -114
- package/dist/js/node/schema/legacy.js +117 -240
- package/dist/js/node/types/config/index.js +17 -16
- package/dist/js/node/types/index.js +19 -38
- package/dist/js/node/types/legacyConfig/output.js +0 -5
- package/dist/js/node/utils/commands.js +21 -6
- package/dist/js/node/utils/config.js +120 -51
- package/dist/js/node/utils/createFileWatcher.js +104 -60
- package/dist/js/node/utils/createServer.js +86 -25
- package/dist/js/node/utils/getSpecifiedEntries.js +64 -25
- package/dist/js/node/utils/language.js +24 -8
- package/dist/js/node/utils/printInstructions.js +47 -16
- package/dist/js/node/utils/restart.js +61 -21
- package/dist/js/node/utils/routes.js +53 -18
- package/dist/js/treeshaking/analyze/constants.js +28 -16
- package/dist/js/treeshaking/analyze/generateCode.js +604 -355
- package/dist/js/treeshaking/analyze/getBundleEntry.js +52 -63
- package/dist/js/treeshaking/analyze/getClientRoutes/getRoutes.js +214 -168
- package/dist/js/treeshaking/analyze/getClientRoutes/getRoutesLegacy.js +215 -169
- package/dist/js/treeshaking/analyze/getClientRoutes/index.js +3 -2
- package/dist/js/treeshaking/analyze/getClientRoutes/utils.js +19 -20
- package/dist/js/treeshaking/analyze/getFileSystemEntry.js +89 -86
- package/dist/js/treeshaking/analyze/getHtmlTemplate.js +298 -125
- package/dist/js/treeshaking/analyze/getServerRoutes.js +210 -146
- package/dist/js/treeshaking/analyze/index.js +558 -303
- package/dist/js/treeshaking/analyze/isDefaultExportFunction.js +45 -26
- package/dist/js/treeshaking/analyze/makeLegalIdentifier.js +13 -16
- package/dist/js/treeshaking/analyze/nestedRoutes.js +414 -160
- package/dist/js/treeshaking/analyze/templates.js +432 -161
- package/dist/js/treeshaking/analyze/utils.js +361 -80
- package/dist/js/treeshaking/builder/builderPlugins/compatModern.js +281 -195
- package/dist/js/treeshaking/builder/index.js +371 -165
- package/dist/js/treeshaking/builder/loaders/routerLoader.js +13 -0
- package/dist/js/treeshaking/builder/loaders/serverModuleLoader.js +5 -0
- package/dist/js/treeshaking/builder/share.js +41 -44
- package/dist/js/treeshaking/builder/webpackPlugins/htmlAsyncChunkPlugin.js +108 -44
- package/dist/js/treeshaking/builder/webpackPlugins/htmlBottomTemplate.js +70 -39
- package/dist/js/treeshaking/builder/webpackPlugins/routerPlugin.js +332 -112
- package/dist/js/treeshaking/commands/build.js +286 -88
- package/dist/js/treeshaking/commands/deploy.js +153 -25
- package/dist/js/treeshaking/commands/dev.js +318 -132
- package/dist/js/treeshaking/commands/index.js +1 -1
- package/dist/js/treeshaking/commands/inspect.js +147 -32
- package/dist/js/treeshaking/commands/start.js +190 -68
- package/dist/js/treeshaking/config/default.js +210 -199
- package/dist/js/treeshaking/config/index.js +3 -2
- package/dist/js/treeshaking/config/initial/createHtmlConfig.js +19 -31
- package/dist/js/treeshaking/config/initial/createOutputConfig.js +43 -67
- package/dist/js/treeshaking/config/initial/createSourceConfig.js +37 -40
- package/dist/js/treeshaking/config/initial/createToolsConfig.js +23 -38
- package/dist/js/treeshaking/config/initial/index.js +10 -9
- package/dist/js/treeshaking/config/initial/inits.js +205 -106
- package/dist/js/treeshaking/config/initial/transformNormalizedConfig.js +27 -34
- package/dist/js/treeshaking/defineConfig.js +60 -13
- package/dist/js/treeshaking/exports/server.js +2 -1
- package/dist/js/treeshaking/hooks.js +26 -25
- package/dist/js/treeshaking/index.js +465 -257
- package/dist/js/treeshaking/initialize/index.js +290 -112
- package/dist/js/treeshaking/locale/en.js +34 -33
- package/dist/js/treeshaking/locale/index.js +5 -5
- package/dist/js/treeshaking/locale/zh.js +34 -33
- package/dist/js/treeshaking/schema/Schema.js +267 -69
- package/dist/js/treeshaking/schema/index.js +165 -121
- package/dist/js/treeshaking/schema/legacy.js +323 -256
- package/dist/js/treeshaking/types/config/deploy.js +1 -0
- package/dist/js/treeshaking/types/config/dev.js +1 -0
- package/dist/js/treeshaking/types/config/experiments.js +1 -0
- package/dist/js/treeshaking/types/config/html.js +1 -0
- package/dist/js/treeshaking/types/config/index.js +0 -1
- package/dist/js/treeshaking/types/config/output.js +1 -0
- package/dist/js/treeshaking/types/config/performance.js +1 -0
- package/dist/js/treeshaking/types/config/security.js +1 -0
- package/dist/js/treeshaking/types/config/source.js +1 -0
- package/dist/js/treeshaking/types/config/tools.js +1 -0
- package/dist/js/treeshaking/types/hooks.js +1 -0
- package/dist/js/treeshaking/types/index.js +0 -1
- package/dist/js/treeshaking/types/legacyConfig/deploy.js +1 -0
- package/dist/js/treeshaking/types/legacyConfig/dev.js +1 -0
- package/dist/js/treeshaking/types/legacyConfig/index.js +1 -0
- package/dist/js/treeshaking/types/legacyConfig/output.js +1 -1
- package/dist/js/treeshaking/types/legacyConfig/source.js +1 -0
- package/dist/js/treeshaking/types/legacyConfig/tools.js +1 -0
- package/dist/js/treeshaking/utils/commands.js +6 -5
- package/dist/js/treeshaking/utils/config.js +295 -117
- package/dist/js/treeshaking/utils/createFileWatcher.js +278 -118
- package/dist/js/treeshaking/utils/createServer.js +252 -67
- package/dist/js/treeshaking/utils/getSpecifiedEntries.js +182 -55
- package/dist/js/treeshaking/utils/language.js +6 -5
- package/dist/js/treeshaking/utils/printInstructions.js +151 -29
- package/dist/js/treeshaking/utils/restart.js +184 -42
- package/dist/js/treeshaking/utils/routes.js +151 -27
- package/dist/js/treeshaking/utils/types.js +1 -0
- package/dist/types/analyze/constants.d.ts +2 -0
- package/dist/types/analyze/index.d.ts +2 -0
- package/dist/types/analyze/templates.d.ts +8 -7
- package/dist/types/analyze/utils.d.ts +9 -1
- package/dist/types/builder/builderPlugins/compatModern.d.ts +2 -1
- package/dist/types/builder/index.d.ts +2 -2
- package/dist/types/builder/loaders/routerLoader.d.ts +3 -0
- package/dist/types/builder/loaders/serverModuleLoader.d.ts +3 -0
- package/dist/types/builder/webpackPlugins/routerPlugin.d.ts +1 -7
- package/dist/types/defineConfig.d.ts +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/initialize/index.d.ts +2 -0
- package/dist/types/types/config/index.d.ts +1 -0
- package/dist/types/types/config/output.d.ts +0 -1
- package/dist/types/types/config/source.d.ts +1 -0
- package/dist/types/types/config/tools.d.ts +10 -1
- package/dist/types/types/hooks.d.ts +2 -1
- package/dist/types/types/legacyConfig/dev.d.ts +1 -0
- package/dist/types/types/legacyConfig/output.d.ts +1 -1
- package/dist/types/types/legacyConfig/source.d.ts +1 -0
- package/dist/types/types/legacyConfig/tools.d.ts +1 -0
- package/dist/types/utils/config.d.ts +1 -0
- package/dist/types/utils/createFileWatcher.d.ts +2 -1
- package/dist/types/utils/createServer.d.ts +1 -0
- package/dist/types/utils/restart.d.ts +1 -1
- package/lib/types.d.ts +1 -1
- package/package.json +27 -23
|
@@ -1,28 +1,49 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
import path from "path";
|
|
21
|
+
import { fs } from "@modern-js/utils";
|
|
6
22
|
import { makeLegalIdentifier } from "../makeLegalIdentifier";
|
|
7
|
-
import {
|
|
23
|
+
import {
|
|
24
|
+
FILE_SYSTEM_ROUTES_COMPONENTS_DIR,
|
|
25
|
+
FILE_SYSTEM_ROUTES_DYNAMIC_REGEXP,
|
|
26
|
+
FILE_SYSTEM_ROUTES_INDEX,
|
|
27
|
+
FILE_SYSTEM_ROUTES_LAYOUT
|
|
28
|
+
} from "../constants";
|
|
8
29
|
import { replaceWithAlias } from "../utils";
|
|
9
30
|
import { debug, findLayout, shouldSkip, getRouteWeight } from "./utils";
|
|
10
31
|
const compName = (srcDirectory, filePath) => {
|
|
11
|
-
const legalCompName = makeLegalIdentifier(
|
|
32
|
+
const legalCompName = makeLegalIdentifier(
|
|
33
|
+
path.relative(srcDirectory, filePath)
|
|
34
|
+
);
|
|
12
35
|
return `Comp_${legalCompName}`;
|
|
13
36
|
};
|
|
14
|
-
const layoutNameAbbr = filePath => {
|
|
15
|
-
const prefix =
|
|
16
|
-
const dirName = path.dirname(filePath).split(
|
|
37
|
+
const layoutNameAbbr = (filePath) => {
|
|
38
|
+
const prefix = "L_";
|
|
39
|
+
const dirName = path.dirname(filePath).split("/").pop() || "";
|
|
17
40
|
return `${prefix}${makeLegalIdentifier(dirName)}`;
|
|
18
41
|
};
|
|
19
42
|
const parents = [];
|
|
20
|
-
|
|
21
|
-
/* eslint-disable no-param-reassign */
|
|
22
43
|
const recursiveReadDir = ({
|
|
23
44
|
dir,
|
|
24
45
|
routes,
|
|
25
|
-
basePath
|
|
46
|
+
basePath = "/",
|
|
26
47
|
srcDirectory,
|
|
27
48
|
srcAlias
|
|
28
49
|
}) => {
|
|
@@ -31,18 +52,18 @@ const recursiveReadDir = ({
|
|
|
31
52
|
let parent = parents[parents.length - 1];
|
|
32
53
|
const layout = findLayout(dir);
|
|
33
54
|
if (layout) {
|
|
34
|
-
if (
|
|
55
|
+
if (basePath === "/") {
|
|
35
56
|
throw new Error(`should use _app instead of _layout in ${dir}`);
|
|
36
57
|
} else {
|
|
37
58
|
const alias = replaceWithAlias(srcDirectory, layout, srcAlias);
|
|
38
59
|
const componentName = compName(srcDirectory, layout);
|
|
39
60
|
const route = {
|
|
40
|
-
path: `${
|
|
61
|
+
path: `${basePath.substring(0, basePath.length - 1)}`,
|
|
41
62
|
children: [],
|
|
42
63
|
_component: alias,
|
|
43
64
|
component: componentName,
|
|
44
65
|
parent,
|
|
45
|
-
type:
|
|
66
|
+
type: "page"
|
|
46
67
|
};
|
|
47
68
|
parent = route;
|
|
48
69
|
resetParent = true;
|
|
@@ -60,17 +81,19 @@ const recursiveReadDir = ({
|
|
|
60
81
|
const dynamicRouteMatched = FILE_SYSTEM_ROUTES_DYNAMIC_REGEXP.exec(filename);
|
|
61
82
|
if (dynamicRouteMatched) {
|
|
62
83
|
if (hasDynamicRoute) {
|
|
63
|
-
throw new Error(
|
|
84
|
+
throw new Error(
|
|
85
|
+
`Can't set two dynamic route in one directory: ${dir}`
|
|
86
|
+
);
|
|
64
87
|
} else {
|
|
65
88
|
hasDynamicRoute = true;
|
|
66
89
|
}
|
|
67
90
|
}
|
|
68
91
|
const route = {
|
|
69
|
-
path: `${
|
|
92
|
+
path: `${basePath}${dynamicRouteMatched ? `:${dynamicRouteMatched[1]}${dynamicRouteMatched[2]}` : filename}`,
|
|
70
93
|
_component: alias,
|
|
71
94
|
component: componentName,
|
|
72
95
|
parent,
|
|
73
|
-
type:
|
|
96
|
+
type: "page"
|
|
74
97
|
};
|
|
75
98
|
if (fs.statSync(filePath).isDirectory()) {
|
|
76
99
|
recursiveReadDir({
|
|
@@ -86,10 +109,10 @@ const recursiveReadDir = ({
|
|
|
86
109
|
continue;
|
|
87
110
|
}
|
|
88
111
|
if (filename === FILE_SYSTEM_ROUTES_INDEX) {
|
|
89
|
-
route.path =
|
|
112
|
+
route.path = basePath === "/" ? basePath : `${basePath.substring(0, basePath.length - 1)}`;
|
|
90
113
|
}
|
|
91
|
-
if (filename ===
|
|
92
|
-
route.path =
|
|
114
|
+
if (filename === "404" && basePath === "/") {
|
|
115
|
+
route.path = "*";
|
|
93
116
|
}
|
|
94
117
|
routes.push(route);
|
|
95
118
|
}
|
|
@@ -98,69 +121,87 @@ const recursiveReadDir = ({
|
|
|
98
121
|
parents.pop();
|
|
99
122
|
}
|
|
100
123
|
};
|
|
101
|
-
/* eslint-enable no-param-reassign */
|
|
102
|
-
|
|
103
124
|
const normalizeNestedRoutes = (nested, internalComponentsDir, internalDirectory, internalDirAlias) => {
|
|
104
|
-
const flat = routes => routes.reduce(
|
|
105
|
-
|
|
125
|
+
const flat = (routes) => routes.reduce(
|
|
126
|
+
(memo, route) => memo.concat(
|
|
127
|
+
Array.isArray(route.children) ? flat(route.children) : [route]
|
|
128
|
+
),
|
|
129
|
+
[]
|
|
130
|
+
);
|
|
131
|
+
const generate = (route) => {
|
|
106
132
|
const codes = [];
|
|
107
133
|
let lastComponent = route.component;
|
|
108
|
-
const imports = [
|
|
109
|
-
|
|
110
|
-
|
|
134
|
+
const imports = [
|
|
135
|
+
`import React from 'react';`,
|
|
136
|
+
`import ${lastComponent} from '${route._component}'`
|
|
137
|
+
];
|
|
111
138
|
while (route = route.parent) {
|
|
112
139
|
const layoutComponent = route.component;
|
|
113
140
|
const layoutComponentAbbr = layoutNameAbbr(route._component);
|
|
114
141
|
imports.push(`import ${layoutComponent} from '${route._component}';`);
|
|
115
142
|
const currentComponent = `${layoutComponentAbbr}_${lastComponent}`;
|
|
116
|
-
codes.push(
|
|
143
|
+
codes.push(
|
|
144
|
+
`const ${currentComponent} = props => <${layoutComponent} Component={${lastComponent}} {...props} />;`
|
|
145
|
+
);
|
|
117
146
|
lastComponent = currentComponent;
|
|
118
147
|
}
|
|
119
148
|
const file = path.resolve(internalComponentsDir, `${lastComponent}.jsx`);
|
|
120
|
-
fs.outputFileSync(
|
|
149
|
+
fs.outputFileSync(
|
|
150
|
+
file,
|
|
151
|
+
`${imports.join("\n")}
|
|
152
|
+
${codes.join(
|
|
153
|
+
"\n"
|
|
154
|
+
)}
|
|
155
|
+
export default ${lastComponent}`
|
|
156
|
+
);
|
|
121
157
|
return {
|
|
122
158
|
component: lastComponent,
|
|
123
159
|
_component: replaceWithAlias(internalDirectory, file, internalDirAlias)
|
|
124
160
|
};
|
|
125
161
|
};
|
|
126
|
-
const normalized = flat(nested).map(
|
|
127
|
-
parent:
|
|
128
|
-
|
|
129
|
-
parent: undefined
|
|
130
|
-
}));
|
|
162
|
+
const normalized = flat(nested).map(
|
|
163
|
+
(route) => route.parent ? __spreadProps(__spreadValues(__spreadValues({}, route), generate(route)), { parent: void 0 }) : __spreadProps(__spreadValues({}, route), { parent: void 0 })
|
|
164
|
+
);
|
|
131
165
|
return normalized;
|
|
132
166
|
};
|
|
133
|
-
|
|
167
|
+
const getClientRoutes = ({
|
|
134
168
|
entrypoint,
|
|
135
169
|
srcDirectory,
|
|
136
170
|
srcAlias,
|
|
137
171
|
internalDirectory,
|
|
138
172
|
internalDirAlias
|
|
139
173
|
}) => {
|
|
140
|
-
const {
|
|
141
|
-
entry,
|
|
142
|
-
entryName
|
|
143
|
-
} = entrypoint;
|
|
174
|
+
const { entry, entryName } = entrypoint;
|
|
144
175
|
if (!fs.existsSync(entry)) {
|
|
145
|
-
throw new Error(
|
|
176
|
+
throw new Error(
|
|
177
|
+
`generate file system routes error, ${entry} directory not found.`
|
|
178
|
+
);
|
|
146
179
|
}
|
|
147
180
|
if (!(fs.existsSync(entry) && fs.statSync(entry).isDirectory())) {
|
|
148
|
-
throw new Error(
|
|
181
|
+
throw new Error(
|
|
182
|
+
`generate file system routes error, ${entry} should be directory.`
|
|
183
|
+
);
|
|
149
184
|
}
|
|
150
185
|
let routes = [];
|
|
151
186
|
recursiveReadDir({
|
|
152
187
|
dir: entry,
|
|
153
188
|
routes,
|
|
154
|
-
basePath:
|
|
189
|
+
basePath: "/",
|
|
155
190
|
srcDirectory,
|
|
156
191
|
srcAlias
|
|
157
192
|
});
|
|
158
|
-
const internalComponentsDir = path.resolve(
|
|
193
|
+
const internalComponentsDir = path.resolve(
|
|
194
|
+
internalDirectory,
|
|
195
|
+
`${entryName}/${FILE_SYSTEM_ROUTES_COMPONENTS_DIR}`
|
|
196
|
+
);
|
|
159
197
|
fs.emptyDirSync(internalComponentsDir);
|
|
160
|
-
routes = normalizeNestedRoutes(
|
|
198
|
+
routes = normalizeNestedRoutes(
|
|
199
|
+
routes,
|
|
200
|
+
internalComponentsDir,
|
|
201
|
+
internalDirectory,
|
|
202
|
+
internalDirAlias
|
|
203
|
+
);
|
|
161
204
|
parents.length = 0;
|
|
162
|
-
|
|
163
|
-
// FIXME: support more situations
|
|
164
205
|
routes.sort((a, b) => {
|
|
165
206
|
const delta = getRouteWeight(a.path) - getRouteWeight(b.path);
|
|
166
207
|
if (delta === 0) {
|
|
@@ -170,4 +211,7 @@ export const getClientRoutes = ({
|
|
|
170
211
|
});
|
|
171
212
|
debug(`fileSystem routes: %o`, routes);
|
|
172
213
|
return routes;
|
|
173
|
-
};
|
|
214
|
+
};
|
|
215
|
+
export {
|
|
216
|
+
getClientRoutes
|
|
217
|
+
};
|
|
@@ -1,28 +1,49 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
import path from "path";
|
|
21
|
+
import { fs } from "@modern-js/utils";
|
|
6
22
|
import { makeLegalIdentifier } from "../makeLegalIdentifier";
|
|
7
|
-
import {
|
|
23
|
+
import {
|
|
24
|
+
FILE_SYSTEM_ROUTES_COMPONENTS_DIR,
|
|
25
|
+
FILE_SYSTEM_ROUTES_DYNAMIC_REGEXP,
|
|
26
|
+
FILE_SYSTEM_ROUTES_INDEX,
|
|
27
|
+
FILE_SYSTEM_ROUTES_LAYOUT
|
|
28
|
+
} from "../constants";
|
|
8
29
|
import { replaceWithAlias } from "../utils";
|
|
9
30
|
import { debug, findLayout, shouldSkip, getRouteWeight } from "./utils";
|
|
10
31
|
const compName = (srcDirectory, filePath) => {
|
|
11
|
-
const legalCompName = makeLegalIdentifier(
|
|
32
|
+
const legalCompName = makeLegalIdentifier(
|
|
33
|
+
path.relative(srcDirectory, filePath)
|
|
34
|
+
);
|
|
12
35
|
return `Comp_${legalCompName}`;
|
|
13
36
|
};
|
|
14
|
-
const layoutNameAbbr = filePath => {
|
|
15
|
-
const prefix =
|
|
16
|
-
const dirName = path.dirname(filePath).split(
|
|
37
|
+
const layoutNameAbbr = (filePath) => {
|
|
38
|
+
const prefix = "L_";
|
|
39
|
+
const dirName = path.dirname(filePath).split("/").pop() || "";
|
|
17
40
|
return `${prefix}${makeLegalIdentifier(dirName)}`;
|
|
18
41
|
};
|
|
19
42
|
const parents = [];
|
|
20
|
-
|
|
21
|
-
/* eslint-disable no-param-reassign */
|
|
22
43
|
const recursiveReadDirLegacy = ({
|
|
23
44
|
dir,
|
|
24
45
|
routes,
|
|
25
|
-
basePath
|
|
46
|
+
basePath = "/",
|
|
26
47
|
srcDirectory,
|
|
27
48
|
srcAlias
|
|
28
49
|
}) => {
|
|
@@ -31,13 +52,13 @@ const recursiveReadDirLegacy = ({
|
|
|
31
52
|
let parent = parents[parents.length - 1];
|
|
32
53
|
const layout = findLayout(dir);
|
|
33
54
|
if (layout) {
|
|
34
|
-
if (
|
|
55
|
+
if (basePath === "/") {
|
|
35
56
|
throw new Error(`should use _app instead of _layout in ${dir}`);
|
|
36
57
|
} else {
|
|
37
58
|
const alias = replaceWithAlias(srcDirectory, layout, srcAlias);
|
|
38
59
|
const componentName = compName(srcDirectory, layout);
|
|
39
60
|
const route = {
|
|
40
|
-
path: `${
|
|
61
|
+
path: `${basePath.substring(0, basePath.length - 1)}`,
|
|
41
62
|
exact: false,
|
|
42
63
|
routes: [],
|
|
43
64
|
_component: alias,
|
|
@@ -60,13 +81,15 @@ const recursiveReadDirLegacy = ({
|
|
|
60
81
|
const dynamicRouteMatched = FILE_SYSTEM_ROUTES_DYNAMIC_REGEXP.exec(filename);
|
|
61
82
|
if (dynamicRouteMatched) {
|
|
62
83
|
if (hasDynamicRoute) {
|
|
63
|
-
throw new Error(
|
|
84
|
+
throw new Error(
|
|
85
|
+
`Can't set two dynamic route in one directory: ${dir}`
|
|
86
|
+
);
|
|
64
87
|
} else {
|
|
65
88
|
hasDynamicRoute = true;
|
|
66
89
|
}
|
|
67
90
|
}
|
|
68
91
|
const route = {
|
|
69
|
-
path: `${
|
|
92
|
+
path: `${basePath}${dynamicRouteMatched ? `:${dynamicRouteMatched[1]}${dynamicRouteMatched[2]}` : filename}`,
|
|
70
93
|
_component: alias,
|
|
71
94
|
component: componentName,
|
|
72
95
|
exact: true,
|
|
@@ -86,10 +109,10 @@ const recursiveReadDirLegacy = ({
|
|
|
86
109
|
continue;
|
|
87
110
|
}
|
|
88
111
|
if (filename === FILE_SYSTEM_ROUTES_INDEX) {
|
|
89
|
-
route.path =
|
|
112
|
+
route.path = basePath === "/" ? basePath : `${basePath.substring(0, basePath.length - 1)}`;
|
|
90
113
|
}
|
|
91
|
-
if (filename ===
|
|
92
|
-
route.path =
|
|
114
|
+
if (filename === "404" && basePath === "/") {
|
|
115
|
+
route.path = "*";
|
|
93
116
|
route.exact = false;
|
|
94
117
|
}
|
|
95
118
|
routes.push(route);
|
|
@@ -99,69 +122,85 @@ const recursiveReadDirLegacy = ({
|
|
|
99
122
|
parents.pop();
|
|
100
123
|
}
|
|
101
124
|
};
|
|
102
|
-
/* eslint-enable no-param-reassign */
|
|
103
|
-
|
|
104
125
|
const normalizeNestedRoutes = (nested, internalComponentsDir, internalDirectory, internalDirAlias) => {
|
|
105
|
-
const flat = routes => routes.reduce(
|
|
106
|
-
|
|
126
|
+
const flat = (routes) => routes.reduce(
|
|
127
|
+
(memo, route) => memo.concat(Array.isArray(route.routes) ? flat(route.routes) : [route]),
|
|
128
|
+
[]
|
|
129
|
+
);
|
|
130
|
+
const generate = (route) => {
|
|
107
131
|
const codes = [];
|
|
108
132
|
let lastComponent = route.component;
|
|
109
|
-
const imports = [
|
|
110
|
-
|
|
111
|
-
|
|
133
|
+
const imports = [
|
|
134
|
+
`import React from 'react';`,
|
|
135
|
+
`import ${lastComponent} from '${route._component}'`
|
|
136
|
+
];
|
|
112
137
|
while (route = route.parent) {
|
|
113
138
|
const layoutComponent = route.component;
|
|
114
139
|
const layoutComponentAbbr = layoutNameAbbr(route._component);
|
|
115
140
|
imports.push(`import ${layoutComponent} from '${route._component}';`);
|
|
116
141
|
const currentComponent = `${layoutComponentAbbr}_${lastComponent}`;
|
|
117
|
-
codes.push(
|
|
142
|
+
codes.push(
|
|
143
|
+
`const ${currentComponent} = props => <${layoutComponent} Component={${lastComponent}} {...props} />;`
|
|
144
|
+
);
|
|
118
145
|
lastComponent = currentComponent;
|
|
119
146
|
}
|
|
120
147
|
const file = path.resolve(internalComponentsDir, `${lastComponent}.jsx`);
|
|
121
|
-
fs.outputFileSync(
|
|
148
|
+
fs.outputFileSync(
|
|
149
|
+
file,
|
|
150
|
+
`${imports.join("\n")}
|
|
151
|
+
${codes.join(
|
|
152
|
+
"\n"
|
|
153
|
+
)}
|
|
154
|
+
export default ${lastComponent}`
|
|
155
|
+
);
|
|
122
156
|
return {
|
|
123
157
|
component: lastComponent,
|
|
124
158
|
_component: replaceWithAlias(internalDirectory, file, internalDirAlias)
|
|
125
159
|
};
|
|
126
160
|
};
|
|
127
|
-
const normalized = flat(nested).map(
|
|
128
|
-
parent:
|
|
129
|
-
|
|
130
|
-
parent: undefined
|
|
131
|
-
}));
|
|
161
|
+
const normalized = flat(nested).map(
|
|
162
|
+
(route) => route.parent ? __spreadProps(__spreadValues(__spreadValues({}, route), generate(route)), { parent: void 0 }) : __spreadProps(__spreadValues({}, route), { parent: void 0 })
|
|
163
|
+
);
|
|
132
164
|
return normalized;
|
|
133
165
|
};
|
|
134
|
-
|
|
166
|
+
const getClientRoutes = ({
|
|
135
167
|
entrypoint,
|
|
136
168
|
srcDirectory,
|
|
137
169
|
srcAlias,
|
|
138
170
|
internalDirectory,
|
|
139
171
|
internalDirAlias
|
|
140
172
|
}) => {
|
|
141
|
-
const {
|
|
142
|
-
entry,
|
|
143
|
-
entryName
|
|
144
|
-
} = entrypoint;
|
|
173
|
+
const { entry, entryName } = entrypoint;
|
|
145
174
|
if (!fs.existsSync(entry)) {
|
|
146
|
-
throw new Error(
|
|
175
|
+
throw new Error(
|
|
176
|
+
`generate file system routes error, ${entry} directory not found.`
|
|
177
|
+
);
|
|
147
178
|
}
|
|
148
179
|
if (!(fs.existsSync(entry) && fs.statSync(entry).isDirectory())) {
|
|
149
|
-
throw new Error(
|
|
180
|
+
throw new Error(
|
|
181
|
+
`generate file system routes error, ${entry} should be directory.`
|
|
182
|
+
);
|
|
150
183
|
}
|
|
151
184
|
let routes = [];
|
|
152
185
|
recursiveReadDirLegacy({
|
|
153
186
|
dir: entry,
|
|
154
187
|
routes,
|
|
155
|
-
basePath:
|
|
188
|
+
basePath: "/",
|
|
156
189
|
srcDirectory,
|
|
157
190
|
srcAlias
|
|
158
191
|
});
|
|
159
|
-
const internalComponentsDir = path.resolve(
|
|
192
|
+
const internalComponentsDir = path.resolve(
|
|
193
|
+
internalDirectory,
|
|
194
|
+
`${entryName}/${FILE_SYSTEM_ROUTES_COMPONENTS_DIR}`
|
|
195
|
+
);
|
|
160
196
|
fs.emptyDirSync(internalComponentsDir);
|
|
161
|
-
routes = normalizeNestedRoutes(
|
|
197
|
+
routes = normalizeNestedRoutes(
|
|
198
|
+
routes,
|
|
199
|
+
internalComponentsDir,
|
|
200
|
+
internalDirectory,
|
|
201
|
+
internalDirAlias
|
|
202
|
+
);
|
|
162
203
|
parents.length = 0;
|
|
163
|
-
|
|
164
|
-
// FIXME: support more situations
|
|
165
204
|
routes.sort((a, b) => {
|
|
166
205
|
const delta = getRouteWeight(a.path) - getRouteWeight(b.path);
|
|
167
206
|
if (delta === 0) {
|
|
@@ -171,4 +210,7 @@ export const getClientRoutes = ({
|
|
|
171
210
|
});
|
|
172
211
|
debug(`fileSystem routes: %o`, routes);
|
|
173
212
|
return routes;
|
|
174
|
-
};
|
|
213
|
+
};
|
|
214
|
+
export {
|
|
215
|
+
getClientRoutes
|
|
216
|
+
};
|
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { getClientRoutes } from "./getRoutes";
|
|
2
|
+
import { getClientRoutes as getClientRoutes2 } from "./getRoutesLegacy";
|
|
3
|
+
export {
|
|
4
|
+
getClientRoutes,
|
|
5
|
+
getClientRoutes2 as getClientRoutesLegacy
|
|
6
|
+
};
|
|
@@ -1,12 +1,19 @@
|
|
|
1
|
-
import path from
|
|
2
|
-
import { createDebugger, findExists, fs } from
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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) => {
|
|
10
17
|
if (fs.statSync(file).isDirectory()) {
|
|
11
18
|
return false;
|
|
12
19
|
}
|
|
@@ -15,4 +22,10 @@ export const shouldSkip = file => {
|
|
|
15
22
|
return true;
|
|
16
23
|
}
|
|
17
24
|
return false;
|
|
18
|
-
};
|
|
25
|
+
};
|
|
26
|
+
export {
|
|
27
|
+
debug,
|
|
28
|
+
findLayout,
|
|
29
|
+
getRouteWeight,
|
|
30
|
+
shouldSkip
|
|
31
|
+
};
|
|
@@ -1,14 +1,25 @@
|
|
|
1
|
-
import fs from
|
|
2
|
-
import path from
|
|
3
|
-
import { findExists, ensureAbsolutePath } from
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { findExists, ensureAbsolutePath } from "@modern-js/utils";
|
|
4
4
|
import { isDefaultExportFunction } from "./isDefaultExportFunction";
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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) => {
|
|
12
23
|
const indexFile = hasIndex(dir);
|
|
13
24
|
const customBootstrap = isDefaultExportFunction(indexFile) ? indexFile : false;
|
|
14
25
|
const entryName = path.basename(dir);
|
|
@@ -35,9 +46,16 @@ const scanDir = dirs => dirs.map(dir => {
|
|
|
35
46
|
if (isHasNestedRoutes || isHasPages) {
|
|
36
47
|
const entrypoint = {
|
|
37
48
|
entryName,
|
|
38
|
-
entry:
|
|
49
|
+
entry: "",
|
|
39
50
|
fileSystemRoutes: {
|
|
40
|
-
globalApp: findExists(
|
|
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
|
+
)
|
|
41
59
|
},
|
|
42
60
|
isAutoMount: true,
|
|
43
61
|
absoluteEntryDir: path.resolve(dir),
|
|
@@ -58,23 +76,26 @@ const scanDir = dirs => dirs.map(dir => {
|
|
|
58
76
|
isAutoMount: false
|
|
59
77
|
};
|
|
60
78
|
});
|
|
61
|
-
|
|
79
|
+
const getFileSystemEntry = (appContext, config) => {
|
|
80
|
+
const { appDirectory } = appContext;
|
|
62
81
|
const {
|
|
63
|
-
|
|
64
|
-
} = appContext;
|
|
65
|
-
const {
|
|
66
|
-
source: {
|
|
67
|
-
entriesDir
|
|
68
|
-
}
|
|
82
|
+
source: { entriesDir }
|
|
69
83
|
} = config;
|
|
70
|
-
const src = ensureAbsolutePath(appDirectory, entriesDir ||
|
|
84
|
+
const src = ensureAbsolutePath(appDirectory, entriesDir || "");
|
|
71
85
|
if (fs.existsSync(src)) {
|
|
72
86
|
if (fs.statSync(src).isDirectory()) {
|
|
73
|
-
return scanDir(
|
|
87
|
+
return scanDir(
|
|
88
|
+
isBundleEntry(src) ? [src] : fs.readdirSync(src).map((file) => path.join(src, file)).filter(
|
|
89
|
+
(file) => fs.statSync(file).isDirectory() && isBundleEntry(file)
|
|
90
|
+
)
|
|
91
|
+
);
|
|
74
92
|
} else {
|
|
75
93
|
throw Error(`source.entriesDir accept a directory.`);
|
|
76
94
|
}
|
|
77
95
|
} else {
|
|
78
96
|
throw Error(`src dir ${entriesDir} not found.`);
|
|
79
97
|
}
|
|
80
|
-
};
|
|
98
|
+
};
|
|
99
|
+
export {
|
|
100
|
+
getFileSystemEntry
|
|
101
|
+
};
|