@modern-js/app-tools 2.0.0-beta.2 → 2.0.0-beta.3

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 (60) hide show
  1. package/CHANGELOG.md +251 -0
  2. package/bin/modern.js +10 -1
  3. package/dist/js/modern/analyze/constants.js +2 -0
  4. package/dist/js/modern/analyze/generateCode.js +38 -18
  5. package/dist/js/modern/analyze/getServerRoutes.js +3 -3
  6. package/dist/js/modern/analyze/nestedRoutes.js +17 -6
  7. package/dist/js/modern/analyze/templates.js +59 -27
  8. package/dist/js/modern/analyze/utils.js +30 -4
  9. package/dist/js/modern/builder/builderPlugins/compatModern.js +6 -1
  10. package/dist/js/modern/builder/index.js +3 -5
  11. package/dist/js/modern/builder/loaders/routerLoader.js +20 -0
  12. package/dist/js/modern/builder/loaders/serverModuleLoader.js +4 -0
  13. package/dist/js/modern/commands/dev.js +23 -27
  14. package/dist/js/modern/commands/start.js +0 -1
  15. package/dist/js/modern/config/default.js +0 -1
  16. package/dist/js/modern/config/initial/createOutputConfig.js +3 -0
  17. package/dist/js/modern/utils/createFileWatcher.js +1 -1
  18. package/dist/js/modern/utils/restart.js +1 -1
  19. package/dist/js/node/analyze/constants.js +5 -1
  20. package/dist/js/node/analyze/generateCode.js +36 -16
  21. package/dist/js/node/analyze/getServerRoutes.js +3 -3
  22. package/dist/js/node/analyze/nestedRoutes.js +15 -4
  23. package/dist/js/node/analyze/templates.js +60 -27
  24. package/dist/js/node/analyze/utils.js +31 -3
  25. package/dist/js/node/builder/builderPlugins/compatModern.js +6 -1
  26. package/dist/js/node/builder/index.js +3 -5
  27. package/dist/js/node/builder/loaders/routerLoader.js +27 -0
  28. package/dist/js/node/builder/loaders/serverModuleLoader.js +11 -0
  29. package/dist/js/node/commands/dev.js +23 -27
  30. package/dist/js/node/commands/start.js +0 -1
  31. package/dist/js/node/config/default.js +0 -1
  32. package/dist/js/node/config/initial/createOutputConfig.js +3 -0
  33. package/dist/js/node/utils/createFileWatcher.js +2 -1
  34. package/dist/js/node/utils/restart.js +1 -1
  35. package/dist/js/treeshaking/analyze/constants.js +2 -0
  36. package/dist/js/treeshaking/analyze/generateCode.js +137 -81
  37. package/dist/js/treeshaking/analyze/getServerRoutes.js +4 -3
  38. package/dist/js/treeshaking/analyze/nestedRoutes.js +98 -55
  39. package/dist/js/treeshaking/analyze/templates.js +175 -101
  40. package/dist/js/treeshaking/analyze/utils.js +80 -4
  41. package/dist/js/treeshaking/builder/builderPlugins/compatModern.js +6 -1
  42. package/dist/js/treeshaking/builder/index.js +3 -5
  43. package/dist/js/treeshaking/builder/loaders/routerLoader.js +14 -0
  44. package/dist/js/treeshaking/builder/loaders/serverModuleLoader.js +4 -0
  45. package/dist/js/treeshaking/commands/dev.js +37 -38
  46. package/dist/js/treeshaking/commands/start.js +0 -1
  47. package/dist/js/treeshaking/config/default.js +0 -1
  48. package/dist/js/treeshaking/config/initial/createOutputConfig.js +3 -0
  49. package/dist/js/treeshaking/utils/createFileWatcher.js +1 -1
  50. package/dist/js/treeshaking/utils/restart.js +1 -1
  51. package/dist/types/analyze/constants.d.ts +2 -0
  52. package/dist/types/analyze/templates.d.ts +8 -7
  53. package/dist/types/analyze/utils.d.ts +9 -1
  54. package/dist/types/builder/loaders/routerLoader.d.ts +3 -0
  55. package/dist/types/builder/loaders/serverModuleLoader.d.ts +3 -0
  56. package/dist/types/types/config/tools.d.ts +8 -1
  57. package/dist/types/types/hooks.d.ts +2 -1
  58. package/dist/types/utils/createFileWatcher.d.ts +2 -1
  59. package/lib/types.d.ts +1 -1
  60. package/package.json +25 -22
