diff --git a/package-lock.json b/package-lock.json index 7db0d43de0f..267f2d2a643 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12397,6 +12397,15 @@ "node": ">=4" } }, + "node_modules/css-color-names": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.1.tgz", + "integrity": "sha512-i7o8lqlrmiG/EUzlBftBncsrkYgBCfCI9X6plNxdyXMZlMNd4hPX7u/o7YLH9vwXPPPAr+BUs3R0oto+lzjbyA==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/css-declaration-sorter": { "version": "7.2.0", "dev": true, @@ -12492,6 +12501,43 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css-selector-tokenizer": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "node_modules/css-shorthand-expand": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-shorthand-expand/-/css-shorthand-expand-1.2.0.tgz", + "integrity": "sha512-L3RS1VNYuXgMOfVGX4WzP9AFK6KL0JuioSoO8661egEac2eHX9/s4yFO8mgK6QEtm8UmU8IvuKzPgdQpU0DhpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-color-names": "0.0.1", + "css-url-regex": "0.0.1", + "hex-color-regex": "^1.0.1", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "map-obj": "^1.0.0", + "repeat-element": "^1.1.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/css-shorthand-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.2.tgz", + "integrity": "sha512-C2AugXIpRGQTxaCW0N7n5jD/p5irUmCrwl03TrnMFBHDbdq44CFWR2zO7rK9xPN4Eo3pUxC4vQzQgbIpzrD1PQ==", + "dev": true, + "license": "MIT" + }, "node_modules/css-to-react-native": { "version": "3.2.0", "license": "MIT", @@ -12513,6 +12559,13 @@ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, + "node_modules/css-url-regex": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-0.0.1.tgz", + "integrity": "sha512-nFtRgFyJUwz9pyMpyscglpHEFdEJ+y2Q8pK33I99gzhUV1OFzS3t5DtIop3VWLIoGFr4mWcM4hJuWPLXn1NXgA==", + "dev": true, + "license": "MIT" + }, "node_modules/css-what": { "version": "6.1.0", "license": "BSD-2-Clause", @@ -12666,6 +12719,70 @@ "dev": true, "license": "CC0-1.0" }, + "node_modules/cssstats": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/cssstats/-/cssstats-4.0.5.tgz", + "integrity": "sha512-Q5vVJAlR1OgZppst4Qkn0mYADVan/8fNgd6cGpANk2mC+jFKUWjaC0T7Byvr0yWWRWOTIv6Y2g1eL0csmorPbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.0", + "css-selector-tokenizer": "^0.7.3", + "css-shorthand-expand": "^1.2.0", + "gzip-size": "^6.0.0", + "has-class-selector": "^4.0.0", + "has-element-selector": "^4.0.0", + "has-id-selector": "^4.0.0", + "has-pseudo-class": "^4.0.0", + "has-pseudo-element": "^4.0.0", + "is-blank": "^2.1.0", + "is-css-shorthand": "^1.0.1", + "is-present": "^1.0.0", + "is-vendor-prefixed": "^4.0.0", + "lodash": "^4.17.20", + "postcss": "^8.1.4", + "postcss-custom-properties": "^12.1.6", + "postcss-safe-parser": "^5.0.2", + "specificity": "^0.4.1" + } + }, + "node_modules/cssstats/node_modules/postcss-custom-properties": { + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/cssstats/node_modules/postcss-safe-parser": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz", + "integrity": "sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^8.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, "node_modules/csstype": { "version": "3.1.3", "license": "MIT" @@ -15130,6 +15247,13 @@ "node": ">= 4.9.1" } }, + "node_modules/fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true, + "license": "MIT" + }, "node_modules/fastq": { "version": "1.17.1", "dev": true, @@ -15891,6 +16015,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-class-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-class-selector/-/has-class-selector-4.0.0.tgz", + "integrity": "sha512-vHI2AQG8kvJAxcQCOdG8aUiTHhUnmGt40f/3KJtiWLFNvt3YlcbdbWJAoZIs0hirQoFN+P8NIwpJMb7LRkkuSA==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-element-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-element-selector/-/has-element-selector-4.0.0.tgz", + "integrity": "sha512-L85fbzBoV78AqC5X34wlfp3qev+hzXEEtqSOXoPDXFtIBmFn4sxVlsIUtTZQA/2hu7dt9xpuqWDB+GS4Y7tbRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-selector-tokenizer": "^0.7.3" + } + }, "node_modules/has-flag": { "version": "3.0.0", "license": "MIT", @@ -15898,6 +16039,13 @@ "node": ">=4" } }, + "node_modules/has-id-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-id-selector/-/has-id-selector-4.0.0.tgz", + "integrity": "sha512-JSCvmyVpsn4p4Bjt+u8vbydNAK3m5Ixu+cF/B1X9gRHBQan4Bkd/eE/jQ191O2KofObLHyeTWfrzfbTA/0NRIg==", + "dev": true, + "license": "MIT" + }, "node_modules/has-property-descriptors": { "version": "1.0.2", "dev": true, @@ -15923,6 +16071,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-pseudo-class": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-pseudo-class/-/has-pseudo-class-4.0.0.tgz", + "integrity": "sha512-H9NPtMTs85zQ9drMtGqSdQcmqr4oprxCdUVyldwsHXHQO33fzIpX/X96iBovmu8YIdaQ6XGg9ZxPrBifjcfILg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pseudo-classes": "1.0.0" + } + }, + "node_modules/has-pseudo-element": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-pseudo-element/-/has-pseudo-element-4.0.0.tgz", + "integrity": "sha512-JibJn1za1U1ue/hxmVIwR+NdX0tYfpltzQNqLADKeyMlUbfCo16jUvX9ZmMgS3OpQw4WSSedTrTk9KokzswuxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pseudo-elements": "1.1.0" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "license": "MIT", @@ -15983,6 +16151,13 @@ "hermes-estree": "0.25.1" } }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true, + "license": "MIT" + }, "node_modules/history": { "version": "5.3.0", "license": "MIT", @@ -16028,6 +16203,20 @@ "dev": true, "license": "ISC" }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==", + "dev": true, + "license": "MIT" + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==", + "dev": true, + "license": "MIT" + }, "node_modules/hsluv": { "version": "1.0.1", "license": "MIT" @@ -16389,6 +16578,17 @@ "node": ">=8" } }, + "node_modules/is-blank": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-blank/-/is-blank-2.1.0.tgz", + "integrity": "sha512-SOPvTu4ZRlJOSBBYV7+6D6wN+2UcN6IJCaQ2Yeu3BQ3oolsD4dqF95sz52TCSgMVCLR1osLOXIiFsO2TKp0GZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-empty": "latest", + "is-whitespace": "latest" + } + }, "node_modules/is-boolean-object": { "version": "1.2.2", "dev": true, @@ -16437,6 +16637,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-css-shorthand": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-css-shorthand/-/is-css-shorthand-1.0.1.tgz", + "integrity": "sha512-SXXTYSufuLvRBofGIlg7nGnD+a7eWePl6yKqoKsmYGN29RQL85AaNPr7lttF1JkGLQA7IBWvLnHxe/bAObRCOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-shorthand-properties": "^1.0.0" + } + }, "node_modules/is-data-view": { "version": "1.0.2", "dev": true, @@ -16689,6 +16899,33 @@ "dev": true, "license": "MIT" }, + "node_modules/is-present": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-present/-/is-present-1.0.0.tgz", + "integrity": "sha512-k3hcumGPxoqTO0fs5aoomkyDjViXgb7lWBB/iFIn+zg9EepNJwUJmi+BzD3k2i0fNTMWYRBHGLOTPtOEzFREVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-blank": "1.0.0" + } + }, + "node_modules/is-present/node_modules/is-blank": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-blank/-/is-blank-1.0.0.tgz", + "integrity": "sha512-TdhL1rVh1YmRNeVCEMXacXGTHNczcprPR1+jym5Hbnpa8qLoIMtMmjpU1d7Y0YdCcco2PAvARdnLQ6Thx/jaew==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-empty": "0.0.1", + "is-whitespace": "^0.3.0" + } + }, + "node_modules/is-present/node_modules/is-empty": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/is-empty/-/is-empty-0.0.1.tgz", + "integrity": "sha512-jYWXLEBmq8udg0gP7mw8tmyd9Yahzzp3kfLdcXj7ydkeVxjQkQ82U/Fx1sJRUMfkpO6vDGjWfke1tK8XYv+T5Q==", + "dev": true + }, "node_modules/is-promise": { "version": "4.0.0", "license": "MIT" @@ -16826,6 +17063,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-vendor-prefixed": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-vendor-prefixed/-/is-vendor-prefixed-4.0.0.tgz", + "integrity": "sha512-IOs6nB0cELr2AfldQbfGf5urbX74pYE2Z9sULu2yeQswqodxtQZwi+avzSGM6AVJ5KbvfStd8lH/ooZ+B5cdUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "vendor-prefixes": "1.0.0" + } + }, "node_modules/is-weakmap": { "version": "2.0.2", "dev": true, @@ -16871,6 +17118,16 @@ "dev": true, "license": "MIT" }, + "node_modules/is-whitespace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", + "integrity": "sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-windows": { "version": "1.0.2", "dev": true, @@ -17618,6 +17875,16 @@ "url": "https://github.com/fisker/make-synchronized?sponsor=1" } }, + "node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/markdown-it": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", @@ -21663,6 +21930,20 @@ "license": "MIT", "optional": true }, + "node_modules/pseudo-classes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pseudo-classes/-/pseudo-classes-1.0.0.tgz", + "integrity": "sha512-s3l2tOm0vTmDL4muvRfGMnAxJ0kYSeuZu+wOjNTHsm/4UtDGBZ8sMl0jPwwJgo+wRw2EQqVjqHdjIUcLzGgnJw==", + "dev": true, + "license": "MIT" + }, + "node_modules/pseudo-elements": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pseudo-elements/-/pseudo-elements-1.1.0.tgz", + "integrity": "sha512-+Lhs/odu0/h4slKf1/vvAIwrsl+1LNPb1cllAmVsf+yW/k3pE8wTZRqsdCToeu+zzeixGk+q3uuArFd0cl2Aiw==", + "dev": true, + "license": "MIT" + }, "node_modules/psl": { "version": "1.9.0", "dev": true, @@ -22287,6 +22568,16 @@ "type-fest": "^4.40.1" } }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-directory": { "version": "2.1.1", "dev": true, @@ -22380,6 +22671,20 @@ "node": ">=0.10.0" } }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==", + "dev": true, + "license": "MIT" + }, "node_modules/rimraf": { "version": "5.0.5", "dev": true, @@ -23420,6 +23725,16 @@ "dev": true, "license": "CC0-1.0" }, + "node_modules/specificity": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", + "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", + "dev": true, + "license": "MIT", + "bin": { + "specificity": "bin/specificity" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "dev": true, @@ -26336,6 +26651,13 @@ "node": ">= 0.8" } }, + "node_modules/vendor-prefixes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vendor-prefixes/-/vendor-prefixes-1.0.0.tgz", + "integrity": "sha512-oWOptgqBs948A3V9TmAUcVFvb0dJgmeHrcIcWq4rqtmCfaRs93t0+DfJu90V5n3drN0CKBYm4BTi9yvWyKXA+g==", + "dev": true, + "license": "MIT" + }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", @@ -27709,7 +28031,7 @@ }, "packages/react": { "name": "@primer/react", - "version": "38.21.1", + "version": "38.22.0", "license": "MIT", "dependencies": { "@github/mini-throttle": "^2.1.1", @@ -27788,6 +28110,7 @@ "concurrently": "9.1.2", "copyfiles": "2.4.1", "cross-env": "7.0.3", + "cssstats": "^4.0.5", "fast-glob": "3.3.2", "filesize": "10.1.6", "front-matter": "4.0.2", @@ -28082,7 +28405,7 @@ }, "packages/styled-react": { "name": "@primer/styled-react", - "version": "1.0.6", + "version": "1.0.7", "dependencies": { "@styled-system/css": "^5.1.5", "@styled-system/props": "^5.1.5", @@ -28099,7 +28422,7 @@ "@babel/preset-react": "^7.28.5", "@babel/preset-typescript": "^7.28.5", "@primer/primitives": "10.x || 11.x", - "@primer/react": "^38.20.0", + "@primer/react": "^38.22.0", "@rollup/plugin-babel": "^6.1.0", "@storybook/react-vite": "^10.3.3", "@types/react": "18.3.11", diff --git a/packages/react/package.json b/packages/react/package.json index 083ec949124..31072eef698 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -150,6 +150,7 @@ "concurrently": "9.1.2", "copyfiles": "2.4.1", "cross-env": "7.0.3", + "cssstats": "^4.0.5", "fast-glob": "3.3.2", "filesize": "10.1.6", "front-matter": "4.0.2", diff --git a/packages/react/script/get-export-sizes.cjs b/packages/react/script/get-export-sizes.cjs index 72388794319..6871b5f20ac 100644 --- a/packages/react/script/get-export-sizes.cjs +++ b/packages/react/script/get-export-sizes.cjs @@ -7,22 +7,41 @@ const commonjs = require('@rollup/plugin-commonjs') const {nodeResolve} = require('@rollup/plugin-node-resolve') const virtual = require('@rollup/plugin-virtual') const json = require('@rollup/plugin-json') +const cssstats = require('cssstats') const {filesize} = require('filesize') const {rollup} = require('rollup') const {minify} = require('terser') const gzipSize = require('gzip-size') -const noopCSSModules = { - name: 'empty-css-modules', +function createCSSModulesCollector(cssModules, cssImportsByImporter) { + return { + name: 'collect-css-modules', - transform(_code, id) { - if (!id.endsWith('.css')) { - return - } - return { - code: `export default {}`, - } - }, + resolveId(source, importer) { + if (!source.endsWith('.css') || !importer) { + return null + } + + const id = path.resolve(path.dirname(importer), source) + const imports = cssImportsByImporter.get(importer) ?? new Set() + imports.add(id) + cssImportsByImporter.set(importer, imports) + + return null + }, + + async transform(_code, id) { + if (!id.endsWith('.css')) { + return + } + + cssModules.set(id, await fs.readFile(id, 'utf8')) + + return { + code: `export default {}`, + } + }, + } } async function main() { @@ -47,6 +66,8 @@ async function main() { core.info(`Analyzing entrypoint: ${entrypoint.entrypoint}`) const filepath = path.resolve(rootDirectory, entrypoint.filepath) + const cssModules = new Map() + const cssImportsByImporter = new Map() const bundle = await rollup({ input: filepath, external, @@ -56,7 +77,7 @@ async function main() { include: [/node_modules/], }), json(), - noopCSSModules, + createCSSModulesCollector(cssModules, cssImportsByImporter), ], onwarn: () => {}, }) @@ -64,6 +85,7 @@ async function main() { format: 'esm', }) const minified = await minify(output[0].code) + const css = await getCSSInfo(cssModules, cssImportsByImporter, output[0]) const exports = [] core.startGroup('Analyzing exports...') @@ -71,6 +93,8 @@ async function main() { for (const identifier of output[0].exports) { core.info(`Analyzing export: ${identifier}`) + const exportCSSModules = new Map() + const exportCSSImportsByImporter = new Map() const reexport = await rollup({ input: '__entrypoint__', external, @@ -79,7 +103,7 @@ async function main() { commonjs({ include: /node_modules/, }), - noopCSSModules, + createCSSModulesCollector(exportCSSModules, exportCSSImportsByImporter), json(), virtual({ __entrypoint__: `export { ${identifier} } from '${filepath}';`, @@ -91,6 +115,7 @@ async function main() { format: 'esm', }) const minified = await minify(output[0].code) + const css = await getCSSInfo(exportCSSModules, exportCSSImportsByImporter, output[0]) exports.push({ identifier, @@ -98,6 +123,7 @@ async function main() { minified: Buffer.byteLength(minified.code), gzipUnminified: await gzipSize(output[0].code), gzipMinified: await gzipSize(minified.code), + css, }) } @@ -109,6 +135,7 @@ async function main() { minified: Buffer.byteLength(minified.code), gzipUnminified: await gzipSize(output[0].code), gzipMinified: await gzipSize(minified.code), + css, exports, }) } @@ -126,6 +153,30 @@ async function main() { data: 'Export', header: true, }, + { + data: 'CSS Gzip', + header: true, + }, + { + data: 'CSS Size', + header: true, + }, + { + data: 'CSS Rules', + header: true, + }, + { + data: 'CSS Selectors', + header: true, + }, + { + data: 'CSS Declarations', + header: true, + }, + { + data: 'CSS Specificity (max)', + header: true, + }, { data: 'Gzip', header: true, @@ -152,6 +203,12 @@ async function main() { [ entrypoint.entrypoint === '.' ? '@primer/react' : path.join('@primer/react', entrypoint.entrypoint), '*', + filesize(entrypoint.css.gzip), + filesize(entrypoint.css.size), + String(entrypoint.css.stats.rules.total), + String(entrypoint.css.stats.selectors.total), + String(entrypoint.css.stats.declarations.total), + String(entrypoint.css.stats.selectors.specificity.max), filesize(entrypoint.gzipMinified), filesize(entrypoint.gzipUnminified), filesize(entrypoint.minified), @@ -165,6 +222,12 @@ async function main() { return [ '', exportInfo.identifier, + filesize(exportInfo.css.gzip), + filesize(exportInfo.css.size), + String(exportInfo.css.stats.rules.total), + String(exportInfo.css.stats.selectors.total), + String(exportInfo.css.stats.declarations.total), + String(exportInfo.css.stats.selectors.specificity.max), filesize(exportInfo.gzipMinified), filesize(exportInfo.gzipUnminified), filesize(exportInfo.minified), @@ -178,6 +241,54 @@ async function main() { } } +async function getCSSInfo(cssModules, cssImportsByImporter, chunk) { + const cssModuleIds = new Set() + + if (chunk.type === 'chunk') { + for (const moduleId of Object.keys(chunk.modules)) { + if (cssModules.has(moduleId)) { + cssModuleIds.add(moduleId) + } + + const imports = cssImportsByImporter.get(moduleId) + if (imports) { + for (const id of imports) { + cssModuleIds.add(id) + } + } + } + } + + const code = Array.from(cssModuleIds, id => cssModules.get(id)).join('\n') + + if (code.length === 0) { + return { + size: 0, + gzip: 0, + stats: { + rules: { + total: 0, + }, + selectors: { + total: 0, + specificity: { + max: 0, + }, + }, + declarations: { + total: 0, + }, + }, + } + } + + return { + size: Buffer.byteLength(code), + gzip: await gzipSize(code), + stats: cssstats(code).toJSON(), + } +} + function getEntrypoints(packageJson) { if (packageJson.exports) { return getPackageExports(packageJson.exports, packageJson.type)