diff --git a/package.json b/package.json index e89feff..862a179 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "url": "https://github.com/webdeveric/utils/issues" }, "homepage": "https://github.com/webdeveric/utils/#readme", - "packageManager": "pnpm@10.11.1+sha512.e519b9f7639869dc8d5c3c5dfef73b3f091094b0a006d7317353c72b124e80e1afd429732e28705ad6bfa1ee879c1fce46c128ccebd3192101f43dd67c667912", + "packageManager": "pnpm@10.12.1+sha512.f0dda8580f0ee9481c5c79a1d927b9164f2c478e90992ad268bbb2465a736984391d6333d2c327913578b2804af33474ca554ba29c04a8b13060a717675ae3ac", "scripts": { "clean": "rimraf ./dist/", "prebuild": "pnpm clean", @@ -88,7 +88,7 @@ "@commitlint/config-conventional": "^19.8.1", "@commitlint/types": "^19.8.1", "@types/node": "^22.15.30", - "@vitest/coverage-v8": "^3.2.2", + "@vitest/coverage-v8": "^3.2.3", "@webdeveric/eslint-config-ts": "^0.11.0", "@webdeveric/prettier-config": "^0.3.0", "commitlint": "^19.8.1", @@ -106,8 +106,8 @@ "rimraf": "^6.0.1", "semantic-release": "^24.2.5", "typescript": "^5.8.3", - "validate-package-exports": "^0.9.0", - "vitest": "^3.2.2" + "validate-package-exports": "^0.11.0", + "vitest": "^3.2.3" }, "pnpm": { "onlyBuiltDependencies": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7c96b86..7b9f2cf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,8 +18,8 @@ importers: specifier: ^22.15.30 version: 22.15.30 '@vitest/coverage-v8': - specifier: ^3.2.2 - version: 3.2.2(vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0)) + specifier: ^3.2.3 + version: 3.2.3(vitest@3.2.3(@types/node@22.15.30)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0)) '@webdeveric/eslint-config-ts': specifier: ^0.11.0 version: 0.11.0(eslint@8.57.1)(typescript@5.8.3) @@ -72,11 +72,11 @@ importers: specifier: ^5.8.3 version: 5.8.3 validate-package-exports: - specifier: ^0.9.0 - version: 0.9.0 + specifier: ^0.11.0 + version: 0.11.0 vitest: - specifier: ^3.2.2 - version: 3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0) + specifier: ^3.2.3 + version: 3.2.3(@types/node@22.15.30)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0) packages: @@ -655,8 +655,8 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@napi-rs/wasm-runtime@0.2.10': - resolution: {integrity: sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==} + '@napi-rs/wasm-runtime@0.2.11': + resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -1058,105 +1058,105 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@unrs/resolver-binding-darwin-arm64@1.7.11': - resolution: {integrity: sha512-i3/wlWjQJXMh1uiGtiv7k1EYvrrS3L1hdwmWJJiz1D8jWy726YFYPIxQWbEIVPVAgrfRR0XNlLrTQwq17cuCGw==} + '@unrs/resolver-binding-darwin-arm64@1.7.12': + resolution: {integrity: sha512-C//UObaqVcGKpRMMThzBCDxbqM9YQg2dtWy3OwcERLu+qzLa781AqvGdgqwqakRO+cWCK6dl75ebAcsSozmARg==} cpu: [arm64] os: [darwin] - '@unrs/resolver-binding-darwin-x64@1.7.11': - resolution: {integrity: sha512-8XXyFvc6w6kmMmi6VYchZhjd5CDcp+Lv6Cn1YmUme0ypsZ/0Kzd+9ESrWtDrWibKPTgSteDTxp75cvBOY64FQQ==} + '@unrs/resolver-binding-darwin-x64@1.7.12': + resolution: {integrity: sha512-eRXO0uPaZtWIogCeVlpSCfzKr3ZJynQl3IRzhFucrA+efdjAylS+ZemWFfnhGbQgWv4lItKCfCpxGuZsosudWw==} cpu: [x64] os: [darwin] - '@unrs/resolver-binding-freebsd-x64@1.7.11': - resolution: {integrity: sha512-0qJBYzP8Qk24CZ05RSWDQUjdiQUeIJGfqMMzbtXgCKl/a5xa6thfC0MQkGIr55LCLd6YmMyO640ifYUa53lybQ==} + '@unrs/resolver-binding-freebsd-x64@1.7.12': + resolution: {integrity: sha512-VUdT2CwMoyWy9Jolavu2fWTcusiA9FePjSyMLIrZvAeC2PMnM9msF3HJkO/j0S2fZkzgZy+UBBZjJwG0Mfds0g==} cpu: [x64] os: [freebsd] - '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.11': - resolution: {integrity: sha512-1sGwpgvx+WZf0GFT6vkkOm6UJ+mlsVnjw+Yv9esK71idWeRAG3bbpkf3AoY8KIqKqmnzJExi0uKxXpakQ5Pcbg==} + '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.12': + resolution: {integrity: sha512-hbWi7U2UlglpT1LQZbm7He3YpSRYGoHwFMMKC+oCD9UzPImFJZOFrQUL4FQVsOaxxz0ggWK1Q/ZcK23LpG2STg==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm-musleabihf@1.7.11': - resolution: {integrity: sha512-D/1F/2lTe+XAl3ohkYj51NjniVly8sIqkA/n1aOND3ZMO418nl2JNU95iVa1/RtpzaKcWEsNTtHRogykrUflJg==} + '@unrs/resolver-binding-linux-arm-musleabihf@1.7.12': + resolution: {integrity: sha512-KBblhYFUhUTVSkTKxxaw4cFS3qgQMs2oM1DUSNrsFX7uRBG6SxXkLXGKua+uWq+G0vT7pp30BPXJ7c4I6vRGcw==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm64-gnu@1.7.11': - resolution: {integrity: sha512-7vFWHLCCNFLEQlmwKQfVy066ohLLArZl+AV/AdmrD1/pD1FlmqM+FKbtnONnIwbHtgetFUCV/SRi1q4D49aTlw==} + '@unrs/resolver-binding-linux-arm64-gnu@1.7.12': + resolution: {integrity: sha512-A5jGMNiY5F/KyeLkph5/gaNXNs/P/FUJvhKIP79mIOn9KUqjqx+UbhZQ1UrRuGHsh0gXPVSnu2UJdhnvJsnEyw==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-arm64-musl@1.7.11': - resolution: {integrity: sha512-tYkGIx8hjWPh4zcn17jLEHU8YMmdP2obRTGkdaB3BguGHh31VCS3ywqC4QjTODjmhhNyZYkj/1Dz/+0kKvg9YA==} + '@unrs/resolver-binding-linux-arm64-musl@1.7.12': + resolution: {integrity: sha512-Gv/duj5YStydJTNu2vSHFbSrRimpA6mnVmAnKTe1xMfhqDCm10EP/U6u7NII1jAjbpaRmqtnvFhtndzGxDyfhA==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-ppc64-gnu@1.7.11': - resolution: {integrity: sha512-6F328QIUev29vcZeRX6v6oqKxfUoGwIIAhWGD8wSysnBYFY0nivp25jdWmAb1GildbCCaQvOKEhCok7YfWkj4Q==} + '@unrs/resolver-binding-linux-ppc64-gnu@1.7.12': + resolution: {integrity: sha512-BTjdqhVVl1Q8dZCdNkVXZrfFyqNRdWizFuY5N0eHP7zgtNmqwJ3F/eJF/60GnabIcmWHvWvugby2VqHZtW/bQw==} cpu: [ppc64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-gnu@1.7.11': - resolution: {integrity: sha512-NqhWmiGJGdzbZbeucPZIG9Iav4lyYLCarEnxAceguMx9qlpeEF7ENqYKOwB8Zqk7/CeuYMEcLYMaW2li6HyDzQ==} + '@unrs/resolver-binding-linux-riscv64-gnu@1.7.12': + resolution: {integrity: sha512-YkjQuWGi1o174Xz2R+oQOOYQgViCwkSdpsHGmLr0QRYgQclJCQ4ug6qT+EGTYi1g4994q3BAaFVgV0GzEM1YSQ==} cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-musl@1.7.11': - resolution: {integrity: sha512-J2RPIFKMdTrLtBdfR1cUMKl8Gcy05nlQ+bEs/6al7EdWLk9cs3tnDREHZ7mV9uGbeghpjo4i8neNZNx3PYUY9w==} + '@unrs/resolver-binding-linux-riscv64-musl@1.7.12': + resolution: {integrity: sha512-9ud5x0qYBuk1rGdGzdjKQq/o7tObgI3IdjaufxKLD6kJIQi6vqww1mfoJklYw2OR5JXOWc6WLNKHa0Rr9aFZsw==} cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-s390x-gnu@1.7.11': - resolution: {integrity: sha512-bDpGRerHvvHdhun7MmFUNDpMiYcJSqWckwAVVRTJf8F+RyqYJOp/mx04PDc7DhpNPeWdnTMu91oZRMV+gGaVcQ==} + '@unrs/resolver-binding-linux-s390x-gnu@1.7.12': + resolution: {integrity: sha512-3CNVBpgsvZ4Vrr18JAxQ8Qxz+k4PqTJR05/xn5Tczs9jFEuxPDxZKFskv9QnK3flJtx+ur9MayiTGgFZQAa7hA==} cpu: [s390x] os: [linux] - '@unrs/resolver-binding-linux-x64-gnu@1.7.11': - resolution: {integrity: sha512-G9U7bVmylzRLma3cK39RBm3guoD1HOvY4o0NS4JNm37AD0lS7/xyMt7kn0JejYyc0Im8J+rH69/dXGM9DAJcSQ==} + '@unrs/resolver-binding-linux-x64-gnu@1.7.12': + resolution: {integrity: sha512-bPACcY7lEp3M8IItjXEppQEsQ2N54a1aLb1yCWD16lccl8OG9aXQvji9x9VVcmdqR4JV4oWXzr0uIrZ+oFNvOw==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-linux-x64-musl@1.7.11': - resolution: {integrity: sha512-7qL20SBKomekSunm7M9Fe5L93bFbn+FbHiGJbfTlp0RKhPVoJDP73vOxf1QrmJHyDPECsGWPFnKa/f8fO2FsHw==} + '@unrs/resolver-binding-linux-x64-musl@1.7.12': + resolution: {integrity: sha512-86WuRbj+0tK3qWPthfsR952CHxE23lDTjbKfHOczIkjRvKP/ggAzaiNMOEljxB5iel4HhGTQZBp1lx61aw2q/g==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-wasm32-wasi@1.7.11': - resolution: {integrity: sha512-jisvIva8MidjI+B1lFRZZMfCPaCISePgTyR60wNT1MeQvIh5Ksa0G3gvI+Iqyj3jqYbvOHByenpa5eDGcSdoSg==} + '@unrs/resolver-binding-wasm32-wasi@1.7.12': + resolution: {integrity: sha512-RzWV0OyeARtKRNHSbVZyj869P+WHzT2OFEgigs+5qEIM8X3QzbQ90Ye/1hCvgu0zi/cDCXtKWp8Utr1Oym2UIA==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@unrs/resolver-binding-win32-arm64-msvc@1.7.11': - resolution: {integrity: sha512-G+H5nQZ8sRZ8ebMY6mRGBBvTEzMYEcgVauLsNHpvTUavZoCCRVP1zWkCZgOju2dW3O22+8seTHniTdl1/uLz3g==} + '@unrs/resolver-binding-win32-arm64-msvc@1.7.12': + resolution: {integrity: sha512-s9FdWj2QFT6PLNY/jPPmd7jF1Fn2HNSuLbZqUpdcSaMdeBGaDvy2C/eBYgGhrK7g8kIYUecT1LdT+SuDs6h+YA==} cpu: [arm64] os: [win32] - '@unrs/resolver-binding-win32-ia32-msvc@1.7.11': - resolution: {integrity: sha512-Hfy46DBfFzyv0wgR0MMOwFFib2W2+Btc8oE5h4XlPhpelnSyA6nFxkVIyTgIXYGTdFaLoZFNn62fmqx3rjEg3A==} + '@unrs/resolver-binding-win32-ia32-msvc@1.7.12': + resolution: {integrity: sha512-Fo4Op3Il/6HZ8Gm+YhqBkRZpTGe/QJZWAsCB/CLYBDqJ2NjXptgFsuIvlgXv95+WUkoTw6ifRgxE9gwtcAk5YA==} cpu: [ia32] os: [win32] - '@unrs/resolver-binding-win32-x64-msvc@1.7.11': - resolution: {integrity: sha512-7L8NdsQlCJ8T106Gbz/AjzM4QKWVsoQbKpB9bMBGcIZswUuAnJMHpvbqGW3RBqLHCIwX4XZ5fxSBHEFcK2h9wA==} + '@unrs/resolver-binding-win32-x64-msvc@1.7.12': + resolution: {integrity: sha512-00cVr73Qizmx7qycr9aO5NBofoAHuQIhNsuqj+I2Bun/yMddLfpXk86K3GWj096jXLzk0u/77u3qUTJPhuYWiw==} cpu: [x64] os: [win32] - '@vitest/coverage-v8@3.2.2': - resolution: {integrity: sha512-RVAi5xnqedSKvaoQyCTWvncMk8eYZcTTOsLK7XmnfOEvdGP/O/upA0/MA8Ss+Qs++mj0GcSRi/whR0S5iBPpTQ==} + '@vitest/coverage-v8@3.2.3': + resolution: {integrity: sha512-D1QKzngg8PcDoCE8FHSZhREDuEy+zcKmMiMafYse41RZpBE5EDJyKOTdqK3RQfsV2S2nyKor5KCs8PyPRFqKPg==} peerDependencies: - '@vitest/browser': 3.2.2 - vitest: 3.2.2 + '@vitest/browser': 3.2.3 + vitest: 3.2.3 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@3.2.2': - resolution: {integrity: sha512-ipHw0z669vEMjzz3xQE8nJX1s0rQIb7oEl4jjl35qWTwm/KIHERIg/p/zORrjAaZKXfsv7IybcNGHwhOOAPMwQ==} + '@vitest/expect@3.2.3': + resolution: {integrity: sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==} - '@vitest/mocker@3.2.2': - resolution: {integrity: sha512-jKojcaRyIYpDEf+s7/dD3LJt53c0dPfp5zCPXz9H/kcGrSlovU/t1yEaNzM9oFME3dcd4ULwRI/x0Po1Zf+LTw==} + '@vitest/mocker@3.2.3': + resolution: {integrity: sha512-cP6fIun+Zx8he4rbWvi+Oya6goKQDZK+Yq4hhlggwQBbrlOQ4qtZ+G4nxB6ZnzI9lyIb+JnvyiJnPC2AGbKSPA==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 @@ -1166,20 +1166,20 @@ packages: vite: optional: true - '@vitest/pretty-format@3.2.2': - resolution: {integrity: sha512-FY4o4U1UDhO9KMd2Wee5vumwcaHw7Vg4V7yR4Oq6uK34nhEJOmdRYrk3ClburPRUA09lXD/oXWZ8y/Sdma0aUQ==} + '@vitest/pretty-format@3.2.3': + resolution: {integrity: sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==} - '@vitest/runner@3.2.2': - resolution: {integrity: sha512-GYcHcaS3ejGRZYed2GAkvsjBeXIEerDKdX3orQrBJqLRiea4NSS9qvn9Nxmuy1IwIB+EjFOaxXnX79l8HFaBwg==} + '@vitest/runner@3.2.3': + resolution: {integrity: sha512-83HWYisT3IpMaU9LN+VN+/nLHVBCSIUKJzGxC5RWUOsK1h3USg7ojL+UXQR3b4o4UBIWCYdD2fxuzM7PQQ1u8w==} - '@vitest/snapshot@3.2.2': - resolution: {integrity: sha512-aMEI2XFlR1aNECbBs5C5IZopfi5Lb8QJZGGpzS8ZUHML5La5wCbrbhLOVSME68qwpT05ROEEOAZPRXFpxZV2wA==} + '@vitest/snapshot@3.2.3': + resolution: {integrity: sha512-9gIVWx2+tysDqUmmM1L0hwadyumqssOL1r8KJipwLx5JVYyxvVRfxvMq7DaWbZZsCqZnu/dZedaZQh4iYTtneA==} - '@vitest/spy@3.2.2': - resolution: {integrity: sha512-6Utxlx3o7pcTxvp0u8kUiXtRFScMrUg28KjB3R2hon7w4YqOFAEA9QwzPVVS1QNL3smo4xRNOpNZClRVfpMcYg==} + '@vitest/spy@3.2.3': + resolution: {integrity: sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==} - '@vitest/utils@3.2.2': - resolution: {integrity: sha512-qJYMllrWpF/OYfWHP32T31QCaLa3BAzT/n/8mNGhPdVcjY+JYazQFO1nsJvXU12Kp1xMpNY4AGuljPTNjQve6A==} + '@vitest/utils@3.2.3': + resolution: {integrity: sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==} '@webdeveric/eslint-config-ts@0.11.0': resolution: {integrity: sha512-QClsqZWRhESB1CT3uZl2As2INzNq/VD3bQRwhL9sUmxHcXfhcnGXFBwt+4UseDIni5u9RXtVfGaR0kUj+3tbpg==} @@ -1197,8 +1197,8 @@ packages: peerDependencies: prettier: '>=2.4.0' - '@webdeveric/utils@0.56.0': - resolution: {integrity: sha512-PSPPuslk4eRVPbafOIyhfBOM7fTprXt9mettpv44n4D9RfBK5CCJemguHLrg9py7NbuUUX3JE+0FtBKGNX0PZw==} + '@webdeveric/utils@0.61.0': + resolution: {integrity: sha512-cydbxTzOhYomSYy7x1jJkzoLGU4tJwK40vYY8BqjDqAJ+ln2tzUc7tGoivFouLZkTaeR/7rsL6ww5vkvPSRcow==} engines: {node: '>=18.0.0'} JSONStream@1.3.5: @@ -1214,8 +1214,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -1510,8 +1510,8 @@ packages: engines: {node: '>=16'} hasBin: true - conventional-commits-parser@6.1.0: - resolution: {integrity: sha512-5nxDo7TwKB5InYBl4ZC//1g9GRwB/F3TXOGR9hgUjMGfvSP4Vu5NkpNro2+1+TIEy1vwxApl5ircECr2ri5JIw==} + conventional-commits-parser@6.2.0: + resolution: {integrity: sha512-uLnoLeIW4XaoFtH37qEcg/SXMJmKF4vi7V0H2rnPueg+VEtFGA/asSCNTcq4M/GQ6QmlzchAEtOoDTtKqWeHag==} engines: {node: '>=18'} hasBin: true @@ -1591,8 +1591,8 @@ packages: engines: {node: '>=4'} hasBin: true - cssstyle@4.3.1: - resolution: {integrity: sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q==} + cssstyle@4.4.0: + resolution: {integrity: sha512-W0Y2HOXlPkb2yaKrCVRjinYKciu/qSLEmK0K9mcfDei3zwlnHFEHAs/Du3cIRwPqY+J4JsiBzUjoHyc8RsJ03A==} engines: {node: '>=18'} dargs@8.1.0: @@ -1695,8 +1695,8 @@ packages: encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - entities@6.0.0: - resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} env-ci@11.1.1: @@ -2817,8 +2817,8 @@ packages: resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} - normalize-url@8.0.1: - resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + normalize-url@8.0.2: + resolution: {integrity: sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==} engines: {node: '>=14.16'} npm-bundled@4.0.0: @@ -3546,6 +3546,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + super-regex@1.0.0: resolution: {integrity: sha512-CY8u7DtbvucKuquCmOFEKhr9Besln7n9uN8eFbwcoGYWXOMW07u2o8njWaiXt11ylS3qoGF55pILjRmPlbodyg==} engines: {node: '>=18'} @@ -3765,8 +3768,8 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - unrs-resolver@1.7.11: - resolution: {integrity: sha512-OhuAzBImFPjKNgZ2JwHMfGFUA6NSbRegd1+BPjC1Y0E6X9Y/vJ4zKeGmIMqmlYboj6cMNEwKI+xQisrg4J0HaQ==} + unrs-resolver@1.7.12: + resolution: {integrity: sha512-pfcdDxrVoUc5ZB3VCVJNSWbs63lgQVYLVw4k/rCr8Smi/V2Sxi1odEckVq6Zf803OtbYia1+YpiGCZoODfWLsQ==} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -3785,13 +3788,13 @@ packages: resolution: {integrity: sha512-OaI//3H0J7ZkR1OqlhGA8cA+Cbk/2xFOQpJOt5+s27/ta9eZwpeervh4Mxh4w0im/kdgktowaqVNR7QOrUd7Yg==} engines: {node: ^18.17.0 || >=20.5.0} - validate-package-exports@0.9.0: - resolution: {integrity: sha512-RwUlxGEn/IlqKafowO5HRX6mrCr6vCAAaKV4rM4nOhhkOySugIEK+LvPW7XFwEmrxsI/3YEFZJyKjjYmw26ssQ==} + validate-package-exports@0.11.0: + resolution: {integrity: sha512-KnNBW08MhY6lYapvkuPoCXyVKD8kj9YuJWzFU8RxQnabQd5A7qsNFWgVFUTKzq/ETnI8/Opld2Fvp2YUDpQT3Q==} engines: {node: '>=20.17.0'} hasBin: true - vite-node@3.2.2: - resolution: {integrity: sha512-Xj/jovjZvDXOq2FgLXu8NsY4uHUMWtzVmMC2LkCu9HWdr9Qu1Is5sanX3Z4jOFKdohfaWDnEJWp9pRP0vVpAcA==} + vite-node@3.2.3: + resolution: {integrity: sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true @@ -3835,16 +3838,16 @@ packages: yaml: optional: true - vitest@3.2.2: - resolution: {integrity: sha512-fyNn/Rp016Bt5qvY0OQvIUCwW2vnaEBLxP42PmKbNIoasSYjML+8xyeADOPvBe+Xfl/ubIw4og7Lt9jflRsCNw==} + vitest@3.2.3: + resolution: {integrity: sha512-E6U2ZFXe3N/t4f5BwUaVCKRLHqUpk1CBWeMh78UT4VaTPH/2dyvH6ALl29JTovEPu9dVKr/K/J4PkXgrMbw4Ww==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.2 - '@vitest/ui': 3.2.2 + '@vitest/browser': 3.2.3 + '@vitest/ui': 3.2.3 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -4561,7 +4564,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@napi-rs/wasm-runtime@0.2.10': + '@napi-rs/wasm-runtime@0.2.11': dependencies: '@emnapi/core': 1.4.3 '@emnapi/runtime': 1.4.3 @@ -4844,7 +4847,7 @@ snapshots: conventional-changelog-angular: 8.0.0 conventional-changelog-writer: 8.1.0 conventional-commits-filter: 5.0.0 - conventional-commits-parser: 6.1.0 + conventional-commits-parser: 6.2.0 debug: 4.4.1 import-from-esm: 2.0.0 lodash-es: 4.17.21 @@ -4885,7 +4888,7 @@ snapshots: fs-extra: 11.3.0 lodash-es: 4.17.21 nerf-dart: 1.0.0 - normalize-url: 8.0.1 + normalize-url: 8.0.2 npm: 10.9.2 rc: 1.2.8 read-pkg: 9.0.1 @@ -4899,7 +4902,7 @@ snapshots: conventional-changelog-angular: 8.0.0 conventional-changelog-writer: 8.1.0 conventional-commits-filter: 5.0.0 - conventional-commits-parser: 6.1.0 + conventional-commits-parser: 6.2.0 debug: 4.4.1 get-stream: 7.0.1 import-from-esm: 2.0.0 @@ -5065,60 +5068,60 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@unrs/resolver-binding-darwin-arm64@1.7.11': + '@unrs/resolver-binding-darwin-arm64@1.7.12': optional: true - '@unrs/resolver-binding-darwin-x64@1.7.11': + '@unrs/resolver-binding-darwin-x64@1.7.12': optional: true - '@unrs/resolver-binding-freebsd-x64@1.7.11': + '@unrs/resolver-binding-freebsd-x64@1.7.12': optional: true - '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.11': + '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.12': optional: true - '@unrs/resolver-binding-linux-arm-musleabihf@1.7.11': + '@unrs/resolver-binding-linux-arm-musleabihf@1.7.12': optional: true - '@unrs/resolver-binding-linux-arm64-gnu@1.7.11': + '@unrs/resolver-binding-linux-arm64-gnu@1.7.12': optional: true - '@unrs/resolver-binding-linux-arm64-musl@1.7.11': + '@unrs/resolver-binding-linux-arm64-musl@1.7.12': optional: true - '@unrs/resolver-binding-linux-ppc64-gnu@1.7.11': + '@unrs/resolver-binding-linux-ppc64-gnu@1.7.12': optional: true - '@unrs/resolver-binding-linux-riscv64-gnu@1.7.11': + '@unrs/resolver-binding-linux-riscv64-gnu@1.7.12': optional: true - '@unrs/resolver-binding-linux-riscv64-musl@1.7.11': + '@unrs/resolver-binding-linux-riscv64-musl@1.7.12': optional: true - '@unrs/resolver-binding-linux-s390x-gnu@1.7.11': + '@unrs/resolver-binding-linux-s390x-gnu@1.7.12': optional: true - '@unrs/resolver-binding-linux-x64-gnu@1.7.11': + '@unrs/resolver-binding-linux-x64-gnu@1.7.12': optional: true - '@unrs/resolver-binding-linux-x64-musl@1.7.11': + '@unrs/resolver-binding-linux-x64-musl@1.7.12': optional: true - '@unrs/resolver-binding-wasm32-wasi@1.7.11': + '@unrs/resolver-binding-wasm32-wasi@1.7.12': dependencies: - '@napi-rs/wasm-runtime': 0.2.10 + '@napi-rs/wasm-runtime': 0.2.11 optional: true - '@unrs/resolver-binding-win32-arm64-msvc@1.7.11': + '@unrs/resolver-binding-win32-arm64-msvc@1.7.12': optional: true - '@unrs/resolver-binding-win32-ia32-msvc@1.7.11': + '@unrs/resolver-binding-win32-ia32-msvc@1.7.12': optional: true - '@unrs/resolver-binding-win32-x64-msvc@1.7.11': + '@unrs/resolver-binding-win32-x64-msvc@1.7.12': optional: true - '@vitest/coverage-v8@3.2.2(vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0))': + '@vitest/coverage-v8@3.2.3(vitest@3.2.3(@types/node@22.15.30)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -5133,48 +5136,49 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0) + vitest: 3.2.3(@types/node@22.15.30)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@vitest/expect@3.2.2': + '@vitest/expect@3.2.3': dependencies: '@types/chai': 5.2.2 - '@vitest/spy': 3.2.2 - '@vitest/utils': 3.2.2 + '@vitest/spy': 3.2.3 + '@vitest/utils': 3.2.3 chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.2(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(yaml@2.8.0))': + '@vitest/mocker@3.2.3(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(yaml@2.8.0))': dependencies: - '@vitest/spy': 3.2.2 + '@vitest/spy': 3.2.3 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(yaml@2.8.0) - '@vitest/pretty-format@3.2.2': + '@vitest/pretty-format@3.2.3': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.2.2': + '@vitest/runner@3.2.3': dependencies: - '@vitest/utils': 3.2.2 + '@vitest/utils': 3.2.3 pathe: 2.0.3 + strip-literal: 3.0.0 - '@vitest/snapshot@3.2.2': + '@vitest/snapshot@3.2.3': dependencies: - '@vitest/pretty-format': 3.2.2 + '@vitest/pretty-format': 3.2.3 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.2.2': + '@vitest/spy@3.2.3': dependencies: tinyspy: 4.0.3 - '@vitest/utils@3.2.2': + '@vitest/utils@3.2.3': dependencies: - '@vitest/pretty-format': 3.2.2 + '@vitest/pretty-format': 3.2.3 loupe: 3.1.3 tinyrainbow: 2.0.0 @@ -5196,7 +5200,7 @@ snapshots: dependencies: prettier: 3.5.3 - '@webdeveric/utils@0.56.0': {} + '@webdeveric/utils@0.61.0': {} JSONStream@1.3.5: dependencies: @@ -5205,11 +5209,11 @@ snapshots: abbrev@3.0.1: {} - acorn-jsx@5.3.2(acorn@8.14.1): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.1 + acorn: 8.15.0 - acorn@8.14.1: {} + acorn@8.15.0: {} agent-base@7.1.3: {} @@ -5553,7 +5557,7 @@ snapshots: meow: 12.1.1 split2: 4.2.0 - conventional-commits-parser@6.1.0: + conventional-commits-parser@6.2.0: dependencies: meow: 13.2.0 @@ -5676,7 +5680,7 @@ snapshots: cssesc@3.0.0: {} - cssstyle@4.3.1: + cssstyle@4.4.0: dependencies: '@asamuzakjp/css-color': 3.2.0 rrweb-cssom: 0.8.0 @@ -5775,7 +5779,7 @@ snapshots: iconv-lite: 0.6.3 optional: true - entities@6.0.0: {} + entities@6.0.1: {} env-ci@11.1.1: dependencies: @@ -5918,12 +5922,12 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-import-context@0.1.8(unrs-resolver@1.7.11): + eslint-import-context@0.1.8(unrs-resolver@1.7.12): dependencies: get-tsconfig: 4.10.1 stable-hash-x: 0.1.1 optionalDependencies: - unrs-resolver: 1.7.11 + unrs-resolver: 1.7.12 eslint-import-resolver-node@0.3.9: dependencies: @@ -5937,12 +5941,12 @@ snapshots: dependencies: debug: 4.4.1 eslint: 8.57.1 - eslint-import-context: 0.1.8(unrs-resolver@1.7.11) + eslint-import-context: 0.1.8(unrs-resolver@1.7.12) get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash-x: 0.1.1 tinyglobby: 0.2.14 - unrs-resolver: 1.7.11 + unrs-resolver: 1.7.12 optionalDependencies: eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.3)(eslint@8.57.1) transitivePeerDependencies: @@ -6040,8 +6044,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -6698,7 +6702,7 @@ snapshots: jsdom@26.1.0: dependencies: - cssstyle: 4.3.1 + cssstyle: 4.4.0 data-urls: 5.0.0 decimal.js: 10.5.0 html-encoding-sniffer: 4.0.0 @@ -7031,7 +7035,7 @@ snapshots: semver: 7.7.2 validate-npm-package-license: 3.0.4 - normalize-url@8.0.1: {} + normalize-url@8.0.2: {} npm-bundled@4.0.0: dependencies: @@ -7255,7 +7259,7 @@ snapshots: parse5@7.3.0: dependencies: - entities: 6.0.0 + entities: 6.0.1 path-exists@3.0.0: {} @@ -7773,6 +7777,10 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + super-regex@1.0.0: dependencies: function-timeout: 1.0.2 @@ -7993,27 +8001,27 @@ snapshots: universalify@2.0.1: {} - unrs-resolver@1.7.11: + unrs-resolver@1.7.12: dependencies: napi-postinstall: 0.2.4 optionalDependencies: - '@unrs/resolver-binding-darwin-arm64': 1.7.11 - '@unrs/resolver-binding-darwin-x64': 1.7.11 - '@unrs/resolver-binding-freebsd-x64': 1.7.11 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.7.11 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.7.11 - '@unrs/resolver-binding-linux-arm64-gnu': 1.7.11 - '@unrs/resolver-binding-linux-arm64-musl': 1.7.11 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.7.11 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.7.11 - '@unrs/resolver-binding-linux-riscv64-musl': 1.7.11 - '@unrs/resolver-binding-linux-s390x-gnu': 1.7.11 - '@unrs/resolver-binding-linux-x64-gnu': 1.7.11 - '@unrs/resolver-binding-linux-x64-musl': 1.7.11 - '@unrs/resolver-binding-wasm32-wasi': 1.7.11 - '@unrs/resolver-binding-win32-arm64-msvc': 1.7.11 - '@unrs/resolver-binding-win32-ia32-msvc': 1.7.11 - '@unrs/resolver-binding-win32-x64-msvc': 1.7.11 + '@unrs/resolver-binding-darwin-arm64': 1.7.12 + '@unrs/resolver-binding-darwin-x64': 1.7.12 + '@unrs/resolver-binding-freebsd-x64': 1.7.12 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.7.12 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.7.12 + '@unrs/resolver-binding-linux-arm64-gnu': 1.7.12 + '@unrs/resolver-binding-linux-arm64-musl': 1.7.12 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.7.12 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.7.12 + '@unrs/resolver-binding-linux-riscv64-musl': 1.7.12 + '@unrs/resolver-binding-linux-s390x-gnu': 1.7.12 + '@unrs/resolver-binding-linux-x64-gnu': 1.7.12 + '@unrs/resolver-binding-linux-x64-musl': 1.7.12 + '@unrs/resolver-binding-wasm32-wasi': 1.7.12 + '@unrs/resolver-binding-win32-arm64-msvc': 1.7.12 + '@unrs/resolver-binding-win32-ia32-msvc': 1.7.12 + '@unrs/resolver-binding-win32-x64-msvc': 1.7.12 uri-js@4.4.1: dependencies: @@ -8030,15 +8038,15 @@ snapshots: validate-npm-package-name@6.0.1: {} - validate-package-exports@0.9.0: + validate-package-exports@0.11.0: dependencies: '@npmcli/arborist': 9.1.1 - '@webdeveric/utils': 0.56.0 + '@webdeveric/utils': 0.61.0 npm-packlist: 10.0.0 transitivePeerDependencies: - supports-color - vite-node@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(yaml@2.8.0): + vite-node@3.2.3(@types/node@22.15.30)(jiti@2.4.2)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 @@ -8073,16 +8081,16 @@ snapshots: jiti: 2.4.2 yaml: 2.8.0 - vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0): + vitest@3.2.3(@types/node@22.15.30)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 - '@vitest/expect': 3.2.2 - '@vitest/mocker': 3.2.2(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(yaml@2.8.0)) - '@vitest/pretty-format': 3.2.2 - '@vitest/runner': 3.2.2 - '@vitest/snapshot': 3.2.2 - '@vitest/spy': 3.2.2 - '@vitest/utils': 3.2.2 + '@vitest/expect': 3.2.3 + '@vitest/mocker': 3.2.3(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(yaml@2.8.0)) + '@vitest/pretty-format': 3.2.3 + '@vitest/runner': 3.2.3 + '@vitest/snapshot': 3.2.3 + '@vitest/spy': 3.2.3 + '@vitest/utils': 3.2.3 chai: 5.2.0 debug: 4.4.1 expect-type: 1.2.1 @@ -8096,7 +8104,7 @@ snapshots: tinypool: 1.1.0 tinyrainbow: 2.0.0 vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(yaml@2.8.0) - vite-node: 3.2.2(@types/node@22.15.30)(jiti@2.4.2)(yaml@2.8.0) + vite-node: 3.2.3(@types/node@22.15.30)(jiti@2.4.2)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.15.30 diff --git a/src/chunk.ts b/src/chunk.ts new file mode 100644 index 0000000..219e9a2 --- /dev/null +++ b/src/chunk.ts @@ -0,0 +1,17 @@ +export function* chunk(items: T[], chunkSize: number): Generator { + if (!Number.isSafeInteger(chunkSize) || chunkSize <= 0) { + throw new RangeError('Chunk size must be an integer greater than 0'); + } + + const length = items.length; + + if (length === 0) { + yield items; + + return; + } + + for (let i = 0; i < length; i += chunkSize) { + yield items.slice(i, i + chunkSize); + } +} diff --git a/src/index.ts b/src/index.ts index 7a01ac9..13323e2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,6 +9,7 @@ export * from './asArray.js'; export * from './asError.js'; export * from './capitalize.js'; export * from './cartesian.js'; +export * from './chunk.js'; export * from './clamp.js'; export * from './combinations.js'; export * from './comment.js'; diff --git a/test/chunk.test.ts b/test/chunk.test.ts new file mode 100644 index 0000000..b2aa08c --- /dev/null +++ b/test/chunk.test.ts @@ -0,0 +1,34 @@ +import { isGeneratorFunction } from 'node:util/types'; + +import { describe, expect, it } from 'vitest'; + +import { chunk } from '../src/chunk.js'; + +describe('chunk()', () => { + it('Returns a generator', () => { + expect(isGeneratorFunction(chunk)).toBeTruthy(); + }); + + it.each([0, -1, 1.5, Number.NaN, Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY])( + 'Should throw an error if chunkSize is invalid: "%s"', + (chunkSize) => { + expect(() => Array.from(chunk([], chunkSize))).toThrow(); + }, + ); + + it('Yields arrays with length not to exceed chunkSize', () => { + expect(Array.from(chunk(['a', 'b'], 10))).toEqual([['a', 'b']]); + expect(Array.from(chunk(['a', 'b'], 1))).toEqual([['a'], ['b']]); + expect(Array.from(chunk(['a', 'b', 'c'], 2))).toEqual([['a', 'b'], ['c']]); + }); + + it('Returns input if it is empty', () => { + const fn = chunk([], 10); + + expect(fn.next().value).toEqual([]); + expect(fn.next()).toEqual({ + done: true, + value: undefined, + }); + }); +});