@@ -1,17 +1,44 @@
1
- import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
2
1
  import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
3
- import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
4
2
  import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
3
+ import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
4
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
5
5
  import * as path from 'path';
6
- import { fs, getRouteId } from '@modern-js/utils';
6
+ import { fs, getRouteId, normalizeToPosixPath } from '@modern-js/utils';
7
7
  import { JS_EXTENSIONS } from "./constants";
8
- import { replaceWithAlias } from "./utils";
8
+ import { hasLoader, replaceWithAlias } from "./utils";
9
9
  var LAYOUT_FILE = 'layout';
10
10
  var PAGE_FILE = 'page';
11
11
  var LOADING_FILE = 'loading';
12
12
  var ERROR_FILE = 'error';
13
13
  var LOADER_FILE = 'loader';
14
14
  var conventionNames = [LAYOUT_FILE, PAGE_FILE, LOADING_FILE, ERROR_FILE, LOADER_FILE];
15
+ var getLoaderPath = /*#__PURE__*/function () {
16
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(filename) {
17
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
18
+ while (1) {
19
+ switch (_context.prev = _context.next) {
20
+ case 0:
21
+ _context.next = 2;
22
+ return hasLoader(filename);
23
+ case 2:
24
+ if (!_context.sent) {
25
+ _context.next = 4;
26
+ break;
27
+ }
28
+ return _context.abrupt("return", normalizeToPosixPath(filename));
29
+ case 4:
30
+ return _context.abrupt("return", undefined);
31
+ case 5:
32
+ case "end":
33
+ return _context.stop();
34
+ }
35
+ }
36
+ }, _callee);
37
+ }));
38
+ return function getLoaderPath(_x) {
39
+ return _ref.apply(this, arguments);
40
+ };
41
+ }();
15
42
  var replaceDynamicPath = function replaceDynamicPath(routePath) {
16
43
  return routePath.replace(/\[(.*?)\]/g, ':$1');
17
44
  };
@@ -29,30 +56,30 @@ var createRoute = function createRoute(routeInfo, rootDir, filename, entryName)
29
56
  });
30
57
  };
