{"_id":"utilful","_rev":"26-ebd44f6d5026d002c0268246c9c7b80a","name":"utilful","dist-tags":{"latest":"3.4.0"},"versions":{"1.0.0":{"name":"utilful","version":"1.0.0","author":"","license":"ISC","_id":"utilful@1.0.0","maintainers":[{"name":"johannschopplich","email":"mail@johannschopplich.com"}],"dist":{"shasum":"47ee09ca223b0cdac7728686d48ffefd3e4f436e","tarball":"https://registry.npmjs.org/utilful/-/utilful-1.0.0.tgz","fileCount":1,"integrity":"sha512-SVybJp9LjZIgECiidjV5It0rjWqNlUpNk4m9sjCmxXizDapD3nf9gBPhwtYiaCOYjUhyxRWIdxVVnO9q7xGWDQ==","signatures":[{"sig":"MEQCIEXQxn+7SLg6B8pUbKL35PlbR1oDR4PTLO3SL1QYbHjcAiAjg7yThyP6+/Xti2jNJo+iCoHZRkT2MMMGi13/vsGg2Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":203},"main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"johannschopplich","email":"mail@johannschopplich.com"},"_npmVersion":"10.5.0","directories":{},"_nodeVersion":"20.12.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utilful_1.0.0_1721287387996_0.4343643207293255","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"utilful","version":"1.1.0","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@1.1.0","maintainers":[{"name":"johannschopplich","email":"mail@johannschopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"29f97e2a46129ce29dedf66004de050d944726b9","tarball":"https://registry.npmjs.org/utilful/-/utilful-1.1.0.tgz","fileCount":36,"integrity":"sha512-IvaNTWL1Mk+bxlxdtiPbbgUKtfyMhtqiaF+jHMdDujrW8SrR/4Tuw16AsaKBddm4KbZ+/ZxzrIHwl0xXhfaVEQ==","signatures":[{"sig":"MEYCIQCnwIzEOZflo0ceUzlOd77hTN4knECCMNYPPqphTbwuvAIhAJRkfjpD+P/IrnhdfcY1sZDHbj29Fz4bX/wXc71B59ds","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38097},"pnpm":{"onlyBuiltDependencies":["esbuild"]},"type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./lazy":{"types":"./dist/lazy.d.mts","default":"./dist/lazy.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"}},"gitHead":"640896c206bdd7992e1127b23bcba51be9e7b5e6","scripts":{"lint":"eslint .","test":"vitest","build":"unbuild","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"johannschopplich","email":"mail@johannschopplich.com"},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"10.8.2","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"20.18.3","_hasShrinkwrap":false,"packageManager":"pnpm@10.5.2","devDependencies":{"bumpp":"^10.0.3","eslint":"^9.21.0","vitest":"^3.0.7","unbuild":"^3.5.0","typescript":"^5.7.3","@types/node":"^22.13.5","@antfu/eslint-config":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/utilful_1.1.0_1740727269877_0.7712391931569411","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"utilful","version":"1.1.1","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@1.1.1","maintainers":[{"name":"johannschopplich","email":"mail@johannschopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"82c3a4d65e98be27822e19ab8734a1560ee1e999","tarball":"https://registry.npmjs.org/utilful/-/utilful-1.1.1.tgz","fileCount":36,"integrity":"sha512-ikG3Rt+G8kzPOHybIsHvHL/GUvGljK92CXYDaRTGvFfOmqoWKlmhoQCcV3XM1ejHWG0KTPjZt0E0E5/RYMTW/Q==","signatures":[{"sig":"MEUCICJVrYDaloU1eTFidPVQzSiXiJJOBcgxI/YcbWKk1CYGAiEA5lDh45jj4xj1aDUk7YPO8s7vqXTxHRpt7CUYOVMJ5CQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38367},"pnpm":{"onlyBuiltDependencies":["esbuild"]},"type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./lazy":{"types":"./dist/lazy.d.mts","default":"./dist/lazy.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"}},"gitHead":"4c21768dc9ba03eac3796909e01c6068b6378e96","scripts":{"lint":"eslint .","test":"vitest","build":"unbuild","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"johannschopplich","email":"mail@johannschopplich.com"},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"10.8.2","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"20.18.3","_hasShrinkwrap":false,"packageManager":"pnpm@10.5.2","devDependencies":{"bumpp":"^10.0.3","eslint":"^9.21.0","vitest":"^3.0.7","unbuild":"^3.5.0","typescript":"^5.7.3","@types/node":"^22.13.5","@antfu/eslint-config":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/utilful_1.1.1_1740727653541_0.932322950539713","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"utilful","version":"1.2.0","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@1.2.0","maintainers":[{"name":"johannschopplich","email":"mail@johannschopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"09e39abba29ac8e4d5c0594c903b55778fdedf77","tarball":"https://registry.npmjs.org/utilful/-/utilful-1.2.0.tgz","fileCount":36,"integrity":"sha512-4qJ/PP1fuvQoPXpKdp0GP6Vfjx7nacI8ACWG4C+uACJ7d8VAVc6IEJoeICTnq21PRYIlLpTS/oBkBf5UzDYJPw==","signatures":[{"sig":"MEQCIDUEMibU9Tih3CVUEqJV4nayh7RCIPJaHGOJcYRJYS3wAiA8crDwVS2ExL+LQbvYdckxISAVb3+1Op1Xi0x/bn+Pww==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39062},"pnpm":{"onlyBuiltDependencies":["esbuild"]},"type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./lazy":{"types":"./dist/lazy.d.mts","default":"./dist/lazy.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"}},"gitHead":"4fe95bedf99c96a174ae62476733159f65fe8868","scripts":{"lint":"eslint .","test":"vitest","build":"unbuild","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"johannschopplich","email":"mail@johannschopplich.com"},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"10.8.2","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"20.18.3","_hasShrinkwrap":false,"packageManager":"pnpm@10.5.2","devDependencies":{"bumpp":"^10.0.3","eslint":"^9.21.0","vitest":"^3.0.7","unbuild":"^3.5.0","typescript":"^5.7.3","@types/node":"^22.13.5","@antfu/eslint-config":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/utilful_1.2.0_1740734940112_0.21059402153923035","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"utilful","version":"1.2.1","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@1.2.1","maintainers":[{"name":"johannschopplich","email":"mail@johannschopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"7985f83ab6a52a3da034ce04408a4a4ff4980a60","tarball":"https://registry.npmjs.org/utilful/-/utilful-1.2.1.tgz","fileCount":36,"integrity":"sha512-KnJOCNtvEuXt5IeCrTgOfu6Yx73XO1OnFWwlNAnUAFmyP4PQY+j5vRCQNkoeTdHuAj2YdMZ4lMcw+Jb2sf+mlg==","signatures":[{"sig":"MEUCIQDYt9exb8UtDYabYwJjo5aQPHK8Kdnva+MJfSaML2KUgAIgLVzQHTDJWSSfp8nr5Rai7l3hekmEkxS4AciwcWr6U5s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38675},"pnpm":{"onlyBuiltDependencies":["esbuild"]},"type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./lazy":{"types":"./dist/lazy.d.mts","default":"./dist/lazy.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"}},"gitHead":"a60a8a7c6bffe7c2fec4f9c07f743efccf010600","scripts":{"lint":"eslint .","test":"vitest","build":"unbuild","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"johannschopplich","email":"mail@johannschopplich.com"},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"10.9.2","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.5.2","devDependencies":{"bumpp":"^10.0.3","eslint":"^9.21.0","vitest":"^3.0.7","unbuild":"^3.5.0","typescript":"^5.7.3","@types/node":"^22.13.5","@antfu/eslint-config":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/utilful_1.2.1_1740904164594_0.5778643763767817","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"utilful","version":"2.0.0","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@2.0.0","maintainers":[{"name":"johannschopplich","email":"mail@johannschopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"48753997f0ae3ff9ba5d965bd70046b09f152950","tarball":"https://registry.npmjs.org/utilful/-/utilful-2.0.0.tgz","fileCount":36,"integrity":"sha512-vPegw7avEOzawoHsfjOZt1Rm9pT1xPqJi/3vq/U+ua+lxua0BmEyJj3QoRNRAxOV1HtEV8qZAG5ptU7/wolYKg==","signatures":[{"sig":"MEQCIH7u/+0TBdtv8j/L0NvkWTbTA7tmHEa6c8ClL0SDpMfGAiB1B9mbxa+VbeKk7vYLutnVwzyWMd6Lpj+JcGpPtDQh+A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45337},"pnpm":{"onlyBuiltDependencies":["esbuild"]},"type":"module","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./result":{"types":"./dist/result.d.mts","default":"./dist/result.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"}},"gitHead":"04b7dec4163bc2e338693c89637ff93524f89fb8","scripts":{"lint":"eslint .","test":"vitest","build":"unbuild","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"johannschopplich","email":"mail@johannschopplich.com"},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"10.9.2","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.5.2","devDependencies":{"bumpp":"^10.0.3","eslint":"^9.21.0","vitest":"^3.0.7","unbuild":"^3.5.0","typescript":"^5.7.3","@types/node":"^22.13.5","@antfu/eslint-config":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/utilful_2.0.0_1743174843276_0.8537001657770289","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"utilful","version":"2.1.0","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@2.1.0","maintainers":[{"name":"johannschopplich","email":"mail@johannschopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"936bcaf3e38e1eff5c94e1026556cbbd01a78e42","tarball":"https://registry.npmjs.org/utilful/-/utilful-2.1.0.tgz","fileCount":27,"integrity":"sha512-SIo60vWoQAtdamLgqQ89Jbfdhk2bYE0kv97/N5KLW2he+v08V5MECTMgdN3Hi++bOTg6VEYjHWmlND9kuoELhw==","signatures":[{"sig":"MEYCIQCEM0KYbR8CNZL1z5sieK6CHv2e1QE2uMzrrJf2uFqosAIhAOIWJvbl5o2iML6tJ7DcGqKd5MuFVSRtjBaogx68MA30","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42920},"pnpm":{"onlyBuiltDependencies":["esbuild","unrs-resolver"]},"type":"module","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./defu":{"types":"./dist/defu.d.mts","default":"./dist/defu.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./result":{"types":"./dist/result.d.mts","default":"./dist/result.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/emitter.d.mts","default":"./dist/emitter.mjs"}},"gitHead":"f54379990ff447d7e246a060365b17adc47adf63","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"johannschopplich","email":"mail@johannschopplich.com"},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"10.9.2","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.11.0","devDependencies":{"bumpp":"^10.1.1","eslint":"^9.27.0","tsdown":"^0.12.3","vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21","@antfu/eslint-config":"^4.13.2"},"_npmOperationalInternal":{"tmp":"tmp/utilful_2.1.0_1749051935705_0.06087602246956081","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"utilful","version":"2.1.1","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@2.1.1","maintainers":[{"name":"johannschopplich","email":"mail@johannschopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"0153db0b0e144f69502f9a622bfb0cd63c4ffdc1","tarball":"https://registry.npmjs.org/utilful/-/utilful-2.1.1.tgz","fileCount":27,"integrity":"sha512-RA0l7Xi+OMwgdaWK3kaSEun8ZDOzhqWxds0pyjtrnqLGLOQCFBcSSrbmYi83a1N5FKHs8C9SZC7O1yK6puqw+w==","signatures":[{"sig":"MEYCIQDIbXO7AaC4/e6uC7WgJA5Ke36QFmZU+TSPB0zHN3zimgIhAOulnXcoYla4IRPTABNl1xjbA/tEimsC9XL6ARW30U51","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42849},"pnpm":{"onlyBuiltDependencies":["esbuild","unrs-resolver"]},"type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./csv":{"types":"./dist/csv.d.ts","default":"./dist/csv.js"},"./defu":{"types":"./dist/defu.d.ts","default":"./dist/defu.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./array":{"types":"./dist/array.d.ts","default":"./dist/array.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./module":{"types":"./dist/module.d.ts","default":"./dist/module.js"},"./object":{"types":"./dist/object.d.ts","default":"./dist/object.js"},"./result":{"types":"./dist/result.d.ts","default":"./dist/result.js"},"./string":{"types":"./dist/string.d.ts","default":"./dist/string.js"},"./emitter":{"types":"./dist/emitter.d.ts","default":"./dist/emitter.js"}},"gitHead":"90e8faa263841e7e03a452a88561ca6d2676ac02","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"johannschopplich","email":"mail@johannschopplich.com"},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"10.9.2","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.11.1","devDependencies":{"bumpp":"^10.1.1","eslint":"^9.28.0","tsdown":"^0.12.6","vitest":"^3.2.1","typescript":"^5.8.3","@types/node":"^22.15.29","@antfu/eslint-config":"^4.13.3"},"_npmOperationalInternal":{"tmp":"tmp/utilful_2.1.1_1749052083676_0.5178379672494666","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"utilful","version":"2.2.0","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@2.2.0","maintainers":[{"name":"johannschopplich","email":"johann@schopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"4efe13c075f3b13c90b6875db9bc4d5cc35f5e45","tarball":"https://registry.npmjs.org/utilful/-/utilful-2.2.0.tgz","fileCount":27,"integrity":"sha512-g+kZJ2vybUJHccf/IJkpwNsKzLKNEkutTVgjJsObKcBreTQOlmETdBPtD+7sxWvZLn3MGCMmD/pK7H/t6WeEaw==","signatures":[{"sig":"MEYCIQDy2Qc7wMtcDU36IFZSG5TcM6sFvwhc7OT+iqcZKoKLMQIhAJhoGITrArkCORnmdqLwg664hDZCbxEOInZ29etkTKrs","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/utilful@2.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":44460},"pnpm":{"onlyBuiltDependencies":["esbuild","unrs-resolver"]},"type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./csv":{"types":"./dist/csv.d.ts","default":"./dist/csv.js"},"./defu":{"types":"./dist/defu.d.ts","default":"./dist/defu.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./array":{"types":"./dist/array.d.ts","default":"./dist/array.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./module":{"types":"./dist/module.d.ts","default":"./dist/module.js"},"./object":{"types":"./dist/object.d.ts","default":"./dist/object.js"},"./result":{"types":"./dist/result.d.ts","default":"./dist/result.js"},"./string":{"types":"./dist/string.d.ts","default":"./dist/string.js"},"./emitter":{"types":"./dist/emitter.d.ts","default":"./dist/emitter.js"}},"gitHead":"5ce1b5a14fef3ab51aece47ea8ac82d91427d6d3","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d507872-642e-4237-9753-d5e59487404d"}},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"11.6.2","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"24.11.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"bumpp":"^10.3.1","eslint":"^9.39.1","tsdown":"^0.16.1","vitest":"^4.0.8","typescript":"^5.9.3","@types/node":"^24.10.0","@antfu/eslint-config":"^6.2.0"},"_npmOperationalInternal":{"tmp":"tmp/utilful_2.2.0_1762798133275_0.6046245423018113","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"utilful","version":"2.2.1","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@2.2.1","maintainers":[{"name":"johannschopplich","email":"johann@schopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"4146e295a53f31cfd433cb8ddfa26492bebd525e","tarball":"https://registry.npmjs.org/utilful/-/utilful-2.2.1.tgz","fileCount":27,"integrity":"sha512-ANaNSa3WGfXeNhqLNeE2flSHh7pBBhL4Dkwulnj1IWb/jWO7tjDCOyAki9eOIszCoqMjsE1TLENc21m0lw6QCA==","signatures":[{"sig":"MEUCIC/J5cphGLOaWI7kf92u25pAgyQin7osCWMD9b7wiFsEAiEA5HLYbVlyjdkJ2KKzO6wBqp8cjr812qBXmVo6kFBEAyQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/utilful@2.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":44847},"pnpm":{"onlyBuiltDependencies":["esbuild","unrs-resolver"]},"type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./csv":{"types":"./dist/csv.d.ts","default":"./dist/csv.js"},"./defu":{"types":"./dist/defu.d.ts","default":"./dist/defu.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./array":{"types":"./dist/array.d.ts","default":"./dist/array.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./module":{"types":"./dist/module.d.ts","default":"./dist/module.js"},"./object":{"types":"./dist/object.d.ts","default":"./dist/object.js"},"./result":{"types":"./dist/result.d.ts","default":"./dist/result.js"},"./string":{"types":"./dist/string.d.ts","default":"./dist/string.js"},"./emitter":{"types":"./dist/emitter.d.ts","default":"./dist/emitter.js"}},"gitHead":"8bbe8b97deec30448ffe0b653d2a21c773596fa3","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d507872-642e-4237-9753-d5e59487404d"}},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"11.6.2","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"24.11.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"bumpp":"^10.3.1","eslint":"^9.39.1","tsdown":"^0.16.1","vitest":"^4.0.8","typescript":"^5.9.3","@types/node":"^24.10.0","@antfu/eslint-config":"^6.2.0"},"_npmOperationalInternal":{"tmp":"tmp/utilful_2.2.1_1762841569097_0.7211287680206828","host":"s3://npm-registry-packages-npm-production"}},"2.2.2":{"name":"utilful","version":"2.2.2","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@2.2.2","maintainers":[{"name":"johannschopplich","email":"johann@schopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"9cfe313aa94b2bdf77d3d0f323d35c4e9228c5fe","tarball":"https://registry.npmjs.org/utilful/-/utilful-2.2.2.tgz","fileCount":26,"integrity":"sha512-gIjKw1jpFUSYWsdi/C53AFv/rNGwF39Cth4kNP2Ez32TVvoAvyKlk93btAkafiaHqXqGShTV/PAjbbiOn0PtNg==","signatures":[{"sig":"MEUCIAzem5lDrVeaQc08zwsaWMjYZbxZGl2C+YvWVOoMAaStAiEAv96jjetzXQEn5fN2Yr1m/VJZ/1RaH7IfnrSvo+0rCu0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/utilful@2.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":44860},"pnpm":{"onlyBuiltDependencies":["esbuild","unrs-resolver"]},"type":"module","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./defu":{"types":"./dist/defu.d.mts","default":"./dist/defu.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./result":{"types":"./dist/result.d.mts","default":"./dist/result.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/emitter.d.mts","default":"./dist/emitter.mjs"}},"gitHead":"5003e849c3b5d861beeca0401049cee912e9179a","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d507872-642e-4237-9753-d5e59487404d"}},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"11.6.2","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"24.11.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"bumpp":"^10.3.1","eslint":"^9.39.1","tsdown":"^0.16.1","vitest":"^4.0.8","typescript":"^5.9.3","@types/node":"^24.10.0","@antfu/eslint-config":"^6.2.0"},"_npmOperationalInternal":{"tmp":"tmp/utilful_2.2.2_1762841927375_0.32414907475000865","host":"s3://npm-registry-packages-npm-production"}},"2.2.3":{"name":"utilful","version":"2.2.3","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@2.2.3","maintainers":[{"name":"johannschopplich","email":"johann@schopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"7a14ee808faa665f7ae942cf1d2f46bd519171bb","tarball":"https://registry.npmjs.org/utilful/-/utilful-2.2.3.tgz","fileCount":26,"integrity":"sha512-kQ5eH5+9NypoDmGzUoDATiWeQxfmAW7bdG4o/4tLw+84OPX4aPhbc0ZVQ7Oa14UCBl/6L8RNlHzD9dWOF9g6Cw==","signatures":[{"sig":"MEUCIQDpWZGBCLG7W0j3crBTbjBHUYBmEK7v4/wGfoP/aI2r0AIgZBzX46xmR5AYdknjeA8wFrYn3r+43uODTBrpa50xGGc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/utilful@2.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":45021},"pnpm":{"onlyBuiltDependencies":["esbuild","unrs-resolver"]},"type":"module","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./defu":{"types":"./dist/defu.d.mts","default":"./dist/defu.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./result":{"types":"./dist/result.d.mts","default":"./dist/result.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/emitter.d.mts","default":"./dist/emitter.mjs"}},"gitHead":"30d20407cf86a48c87ae4eb7a36f5c6fe26bdca6","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d507872-642e-4237-9753-d5e59487404d"}},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"11.6.2","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"24.11.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"bumpp":"^10.3.1","eslint":"^9.39.1","tsdown":"^0.16.1","vitest":"^4.0.8","typescript":"^5.9.3","@types/node":"^24.10.0","@antfu/eslint-config":"^6.2.0"},"_npmOperationalInternal":{"tmp":"tmp/utilful_2.2.3_1762849345012_0.875370343993009","host":"s3://npm-registry-packages-npm-production"}},"2.2.4":{"name":"utilful","version":"2.2.4","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@2.2.4","maintainers":[{"name":"johannschopplich","email":"johann@schopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"e28081a3ce007bffbb943f1e8665586571573def","tarball":"https://registry.npmjs.org/utilful/-/utilful-2.2.4.tgz","fileCount":27,"integrity":"sha512-CWX5eMLjz/S2sctlByyhlxY7jtQ2u6sXvcKfXaaezd0/FXjuh2unXKY91Jvxb3NwFbgoBn+LcYshH57RtItnlA==","signatures":[{"sig":"MEYCIQC3VpQfDC5n3GPSbT2/OJ1YT/RFXY+Yg6I4P++4mEfQmQIhANfgzFVszOEFM1YEUVwSzCJVglCEmvEsXtV1olPrSBit","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/utilful@2.2.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":45033},"pnpm":{"onlyBuiltDependencies":["esbuild","unrs-resolver"]},"type":"module","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./defu":{"types":"./dist/defu.d.mts","default":"./dist/defu.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./result":{"types":"./dist/result.d.mts","default":"./dist/result.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/emitter.d.mts","default":"./dist/emitter.mjs"}},"gitHead":"05c4b7394f56242a4c5a8a66af940417ff62fa99","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d507872-642e-4237-9753-d5e59487404d"}},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"11.6.2","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"24.11.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"bumpp":"^10.3.1","eslint":"^9.39.1","tsdown":"^0.16.1","vitest":"^4.0.8","typescript":"^5.9.3","@types/node":"^24.10.0","@antfu/eslint-config":"^6.2.0"},"_npmOperationalInternal":{"tmp":"tmp/utilful_2.2.4_1762849762425_0.40777595977082104","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"utilful","version":"2.3.0","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@2.3.0","maintainers":[{"name":"johannschopplich","email":"johann@schopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"7ada9bbb5df389d78b72044e09cad6be3c279f71","tarball":"https://registry.npmjs.org/utilful/-/utilful-2.3.0.tgz","fileCount":27,"integrity":"sha512-hRswUExbC68JBqGHwZDHv8LNWsqRafIXvpAaXtg9cHHNt2NnGxKCj11IhMladuWeGLoeVpy/IUcZp7jAux+GjQ==","signatures":[{"sig":"MEUCIC1df71+HNwBhktS6u/qE6g9xr6fIOhbVDRUTjqi81irAiEA+AxTrQqWcgN2KCbJZD8G8aGMSp2U0lQDO+vpPqhAo4U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/utilful@2.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":47052},"pnpm":{"onlyBuiltDependencies":["esbuild","unrs-resolver"]},"type":"module","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./defu":{"types":"./dist/defu.d.mts","default":"./dist/defu.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./result":{"types":"./dist/result.d.mts","default":"./dist/result.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/emitter.d.mts","default":"./dist/emitter.mjs"}},"gitHead":"097a261b4cd90c61824c3269410513edc3827614","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d507872-642e-4237-9753-d5e59487404d"}},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"11.6.2","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"24.11.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"bumpp":"^10.3.1","eslint":"^9.39.1","tsdown":"^0.16.1","vitest":"^4.0.8","typescript":"^5.9.3","@types/node":"^24.10.0","@antfu/eslint-config":"^6.2.0"},"_npmOperationalInternal":{"tmp":"tmp/utilful_2.3.0_1762852282421_0.4502655689134203","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"utilful","version":"2.4.0","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@2.4.0","maintainers":[{"name":"johannschopplich","email":"johann@schopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"c94b0058fdf05fcfcd480087e54949c73b8626d8","tarball":"https://registry.npmjs.org/utilful/-/utilful-2.4.0.tgz","fileCount":27,"integrity":"sha512-9UThaMkK9/5CMnf5WTKAiLzW2Ls7Mcp8O5tufT+RtUHC2EUQb10lJyXJWbrpMai5eBsnZ20uIXQDRpSY0RgJ1A==","signatures":[{"sig":"MEUCIHnbfmcx+JWztGqyTNGWrKirkyFOp/m6xOCnuWVszJjXAiEAv6Pc4AHm8xYMlcQA7bq2oQZVpLEpfXr7YI8OFnamoPE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/utilful@2.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":55585},"pnpm":{"onlyBuiltDependencies":["esbuild","unrs-resolver"]},"type":"module","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./defu":{"types":"./dist/defu.d.mts","default":"./dist/defu.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./result":{"types":"./dist/result.d.mts","default":"./dist/result.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/emitter.d.mts","default":"./dist/emitter.mjs"}},"gitHead":"acb9dc15228832d875e5f16422af54a93d9247e0","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d507872-642e-4237-9753-d5e59487404d"}},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"11.6.4","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"bumpp":"^10.3.1","eslint":"^9.39.1","tsdown":"^0.16.1","vitest":"^4.0.8","typescript":"^5.9.3","@types/node":"^24.10.0","@antfu/eslint-config":"^6.2.0"},"_npmOperationalInternal":{"tmp":"tmp/utilful_2.4.0_1764521335585_0.30845314156487347","host":"s3://npm-registry-packages-npm-production"}},"2.5.0":{"name":"utilful","version":"2.5.0","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@2.5.0","maintainers":[{"name":"johannschopplich","email":"johann@schopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"0e3abc197ceefd799bba73e7afb810d5f34f0e5f","tarball":"https://registry.npmjs.org/utilful/-/utilful-2.5.0.tgz","fileCount":27,"integrity":"sha512-7ituP8fQRtwkUHkvDhPDG6chc0ZifSlblEtRvwbUaKgXIjJjxCbNDt/vXBGWW1cIv+t9dJhbbC7u//c75iBsnQ==","signatures":[{"sig":"MEYCIQDUWodwAIUau11IoS7Y3QOX7y6CtNQFigk957Uc6OnDAAIhAPnPOwuO0SquPYQN6Dy2L6HDiji9bDw4U9DpG4dYpXFM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/utilful@2.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":58837},"pnpm":{"onlyBuiltDependencies":["esbuild","unrs-resolver"]},"type":"module","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./defu":{"types":"./dist/defu.d.mts","default":"./dist/defu.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./result":{"types":"./dist/result.d.mts","default":"./dist/result.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/emitter.d.mts","default":"./dist/emitter.mjs"}},"gitHead":"8f0b0970efa77e090fcd0baf494e3be3db7afda2","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d507872-642e-4237-9753-d5e59487404d"}},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"11.7.0","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.28.0","devDependencies":{"bumpp":"^10.4.0","eslint":"^9.39.2","tsdown":"^0.19.0","vitest":"^4.0.17","typescript":"^5.9.3","@types/node":"^25.0.9","@antfu/eslint-config":"^7.0.1"},"_npmOperationalInternal":{"tmp":"tmp/utilful_2.5.0_1768552957484_0.8171750452185371","host":"s3://npm-registry-packages-npm-production"}},"2.5.1":{"name":"utilful","version":"2.5.1","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@2.5.1","maintainers":[{"name":"johannschopplich","email":"johann@schopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"764d046712847795b1aff17f9d6fb046df8f4e7d","tarball":"https://registry.npmjs.org/utilful/-/utilful-2.5.1.tgz","fileCount":27,"integrity":"sha512-5iYmmt6TbpLjIG6lx9jlWP/F5dMpqMjd0bxmnWFKY2iBSKPWvvsB7cXWTgaKF3Z6MOuakren/3hJxH7z8ZhoLg==","signatures":[{"sig":"MEUCIQCQARXOjqo2m7EJZOb7GsgHS5XHG0PBEwiPTO3qwZsZSAIgN9MwWdtGzAHwDYrWOEfjFjdA1X+oPBfLEhhEKFOEu+M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/utilful@2.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":59059},"pnpm":{"onlyBuiltDependencies":["esbuild","unrs-resolver"]},"type":"module","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./defu":{"types":"./dist/defu.d.mts","default":"./dist/defu.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./result":{"types":"./dist/result.d.mts","default":"./dist/result.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/emitter.d.mts","default":"./dist/emitter.mjs"}},"gitHead":"8cf2f0b36a225294c25fa3e73100d1f11cfc1b75","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d507872-642e-4237-9753-d5e59487404d"}},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"11.7.0","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.28.0","devDependencies":{"bumpp":"^10.4.0","eslint":"^9.39.2","tsdown":"^0.19.0","vitest":"^4.0.17","typescript":"^5.9.3","@types/node":"^25.0.9","@antfu/eslint-config":"^7.0.1"},"_npmOperationalInternal":{"tmp":"tmp/utilful_2.5.1_1768928846227_0.6986366569299058","host":"s3://npm-registry-packages-npm-production"}},"2.5.2":{"name":"utilful","version":"2.5.2","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@2.5.2","maintainers":[{"name":"johannschopplich","email":"johann@schopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"a05f912c682fc7e7ba0fde11e515a25c26c474bf","tarball":"https://registry.npmjs.org/utilful/-/utilful-2.5.2.tgz","fileCount":27,"integrity":"sha512-M6G4iyV/lT1N0lguWOYYiXPwt/4ujVkBakUgt4/t6dRJaJ854mWMMSClNr1UNL/T90fTyC69jdFZtXLKYGqRhA==","signatures":[{"sig":"MEYCIQC/90KJTK95iqgAzvHqYoNCiqgzsu5fNyuE5S7yQUNMEAIhAPZR6d/eICPd95tMLndWnUsS/suMyjexeKxewQvhsX30","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/utilful@2.5.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":59124},"pnpm":{"onlyBuiltDependencies":["esbuild","unrs-resolver"]},"type":"module","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./defu":{"types":"./dist/defu.d.mts","default":"./dist/defu.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./result":{"types":"./dist/result.d.mts","default":"./dist/result.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/emitter.d.mts","default":"./dist/emitter.mjs"}},"gitHead":"bc4ec00b49d1504369f899e9ec71c1e1ff5ebffa","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d507872-642e-4237-9753-d5e59487404d"}},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"11.12.1","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.30.3","devDependencies":{"bumpp":"^10.4.1","eslint":"^10.0.2","tsdown":"^0.21.0","vitest":"^4.0.18","typescript":"^5.9.3","@types/node":"^25.3.5","@antfu/eslint-config":"^7.6.1","eslint-flat-config-utils":"^3.0.1"},"_npmOperationalInternal":{"tmp":"tmp/utilful_2.5.2_1775132923125_0.8741780305152984","host":"s3://npm-registry-packages-npm-production"}},"2.5.3":{"name":"utilful","version":"2.5.3","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@2.5.3","maintainers":[{"name":"johannschopplich","email":"johann@schopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"b599783214592eda0834d1eafae96435e153be56","tarball":"https://registry.npmjs.org/utilful/-/utilful-2.5.3.tgz","fileCount":27,"integrity":"sha512-zkae8oiXLiPifn4yg6tFRvdO4Lml5KcrSu5ftswyMZGyT+DJe/FFHYKFWKg0Hl9FR9Yg2vr7N7Sq8c95zf/mog==","signatures":[{"sig":"MEQCICCiQUi6YOVtyu1k3d229StxMYMjVxo7zRQrjNduSQ04AiAm+aMT4gl1e68NjMV0fl/b0/gm3BDS5G/+7cznubhqPA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/utilful@2.5.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":59515},"pnpm":{"onlyBuiltDependencies":["esbuild","unrs-resolver"]},"type":"module","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./defu":{"types":"./dist/defu.d.mts","default":"./dist/defu.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./result":{"types":"./dist/result.d.mts","default":"./dist/result.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/emitter.d.mts","default":"./dist/emitter.mjs"}},"gitHead":"0571e4505c1c8c17bee2dbe8e606cade9764d0a9","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d507872-642e-4237-9753-d5e59487404d"}},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"11.12.1","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"bumpp":"^11.0.1","eslint":"^10.1.0","tsdown":"^0.21.7","vitest":"^4.1.2","typescript":"^6.0.2","@types/node":"^25.5.0","@antfu/eslint-config":"^7.7.3","eslint-flat-config-utils":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/utilful_2.5.3_1775153137445_0.6009129748322866","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"utilful","version":"3.0.0","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@3.0.0","maintainers":[{"name":"johannschopplich","email":"johann@schopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"594a76ec026e7467a6355b287218c3ecc93239b1","tarball":"https://registry.npmjs.org/utilful/-/utilful-3.0.0.tgz","fileCount":27,"integrity":"sha512-X4/0DXxFMdfPAAcnP7a0sOfPd2jEkNJqF86/gxcogkbA1ohbKBxrM6OlHIRToLmvrDKnFTr5FCldnmpQH1SImw==","signatures":[{"sig":"MEQCICnwAx2FTJ8WV6GFBtsGvHFROPTL/unJRnPe6oJuZlwjAiBsz5nOpF6z5c4uBAhP6lLvK++eVAmJjWkJkPtmSeMHPQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/utilful@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":66573},"type":"module","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./defu":{"types":"./dist/defu.d.mts","default":"./dist/defu.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./result":{"types":"./dist/result.d.mts","default":"./dist/result.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/emitter.d.mts","default":"./dist/emitter.mjs"}},"gitHead":"e2ae42b4fe3db168a9a62c844fef4291eb4e1729","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d507872-642e-4237-9753-d5e59487404d"}},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"12.0.1","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"packageManager":"pnpm@11.15.1","devDependencies":{"bumpp":"^12.0.0","eslint":"^10.7.0","tsdown":"^0.22.13","vitest":"^4.1.10","typescript":"^6.0.3","@types/node":"^26.1.1","@antfu/eslint-config":"^9.1.0","eslint-flat-config-utils":"^3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/utilful_3.0.0_1784655157156_0.778939418906966","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"utilful","version":"3.0.1","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@3.0.1","maintainers":[{"name":"johannschopplich","email":"johann@schopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"dc2d34a4e2d412a2dbb3b2353c8c00a026025ce6","tarball":"https://registry.npmjs.org/utilful/-/utilful-3.0.1.tgz","fileCount":27,"integrity":"sha512-E4iSV0X+1Lzq/Yl1kOOGKMstFZSNzQoVXatqLmSdnaPYvHvJ1mGLod8/eXz4YjJp8+qwXcE6sMu8CUUJwq3i1w==","signatures":[{"sig":"MEUCIQDt9NZt06WxSkY0AC/CUI03xCAtoiTHWWEX3Nfmgqj5MAIgde5+MSblTZU6PKFi7eUmxQJxcbXwPjB5xg83+x+K17A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/utilful@3.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":66770},"type":"module","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./defu":{"types":"./dist/defu.d.mts","default":"./dist/defu.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./result":{"types":"./dist/result.d.mts","default":"./dist/result.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/emitter.d.mts","default":"./dist/emitter.mjs"}},"gitHead":"638c44b8018d0954d894f63afbff0751a4e363fb","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d507872-642e-4237-9753-d5e59487404d"}},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"12.0.2","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"packageManager":"pnpm@11.15.1","devDependencies":{"bumpp":"^12.0.0","eslint":"^10.7.0","tsdown":"^0.22.13","vitest":"^4.1.10","typescript":"^6.0.3","@types/node":"^26.1.1","@antfu/eslint-config":"^9.1.0","eslint-flat-config-utils":"^3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/utilful_3.0.1_1785772920220_0.2752271567076061","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"utilful","version":"3.0.2","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@3.0.2","maintainers":[{"name":"johannschopplich","email":"johann@schopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"702fe3f5fbb8e48045da2f753f02c34730263d1f","tarball":"https://registry.npmjs.org/utilful/-/utilful-3.0.2.tgz","fileCount":27,"integrity":"sha512-Iulm4ZGLTdi44axivhik7cw/8rUXhnZFs2ZhWDMIQ9fQY7FOHq+WUFlaHH+A9ScbleOTrZ2tWMzEZPUeCnACqQ==","signatures":[{"sig":"MEQCIHMHun3hdpGKAAdOccN56iQ8uWjIM+j39/oscdgeI2xYAiBfwDto+KtkiJK6sUVAGn1S5VPyJWJfj6PEsbp0VI4ecQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/utilful@3.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":67214},"type":"module","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./defu":{"types":"./dist/defu.d.mts","default":"./dist/defu.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./result":{"types":"./dist/result.d.mts","default":"./dist/result.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/emitter.d.mts","default":"./dist/emitter.mjs"}},"gitHead":"b7fa9e2b136a7be06d691121e69b206cd0da79a0","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d507872-642e-4237-9753-d5e59487404d"}},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"12.0.2","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"packageManager":"pnpm@11.15.1","devDependencies":{"bumpp":"^12.0.0","eslint":"^10.7.0","tsdown":"^0.22.13","vitest":"^4.1.10","typescript":"^6.0.3","@types/node":"^26.1.1","@antfu/eslint-config":"^9.1.0","eslint-flat-config-utils":"^3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/utilful_3.0.2_1785928265072_0.6830106323603964","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"utilful","version":"3.1.0","keywords":["csv","defu","emitter","result","typescript","url","utilities"],"author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@3.1.0","maintainers":[{"name":"johannschopplich","email":"johann@schopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"05ab6c005ace75bf614b33749e1cea1982f55115","tarball":"https://registry.npmjs.org/utilful/-/utilful-3.1.0.tgz","fileCount":27,"integrity":"sha512-4l6262EYZoIXPkeO6i/55b/4rA1wvFE5Y3g0d8qjk3dg/kiibWbRFfjAxsOcedU1uEkPgOGisX0ZHlqkRBj+KQ==","signatures":[{"sig":"MEYCIQDv7XhFiwlRDf3NJqllRgwK49t6Urkq0YfRu7INRUa7PgIhAN2mqCUAeKb+2X9TNafANxNxslsb1R0PCMHLnQKFllo/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/utilful@3.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":73167},"type":"module","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./defu":{"types":"./dist/defu.d.mts","default":"./dist/defu.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./result":{"types":"./dist/result.d.mts","default":"./dist/result.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/emitter.d.mts","default":"./dist/emitter.mjs"}},"gitHead":"3f95de1550d0d2ddaa71589ad6f78e0c6fbe3146","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d507872-642e-4237-9753-d5e59487404d"}},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"12.0.2","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"packageManager":"pnpm@11.15.1","devDependencies":{"bumpp":"^12.0.0","eslint":"^10.7.0","tsdown":"^0.22.13","vitest":"^4.1.10","typescript":"^6.0.3","@types/node":"^26.1.1","@antfu/eslint-config":"^9.1.0","eslint-flat-config-utils":"^3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/utilful_3.1.0_1785960334106_0.8102148427932214","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"utilful","version":"3.2.0","keywords":["cli","csv","defu","emitter","result","typescript","url","utilities"],"author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@3.2.0","maintainers":[{"name":"johannschopplich","email":"johann@schopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"84354e43c545df2759bcbea91fdc53c6d174148f","tarball":"https://registry.npmjs.org/utilful/-/utilful-3.2.0.tgz","fileCount":42,"integrity":"sha512-Xka53EZS2zHPvjS3qKnHNygcrqdwjWLNqVEHSE6bCnpCl6lVP4xfRI5fZVLv/kZbEF0OkbYaz5XKyi1hSfJA8A==","signatures":[{"sig":"MEUCIQCHRe984ThAd9/Hju1B03JxxeqXU/XI3cnnWK6f6hU4gAIgEDutjNOCH10jASXrUDnlR1u/rcR/u3eiXOrO88yM3Go=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/utilful@3.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":100792},"type":"module","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./cli":{"types":"./dist/cli/index.d.mts","default":"./dist/cli/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./defu":{"types":"./dist/defu.d.mts","default":"./dist/defu.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./result":{"types":"./dist/result.d.mts","default":"./dist/result.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/emitter.d.mts","default":"./dist/emitter.mjs"},"./cli/testing":{"types":"./dist/cli/testing.d.mts","default":"./dist/cli/testing.mjs"}},"gitHead":"e79394546a60db04179f955ae3ebfb6876f40368","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d507872-642e-4237-9753-d5e59487404d"}},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"12.0.2","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"packageManager":"pnpm@11.15.1","devDependencies":{"bumpp":"^12.0.0","eslint":"^10.7.0","tsdown":"^0.22.13","vitest":"^4.1.10","typescript":"^6.0.3","@types/node":"^26.1.1","@antfu/eslint-config":"^9.1.0","eslint-flat-config-utils":"^3.2.0"},"peerDependencies":{"vitest":">=4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/utilful_3.2.0_1788375355841_0.6394682481479916","host":"s3://npm-registry-packages-npm-production"}},"3.3.0":{"name":"utilful","version":"3.3.0","keywords":["cli","csv","defu","emitter","result","typescript","url","utilities"],"author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","_id":"utilful@3.3.0","maintainers":[{"name":"johannschopplich","email":"johann@schopplich.com"}],"homepage":"https://github.com/johannschopplich/utilful#readme","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"1a4c5295b2932d7c873862d4fa4caa62f294bf13","tarball":"https://registry.npmjs.org/utilful/-/utilful-3.3.0.tgz","fileCount":42,"integrity":"sha512-nSe+2vcQSNogCA2CXQqZ4QAWwDJmXrxc1EEbSjqgCcmV42WVwHT5SJUDdoTuWEQWbUb+NT2po1hEX029rDxiKA==","signatures":[{"sig":"MEUCIQCwQ2P6aDBCbVqwPyqOV5L+RvtCwnoLaf58aCCufr4T3gIgGXJBTQRmqcyYfQG0vTnQ4zWL3lekaplTPcgwg+BUbOc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/utilful@3.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":100842},"type":"module","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./cli":{"types":"./dist/cli/index.d.mts","default":"./dist/cli/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./defu":{"types":"./dist/defu.d.mts","default":"./dist/defu.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./result":{"types":"./dist/result.d.mts","default":"./dist/result.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/emitter.d.mts","default":"./dist/emitter.mjs"},"./cli/testing":{"types":"./dist/cli/testing.d.mts","default":"./dist/cli/testing.mjs"}},"gitHead":"b1e12d9056fe2afb858b1a7c0d75ad071a460013","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d507872-642e-4237-9753-d5e59487404d"}},"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"12.0.2","description":"A collection of TypeScript utilities","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"bumpp":"^12.2.2","eslint":"^10.9.1","tsdown":"^0.22.14","vitest":"^4.1.11","typescript":"^6.0.3","@types/node":"^26.4.1","@antfu/eslint-config":"^9.5.0","eslint-flat-config-utils":"^3.2.0"},"peerDependencies":{"vitest":">=4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/utilful_3.3.0_1788419058615_0.19292117837385003","host":"s3://npm-registry-packages-npm-production"}},"3.4.0":{"_id":"utilful@3.4.0","bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"dist":{"shasum":"a655aeae425d7ddfa561fde32641485837fd6780","tarball":"https://registry.npmjs.org/utilful/-/utilful-3.4.0.tgz","fileCount":45,"integrity":"sha512-VCB6liW7HcoDfk+NxO1S/oK3QEI8pNlTVbF329E8yGooa2/Q71f52QaYYVhR+eq3ue3KTDEQX6TQxNR2X31lcA==","signatures":[{"sig":"MEUCIDowCRSi2JUuCG5qd+NkKJoyDBJ55s2BcrU9OViCEQDOAiEAjkzgpClSau1ofIeVXxPIP8WrOzbtfZn4q6RjwMvnfjo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC5JSXAVMVDtIEnmaKPxsOTvxp624Ze8v976noE8HkknAIgL4K13+RTNK/THk6xvTmzKfgRTAoSrWMUhmW01fmku2c="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/utilful@3.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":106857},"name":"utilful","type":"module","types":"./dist/index.d.mts","author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./cli":{"types":"./dist/cli/index.d.mts","default":"./dist/cli/index.mjs"},"./csv":{"types":"./dist/csv.d.mts","default":"./dist/csv.mjs"},"./defu":{"types":"./dist/defu.d.mts","default":"./dist/defu.mjs"},"./json":{"types":"./dist/json.d.mts","default":"./dist/json.mjs"},"./path":{"types":"./dist/path.d.mts","default":"./dist/path.mjs"},"./array":{"types":"./dist/array.d.mts","default":"./dist/array.mjs"},"./image":{"types":"./dist/image/index.d.mts","default":"./dist/image/index.mjs"},"./types":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"./module":{"types":"./dist/module.d.mts","default":"./dist/module.mjs"},"./object":{"types":"./dist/object.d.mts","default":"./dist/object.mjs"},"./result":{"types":"./dist/result.d.mts","default":"./dist/result.mjs"},"./string":{"types":"./dist/string.d.mts","default":"./dist/string.mjs"},"./emitter":{"types":"./dist/emitter.d.mts","default":"./dist/emitter.mjs"},"./cli/testing":{"types":"./dist/cli/testing.d.mts","default":"./dist/cli/testing.mjs"}},"gitHead":"cd45c09464e782382790ee584fe5dc2dba335099","license":"MIT","scripts":{"lint":"eslint .","test":"vitest","build":"tsdown","release":"bumpp","lint:fix":"eslint . --fix","test:types":"tsc --noEmit"},"version":"3.4.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d507872-642e-4237-9753-d5e59487404d"}},"homepage":"https://github.com/johannschopplich/utilful#readme","keywords":["cli","csv","defu","emitter","image","result","typescript","url","utilities"],"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"_npmVersion":"12.0.2","description":"A collection of TypeScript utilities","directories":{},"maintainers":[{"name":"johannschopplich","email":"johann@schopplich.com"}],"sideEffects":false,"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"bumpp":"^12.2.2","eslint":"^10.9.1","tsdown":"^0.22.14","vitest":"^4.1.11","typescript":"^6.0.3","@types/node":"^26.4.1","@antfu/eslint-config":"^9.5.0","eslint-flat-config-utils":"^3.2.0"},"peerDependencies":{"vitest":">=4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/utilful_3.4.0_1789630712440_0.9890897992769734"}}},"time":{"created":"2024-07-18T07:23:07.995Z","modified":"2026-09-17T07:38:32.883Z","1.0.0":"2024-07-18T07:23:08.165Z","1.1.0":"2025-02-28T07:21:10.068Z","1.1.1":"2025-02-28T07:27:33.734Z","1.2.0":"2025-02-28T09:29:00.322Z","1.2.1":"2025-03-02T08:29:24.837Z","2.0.0":"2025-03-28T15:14:03.446Z","2.1.0":"2025-06-04T15:45:35.909Z","2.1.1":"2025-06-04T15:48:03.860Z","2.2.0":"2025-11-10T18:08:53.476Z","2.2.1":"2025-11-11T06:12:49.410Z","2.2.2":"2025-11-11T06:18:47.564Z","2.2.3":"2025-11-11T08:22:25.214Z","2.2.4":"2025-11-11T08:29:22.602Z","2.3.0":"2025-11-11T09:11:22.602Z","2.4.0":"2025-11-30T16:48:55.782Z","2.5.0":"2026-01-16T08:42:37.627Z","2.5.1":"2026-01-20T17:07:26.430Z","2.5.2":"2026-04-02T12:28:43.263Z","2.5.3":"2026-04-02T18:05:37.633Z","3.0.0":"2026-07-21T17:32:37.302Z","3.0.1":"2026-08-03T16:02:00.388Z","3.0.2":"2026-08-05T11:11:05.231Z","3.1.0":"2026-08-05T20:05:34.233Z","3.2.0":"2026-09-02T18:55:55.994Z","3.3.0":"2026-09-03T07:04:18.751Z","3.4.0":"2026-09-17T07:38:32.537Z"},"bugs":{"url":"https://github.com/johannschopplich/utilful/issues"},"author":{"name":"Johann Schopplich","email":"hello@johannschopplich.com"},"license":"MIT","homepage":"https://github.com/johannschopplich/utilful#readme","keywords":["cli","csv","defu","emitter","image","result","typescript","url","utilities"],"repository":{"url":"git+https://github.com/johannschopplich/utilful.git","type":"git"},"description":"A collection of TypeScript utilities","maintainers":[{"name":"johannschopplich","email":"johann@schopplich.com"}],"readme":"# utilful\n\nA collection of TypeScript utilities that I use across my projects.\n\n## Table of Contents\n\n- [Installation](#installation)\n- [API](#api)\n  - [Array](#array)\n  - [CLI](#cli)\n  - [CSV](#csv)\n  - [Defu](#defu)\n  - [Emitter](#emitter)\n  - [Image](#image)\n  - [JSON](#json)\n  - [Module](#module)\n  - [Object](#object)\n  - [Path](#path)\n  - [Result](#result)\n  - [String](#string)\n\n## Installation\n\n```bash\n# npm\nnpm install utilful\n\n# pnpm\npnpm add utilful\n\n# yarn\nyarn add utilful\n```\n\nEvery module is also available on its own subpath, so you can import just the part you need:\n\n```ts\nimport { defu } from 'utilful' // Everything\nimport { joinURL } from 'utilful/path' // Just the path helpers\n```\n\nTwo modules are the exception and live on their subpaths alone. `cli` is Node-only (22.13 or later) and ships as `utilful/cli` and `utilful/cli/testing`. `image` is browser-only and ships as `utilful/image`.\n\n## API\n\n### Array\n\n#### `toArray`\n\nConverts `MaybeArray<T>` to `Array<T>`.\n\n```ts\ntype MaybeArray<T> = T | T[]\n\ndeclare function toArray<T>(array?: MaybeArray<T> | null | undefined): T[]\n```\n\n### CLI\n\nA command runner on top of Node's `util.parseArgs`: strict option parsing, one level of sub-commands, `--help` and `--version`, and an error boundary that prints a recognized error as a message and anything else with its stack. `-h` and `-v` belong to the runner, so no option may take either letter as its alias.\n\n#### `defineCommand`\n\nTypes a command definition, so `run` receives its `args` typed by their definitions.\n\n```ts\nimport { CliError, commonArgs, defineCommand } from 'utilful/cli'\n\nconst build = defineCommand({\n  meta: { name: 'build', description: 'Compile the entry file' },\n  args: {\n    ...commonArgs, // Adds --verbose\n    'file': { type: 'positional', description: 'Entry file', required: true }, // string\n    'out-dir': { type: 'string', alias: 'd', description: 'Output directory', valueHint: 'path' }, // string | undefined\n    'watch': { type: 'boolean', alias: 'w', description: 'Rebuild on change' }, // boolean, --no-watch turns it off\n  },\n  run({ args }) {\n    if (args.watch && args['out-dir'] === undefined)\n      throw new CliError('--watch needs an --out-dir') // Printed as a message, no stack\n  },\n})\n```\n\n#### `runMain`\n\nRuns a command tree from `process.argv`, or from `argv` when given, and sets `process.exitCode` instead of exiting. A tree with a `run` of its own runs it when no sub-command is named.\n\n```ts\nimport { defineCommand, runMain } from 'utilful/cli'\n\nconst main = defineCommand({\n  meta: { name: 'tool', version: '1.0.0', description: 'Does things' },\n  subCommands: { build },\n})\n\nvoid runMain(main, { expectedErrors: [MyLibraryError] }) // Reported like a `CliError`\n```\n\nAlso exported: `runCommand` (runs the tree and throws instead of reporting), `parseArgs`, `reportFailure` (for a failure that outlives `run`, such as a watch rebuild), and `log` with `error`, `warn`, `info`, `success` and `blankLine`, all writing to stderr.\n\n#### `createCliHarness`\n\nFrom `utilful/cli/testing`, which needs `vitest`. `runCli` runs the tree in-process and captures both streams and the exit code, `runCliProcess` runs the entry file as a child process. `useTemporaryDirectories` and `mockStdin` ship alongside.\n\n```ts\nimport { createCliHarness, useTemporaryDirectories } from 'utilful/cli/testing'\n\nconst { runCli, runCliProcess } = createCliHarness(main, { entry: 'src/entry.ts' }) // `entry` only matters to `runCliProcess`\nconst createDirectory = useTemporaryDirectories()\n\nit('rejects an unknown option', async () => {\n  const { stderr, exitCode } = await runCli(['build', 'x.js', '--typo'])\n\n  expect(stderr).toContain('Unknown option \\'--typo\\'')\n  expect(exitCode).toBe(1)\n})\n```\n\n### CSV\n\n#### `createCSV`\n\nConverts an array of objects to a comma-separated values (CSV) string. You can either specify which columns to include explicitly, or let the function automatically infer all columns from your data.\n\n```ts\n// With explicit columns\ndeclare function createCSV<T extends Record<string, unknown>>(\n  data: readonly T[],\n  columns: readonly (keyof T)[],\n  options?: CSVCreateOptions\n): string\n\n// With automatic column inference\ndeclare function createCSV<T extends Record<string, unknown>>(\n  data: readonly T[],\n  options?: CSVCreateOptions\n): string\n```\n\n**Example with explicit columns:**\n\n```ts\nconst data = [\n  { name: 'John', age: '30', city: 'New York' },\n  { name: 'Jane', age: '25', city: 'Boston' }\n]\n\n// Only include 'name' and 'age' columns\nconst csv = createCSV(data, ['name', 'age'])\n// name,age\n// John,30\n// Jane,25\n```\n\n**Example with automatic column inference:**\n\nWhen you omit the `columns` parameter, `createCSV` automatically collects all unique keys from your data in first-seen order. This is particularly useful when working with data that has varying structures:\n\n```ts\nconst rows = [\n  { name: 'John', age: '30' },\n  { name: 'Jane', city: 'Boston' },\n  { name: 'Bob', age: '40', city: 'Chicago' }\n]\n\n// All columns are automatically detected: name, age, city\nconst csv = createCSV(rows)\n// name,age,city\n// John,30,\n// Jane,,Boston\n// Bob,40,Chicago\n```\n\n#### `parseCSV`\n\nParses a comma-separated values (CSV) string into an array of objects.\n\n> [!NOTE]\n> The first row of the CSV string is used as the header row. A leading UTF-8 byte order mark is stripped.\n\n```ts\ntype CSVRow<T extends string = string> = Record<T, string>\n\ninterface CSVParseOptions {\n  /** @default ',' */\n  delimiter?: string\n  /**\n   * Whether to trim whitespace from unquoted headers and values.\n   * @default false\n   */\n  trim?: boolean\n  /**\n   * Whether to throw if a row's field count does not match the header row.\n   * @default true\n   */\n  strict?: boolean\n}\n\ndeclare function parseCSV<Header extends string>(\n  csv?: string | null | undefined,\n  options?: CSVParseOptions\n): CSVRow<Header>[]\n```\n\nThe parser accepts a few lenient deviations from RFC 4180:\n\n- LF, CR, and CRLF line endings are all recognized\n- whitespace between a closing quote and the next delimiter or line break is ignored\n- quotes inside unquoted fields are kept as literal characters, since a field only counts as quoted if it starts with a quote\n- text following a closing quote is appended to the field rather than rejected, so `\"ab\" cd` parses as `abcd`\n\n**Example:**\n\n```ts\nconst csv = `\nname,age\nJohn,30\nJane,25\n`.trim()\n\nconst data = parseCSV<'name' | 'age'>(csv) // [{ name: 'John', age: '30' }, { name: 'Jane', age: '25' }]\n```\n\n#### `createCSVStream`\n\nCreates a CSV stream from an iterable or async iterable of objects. Yields complete lines (header and/or data rows) including line endings – useful for large datasets that should not be buffered in memory.\n\n> [!NOTE]\n> Unlike `createCSV`, `columns` is required here. Inferring them would mean reading every row before writing the first one, which is exactly what streaming avoids.\n\n```ts\ndeclare function createCSVStream<T extends Record<string, unknown>>(\n  data: AsyncIterable<T> | Iterable<T>,\n  columns: readonly (keyof T)[],\n  options?: CSVCreateOptions\n): AsyncIterable<string>\n```\n\n**Example:**\n\n```ts\nfor await (const chunk of createCSVStream(rows, ['name', 'age'])) {\n  process.stdout.write(chunk)\n}\n```\n\n#### `createCSVAsync`\n\nConvenience wrapper around `createCSVStream` that collects all chunks into a single string.\n\n> [!NOTE]\n> Unlike `createCSV`, the result has a trailing line ending.\n\n```ts\ndeclare function createCSVAsync<T extends Record<string, unknown>>(\n  data: AsyncIterable<T> | Iterable<T>,\n  columns: readonly (keyof T)[],\n  options?: CSVCreateOptions\n): Promise<string>\n```\n\n#### `parseCSVStream`\n\nParses CSV data from an iterable or async iterable of string chunks, yielding rows as soon as they are complete. Chunks do not need to align with row boundaries – quotes and newlines are handled correctly across chunk boundaries.\n\n```ts\ndeclare function parseCSVStream<Header extends string>(\n  chunks: AsyncIterable<string> | Iterable<string>,\n  options?: CSVParseOptions\n): AsyncIterable<CSVRow<Header>>\n```\n\n**Example:**\n\n```ts\nconst chunks = ['name,age\\nJo', 'hn,30\\nJane,25']\n\nfor await (const row of parseCSVStream<'name' | 'age'>(chunks)) {\n  console.log(row) // { name: 'John', age: '30' }, then { name: 'Jane', age: '25' }\n}\n```\n\n> [!TIP]\n> `parseCSVStream` accepts any iterable of strings, including an array of lines.\n\n#### `escapeCSVValue`\n\nEscapes a single value for a CSV string. Returns an empty string for `null` and `undefined`. Values containing delimiters, quotes, or line breaks are quoted; embedded quotes are doubled.\n\n```ts\ndeclare function escapeCSVValue(\n  value: unknown,\n  options?: {\n    /** @default ',' */\n    delimiter?: string\n    /** @default false */\n    quoteAll?: boolean\n  }\n): string\n```\n\n**Example:**\n\n```ts\nescapeCSVValue('hello, world') // '\"hello, world\"'\nescapeCSVValue('contains \"quotes\"') // '\"contains \"\"quotes\"\"\"'\n```\n\n### Defu\n\nFills in missing properties from a chain of defaults. A trimmed-down take on [unjs/defu](https://github.com/unjs/defu).\n\n#### `defu`\n\nRecursively assigns missing properties from defaults to the source object. The source object takes precedence over defaults.\n\nThe function replaces `null` and `undefined` values in the source with defaults, concatenates arrays (source + defaults), and recursively merges nested objects.\n\n```ts\ntype PlainObject = Record<PropertyKey, any>\n\ndeclare function defu<Source extends PlainObject, Defaults extends PlainObject[]>(\n  source: Source,\n  ...defaults: Defaults\n): Defu<Source, Defaults>\n```\n\nThe return type is a deep merge of the source over the defaults, so keys that only exist in the defaults are part of the result type:\n\n```ts\nconst result = defu({ a: 1 }, { b: 2 })\nresult.b // number – no cast needed\n```\n\n**Example:**\n\n```ts\nimport { defu } from 'utilful'\n\nconst result = defu(\n  { a: 1, b: { x: 1 } },\n  { a: 2, b: { y: 2 }, c: 3 }\n)\n// Result: { a: 1, b: { x: 1, y: 2 }, c: 3 }\n```\n\n**Array concatenation example:**\n\n```ts\nconst result = defu(\n  { items: ['a', 'b'] },\n  { items: ['c', 'd'] }\n)\n// Result: { items: ['a', 'b', 'c', 'd'] }\n```\n\n**Handling null/undefined:**\n\n```ts\nconst result = defu(\n  { name: null, age: undefined },\n  { name: 'John', age: 30, city: 'NYC' }\n)\n// Result: { name: 'John', age: 30, city: 'NYC' }\n```\n\n#### `createDefu`\n\nCreates a `defu` variant that hands every property to your own merger first. Return `true` to signal you handled it; return nothing to fall back to the default behavior.\n\n```ts\ntype DefuMerger<T extends PlainObject = PlainObject> = (\n  target: T,\n  key: PropertyKey,\n  value: any,\n  namespace: string,\n) => boolean | void\n\ndeclare function createDefu(merger?: DefuMerger): DefuFn\n```\n\n**Example:**\n\n```ts\nimport { createDefu } from 'utilful'\n\n// Custom merger that adds numbers instead of replacing them\nconst addNumbers = createDefu((obj, key, val) => {\n  if (typeof val === 'number' && typeof obj[key] === 'number') {\n    obj[key] += val\n    return true // Indicates the merger handled this property\n  }\n})\n\nconst result = addNumbers({ cost: 15 }, { cost: 10 })\n// Result: { cost: 25 }\n```\n\n### Emitter\n\nTiny functional event emitter / pubsub, based on [mitt](https://github.com/developit/mitt).\n\n**Example:**\n\n```ts\nimport { createEmitter } from 'utilful'\n\ninterface Events {\n  foo: { a: string }\n}\n\nconst emitter = createEmitter<Events>()\n\n// Listen to an event\nemitter.on('foo', e => console.log('foo', e))\n\n// Listen to all events\nemitter.on('*', (type, e) => console.log(type, e))\n\n// Fire an event\nemitter.emit('foo', { a: 'b' })\n\n// Clearing all events\nemitter.events.clear()\n\n// Working with handler references:\nfunction onFoo() {}\nemitter.on('foo', onFoo) // Listen\nemitter.off('foo', onFoo) // Unlisten\n```\n\n### Image\n\n#### `toReducedBlob`\n\nDownscales an image blob so its longer side fits `maxDimension` and re-encodes it. Resizing happens in `createImageBitmap` with `resizeQuality: 'high'`, so the canvas only ever holds the reduced image.\n\n```ts\ntype ReducedBlobType = 'image/jpeg' | 'image/png' | 'image/webp'\n\ninterface ReducedBlobOptions {\n  /**\n   * Maximum width or height in pixels. Smaller images are never upscaled.\n   */\n  maxDimension?: number\n  /**\n   * MIME type of the output. Defaults to the source type if it is one of these, otherwise `image/jpeg`.\n   */\n  type?: ReducedBlobType\n  /**\n   * Encoder quality between 0 and 1, applied to JPEG and WebP.\n   * @default 0.85\n   */\n  quality?: number\n  /**\n   * Whether to re-encode an image that already has the right size and type, which drops EXIF data such as the location.\n   * @default false\n   */\n  stripMetadata?: boolean\n}\n\ndeclare function toReducedBlob(blob: Blob, options?: ReducedBlobOptions): Promise<Blob>\n```\n\nThe original blob comes back untouched when the image already fits and the output type matches the source type. Anything else is re-encoded:\n\n- Re-encoding drops EXIF data such as the location. Set `stripMetadata` to re-encode an image that would otherwise be returned as it is.\n- Any other source type, like HEIC or GIF, becomes JPEG. Animation is lost and transparent pixels turn black – pass `type: 'image/png'` to keep transparency.\n- The function throws if the browser cannot encode the output type, rather than silently returning PNG. Safari cannot encode WebP, which includes a WebP source without an explicit `type`.\n- Re-encoding an image that is not resized draws it at full size. Safari on iOS 17 and earlier limits a canvas to 16.7 megapixels and throws beyond that, so pass `maxDimension` along for camera photos.\n\n**Example:**\n\n```ts\nimport { toReducedBlob } from 'utilful/image'\n\nconst reduced = await toReducedBlob(file, { maxDimension: 2048 })\nconst webp = await toReducedBlob(file, { maxDimension: 1024, type: 'image/webp', quality: 0.8 })\n```\n\n### JSON\n\n#### `tryParseJSON`\n\nType-safe wrapper around `JSON.parse`.\n\nFalls back to the original value if parsing fails or the value is not a string.\n\n```ts\ndeclare function tryParseJSON<T = unknown>(value: unknown): T\n```\n\n### Module\n\n#### `interopDefault`\n\nInterop helper for default exports.\n\n```ts\ndeclare function interopDefault<T>(m: T | Promise<T>): Promise<T extends {\n  default: infer U\n} ? U : T>\n```\n\n**Example:**\n\n```ts\nimport { interopDefault } from 'utilful'\n\nasync function loadModule() {\n  const mod = await interopDefault(import('./module.js'))\n}\n```\n\n### Object\n\n#### `memoize`\n\nDefers a computation until the value is first read, then caches it.\n\nUseful for expensive setup you may never need. Unlike a plain getter, there is no runtime cost after the first read, because the getter replaces itself with the computed value.\n\n```ts\ndeclare function memoize<T>(getter: () => T): { value: T }\n```\n\n**Example:**\n\n```ts\nconst myValue = memoize(() => 'Hello, World!')\nconsole.log(myValue.value) // Computes value, overwrites getter\nconsole.log(myValue.value) // Returns cached value\nconsole.log(myValue.value) // Returns cached value\n```\n\n#### `objectKeys`\n\nStrictly typed `Object.keys`.\n\n```ts\ndeclare function objectKeys<T extends Record<any, any>>(obj: T): Array<`${Extract<keyof T, string | number>}`>\n```\n\n#### `objectEntries`\n\nStrictly typed `Object.entries`.\n\n```ts\ndeclare function objectEntries<T extends Record<any, any>>(obj: T): Array<[keyof T, T[keyof T]]>\n```\n\n#### `deepApply`\n\nApplies a callback to every key-value pair of the given object, and to every pair inside nested objects and arrays (including arrays nested inside arrays).\n\nThe callback also fires for nested objects, so `item` is whichever object the pair belongs to rather than the one you passed in.\n\n```ts\ndeclare function deepApply<T extends Record<any, any>>(\n  data: T,\n  callback: (item: Record<string, any>, key: string, value: any) => void\n): void\n```\n\n#### `isObject`\n\nChecks whether a value is an object. Object literals, class instances, and `null`-prototype objects all count; arrays, `Date`, `RegExp`, and `null` do not.\n\n```ts\ndeclare function isObject(value: unknown): value is Record<any, any>\n```\n\n### Path\n\nUtilities to build and normalize URL paths. They slice strings instead of parsing a full `URL`, which keeps them cheap enough for hot paths. Only `withQuery` and `getQuery` reach for `URLSearchParams`, where correct percent-encoding is worth the allocation.\n\n#### `withoutLeadingSlash` / `withLeadingSlash`\n\nRemoves or adds a leading slash.\n\n```ts\ndeclare function withoutLeadingSlash(path?: string): string\ndeclare function withLeadingSlash(path?: string): string\n```\n\n#### `withoutTrailingSlash` / `withTrailingSlash`\n\nRemoves or adds a trailing slash, preserving query strings and hash fragments.\n\n```ts\ndeclare function withoutTrailingSlash(path?: string): string\ndeclare function withTrailingSlash(path?: string): string\n```\n\n#### `joinURL`\n\nJoins the given URL path segments, ensuring that there is only one slash between them.\n\n```ts\ndeclare function joinURL(...paths: (string | undefined)[]): string\n```\n\n**Example:**\n\n```ts\njoinURL('/api/', '/users', '42') // '/api/users/42'\n```\n\n#### `withBase` / `withoutBase`\n\nAdds or removes a base path – each is a no-op if the base is already present (or absent). An absolute URL is returned as it is, since no base path can prefix it.\n\n```ts\ndeclare function withBase(input?: string, base?: string): string\ndeclare function withoutBase(input?: string, base?: string): string\n```\n\n**Example:**\n\n```ts\nwithBase('/users', '/api') // '/api/users'\nwithBase('https://example.com/users', '/api') // 'https://example.com/users'\nwithoutBase('/api/users', '/api') // '/users'\n```\n\n#### `getPathname`\n\nReturns the pathname of the given path – everything before the query string or hash. Absolute URLs return the part after the host, whether they carry a scheme (`https://example.com/foo`) or are protocol-relative (`//example.com/foo`).\n\nThe pathname is sliced out as written and never normalized, so percent-encoding and `..` segments survive:\n\n```ts\ndeclare function getPathname(path?: string): string\n```\n\n```ts\ngetPathname('/foo?bar#baz') // '/foo'\ngetPathname('https://example.com/foo') // '/foo'\ngetPathname('//example.com/foo') // '/foo'\ngetPathname('https://example.com') // '/'\ngetPathname('https://example.com/a/../b') // '/a/../b' – use `new URL` if you need this resolved\n```\n\n#### `withQuery`\n\nReturns the URL with the given query parameters merged in. A fragment stays where it belongs, at the very end.\n\n- `undefined` removes the parameter\n- `null` keeps the parameter with an empty value\n- arrays append one entry per item, and empty arrays are skipped\n- objects are JSON-stringified\n\n```ts\ntype QueryValue = string | number | boolean | QueryValue[] | Record<string, any> | null | undefined\ntype QueryObject = Record<string, QueryValue | QueryValue[]>\n\ndeclare function withQuery(input: string, query?: QueryObject): string\n```\n\n**Example:**\n\n```ts\nwithQuery('/api/users', { page: 2, tags: ['a', 'b'] }) // '/api/users?page=2&tags=a&tags=b'\nwithQuery('/api/users#list', { page: 2 }) // '/api/users?page=2#list'\nwithQuery('/api/users?page=2', { page: undefined }) // '/api/users'\n```\n\n#### `getQuery`\n\nReads the query parameters back out of a URL, ignoring the fragment. A parameter that appears more than once becomes an array of its values.\n\n```ts\ntype ParsedQuery = Record<string, string | string[]>\n\ndeclare function getQuery(input: string): ParsedQuery\n```\n\n**Example:**\n\n```ts\ngetQuery('/api/users?page=2&tags=a&tags=b') // { page: '2', tags: ['a', 'b'] }\ngetQuery('/api/users') // {}\n```\n\n### Result\n\nThe `Result` type represents either success (`Ok`) or failure (`Err`). It provides a type-safe way to handle errors without relying on exceptions.\n\n```ts\ntype Result<T, E> = Ok<T, E> | Err<T, E>\n```\n\nBoth variants carry the success *and* the error type, so the two stay in sync as you chain `map` and `mapError` calls.\n\n**Basic example:**\n\n```ts\nimport { err, ok } from 'utilful'\n\nfunction divide(a: number, b: number) {\n  if (b === 0) {\n    return err('Division by zero')\n  }\n  return ok(a / b)\n}\n\nconst result = divide(10, 2)\nif (result.ok)\n  console.log('Result:', result.value)\nelse\n  console.error('Error:', result.error)\n```\n\n**Fluent chaining:**\n\n```ts\nimport { toResult } from 'utilful'\n\nconst name = toResult(() => JSON.parse(jsonString))\n  .map(data => data.user)\n  .map(user => user.name)\n  .unwrapOr('Anonymous')\n```\n\n#### `ok`\n\nCreates a successful result.\n\n```ts\ndeclare function ok<T, E = never>(value: T): Ok<T, E>\n```\n\n#### `err`\n\nCreates an error result.\n\n```ts\ndeclare function err<T = never, E extends string = string>(error: E): Err<T, E>\ndeclare function err<T = never, E = unknown>(error: E): Err<T, E>\n```\n\n#### `isOk` / `isErr`\n\nType guards for narrowing `Result` types.\n\n```ts\ndeclare function isOk<T, E>(result: Result<T, E>): result is Ok<T, E>\ndeclare function isErr<T, E>(result: Result<T, E>): result is Err<T, E>\n```\n\n**Example:**\n\n```ts\nconst result = toResult(() => JSON.parse(str))\nif (isOk(result)) {\n  console.log(result.value) // TypeScript knows this is Ok\n}\n```\n\n#### `Result.map`\n\nTransforms the success value. No-op on `Err`.\n\n```ts\nok(2).map(x => x * 3) // Ok(6)\nerr('fail').map(x => x * 3) // Err('fail')\n```\n\n#### `Result.mapError`\n\nTransforms the error value. No-op on `Ok`.\n\n```ts\nerr('fail').mapError(e => e.toUpperCase()) // Err('FAIL')\nok(42).mapError(e => e.toUpperCase()) // Ok(42)\n```\n\n#### `Result.andThen`\n\nChains a function that returns a `Result`. Useful for composing fallible operations.\n\n```ts\nok(2).andThen(x => x > 0 ? ok(x) : err('negative')) // Ok(2)\nerr('fail').andThen(x => ok(x * 2)) // Err('fail') – short-circuits\n```\n\n#### `Result.unwrap`\n\nExtracts the value or throws an error.\n\n```ts\nok(42).unwrap() // 42\nerr('fail').unwrap() // throws Error\nerr('fail').unwrap('custom message') // throws Error('custom message')\n```\n\n#### `Result.unwrapErr`\n\nExtracts the error, or throws if the result is `Ok`. The mirror image of `unwrap`.\n\n```ts\nerr('fail').unwrapErr() // 'fail'\nok(42).unwrapErr() // throws Error\nok(42).unwrapErr('custom message') // throws Error('custom message')\n```\n\n#### `Result.unwrapOr`\n\nExtracts the value or returns a fallback.\n\n```ts\nok(42).unwrapOr(0) // 42\nerr('fail').unwrapOr(0) // 0\n```\n\n#### `Result.match`\n\nPattern matches on the result.\n\n```ts\nresult.match({\n  ok: value => `Success: ${value}`,\n  err: error => `Error: ${error}`,\n})\n```\n\n#### `toResult`\n\nWraps a function or promise that might throw and returns a `Result`.\n\n```ts\ndeclare function toResult<T, E = unknown>(fn: () => T): Result<T, E>\ndeclare function toResult<T, E = unknown>(promise: Promise<T>): Promise<Result<T, E>>\n```\n\n> [!NOTE]\n> The function overload must be synchronous. For asynchronous work, pass the promise itself – a function returning a promise throws a `TypeError`, since its rejection could not be captured as `Err`.\n\n**Example:**\n\n```ts\n// Synchronous\nconst result = toResult(() => JSON.parse('{\"foo\":\"bar\"}'))\n\n// Asynchronous\nconst result = await toResult(fetch('https://api.example.com'))\n```\n\n#### `unwrapResult`\n\nConverts a `Result` to a plain object with `value` and `error` properties.\n\n```ts\ndeclare function unwrapResult<T, E>(result: Ok<T, E>): { value: T, error: undefined }\ndeclare function unwrapResult<T, E>(result: Err<T, E>): { value: undefined, error: E }\ndeclare function unwrapResult<T, E>(result: Result<T, E>): { value: T, error: undefined } | { value: undefined, error: E }\n```\n\n#### `tryCatch`\n\nCombines `toResult` and `unwrapResult` into one step. Executes a function and returns `{ value, error }` directly.\n\n```ts\ndeclare function tryCatch<T, E = unknown>(fn: () => T): { value: T, error: undefined } | { value: undefined, error: E }\ndeclare function tryCatch<T, E = unknown>(promise: Promise<T>): Promise<{ value: T, error: undefined } | { value: undefined, error: E }>\n```\n\n> [!NOTE]\n> Like `toResult`, the function overload must be synchronous, and passing a function that returns a promise throws a `TypeError` rather than returning it as an error. Pass the promise itself.\n\n**Example:**\n\n```ts\n// Synchronous\nconst { value, error } = tryCatch(() => JSON.parse('{\"foo\":\"bar\"}'))\n\n// Asynchronous\nconst { value, error } = await tryCatch(fetch('https://api.example.com').then(r => r.json()))\n```\n\n### String\n\n#### `template`\n\nReplaces `{name}` placeholders in a string with the matching variable.\n\nA placeholder with no matching variable is left as its own key, unless you pass a `fallback` – either a fixed string or a function receiving the key. A variable that is present but `null` or `undefined` is treated the same as a missing one. Only own properties are read, so `{constructor}` cannot reach prototype members.\n\n```ts\ndeclare function template(\n  str: string,\n  variables: Record<string | number, any>,\n  fallback?: string | ((key: string) => string)\n): string\n```\n\n**Example:**\n\n```ts\nimport { template } from 'utilful'\n\nconst str = 'Hello, {name}!'\nconst variables = { name: 'world' }\n\nconsole.log(template(str, variables)) // Hello, world!\n```\n\n#### `generateRandomId`\n\nGenerates a random string. Ported from [`nanoid`](https://github.com/ai/nanoid). You can specify the length and the dictionary of characters to draw from.\n\n> [!WARNING]\n> Backed by `Math.random()` and therefore not cryptographically secure. Use `crypto.randomUUID()` or `crypto.getRandomValues()` for session tokens, password resets, and anything else an attacker would like to guess.\n\n```ts\ndeclare function generateRandomId(size?: number, dict?: string): string\n```\n\n## License\n\n[MIT](./LICENSE) License © 2024-PRESENT [Johann Schopplich](https://github.com/johannschopplich)\n","readmeFilename":"README.md"}