@modern-js/app-tools 1.7.0 → 1.8.2

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 (40) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/dist/js/modern/analyze/constants.js +14 -0
  3. package/dist/js/modern/analyze/generateCode.js +166 -0
  4. package/dist/js/modern/analyze/getBundleEntry.js +72 -0
  5. package/dist/js/modern/analyze/getClientRoutes.js +219 -0
  6. package/dist/js/modern/analyze/getFileSystemEntry.js +74 -0
  7. package/dist/js/modern/analyze/getHtmlTemplate.js +82 -0
  8. package/dist/js/modern/analyze/getServerRoutes.js +192 -0
  9. package/dist/js/modern/analyze/index.js +144 -0
  10. package/dist/js/modern/analyze/isDefaultExportFunction.js +32 -0
  11. package/dist/js/modern/analyze/makeLegalIdentifier.js +16 -0
  12. package/dist/js/modern/analyze/templates.js +85 -0
  13. package/dist/js/modern/analyze/utils.js +86 -0
  14. package/dist/js/modern/index.js +2 -2
  15. package/dist/js/node/analyze/constants.js +34 -0
  16. package/dist/js/node/analyze/generateCode.js +192 -0
  17. package/dist/js/node/analyze/getBundleEntry.js +86 -0
  18. package/dist/js/node/analyze/getClientRoutes.js +241 -0
  19. package/dist/js/node/analyze/getFileSystemEntry.js +90 -0
  20. package/dist/js/node/analyze/getHtmlTemplate.js +106 -0
  21. package/dist/js/node/analyze/getServerRoutes.js +208 -0
  22. package/dist/js/node/analyze/index.js +173 -0
  23. package/dist/js/node/analyze/isDefaultExportFunction.js +50 -0
  24. package/dist/js/node/analyze/makeLegalIdentifier.js +24 -0
  25. package/dist/js/node/analyze/templates.js +103 -0
  26. package/dist/js/node/analyze/utils.js +107 -0
  27. package/dist/js/node/index.js +4 -4
  28. package/dist/types/analyze/constants.d.ts +14 -0
  29. package/dist/types/analyze/generateCode.d.ts +4 -0
  30. package/dist/types/analyze/getBundleEntry.d.ts +3 -0
  31. package/dist/types/analyze/getClientRoutes.d.ts +19 -0
  32. package/dist/types/analyze/getFileSystemEntry.d.ts +4 -0
  33. package/dist/types/analyze/getHtmlTemplate.d.ts +9 -0
  34. package/dist/types/analyze/getServerRoutes.d.ts +9 -0
  35. package/dist/types/analyze/index.d.ts +39 -0
  36. package/dist/types/analyze/isDefaultExportFunction.d.ts +1 -0
  37. package/dist/types/analyze/makeLegalIdentifier.d.ts +1 -0
  38. package/dist/types/analyze/templates.d.ts +32 -0
  39. package/dist/types/analyze/utils.d.ts +15 -0
  40. package/package.json +12 -9
