Skip to content

Commit 8461d7d

Browse files
feat: separate minify from build, generate separate bundles
1 parent 71f2868 commit 8461d7d

File tree

10 files changed

+127
-4
lines changed

10 files changed

+127
-4
lines changed

charts/legend/package.json

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"types": "./dist/types/index.d.ts",
88
"license": "Apache-2.0",
99
"scripts": {
10-
"build": "lg-build bundle",
10+
"build": "lg-build bundle && lg-build minify",
1111
"tsc": "lg-build tsc",
1212
"docs": "lg-build docs"
1313
},
@@ -41,8 +41,18 @@
4141
".": {
4242
"types": "./dist/types/index.d.ts",
4343
"types@<=5.0": "./dist/types/ts4.9/index.d.ts",
44-
"import": "./dist/esm/index.js",
45-
"require": "./dist/umd/index.js"
44+
"import": {
45+
"browser": {
46+
"production": "./dist/esm/index-min.js"
47+
},
48+
"default": "./dist/esm/index.js"
49+
},
50+
"require": {
51+
"browser": {
52+
"production": "./dist/umd/index-min.js"
53+
},
54+
"default": "./dist/umd/index.js"
55+
}
4656
}
4757
},
4858
"typesVersions": {}

charts/legend/rollup.config.mjs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import defaultConfig, {
2+
esmConfig,
3+
umdConfig,
4+
} from '@lg-tools/build/config/rollup.config.mjs';
5+
6+
const esmConstantsConfig = {
7+
...esmConfig,
8+
// remove terser plugin
9+
plugins: [...esmConfig.plugins.filter(plugin => plugin.name !== 'terser')],
10+
};
11+
const umdConstantsConfig = {
12+
...umdConfig,
13+
// remove terser plugin
14+
plugins: [...umdConfig.plugins.filter(plugin => plugin.name !== 'terser')],
15+
};
16+
17+
export default [...defaultConfig, esmConstantsConfig, umdConstantsConfig];

pnpm-lock.yaml

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tools/build/config/rollup.config.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ const createConfigForFormat = (format, overrides) => {
6363
babelHelpers: 'bundled',
6464
extensions,
6565
configFile: babelConfigPath,
66-
sourceMaps: 'inline',
66+
sourceMaps: true,
6767
envName: 'production',
6868
}),
6969

tools/build/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
"rollup-plugin-bundle-stats": "^4.18.2",
4949
"rollup-plugin-node-externals": "7.1.1",
5050
"rollup-plugin-polyfill-node": "0.13.0",
51+
"terser": "^5.43.1",
5152
"typescript": "~5.8.0"
5253
},
5354
"peerDependencies": {

tools/build/src/cli-commands.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Command } from 'commander';
33
import { buildPackage } from './rollup/build-package';
44
import { buildTSDoc } from './tsdoc/build-tsdoc';
55
import { buildTypescript } from './typescript/build-ts';
6+
import { minifyPackage } from './minify';
67

78
export function registerBundleCommand(command: Command) {
89
command
@@ -36,3 +37,15 @@ export function registerBuildDocsCommand(command: Command) {
3637
.option('-v, --verbose', 'Enable verbose logging', false)
3738
.action(buildTSDoc);
3839
}
40+
41+
export function registerMinifyCommand(command: Command) {
42+
command
43+
.description('Minify built JavaScript bundles')
44+
.option(
45+
'-p, --glob <glob>',
46+
'Glob pattern to match javascript files to minify, prefixed with ! to exclude',
47+
['dist/**/*.js', '!dist/**/*-min.js'],
48+
)
49+
.option('-v, --verbose', 'Enable verbose logging', false)
50+
.action(minifyPackage);
51+
}

tools/build/src/cli.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
registerBuildDocsCommand,
55
registerBuildTSCommand,
66
registerBundleCommand,
7+
registerMinifyCommand,
78
} from './cli-commands';
89

910
const build = new Command('lg-build');
@@ -12,5 +13,6 @@ build.description('Build LeafyGreen packages');
1213
registerBundleCommand(build.command('bundle'));
1314
registerBuildTSCommand(build.command('tsc'));
1415
registerBuildDocsCommand(build.command('docs'));
16+
registerMinifyCommand(build.command('minify'));
1517