31
58
  export var walk = /*#__PURE__*/function () {
32
- var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(dirname, rootDir, alias, entryName) {
59
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(dirname, rootDir, alias, entryName) {
33
60
  var isDirectory, relativeDir, pathSegments, lastSegment, isRoot, isPathlessLayout, isWithoutLayoutPath, routePath, route, items, _iterator, _step, item, itemPath, extname, itemWithoutExt, _isDirectory, childRoute, _route$children, _route$children2, _childRoute, finalRoute;
34
- return _regeneratorRuntime().wrap(function _callee$(_context) {
61
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
35
62
  while (1) {
36
- switch (_context.prev = _context.next) {
63
+ switch (_context2.prev = _context2.next) {
37
64
  case 0:
38
- _context.next = 2;
65
+ _context2.next = 2;
39
66
  return fs.pathExists(dirname);
40
67
  case 2:
41
- if (_context.sent) {
42
- _context.next = 4;
68
+ if (_context2.sent) {
69
+ _context2.next = 4;
43
70
  break;
44
71
  }
45
- return _context.abrupt("return", null);
72
+ return _context2.abrupt("return", null);
46
73
  case 4:
47
- _context.next = 6;
74
+ _context2.next = 6;
48
75
  return fs.stat(dirname);
49
76
  case 6:
50
- isDirectory = _context.sent.isDirectory();
77
+ isDirectory = _context2.sent.isDirectory();
51
78
  if (isDirectory) {
52
- _context.next = 9;
79
+ _context2.next = 9;
53
80
  break;
54
81
  }
55
- return _context.abrupt("return", null);
82
+ return _context2.abrupt("return", null);
56
83
  case 9:
57
84
  relativeDir = path.relative(rootDir, dirname);
58
85
  pathSegments = relativeDir.split(path.sep);
@@ -67,79 +94,95 @@ export var walk = /*#__PURE__*/function () {
67
94
  routePath = replaceDynamicPath(routePath);
68
95
  route = {
69
96
  path: routePath,
70
- children: []
97
+ children: [],
98
+ isRoot: isRoot
71
99
  };
72
- _context.next = 21;
100
+ _context2.next = 21;
73
101
  return fs.readdir(dirname);
74
102
  case 21:
75
- items = _context.sent;
103
+ items = _context2.sent;
76
104
  _iterator = _createForOfIteratorHelper(items);
77
- _context.prev = 23;
105
+ _context2.prev = 23;
78
106
  _iterator.s();
79
107
  case 25:
80
108
  if ((_step = _iterator.n()).done) {
81
- _context.next = 47;
109
+ _context2.next = 55;
82
110
  break;
83
111
  }
84
112
  item = _step.value;
85
113
  itemPath = path.join(dirname, item);
86
114
  extname = path.extname(item);
87
115
  itemWithoutExt = item.slice(0, -extname.length);
88
- _context.next = 32;
116
+ _context2.next = 32;
89
117
  return fs.stat(itemPath);
90
118
  case 32:
91
- _isDirectory = _context.sent.isDirectory();
119
+ _isDirectory = _context2.sent.isDirectory();
92
120
  if (!_isDirectory) {
93
- _context.next = 38;
121
+ _context2.next = 38;
94
122
  break;
95
123
  }
96
- _context.next = 36;
124
+ _context2.next = 36;
97
125
  return walk(itemPath, rootDir, alias, entryName);
98
126
  case 36:
99
- childRoute = _context.sent;
127
+ childRoute = _context2.sent;
100
128
  if (childRoute) {
101
129
  (_route$children = route.children) === null || _route$children === void 0 ? void 0 : _route$children.push(childRoute);
102
130
  }
103
131
  case 38:
104
132
  if (!(extname && (!JS_EXTENSIONS.includes(extname) || !conventionNames.includes(itemWithoutExt)))) {
105
- _context.next = 40;
133
+ _context2.next = 40;
106
134
  break;
107
135
  }
108
- return _context.abrupt("continue", 45);
136
+ return _context2.abrupt("continue", 53);
109
137
  case 40:
110
- if (itemWithoutExt === LAYOUT_FILE) {
111
- route._component = replaceWithAlias(alias.basename, itemPath, alias.name);
112
- }
113
- if (itemWithoutExt === PAGE_FILE) {
114
- _childRoute = createIndexRoute({
115
- _component: replaceWithAlias(alias.basename, itemPath, alias.name)
116
- }, rootDir, itemPath, entryName);
117
- (_route$children2 = route.children) === null || _route$children2 === void 0 ? void 0 : _route$children2.push(_childRoute);
138
+ if (!(itemWithoutExt === LAYOUT_FILE)) {
139
+ _context2.next = 45;
140
+ break;
118
141
  }
119
- if (itemWithoutExt === LOADER_FILE) {
120
- route.loader = replaceWithAlias(alias.basename, itemPath, alias.name);
142
+ route._component = replaceWithAlias(alias.basename, itemPath, alias.name);
143
+ _context2.next = 44;
144
+ return getLoaderPath(itemPath);
145
+ case 44:
146
+ route.loader = _context2.sent;
147
+ case 45:
148
+ if (!(itemWithoutExt === PAGE_FILE)) {
149
+ _context2.next = 51;
150
+ break;
121
151
  }
152
+ _childRoute = createIndexRoute({
153
+ _component: replaceWithAlias(alias.basename, itemPath, alias.name)
154
+ }, rootDir, itemPath, entryName);
155
+ _context2.next = 49;
156
+ return getLoaderPath(itemPath);
157
+ case 49:
158
+ _childRoute.loader = _context2.sent;
159
+ (_route$children2 = route.children) === null || _route$children2 === void 0 ? void 0 : _route$children2.push(_childRoute);
160
+ case 51:
161
+ // if (itemWithoutExt === LOADER_FILE) {
162
+ // route.loader = replaceWithAlias(alias.basename, itemPath, alias.name);
163
+ // }
164
+
122
165
  if (itemWithoutExt === LOADING_FILE) {
123
166
  route.loading = replaceWithAlias(alias.basename, itemPath, alias.name);
124
167
  }
125
168
  if (itemWithoutExt === ERROR_FILE) {
126
169
  route.error = replaceWithAlias(alias.basename, itemPath, alias.name);
127
170
  }
128
- case 45:
129
- _context.next = 25;
171
+ case 53:
172
+ _context2.next = 25;
130
173
  break;
131
- case 47:
132
- _context.next = 52;
174
+ case 55:
175
+ _context2.next = 60;
133
176
  break;
134
- case 49:
135
- _context.prev = 49;
136
- _context.t0 = _context["catch"](23);
137
- _iterator.e(_context.t0);
138
- case 52:
139
- _context.prev = 52;
177
+ case 57:
178
+ _context2.prev = 57;
179
+ _context2.t0 = _context2["catch"](23);
180
+ _iterator.e(_context2.t0);
181
+ case 60:
182
+ _context2.prev = 60;
140
183
  _iterator.f();
141
- return _context.finish(52);
142
- case 55:
184
+ return _context2.finish(60);
185
+ case 63:
143
186
  finalRoute = createRoute(route, rootDir, path.join(dirname, "".concat(LAYOUT_FILE, ".ts")), entryName);
144
187
  /**
145
188
  * when the url is /, the __auth/layout.tsx component should not be rendered
@@ -151,15 +194,15 @@ export var walk = /*#__PURE__*/function () {
151
194
  if (isPathlessLayout) {
152
195
  delete finalRoute.path;
153
196
  }
154
- return _context.abrupt("return", finalRoute);
155
- case 58:
197
+ return _context2.abrupt("return", finalRoute);
198
+ case 66:
156
199
  case "end":
157
- return _context.stop();
200
+ return _context2.stop();
158
201
  }
159
202
  }
160
- }, _callee, null, [[23, 49, 52, 55]]);
203
+ }, _callee2, null, [[23, 57, 60, 63]]);
161
204
  }));
162
- return function walk(_x, _x2, _x3, _x4) {
163
- return _ref.apply(this, arguments);
205
+ return function walk(_x2, _x3, _x4, _x5) {
206
+ return _ref2.apply(this, arguments);
164
207
  };
165
208
  }();
@@ -1,5 +1,10 @@
1
+ import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
1
3
  import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
2
4
  import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
5
+ import path from 'path';
6
+ import { fs } from '@modern-js/utils';
7
+ import { TEMP_LOADERS_DIR } from "./constants";
3
8
  export var index = function index(_ref) {
4
9
  var mountId = _ref.mountId,
5
10
  imports = _ref.imports,
@@ -23,10 +28,10 @@ export var html = function html(partials) {
23
28
  };
24
29
  export var routesForServer = function routesForServer(_ref4) {
25
30
  var routes = _ref4.routes,
26
- alias = _ref4.alias;
27
- var name = alias.name,
28
- basename = alias.basename;
31
+ internalDirectory = _ref4.internalDirectory,
32
+ entryName = _ref4.entryName;
29
33
  var loaders = [];
34
+ var loaderIndexFile = path.join(internalDirectory, entryName, TEMP_LOADERS_DIR, 'index.js');
30
35
  var traverseRouteTree = function traverseRouteTree(route) {
31
36
  var children;
32
37
  if ('children' in route && route.children) {
@@ -65,106 +70,175 @@ export var routesForServer = function routesForServer(_ref4) {
65
70
  _iterator.f();
66
71
  }
67
72
  routesCode += "\n];";
68
- var importLoadersCode = loaders.map(function (loader, index) {
69
- var realLoaderPath = loader.replace(name, basename);
70
- return "import loader_".concat(index, " from '").concat(realLoaderPath, "';\n");
71
- }).join('');
73
+ var importLoadersCode = '';
74
+ if (loaders.length > 0) {
75
+ importLoadersCode = "\n import { ".concat(loaders.map(function (loader, index) {
76
+ return "loader_".concat(index);
77
+ }), " } from \"").concat(loaderIndexFile, "\"");
78
+ }
72
79
  return "\n ".concat(importLoadersCode, "\n ").concat(routesCode, "\n ");
73
80
  };
74
- export var fileSystemRoutes = function fileSystemRoutes(_ref5) {
75
- var routes = _ref5.routes,
76
- ssrMode = _ref5.ssrMode,
77
- nestedRoutesEntry = _ref5.nestedRoutesEntry,
78
- entryName = _ref5.entryName;
79
- // The legacy mode and pages dir routes should use loadable
80
- // nested routes + renderTostring should use loadable.lazy
81
- // nested routes + renderToStream should use react.lazy
82
- var importLazyCode = "\n import { lazy } from \"react\";\n import loadable, { lazy as loadableLazy } from \"@modern-js/runtime/loadable\"\n ";
83
- var dataLoaderPath = '';
84
- if (ssrMode) {
85
- dataLoaderPath = require.resolve("@modern-js/plugin-data-loader/loader");
86
- if (nestedRoutesEntry) {
87
- dataLoaderPath = "".concat(dataLoaderPath, "?routesDir=").concat(nestedRoutesEntry, "&entryName=").concat(entryName, "!");
88
- }
89
- }
90
- var loadings = [];
91
- var errors = [];
92
- var loaders = [];
93
- var traverseRouteTree = function traverseRouteTree(route) {
94
- var children;
95
- if ('children' in route && route.children) {
96
- var _route$children2;
97
- children = route === null || route === void 0 ? void 0 : (_route$children2 = route.children) === null || _route$children2 === void 0 ? void 0 : _route$children2.map(traverseRouteTree);
98
- }
99
- var loading;
100
- var error;
101
- var loader;
102
- var component = '';
103
- if (route.type === 'nested') {
104
- if (route.loading) {
105
- loadings.push(route.loading);
106
- loading = "loading_".concat(loadings.length - 1);
107
- }
108
- if (route.error) {
109
- errors.push(route.error);
110
- error = "error_".concat(errors.length - 1);
111
- }
112
- if (route.loader) {
113
- loaders.push(route.loader);
114
- loader = "loader_".concat(loaders.length - 1);
115
- }
116
- if (route._component) {
117
- if (ssrMode === 'stream') {
118
- component = "lazy(() => import(/* webpackChunkName: \"".concat(route.id, "\" */ /* webpackMode: \"lazy-once\" */ '").concat(route._component, "'))");
119
- } else {
120
- component = "loadable(() => import(/* webpackChunkName: \"".concat(route.id, "\" */ /* webpackMode: \"lazy-once\" */ '").concat(route._component, "'))");
81
+ export var fileSystemRoutes = /*#__PURE__*/function () {
82
+ var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref5) {
83
+ var routes, ssrMode, nestedRoutesEntry, entryName, internalDirectory, loadings, errors, loaders, loadersMap, loadersIndexFile, loadersMapFile, importLazyCode, rootLayoutCode, dataLoaderPath, componentLoaderPath, traverseRouteTree, routeComponentsCode, _iterator2, _step2, route, newRoute, component, finalRoute, importLoadingCode, importErrorComponentsCode, importLoadersCode, loaderEntryCode, loaderEntryFile;
84
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
85
+ while (1) {
86
+ switch (_context2.prev = _context2.next) {
87
+ case 0:
88
+ routes = _ref5.routes, ssrMode = _ref5.ssrMode, nestedRoutesEntry = _ref5.nestedRoutesEntry, entryName = _ref5.entryName, internalDirectory = _ref5.internalDirectory;
89
+ loadings = [];
90
+ errors = [];
91
+ loaders = [];
92
+ loadersMap = {};
93
+ loadersIndexFile = path.join('@_modern_js_internal', entryName, TEMP_LOADERS_DIR, 'index.js');
94
+ loadersMapFile = path.join(internalDirectory, entryName, TEMP_LOADERS_DIR, 'map.json');
95
+ importLazyCode = "\n import { lazy } from \"react\";\n import loadable, { lazy as loadableLazy } from \"@modern-js/runtime/loadable\"\n ";
96
+ rootLayoutCode = "";
97
+ dataLoaderPath = '';
98
+ componentLoaderPath = '';
99
+ if (ssrMode) {
100
+ dataLoaderPath = require.resolve("@modern-js/plugin-data-loader/loader");
101
+ if (nestedRoutesEntry) {
102
+ dataLoaderPath = "".concat(dataLoaderPath, "?routesDir=").concat(nestedRoutesEntry, "&mapFile=").concat(loadersMapFile, "!");
103
+ }
104
+ componentLoaderPath = "".concat(path.join(__dirname, '../builder/loaders/routerLoader'), "!");
105
+ }
106
+ traverseRouteTree = function traverseRouteTree(route) {
107
+ var children;
108
+ if ('children' in route && route.children) {
109
+ var _route$children2;
110
+ children = route === null || route === void 0 ? void 0 : (_route$children2 = route.children) === null || _route$children2 === void 0 ? void 0 : _route$children2.map(traverseRouteTree);
111
+ }
112
+ var loading;
113
+ var error;
114
+ var loader;
115
+ var component = '';
116
+ if (route.type === 'nested') {
117
+ if (route.loading) {
118
+ loadings.push(route.loading);
119
+ loading = "loading_".concat(loadings.length - 1);
120
+ }
121
+ if (route.error) {
122
+ errors.push(route.error);
123
+ error = "error_".concat(errors.length - 1);
124
+ }
125
+ if (route.loader) {
126
+ loaders.push(route.loader);
127
+ var loaderId = loaders.length - 1;
128
+ loader = "loader_".concat(loaderId);
129
+ loadersMap[loader] = route.id;
130
+ }
131
+ if (route._component) {
132
+ if (route.isRoot) {
133
+ rootLayoutCode = "import RootLayout from '".concat(route._component, "'");
134
+ component = "RootLayout";
135
+ } else if (ssrMode === 'string') {
136
+ component = "loadable(() => import(/* webpackChunkName: \"".concat(route.id, "\" */ '").concat(componentLoaderPath).concat(route._component, "'))");
137
+ } else {
138
+ // csr and streaming
139
+ component = "lazy(() => import(/* webpackChunkName: \"".concat(route.id, "\" */ '").concat(componentLoaderPath).concat(route._component, "'))");
140
+ }
141
+ }
142
+ } else if (route._component) {
143
+ component = "loadable(() => import('".concat(route._component, "'))");
144
+ }
145
+ var finalRoute = _objectSpread(_objectSpread({}, route), {}, {
146
+ loading: loading,
147
+ loader: loader,
148
+ error: error,
149
+ children: children
150
+ });
151
+ if (route._component) {
152
+ finalRoute.component = component;
153
+ }
154
+ return finalRoute;
155
+ };
156
+ routeComponentsCode = "\n export const routes = [\n ";
157
+ _iterator2 = _createForOfIteratorHelper(routes);
158
+ try {
159
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
160
+ route = _step2.value;
161
+ if ('type' in route) {
162
+ newRoute = traverseRouteTree(route);
163
+ routeComponentsCode += "".concat(JSON.stringify(newRoute, null, 2).replace(/"(loadable.*\))"/g, '$1').replace(/"(loadableLazy.*\))"/g, '$1').replace(/"(lazy.*\))"/g, '$1').replace(/"(loading_[^"])"/g, '$1').replace(/"(loader_[^"])"/g, '$1').replace(/"(RootLayout)"/g, '$1').replace(/"(error_[^"])"/g, '$1').replace(/\\"/g, '"'), ",");
164
+ } else {
165
+ component = "loadable(() => import('".concat(route._component, "'))");
166
+ finalRoute = _objectSpread(_objectSpread({}, route), {}, {
167
+ component: component
168
+ });
169
+ routeComponentsCode += "".concat(JSON.stringify(finalRoute, null, 2).replace(/"(loadable[^"]*)"/g, '$1').replace(/"(lazy[^"]*)"/g, '$1'), ",");
170
+ }
171
+ }
172
+ } catch (err) {
173
+ _iterator2.e(err);
174
+ } finally {
175
+ _iterator2.f();
176
+ }
177
+ routeComponentsCode += "\n];";
178
+ importLoadingCode = loadings.map(function (loading, index) {
179
+ return "import loading_".concat(index, " from '").concat(loading, "';\n");
180
+ }).join('');
181
+ importErrorComponentsCode = errors.map(function (error, index) {
182
+ return "import error_".concat(index, " from '").concat(error, "';\n");
183
+ }).join('');
184
+ importLoadersCode = '';
185
+ if (!(loaders.length > 0)) {
186
+ _context2.next = 32;
187
+ break;
188
+ }
189
+ importLoadersCode = "\n import { ".concat(loaders.map(function (loader, index) {
190
+ return "loader_".concat(index);
191
+ }), " } from \"").concat(dataLoaderPath).concat(loadersIndexFile, "\"\n ");
192
+ loaderEntryCode = loaders.map(function (loader, index) {
193
+ return "export * from './loader_".concat(index, ".js';");
194
+ }).join('\n');
195
+ loaderEntryFile = path.join(internalDirectory, entryName, TEMP_LOADERS_DIR, 'entry.js');
196
+ _context2.next = 26;
197
+ return fs.ensureFile(loaderEntryFile);
198
+ case 26:
199
+ _context2.next = 28;
200
+ return fs.writeFile(loaderEntryFile, loaderEntryCode);
201
+ case 28:
202
+ _context2.next = 30;
203
+ return fs.writeJSON(loadersMapFile, loadersMap);
204
+ case 30:
205
+ _context2.next = 32;
206
+ return Promise.all(loaders.map( /*#__PURE__*/function () {
207
+ var _ref7 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(loader, index) {
208
+ var name, filename, code;
209
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
210
+ while (1) {
211
+ switch (_context.prev = _context.next) {
212
+ case 0:
213
+ name = "loader_".concat(index);
214
+ filename = path.join(internalDirectory, entryName, TEMP_LOADERS_DIR, "".concat(name, ".js"));
215
+ code = "\n export { loader as ".concat(name, " } from '").concat(loader, "'\n ");
216
+ _context.next = 5;
217
+ return fs.ensureFile(filename);
218
+ case 5:
219
+ _context.next = 7;
220
+ return fs.writeFile(filename, code);
221
+ case 7:
222
+ case "end":
223
+ return _context.stop();
224
+ }
225
+ }
226
+ }, _callee);
227
+ }));
228
+ return function (_x2, _x3) {
229
+ return _ref7.apply(this, arguments);
230
+ };
231
+ }()));
232
+ case 32:
233
+ return _context2.abrupt("return", "\n ".concat(importLazyCode, "\n ").concat(rootLayoutCode, "\n ").concat(importLoadingCode, "\n ").concat(importErrorComponentsCode, "\n ").concat(importLoadersCode, "\n ").concat(routeComponentsCode, "\n "));
234
+ case 33:
235
+ case "end":
236
+ return _context2.stop();
121
237
  }
122
238
  }
123
- } else if (route._component) {
124
- component = "loadable(() => import('".concat(route._component, "'))");
125
- }
126
- var finalRoute = _objectSpread(_objectSpread({}, route), {}, {
127
- loading: loading,
128
- loader: loader,
129
- error: error,
130
- children: children
131
- });
132
- if (route._component) {
133
- finalRoute.component = component;
134
- }
135
- return finalRoute;
239
+ }, _callee2);
240
+ }));
241
+ return function fileSystemRoutes(_x) {
242
+ return _ref6.apply(this, arguments);
136
243
  };
