From e246cecb6a680e4389943612e2dc70fa0167174f Mon Sep 17 00:00:00 2001 From: Arya Emami Date: Thu, 16 May 2024 14:13:22 -0500 Subject: [PATCH] chore: update `size-limit` workflow and configuration - Rename `.size-limit.cjs` to `.size-limit.mts` - Remove `size-limit` patch as it is no longer needed --- .github/workflows/size.yml | 31 ++- .../size-limit-npm-11.0.1-05996e44e7.patch | 22 -- packages/toolkit/.size-limit.cjs | 211 ------------------ packages/toolkit/.size-limit.mts | 81 +++++++ packages/toolkit/package.json | 9 +- packages/toolkit/tsconfig.json | 2 +- yarn.lock | 113 +++++++--- 7 files changed, 195 insertions(+), 274 deletions(-) delete mode 100644 .yarn/patches/size-limit-npm-11.0.1-05996e44e7.patch delete mode 100644 packages/toolkit/.size-limit.cjs create mode 100644 packages/toolkit/.size-limit.mts diff --git a/.github/workflows/size.yml b/.github/workflows/size.yml index 698e41effc..52b47654cc 100644 --- a/.github/workflows/size.yml +++ b/.github/workflows/size.yml @@ -1,24 +1,45 @@ name: size + on: + push: pull_request: - branches: - - master - - 'feature/infinite-query-integration' + workflow_dispatch: + permissions: pull-requests: write jobs: size: + name: Check Bundle-Size runs-on: ubuntu-latest env: CI_JOB_NUMBER: 1 steps: - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: persist-credentials: false + - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + cache: 'yarn' + check-latest: true + node-version: '24.x' + + - name: Install dependencies + run: yarn install + - uses: EskiMojo14/size-limit-action@af0584be5b6cc2d056bd31a314fc2ce9c9c1a929 # v2 + id: size + continue-on-error: true + with: directory: packages/toolkit github_token: ${{ secrets.GITHUB_TOKEN }} - build_script: build-only + build_script: build package_manager: yarn size_margin: non-zero + + - name: Run size-limit locally + if: ${{ success() && steps.size.outcome == 'failure' }} + working-directory: packages/toolkit + run: | + yarn run build + yarn run size diff --git a/.yarn/patches/size-limit-npm-11.0.1-05996e44e7.patch b/.yarn/patches/size-limit-npm-11.0.1-05996e44e7.patch deleted file mode 100644 index 436ecd6ba2..0000000000 --- a/.yarn/patches/size-limit-npm-11.0.1-05996e44e7.patch +++ /dev/null @@ -1,22 +0,0 @@ -diff --git a/get-config.js b/get-config.js -index 76ebaee5455b2a4bacb986784bd1b53ad89adeb7..1b092e645b258f4a6533ca88b7d36dbcde4eb6de 100644 ---- a/get-config.js -+++ b/get-config.js -@@ -132,7 +132,7 @@ export default async function getConfig(plugins, process, args, pkg) { - } else if (!check.entry) { - if (pkg.packageJson.main) { - processed.files = [ -- require.resolve(join(dirname(pkg.path), pkg.packageJson.main)) -+ import.meta.resolve(join(dirname(pkg.path), pkg.packageJson.main)) - ] - } else { - processed.files = [join(dirname(pkg.path), 'index.js')] -@@ -177,7 +177,7 @@ export default async function getConfig(plugins, process, args, pkg) { - for (let i in check.import) { - if (peer.includes(i)) { - check.ignore = check.ignore.filter(j => j !== i) -- imports[require.resolve(i, config.cwd)] = check.import[i] -+ imports[import.meta.resolve(i, config.cwd)] = check.import[i] - } else { - imports[toAbsolute(i, config.cwd)] = check.import[i] - } diff --git a/packages/toolkit/.size-limit.cjs b/packages/toolkit/.size-limit.cjs deleted file mode 100644 index d82691bbc1..0000000000 --- a/packages/toolkit/.size-limit.cjs +++ /dev/null @@ -1,211 +0,0 @@ -const webpack = require('webpack') -let { join } = require('path') - -const esmSuffixes = ['modern.mjs', 'browser.mjs' /*, 'legacy-esm.js'*/] -const cjsSuffixes = [ - /*'development.cjs',*/ - /*'production.min.cjs'*/ -] - -function withRtkPath(suffix, cjs = false) { - /** - * @param {string} name - */ - function alias(name) { - return `${cjs ? 'cjs/' : ''}${name}.${suffix}` - } - /** - * @param {webpack.Configuration} config - */ - return (config) => { - config.plugins.push( - new webpack.NormalModuleReplacementPlugin( - /@reduxjs\/toolkit\/query\/react/, - join(__dirname, 'dist/query/react/rtk-query-react.modern.mjs'), - ), - new webpack.NormalModuleReplacementPlugin( - /@reduxjs\/toolkit\/query/, - join(__dirname, 'dist/query/rtk-query.modern.mjs'), - ), - new webpack.NormalModuleReplacementPlugin( - /@reduxjs\/toolkit\/react/, - join(__dirname, 'dist/react/redux-toolkit-react.modern.mjs'), - ), - new webpack.NormalModuleReplacementPlugin( - /@reduxjs\/toolkit/, - join(__dirname, 'dist/redux-toolkit.modern.mjs'), - ), - new webpack.NormalModuleReplacementPlugin( - /rtk-query-react.modern.mjs/, - (r) => { - const old = r.request - r.request = r.request.replace( - /rtk-query-react.modern.mjs$/, - alias('rtk-query-react'), - ) - //console.log(old, '=>', r.request) - }, - ), - new webpack.NormalModuleReplacementPlugin(/rtk-query.modern.mjs/, (r) => { - const old = r.request - r.request = r.request.replace( - /rtk-query.modern.mjs$/, - alias('rtk-query'), - ) - //console.log(old, '=>', r.request) - }), - new webpack.NormalModuleReplacementPlugin( - /redux-toolkit-react.modern.mjs$/, - (r) => { - const old = r.request - r.request = r.request.replace( - /redux-toolkit-react.modern.mjs$/, - alias('redux-toolkit-react'), - ) - //console.log(old, '=>', r.request) - }, - ), - new webpack.NormalModuleReplacementPlugin( - /redux-toolkit.modern.mjs$/, - (r) => { - const old = r.request - r.request = r.request.replace( - /redux-toolkit.modern.mjs$/, - alias('redux-toolkit'), - ) - //console.log(old, '=>', r.request) - }, - ), - ) - - if (suffix === 'production.min.cjs') { - ;(config.resolve ??= {}).mainFields = ['main', 'module'] - } - ;(config.optimization ??= {}).nodeEnv = 'production' - return config - } -} - -const ignoreAll = [ - '@reduxjs/toolkit', - '@reduxjs/toolkit/query', - 'immer', - 'redux', - 'reselect', - 'redux-thunk', -] - -const entryPoints = [ - { - name: `1. entry point: @reduxjs/toolkit`, - path: 'dist/redux-toolkit.modern.mjs', - }, - { - name: `1. entry point: @reduxjs/toolkit/react`, - path: 'dist/react/redux-toolkit-react.modern.mjs', - }, - { - name: `1. entry point: @reduxjs/toolkit/query`, - path: 'dist/query/rtk-query.modern.mjs', - }, - { - name: `1. entry point: @reduxjs/toolkit/query/react`, - path: 'dist/query/react/rtk-query-react.modern.mjs', - }, - { - name: `2. entry point: @reduxjs/toolkit (without dependencies)`, - path: 'dist/redux-toolkit.modern.mjs', - ignore: ignoreAll, - }, - { - name: `2. entry point: @reduxjs/toolkit/react (without dependencies)`, - path: 'dist/react/redux-toolkit-react.modern.mjs', - ignore: ignoreAll, - }, - { - name: `2. entry point: @reduxjs/toolkit/query (without dependencies)`, - path: 'dist/query/rtk-query.modern.mjs', - ignore: ignoreAll, - }, - { - name: `2. entry point: @reduxjs/toolkit/query/react (without dependencies)`, - path: 'dist/query/react/rtk-query-react.modern.mjs', - ignore: ignoreAll, - }, -] - -module.exports = entryPoints - .flatMap((e) => - esmSuffixes.map((suffix) => ({ - ...e, - name: e.name + ` (${suffix})`, - modifyWebpackConfig: withRtkPath(suffix), - })), - ) - .concat( - entryPoints.flatMap((e) => - cjsSuffixes.map((suffix) => ({ - ...e, - name: e.name + ` (cjs, ${suffix})`, - modifyWebpackConfig: withRtkPath(suffix, true), - })), - ), - ) - .concat( - [ - { - name: `3. createSlice`, - import: { '@reduxjs/toolkit': '{ createSlice }' }, - }, - { - name: `3. createAsyncThunk`, - import: { '@reduxjs/toolkit': '{ createAsyncThunk }' }, - }, - { - name: `3. buildCreateSlice and asyncThunkCreator`, - import: { - '@reduxjs/toolkit': '{ buildCreateSlice, asyncThunkCreator }', - }, - }, - { - name: `3. createEntityAdapter`, - import: { '@reduxjs/toolkit': '{ createEntityAdapter }' }, - }, - { - name: `3. configureStore`, - import: { '@reduxjs/toolkit': '{ configureStore }' }, - }, - { - name: `3. combineSlices`, - import: { '@reduxjs/toolkit': '{ combineSlices }' }, - }, - { - name: `3. createDynamicMiddleware`, - import: { '@reduxjs/toolkit': '{ createDynamicMiddleware }' }, - }, - { - name: `3. createDynamicMiddleware (react)`, - import: { '@reduxjs/toolkit/react': '{ createDynamicMiddleware }' }, - }, - { - name: `3. createListenerMiddleware`, - import: { '@reduxjs/toolkit': '{ createListenerMiddleware }' }, - }, - { - name: `3. createApi`, - import: { '@reduxjs/toolkit/query': '{ createApi }' }, - }, - { - name: `3. createApi (react)`, - import: { '@reduxjs/toolkit/query/react': '{ createApi }' }, - }, - { - name: `3. fetchBaseQuery`, - import: { '@reduxjs/toolkit/query': '{ fetchBaseQuery }' }, - }, - ].map((e) => ({ - ...e, - name: e.name + ` (.modern.mjs)`, - modifyWebpackConfig: withRtkPath('modern.mjs'), - })), - ) diff --git a/packages/toolkit/.size-limit.mts b/packages/toolkit/.size-limit.mts new file mode 100644 index 0000000000..7b02759258 --- /dev/null +++ b/packages/toolkit/.size-limit.mts @@ -0,0 +1,81 @@ +import type { Check, SizeLimitConfig } from 'size-limit' +import type { Configuration } from 'webpack' +import packageJson from './package.json' with { type: 'json' } + +/** + * An array of all possible Node environments. + */ +const allNodeEnvs = ['production'] as const + +const allPackageEntryPoints = [ + './dist/redux-toolkit.modern.mjs', + './dist/react/redux-toolkit-react.modern.mjs', + './dist/query/rtk-query.modern.mjs', + './dist/query/react/rtk-query-react.modern.mjs', +] as const satisfies string[] + +const peerAndProductionDependencies = Object.keys({ + ...packageJson.dependencies, + ...packageJson.peerDependencies, +} as const) + +const sizeLimitConfig: SizeLimitConfig = ( + await Promise.all( + allNodeEnvs.flatMap((nodeEnv) => { + const modifyWebpackConfig = ((config?: T): T => + ({ + ...(config ?? {}), + optimization: { + ...config?.optimization, + nodeEnv, + }, + }) as T) satisfies Check['modifyWebpackConfig'] + + return allPackageEntryPoints.map(async (entryPoint, index) => { + const allNamedImports = Object.keys(await import(entryPoint)).filter( + (namedImport) => namedImport !== 'default', + ) + + const sizeLimitConfigWithDependencies = [ + ...allNamedImports.map( + (namedImport, namedImportIndex) => + ({ + path: entryPoint, + name: `${(index + 1).toString()}-${(namedImportIndex + 1).toString()}. import { ${namedImport} } from "${entryPoint}" ('${nodeEnv}' mode)`, + import: `{ ${namedImport} }`, + modifyWebpackConfig, + }) as const satisfies Check, + ), + { + path: entryPoint, + name: `${(index + 1).toString()}-${(allNamedImports.length + 1).toString()}. import * from "${entryPoint}" ('${nodeEnv}' mode)`, + import: '*', + modifyWebpackConfig, + }, + { + path: entryPoint, + name: `${(index + 1).toString()}-${(allNamedImports.length + 2).toString()}. import "${entryPoint}" ('${nodeEnv}' mode)`, + modifyWebpackConfig, + }, + ] as const satisfies SizeLimitConfig + + const sizeLimitConfigWithoutDependencies = + sizeLimitConfigWithDependencies.map( + (check) => + ({ + ...check, + name: `${check.name} (excluding dependencies)`, + ignore: peerAndProductionDependencies, + }) as const satisfies Check, + ) + + return [ + // ...sizeLimitConfigWithDependencies, + ...sizeLimitConfigWithoutDependencies, + ] + }) + }), + ) +).flat() + +export default sizeLimitConfig diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index 5532da033e..c96a012876 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -189,8 +189,8 @@ "@babel/helper-module-imports": "^7.24.7", "@microsoft/api-extractor": "^7.13.2", "@phryneas/ts-version": "^1.0.2", - "@size-limit/file": "^11.0.1", - "@size-limit/webpack": "^11.0.1", + "@size-limit/file": "^12.1.0", + "@size-limit/webpack": "^12.1.0", "@tanstack/intent": "^0.0.19", "@testing-library/dom": "^10.4.0", "@testing-library/react": "^16.0.1", @@ -216,6 +216,7 @@ "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-react": "^7.23.2", "eslint-plugin-react-hooks": "^4.2.0", + "jiti": "^2.7.0", "jsdom": "^25.0.1", "msw": "^2.1.4", "node-fetch": "^3.3.2", @@ -225,7 +226,7 @@ "react-dom": "^19.0.0", "react-redux": "^9.2.0", "rimraf": "^6.1.3", - "size-limit": "^11.0.1", + "size-limit": "^12.1.0", "tsup": "^8.4.0", "tsx": "^4.19.0", "typescript": "^5.9.3", @@ -245,7 +246,7 @@ "test:watch": "vitest --watch", "type-tests": "yarn tsc -p tsconfig.test.json --noEmit", "prepack": "yarn build", - "size": "size-limit" + "size": "size-limit --config $INIT_CWD/.size-limit.mts" }, "files": [ "dist/", diff --git a/packages/toolkit/tsconfig.json b/packages/toolkit/tsconfig.json index 9b9d63d01f..a432fbfe41 100644 --- a/packages/toolkit/tsconfig.json +++ b/packages/toolkit/tsconfig.json @@ -6,6 +6,6 @@ "compilerOptions": { "rootDir": "./" }, - "include": ["."], + "include": ["**/*.*"], "exclude": ["dist", "scripts/issue-triage"] } diff --git a/yarn.lock b/yarn.lock index 3118a17919..447f0fc85a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7764,8 +7764,8 @@ __metadata: "@babel/helper-module-imports": "npm:^7.24.7" "@microsoft/api-extractor": "npm:^7.13.2" "@phryneas/ts-version": "npm:^1.0.2" - "@size-limit/file": "npm:^11.0.1" - "@size-limit/webpack": "npm:^11.0.1" + "@size-limit/file": "npm:^12.1.0" + "@size-limit/webpack": "npm:^12.1.0" "@standard-schema/spec": "npm:^1.0.0" "@standard-schema/utils": "npm:^0.3.0" "@tanstack/intent": "npm:^0.0.19" @@ -7794,6 +7794,7 @@ __metadata: eslint-plugin-react: "npm:^7.23.2" eslint-plugin-react-hooks: "npm:^4.2.0" immer: "npm:^11.0.0" + jiti: "npm:^2.7.0" jsdom: "npm:^25.0.1" msw: "npm:^2.1.4" node-fetch: "npm:^3.3.2" @@ -7806,7 +7807,7 @@ __metadata: redux-thunk: "npm:^3.1.0" reselect: "npm:^5.1.0" rimraf: "npm:^6.1.3" - size-limit: "npm:^11.0.1" + size-limit: "npm:^12.1.0" tsup: "npm:^8.4.0" tsx: "npm:^4.19.0" typescript: "npm:^5.9.3" @@ -8647,24 +8648,24 @@ __metadata: languageName: node linkType: hard -"@size-limit/file@npm:^11.0.1": - version: 11.2.0 - resolution: "@size-limit/file@npm:11.2.0" +"@size-limit/file@npm:^12.1.0": + version: 12.1.0 + resolution: "@size-limit/file@npm:12.1.0" peerDependencies: - size-limit: 11.2.0 - checksum: 10/0802fddafe68c29268feb683a0b9d41dabe29d39278ddf704674d62485e1ea23743e88a435517dea6553da148e559d2537f3c459f9f7c92fd838563b2e97b3cf + size-limit: 12.1.0 + checksum: 10/66e2c937ff363ae5b91a055bebd8ddb658fa44f3184ebbe13d6eb76014d96da758d93cc4e69b1d34e5ce589dc5e0016f758ec0864e8fdfb4cdc353d5891b2a44 languageName: node linkType: hard -"@size-limit/webpack@npm:^11.0.1": - version: 11.2.0 - resolution: "@size-limit/webpack@npm:11.2.0" +"@size-limit/webpack@npm:^12.1.0": + version: 12.1.0 + resolution: "@size-limit/webpack@npm:12.1.0" dependencies: - nanoid: "npm:^5.1.0" - webpack: "npm:^5.98.0" + nanoid: "npm:^5.1.7" + webpack: "npm:^5.106.1" peerDependencies: - size-limit: 11.2.0 - checksum: 10/7c7e25ffbdf097973c1fb7f50a706a8fb3e407223eb6e35caa36b90d2057ccb17a9269243ea46b0bd9db0183a4f9cc194849f5facd19701437b24fdf101a6573 + size-limit: 12.1.0 + checksum: 10/b8a79507d1fed49f023035afa317cab32a7e626d334227df3653dadfbaa3395f571f6bfaaa1d8e385f1205329f232bcede9ebbe3ecfdaceae2eb23857c71a92a languageName: node linkType: hard @@ -21050,12 +21051,12 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^2.4.2": - version: 2.6.1 - resolution: "jiti@npm:2.6.1" +"jiti@npm:^2.7.0": + version: 2.7.0 + resolution: "jiti@npm:2.7.0" bin: jiti: lib/jiti-cli.mjs - checksum: 10/8cd72c5fd03a0502564c3f46c49761090f6dadead21fa191b73535724f095ad86c2fa89ee6fe4bc3515337e8d406cc8fb2d37b73fa0c99a34584bac35cd4a4de + checksum: 10/6d75a8dbd61dbee031aa0937fabb748ff8ddf370b971958cc704f5cf26b4c5bdc9dcd0563059b2627a2bd41d946fa0bc64f912fdc8981ca7945a9d63c74ad0f9 languageName: node linkType: hard @@ -24066,12 +24067,12 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^5.1.0": - version: 5.1.7 - resolution: "nanoid@npm:5.1.7" +"nanoid@npm:^5.1.7": + version: 5.1.9 + resolution: "nanoid@npm:5.1.9" bin: nanoid: bin/nanoid.js - checksum: 10/9ca13b1e87c61b21afaa578f40afbb6488fbc24609c34bba744941f9f56feb5b416ea7dfcc1ec4927a8c0f52e5ea755633662dbd58b9e87fd7899c1d7b242ed6 + checksum: 10/a8cc355ed2176165a0fb5e0dbbac0b72f05d9ac08af50bf652ace22252d7a1455ef307b54681e39baf609a4da84600cad843bf01d9bd1cc1440f6fd166e19589 languageName: node linkType: hard @@ -30297,20 +30298,23 @@ __metadata: languageName: node linkType: hard -"size-limit@npm:^11.0.1": - version: 11.2.0 - resolution: "size-limit@npm:11.2.0" +"size-limit@npm:^12.1.0": + version: 12.1.0 + resolution: "size-limit@npm:12.1.0" dependencies: bytes-iec: "npm:^3.1.1" - chokidar: "npm:^4.0.3" - jiti: "npm:^2.4.2" lilconfig: "npm:^3.1.3" nanospinner: "npm:^1.2.2" picocolors: "npm:^1.1.1" - tinyglobby: "npm:^0.2.11" + tinyglobby: "npm:^0.2.16" + peerDependencies: + jiti: ^2.0.0 + peerDependenciesMeta: + jiti: + optional: true bin: size-limit: bin.js - checksum: 10/76c81693783a51621bca7a359777f8028f21ee1b77be8008768757d3f40bd8b6d173206b9c003d47e73b326090af9c05022d74004651f4a8e0895b3001c242e2 + checksum: 10/57a2454517850e9188cced7d1e9063ca7576510e162a371bef06b29a5492ca943fcca6a8351f00c2b80356ea9379927a793d4500bc85e61254bf59909b1d22a6 languageName: node linkType: hard @@ -31615,6 +31619,16 @@ __metadata: languageName: node linkType: hard +"tinyglobby@npm:^0.2.16": + version: 0.2.16 + resolution: "tinyglobby@npm:0.2.16" + dependencies: + fdir: "npm:^6.5.0" + picomatch: "npm:^4.0.4" + checksum: 10/5c2c41b572ada38449e7c86a5fe034f204a1dbba577225a761a14f29f48dc3f2fc0d81a6c56fcc67c5a742cc3aa9fb5e2ca18dbf22b610b0bc0e549b34d5a0f8 + languageName: node + linkType: hard + "tinypool@npm:^1.0.2": version: 1.1.1 resolution: "tinypool@npm:1.1.1" @@ -33438,7 +33452,44 @@ __metadata: languageName: node linkType: hard -"webpack@npm:^5.64.4, webpack@npm:^5.88.1, webpack@npm:^5.95.0, webpack@npm:^5.98.0": +"webpack@npm:^5.106.1": + version: 5.106.2 + resolution: "webpack@npm:5.106.2" + dependencies: + "@types/eslint-scope": "npm:^3.7.7" + "@types/estree": "npm:^1.0.8" + "@types/json-schema": "npm:^7.0.15" + "@webassemblyjs/ast": "npm:^1.14.1" + "@webassemblyjs/wasm-edit": "npm:^1.14.1" + "@webassemblyjs/wasm-parser": "npm:^1.14.1" + acorn: "npm:^8.16.0" + acorn-import-phases: "npm:^1.0.3" + browserslist: "npm:^4.28.1" + chrome-trace-event: "npm:^1.0.2" + enhanced-resolve: "npm:^5.20.0" + es-module-lexer: "npm:^2.0.0" + eslint-scope: "npm:5.1.1" + events: "npm:^3.2.0" + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.2.11" + loader-runner: "npm:^4.3.1" + mime-db: "npm:^1.54.0" + neo-async: "npm:^2.6.2" + schema-utils: "npm:^4.3.3" + tapable: "npm:^2.3.0" + terser-webpack-plugin: "npm:^5.3.17" + watchpack: "npm:^2.5.1" + webpack-sources: "npm:^3.3.4" + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: 10/524dcd7f07dfa993ab46c5ae2e302aeaa98bed760e40644f61544c1db67e5cd7be24016c8ee245895eda024020cfa58a953f1771a21028ac5d040adc92240e0f + languageName: node + linkType: hard + +"webpack@npm:^5.64.4, webpack@npm:^5.88.1, webpack@npm:^5.95.0": version: 5.105.4 resolution: "webpack@npm:5.105.4" dependencies: