{"_id":"@alessiofrittoli/chain-functions","_rev":"10-032963b084ae93bd701e10743402d964","name":"@alessiofrittoli/chain-functions","dist-tags":{"latest":"2.5.0"},"versions":{"0.1.0-alpha.1":{"name":"@alessiofrittoli/chain-functions","version":"0.1.0-alpha.1","keywords":["chaining","functions"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/chain-functions@0.1.0-alpha.1","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/chain-functions#readme","bugs":{"url":"https://github.com/alessiofrittoli/chain-functions/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"fc7422e2569f422af510d6e4ddd4aad7f94b3ad7","tarball":"https://registry.npmjs.org/@alessiofrittoli/chain-functions/-/chain-functions-0.1.0-alpha.1.tgz","fileCount":11,"integrity":"sha512-p4WenX/xAu+k3AC05EXYqyhyi81+4nwoFjMEiJ6c57eBN/fiQfM6F2ZIfImKQXFh0DZ+WSsTdLYN7USRDsq35A==","signatures":[{"sig":"MEQCIFzYxxkrdXf6tuetiaPcFTUKCE02QF5uGT0br/iK3ZV4AiBaCuBO1iXkUjrpjYGMJaDRhKLGRcnYIps1TZC+a12trA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":13409},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts"}},"gitHead":"d774b2837fa8582fa1d9d47fbaaf0a79545ebcff","scripts":{"lint":"eslint","test":"jest --watchAll --verbose","build":"pnpm lint && pnpm test:ci && tsup","test:ci":"jest --ci --verbose","test:jest":"pnpm test jest.test.ts","test:chain":"pnpm test chain.test.ts","test:jsdom":"JSDOM=true pnpm test","test:ci:jsdom":"JSDOM=true pnpm test:ci","test:coverage":"concurrently --prefix none --kill-others \"pnpm jest --watchAll --verbose --coverage\" \"pnpm test:serve-coverage\"","test:jest:jsdom":"JSDOM=true pnpm test:jest","test:coverage:jsdom":"JSDOM=true pnpm test:coverage","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/chain-functions.git","type":"git"},"_npmVersion":"10.9.0","description":"Functions chaining made easy","directories":{},"sideEffects":false,"_nodeVersion":"20.18.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.3.5","dotenv":"^16.4.7","eslint":"^9.17.0","esbuild":"0.24.0","globals":"^15.14.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","@eslint/js":"^9.17.0","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^22.10.2","http-server":"^14.1.1","concurrently":"^9.1.0","@jest/globals":"^29.7.0","typescript-eslint":"^8.18.1","jest-environment-jsdom":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/chain-functions_0.1.0-alpha.1_1734871520917_0.6949594036113729","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@alessiofrittoli/chain-functions","version":"1.0.0","keywords":["chaining","functions"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/chain-functions@1.0.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/chain-functions#readme","bugs":{"url":"https://github.com/alessiofrittoli/chain-functions/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"ab24639e01b5d293fee59a90c8e2bb1a8e836293","tarball":"https://registry.npmjs.org/@alessiofrittoli/chain-functions/-/chain-functions-1.0.0.tgz","fileCount":11,"integrity":"sha512-UnXRQ3/w8LsCxkQ2tnAQ/xpG1Hct+70Vh7dxljZ/TW6oLTWvvkBlUa139F20lfWbGW4RDDEf+28W2b22mGGO6A==","signatures":[{"sig":"MEYCIQCiR/NnqA5g+Vq9r/VlgbQurnVu8KC8hz9uIzzGbZOkIAIhAMEGviJh841DVOcblVWbhRAEgsg/32bVnYg5WVgvcuUk","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":23718},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts"}},"gitHead":"da5e081e4f246fecd3fde79086dc78eadaa1b4f7","scripts":{"lint":"eslint","test":"jest --watchAll --verbose","build":"pnpm lint && pnpm test:ci && tsup","test:ci":"jest --ci --verbose","test:jest":"pnpm test jest.test.ts","test:chain":"pnpm test chain.test.ts","test:jsdom":"JSDOM=true pnpm test","test:ci:jsdom":"JSDOM=true pnpm test:ci","test:coverage":"concurrently --prefix none --kill-others \"pnpm jest --watchAll --verbose --coverage\" \"pnpm test:serve-coverage\"","test:jest:jsdom":"JSDOM=true pnpm test:jest","test:coverage:jsdom":"JSDOM=true pnpm test:coverage","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/chain-functions.git","type":"git"},"_npmVersion":"10.9.0","description":"Functions chaining made easy","directories":{},"sideEffects":false,"_nodeVersion":"20.18.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.3.5","dotenv":"^16.4.7","eslint":"^9.17.0","esbuild":"0.24.0","globals":"^15.14.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","@eslint/js":"^9.17.0","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^22.10.2","http-server":"^14.1.1","concurrently":"^9.1.0","@jest/globals":"^29.7.0","typescript-eslint":"^8.18.1","jest-environment-jsdom":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/chain-functions_1.0.0_1734879719109_0.828185901479302","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@alessiofrittoli/chain-functions","version":"1.0.1","keywords":["chaining","functions"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/chain-functions@1.0.1","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/chain-functions#readme","bugs":{"url":"https://github.com/alessiofrittoli/chain-functions/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"3abfc1caa555e9489507e649fc18a3be3093f20c","tarball":"https://registry.npmjs.org/@alessiofrittoli/chain-functions/-/chain-functions-1.0.1.tgz","fileCount":11,"integrity":"sha512-vJkYv+eqUj5Ht363o8hD/TLIzroepwkCVz956Zmic11uefPFmgMKHgd59vAn9B92AKmH2YVBAwlpoN4mUga2/A==","signatures":[{"sig":"MEYCIQDVB1IYRMb0cSv5H8xCUJUxoo2ay4tkT4xC4dTsEUMSHQIhAMIO4L2ckq5bnoRjL4gEdzgV27H5gQFrHjrvwCys900+","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":23720},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.cjs"},"./types":{"types":"./dist/types.d.ts"}},"gitHead":"e59b7f24b156a1cfc6e0d01f0cb40a238975e482","scripts":{"lint":"eslint","test":"jest --watchAll --verbose","build":"pnpm lint && pnpm test:ci && tsup","test:ci":"jest --ci --verbose","test:jest":"pnpm test jest.test.ts","test:chain":"pnpm test chain.test.ts","test:jsdom":"JSDOM=true pnpm test","test:ci:jsdom":"JSDOM=true pnpm test:ci","test:coverage":"concurrently --prefix none --kill-others \"pnpm jest --watchAll --verbose --coverage\" \"pnpm test:serve-coverage\"","test:jest:jsdom":"JSDOM=true pnpm test:jest","test:coverage:jsdom":"JSDOM=true pnpm test:coverage","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/chain-functions.git","type":"git"},"_npmVersion":"10.9.0","description":"Functions chaining made easy","directories":{},"sideEffects":false,"_nodeVersion":"20.18.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.3.5","dotenv":"^16.4.7","eslint":"^9.17.0","esbuild":"0.24.0","globals":"^15.14.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","@eslint/js":"^9.17.0","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^22.10.2","http-server":"^14.1.1","concurrently":"^9.1.0","@jest/globals":"^29.7.0","typescript-eslint":"^8.18.1","jest-environment-jsdom":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/chain-functions_1.0.1_1734882126165_0.5873719910973996","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@alessiofrittoli/chain-functions","version":"2.0.0","keywords":["chaining","functions"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/chain-functions@2.0.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/chain-functions#readme","bugs":{"url":"https://github.com/alessiofrittoli/chain-functions/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"c28d30631072ebeaacbccca112aebd912688fd06","tarball":"https://registry.npmjs.org/@alessiofrittoli/chain-functions/-/chain-functions-2.0.0.tgz","fileCount":11,"integrity":"sha512-6Qm/F813NvqbnhMHtJWZnPKKrOqSC+pZzOxz8g2XC5OoZZ2fWcYvfE3q8aeAx/tKoWelRVr8GJm6vF9vwGTprw==","signatures":[{"sig":"MEUCIQDQGftLbZ8XM8cOoFSIbAOuquybCEFLTr+VUeeaVcpTpgIgEAOZyeQdsFUpJo0gyGU7kds8PjKWCdW4XqJCRA9gtyg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":24531},"main":"./dist/index.js","_from":"file:alessiofrittoli-chain-functions-2.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts"}},"scripts":{"lint":"eslint","build":"pnpm lint && pnpm test:ci && tsup","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:jest":"pnpm test:watch jest.test.ts","test:chain":"pnpm test chain.test.ts","test:jsdom":"JSDOM=true pnpm test:watch","test:watch":"jest --watchAll --verbose","build:watch":"tsup --watch","test:ci:jsdom":"JSDOM=true pnpm test:ci","test:coverage":"pnpm test:watch --coverage","test:jest:jsdom":"JSDOM=true pnpm test:jest","test:ci:coverage":"pnpm test:ci --coverage","test:coverage:jsdom":"JSDOM=true pnpm test:coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent","test:coverage:jsdom:serve":"JSDOM=true pnpm test:coverage:serve"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"_resolved":"/private/var/folders/vw/x6y06sz974x6xd8ft1h5dh1r0000gn/T/2d5587461bb2d5cb92b17296510effcf/alessiofrittoli-chain-functions-2.0.0.tgz","_integrity":"sha512-6Qm/F813NvqbnhMHtJWZnPKKrOqSC+pZzOxz8g2XC5OoZZ2fWcYvfE3q8aeAx/tKoWelRVr8GJm6vF9vwGTprw==","repository":{"url":"git+https://github.com/alessiofrittoli/chain-functions.git","type":"git"},"_npmVersion":"10.9.0","description":"Functions chaining made easy","directories":{},"sideEffects":false,"_nodeVersion":"20.18.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.3.5","dotenv":"^16.4.7","eslint":"^9.17.0","globals":"^15.14.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","@eslint/js":"^9.17.0","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^22.10.2","http-server":"^14.1.1","concurrently":"^9.1.0","@jest/globals":"^29.7.0","typescript-eslint":"^8.18.2","jest-environment-jsdom":"^29.7.0","@alessiofrittoli/node-scripts":"^2.0.1"},"_npmOperationalInternal":{"tmp":"tmp/chain-functions_2.0.0_1735253564891_0.6173758938343332","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@alessiofrittoli/chain-functions","version":"2.0.1","keywords":["chaining","functions"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/chain-functions@2.0.1","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/chain-functions#readme","bugs":{"url":"https://github.com/alessiofrittoli/chain-functions/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"ccbb82241b616d1143f95bdf8b32235f85321c55","tarball":"https://registry.npmjs.org/@alessiofrittoli/chain-functions/-/chain-functions-2.0.1.tgz","fileCount":15,"integrity":"sha512-yWufVBG6VfJQcRWiO+oB93jdxIbJJLZNTXXmcbU1Sqt/sSFVRRQTIA2JBAiawut/sFfdG8cDMR7ektuwdx+BtA==","signatures":[{"sig":"MEQCIDETwnlASZuagjkeJTb8nnWwb2WLrfg6MVEIvMGcmPlzAiADOcfWRPGBzEbPyUJK5r12n5u4BOeDoejcKEfDZn3I6Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33834},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["esbuild"]},"types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts"}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"4a9b5f12464b8224348d6dd16efdf281d1a2fd92","scripts":{"//1a":"*********************************************************************","//1b":"*********************** BUILD - LINT - RELEASE **********************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && tsup","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:jest":"pnpm test:watch jest.test.ts","test:chain":"pnpm test chain.test.ts","test:jsdom":"JSDOM=true pnpm test:watch","test:watch":"jest --watchAll --verbose","build:watch":"tsup --watch","test:ci:jsdom":"JSDOM=true pnpm test:ci","test:coverage":"pnpm test:watch --coverage","test:jest:jsdom":"JSDOM=true pnpm test:jest","test:ci:coverage":"pnpm test:ci --coverage","test:coverage:jsdom":"JSDOM=true pnpm test:coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent","test:coverage:jsdom:serve":"JSDOM=true pnpm test:coverage:serve"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/chain-functions.git","type":"git"},"_npmVersion":"10.9.0","description":"Functions chaining made easy","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","dotenv":"^16.4.7","eslint":"^9.22.0","globals":"^16.0.0","ts-jest":"^29.2.6","ts-node":"^10.9.2","@eslint/js":"^9.22.0","typescript":"^5.8.2","@types/jest":"^29.5.14","@types/node":"^22.13.10","http-server":"^14.1.1","concurrently":"^9.1.2","@jest/globals":"^29.7.0","typescript-eslint":"^8.26.1","jest-environment-jsdom":"^29.7.0","@alessiofrittoli/node-scripts":"^2.3.1"},"_npmOperationalInternal":{"tmp":"tmp/chain-functions_2.0.1_1742409150443_0.059990557939627376","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@alessiofrittoli/chain-functions","version":"2.1.0","keywords":["chaining","functions"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/chain-functions@2.1.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/chain-functions#readme","bugs":{"url":"https://github.com/alessiofrittoli/chain-functions/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"da4fb449bf74491dbc30540ef71d25548eefb404","tarball":"https://registry.npmjs.org/@alessiofrittoli/chain-functions/-/chain-functions-2.1.0.tgz","fileCount":15,"integrity":"sha512-V/OaqCsvI4hkLFKpyCr8tm0Yi6NdSkGVegwqHHwecC93nfhoMWGAqXaSDpIUF18tDGI+PGcboPKajOGbWEi/sA==","signatures":[{"sig":"MEQCIDWXjiDFmq4Uj6iYc6iUoJ8BTFozbvjbPBlSqEJCrO6KAiBJmEXPbHoK6gOmg4b+G8sL+b/g2LrRUUBz4teXDerpMA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":32927},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["esbuild"]},"types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts"}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"8267fb319e57a7f934c3e761069974e404a940b7","scripts":{"//1a":"*********************************************************************","//1b":"*********************** BUILD - LINT - RELEASE **********************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && tsup","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:watch":"jest --watchAll --verbose","build:watch":"tsup --watch","test:coverage":"pnpm test:watch --coverage","test:ci:coverage":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/chain-functions.git","type":"git"},"_npmVersion":"10.9.0","description":"Functions chaining made easy","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","dotenv":"^16.4.7","eslint":"^9.22.0","globals":"^16.0.0","ts-jest":"^29.2.6","ts-node":"^10.9.2","@eslint/js":"^9.22.0","typescript":"^5.8.2","@types/jest":"^29.5.14","@types/node":"^22.13.10","http-server":"^14.1.1","concurrently":"^9.1.2","@jest/globals":"^29.7.0","typescript-eslint":"^8.26.1","@alessiofrittoli/node-scripts":"^2.3.1"},"_npmOperationalInternal":{"tmp":"tmp/chain-functions_2.1.0_1742557636307_0.7834802276059858","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@alessiofrittoli/chain-functions","version":"2.2.0","keywords":["chaining","functions"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/chain-functions@2.2.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/chain-functions#readme","bugs":{"url":"https://github.com/alessiofrittoli/chain-functions/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"c068e20fdbf09e96309460399e3804c7764abb82","tarball":"https://registry.npmjs.org/@alessiofrittoli/chain-functions/-/chain-functions-2.2.0.tgz","fileCount":15,"integrity":"sha512-ZNS6LuafXhy8Oaf+uf1CKOjghA6XDGBhZauux5aKXm4WkSL3nqJrTEavQ4nshyZQ5EKvSv+NaeJ3sDO4zNm6bw==","signatures":[{"sig":"MEQCIFvZu8DrGDuD8q7qRCQ889dBgwFOXn+D4iVKtO5cRyrzAiA5lLbH+lsUX0wKuU5q4XUNC2KCuikYkV6vxOEydQHMsg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":32927},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["esbuild"]},"types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts"}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"ba8a5e0a14cbdaa44403e463bad02614ee780eac","scripts":{"//1a":"*********************************************************************","//1b":"*********************** BUILD - LINT - RELEASE **********************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && tsup","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:watch":"jest --watchAll --verbose","build:watch":"tsup --watch","test:coverage":"pnpm test:watch --coverage","test:ci:coverage":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/chain-functions.git","type":"git"},"_npmVersion":"10.9.0","description":"Functions chaining made easy","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","dotenv":"^16.4.7","eslint":"^9.22.0","globals":"^16.0.0","ts-jest":"^29.2.6","ts-node":"^10.9.2","@eslint/js":"^9.22.0","typescript":"^5.8.2","@types/jest":"^29.5.14","@types/node":"^22.13.11","http-server":"^14.1.1","concurrently":"^9.1.2","@jest/globals":"^29.7.0","typescript-eslint":"^8.27.0","@alessiofrittoli/node-scripts":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/chain-functions_2.2.0_1742557822918_0.7134258898439105","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@alessiofrittoli/chain-functions","version":"2.3.0","keywords":["chaining","functions"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/chain-functions@2.3.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/chain-functions#readme","bugs":{"url":"https://github.com/alessiofrittoli/chain-functions/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"78880216bb8bc7cf8e39e7fbec41a223f3cf5380","tarball":"https://registry.npmjs.org/@alessiofrittoli/chain-functions/-/chain-functions-2.3.0.tgz","fileCount":11,"integrity":"sha512-kbOhe6q9jlNLpe93KDSFxh0atsw3fa9Hi6VlA2OnzA28Te6iBw7ZkwFT5FTwBx2vtlBHY9fa8t5UtTMkBR8Flg==","signatures":[{"sig":"MEQCIHw7RY0dx1YopnhXT4PACahFIn55vh7Iwuou2rOxgdcRAiAyUgwUcr7z4wyOdwyg8hN5x3+iPOA8FEJNkhydqUhxlA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26352},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["esbuild"]},"types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts"}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"94f4209192facfa90b816f5afc65d25975d2edb6","scripts":{"dev":"NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","build:prod":"NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:ci:coverage":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/chain-functions.git","type":"git"},"_npmVersion":"11.0.0","description":"Functions chaining made easy","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","dotenv":"^16.5.0","eslint":"^9.25.1","globals":"^16.0.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","@eslint/js":"^9.25.1","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.15.3","http-server":"^14.1.1","concurrently":"^9.1.2","@jest/globals":"^29.7.0","typescript-eslint":"^8.31.1","@alessiofrittoli/node-scripts":"^2.5.0"},"_npmOperationalInternal":{"tmp":"tmp/chain-functions_2.3.0_1746198441692_0.037131225567355486","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"@alessiofrittoli/chain-functions","version":"2.4.0","keywords":["chaining","functions"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/chain-functions@2.4.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/chain-functions#readme","bugs":{"url":"https://github.com/alessiofrittoli/chain-functions/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"9db9caec27894867031df76546d166f08cd531e3","tarball":"https://registry.npmjs.org/@alessiofrittoli/chain-functions/-/chain-functions-2.4.0.tgz","fileCount":11,"integrity":"sha512-SF1rmh1HD2IJGJP+h1iYcDkE+f+KrqP9soM43WFTN1nNZHmQUUsq3gu4AfP8ycYgiaCgpK6DoMbJnm7oGnd50Q==","signatures":[{"sig":"MEUCIQCPwYZYCMJMZXYkJ0L70Ok6cHtlpAQc1EKaR9soolVn6wIgBQMqZuOm1h6X40Y82/W6uBCRurxX7TQibyr2Gi8xrMQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26561},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./types":{"import":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"require":{"types":"./dist/types.d.ts","default":"./dist/types.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"d980662e17ce2dce34d72618f6d9cc840834b686","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/chain-functions.git","type":"git"},"_npmVersion":"11.4.0","description":"Functions chaining made easy","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.4","tsup":"^8.5.0","dotenv":"^17.2.0","eslint":"^9.31.0","globals":"^16.3.0","ts-jest":"^29.4.0","ts-node":"^10.9.2","cross-env":"^7.0.3","@eslint/js":"^9.31.0","typescript":"^5.8.3","@types/jest":"^30.0.0","@types/node":"^24.0.15","http-server":"^14.1.1","concurrently":"^9.2.0","@jest/globals":"^30.0.4","typescript-eslint":"^8.37.0","@alessiofrittoli/node-scripts":"^3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/chain-functions_2.4.0_1753093787525_0.0942084010565265","host":"s3://npm-registry-packages-npm-production"}},"2.5.0":{"name":"@alessiofrittoli/chain-functions","version":"2.5.0","description":"Functions chaining made easy","author":{"name":"Alessio Frittoli","email":"info@alessiofrittoli.it","url":"https://alessiofrittoli.it"},"license":"MIT","funding":[{"type":"github","url":"https://github.com/sponsors/alessiofrittoli"}],"keywords":["chaining","functions"],"homepage":"https://github.com/alessiofrittoli/chain-functions#readme","bugs":{"url":"https://github.com/alessiofrittoli/chain-functions/issues","email":"info@alessiofrittoli.it"},"repository":{"type":"git","url":"git+https://github.com/alessiofrittoli/chain-functions.git"},"main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./types":{"import":{"types":"./dist/types.d.mts","default":"./dist/types.mjs"},"require":{"types":"./dist/types.d.ts","default":"./dist/types.js"}}},"sideEffects":false,"scripts":{"//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","dev":"cross-env NODE_ENV=development tsup --watch","build:prod":"cross-env NODE_ENV=production tsup","build":"pnpm lint && pnpm test:ci && pnpm build:prod","lint":"eslint","release":"node scripts/release.js --verbose --npm","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","test":"jest --verbose","test:watch":"jest --watchAll --verbose","test:ci":"jest --ci --verbose","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\""},"devDependencies":{"@alessiofrittoli/node-scripts":"^3.2.0","@eslint/js":"^9.39.1","@jest/globals":"^30.2.0","@types/jest":"^30.0.0","@types/node":"^24.10.1","concurrently":"^9.2.1","cross-env":"^10.1.0","dotenv":"^17.2.3","eslint":"^9.39.1","globals":"^16.5.0","http-server":"^14.1.1","jest":"^30.2.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","tsup":"^8.5.1","typescript":"^5.9.3","typescript-eslint":"^8.48.1"},"_id":"@alessiofrittoli/chain-functions@2.5.0","gitHead":"6107245a2eec3a8a27dfbf2d72e76068546457f7","_nodeVersion":"22.15.0","_npmVersion":"11.5.2","dist":{"integrity":"sha512-T880cNaHMIU11vj3Qn4gEusew1ZcuCoWNEgwX9RzlGNmElxW/Td580+kT7y2QXO1BWBlXsvHRhbRMPIpAyTTYw==","shasum":"dc67ebc30945f539e458801a9d69cd3be9416852","tarball":"https://registry.npmjs.org/@alessiofrittoli/chain-functions/-/chain-functions-2.5.0.tgz","fileCount":11,"unpackedSize":27412,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAsejZlRxwKkFTWbQOr5iLkz5Q+Bz1NUk2IdeyTbBabOAiEA/Z0nqM2ftwX+G2VkEYSxp3THHx1lA1qN0D3+3jXb3c0="}]},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"directories":{},"maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/chain-functions_2.5.0_1764781261597_0.5824014812587923"},"_hasShrinkwrap":false}},"time":{"created":"2024-12-22T12:45:20.837Z","modified":"2025-12-03T17:01:01.977Z","0.1.0-alpha.1":"2024-12-22T12:45:21.103Z","1.0.0":"2024-12-22T15:01:59.284Z","1.0.1":"2024-12-22T15:42:06.375Z","2.0.0":"2024-12-26T22:52:45.069Z","2.0.1":"2025-03-19T18:32:30.647Z","2.1.0":"2025-03-21T11:47:16.463Z","2.2.0":"2025-03-21T11:50:23.121Z","2.3.0":"2025-05-02T15:07:21.861Z","2.4.0":"2025-07-21T10:29:47.697Z","2.5.0":"2025-12-03T17:01:01.788Z"},"bugs":{"url":"https://github.com/alessiofrittoli/chain-functions/issues","email":"info@alessiofrittoli.it"},"author":{"name":"Alessio Frittoli","email":"info@alessiofrittoli.it","url":"https://alessiofrittoli.it"},"license":"MIT","homepage":"https://github.com/alessiofrittoli/chain-functions#readme","keywords":["chaining","functions"],"repository":{"type":"git","url":"git+https://github.com/alessiofrittoli/chain-functions.git"},"description":"Functions chaining made easy","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"readme":"# Chain Functions ⛓️\n\n[![NPM Latest Version][version-badge]][npm-url] [![Coverage Status][coverage-badge]][coverage-url] [![Socket Status][socket-badge]][socket-url] [![NPM Monthly Downloads][downloads-badge]][npm-url] [![Dependencies][deps-badge]][deps-url]\n\n[![GitHub Sponsor][sponsor-badge]][sponsor-url]\n\n[version-badge]: https://img.shields.io/npm/v/%40alessiofrittoli%2Fchain-functions\n[npm-url]: https://npmjs.org/package/%40alessiofrittoli%2Fchain-functions\n[coverage-badge]: https://coveralls.io/repos/github/alessiofrittoli/chain-functions/badge.svg\n[coverage-url]: https://coveralls.io/github/alessiofrittoli/chain-functions\n[socket-badge]: https://socket.dev/api/badge/npm/package/@alessiofrittoli/chain-functions\n[socket-url]: https://socket.dev/npm/package/@alessiofrittoli/chain-functions/overview\n[downloads-badge]: https://img.shields.io/npm/dm/%40alessiofrittoli%2Fchain-functions.svg\n[deps-badge]: https://img.shields.io/librariesio/release/npm/%40alessiofrittoli%2Fchain-functions\n[deps-url]: https://libraries.io/npm/%40alessiofrittoli%2Fchain-functions\n[sponsor-badge]: https://img.shields.io/static/v1?label=Fund%20this%20package&message=%E2%9D%A4&logo=GitHub&color=%23DB61A2\n[sponsor-url]: https://github.com/sponsors/alessiofrittoli\n\n## Functions chaining made easy\n\nThe `Chain` class provides a utility for managing and executing chains of functions. Each function in the chain can optionally invoke the next function, enabling a flexible and composable flow of execution. This is particularly useful for scenarios such as middleware processing, data transformations, or handling asynchronous operations in a structured manner.\n\n### Table of Contents\n\n- [Getting started](#getting-started)\n- [API Reference](#api-reference)\n  - [`Chain` class](#chain-class)\n  - [Types](#types)\n- [Key Features](#key-features)\n- [Examples](#examples)\n- [Development](#development)\n  - [ESLint](#eslint)\n  - [Jest](#jest)\n- [Contributing](#contributing)\n- [Security](#security)\n- [Credits](#made-with-)\n\n---\n\n### Getting started\n\nRun the following command to start using `chain-functions` in your projects:\n\n```bash\nnpm i @alessiofrittoli/chain-functions\n```\n\nor using `pnpm`\n\n```bash\npnpm i @alessiofrittoli/chain-functions\n```\n\n---\n\n### API Reference\n\n#### `Chain` class\n\nA utility class for managing and executing chains of functions.\n\n##### Static Methods\n\n###### `Chain.functions()`\n\nRecursively executes a chain of functions.\n\n<details>\n\n<summary>Parameters</summary>\n\n| Parameter | Type                | Default | Description                                                                                                                                                        |\n| --------- | ------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `chain`   | `ChainFactory<T,U>` | -       | The chain of functions to execute.                                                                                                                                 |\n|           |                     |         | This must be an array of functions (`ChainLink<T>`), where the last function is of type LastChainLink. See [Types](#types) section for further informations about. |\n| `index`   | `number`            | `0`     | (Optional) The starting index for execution.                                                                                                                       |\n\n</details>\n\n---\n\n<details>\n\n<summary>Returns</summary>\n\nType: `T | U`\n\nThe result of the chain execution, which matches the type of the chain's functions (`T` or `U`).\n\nSee [Types](#types) section for further informations about.\n\n</details>\n\n---\n\n<details>\n\n<summary>Throws</summary>\n\n`Error` if no function is found at the specified index.\n\n</details>\n\n---\n\n<details>\n\n<summary>Example</summary>\n\n```ts\nimport { Chain } from \"@alessiofrittoli/chain-functions\";\nimport type {\n  ChainLink,\n  LastChainLink,\n  ChainFactory,\n} from \"@alessiofrittoli/chain-functions/types\";\n\ntype ChainFunction = () => string;\n\nconst function1: ChainLink<ChainFunction> = (next) => () => `1-${next()}`;\nconst function2: ChainLink<ChainFunction> = (next) => () => `2-${next()}`;\nconst function3: LastChainLink<ChainFunction> = () => () => \"end\";\n\nconst chain: ChainFactory<ChainFunction> = [function1, function2, function3];\nconst result = Chain.functions(chain)();\n\nconsole.log(result); // Output: '1-2-end'\n```\n\n</details>\n\n---\n\n###### `Chain.isLast()`\n\nDetermines if the given function is the last function in the chain needed to type cast the last function with `LastChainLink<U>`.\n\nThis method is primarily used internally by the `Chain.functions()` method to determine when the chain execution should terminate.\n\n<details>\n\n<summary>Parameters</summary>\n\n| Parameter | Type                             | Default | Description                                                                                                                                            |\n| --------- | -------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `chain`   | `ChainFactory<T,U>`              | -       | The chain of functions. See [Types](#types) section for further informations about.                                                                    |\n| `fn`      | `ChainLink<T>\\|LastChainLink<U>` | -       | The function to type cast. This can be either a regular chain link or the last chain link. See [Types](#types) section for further informations about. |\n| `index`   | `number`                         | `0`     | (Optional) The current index of the function in the `Chain.functions()` recursion.                                                                     |\n\n</details>\n\n---\n\n<details>\n\n<summary>Returns</summary>\n\nType: `boolean`\n\nReturns `true` if the given function is the last function in the chain, `false` otherwise.\n\n</details>\n\n---\n\n#### Types\n\n##### `ChainFunction`\n\nRepresents any callable function that can be invoked as part of the chain.\n\nThis is used internally to type cast other types `template` parameters.\n\n##### `ChainLink<T extends ChainFunction = ChainFunction>`\n\nRepresents a single link in a chain of functions.\n\n<details>\n\n<summary>Parameters</summary>\n\n| Parameter | Type | Description                                                             |\n| --------- | ---- | ----------------------------------------------------------------------- |\n| `next`    | `T`  | The next function in the chain. Its return type must be of type of `T`. |\n\n</details>\n\n---\n\n<details>\n\n<summary>Returns</summary>\n\nType: `T`\n\nA function that can be invoked as part of the chain.\n\n</details>\n\n---\n\n##### `LastChainLink<T extends ChainFunction = ChainFunction>`\n\nRepresents the last link in a chain of functions. Unlike `ChainLink`, it does not accept a `next` parameter.\n\n<details>\n\n<summary>Returns</summary>\n\nType: `T`\n\nA function that can be invoked as the final step in the chain.\n\n</details>\n\n---\n\n##### `ChainFactory<T extends ChainFunction = ChainFunction, U extends ChainFunction = T>`\n\nRepresents the complete chain of functions as an array.\n\n###### Structure\n\n- Can contain any number of `ChainLink<T>` functions.\n- The last element in the array must be a `LastChainLink<U>`.\n\n---\n\n### Key Features\n\n- Chain link functions are highly customizeable.\n- Chain link functions can be `async` functions.\n- The last chain link could return a different type (`U`) other than `T` from a standard `ChainLink`.\n\n---\n\n### Examples\n\n#### Importing the library\n\n```ts\n// importing the main `Chain` class\nimport { Chain } from \"@alessiofrittoli/chain-functions\";\n// importing types\nimport type {\n  ChainLink,\n  LastChainLink,\n  ChainFactory,\n} from \"@alessiofrittoli/chain-functions/types\";\n```\n\n<details>\n\n<summary>Basic usage</summary>\n\n```ts\n// define the chain link function type\ntype ChainFunction = () => string;\n\n// declare chain link functions\nconst function1: ChainLink<ChainFunction> = (next) => () => `1-${next()}`;\nconst function2: ChainLink<ChainFunction> = (next) => () => `2-${next()}`;\n// declare the last chain function\nconst function3: LastChainLink<ChainFunction> = () => () => \"end\";\n\n// declare the chain array\nconst chain: ChainFactory<ChainFunction> = [function1, function2, function3];\n// execute the chain array\nconst result = Chain.functions(chain)();\n\nconsole.log(result); // Output: '1-2-end'\n```\n\n</details>\n\n---\n\n<details>\n\n<summary>Advance usage</summary>\n\n```ts\ntype ChainFunctionProps = {\n  someProperty: string;\n  firstFunction?: boolean;\n  secondFunction?: boolean;\n  thirdFunction?: boolean;\n};\n// define the chain link function type\ntype ChainFunction = (props: ChainFunctionProps) => ChainFunctionProps;\n\n// declare chain link functions\nconst function1: ChainLink<ChainFunction> = (next) => (props) => {\n  // edit properties\n  props.someProperty = \"Edited by 1st function\";\n  props.firstFunction = true;\n  // call the next function in the chain\n  return next(props);\n};\n\nconst function2: ChainLink<ChainFunction> = (next) => (props) => {\n  props.secondFunction = true;\n\n  if (props.someProperty === \"Edited by 1st function\") {\n    // stop chain execution if some condition is met.\n    return props;\n  }\n\n  // call the next function in the chain\n  return next(props);\n};\n\n// declare the last chain function\nconst function3: LastChainLink<ChainFunction> = () => (props) => {\n  props.thirdFunction = true;\n  return props;\n};\n\n// declare the chain array\nconst chain: ChainFactory<ChainFunction> = [function1, function2, function3];\n// declare the initial state\nconst initialState: ChainFunctionProps = {\n  someProperty: \"Initial value\",\n  firstFunction: false,\n  secondFunction: false,\n  thirdFunction: false,\n};\n// execute the chain array with initial state\nconst result = Chain.functions(chain)(initialState);\n\nconsole.log(result);\n// Output: {\n//  someProperty    : 'Edited by 1st function',\n//  firstFunction   : true,\n//  secondFunction  : true,\n//  thirdFunction   : false,\n// }\n```\n\n</details>\n\n---\n\n<details>\n\n<summary>`LastChainLink` with custom return type</summary>\n\n```ts\ntype ChainFunction = () => string;\ntype LastChainFunction = () => boolean;\n\nconst function1: ChainLink<ChainFunction> = (next) => () => `1-${next()}`;\nconst function2: ChainLink<ChainFunction> = (next) => () => `2-${next()}`;\nconst function3: LastChainLink<LastChainFunction> = () => () => true;\n\nconst chain: ChainFactory<ChainFunction, LastChainFunction> = [\n  function1,\n  function2,\n  function3,\n];\nconst result = Chain.functions(chain)();\n\nconsole.log(result); // Outputs: '1-2-true'\n```\n\n</details>\n\n---\n\n<details>\n\n<summary>`ChainLink` functions with promises</summary>\n\n```ts\ntype ChainFunction = () => string | Promise<string>;\n\nconst function1: ChainLink<ChainFunction> = (next) => async () => {\n  // simulate a long task running\n  await new Promise<void>((resolve) => setTimeout(resolve, 5000));\n  return `1-${next()}`;\n};\n// this function is executed once `function1` Promise get resolved.\nconst function2: ChainLink<ChainFunction> = (next) => () => `2-${next()}`;\nconst function3: LastChainLink<ChainFunction> = () => () => \"end\";\n\nconst chain: ChainFactory<ChainFunction> = [function1, function2, function3];\nconst result = Chain.functions(chain)(); // `result` is now a promise\n\nconsole.log(await result); // Outputs: '1-2-end'\n```\n\n</details>\n\n---\n\n<details>\n\n<summary>Next.js middleware chain</summary>\n\n```ts\n// src/middleware.ts\n\nimport { NextMiddleware, NextResponse } from \"next/server\";\nimport { Chain } from \"@alessiofrittoli/chain-functions\";\nimport type {\n  ChainFactory,\n  ChainLink,\n  LastChainLink,\n} from \"@alessiofrittoli/chain-functions/types\";\n\ntype Middleware = ChainLink<NextMiddleware>;\ntype LastMiddleware = () => NextResponse<unknown>;\ntype MiddlewareFactory = ChainFactory<NextMiddleware, LastMiddleware>;\n\nconst middleware1: Middleware = (next) => async (request, event) => {\n  const { nextUrl } = request;\n\n  if (nextUrl === \"...\") {\n    const rewriteUrl = \"...\";\n    return NextResponse.rewrite(rewriteUrl);\n  }\n\n  return next(request, event);\n};\n\nconst middleware2: Middleware = (next) => async (request, event) => {\n  const response = await next(request, event);\n\n  // do something with `response` returned by the next middleware.\n  // ...\n\n  return response;\n};\n\n// ensures `NextResponse.next()` is called if no one stops the chain.\nconst lastMiddleware: LastChainLink<LastMiddleware> = () => () =>\n  NextResponse.next();\n\nconst middlewares: MiddlewareFactory = [\n  middleware1,\n  middleware2,\n  lastMiddleware,\n];\n\nexport const config = {\n  matcher: [\n    /**\n     * Match all request paths except for the ones starting with:\n     * - api (API routes)\n     * - _next/static (static files)\n     * - _next/image (image optimization files)\n     * - favicon.ico (favicon file)\n     */\n    \"/((?!api/|_next|.*\\\\..*).*)\",\n  ],\n};\n\n// note that we do not execute the chain like in the previous examples since Next.js is responsible for the execution, providing `request` and `event` parameters to the `middleware` functions.\nexport default Chain.functions(middlewares);\n```\n\n</details>\n\n---\n\n### Development\n\n#### Install depenendencies\n\n```bash\nnpm install\n```\n\nor using `pnpm`\n\n```bash\npnpm i\n```\n\n#### Build the source code\n\nRun the following command to test and build code for distribution.\n\n```bash\npnpm build\n```\n\n#### [ESLint](https://www.npmjs.com/package/eslint)\n\nwarnings / errors check.\n\n```bash\npnpm lint\n```\n\n#### [Jest](https://npmjs.com/package/jest)\n\nRun all the defined test suites by running the following:\n\n```bash\n# Run tests and watch file changes.\npnpm test:watch\n\n# Run tests in a CI environment.\npnpm test:ci\n```\n\n- See [`package.json`](./package.json) file scripts for more info.\n\nRun tests with coverage.\n\nAn HTTP server is then started to serve coverage files from `./coverage` folder.\n\n⚠️ You may see a blank page the first time you run this command. Simply refresh the browser to see the updates.\n\n```bash\ntest:coverage:serve\n```\n\n---\n\n### Contributing\n\nContributions are truly welcome!\n\nPlease refer to the [Contributing Doc](./CONTRIBUTING.md) for more information on how to start contributing to this project.\n\nHelp keep this project up to date with [GitHub Sponsor][sponsor-url].\n\n[![GitHub Sponsor][sponsor-badge]][sponsor-url]\n\n---\n\n### Security\n\nIf you believe you have found a security vulnerability, we encourage you to **_responsibly disclose this and NOT open a public issue_**. We will investigate all legitimate reports. Email `security@alessiofrittoli.it` to disclose any security vulnerabilities.\n\n### Made with ☕\n\n<table style='display:flex;gap:20px;'>\n  <tbody>\n    <tr>\n      <td>\n        <img alt=\"avatar\" src='https://avatars.githubusercontent.com/u/35973186' style='width:60px;border-radius:50%;object-fit:contain;'>\n      </td>\n      <td>\n        <table style='display:flex;gap:2px;flex-direction:column;'>\n          <tbody>\n              <tr>\n                <td>\n                  <a href='https://github.com/alessiofrittoli' target='_blank' rel='noopener'>Alessio Frittoli</a>\n                </td>\n              </tr>\n              <tr>\n                <td>\n                  <small>\n                    <a href='https://alessiofrittoli.it' target='_blank' rel='noopener'>https://alessiofrittoli.it</a> |\n                    <a href='mailto:info@alessiofrittoli.it' target='_blank' rel='noopener'>info@alessiofrittoli.it</a>\n                  </small>\n                </td>\n              </tr>\n          </tbody>\n        </table>\n      </td>\n    </tr>\n  </tbody>\n</table>\n","readmeFilename":"README.md"}