@modern-js/builder 2.0.0-beta.3 → 2.0.0-beta.6

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.
@@ -1,2 +1,2 @@
1
1
  import { type BuilderInstance, type BuilderProvider, type CreateBuilderOptions } from '@modern-js/builder-shared';
2
- export declare function createBuilder(provider: BuilderProvider, options: CreateBuilderOptions): Promise<BuilderInstance>;
2
+ export declare function createBuilder<P extends BuilderProvider = BuilderProvider>(provider: P, options: CreateBuilderOptions): Promise<BuilderInstance<P>>;
@@ -6,7 +6,7 @@ const plugins_1 = require("./plugins");
6
6
  async function createBuilder(provider, options) {
7
7
  const builderOptions = (0, builder_shared_1.applyDefaultBuilderOptions)(options);
8
8
  const pluginStore = (0, builder_shared_1.createPluginStore)();
9
- const { build, publicContext, inspectConfig, createCompiler, startDevServer, applyDefaultPlugins, } = await provider({
9
+ const { build, pluginAPI, publicContext, initConfigs, inspectConfig, createCompiler, startDevServer, applyDefaultPlugins, } = await provider({
10
10
  pluginStore,
11
11
  builderOptions,
12
12
  plugins: plugins_1.plugins,
@@ -16,8 +16,22 @@ async function createBuilder(provider, options) {
16
16
  (0, builder_shared_1.debug)('add default plugins done');
17
17
  return {
18
18
  ...(0, builder_shared_1.pick)(pluginStore, ['addPlugins', 'removePlugins', 'isPluginExists']),
19
+ ...(0, builder_shared_1.pick)(pluginAPI, [
20
+ 'onBeforeBuild',
21
+ 'onBeforeCreateCompiler',
22
+ 'onBeforeStartDevServer',
23
+ 'onAfterBuild',
24
+ 'onAfterCreateCompiler',
25
+ 'onAfterStartDevServer',
26
+ 'onDevCompileDone',
27
+ 'onExit',
28
+ 'getHTMLPaths',
29
+ 'getBuilderConfig',
30
+ 'getNormalizedConfig',
31
+ ]),
19
32
  build,
20
33
  createCompiler,
34
+ initConfigs,
21
35
  inspectConfig,
22
36
  startDevServer,
23
37
  context: publicContext,
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export { createBuilder } from './createBuilder';
2
2
  export { mergeBuilderConfig } from '@modern-js/builder-shared';
3
- export type { BuilderMode, BuilderEntry, BuilderTarget, BuilderPlugin, BuilderContext, BuilderInstance, CreateBuilderOptions, InspectConfigOptions, } from '@modern-js/builder-shared';
3
+ export type { BuilderMode, BuilderEntry, BuilderTarget, BuilderPlugin, BuilderContext, BuilderInstance, CreateBuilderOptions, InspectConfigOptions, OnExitFn, OnAfterBuildFn, OnAfterCreateCompilerFn, OnAfterStartDevServerFn, OnBeforeBuildFn, OnBeforeStartDevServerFn, OnBeforeCreateCompilerFn, OnDevCompileDoneFn, ModifyBuilderConfigFn, } from '@modern-js/builder-shared';
@@ -0,0 +1,2 @@
1
+ import { DefaultBuilderPlugin } from '@modern-js/builder-shared';
2
+ export declare const PluginDevtool: () => DefaultBuilderPlugin;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PluginDevtool = void 0;
4
+ const builder_shared_1 = require("@modern-js/builder-shared");
5
+ const PluginDevtool = () => ({
6
+ name: 'builder-plugin-devtool',
7
+ setup(api) {
8
+ api.modifyBundlerChain((chain, { isProd }) => {
9
+ const config = api.getNormalizedConfig();
10
+ if (!(0, builder_shared_1.isUseJsSourceMap)(config)) {
11
+ chain.devtool(false);
12
+ }
13
+ else {
14
+ const devtool = isProd
15
+ ? // hide the source map URL in production to avoid Chrome warning
16
+ 'hidden-source-map'
17
+ : 'cheap-module-source-map';
18
+ chain.devtool(devtool);
19
+ }
20
+ });
21
+ },
22
+ });
23
+ exports.PluginDevtool = PluginDevtool;
@@ -0,0 +1,4 @@
1
+ import type { DefaultBuilderPlugin } from '@modern-js/builder-shared';
2
+ /** Filter source map files */
3
+ export declare const filterAsset: (asset: string) => boolean;
4
+ export declare const PluginFileSize: () => DefaultBuilderPlugin;
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.PluginFileSize = exports.filterAsset = void 0;
30
+ /**
31
+ * modified from https://github.com/facebook/create-react-app
32
+ * license at https://github.com/facebook/create-react-app/blob/master/LICENSE
33
+ */
34
+ const path_1 = __importDefault(require("path"));
35
+ const chalk_1 = __importDefault(require("@modern-js/utils/chalk"));
36
+ const builder_shared_1 = require("@modern-js/builder-shared");
37
+ /** Filter source map files */
38
+ const filterAsset = (asset) => !/\.map$/.test(asset);
39
+ exports.filterAsset = filterAsset;
40
+ const getAssetColor = (size) => {
41
+ if (size > 300 * 1000) {
42
+ return chalk_1.default.bold.red;
43
+ }
44
+ if (size > 100 * 1000) {
45
+ return chalk_1.default.yellow;
46
+ }
47
+ return chalk_1.default.green;
48
+ };
49
+ async function printHeader(longestFileLength, longestLabelLength) {
50
+ const longestLengths = [longestFileLength, longestLabelLength];
51
+ const headerRow = ['File', 'Size', 'Gzipped'].reduce((prev, cur, index) => {
52
+ const length = longestLengths[index];
53
+ let curLabel = cur;
54
+ if (length) {
55
+ curLabel =
56
+ cur.length < length ? cur + ' '.repeat(length - cur.length) : cur;
57
+ }
58
+ return `${prev + curLabel} `;
59
+ }, ' ');
60
+ builder_shared_1.logger.log(chalk_1.default.bold(chalk_1.default.blue(headerRow)));
61
+ }
62
+ async function printFileSizes(stats, distPath) {
63
+ const { fs, filesize, gzipSize, stripAnsi } = await Promise.resolve().then(() => __importStar(require('@modern-js/utils')));
64
+ const formatAsset = (asset) => {
65
+ const contents = fs.readFileSync(path_1.default.join(distPath, asset.name));
66
+ const size = contents.length;
67
+ const gzippedSize = gzipSize.sync(contents);
68
+ return {
69
+ size,
70
+ folder: path_1.default.join(path_1.default.basename(distPath), path_1.default.dirname(asset.name)),
71
+ name: path_1.default.basename(asset.name),
72
+ gzippedSize,
73
+ sizeLabel: filesize(size),
74
+ gzipSizeLabel: getAssetColor(gzippedSize)(filesize(gzippedSize)),
75
+ };
76
+ };
77
+ const multiStats = 'stats' in stats ? stats.stats : [stats];
78
+ const assets = multiStats
79
+ .map(stats => {
80
+ const origin = stats.toJson({
81
+ all: true,
82
+ assets: true,
83
+ groupAssetsByInfo: false,
84
+ groupAssetsByPath: false,
85
+ groupAssetsByChunk: false,
86
+ groupAssetsByExtension: false,
87
+ groupAssetsByEmitStatus: false,
88
+ });
89
+ const filteredAssets = origin.assets.filter(asset => (0, exports.filterAsset)(asset.name));
90
+ return filteredAssets.map(formatAsset);
91
+ })
92
+ .reduce((single, all) => all.concat(single), []);
93
+ if (assets.length === 0) {
94
+ return;
95
+ }
96
+ assets.sort((a, b) => b.size - a.size);
97
+ const longestLabelLength = Math.max(...assets.map(a => stripAnsi(a.sizeLabel).length));
98
+ const longestFileLength = Math.max(...assets.map(a => stripAnsi(a.folder + path_1.default.sep + a.name).length));
99
+ builder_shared_1.logger.info(`File sizes after production build:\n`);
100
+ printHeader(longestFileLength, longestLabelLength);
101
+ assets.forEach(asset => {
102
+ let { sizeLabel } = asset;
103
+ const { name, folder, gzipSizeLabel } = asset;
104
+ const fileNameLength = stripAnsi(folder + path_1.default.sep + name).length;
105
+ const sizeLength = stripAnsi(sizeLabel).length;
106
+ if (sizeLength < longestLabelLength) {
107
+ const rightPadding = ' '.repeat(longestLabelLength - sizeLength);
108
+ sizeLabel += rightPadding;
109
+ }
110
+ let fileNameLabel = chalk_1.default.dim(asset.folder + path_1.default.sep) + chalk_1.default.cyan(asset.name);
111
+ if (fileNameLength < longestFileLength) {
112
+ const rightPadding = ' '.repeat(longestFileLength - fileNameLength);
113
+ fileNameLabel += rightPadding;
114
+ }
115
+ builder_shared_1.logger.log(` ${fileNameLabel} ${sizeLabel} ${gzipSizeLabel}`);
116
+ });
117
+ builder_shared_1.logger.log('');
118
+ }
119
+ const PluginFileSize = () => ({
120
+ name: 'builder-plugin-file-size',
121
+ setup(api) {
122
+ api.onAfterBuild(async ({ stats }) => {
123
+ const config = api.getNormalizedConfig();
124
+ if (config.performance.printFileSize && stats) {
125
+ await printFileSizes(stats, api.context.distPath);
126
+ }
127
+ });
128
+ },
129
+ });
130
+ exports.PluginFileSize = PluginFileSize;
@@ -1,4 +1,7 @@
1
1
  export declare const plugins: {
2
2
  cleanOutput: () => Promise<import("@modern-js/builder-shared").DefaultBuilderPlugin>;
3
3
  startUrl: () => Promise<import("@modern-js/builder-shared").DefaultBuilderPlugin>;
4
+ fileSize: () => Promise<import("@modern-js/builder-shared").DefaultBuilderPlugin>;
5
+ devtool: () => Promise<import("@modern-js/builder-shared").DefaultBuilderPlugin>;
6
+ target: () => Promise<import("@modern-js/builder-shared").DefaultBuilderPlugin>;
4
7
  };
@@ -27,4 +27,7 @@ exports.plugins = void 0;
27
27
  exports.plugins = {
28
28
  cleanOutput: () => Promise.resolve().then(() => __importStar(require('./cleanOutput'))).then(m => m.PluginCleanOutput()),
29
29
  startUrl: () => Promise.resolve().then(() => __importStar(require('./startUrl'))).then(m => m.PluginStartUrl()),
30
+ fileSize: () => Promise.resolve().then(() => __importStar(require('./fileSize'))).then(m => m.PluginFileSize()),
31
+ devtool: () => Promise.resolve().then(() => __importStar(require('./devtool'))).then(m => m.PluginDevtool()),
32
+ target: () => Promise.resolve().then(() => __importStar(require('./target'))).then(m => m.PluginTarget()),
30
33
  };
@@ -0,0 +1,2 @@
1
+ import type { DefaultBuilderPlugin } from '@modern-js/builder-shared';
2
+ export declare const PluginTarget: () => DefaultBuilderPlugin;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PluginTarget = void 0;
4
+ const builder_shared_1 = require("@modern-js/builder-shared");
5
+ const PluginTarget = () => ({
6
+ name: 'builder-plugin-target',
7
+ setup(api) {
8
+ api.modifyBundlerChain(async (chain, { target }) => {
9
+ if (target === 'node') {
10
+ chain.target('node');
11
+ return;
12
+ }
13
+ const browserslist = await (0, builder_shared_1.getBrowserslist)(api.context.rootPath);
14
+ const basicTarget = target === 'web-worker' ? 'webworker' : 'web';
15
+ if (browserslist) {
16
+ chain.merge({ target: [basicTarget, 'browserslist'] });
17
+ }
18
+ else if (target === 'modern-web') {
19
+ chain.merge({ target: [basicTarget, 'es2015'] });
20
+ }
21
+ else {
22
+ chain.merge({ target: [basicTarget, 'es5'] });
23
+ }
24
+ });
25
+ },
26
+ });
27
+ exports.PluginTarget = PluginTarget;
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "engines": {
15
15
  "node": ">=14.0.0"
16
16
  },
17
- "version": "2.0.0-beta.3",
17
+ "version": "2.0.0-beta.6",
18
18
  "jsnext:source": "./src/index.ts",
19
19
  "types": "./dist/index.d.ts",
20
20
  "main": "./dist/index.js",
@@ -27,8 +27,8 @@
27
27
  }
28
28
  },
29
29
  "dependencies": {
30
- "@modern-js/builder-shared": "2.0.0-beta.3",
31
- "@modern-js/utils": "2.0.0-beta.3"
30
+ "@modern-js/builder-shared": "2.0.0-beta.6",
31
+ "@modern-js/utils": "2.0.0-beta.6"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@babel/core": "7.18.0",
@@ -36,7 +36,7 @@
36
36
  "@types/babel__preset-env": "^7.9.2",
37
37
  "@types/node": "^14",
38
38
  "typescript": "^4",
39
- "@scripts/vitest-config": "2.0.0-beta.3"
39
+ "@scripts/vitest-config": "2.0.0-beta.6"
40
40
  },
41
41
  "publishConfig": {
42
42
  "registry": "https://registry.npmjs.org/",
@@ -0,0 +1,18 @@
1
+ import { defineConfig } from 'vitest/config';
2
+ import { withTestPreset } from '@scripts/vitest-config';
3
+ import path from 'path';
4
+
5
+ const config = defineConfig({
6
+ resolve: {
7
+ alias: {
8
+ '~': path.resolve(__dirname),
9
+ '@': path.resolve(__dirname, 'src'),
10
+ }
11
+ },
12
+ test: {
13
+ root: __dirname,
14
+ environment: 'node',
15
+ },
16
+ });
17
+
18
+ export default withTestPreset(config);