@@ -0,0 +1,192 @@
1
+ const _excluded = ["path"],
2
+ _excluded2 = ["path"];
3
+
4
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
5
+
6
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
7
+
8
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
9
+
10
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
11
+
12
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
13
+
14
+ import path from 'path';
15
+ import fs from 'fs';
16
+ import { urlJoin, isPlainObject, removeLeadingSlash, getEntryOptions, SERVER_BUNDLE_DIRECTORY, MAIN_ENTRY_NAME, removeTailSlash } from '@modern-js/utils';
17
+ import { walkDirectory } from "./utils";
18
+ /**
19
+ * Add base url for each server route.
20
+ * @param baseUrl - Base url from server.baseUrl
21
+ * @param routes - Server routes.
22
+ * @returns Server routes with baseUrl prefixed.
23
+ */
24
+
25
+ const applyBaseUrl = (baseUrl, routes) => {
26
+ if (baseUrl) {
27
+ if (Array.isArray(baseUrl)) {
28
+ return baseUrl.reduce((previous, current) => [...previous, ...applyBaseUrl(current, routes)], []);
29
+ } else {
30
+ return routes.map(route => {
31
+ const urlPath = urlJoin(baseUrl, route.urlPath);
32
+ return _objectSpread(_objectSpread({}, route), {}, {
33
+ urlPath: urlPath === '/' ? urlPath : removeTailSlash(urlPath)
34
+ });
35
+ });
36
+ }
37
+ }
38
+
39
+ return routes;
40
+ };
41
+ /**
42
+ *
43
+ * @param original - Original entrypoint route info.
44
+ * @param routeOptions - Custom entrypoint route config from server.routes.
45
+ * @returns
46
+ */
47
+
48
+
49
+ const applyRouteOptions = (original, routeOptions) => {
50
+ const {
51
+ route,
52
+ disableSpa
53
+ } = routeOptions;
54
+ original.isSPA = !disableSpa; // set entryPath as dir
55
+
56
+ !original.isSPA && (original.entryPath = path.dirname(original.entryPath));
57
+ let routes;
58
+
59
+ if (route) {
60
+ if (Array.isArray(route)) {
61
+ routes = route.map(url => {
62
+ if (isPlainObject(url)) {
63
+ const _ref = url,
64
+ {
65
+ path: urlPath
66
+ } = _ref,
67
+ other = _objectWithoutProperties(_ref, _excluded);
68
+
69
+ return _objectSpread(_objectSpread(_objectSpread({}, original), other), {}, {
70
+ urlPath
71
+ });
72
+ } else {
73
+ return _objectSpread(_objectSpread({}, original), {}, {
74
+ urlPath: url
75
+ });
76
+ }
77
+ });
78
+ } else if (isPlainObject(route)) {
79
+ const _ref2 = route,
80
+ {
81
+ path: urlPath
82
+ } = _ref2,
83
+ other = _objectWithoutProperties(_ref2, _excluded2);
84
+
85
+ routes = [_objectSpread(_objectSpread(_objectSpread({}, original), other), {}, {
86
+ urlPath
87
+ })];
88
+ } else {
89
+ routes = [_objectSpread(_objectSpread({}, original), {}, {
90
+ urlPath: route
91
+ })];
92
+ }
93
+ } else {
94
+ routes = [original];
95
+ }
96
+
97
+ return routes;
98
+ };
99
+ /**
100
+ * Collect routes from entrypoints.
101
+ * @param entrypoints - Bundle entrypoints.
102
+ * @param config - Normalized user config.
103
+ * @returns entrypoint Routes
104
+ */
105
+
106
+
107
+ const collectHtmlRoutes = (entrypoints, appContext, config) => {
108
+ const {
109
+ output: {
110
+ htmlPath,
111
+ disableHtmlFolder,
112
+ enableModernMode
113
+ },
114
+ server: {
115
+ baseUrl,
116
+ routes,
117
+ ssr,
118
+ ssrByEntries
119
+ }
120
+ } = config;
121
+ const {
122
+ packageName
123
+ } = appContext;
124
+ let htmlRoutes = entrypoints.reduce((previous, {
125
+ entryName
126
+ }) => {
127
+ const entryOptions = getEntryOptions(entryName, ssr, ssrByEntries, packageName);
128
+ const isSSR = Boolean(entryOptions);
129
+ const {
130
+ resHeaders
131
+ } = (routes === null || routes === void 0 ? void 0 : routes[entryName]) || {};
132
+ let route = {
133
+ urlPath: `/${entryName === MAIN_ENTRY_NAME ? '' : entryName}`,
134
+ entryName,
135
+ entryPath: removeLeadingSlash(path.posix.normalize(`${htmlPath}/${entryName}${disableHtmlFolder ? '.html' : '/index.html'}`)),
136
+ isSPA: true,
137
+ isSSR,
138
+ responseHeaders: resHeaders,
139
+ enableModernMode: Boolean(enableModernMode),
140
+ bundle: isSSR ? `${SERVER_BUNDLE_DIRECTORY}/${entryName}.js` : undefined
141
+ };
142
+
143
+ if (routes !== null && routes !== void 0 && routes.hasOwnProperty(entryName)) {
144
+ const routeOptions = isPlainObject(routes[entryName]) ? routes[entryName] : {
145
+ route: routes[entryName]
146
+ };
147
+ route = applyRouteOptions(route, routeOptions);
148
+ }
149
+
150
+ return Array.isArray(route) ? [...previous, ...route] : [...previous, route];
151
+ }, []);
152
+ htmlRoutes = applyBaseUrl(baseUrl, htmlRoutes);
153
+ return htmlRoutes;
154
+ };
155
+ /**
156
+ * Collect static public file routes from config/public folder.
157
+ * @param appContext - App context info.
158
+ * @param config - normalized user config.
159
+ * @returns Static public file routes.
160
+ */
161
+
162
+
163
+ const collectStaticRoutes = (appContext, config) => {
164
+ const {
165
+ appDirectory
166
+ } = appContext;
167
+ const {
168
+ source: {
169
+ configDir
170
+ },
171
+ server: {
172
+ publicRoutes = {}
173
+ }
174
+ } = config;
175
+ const publicFolder = path.resolve(appDirectory, configDir, 'public');
176
+ return fs.existsSync(publicFolder) ? walkDirectory(publicFolder).map(filePath => {
177
+ const urlPath = `${urlJoin(toPosix(filePath).slice(toPosix(publicFolder).length))}`;
178
+ return {
179
+ urlPath: publicRoutes[removeLeadingSlash(urlPath)] || urlPath,
180
+ isSPA: true,
181
+ isSSR: false,
182
+ entryPath: toPosix(path.relative(path.resolve(appDirectory, configDir), filePath))
183
+ };
184
+ }) : [];
185
+ };
186
+
187
+ export const getServerRoutes = (entrypoints, {
188
+ appContext,
189
+ config
190
+ }) => [...collectHtmlRoutes(entrypoints, appContext, config), ...collectStaticRoutes(appContext, config)];
191
+
192
+ const toPosix = pathStr => pathStr.split(path.sep).join(path.posix.sep);
@@ -0,0 +1,144 @@
1
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
+
3
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
+
5
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
+
7
+ import * as path from 'path';
8
+ import { createAsyncWaterfall } from '@modern-js/plugin';
9
+ import { createDebugger, fs, isApiOnly } from '@modern-js/utils';
10
+ import { cloneDeep } from '@modern-js/utils/lodash';
11
+ import { isRouteComponentFile } from "./utils";
12
+ const debug = createDebugger('plugin-analyze');
13
+ export const modifyEntryImports = createAsyncWaterfall();
14
+ export const modifyEntryExport = createAsyncWaterfall();
15
+ export const addRuntimeExports = createAsyncWaterfall();
16
+ export const modifyEntryRuntimePlugins = createAsyncWaterfall();
17
+ export const modifyEntryRenderFunction = createAsyncWaterfall();
18
+ export const modifyFileSystemRoutes = createAsyncWaterfall();
19
+ export const modifyServerRoutes = createAsyncWaterfall();
20
+ export const htmlPartials = createAsyncWaterfall();
21
+ export const beforeGenerateRoutes = createAsyncWaterfall();
22
+ export const addDefineTypes = createAsyncWaterfall();
23
+ export default (() => ({
24
+ name: '@modern-js/plugin-analyze',
25
+ registerHook: {
26
+ modifyEntryImports,
27
+ modifyEntryExport,
28
+ modifyEntryRuntimePlugins,
29
+ modifyEntryRenderFunction,
30
+ modifyFileSystemRoutes,
31
+ modifyServerRoutes,
32
+ htmlPartials,
33
+ addRuntimeExports,
34
+ beforeGenerateRoutes,
35
+ addDefineTypes
36
+ },
37
+ setup: api => {
38
+ let pagesDir = [];
39
+ let originEntrypoints = [];
40
+ return {
41
+ async prepare() {
42
+ const appContext = api.useAppContext();
43
+ const resolvedConfig = api.useResolvedConfigContext();
44
+ const hookRunners = api.useHookRunners();
45
+
46
+ try {
47
+ fs.emptydirSync(appContext.internalDirectory);
48
+ } catch (_unused) {// FIXME:
49
+ }
50
+
51
+ const apiOnly = await isApiOnly(appContext.appDirectory);
52
+ await hookRunners.addRuntimeExports();
53
+
54
+ if (apiOnly) {
55
+ const {
56
+ routes
57
+ } = await hookRunners.modifyServerRoutes({
58
+ routes: []
59
+ });
60
+ debug(`server routes: %o`, routes);
61
+ api.setAppContext(_objectSpread(_objectSpread({}, appContext), {}, {
62
+ apiOnly,
63
+ serverRoutes: routes
64
+ }));
65
+ return;
66
+ }
67
+
68
+ const [{
69
+ getBundleEntry
70
+ }, {
71
+ getServerRoutes
72
+ }, {
73
+ generateCode
74
+ }, {
75
+ getHtmlTemplate
76
+ }] = await Promise.all([import("./getBundleEntry"), import("./getServerRoutes"), import("./generateCode"), import("./getHtmlTemplate")]);
77
+ const entrypoints = getBundleEntry(appContext, resolvedConfig);
78
+ const defaultChecked = entrypoints.map(point => point.entryName);
79
+ debug(`entrypoints: %o`, entrypoints);
80
+ const initialRoutes = getServerRoutes(entrypoints, {
81
+ appContext,
82
+ config: resolvedConfig
83
+ });
84
+ const {
85
+ routes
86
+ } = await hookRunners.modifyServerRoutes({
87
+ routes: initialRoutes
88
+ });
89
+ debug(`server routes: %o`, routes);
90
+ api.setAppContext(_objectSpread(_objectSpread({}, appContext), {}, {
91
+ entrypoints,
92
+ serverRoutes: routes
93
+ }));
94
+ pagesDir = entrypoints.map(point => point.entry);
95
+ originEntrypoints = cloneDeep(entrypoints);
96
+ await generateCode(appContext, resolvedConfig, entrypoints, api);
97
+ const htmlTemplates = await getHtmlTemplate(entrypoints, api, {
98
+ appContext,
99
+ config: resolvedConfig
100
+ });
101
+ debug(`html templates: %o`, htmlTemplates);
102
+ await hookRunners.addDefineTypes();
103
+ debug(`add Define Types`);
104
+ api.setAppContext(_objectSpread(_objectSpread({}, appContext), {}, {
105
+ entrypoints,
106
+ checkedEntries: defaultChecked,
107
+ apiOnly,
108
+ serverRoutes: routes,
109
+ htmlTemplates
110
+ }));
111
+ },
112
+
113
+ watchFiles() {
114
+ return pagesDir;
115
+ },
116
+
117
+ async fileChange(e) {
118
+ const appContext = api.useAppContext();
119
+ const {
120
+ appDirectory
121
+ } = appContext;
122
+ const {
123
+ filename,
124
+ eventType
125
+ } = e;
126
+
127
+ const isPageFile = name => pagesDir.some(pageDir => name.includes(pageDir));
128
+
129
+ const absoluteFilePath = path.resolve(appDirectory, filename);
130
+ const isRouteComponent = isPageFile(absoluteFilePath) && isRouteComponentFile(absoluteFilePath);
131
+
132
+ if (isRouteComponent && (eventType === 'add' || eventType === 'unlink')) {
133
+ const resolvedConfig = api.useResolvedConfigContext();
134
+ const {
135
+ generateCode
136
+ } = await import("./generateCode");
137
+ const entrypoints = cloneDeep(originEntrypoints);
138
+ generateCode(appContext, resolvedConfig, entrypoints, api);
139
+ }
140
+ }
141
+
142
+ };
143
+ }
144
+ }));
@@ -0,0 +1,32 @@
1
+ import fs from 'fs';
2
+ import { parse } from '@babel/parser';
3
+ import traverse from '@babel/traverse';
4
+ import * as t from '@babel/types';
5
+
6
+ const isFunction = node => t.isFunctionDeclaration(node) || t.isFunctionExpression(node) || t.isArrowFunctionExpression(node);
7
+
8
+ export const isDefaultExportFunction = file => {
9
+ if (!file || !fs.existsSync(file)) {
10
+ return false;
11
+ }
12
+
13
+ const ast = parse(fs.readFileSync(file, 'utf8'), {
14
+ sourceType: 'unambiguous',
15
+ plugins: ['jsx', 'typescript', 'classProperties', 'dynamicImport', 'exportDefaultFrom', 'exportNamespaceFrom', 'decorators-legacy', 'functionBind', 'classPrivateMethods', ['pipelineOperator', {
16
+ proposal: 'minimal'
17
+ }], 'optionalChaining', 'optionalCatchBinding', 'objectRestSpread', 'numericSeparator']
18
+ });
19
+ let isExportFunction = false;
20
+ traverse(ast, {
21
+ ExportDefaultDeclaration: path => {
22
+ const {
23
+ declaration
24
+ } = path.node;
25
+
26
+ if (isFunction(declaration)) {
27
+ isExportFunction = true;
28
+ }
29
+ }
30
+ });
31
+ return isExportFunction;
32
+ };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * modified from https://github.com/rollup/plugins/blob/master/packages/pluginutils
3
+ * license at https://github.com/rollup/plugins/blob/master/LICENSE
4
+ */
5
+ const reservedWords = 'break case class catch const continue debugger default delete do else export extends finally for function if import in instanceof let new return super switch this throw try typeof var void while with yield enum await implements package protected static interface private public';
6
+ const builtins = 'arguments Infinity NaN undefined null true false eval uneval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Symbol Error EvalError InternalError RangeError ReferenceError SyntaxError TypeError URIError Number Math Date String RegExp Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array Map Set WeakMap WeakSet SIMD ArrayBuffer DataView JSON Promise Generator GeneratorFunction Reflect Proxy Intl';
7
+ const forbidList = new Set(`${reservedWords} ${builtins}`.split(' '));
8
+ export function makeLegalIdentifier(str) {
9
+ const identifier = str.replace(/-(\w)/g, (_, letter) => letter.toUpperCase()).replace(/[^$_a-zA-Z0-9]/g, '_');
10
+
11
+ if (/\d/.test(identifier[0]) || forbidList.has(identifier)) {
12
+ return `_${identifier}`;
13
+ }
14
+
15
+ return identifier || '_';
16
+ }
@@ -0,0 +1,85 @@
1
+ export const index = ({
2
+ mountId,
3
+ imports,
4
+ renderFunction,
5
+ exportStatement
6
+ }) => `
7
+ const IS_BROWSER = typeof window !== 'undefined' && window.name !== 'nodejs';
8
+ const MOUNT_ID = '${mountId}';
9
+
10
+ ${imports}
11
+
12
+ let AppWrapper = null;
13
+
14
+ function render() {
15
+ ${renderFunction}
16
+ }
17
+
18
+ AppWrapper = render();
19
+
20
+ ${exportStatement};
21
+ `;
22
+ export const renderFunction = ({
23
+ plugins,
24
+ customBootstrap,
25
+ fileSystemRoutes
26
+ }) => `
27
+ AppWrapper = createApp({
28
+ plugins: [
29
+ ${plugins.map(({
30
+ name,
31
+ options,
32
+ args
33
+ }) => `${name}({...${options}, ...App?.config?.${args || name}}),`).join('\n')}
34
+ ]
35
+ })(${fileSystemRoutes ? '' : `App`})
36
+
37
+ if (IS_BROWSER) {
38
+ ${customBootstrap ? `customBootstrap(AppWrapper);` : `bootstrap(AppWrapper, MOUNT_ID);`}
39
+ }
40
+
41
+ return AppWrapper
42
+ `;
43
+ export const html = partials => `
44
+ <!DOCTYPE html>
45
+ <html>
46
+ <head>
47
+ <%= meta %>
48
+ <title><%= title %></title>
49
+
50
+ ${partials.top.join('\n')}
51
+
52
+ <script>
53
+ window.__assetPrefix__ = '<%= assetPrefix %>';
54
+ </script>
55
+ ${partials.head.join('\n')}
56
+
57
+ <!--<?- chunksMap.css ?>-->
58
+ </head>
59
+
60
+ <body>
61
+ <noscript>
62
+ We're sorry but react app doesn't work properly without JavaScript enabled. Please enable it to continue.
63
+ </noscript>
64
+ <div id="<%= mountId %>"><!--<?- html ?>--></div>
65
+ ${partials.body.join('\n')}
66
+ <!--<?- chunksMap.js ?>-->
67
+ <!--<?- SSRDataScript ?>-->
68
+ <!--<?- bottomTemplate ?>-->
69
+ </body>
70
+
71
+ </html>
72
+ `;
73
+ export const fileSystemRoutes = ({
74
+ routes
75
+ }) => `
76
+ import loadable from '@modern-js/runtime/loadable';
77
+
78
+ ${routes.map(({
79
+ component,
80
+ _component
81
+ }) => `const ${component} = loadable(() => import('${_component}'));`).join('\n\n')}
82
+
83
+
84
+ export const routes = ${JSON.stringify(routes, null, 2).replace(/"component"\s*:\s*"(\S+)"/g, '"component": $1')}
85
+ `;
@@ -0,0 +1,86 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { normalizeToPosixPath } from '@modern-js/utils';
4
+ import { FILE_SYSTEM_ROUTES_FILE_NAME } from "./constants";
5
+ export const walkDirectory = dir => fs.readdirSync(dir).reduce((previous, filename) => {
6
+ const filePath = path.join(dir, filename);
7
+
8
+ if (fs.statSync(filePath).isDirectory()) {
9
+ return [...previous, ...walkDirectory(filePath)];
10
+ } else {
11
+ return [...previous, filePath];
12
+ }
13
+ }, []);
14
+ export const getDefaultImports = ({
15
+ entrypoint,
16
+ srcDirectory,
17
+ internalSrcAlias,
18
+ internalDirAlias
19
+ }) => {
20
+ const {
21
+ entryName,
22
+ fileSystemRoutes,
23
+ customBootstrap,
24
+ entry
25
+ } = entrypoint;
26
+ const imports = [{
27
+ specifiers: [{
28
+ local: 'React'
29
+ }],
30
+ value: 'react'
31
+ }, {
32
+ specifiers: [{
33
+ imported: 'createApp'
34
+ }, {
35
+ imported: 'bootstrap'
36
+ }],
37
+ value: '@modern-js/runtime'
38
+ }, customBootstrap && {
39
+ specifiers: [{
40
+ local: 'customBootstrap'
41
+ }],
42
+ value: normalizeToPosixPath(customBootstrap.replace(srcDirectory, internalSrcAlias))
43
+ }].filter(Boolean);
44
+
45
+ if (fileSystemRoutes) {
46
+ const route = {
47
+ specifiers: [{
48
+ imported: 'routes'
49
+ }],
50
+ value: normalizeToPosixPath(`${internalDirAlias}/${entryName}/${FILE_SYSTEM_ROUTES_FILE_NAME}`)
51
+ };
52
+
53
+ if (fileSystemRoutes.globalApp) {
54
+ imports.push({
55
+ specifiers: [{
56
+ local: 'App'
57
+ }],
58
+ value: normalizeToPosixPath(fileSystemRoutes.globalApp.replace(srcDirectory, internalSrcAlias))
59
+ });
60
+ } else {
61
+ route.initialize = 'const App = false;';
62
+ }
63
+
64
+ imports.push(route);
65
+ } else {
66
+ imports.push({
67
+ specifiers: [{
68
+ local: 'App'
69
+ }],
70
+ value: normalizeToPosixPath(entry.replace(srcDirectory, internalSrcAlias))
71
+ });
72
+ }
73
+
74
+ return imports;
75
+ };
76
+ export const isRouteComponentFile = filePath => {
77
+ if (/\.(d|test|spec|e2e)\.(js|jsx|ts|tsx)$/.test(filePath)) {
78
+ return false;
79
+ }
80
+
81
+ if (['.js', '.jsx', '.ts', '.tsx'].includes(path.extname(filePath))) {
82
+ return true;
83
+ }
84
+
85
+ return false;
86
+ };
@@ -6,9 +6,9 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
6
6
 
