rollup-plugin-webpack-stats 0.2.6 → 0.4.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/README.md +37 -0
- package/dist/index.d.ts +12 -2
- package/dist/index.js +55 -13
- package/dist/index.js.map +1 -1
- package/dist/transform.d.ts +11 -2
- package/dist/utils.d.ts +16 -0
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -49,9 +49,46 @@ export default defineConfig((env) => ({
|
|
|
49
49
|
}));
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
+
```js
|
|
53
|
+
// vite.config.js - using plugin-legacy, and generating a stats file
|
|
54
|
+
// for the the modern and legacy outputs
|
|
55
|
+
import { defineConfig } from 'vite';
|
|
56
|
+
import legacy from '@vitejs/plugin-legacy';
|
|
57
|
+
import { webpackStats } from 'rollup-plugin-webpack-stats';
|
|
58
|
+
|
|
59
|
+
export default defineConfig((env) => ({
|
|
60
|
+
build: {
|
|
61
|
+
rollupOptions: {
|
|
62
|
+
output: {
|
|
63
|
+
plugins: [
|
|
64
|
+
// Output webpack-stats-modern.json file for the modern build
|
|
65
|
+
// Output webpack-stats-legacy.json file for the legacy build
|
|
66
|
+
// Stats are an output plugin, as plugin-legacy works by injecting
|
|
67
|
+
// an additional output, that duplicates the plugins configured here
|
|
68
|
+
webpackStats((options) => {
|
|
69
|
+
const isLegacy = options.format === 'system';
|
|
70
|
+
return {
|
|
71
|
+
fileName: `webpack-stats${isLegacy ? '-legacy' : '-modern'}.json`,
|
|
72
|
+
};
|
|
73
|
+
}),
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
plugins: [
|
|
79
|
+
legacy({
|
|
80
|
+
/* Your legacy config here */
|
|
81
|
+
}),
|
|
82
|
+
],
|
|
83
|
+
}));
|
|
84
|
+
```
|
|
85
|
+
|
|
52
86
|
### Options
|
|
53
87
|
|
|
54
88
|
- `fileName` - JSON stats file inside rollup/vite output directory
|
|
89
|
+
- `excludeAssets` - exclude matching assets: `string | RegExp | ((filepath: string) => boolean) | Array<string | RegExp | ((filepath: string) => boolean)>`
|
|
90
|
+
- `excludeModules` - exclude matching modules: `string | RegExp | ((filepath: string) => boolean) | Array<string | RegExp | ((filepath: string) => boolean)>`
|
|
91
|
+
|
|
55
92
|
|
|
56
93
|
## Resources
|
|
57
94
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Plugin } from 'rollup';
|
|
1
|
+
import { Plugin, OutputOptions } from 'rollup';
|
|
2
|
+
import type { ExcludeFilepathOption } from './types';
|
|
2
3
|
import { BundleTransformOptions } from './transform';
|
|
3
4
|
export { bundleToWebpackStats } from './transform';
|
|
4
5
|
interface WebpackStatsOptions extends BundleTransformOptions {
|
|
@@ -7,5 +8,14 @@ interface WebpackStatsOptions extends BundleTransformOptions {
|
|
|
7
8
|
* default: webpack-stats.json
|
|
8
9
|
*/
|
|
9
10
|
fileName?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Exclude matching assets
|
|
13
|
+
*/
|
|
14
|
+
excludeAssets?: ExcludeFilepathOption;
|
|
15
|
+
/**
|
|
16
|
+
* Exclude matching modules
|
|
17
|
+
*/
|
|
18
|
+
excludeModules?: ExcludeFilepathOption;
|
|
10
19
|
}
|
|
11
|
-
|
|
20
|
+
type WebpackStatsOptionsOrBuilder = WebpackStatsOptions | ((outputOptions: OutputOptions) => WebpackStatsOptions);
|
|
21
|
+
export declare const webpackStats: (options?: WebpackStatsOptionsOrBuilder) => Plugin;
|
package/dist/index.js
CHANGED
|
@@ -1,20 +1,26 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var crypto = require('crypto');
|
|
4
3
|
var path = require('path');
|
|
4
|
+
var crypto = require('crypto');
|
|
5
5
|
|
|
6
6
|
const HASH_LENGTH = 7;
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Get content byte size
|
|
9
|
+
*/
|
|
10
|
+
function getByteSize(content) {
|
|
8
11
|
if (typeof content === 'string') {
|
|
9
12
|
return Buffer.from(content).length;
|
|
10
13
|
}
|
|
11
14
|
return content?.length || 0;
|
|
12
|
-
}
|
|
13
|
-
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generate a 7 chars hash from a filepath
|
|
18
|
+
*/
|
|
19
|
+
function getHash(filepath) {
|
|
14
20
|
const digest = crypto.createHash('sha256');
|
|
15
|
-
return digest.update(Buffer.from(
|
|
16
|
-
}
|
|
17
|
-
|
|
21
|
+
return digest.update(Buffer.from(filepath)).digest('hex').substr(0, HASH_LENGTH);
|
|
22
|
+
}
|
|
23
|
+
function getChunkId(chunk) {
|
|
18
24
|
let value = chunk.name;
|
|
19
25
|
// Use entry module relative path
|
|
20
26
|
if (chunk.moduleIds?.length > 0) {
|
|
@@ -22,11 +28,37 @@ const getChunkId = (chunk) => {
|
|
|
22
28
|
value = path.relative(process.cwd(), absoluteModulePath);
|
|
23
29
|
}
|
|
24
30
|
return getHash([chunk, value].join('-'));
|
|
25
|
-
}
|
|
26
|
-
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if filepath should be excluded based on a config
|
|
34
|
+
*/
|
|
35
|
+
function checkExcludeFilepath(filepath, option) {
|
|
36
|
+
if (!option) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
if (Array.isArray(option)) {
|
|
40
|
+
let res = false;
|
|
41
|
+
for (let i = 0; i <= option.length - 1 && res === false; i++) {
|
|
42
|
+
res = checkExcludeFilepath(filepath, option[i]);
|
|
43
|
+
}
|
|
44
|
+
return res;
|
|
45
|
+
}
|
|
46
|
+
if (typeof option === 'function') {
|
|
47
|
+
return option(filepath);
|
|
48
|
+
}
|
|
49
|
+
if (typeof option === 'string') {
|
|
50
|
+
return Boolean(filepath.match(option));
|
|
51
|
+
}
|
|
52
|
+
if ('test' in option) {
|
|
53
|
+
return option.test(filepath);
|
|
54
|
+
}
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const bundleToWebpackStats = (bundle, pluginOptions) => {
|
|
27
59
|
const options = {
|
|
28
60
|
moduleOriginalSize: false,
|
|
29
|
-
...
|
|
61
|
+
...pluginOptions,
|
|
30
62
|
};
|
|
31
63
|
const items = Object.values(bundle);
|
|
32
64
|
const assets = [];
|
|
@@ -34,6 +66,9 @@ const bundleToWebpackStats = (bundle, customOptions) => {
|
|
|
34
66
|
const moduleByFileName = {};
|
|
35
67
|
items.forEach(item => {
|
|
36
68
|
if (item.type === 'chunk') {
|
|
69
|
+
if (checkExcludeFilepath(item.fileName, options.excludeAssets)) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
37
72
|
assets.push({
|
|
38
73
|
name: item.fileName,
|
|
39
74
|
size: getByteSize(item.code),
|
|
@@ -47,6 +82,9 @@ const bundleToWebpackStats = (bundle, customOptions) => {
|
|
|
47
82
|
names: [item.name],
|
|
48
83
|
});
|
|
49
84
|
Object.entries(item.modules).forEach(([modulePath, moduleInfo]) => {
|
|
85
|
+
if (checkExcludeFilepath(modulePath, options.excludeModules)) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
50
88
|
// Remove unexpected rollup null prefix
|
|
51
89
|
const normalizedModulePath = modulePath.replace('\u0000', '');
|
|
52
90
|
const relativeModulePath = path.relative(process.cwd(), normalizedModulePath);
|
|
@@ -70,6 +108,9 @@ const bundleToWebpackStats = (bundle, customOptions) => {
|
|
|
70
108
|
});
|
|
71
109
|
}
|
|
72
110
|
else if (item.type === 'asset') {
|
|
111
|
+
if (checkExcludeFilepath(item.fileName, options.excludeAssets)) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
73
114
|
assets.push({
|
|
74
115
|
name: item.fileName,
|
|
75
116
|
size: getByteSize(item.source.toString()),
|
|
@@ -88,11 +129,12 @@ const bundleToWebpackStats = (bundle, customOptions) => {
|
|
|
88
129
|
const NAME = 'webpackStats';
|
|
89
130
|
const webpackStats = (options = {}) => ({
|
|
90
131
|
name: NAME,
|
|
91
|
-
generateBundle(
|
|
92
|
-
const
|
|
132
|
+
generateBundle(outputOptions, bundle) {
|
|
133
|
+
const resolvedOptions = typeof options === 'function' ? options(outputOptions) : options;
|
|
134
|
+
const output = bundleToWebpackStats(bundle, resolvedOptions);
|
|
93
135
|
this.emitFile({
|
|
94
136
|
type: 'asset',
|
|
95
|
-
fileName:
|
|
137
|
+
fileName: resolvedOptions.fileName || 'webpack-stats.json',
|
|
96
138
|
source: JSON.stringify(output),
|
|
97
139
|
});
|
|
98
140
|
},
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/transform.ts","../src/index.ts"],"sourcesContent":[null,null],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/utils.ts","../src/transform.ts","../src/index.ts"],"sourcesContent":[null,null,null],"names":[],"mappings":"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"}
|
package/dist/transform.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { OutputBundle } from 'rollup';
|
|
1
|
+
import type { OutputBundle } from 'rollup';
|
|
2
|
+
import type { ExcludeFilepathOption } from "./types";
|
|
2
3
|
export type WebpackStatsFilteredAsset = {
|
|
3
4
|
name: string;
|
|
4
5
|
size?: number;
|
|
@@ -35,5 +36,13 @@ export type BundleTransformOptions = {
|
|
|
35
36
|
* default: false
|
|
36
37
|
*/
|
|
37
38
|
moduleOriginalSize?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Exclude asset
|
|
41
|
+
*/
|
|
42
|
+
excludeAssets?: ExcludeFilepathOption;
|
|
43
|
+
/**
|
|
44
|
+
* Exclude module
|
|
45
|
+
*/
|
|
46
|
+
excludeModules?: ExcludeFilepathOption;
|
|
38
47
|
};
|
|
39
|
-
export declare const bundleToWebpackStats: (bundle: OutputBundle,
|
|
48
|
+
export declare const bundleToWebpackStats: (bundle: OutputBundle, pluginOptions?: BundleTransformOptions) => WebpackStatsFiltered;
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { OutputChunk } from 'rollup';
|
|
3
|
+
import type { ExcludeFilepathOption } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* Get content byte size
|
|
6
|
+
*/
|
|
7
|
+
export declare function getByteSize(content: string | Buffer): number;
|
|
8
|
+
/**
|
|
9
|
+
* Generate a 7 chars hash from a filepath
|
|
10
|
+
*/
|
|
11
|
+
export declare function getHash(filepath: string): string;
|
|
12
|
+
export declare function getChunkId(chunk: OutputChunk): string;
|
|
13
|
+
/**
|
|
14
|
+
* Check if filepath should be excluded based on a config
|
|
15
|
+
*/
|
|
16
|
+
export declare function checkExcludeFilepath(filepath: string, option?: ExcludeFilepathOption): boolean;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rollup-plugin-webpack-stats",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -47,11 +47,11 @@
|
|
|
47
47
|
"@release-it/conventional-changelog": "8.0.1",
|
|
48
48
|
"@rollup/plugin-typescript": "11.1.6",
|
|
49
49
|
"@tsconfig/node14": "14.1.2",
|
|
50
|
-
"@types/node": "20.
|
|
50
|
+
"@types/node": "20.14.0",
|
|
51
51
|
"dotenv": "16.4.5",
|
|
52
52
|
"husky": "9.0.11",
|
|
53
|
-
"release-it": "17.
|
|
54
|
-
"rollup": "4.
|
|
53
|
+
"release-it": "17.3.0",
|
|
54
|
+
"rollup": "4.18.0",
|
|
55
55
|
"tslib": "2.6.2",
|
|
56
56
|
"typescript": "5.4.5",
|
|
57
57
|
"vitest": "0.34.6"
|