1618
build.parse(process.argv);

tools/build/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ export {
33
registerBuildDocsCommand,
44
registerBuildTSCommand,
55
registerBundleCommand,
6+
registerMinifyCommand,
67
} from './cli-commands';
8+
export { minifyPackage } from './minify';
79
export { buildPackage } from './rollup/build-package';
810
export { buildTSDoc } from './tsdoc/build-tsdoc';
911
export { parseTSDoc } from './tsdoc/tsdocParser';

tools/build/src/minify.ts

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/* eslint-disable no-console */
2+
import fs from 'fs';
3+
import { glob } from 'glob';
4+
import path from 'path';
5+
import { minify_sync } from 'terser';
6+
7+
interface MinifyOptions {
8+
verbose: boolean;
9+
glob: Array<string>;
10+
}
11+
12+
export function minifyPackage({ verbose, glob: globPatterns }: MinifyOptions) {
13+
// Find all compiled JavaScript files in dist directories for this package
14+
// Exclude already minified files (e.g., `*-min.js`)
15+
const [include, exclude] = [
16+
globPatterns.filter(g => !g.startsWith('!')),
17+
globPatterns.filter(g => g.startsWith('!')).map(g => g.slice(1)),
18+
];
19+
20+
const jsFiles = glob.sync(include, {
21+
ignore: exclude,
22+
});
23+
24+
if (verbose) {
25+
console.log('Found JavaScript files to minify:', jsFiles);
26+
}
27+
28+
for (const jsFile of jsFiles) {
29+
const dir = path.dirname(jsFile);
30+
const ext = path.extname(jsFile);
31+
const name = path.basename(jsFile, ext);
32+
const existingSourceMapFile = path.join(dir, `${name}${ext}.map`);
33+
const minifiedFile = path.join(dir, `${name}-min${ext}`);
34+
const minifiedFileMap = path.join(dir, `${name}-min${ext}.map`);
35+
36+
try {
37+
if (verbose) {
38+
console.log(`Minifying ${jsFile} -> ${minifiedFile}`);
39+
}
40+
41+
const fileContent = fs.readFileSync(jsFile, 'utf8');
42+
const existingSourceMapContent = fs.readFileSync(
43+
existingSourceMapFile,
44+
'utf8',
45+
);
46+
47+
const isEsm = ext === '.mjs' || jsFile.includes('/esm/') || undefined;
48+
49+
const minified = minify_sync(fileContent, {
50+
sourceMap: {
51+
filename: path.basename(minifiedFile),
52+
content: existingSourceMapContent,
53+
url: path.basename(minifiedFileMap),
54+
},
55+
module: isEsm,
56+
compress: true,
57+
mangle: true,
58+
});
59+
60+
fs.writeFileSync(minifiedFile, minified.code!);
61+
fs.writeFileSync(minifiedFileMap, minified.map! as string);
62+
63+
if (verbose) {
64+
console.log(`✓ Minified ${jsFile}`);
65+
}
66+
} catch (error) {
67+
console.error(`✗ Failed to minify ${jsFile}:`, error);
68+
throw error;
69+
}
70+
}
71+
72+
console.log(`✓ Minified ${jsFiles.length} javascript files.`);
73+
}

tools/cli/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
registerBuildDocsCommand,
33
registerBuildTSCommand,
44
registerBundleCommand,
5+
registerMinifyCommand,
56
} from '@lg-tools/build';
67
import { migrator } from '@lg-tools/codemods';
78
import { createPackage } from '@lg-tools/create';
@@ -232,6 +233,7 @@ cli
232233
registerBundleCommand(cli.command('build-package'));
233234
registerBuildTSCommand(cli.command('build-ts'));
234235
registerBuildDocsCommand(cli.command('build-tsdoc'));
236+
registerMinifyCommand(cli.command('build-minify'));
235237

236238
/** Merge editor settings */
237239
cli

0 commit comments

Comments
 (0)