@umijs/preset-umi 4.0.21 → 4.0.22

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.
@@ -31,6 +31,7 @@ var import_getAssetsMap = require("./dev/getAssetsMap");
31
31
  var import_getBabelOpts = require("./dev/getBabelOpts");
32
32
  var import_getMarkupArgs = require("./dev/getMarkupArgs");
33
33
  var import_printMemoryUsage = require("./dev/printMemoryUsage");
34
+ var import_fileSizeReporter = require("../utils/fileSizeReporter");
34
35
  var bundlerWebpack = (0, import_lazyImportFromCurrentPkg.lazyImportFromCurrentPkg)("@umijs/bundler-webpack");
35
36
  var bundlerVite = (0, import_lazyImportFromCurrentPkg.lazyImportFromCurrentPkg)("@umijs/bundler-vite");
36
37
  var build_default = (api) => {
@@ -128,7 +129,16 @@ umi build --clean
128
129
  if (api.config.vite) {
129
130
  stats = await bundlerVite.build(opts);
130
131
  } else {
132
+ const absOutputPath = (0, import_path.resolve)(opts.cwd, opts.config.outputPath || bundlerWebpack.DEFAULT_OUTPUT_PATH);
133
+ const previousFileSizes = (0, import_fileSizeReporter.measureFileSizesBeforeBuild)(absOutputPath);
131
134
  stats = await bundlerWebpack.build(opts);
135
+ console.log();
136
+ import_utils.logger.info("File sizes after gzip:\n");
137
+ (0, import_fileSizeReporter.printFileSizesAfterBuild)({
138
+ webpackStats: stats,
139
+ previousSizeMap: previousFileSizes,
140
+ buildFolder: absOutputPath
141
+ });
132
142
  }
133
143
  if (!api.config.mpa) {
134
144
  const assetsMap = api.config.vite ? {} : (0, import_getAssetsMap.getAssetsMap)({
@@ -110,10 +110,10 @@ var DepBuilderInWorker = class {
110
110
  await this.buildWithWebpack(newOpts);
111
111
  }
112
112
  } catch (e) {
113
- onBuildComplete();
114
113
  import_worker_threads.parentPort.postMessage({
115
114
  error: e
116
115
  });
116
+ onBuildComplete();
117
117
  throw e;
118
118
  }
119
119
  }
@@ -0,0 +1,3 @@
1
+ import { IApi } from '../../types';
2
+ declare const _default: (api: IApi) => void;
3
+ export default _default;
@@ -0,0 +1,41 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/features/classPropertiesLoose/classPropertiesLoose.ts
20
+ var classPropertiesLoose_exports = {};
21
+ __export(classPropertiesLoose_exports, {
22
+ default: () => classPropertiesLoose_default
23
+ });
24
+ module.exports = __toCommonJS(classPropertiesLoose_exports);
25
+ var classPropertiesLoose_default = (api) => {
26
+ api.describe({
27
+ key: "classPropertiesLoose",
28
+ config: {
29
+ schema(joi) {
30
+ return joi.object();
31
+ }
32
+ },
33
+ enableBy: api.EnableBy.config
34
+ });
35
+ api.modifyBabelPresetOpts((memo) => {
36
+ memo.classPropertiesLoose = {};
37
+ return memo;
38
+ });
39
+ };
40
+ // Annotate the CommonJS export names for ESM import in node:
41
+ 0 && (module.exports = {});
@@ -60,8 +60,10 @@ var configPlugins_default = (api) => {
60
60
  "react-dom/client": reactDOMPath
61
61
  } : {},
62
62
  "react-dom": reactDOMPath,
63
- "react-router": (0, import_path.dirname)(require.resolve("react-router/package.json")),
64
- "react-router-dom": (0, import_path.dirname)(require.resolve("react-router-dom/package.json"))
63
+ ...userConfig.mpa ? {} : {
64
+ "react-router": (0, import_path.dirname)(require.resolve("react-router/package.json")),
65
+ "react-router-dom": (0, import_path.dirname)(require.resolve("react-router-dom/package.json"))
66
+ }
65
67
  },
66
68
  externals: {
67
69
  ...isLT18 && ((_a = userConfig.externals) == null ? void 0 : _a["react-dom"]) ? {
@@ -104,10 +104,16 @@ async function collectAllProjects(opts) {
104
104
  }
105
105
  var MONOREPO_FILE = ["pnpm-workspace.yaml", "lerna.json"];
106
106
  function isMonorepo(opts) {
107
- const pkgExist = (0, import_fs.existsSync)((0, import_path.join)(opts.root, "package.json"));
108
- return pkgExist && MONOREPO_FILE.some((file) => {
107
+ const pkgPath = (0, import_path.join)(opts.root, "package.json");
108
+ let pkg = {};
109
+ try {
110
+ pkg = require(pkgPath);
111
+ } catch (e) {
112
+ }
113
+ const pkgExist = (0, import_fs.existsSync)(pkgPath);
114
+ return pkgExist && (MONOREPO_FILE.some((file) => {
109
115
  return (0, import_fs.existsSync)((0, import_path.join)(opts.root, file));
110
- });
116
+ }) || (pkg == null ? void 0 : pkg.workspaces));
111
117
  }
112
118
  // Annotate the CommonJS export names for ESM import in node:
113
119
  0 && (module.exports = {});
@@ -38,7 +38,9 @@ var mpa_default = (api) => {
38
38
  schema(Joi) {
39
39
  return Joi.object({
40
40
  template: Joi.string(),
41
- getConfigFromEntryFile: Joi.boolean()
41
+ layout: Joi.string(),
42
+ getConfigFromEntryFile: Joi.boolean(),
43
+ entry: Joi.object()
42
44
  });
43
45
  }
44
46
  },
@@ -59,8 +61,9 @@ var mpa_default = (api) => {
59
61
  }
60
62
  const isReact18 = api.appData.react.version.startsWith("18.");
61
63
  api.appData.mpa.entry.forEach((entry) => {
62
- const layoutImport = entry.layout ? `import Layout from '${entry.layout}';` : "";
63
- const layoutJSX = entry.layout ? `<Layout><App /></Layout>` : `<App />`;
64
+ const layout = entry.layout || api.config.mpa.layout;
65
+ const layoutImport = layout ? `import Layout from '${layout}';` : "";
66
+ const layoutJSX = layout ? `<Layout><App /></Layout>` : `<App />`;
64
67
  const rootElement = `document.getElementById('${entry.mountElementId}')`;
65
68
  const renderer = isReact18 ? `ReactDOM.createRoot(${rootElement}).render(${layoutJSX});` : `ReactDOM.render(${layoutJSX}, ${rootElement});`;
66
69
  const reactDOMSource = isReact18 ? "react-dom/client" : "react-dom";
@@ -70,7 +73,7 @@ var mpa_default = (api) => {
70
73
  content: `
71
74
  import React from 'react';
72
75
  import ReactDOM from '${reactDOMSource}';
73
- import App from '${entry.file}';
76
+ import App from '${(0, import_utils.winPath)(entry.file)}';
74
77
  ${layoutImport}
75
78
  ${renderer}
76
79
  `.trimStart()
@@ -121,19 +124,23 @@ async function collectEntryWithTimeCount(root, opts) {
121
124
  }
122
125
  async function collectEntry(root, opts) {
123
126
  return await (0, import_fs.readdirSync)(root).reduce(async (memoP, dir) => {
127
+ var _a;
124
128
  const memo = await memoP;
125
129
  const absDir = (0, import_path.join)(root, dir);
126
130
  if ((0, import_fs.existsSync)(absDir) && (0, import_fs.statSync)(absDir).isDirectory()) {
127
131
  const indexFile = getIndexFile(absDir);
128
132
  if (indexFile) {
129
133
  const config = opts.getConfigFromEntryFile ? await getConfigFromEntryFile(indexFile) : await getConfig(indexFile);
134
+ const name = dir;
135
+ const globalConfig = (_a = opts.entry) == null ? void 0 : _a[dir];
130
136
  memo.push({
131
- name: dir,
137
+ name,
132
138
  file: indexFile,
133
139
  tmpFilePath: `mpa/${dir}${(0, import_path.extname)(indexFile)}`,
134
140
  mountElementId: "root",
141
+ ...globalConfig,
135
142
  ...config,
136
- title: config.title || dir
143
+ title: (globalConfig == null ? void 0 : globalConfig.title) || config.title || dir
137
144
  });
138
145
  }
139
146
  }
@@ -36,6 +36,12 @@ var vite_default = (api) => {
36
36
  memo.alias["@fs"] = api.cwd;
37
37
  return memo;
38
38
  });
39
+ api.modifyDefaultConfig((memo) => {
40
+ if (api.env === "development") {
41
+ memo.polyfill = false;
42
+ }
43
+ return memo;
44
+ });
39
45
  api.register({
40
46
  key: "onBeforeCompiler",
41
47
  stage: Number.POSITIVE_INFINITY,
package/dist/index.js CHANGED
@@ -56,6 +56,7 @@ var src_default = () => {
56
56
  require.resolve("./features/monorepo/redirect"),
57
57
  require.resolve("./features/clickToComponent/clickToComponent"),
58
58
  require.resolve("./features/legacy/legacy"),
59
+ require.resolve("./features/classPropertiesLoose/classPropertiesLoose"),
59
60
  require.resolve("./commands/build"),
60
61
  require.resolve("./commands/config/config"),
61
62
  require.resolve("./commands/dev/dev"),
@@ -0,0 +1,13 @@
1
+ import type { Stats } from '@umijs/bundler-webpack/compiled/webpack';
2
+ interface ISizes {
3
+ root: string;
4
+ sizes: Record<string, number>;
5
+ }
6
+ export declare function printFileSizesAfterBuild(opts: {
7
+ webpackStats: Stats;
8
+ previousSizeMap: ISizes;
9
+ buildFolder: string;
10
+ suggestMaxSize?: number;
11
+ }): void;
12
+ export declare function measureFileSizesBeforeBuild(dir: string): ISizes;
13
+ export {};
@@ -0,0 +1,138 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // src/utils/fileSizeReporter.ts
23
+ var fileSizeReporter_exports = {};
24
+ __export(fileSizeReporter_exports, {
25
+ measureFileSizesBeforeBuild: () => measureFileSizesBeforeBuild,
26
+ printFileSizesAfterBuild: () => printFileSizesAfterBuild
27
+ });
28
+ module.exports = __toCommonJS(fileSizeReporter_exports);
29
+ var import_fs = __toESM(require("fs"));
30
+ var import_path = __toESM(require("path"));
31
+ var import_utils = require("@umijs/utils");
32
+ var gzipSize = import_utils.gzipSize.sync;
33
+ var WARN_GZIP_SIZE = 1024 * 1024;
34
+ function printFileSizesAfterBuild(opts) {
35
+ var _a;
36
+ const {
37
+ webpackStats,
38
+ previousSizeMap,
39
+ buildFolder,
40
+ suggestMaxSize = WARN_GZIP_SIZE
41
+ } = opts;
42
+ const { root, sizes } = previousSizeMap;
43
+ const assets = (_a = webpackStats.toJson({ all: false, assets: true }).assets) == null ? void 0 : _a.filter((asset) => canReadAsset(asset.name)).map((asset) => {
44
+ const content = import_fs.default.readFileSync(import_path.default.join(root, asset.name), {
45
+ encoding: "utf-8"
46
+ });
47
+ const size = gzipSize(content);
48
+ const key = removeFileNameHash(root, asset.name);
49
+ const previousSize = sizes[key];
50
+ const difference = getDifferenceLabel(size, previousSize);
51
+ return {
52
+ folder: import_path.default.join(import_path.default.basename(buildFolder), import_path.default.dirname(asset.name)),
53
+ name: import_path.default.basename(asset.name),
54
+ size,
55
+ sizeLabel: (0, import_utils.filesize)(size) + (difference ? " (" + difference + ")" : "")
56
+ };
57
+ });
58
+ if (!(assets == null ? void 0 : assets.length)) {
59
+ return;
60
+ }
61
+ assets.sort((a, b) => b.size - a.size);
62
+ const longestSizeLabelLength = Math.max(...assets.map((a) => (0, import_utils.stripAnsi)(a.sizeLabel).length));
63
+ let suggestBundleSplitting = false;
64
+ assets.forEach((asset) => {
65
+ let sizeLabel = asset.sizeLabel;
66
+ const sizeLength = (0, import_utils.stripAnsi)(sizeLabel).length;
67
+ if (sizeLength < longestSizeLabelLength) {
68
+ const rightPadding = " ".repeat(longestSizeLabelLength - sizeLength);
69
+ sizeLabel += rightPadding;
70
+ }
71
+ const isLarge = asset.size > suggestMaxSize;
72
+ if (isLarge && import_path.default.extname(asset.name) === ".js") {
73
+ suggestBundleSplitting = true;
74
+ }
75
+ console.log(" " + (isLarge ? import_utils.chalk.yellow(sizeLabel) : sizeLabel) + " " + import_utils.chalk.dim(asset.folder + import_path.default.sep) + import_utils.chalk.cyan(asset.name));
76
+ });
77
+ if (suggestBundleSplitting) {
78
+ console.log();
79
+ console.log(import_utils.chalk.yellow("The bundle size is significantly larger than recommended."));
80
+ console.log(import_utils.chalk.yellow("Consider reducing it with code splitting: "), import_utils.chalk.cyan("https://umijs.org/blog/code-splitting"));
81
+ console.log(import_utils.chalk.yellow("You can also analyze the project dependencies: "), import_utils.chalk.cyan("https://umijs.org/docs/guides/env-variables#analyze"));
82
+ }
83
+ console.log();
84
+ }
85
+ var FIFTY_KILOBYTES = 1024 * 50;
86
+ function getDifferenceLabel(currentSize, previousSize) {
87
+ const difference = currentSize - previousSize;
88
+ const fileSize = !Number.isNaN(difference) ? (0, import_utils.filesize)(difference) : 0;
89
+ if (difference >= FIFTY_KILOBYTES) {
90
+ return import_utils.chalk.red("+" + fileSize);
91
+ } else if (difference < FIFTY_KILOBYTES && difference > 0) {
92
+ return import_utils.chalk.yellow("+" + fileSize);
93
+ } else if (difference < 0) {
94
+ return import_utils.chalk.green(fileSize);
95
+ } else {
96
+ return "";
97
+ }
98
+ }
99
+ function recursive(dir) {
100
+ const list = [];
101
+ if (import_fs.default.existsSync(dir) && import_fs.default.statSync(dir).isDirectory()) {
102
+ const files = import_fs.default.readdirSync(dir);
103
+ files.forEach((file) => {
104
+ const absPath = import_path.default.join(dir, file);
105
+ if (import_fs.default.statSync(absPath).isDirectory()) {
106
+ list.push(...recursive(absPath));
107
+ return;
108
+ }
109
+ list.push(absPath);
110
+ });
111
+ return list;
112
+ }
113
+ return list;
114
+ }
115
+ function canReadAsset(file) {
116
+ return /\.(js|css)$/.test(file) && !/service-worker\.js/.test(file) && !/precache-manifest\.[0-9a-f]+\.js/.test(file);
117
+ }
118
+ function removeFileNameHash(dir, fileName) {
119
+ return fileName.replace(dir, "").replace(/\\/g, "/").replace(/\/?(.*)(\.[0-9a-f]+)(\.chunk)?(\.js|\.css)/, (_match, p1, _p2, _p3, p4) => p1 + p4).replace(/^\//, "");
120
+ }
121
+ function measureFileSizesBeforeBuild(dir) {
122
+ const fileNames = recursive(dir);
123
+ const sizes = fileNames.filter(canReadAsset).reduce((memo, fileName) => {
124
+ const content = import_fs.default.readFileSync(fileName, { encoding: "utf-8" });
125
+ const key = removeFileNameHash(dir, fileName);
126
+ memo[key] = gzipSize(content);
127
+ return memo;
128
+ }, {});
129
+ return {
130
+ root: dir,
131
+ sizes
132
+ };
133
+ }
134
+ // Annotate the CommonJS export names for ESM import in node:
135
+ 0 && (module.exports = {
136
+ measureFileSizesBeforeBuild,
137
+ printFileSizesAfterBuild
138
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umijs/preset-umi",
3
- "version": "4.0.21",
3
+ "version": "4.0.22",
4
4
  "description": "@umijs/preset-umi",
5
5
  "homepage": "https://github.com/umijs/umi/tree/master/packages/preset-umi#readme",
6
6
  "bugs": "https://github.com/umijs/umi/issues",
@@ -25,20 +25,19 @@
25
25
  "test": "umi-scripts jest-turbo"
26
26
  },
27
27
  "dependencies": {
28
- "@types/multer": "1.4.7",
29
- "@umijs/ast": "4.0.21",
30
- "@umijs/babel-preset-umi": "4.0.21",
31
- "@umijs/bundler-utils": "4.0.21",
32
- "@umijs/bundler-vite": "4.0.21",
33
- "@umijs/bundler-webpack": "4.0.21",
34
- "@umijs/core": "4.0.21",
28
+ "@umijs/ast": "4.0.22",
29
+ "@umijs/babel-preset-umi": "4.0.22",
30
+ "@umijs/bundler-utils": "4.0.22",
31
+ "@umijs/bundler-vite": "4.0.22",
32
+ "@umijs/bundler-webpack": "4.0.22",
33
+ "@umijs/core": "4.0.22",
35
34
  "@umijs/did-you-know": "^1.0.0",
36
35
  "@umijs/history": "5.3.1",
37
- "@umijs/mfsu": "4.0.21",
38
- "@umijs/plugin-run": "4.0.21",
39
- "@umijs/renderer-react": "4.0.21",
40
- "@umijs/server": "4.0.21",
41
- "@umijs/utils": "4.0.21",
36
+ "@umijs/mfsu": "4.0.22",
37
+ "@umijs/plugin-run": "4.0.22",
38
+ "@umijs/renderer-react": "4.0.22",
39
+ "@umijs/server": "4.0.22",
40
+ "@umijs/utils": "4.0.22",
42
41
  "click-to-react-component": "^1.0.8",
43
42
  "core-js": "3.22.4",
44
43
  "current-script-polyfill": "1.0.0",