diff --git a/.changeset/nasty-turkeys-live.md b/.changeset/nasty-turkeys-live.md new file mode 100644 index 0000000..7073823 --- /dev/null +++ b/.changeset/nasty-turkeys-live.md @@ -0,0 +1,17 @@ +--- +"unicode-segmenter": patch +--- + +Fix bloat in the NPM package. + +`package.tgz` was mostly bloated by CommonJS interop and sourcemap. + +However, sourcemap isn't necessary here as it uses sources as is, +and the CommonJS shouldn't be different. + +Now fixed by simpler transpilation for CommoJS entries, and removed sourcemap files. +Also removed inaccessible entries. + +So the unpacked total package size has been **down to 135 KB from 250 KB** + +Note: Node.js v22 will stabilize `require(ESM)`, which will allow CommonJS projects to use this package without having to maintain separate entries. I'm very excited about that, and looking forward to it becoming more "common". The first major release may consider ending support for CommonJS entries and TypeScript's `"Node"` resolution. diff --git a/.gitignore b/.gitignore index 09a1540..d641a1e 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ node_modules/ /*.cjs /*.cjs.map /bundle/ +*.tgz lcov.info diff --git a/package.json b/package.json index 2d57ddb..811e1f3 100644 --- a/package.json +++ b/package.json @@ -39,15 +39,14 @@ }, "sideEffects": [ "./intl-polyfill.js", - "./intl-polyfill.cjs", - "./bundle/intl-polyfill.js" + "./intl-polyfill.cjs" ], "publishConfig": { "main": "./index.js", "types": "./index.d.ts", "exports": { ".": { - "types": "./grapheme.d.ts", + "types": "./index.d.ts", "import": "./index.js", "require": "./index.cjs" }, @@ -81,16 +80,13 @@ "import": "./intl-polyfill.js", "require": "./intl-polyfill.cjs" }, - "./bundle/*": "./bundle/*", "./package.json": "./package.json" } }, "files": [ "/*.js", "/*.cjs", - "/*.cjs.map", "/*.d.ts", - "/src", "/licenses" ], "scripts": { @@ -114,10 +110,13 @@ "process": false }, "devDependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", "@changesets/cli": "^2.27.10", "@formatjs/intl-segmenter": "11.5.7", "@mitata/counters": "^0.0.1", "@react-native/metro-babel-transformer": "^0.75.2", + "@types/babel__core": "^7", "@types/node": "^22.10.1", "@types/xregexp": "^4.4.0", "emoji-regex": "10.4.0", diff --git a/scripts/build-exports.js b/scripts/build-exports.js index bd5dec2..6752aa6 100644 --- a/scripts/build-exports.js +++ b/scripts/build-exports.js @@ -1,6 +1,7 @@ import * as path from 'node:path'; import * as fs from 'node:fs/promises'; +import { transformFileAsync } from '@babel/core'; import { build } from 'esbuild'; let rootDir = path.join(import.meta.dirname, '..'); @@ -28,20 +29,45 @@ function rewriteCjs(content) { ), ); - let { outputFiles: cjsOutputs } = await build({ - entryPoints: modules.map(src), - outdir: distDir, - outExtension: { '.js': '.cjs' }, - format: 'cjs', - treeShaking: true, - write: false, - sourcemap: true, - }); await Promise.all( - cjsOutputs.map( - ({ path, text }) => fs.writeFile(path, rewriteCjs(text), 'utf8'), + modules.map( + async module => { + const result = await transformFileAsync(dist(module), { + plugins: [ + ['@babel/plugin-transform-modules-commonjs', { + loose: true, + strict: true, + lazy: false, + importInterop: 'none', + }], + ], + assumptions: { + enumerableModuleMeta: true, + constantReexports: true, + }, + }); + await fs.writeFile( + dist(module).replace('.js', '.cjs'), + rewriteCjs(result.code), + ); + }, ), ); + // let { outputFiles: cjsOutputs } = await build({ + // entryPoints: modules.map(dist), + // outdir: distDir, + // bundle: false, + // outExtension: { '.js': '.cjs' }, + // format: 'cjs', + // platform: 'node', + // write: false, + // sourcemap: true, + // }); + // await Promise.all( + // cjsOutputs.map( + // ({ path, text }) => fs.writeFile(path, rewriteCjs(text), 'utf8'), + // ), + // ); } { diff --git a/yarn.lock b/yarn.lock index 57a1a1d..0e705b1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -73,7 +73,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.25.2": +"@babel/core@npm:^7.25.2, @babel/core@npm:^7.26.0": version: 7.26.0 resolution: "@babel/core@npm:7.26.0" dependencies: @@ -351,6 +351,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-plugin-utils@npm:7.25.9" + checksum: 10c0/483066a1ba36ff16c0116cd24f93de05de746a603a777cd695ac7a1b034928a65a4ecb35f255761ca56626435d7abdb73219eba196f9aa83b6c3c3169325599d + languageName: node + linkType: hard + "@babel/helper-remap-async-to-generator@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-remap-async-to-generator@npm:7.24.7" @@ -550,6 +557,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7": + version: 7.26.3 + resolution: "@babel/parser@npm:7.26.3" + dependencies: + "@babel/types": "npm:^7.26.3" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/48f736374e61cfd10ddbf7b80678514ae1f16d0e88bc793d2b505d73d9b987ea786fc8c2f7ee8f8b8c467df062030eb07fd0eb2168f0f541ca1f542775852cad + languageName: node + linkType: hard + "@babel/parser@npm:^7.13.16, @babel/parser@npm:^7.20.0, @babel/parser@npm:^7.24.7": version: 7.24.7 resolution: "@babel/parser@npm:7.24.7" @@ -948,6 +966,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-commonjs@npm:^7.26.3": + version: 7.26.3 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.26.3" + dependencies: + "@babel/helper-module-transforms": "npm:^7.26.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/82e59708f19f36da29531a64a7a94eabbf6ff46a615e0f5d9b49f3f59e8ef10e2bac607d749091508d3fa655146c9e5647c3ffeca781060cdabedb4c7a33c6f2 + languageName: node + linkType: hard + "@babel/plugin-transform-named-capturing-groups-regex@npm:^7.0.0": version: 7.24.7 resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.24.7" @@ -1364,6 +1394,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.26.3": + version: 7.26.3 + resolution: "@babel/types@npm:7.26.3" + dependencies: + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10c0/966c5242c5e55c8704bf7a7418e7be2703a0afa4d19a8480999d5a4ef13d095dd60686615fe5983cb7593b4b06ba3a7de8d6ca501c1d78bdd233a10d90be787b + languageName: node + linkType: hard + "@babel/types@npm:^7.24.7": version: 7.24.7 resolution: "@babel/types@npm:7.24.7" @@ -2246,6 +2286,47 @@ __metadata: languageName: node linkType: hard +"@types/babel__core@npm:^7": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" + dependencies: + "@babel/parser": "npm:^7.20.7" + "@babel/types": "npm:^7.20.7" + "@types/babel__generator": "npm:*" + "@types/babel__template": "npm:*" + "@types/babel__traverse": "npm:*" + checksum: 10c0/bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff + languageName: node + linkType: hard + +"@types/babel__generator@npm:*": + version: 7.6.8 + resolution: "@types/babel__generator@npm:7.6.8" + dependencies: + "@babel/types": "npm:^7.0.0" + checksum: 10c0/f0ba105e7d2296bf367d6e055bb22996886c114261e2cb70bf9359556d0076c7a57239d019dee42bb063f565bade5ccb46009bce2044b2952d964bf9a454d6d2 + languageName: node + linkType: hard + +"@types/babel__template@npm:*": + version: 7.4.4 + resolution: "@types/babel__template@npm:7.4.4" + dependencies: + "@babel/parser": "npm:^7.1.0" + "@babel/types": "npm:^7.0.0" + checksum: 10c0/cc84f6c6ab1eab1427e90dd2b76ccee65ce940b778a9a67be2c8c39e1994e6f5bbc8efa309f6cea8dc6754994524cd4d2896558df76d92e7a1f46ecffee7112b + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*": + version: 7.20.6 + resolution: "@types/babel__traverse@npm:7.20.6" + dependencies: + "@babel/types": "npm:^7.20.7" + checksum: 10c0/7ba7db61a53e28cac955aa99af280d2600f15a8c056619c05b6fc911cbe02c61aa4f2823299221b23ce0cce00b294c0e5f618ec772aa3f247523c2e48cf7b888 + languageName: node + linkType: hard + "@types/estree@npm:1.0.6": version: 1.0.6 resolution: "@types/estree@npm:1.0.6" @@ -5820,10 +5901,13 @@ __metadata: version: 0.0.0-use.local resolution: "unicode-segmenter@workspace:." dependencies: + "@babel/core": "npm:^7.26.0" + "@babel/plugin-transform-modules-commonjs": "npm:^7.26.3" "@changesets/cli": "npm:^2.27.10" "@formatjs/intl-segmenter": "npm:11.5.7" "@mitata/counters": "npm:^0.0.1" "@react-native/metro-babel-transformer": "npm:^0.75.2" + "@types/babel__core": "npm:^7" "@types/node": "npm:^22.10.1" "@types/xregexp": "npm:^4.4.0" emoji-regex: "npm:10.4.0"