137
- var routeComponentsCode = "\n export const routes = [\n ";
138
- var _iterator2 = _createForOfIteratorHelper(routes),
139
- _step2;
140
- try {
141
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
142
- var route = _step2.value;
143
- if ('type' in route) {
144
- var newRoute = traverseRouteTree(route);
145
- routeComponentsCode += "".concat(JSON.stringify(newRoute, null, 2).replace(/"(loadable.*\))"/g, '$1').replace(/"(loadableLazy.*\))"/g, '$1').replace(/"(lazy.*\))"/g, '$1').replace(/"(loading_[^"])"/g, '$1').replace(/"(loader_[^"])"/g, '$1').replace(/"(error_[^"])"/g, '$1').replace(/\\"/g, '"'), ",");
146
- } else {
147
- var component = "loadable(() => import('".concat(route._component, "'))");
148
- var finalRoute = _objectSpread(_objectSpread({}, route), {}, {
149
- component: component
150
- });
151
- routeComponentsCode += "".concat(JSON.stringify(finalRoute, null, 2).replace(/"(loadable[^"]*)"/g, '$1').replace(/"(lazy[^"]*)"/g, '$1'), ",");
152
- }
153
- }
154
- } catch (err) {
155
- _iterator2.e(err);
156
- } finally {
157
- _iterator2.f();
158
- }
159
- routeComponentsCode += "\n];";
160
- var importLoadingCode = loadings.map(function (loading, index) {
161
- return "import loading_".concat(index, " from '").concat(loading, "';\n");
162
- }).join('');
163
- var importErrorComponentsCode = errors.map(function (error, index) {
164
- return "import error_".concat(index, " from '").concat(error, "';\n");
165
- }).join('');
166
- var importLoaderComponentsCode = loaders.map(function (loader, index) {
167
- return "import loader_".concat(index, " from '").concat(dataLoaderPath).concat(loader, "';\n");
168
- }).join('');
169
- return "\n ".concat(importLazyCode, "\n ").concat(importLoadingCode, "\n ").concat(importErrorComponentsCode, "\n ").concat(importLoaderComponentsCode, "\n ").concat(routeComponentsCode, "\n ");
170
- };
244
+ }();
@@ -1,8 +1,13 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
3
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
1
4
  import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