7
7
  import path from 'path';
8
8
  import { defineConfig, cli } from '@modern-js/core';
9
- import AnalyzePlugin from '@modern-js/plugin-analyze';
10
9
  import LintPlugin from '@modern-js/plugin-jarvis';
11
10
  import { cleanRequireCache } from '@modern-js/utils';
11
+ import AnalyzePlugin from "./analyze";
12
12
  import { hooks } from "./hooks";
13
13
  import { i18n, localeKeys } from "./locale";
14
14
  import { getLocaleLanguage } from "./utils/language";
@@ -99,7 +99,7 @@ export default (() => ({
99
99
  },
100
100
 
101
101
  async beforeRestart() {
102
- cleanRequireCache([require.resolve('@modern-js/plugin-analyze/cli')]);
102
+ cleanRequireCache([require.resolve("./analyze")]);
103
103
  }
104
104
 
105
105
  };
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.PAGES_DIR_NAME = exports.JS_EXTENSIONS = exports.INDEX_FILE_NAME = exports.HTML_PARTIALS_FOLDER = exports.HTML_PARTIALS_EXTENSIONS = exports.FILE_SYSTEM_ROUTES_LAYOUT = exports.FILE_SYSTEM_ROUTES_INDEX = exports.FILE_SYSTEM_ROUTES_IGNORED_REGEX = exports.FILE_SYSTEM_ROUTES_GLOBAL_LAYOUT = exports.FILE_SYSTEM_ROUTES_FILE_NAME = exports.FILE_SYSTEM_ROUTES_DYNAMIC_REGEXP = exports.FILE_SYSTEM_ROUTES_COMPONENTS_DIR = exports.ENTRY_POINT_FILE_NAME = exports.APP_FILE_NAME = void 0;
7
+ const JS_EXTENSIONS = ['.js', '.ts', '.jsx', '.tsx'];
8
+ exports.JS_EXTENSIONS = JS_EXTENSIONS;
9
+ const INDEX_FILE_NAME = 'index';
10
+ exports.INDEX_FILE_NAME = INDEX_FILE_NAME;
11
+ const APP_FILE_NAME = 'App';
12
+ exports.APP_FILE_NAME = APP_FILE_NAME;
13
+ const PAGES_DIR_NAME = 'pages';
14
+ exports.PAGES_DIR_NAME = PAGES_DIR_NAME;
15
+ const FILE_SYSTEM_ROUTES_FILE_NAME = 'routes.js';
16
+ exports.FILE_SYSTEM_ROUTES_FILE_NAME = FILE_SYSTEM_ROUTES_FILE_NAME;
17
+ const ENTRY_POINT_FILE_NAME = 'index.js';
18
+ exports.ENTRY_POINT_FILE_NAME = ENTRY_POINT_FILE_NAME;
19
+ const FILE_SYSTEM_ROUTES_DYNAMIC_REGEXP = /^\[(\S+)\]([*+?]?)$/;
20
+ exports.FILE_SYSTEM_ROUTES_DYNAMIC_REGEXP = FILE_SYSTEM_ROUTES_DYNAMIC_REGEXP;
21
+ const FILE_SYSTEM_ROUTES_LAYOUT = '_layout';
22
+ exports.FILE_SYSTEM_ROUTES_LAYOUT = FILE_SYSTEM_ROUTES_LAYOUT;
23
+ const FILE_SYSTEM_ROUTES_GLOBAL_LAYOUT = '_app';
24
+ exports.FILE_SYSTEM_ROUTES_GLOBAL_LAYOUT = FILE_SYSTEM_ROUTES_GLOBAL_LAYOUT;
25
+ const FILE_SYSTEM_ROUTES_INDEX = 'index';
26
+ exports.FILE_SYSTEM_ROUTES_INDEX = FILE_SYSTEM_ROUTES_INDEX;
27
+ const FILE_SYSTEM_ROUTES_IGNORED_REGEX = /\.(d|test|spec|e2e)\.(js|jsx|ts|tsx)$/;
28
+ exports.FILE_SYSTEM_ROUTES_IGNORED_REGEX = FILE_SYSTEM_ROUTES_IGNORED_REGEX;
29
+ const HTML_PARTIALS_FOLDER = 'html';
30
+ exports.HTML_PARTIALS_FOLDER = HTML_PARTIALS_FOLDER;
31
+ const HTML_PARTIALS_EXTENSIONS = ['.htm', '.html', '.ejs'];
32
+ exports.HTML_PARTIALS_EXTENSIONS = HTML_PARTIALS_EXTENSIONS;
33
+ const FILE_SYSTEM_ROUTES_COMPONENTS_DIR = 'internal_components';
34
+ exports.FILE_SYSTEM_ROUTES_COMPONENTS_DIR = FILE_SYSTEM_ROUTES_COMPONENTS_DIR;