From 240d6ac33d0f052306e5091e924cc2b7996c70f6 Mon Sep 17 00:00:00 2001 From: Pavel Grinchenko Date: Tue, 6 May 2025 22:12:49 +0100 Subject: [PATCH 1/3] Setup size limit --- .size-limit.ts | 22 ++++++++++ package.json | 3 ++ pnpm-lock.yaml | 112 ++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 122 insertions(+), 15 deletions(-) create mode 100644 .size-limit.ts diff --git a/.size-limit.ts b/.size-limit.ts new file mode 100644 index 0000000..7bd0a5f --- /dev/null +++ b/.size-limit.ts @@ -0,0 +1,22 @@ +import type { SizeLimitConfig } from "size-limit"; + +module.exports = [ + { + name: "createTypedChannel", + path: "dist/index.js", + import: "{ createTypedChannel }", + limit: "254 B", + }, + { + name: "createPostMessageTransport", + path: "dist/index.js", + import: "{ createPostMessageTransport }", + limit: "86 B", + }, + { + name: "createEventTargetTransport", + path: "dist/index.js", + import: "{ createEventTargetTransport }", + limit: "109 B", + }, +] satisfies SizeLimitConfig; diff --git a/package.json b/package.json index 694aa5f..67c687b 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "lint": "pnpm --parallel /^lint:*/", "lint:oxlint": "oxlint", "lint:prettier": "prettier --check .", + "lint:size": "pnpm build && size-limit", "format": "prettier . --write", "typecheck": "tsc --noEmit", "test": "vitest run", @@ -39,8 +40,10 @@ }, "packageManager": "pnpm@10.8.1", "devDependencies": { + "@size-limit/preset-small-lib": "^11.2.0", "oxlint": "^0.16.6", "prettier": "^3.5.3", + "size-limit": "^11.2.0", "tsup": "^8.4.0", "typescript": "^5.8.3", "vite": "^6.3.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c9b108a..de3b796 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,24 +8,30 @@ importers: .: devDependencies: + '@size-limit/preset-small-lib': + specifier: ^11.2.0 + version: 11.2.0(size-limit@11.2.0) oxlint: specifier: ^0.16.6 version: 0.16.6 prettier: specifier: ^3.5.3 version: 3.5.3 + size-limit: + specifier: ^11.2.0 + version: 11.2.0 tsup: specifier: ^8.4.0 - version: 8.4.0(postcss@8.5.3)(typescript@5.8.3) + version: 8.4.0(jiti@2.4.2)(postcss@8.5.3)(typescript@5.8.3) typescript: specifier: ^5.8.3 version: 5.8.3 vite: specifier: ^6.3.1 - version: 6.3.2(@types/node@22.14.1) + version: 6.3.2(@types/node@22.14.1)(jiti@2.4.2) vitest: specifier: ^3.1.1 - version: 3.1.1(@types/node@22.14.1)(happy-dom@17.4.4)(jsdom@26.1.0) + version: 3.1.1(@types/node@22.14.1)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@26.1.0) packages: @@ -376,6 +382,23 @@ packages: cpu: [x64] os: [win32] + '@size-limit/esbuild@11.2.0': + resolution: {integrity: sha512-vSg9H0WxGQPRzDnBzeDyD9XT0Zdq0L+AI3+77/JhxznbSCMJMMr8ndaWVQRhOsixl97N0oD4pRFw2+R1Lcvi6A==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + size-limit: 11.2.0 + + '@size-limit/file@11.2.0': + resolution: {integrity: sha512-OZHE3putEkQ/fgzz3Tp/0hSmfVo3wyTpOJSRNm6AmcwX4Nm9YtTfbQQ/hZRwbBFR23S7x2Sd9EbqYzngKwbRoA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + size-limit: 11.2.0 + + '@size-limit/preset-small-lib@11.2.0': + resolution: {integrity: sha512-RFbbIVfv8/QDgTPyXzjo5NKO6CYyK5Uq5xtNLHLbw5RgSKrgo8WpiB/fNivZuNd/5Wk0s91PtaJ9ThNcnFuI3g==} + peerDependencies: + size-limit: 11.2.0 + '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} @@ -450,6 +473,10 @@ packages: peerDependencies: esbuild: '>=0.18' + bytes-iec@3.1.1: + resolution: {integrity: sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==} + engines: {node: '>= 0.8'} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -591,6 +618,10 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -646,6 +677,14 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@5.1.5: + resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} + engines: {node: ^18 || >=20} + hasBin: true + + nanospinner@1.2.2: + resolution: {integrity: sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==} + nwsapi@2.2.20: resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} @@ -759,6 +798,11 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + size-limit@11.2.0: + resolution: {integrity: sha512-2kpQq2DD/pRpx3Tal/qRW1SYwcIeQ0iq8li5CJHQgOC+FtPn2BVmuDtzUCgNnpCrbgtfEHqh+iWzxK+Tq6C+RQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -1242,6 +1286,22 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.40.0': optional: true + '@size-limit/esbuild@11.2.0(size-limit@11.2.0)': + dependencies: + esbuild: 0.25.2 + nanoid: 5.1.5 + size-limit: 11.2.0 + + '@size-limit/file@11.2.0(size-limit@11.2.0)': + dependencies: + size-limit: 11.2.0 + + '@size-limit/preset-small-lib@11.2.0(size-limit@11.2.0)': + dependencies: + '@size-limit/esbuild': 11.2.0(size-limit@11.2.0) + '@size-limit/file': 11.2.0(size-limit@11.2.0) + size-limit: 11.2.0 + '@types/estree@1.0.7': {} '@types/node@22.14.1': @@ -1256,13 +1316,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.1(vite@6.3.2(@types/node@22.14.1))': + '@vitest/mocker@3.1.1(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2))': dependencies: '@vitest/spy': 3.1.1 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.2(@types/node@22.14.1) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2) '@vitest/pretty-format@3.1.1': dependencies: @@ -1317,6 +1377,8 @@ snapshots: esbuild: 0.25.2 load-tsconfig: 0.2.5 + bytes-iec@3.1.1: {} + cac@6.7.14: {} chai@5.2.0: @@ -1481,6 +1543,8 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jiti@2.4.2: {} + joycon@3.1.1: {} jsdom@26.1.0: @@ -1543,6 +1607,12 @@ snapshots: nanoid@3.3.11: {} + nanoid@5.1.5: {} + + nanospinner@1.2.2: + dependencies: + picocolors: 1.1.1 + nwsapi@2.2.20: optional: true @@ -1583,10 +1653,11 @@ snapshots: pirates@4.0.7: {} - postcss-load-config@6.0.1(postcss@8.5.3): + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3): dependencies: lilconfig: 3.1.3 optionalDependencies: + jiti: 2.4.2 postcss: 8.5.3 postcss@8.5.3: @@ -1650,6 +1721,16 @@ snapshots: signal-exit@4.1.0: {} + size-limit@11.2.0: + dependencies: + bytes-iec: 3.1.1 + chokidar: 4.0.3 + jiti: 2.4.2 + lilconfig: 3.1.3 + nanospinner: 1.2.2 + picocolors: 1.1.1 + tinyglobby: 0.2.12 + source-map-js@1.2.1: {} source-map@0.8.0-beta.0: @@ -1742,7 +1823,7 @@ snapshots: ts-interface-checker@0.1.13: {} - tsup@8.4.0(postcss@8.5.3)(typescript@5.8.3): + tsup@8.4.0(jiti@2.4.2)(postcss@8.5.3)(typescript@5.8.3): dependencies: bundle-require: 5.1.0(esbuild@0.25.2) cac: 6.7.14 @@ -1752,7 +1833,7 @@ snapshots: esbuild: 0.25.2 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(postcss@8.5.3) + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.3) resolve-from: 5.0.0 rollup: 4.40.0 source-map: 0.8.0-beta.0 @@ -1774,13 +1855,13 @@ snapshots: undici-types@6.21.0: optional: true - vite-node@3.1.1(@types/node@22.14.1): + vite-node@3.1.1(@types/node@22.14.1)(jiti@2.4.2): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.3.2(@types/node@22.14.1) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2) transitivePeerDependencies: - '@types/node' - jiti @@ -1795,7 +1876,7 @@ snapshots: - tsx - yaml - vite@6.3.2(@types/node@22.14.1): + vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2): dependencies: esbuild: 0.25.2 fdir: 6.4.3(picomatch@4.0.2) @@ -1806,11 +1887,12 @@ snapshots: optionalDependencies: '@types/node': 22.14.1 fsevents: 2.3.3 + jiti: 2.4.2 - vitest@3.1.1(@types/node@22.14.1)(happy-dom@17.4.4)(jsdom@26.1.0): + vitest@3.1.1(@types/node@22.14.1)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@26.1.0): dependencies: '@vitest/expect': 3.1.1 - '@vitest/mocker': 3.1.1(vite@6.3.2(@types/node@22.14.1)) + '@vitest/mocker': 3.1.1(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)) '@vitest/pretty-format': 3.1.1 '@vitest/runner': 3.1.1 '@vitest/snapshot': 3.1.1 @@ -1826,8 +1908,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.3.2(@types/node@22.14.1) - vite-node: 3.1.1(@types/node@22.14.1) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2) + vite-node: 3.1.1(@types/node@22.14.1)(jiti@2.4.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.14.1 From 625ea15c17d2ca6c1e2be8ab24ef1b5cea23eaa9 Mon Sep 17 00:00:00 2001 From: Pavel Grinchenko Date: Tue, 6 May 2025 22:13:02 +0100 Subject: [PATCH 2/3] Setup size limit on GH CI --- .github/workflows/size-limit.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/size-limit.yml diff --git a/.github/workflows/size-limit.yml b/.github/workflows/size-limit.yml new file mode 100644 index 0000000..c509b39 --- /dev/null +++ b/.github/workflows/size-limit.yml @@ -0,0 +1,24 @@ +name: Check bundle size +on: + pull_request: + branches: + - main +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + pull-requests: write + +jobs: + sizecheck: + runs-on: ubuntu-latest + env: + CI_RUN: true + CI_JOB_NUMBER: 1 + steps: + - uses: actions/checkout@v4 + - uses: andresz1/size-limit-action + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + package_manager: pnpm From f53a4519ce902689003eeb6a0e712d962edffb8c Mon Sep 17 00:00:00 2001 From: Pavel Grinchenko Date: Tue, 6 May 2025 22:21:41 +0100 Subject: [PATCH 3/3] Add badge with size limit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index fbff0cb..3b6c0f4 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ A type-safe communication channel for sending and receiving messages between different contexts in a TypeScript environment. [![npm version](https://img.shields.io/npm/v/typed-channel.svg)](https://www.npmjs.com/package/typed-channel) +[![Bundle size](https://img.shields.io/badge/Bundle_size-from_363_B-brightgreen)](https://github.com/psd-coder/typed-channel/blob/main/.size-limit.ts) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) ## Features