package-build-stats 8.0.3 → 8.2.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/build/common.types.js +1 -2
- package/build/config/config.js +3 -8
- package/build/config/makeRspackConfig.d.ts +1 -1
- package/build/config/makeRspackConfig.js +18 -18
- package/build/errors/CustomError.js +8 -19
- package/build/getDependencySizeTree.js +17 -23
- package/build/getPackageExportSizes.d.ts +1 -1
- package/build/getPackageExportSizes.js +41 -48
- package/build/getPackageStats.d.ts +1 -1
- package/build/getPackageStats.js +33 -39
- package/build/index.d.ts +4 -4
- package/build/index.js +4 -26
- package/build/utils/build.utils.d.ts +1 -1
- package/build/utils/build.utils.js +48 -49
- package/build/utils/common.utils.js +18 -28
- package/build/utils/exports.utils.d.ts +1 -0
- package/build/utils/exports.utils.js +53 -36
- package/build/utils/installation.utils.d.ts +1 -1
- package/build/utils/installation.utils.js +35 -40
- package/build/utils/telemetry.utils.d.ts +3 -1
- package/build/utils/telemetry.utils.js +26 -33
- package/package.json +2 -1
- package/src/config/makeRspackConfig.ts +8 -2
- package/src/getDependencySizeTree.ts +3 -4
- package/src/getPackageExportSizes.ts +9 -6
- package/src/getPackageStats.ts +6 -6
- package/src/index.ts +4 -4
- package/src/utils/build.utils.ts +14 -8
- package/src/utils/common.utils.ts +2 -2
- package/src/utils/exports.utils.ts +50 -14
- package/src/utils/installation.utils.ts +5 -5
- package/src/utils/telemetry.utils.ts +7 -3
package/build/common.types.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1
|
+
export {};
|
package/build/config/config.js
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Use ES6 supported by Node v6.10 only!
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
const path_1 = __importDefault(require("path"));
|
|
8
|
-
exports.default = {
|
|
9
|
-
tmp: path_1.default.join('/tmp', 'tmp-build'),
|
|
2
|
+
import path from 'path';
|
|
3
|
+
export default {
|
|
4
|
+
tmp: path.join('/tmp', 'tmp-build'),
|
|
10
5
|
};
|
|
@@ -1,13 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
}
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.default = makeRspackConfig;
|
|
7
|
-
const autoprefixer_1 = __importDefault(require("autoprefixer"));
|
|
8
|
-
const escape_string_regexp_1 = __importDefault(require("escape-string-regexp"));
|
|
9
|
-
const core_1 = __importDefault(require("@rspack/core"));
|
|
10
|
-
function makeRspackConfig({ packageName: _packageName, entry, externals, debug: _debug, minify = true, }) {
|
|
1
|
+
import autoprefixer from 'autoprefixer';
|
|
2
|
+
import escapeRegex from 'escape-string-regexp';
|
|
3
|
+
import rspack from '@rspack/core';
|
|
4
|
+
export default function makeRspackConfig({ packageName: _packageName, entry, externals, debug: _debug, minify = true, }) {
|
|
11
5
|
const externalsRegex = makeExternalsRegex(externals.externalPackages);
|
|
12
6
|
const isExternalRequest = (request) => {
|
|
13
7
|
const isPeerDep = externals.externalPackages.length
|
|
@@ -21,9 +15,15 @@ function makeRspackConfig({ packageName: _packageName, entry, externals, debug:
|
|
|
21
15
|
mode: 'production',
|
|
22
16
|
devtool: _debug ? 'source-map' : false,
|
|
23
17
|
optimization: {
|
|
24
|
-
|
|
18
|
+
// Use 'multiple' to create a separate runtime chunk per entry point
|
|
19
|
+
// 'single' or { name: 'runtime' } shares one runtime across all entries,
|
|
20
|
+
// which breaks tree-shaking when building many exports simultaneously
|
|
21
|
+
runtimeChunk: 'multiple',
|
|
25
22
|
realContentHash: false,
|
|
26
23
|
minimize: minify,
|
|
24
|
+
// Enable tree-shaking optimizations
|
|
25
|
+
usedExports: true, // Mark unused exports for removal
|
|
26
|
+
sideEffects: true, // Respect package.json sideEffects field
|
|
27
27
|
// Rspack automatically uses its built-in default minifiers:
|
|
28
28
|
// - SwcJsMinimizerRspackPlugin for JS (SWC-based, very fast)
|
|
29
29
|
// - LightningCssMinimizerRspackPlugin for CSS (Lightning CSS-based)
|
|
@@ -72,7 +72,7 @@ function makeRspackConfig({ packageName: _packageName, entry, externals, debug:
|
|
|
72
72
|
test: /\.css$/,
|
|
73
73
|
type: 'javascript/auto',
|
|
74
74
|
use: [
|
|
75
|
-
|
|
75
|
+
rspack.CssExtractRspackPlugin.loader,
|
|
76
76
|
require.resolve('css-loader'),
|
|
77
77
|
],
|
|
78
78
|
},
|
|
@@ -93,13 +93,13 @@ function makeRspackConfig({ packageName: _packageName, entry, externals, debug:
|
|
|
93
93
|
test: /\.(scss|sass)$/,
|
|
94
94
|
type: 'javascript/auto',
|
|
95
95
|
use: [
|
|
96
|
-
|
|
96
|
+
rspack.CssExtractRspackPlugin.loader,
|
|
97
97
|
require.resolve('css-loader'),
|
|
98
98
|
{
|
|
99
99
|
loader: require.resolve('postcss-loader'),
|
|
100
100
|
options: {
|
|
101
101
|
postcssOptions: {
|
|
102
|
-
plugins: [(
|
|
102
|
+
plugins: [autoprefixer()],
|
|
103
103
|
},
|
|
104
104
|
},
|
|
105
105
|
},
|
|
@@ -110,14 +110,14 @@ function makeRspackConfig({ packageName: _packageName, entry, externals, debug:
|
|
|
110
110
|
test: /\.less$/,
|
|
111
111
|
type: 'javascript/auto',
|
|
112
112
|
use: [
|
|
113
|
-
|
|
113
|
+
rspack.CssExtractRspackPlugin.loader,
|
|
114
114
|
require.resolve('css-loader'),
|
|
115
115
|
{
|
|
116
116
|
loader: require.resolve('postcss-loader'),
|
|
117
117
|
options: {
|
|
118
118
|
postcssOptions: {
|
|
119
119
|
plugins: [
|
|
120
|
-
(
|
|
120
|
+
autoprefixer({
|
|
121
121
|
overrideBrowserslist: [
|
|
122
122
|
'last 5 Chrome versions',
|
|
123
123
|
'last 5 Firefox versions',
|
|
@@ -143,7 +143,7 @@ function makeRspackConfig({ packageName: _packageName, entry, externals, debug:
|
|
|
143
143
|
],
|
|
144
144
|
},
|
|
145
145
|
plugins: [
|
|
146
|
-
new
|
|
146
|
+
new rspack.CssExtractRspackPlugin({
|
|
147
147
|
filename: '[name].bundle.css',
|
|
148
148
|
}),
|
|
149
149
|
],
|
|
@@ -161,7 +161,7 @@ function makeRspackConfig({ packageName: _packageName, entry, externals, debug:
|
|
|
161
161
|
}
|
|
162
162
|
function makeExternalsRegex(externals) {
|
|
163
163
|
let externalsRegex = externals
|
|
164
|
-
.map(dep => `^${(
|
|
164
|
+
.map(dep => `^${escapeRegex(dep)}$|^${escapeRegex(dep)}\\/`)
|
|
165
165
|
.join('|');
|
|
166
166
|
externalsRegex = `(${externalsRegex})`;
|
|
167
167
|
return new RegExp(externalsRegex);
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.UnexpectedBuildError = exports.MissingDependencyError = exports.MinifyError = exports.CLIBuildError = exports.PackageNotFoundError = exports.InstallError = exports.EntryPointError = exports.BuildError = void 0;
|
|
4
1
|
/**
|
|
5
2
|
* Wraps the original error with a identifiable
|
|
6
3
|
* name.
|
|
@@ -21,60 +18,52 @@ class CustomError extends Error {
|
|
|
21
18
|
};
|
|
22
19
|
}
|
|
23
20
|
}
|
|
24
|
-
class BuildError extends CustomError {
|
|
21
|
+
export class BuildError extends CustomError {
|
|
25
22
|
constructor(originalError, extra) {
|
|
26
23
|
super('BuildError', originalError, extra);
|
|
27
24
|
Object.setPrototypeOf(this, BuildError.prototype);
|
|
28
25
|
}
|
|
29
26
|
}
|
|
30
|
-
|
|
31
|
-
class EntryPointError extends CustomError {
|
|
27
|
+
export class EntryPointError extends CustomError {
|
|
32
28
|
constructor(originalError, extra) {
|
|
33
29
|
super('EntryPointError', originalError, extra);
|
|
34
30
|
Object.setPrototypeOf(this, EntryPointError.prototype);
|
|
35
31
|
}
|
|
36
32
|
}
|
|
37
|
-
|
|
38
|
-
class InstallError extends CustomError {
|
|
33
|
+
export class InstallError extends CustomError {
|
|
39
34
|
constructor(originalError, extra) {
|
|
40
35
|
super('InstallError', originalError, extra);
|
|
41
36
|
Object.setPrototypeOf(this, InstallError.prototype);
|
|
42
37
|
}
|
|
43
38
|
}
|
|
44
|
-
|
|
45
|
-
class PackageNotFoundError extends CustomError {
|
|
39
|
+
export class PackageNotFoundError extends CustomError {
|
|
46
40
|
constructor(originalError, extra) {
|
|
47
41
|
super('PackageNotFoundError', originalError, extra);
|
|
48
42
|
Object.setPrototypeOf(this, PackageNotFoundError.prototype);
|
|
49
43
|
}
|
|
50
44
|
}
|
|
51
|
-
|
|
52
|
-
class CLIBuildError extends CustomError {
|
|
45
|
+
export class CLIBuildError extends CustomError {
|
|
53
46
|
constructor(originalError, extra) {
|
|
54
47
|
super('CLIBuildError', originalError, extra);
|
|
55
48
|
Object.setPrototypeOf(this, CLIBuildError.prototype);
|
|
56
49
|
}
|
|
57
50
|
}
|
|
58
|
-
|
|
59
|
-
class MinifyError extends CustomError {
|
|
51
|
+
export class MinifyError extends CustomError {
|
|
60
52
|
constructor(originalError, extra) {
|
|
61
53
|
super('MinifyError', originalError, extra);
|
|
62
54
|
Object.setPrototypeOf(this, MinifyError.prototype);
|
|
63
55
|
}
|
|
64
56
|
}
|
|
65
|
-
|
|
66
|
-
class MissingDependencyError extends CustomError {
|
|
57
|
+
export class MissingDependencyError extends CustomError {
|
|
67
58
|
constructor(originalError, extra) {
|
|
68
59
|
super('MissingDependencyError', originalError, extra);
|
|
69
60
|
this.missingModules = extra.missingModules;
|
|
70
61
|
Object.setPrototypeOf(this, MissingDependencyError.prototype);
|
|
71
62
|
}
|
|
72
63
|
}
|
|
73
|
-
|
|
74
|
-
class UnexpectedBuildError extends CustomError {
|
|
64
|
+
export class UnexpectedBuildError extends CustomError {
|
|
75
65
|
constructor(originalError, extra) {
|
|
76
66
|
super('UnexpectedBuildError', originalError, extra);
|
|
77
67
|
Object.setPrototypeOf(this, UnexpectedBuildError.prototype);
|
|
78
68
|
}
|
|
79
69
|
}
|
|
80
|
-
exports.UnexpectedBuildError = UnexpectedBuildError;
|
|
@@ -1,13 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const path_1 = __importDefault(require("path"));
|
|
7
|
-
const core_1 = require("@swc/core");
|
|
8
|
-
const CustomError_1 = require("./errors/CustomError");
|
|
9
|
-
const telemetry_utils_1 = __importDefault(require("./utils/telemetry.utils"));
|
|
10
|
-
const perf_hooks_1 = require("perf_hooks");
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { minify } from '@swc/core';
|
|
3
|
+
import { MinifyError } from './errors/CustomError.js';
|
|
4
|
+
import Telemetry from './utils/telemetry.utils.js';
|
|
5
|
+
import { performance } from 'perf_hooks';
|
|
11
6
|
function modulePath(identifier) {
|
|
12
7
|
// the format of module paths is
|
|
13
8
|
// '(<loader expression>!)?/path/to/module.js'
|
|
@@ -35,8 +30,8 @@ function getUtf8Size(value) {
|
|
|
35
30
|
function extractPackageNamesFromPath(moduleFilePath) {
|
|
36
31
|
// pnpm will serve packages from a global symlink (.pnpm/package@version/node_modules/package)
|
|
37
32
|
// needs to be stripped off
|
|
38
|
-
const pnpmPrefix = '.pnpm\\' +
|
|
39
|
-
const packages = moduleFilePath.split(new RegExp('\\' +
|
|
33
|
+
const pnpmPrefix = '.pnpm\\' + path.sep + '.+\\' + path.sep + 'node_modules\\' + path.sep;
|
|
34
|
+
const packages = moduleFilePath.split(new RegExp('\\' + path.sep + 'node_modules\\' + path.sep + `(?:${pnpmPrefix})?`));
|
|
40
35
|
if (packages.length <= 1)
|
|
41
36
|
return [];
|
|
42
37
|
const lastSegment = packages.pop();
|
|
@@ -46,11 +41,11 @@ function extractPackageNamesFromPath(moduleFilePath) {
|
|
|
46
41
|
let lastPackageName;
|
|
47
42
|
if (lastSegment[0] === '@') {
|
|
48
43
|
// package is a scoped package
|
|
49
|
-
const offset = lastSegment.indexOf(
|
|
50
|
-
lastPackageName = lastSegment.slice(0, offset + lastSegment.slice(offset).indexOf(
|
|
44
|
+
const offset = lastSegment.indexOf(path.sep) + 1;
|
|
45
|
+
lastPackageName = lastSegment.slice(0, offset + lastSegment.slice(offset).indexOf(path.sep));
|
|
51
46
|
}
|
|
52
47
|
else {
|
|
53
|
-
lastPackageName = lastSegment.slice(0, lastSegment.indexOf(
|
|
48
|
+
lastPackageName = lastSegment.slice(0, lastSegment.indexOf(path.sep));
|
|
54
49
|
}
|
|
55
50
|
packages.push(lastPackageName);
|
|
56
51
|
packages.shift(); // Remove the first empty element
|
|
@@ -62,7 +57,7 @@ async function minifyDependencyCode(source) {
|
|
|
62
57
|
}
|
|
63
58
|
try {
|
|
64
59
|
const startTime = Date.now();
|
|
65
|
-
const result = await
|
|
60
|
+
const result = await minify(source, {
|
|
66
61
|
compress: true,
|
|
67
62
|
mangle: true,
|
|
68
63
|
module: true, // Treat as ES module to support import/export
|
|
@@ -120,7 +115,7 @@ function normaliseModuleSource(mod) {
|
|
|
120
115
|
return finalSource;
|
|
121
116
|
}
|
|
122
117
|
async function bundleSizeTree(packageName, stats) {
|
|
123
|
-
const startTime =
|
|
118
|
+
const startTime = performance.now();
|
|
124
119
|
const statsTree = {
|
|
125
120
|
packageName: '<root>',
|
|
126
121
|
sources: [],
|
|
@@ -186,7 +181,7 @@ async function bundleSizeTree(packageName, stats) {
|
|
|
186
181
|
return;
|
|
187
182
|
}
|
|
188
183
|
let parent = statsTree;
|
|
189
|
-
packages.forEach(
|
|
184
|
+
packages.forEach(pkg => {
|
|
190
185
|
const existing = parent.children.filter(child => child.packageName === pkg);
|
|
191
186
|
if (existing.length > 0) {
|
|
192
187
|
existing[0].sources.push(mod.source);
|
|
@@ -233,7 +228,6 @@ async function bundleSizeTree(packageName, stats) {
|
|
|
233
228
|
}
|
|
234
229
|
const minified = await minifyDependencyCode(code);
|
|
235
230
|
const minifiedSize = getUtf8Size(minified.code || '');
|
|
236
|
-
const minifiedCode = minified.code || '';
|
|
237
231
|
if (process.env.DEBUG_SIZE) {
|
|
238
232
|
console.log(`Source ${idx}: ${minifiedSize} bytes (minified)`);
|
|
239
233
|
}
|
|
@@ -258,7 +252,7 @@ async function bundleSizeTree(packageName, stats) {
|
|
|
258
252
|
}
|
|
259
253
|
catch (error) {
|
|
260
254
|
const { message, filename } = error;
|
|
261
|
-
throw new
|
|
255
|
+
throw new MinifyError(error, {
|
|
262
256
|
message: message,
|
|
263
257
|
filePath: filename,
|
|
264
258
|
});
|
|
@@ -266,12 +260,12 @@ async function bundleSizeTree(packageName, stats) {
|
|
|
266
260
|
});
|
|
267
261
|
try {
|
|
268
262
|
const results = await Promise.all(resultPromises);
|
|
269
|
-
|
|
263
|
+
Telemetry.dependencySizes(packageName, startTime, true, { minifier: 'swc' });
|
|
270
264
|
return results;
|
|
271
265
|
}
|
|
272
266
|
catch (e) {
|
|
273
|
-
|
|
267
|
+
Telemetry.dependencySizes(packageName, startTime, false, { minifier: 'swc' }, e);
|
|
274
268
|
throw e;
|
|
275
269
|
}
|
|
276
270
|
}
|
|
277
|
-
|
|
271
|
+
export default bundleSizeTree;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GetPackageStatsOptions, InstallPackageOptions } from './common.types';
|
|
1
|
+
import { GetPackageStatsOptions, InstallPackageOptions } from './common.types.js';
|
|
2
2
|
export declare function getAllPackageExports(packageString: string, options?: InstallPackageOptions): Promise<{
|
|
3
3
|
[key: string]: string;
|
|
4
4
|
}>;
|
|
@@ -1,22 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
exports.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const path_1 = __importDefault(require("path"));
|
|
11
|
-
const debug_1 = __importDefault(require("debug"));
|
|
12
|
-
const debug = (0, debug_1.default)('bp:worker');
|
|
13
|
-
const common_utils_1 = require("./utils/common.utils");
|
|
14
|
-
const exports_utils_1 = require("./utils/exports.utils");
|
|
15
|
-
const installation_utils_1 = __importDefault(require("./utils/installation.utils"));
|
|
16
|
-
const build_utils_1 = __importDefault(require("./utils/build.utils"));
|
|
1
|
+
import Telemetry from './utils/telemetry.utils.js';
|
|
2
|
+
import { performance } from 'perf_hooks';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import createDebug from 'debug';
|
|
5
|
+
const debug = createDebug('bp:worker');
|
|
6
|
+
import { getExternals, parsePackageString } from './utils/common.utils.js';
|
|
7
|
+
import { getAllExports } from './utils/exports.utils.js';
|
|
8
|
+
import InstallationUtils from './utils/installation.utils.js';
|
|
9
|
+
import BuildUtils from './utils/build.utils.js';
|
|
17
10
|
async function installPackage(packageString, installPath, options) {
|
|
18
|
-
const { isLocal } =
|
|
19
|
-
await
|
|
11
|
+
const { isLocal } = parsePackageString(packageString);
|
|
12
|
+
await InstallationUtils.installPackage(packageString, installPath, {
|
|
20
13
|
isLocal,
|
|
21
14
|
client: options.client,
|
|
22
15
|
limitConcurrency: options.limitConcurrency,
|
|
@@ -24,54 +17,54 @@ async function installPackage(packageString, installPath, options) {
|
|
|
24
17
|
installTimeout: options.installTimeout,
|
|
25
18
|
});
|
|
26
19
|
}
|
|
27
|
-
async function getAllPackageExports(packageString, options = {}) {
|
|
28
|
-
const startTime =
|
|
29
|
-
const { name: packageName, normalPath } =
|
|
30
|
-
const installPath = await
|
|
20
|
+
export async function getAllPackageExports(packageString, options = {}) {
|
|
21
|
+
const startTime = performance.now();
|
|
22
|
+
const { name: packageName, normalPath } = parsePackageString(packageString);
|
|
23
|
+
const installPath = await InstallationUtils.preparePath(packageName);
|
|
31
24
|
try {
|
|
32
25
|
await installPackage(packageString, installPath, options);
|
|
33
26
|
// The package is installed in node_modules subdirectory
|
|
34
|
-
const packagePath = normalPath ||
|
|
35
|
-
const results = await
|
|
36
|
-
|
|
27
|
+
const packagePath = normalPath || path.join(installPath, 'node_modules', packageName);
|
|
28
|
+
const results = await getAllExports(packageString, packagePath, packageName, installPath);
|
|
29
|
+
Telemetry.packageExports(packageString, startTime, true);
|
|
37
30
|
return results;
|
|
38
31
|
}
|
|
39
32
|
catch (err) {
|
|
40
|
-
|
|
33
|
+
Telemetry.packageExports(packageString, startTime, false, err);
|
|
41
34
|
throw err;
|
|
42
35
|
}
|
|
43
36
|
finally {
|
|
44
|
-
await
|
|
37
|
+
await InstallationUtils.cleanupPath(installPath);
|
|
45
38
|
}
|
|
46
39
|
}
|
|
47
|
-
async function getPackageExportSizes(packageString, options = {}) {
|
|
48
|
-
const startTime =
|
|
40
|
+
export async function getPackageExportSizes(packageString, options = {}) {
|
|
41
|
+
const startTime = performance.now();
|
|
49
42
|
const timings = {};
|
|
50
|
-
const { name: packageName, normalPath } =
|
|
51
|
-
const preparePathStart =
|
|
52
|
-
const installPath = await
|
|
53
|
-
timings.preparePath =
|
|
43
|
+
const { name: packageName, normalPath } = parsePackageString(packageString);
|
|
44
|
+
const preparePathStart = performance.now();
|
|
45
|
+
const installPath = await InstallationUtils.preparePath(packageName);
|
|
46
|
+
timings.preparePath = performance.now() - preparePathStart;
|
|
54
47
|
console.log(`[PERF] [ExportSizes] preparePath: ${timings.preparePath.toFixed(2)}ms`);
|
|
55
48
|
try {
|
|
56
|
-
const installStart =
|
|
49
|
+
const installStart = performance.now();
|
|
57
50
|
await installPackage(packageString, installPath, options);
|
|
58
|
-
timings.install =
|
|
51
|
+
timings.install = performance.now() - installStart;
|
|
59
52
|
console.log(`[PERF] [ExportSizes] installPackage: ${timings.install.toFixed(2)}ms`);
|
|
60
53
|
// The package is installed in node_modules subdirectory
|
|
61
|
-
const packagePath = normalPath ||
|
|
62
|
-
const getAllExportsStart =
|
|
63
|
-
const exportMap = await
|
|
64
|
-
timings.getAllExports =
|
|
54
|
+
const packagePath = normalPath || path.join(installPath, 'node_modules', packageName);
|
|
55
|
+
const getAllExportsStart = performance.now();
|
|
56
|
+
const exportMap = await getAllExports(packageString, packagePath, packageName, installPath);
|
|
57
|
+
timings.getAllExports = performance.now() - getAllExportsStart;
|
|
65
58
|
console.log(`[PERF] [ExportSizes] getAllExports: ${timings.getAllExports.toFixed(2)}ms`);
|
|
66
59
|
const exports = Object.keys(exportMap).filter(exp => !(exp === 'default'));
|
|
67
60
|
debug('Got %d exports for %s', exports.length, packageString);
|
|
68
61
|
console.log(`[PERF] [ExportSizes] Found ${exports.length} exports`);
|
|
69
|
-
const externalsStart =
|
|
70
|
-
const externals =
|
|
71
|
-
timings.getExternals =
|
|
62
|
+
const externalsStart = performance.now();
|
|
63
|
+
const externals = getExternals(packageName, installPath);
|
|
64
|
+
timings.getExternals = performance.now() - externalsStart;
|
|
72
65
|
console.log(`[PERF] [ExportSizes] getExternals: ${timings.getExternals.toFixed(2)}ms`);
|
|
73
|
-
const buildStart =
|
|
74
|
-
const builtDetails = await
|
|
66
|
+
const buildStart = performance.now();
|
|
67
|
+
const builtDetails = await BuildUtils.buildPackageIgnoringMissingDeps({
|
|
75
68
|
name: packageName,
|
|
76
69
|
installPath,
|
|
77
70
|
externals,
|
|
@@ -81,9 +74,9 @@ async function getPackageExportSizes(packageString, options = {}) {
|
|
|
81
74
|
includeDependencySizes: false,
|
|
82
75
|
},
|
|
83
76
|
});
|
|
84
|
-
timings.build =
|
|
77
|
+
timings.build = performance.now() - buildStart;
|
|
85
78
|
console.log(`[PERF] [ExportSizes] buildPackage: ${timings.build.toFixed(2)}ms`);
|
|
86
|
-
|
|
79
|
+
Telemetry.packageExportsSizes(packageString, startTime, true, options);
|
|
87
80
|
return {
|
|
88
81
|
...builtDetails,
|
|
89
82
|
assets: builtDetails.assets.map(asset => ({
|
|
@@ -93,10 +86,10 @@ async function getPackageExportSizes(packageString, options = {}) {
|
|
|
93
86
|
};
|
|
94
87
|
}
|
|
95
88
|
catch (err) {
|
|
96
|
-
|
|
89
|
+
Telemetry.packageExportsSizes(packageString, startTime, false, options, err);
|
|
97
90
|
throw err;
|
|
98
91
|
}
|
|
99
92
|
finally {
|
|
100
|
-
await
|
|
93
|
+
await InstallationUtils.cleanupPath(installPath);
|
|
101
94
|
}
|
|
102
95
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Parts of the code are inspired from the `import-cost` project
|
|
3
3
|
* @see https://github.com/wix/import-cost/blob/master/packages/import-cost/src/webpack.js
|
|
4
4
|
*/
|
|
5
|
-
import { GetPackageStatsOptions } from './common.types';
|
|
5
|
+
import { GetPackageStatsOptions } from './common.types.js';
|
|
6
6
|
export default function getPackageStats(packageString: string, options?: GetPackageStatsOptions): Promise<{
|
|
7
7
|
size: number;
|
|
8
8
|
gzip: number;
|
package/build/getPackageStats.js
CHANGED
|
@@ -1,27 +1,21 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Parts of the code are inspired from the `import-cost` project
|
|
4
3
|
* @see https://github.com/wix/import-cost/blob/master/packages/import-cost/src/webpack.js
|
|
5
4
|
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const installation_utils_1 = __importDefault(require("./utils/installation.utils"));
|
|
15
|
-
const build_utils_1 = __importDefault(require("./utils/build.utils"));
|
|
16
|
-
const CustomError_1 = require("./errors/CustomError");
|
|
17
|
-
const telemetry_utils_1 = __importDefault(require("./utils/telemetry.utils"));
|
|
18
|
-
const perf_hooks_1 = require("perf_hooks");
|
|
5
|
+
import fs from 'fs/promises';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import { getExternals, parsePackageString } from './utils/common.utils.js';
|
|
8
|
+
import InstallationUtils from './utils/installation.utils.js';
|
|
9
|
+
import BuildUtils from './utils/build.utils.js';
|
|
10
|
+
import { UnexpectedBuildError } from './errors/CustomError.js';
|
|
11
|
+
import Telemetry from './utils/telemetry.utils.js';
|
|
12
|
+
import { performance } from 'perf_hooks';
|
|
19
13
|
function getPackageJSONDetails(packageName, installPath) {
|
|
20
|
-
const startTime =
|
|
21
|
-
const packageJSONPath =
|
|
22
|
-
return
|
|
14
|
+
const startTime = performance.now();
|
|
15
|
+
const packageJSONPath = path.join(installPath, 'node_modules', packageName, 'package.json');
|
|
16
|
+
return fs.readFile(packageJSONPath, 'utf8').then((contents) => {
|
|
23
17
|
const parsedJSON = JSON.parse(contents);
|
|
24
|
-
|
|
18
|
+
Telemetry.getPackageJSONDetails(packageName, true, startTime);
|
|
25
19
|
return {
|
|
26
20
|
dependencyCount: 'dependencies' in parsedJSON
|
|
27
21
|
? Object.keys(parsedJSON.dependencies).length
|
|
@@ -35,36 +29,36 @@ function getPackageJSONDetails(packageName, installPath) {
|
|
|
35
29
|
: [],
|
|
36
30
|
};
|
|
37
31
|
}, err => {
|
|
38
|
-
|
|
32
|
+
Telemetry.getPackageJSONDetails(packageName, false, startTime, err);
|
|
39
33
|
});
|
|
40
34
|
}
|
|
41
|
-
async function getPackageStats(packageString, options = {}) {
|
|
42
|
-
const startTime =
|
|
35
|
+
export default async function getPackageStats(packageString, options = {}) {
|
|
36
|
+
const startTime = performance.now();
|
|
43
37
|
const timings = {};
|
|
44
|
-
const { name: packageName, isLocal } =
|
|
45
|
-
const preparePathStart =
|
|
46
|
-
const installPath = await
|
|
47
|
-
timings.preparePath =
|
|
38
|
+
const { name: packageName, isLocal } = parsePackageString(packageString);
|
|
39
|
+
const preparePathStart = performance.now();
|
|
40
|
+
const installPath = await InstallationUtils.preparePath(packageName, options.client);
|
|
41
|
+
timings.preparePath = performance.now() - preparePathStart;
|
|
48
42
|
console.log(`[PERF] preparePath: ${timings.preparePath.toFixed(2)}ms`);
|
|
49
43
|
try {
|
|
50
|
-
const installStart =
|
|
51
|
-
await
|
|
44
|
+
const installStart = performance.now();
|
|
45
|
+
await InstallationUtils.installPackage(packageString, installPath, {
|
|
52
46
|
isLocal,
|
|
53
47
|
client: options.client,
|
|
54
48
|
limitConcurrency: options.limitConcurrency,
|
|
55
49
|
networkConcurrency: options.networkConcurrency,
|
|
56
50
|
installTimeout: options.installTimeout,
|
|
57
51
|
});
|
|
58
|
-
timings.install =
|
|
52
|
+
timings.install = performance.now() - installStart;
|
|
59
53
|
console.log(`[PERF] installPackage: ${timings.install.toFixed(2)}ms`);
|
|
60
|
-
const externalsStart =
|
|
61
|
-
const externals =
|
|
62
|
-
timings.getExternals =
|
|
54
|
+
const externalsStart = performance.now();
|
|
55
|
+
const externals = getExternals(packageName, installPath);
|
|
56
|
+
timings.getExternals = performance.now() - externalsStart;
|
|
63
57
|
console.log(`[PERF] getExternals: ${timings.getExternals.toFixed(2)}ms`);
|
|
64
|
-
const parallelStart =
|
|
58
|
+
const parallelStart = performance.now();
|
|
65
59
|
const [pacakgeJSONDetails, builtDetails] = await Promise.all([
|
|
66
60
|
getPackageJSONDetails(packageName, installPath),
|
|
67
|
-
|
|
61
|
+
BuildUtils.buildPackageIgnoringMissingDeps({
|
|
68
62
|
name: packageName,
|
|
69
63
|
installPath,
|
|
70
64
|
externals,
|
|
@@ -76,15 +70,15 @@ async function getPackageStats(packageString, options = {}) {
|
|
|
76
70
|
},
|
|
77
71
|
}),
|
|
78
72
|
]);
|
|
79
|
-
timings.parallelBuild =
|
|
73
|
+
timings.parallelBuild = performance.now() - parallelStart;
|
|
80
74
|
console.log(`[PERF] parallel (packageJSON + build): ${timings.parallelBuild.toFixed(2)}ms`);
|
|
81
75
|
const hasCSSAsset = builtDetails.assets.some(asset => asset.type === 'css');
|
|
82
76
|
const mainAsset = builtDetails.assets.find(asset => asset.name === 'main' && asset.type === (hasCSSAsset ? 'css' : 'js'));
|
|
83
77
|
if (!mainAsset) {
|
|
84
|
-
throw new
|
|
78
|
+
throw new UnexpectedBuildError('Did not find a main asset in the built bundle');
|
|
85
79
|
}
|
|
86
|
-
const totalTime =
|
|
87
|
-
|
|
80
|
+
const totalTime = performance.now() - startTime;
|
|
81
|
+
Telemetry.packageStats(packageString, true, totalTime, options);
|
|
88
82
|
return {
|
|
89
83
|
...pacakgeJSONDetails,
|
|
90
84
|
...builtDetails,
|
|
@@ -93,12 +87,12 @@ async function getPackageStats(packageString, options = {}) {
|
|
|
93
87
|
};
|
|
94
88
|
}
|
|
95
89
|
catch (e) {
|
|
96
|
-
|
|
90
|
+
Telemetry.packageStats(packageString, false, performance.now() - startTime, options);
|
|
97
91
|
throw e;
|
|
98
92
|
}
|
|
99
93
|
finally {
|
|
100
94
|
if (!options.debug) {
|
|
101
|
-
await
|
|
95
|
+
await InstallationUtils.cleanupPath(installPath);
|
|
102
96
|
}
|
|
103
97
|
}
|
|
104
98
|
}
|
package/build/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { default as getPackageStats } from './getPackageStats';
|
|
2
|
-
export * from './errors/CustomError';
|
|
3
|
-
export * from './getPackageExportSizes';
|
|
4
|
-
export { emitter as eventQueue } from './utils/telemetry.utils';
|
|
1
|
+
export { default as getPackageStats } from './getPackageStats.js';
|
|
2
|
+
export * from './errors/CustomError.js';
|
|
3
|
+
export * from './getPackageExportSizes.js';
|
|
4
|
+
export { emitter as eventQueue } from './utils/telemetry.utils.js';
|
package/build/index.js
CHANGED
|
@@ -1,26 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
-
};
|
|
19
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.eventQueue = exports.getPackageStats = void 0;
|
|
21
|
-
var getPackageStats_1 = require("./getPackageStats");
|
|
22
|
-
Object.defineProperty(exports, "getPackageStats", { enumerable: true, get: function () { return __importDefault(getPackageStats_1).default; } });
|
|
23
|
-
__exportStar(require("./errors/CustomError"), exports);
|
|
24
|
-
__exportStar(require("./getPackageExportSizes"), exports);
|
|
25
|
-
var telemetry_utils_1 = require("./utils/telemetry.utils");
|
|
26
|
-
Object.defineProperty(exports, "eventQueue", { enumerable: true, get: function () { return telemetry_utils_1.emitter; } });
|
|
1
|
+
export { default as getPackageStats } from './getPackageStats.js';
|
|
2
|
+
export * from './errors/CustomError.js';
|
|
3
|
+
export * from './getPackageExportSizes.js';
|
|
4
|
+
export { emitter as eventQueue } from './utils/telemetry.utils.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Entry } from '@rspack/core';
|
|
2
2
|
import type { Stats } from '@rspack/core';
|
|
3
|
-
import { Externals, BuildPackageOptions, CreateEntryPointOptions } from '../common.types';
|
|
3
|
+
import { Externals, BuildPackageOptions, CreateEntryPointOptions } from '../common.types.js';
|
|
4
4
|
type CompilePackageArgs = {
|
|
5
5
|
name: string;
|
|
6
6
|
externals: Externals;
|