5
  import fs from 'fs';
3
6
  import path from 'path';
4
- import { isReact18, normalizeToPosixPath } from '@modern-js/utils';
5
- import { FILE_SYSTEM_ROUTES_FILE_NAME } from "./constants";
7
+ import { isReact18, normalizeToPosixPath, fs as fse } from '@modern-js/utils';
8
+ import { transform } from 'esbuild';
9
+ import { parse } from 'es-module-lexer';
10
+ import { FILE_SYSTEM_ROUTES_FILE_NAME, LOADER_EXPORT_NAME } from "./constants";
6
11
  export var walkDirectory = function walkDirectory(dir) {
7
12
  return fs.readdirSync(dir).reduce(function (previous, filename) {
8
13
  var filePath = path.join(dir, filename);
@@ -51,7 +56,7 @@ export var getDefaultImports = function getDefaultImports(_ref) {
51
56
  specifiers: [{
52
57
  imported: 'routes'
53
58
  }],
54
- value: normalizeToPosixPath("".concat(internalDirAlias, "/").concat(entryName, "/").concat(FILE_SYSTEM_ROUTES_FILE_NAME))
59
+ value: normalizeToPosixPath("".concat(internalDirAlias, "/").concat(entryName, "/").concat(FILE_SYSTEM_ROUTES_FILE_NAME.replace('.js', '')))
55
60
  };
56
61
  if (fileSystemRoutes.globalApp) {
57
62
  imports.push({
@@ -85,4 +90,75 @@ export var isRouteComponentFile = function isRouteComponentFile(filePath) {
85
90
  };
86
91
  export var replaceWithAlias = function replaceWithAlias(base, filePath, alias) {
87
92
  return normalizeToPosixPath(path.join(alias, path.relative(base, filePath)));
88
- };
93
+ };
94
+ export var parseModule = /*#__PURE__*/function () {
95
+ var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref2) {
96
+ var source, filename, content, result;
97
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
98
+ while (1) {
99
+ switch (_context.prev = _context.next) {
100
+ case 0:
101
+ source = _ref2.source, filename = _ref2.filename;
102
+ content = source;
103
+ if (!(filename.endsWith('.tsx') || filename.endsWith('.jsx'))) {
104
+ _context.next = 7;
105
+ break;
106
+ }
107
+ _context.next = 5;
108
+ return transform(content, {
109
+ loader: path.extname(filename).slice(1),
110
+ format: 'esm'
111
+ });
112
+ case 5:
113
+ result = _context.sent;
114
+ content = result.code;
115
+ case 7:
116
+ _context.next = 9;
117
+ return parse(content);
118
+ case 9:
119
+ return _context.abrupt("return", _context.sent);
120
+ case 10:
121
+ case "end":
122
+ return _context.stop();
123
+ }
124
+ }
125
+ }, _callee);
126
+ }));
127
+ return function parseModule(_x) {
128
+ return _ref3.apply(this, arguments);
129
+ };
130
+ }();
131
+ export var hasLoader = /*#__PURE__*/function () {
132
+ var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(filename) {
133
+ var source, _yield$parseModule, _yield$parseModule2, moduleExports;
134
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
135
+ while (1) {
136
+ switch (_context2.prev = _context2.next) {
137
+ case 0:
138
+ _context2.next = 2;
139
+ return fse.readFile(filename);
140
+ case 2:
141
+ source = _context2.sent;
142
+ _context2.next = 5;
143
+ return parseModule({
144
+ source: source.toString(),
145
+ filename: filename
146
+ });
147
+ case 5:
148
+ _yield$parseModule = _context2.sent;
149
+ _yield$parseModule2 = _slicedToArray(_yield$parseModule, 2);
150
+ moduleExports = _yield$parseModule2[1];
151
+ return _context2.abrupt("return", moduleExports.some(function (e) {
152
+ return e.n === LOADER_EXPORT_NAME;
153
+ }));
154
+ case 9:
155
+ case "end":
156
+ return _context2.stop();
157
+ }
158
+ }
159
+ }, _callee2);
160
+ }));
161
+ return function hasLoader(_x2) {
162
+ return _ref4.apply(this, arguments);
163
+ };
164
+ }();