{"_id":"rollup-plugin-tree-shakeable","_rev":"5-dd71880d023054312b789fff0b526c15","name":"rollup-plugin-tree-shakeable","dist-tags":{"latest":"2.0.0"},"versions":{"1.0.0":{"name":"rollup-plugin-tree-shakeable","version":"1.0.0","keywords":["bundle","pure","rollup","rollup-plugin","tree-shaking"],"author":{"url":"https://tomeraberba.ch","name":"Tomer Aberbach","email":"tomeraberbach@gmail.com"},"license":"Apache-2.0","_id":"rollup-plugin-tree-shakeable@1.0.0","maintainers":[{"name":"tomeraberbach","email":"tomeraberbach@gmail.com"}],"homepage":"https://github.com/TomerAberbach/rollup-plugin-tree-shakeable","bugs":{"url":"https://github.com/TomerAberbach/rollup-plugin-tree-shakeable/issues"},"dist":{"shasum":"6de627517eaebefe0d60d748fcdf22825c7000cc","tarball":"https://registry.npmjs.org/rollup-plugin-tree-shakeable/-/rollup-plugin-tree-shakeable-1.0.0.tgz","fileCount":5,"integrity":"sha512-DQ7wGB3NKmrUukQ0pw64MOotlE+lMmgfuKj8JwGXdwNs4j8DxAwtnngYyVBwfEDhsinpkT0uJr7sMuPyRy8cUw==","signatures":[{"sig":"MEQCIET28an3jPpDth0qFvoxXp39AtA4Qa6ezbW7FPawW7PLAiACr89fyGgPa+axj7RxlmUk7F9Qih0iIzyaHvBRPV+f0A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":19861},"type":"module","_from":"file:rollup-plugin-tree-shakeable-1.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">= 18"},"exports":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"scripts":{"lint":"tomer lint","test":"tomer test","build":"tomer build","clean":"tomer clean dist","format":"tomer format","typecheck":"tomer typecheck"},"_npmUser":{"name":"tomeraberbach","email":"tomeraberbach@gmail.com"},"prettier":"tomer/prettier","_resolved":"/private/var/folders/kn/41l_nk9568j6j0grkb3g35580000gn/T/6a9885b92dd9ae6d97f86e4bf548afb8/rollup-plugin-tree-shakeable-1.0.0.tgz","_integrity":"sha512-DQ7wGB3NKmrUukQ0pw64MOotlE+lMmgfuKj8JwGXdwNs4j8DxAwtnngYyVBwfEDhsinpkT0uJr7sMuPyRy8cUw==","repository":{"url":"git+https://github.com/TomerAberbach/rollup-plugin-tree-shakeable.git","type":"git"},"_npmVersion":"10.5.0","description":"A Rollup plugin that automatically annotates your module as tree shakeable.","directories":{},"sideEffects":false,"_nodeVersion":"21.7.3","dependencies":{"@types/node":"^20.12.7","magic-string":"^0.30.10","estree-walker":"^3.0.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tomer":"^3.1.6","eslint":"^8.57.0","rollup":"^4.17.1","esbuild":"^0.20.2","prettier":"^3.2.5","typescript":"^5.4.5","@types/jest":"^29.5.12"},"_npmOperationalInternal":{"tmp":"tmp/rollup-plugin-tree-shakeable_1.0.0_1714781301557_0.16006257441572558","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"rollup-plugin-tree-shakeable","version":"1.0.1","keywords":["bundle","pure","rollup","rollup-plugin","tree-shaking"],"author":{"url":"https://tomeraberba.ch","name":"Tomer Aberbach","email":"tomeraberbach@gmail.com"},"license":"Apache-2.0","_id":"rollup-plugin-tree-shakeable@1.0.1","maintainers":[{"name":"tomeraberbach","email":"tomeraberbach@gmail.com"}],"homepage":"https://github.com/TomerAberbach/rollup-plugin-tree-shakeable","bugs":{"url":"https://github.com/TomerAberbach/rollup-plugin-tree-shakeable/issues"},"dist":{"shasum":"a1371c319c45ccef707d2ed97eeb8c2e38d697f3","tarball":"https://registry.npmjs.org/rollup-plugin-tree-shakeable/-/rollup-plugin-tree-shakeable-1.0.1.tgz","fileCount":5,"integrity":"sha512-B0FaXjaJjRuB6PDZsETfPcVttd3wCP7vu7oyK/ashutr5aHAbrCB5E4wPtKGm5FPdqceS+ZwJVxzff2/sUezSw==","signatures":[{"sig":"MEYCIQDBW1Crpm5gTfULvHwDvNh5ex7SeetR1qKVldUgfE2WCAIhAJvt4cf2GEx0+ysIVInVSYu/Z9/JzhI9FChll/ifjVC1","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":20098},"type":"module","_from":"file:rollup-plugin-tree-shakeable-1.0.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">= 18"},"exports":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"scripts":{"lint":"tomer lint","test":"tomer test","build":"tomer build","clean":"tomer clean dist","format":"tomer format","typecheck":"tomer typecheck"},"_npmUser":{"name":"tomeraberbach","email":"tomeraberbach@gmail.com"},"prettier":"tomer/prettier","_resolved":"/private/var/folders/kn/41l_nk9568j6j0grkb3g35580000gn/T/65b102b7a037d1e0dbfd4ef0404e42c0/rollup-plugin-tree-shakeable-1.0.1.tgz","_integrity":"sha512-B0FaXjaJjRuB6PDZsETfPcVttd3wCP7vu7oyK/ashutr5aHAbrCB5E4wPtKGm5FPdqceS+ZwJVxzff2/sUezSw==","repository":{"url":"git+https://github.com/TomerAberbach/rollup-plugin-tree-shakeable.git","type":"git"},"_npmVersion":"10.5.0","description":"A Rollup plugin that automatically annotates your module as tree shakeable.","directories":{},"sideEffects":false,"_nodeVersion":"21.7.3","dependencies":{"@types/node":"^20.12.7","magic-string":"^0.30.10","estree-walker":"^3.0.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tomer":"^3.1.6","eslint":"^8.57.0","rollup":"^4.17.1","esbuild":"^0.20.2","prettier":"^3.2.5","typescript":"^5.4.5","@types/jest":"^29.5.12"},"_npmOperationalInternal":{"tmp":"tmp/rollup-plugin-tree-shakeable_1.0.1_1714782429049_0.7332972412359227","host":"s3://npm-registry-packages"}},"1.0.2":{"name":"rollup-plugin-tree-shakeable","version":"1.0.2","keywords":["bundle","pure","rollup","rollup-plugin","tree-shaking"],"author":{"url":"https://tomeraberba.ch","name":"Tomer Aberbach","email":"tomeraberbach@gmail.com"},"license":"Apache-2.0","_id":"rollup-plugin-tree-shakeable@1.0.2","maintainers":[{"name":"tomeraberbach","email":"tomeraberbach@gmail.com"}],"homepage":"https://github.com/TomerAberbach/rollup-plugin-tree-shakeable","bugs":{"url":"https://github.com/TomerAberbach/rollup-plugin-tree-shakeable/issues"},"dist":{"shasum":"398ce74bd57e2d9fdd560a863940dee830a91df3","tarball":"https://registry.npmjs.org/rollup-plugin-tree-shakeable/-/rollup-plugin-tree-shakeable-1.0.2.tgz","fileCount":5,"integrity":"sha512-e5AOAxTIhr8kIREtCo7Ky0SuncB+G+kCeur/WlaxsAk7TyHp4gmIsQrYLkZg00uPvH6/pthfQ7qvYKXAlezeUg==","signatures":[{"sig":"MEUCIQCogazbHvHOy7nYVx2tS++WvOXwyzKyECxRybQxVXetHwIgLopOo+K1Sj3oje3ua1SgNyNM5uS3I09RnpbfPAmpnrE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":20123},"type":"module","_from":"file:rollup-plugin-tree-shakeable-1.0.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">= 18"},"exports":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"scripts":{"lint":"tomer lint","test":"tomer test","build":"tomer build","clean":"tomer clean dist","format":"tomer format","typecheck":"tomer typecheck"},"_npmUser":{"name":"tomeraberbach","email":"tomeraberbach@gmail.com"},"prettier":"tomer/prettier","_resolved":"/private/var/folders/kn/41l_nk9568j6j0grkb3g35580000gn/T/4946f3e927ba52e5986409432f73754a/rollup-plugin-tree-shakeable-1.0.2.tgz","_integrity":"sha512-e5AOAxTIhr8kIREtCo7Ky0SuncB+G+kCeur/WlaxsAk7TyHp4gmIsQrYLkZg00uPvH6/pthfQ7qvYKXAlezeUg==","repository":{"url":"git+https://github.com/TomerAberbach/rollup-plugin-tree-shakeable.git","type":"git"},"_npmVersion":"10.7.0","description":"A Rollup plugin that automatically annotates your module as tree shakeable.","directories":{},"sideEffects":false,"_nodeVersion":"22.1.0","dependencies":{"@types/node":"^20.12.7","magic-string":"^0.30.10","estree-walker":"^3.0.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tomer":"^3.1.6","eslint":"^8.57.0","rollup":"^4.17.1","esbuild":"^0.20.2","prettier":"^3.2.5","typescript":"^5.4.5","@types/jest":"^29.5.12"},"_npmOperationalInternal":{"tmp":"tmp/rollup-plugin-tree-shakeable_1.0.2_1717363563028_0.46235313315892035","host":"s3://npm-registry-packages"}},"1.0.3":{"name":"rollup-plugin-tree-shakeable","version":"1.0.3","keywords":["bundle","pure","rollup","rollup-plugin","tree-shaking"],"author":{"url":"https://tomeraberba.ch","name":"Tomer Aberbach","email":"tomer@aberba.ch"},"license":"Apache-2.0 AND MIT","_id":"rollup-plugin-tree-shakeable@1.0.3","maintainers":[{"name":"tomeraberbach","email":"tomer@aberba.ch"}],"homepage":"https://github.com/TomerAberbach/rollup-plugin-tree-shakeable","bugs":{"url":"https://github.com/TomerAberbach/rollup-plugin-tree-shakeable/issues"},"dist":{"shasum":"8c63528ff119575968e7c9af5e938ee7c071efca","tarball":"https://registry.npmjs.org/rollup-plugin-tree-shakeable/-/rollup-plugin-tree-shakeable-1.0.3.tgz","fileCount":7,"integrity":"sha512-A4c06mvUYIuYMN2NJnnPNh5AZlW3KzisCXSENBABUFK4HDgLycuKRsDMRFT21P5CfijoHIo7FDdrVrOGFce4vg==","signatures":[{"sig":"MEQCICuaQM1v6XuovpzVH+RpI0RG3ELJBQea+A7AZVsQbYUoAiAk30dSKLbxCqonQLGDWIlFZriF2jm4KP6SP14fu9qm6w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":20899},"type":"module","_from":"file:rollup-plugin-tree-shakeable-1.0.3.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">= 18"},"exports":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"scripts":{"lint":"tomer lint","test":"tomer test","build":"tomer build","clean":"tomer clean dist","format":"tomer format","typecheck":"tomer typecheck"},"_npmUser":{"name":"tomeraberbach","email":"tomer@aberba.ch"},"prettier":"tomer/prettier","_resolved":"/private/var/folders/kn/41l_nk9568j6j0grkb3g35580000gn/T/d0e7fc80a5ddc31cad4b16ab471e40ea/rollup-plugin-tree-shakeable-1.0.3.tgz","_integrity":"sha512-A4c06mvUYIuYMN2NJnnPNh5AZlW3KzisCXSENBABUFK4HDgLycuKRsDMRFT21P5CfijoHIo7FDdrVrOGFce4vg==","repository":{"url":"git+https://github.com/TomerAberbach/rollup-plugin-tree-shakeable.git","type":"git"},"_npmVersion":"10.8.3","description":"A Rollup plugin that automatically annotates your module as tree shakeable.","directories":{},"sideEffects":false,"_nodeVersion":"22.9.0","dependencies":{"@types/node":"^22.7.7","magic-string":"^0.30.12","estree-walker":"^3.0.3"},"_hasShrinkwrap":false,"devDependencies":{"tomer":"^4.4.0","eslint":"^8.57.1","rollup":"^4.24.0","vitest":"^2.1.3","esbuild":"^0.24.0","prettier":"^3.3.3","typescript":"^5.6.3","@types/estree":"^1.0.6","@vitest/coverage-v8":"^2.1.3"},"_npmOperationalInternal":{"tmp":"tmp/rollup-plugin-tree-shakeable_1.0.3_1729480049161_0.09945754748385593","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"rollup-plugin-tree-shakeable","version":"2.0.0","author":{"name":"Tomer Aberbach","email":"tomer@aberba.ch","url":"https://tomeraberba.ch"},"description":"A Rollup plugin that automatically annotates your module as tree shakeable.","keywords":["bundle","pure","rollup","rollup-plugin","tree-shaking"],"homepage":"https://github.com/TomerAberbach/rollup-plugin-tree-shakeable","repository":{"type":"git","url":"git+https://github.com/TomerAberbach/rollup-plugin-tree-shakeable.git"},"bugs":{"url":"https://github.com/TomerAberbach/rollup-plugin-tree-shakeable/issues"},"funding":{"url":"https://github.com/sponsors/TomerAberbach"},"license":"Apache-2.0 AND MIT","type":"module","sideEffects":false,"engines":{"node":">= 22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"prettier":"@tomer/prettier-config","dependencies":{"@types/node":"^24.3.0","estree-walker":"^3.0.3","magic-string":"^0.30.18"},"devDependencies":{"@tomer/eslint-config":"^4.1.1","@tomer/prettier-config":"^4.0.0","@types/estree":"^1.0.8","@vitest/coverage-v8":"^3.2.4","esbuild":"^0.25.9","eslint":"^9.34.0","prettier":"^3.6.2","publint":"^0.3.12","rollup":"^4.50.0","tsdown":"^0.14.2","typescript":"^5.9.2","vitest":"^3.2.4"},"scripts":{"format":"prettier --cache --write .","lint":"eslint --cache --cache-location node_modules/.cache/eslint/ --fix .","typecheck":"tsc --noEmit","test":"vitest","coverage":"vitest --coverage","bench":"vitest bench","build":"tsdown"},"_id":"rollup-plugin-tree-shakeable@2.0.0","_integrity":"sha512-CbHO8wpyOCCmPWE5/kOdqDIHOBjGXXzbgazIHLWdaU8AntQCcbnagLKq6EeIyxuwO8w3aRa0ZH2dCuM1NFeTag==","_resolved":"/private/var/folders/kn/41l_nk9568j6j0grkb3g35580000gn/T/2b14431499b0f9be39f98ea3c406f8c2/rollup-plugin-tree-shakeable-2.0.0.tgz","_from":"file:rollup-plugin-tree-shakeable-2.0.0.tgz","_nodeVersion":"24.5.0","_npmVersion":"11.5.1","dist":{"integrity":"sha512-CbHO8wpyOCCmPWE5/kOdqDIHOBjGXXzbgazIHLWdaU8AntQCcbnagLKq6EeIyxuwO8w3aRa0ZH2dCuM1NFeTag==","shasum":"3051f75e2dad7d541b7060545d8c48a674580a26","tarball":"https://registry.npmjs.org/rollup-plugin-tree-shakeable/-/rollup-plugin-tree-shakeable-2.0.0.tgz","fileCount":7,"unpackedSize":26725,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD5cech+0sZshFLk2Dz0XjBYkr5HmjISFvem8u+04aOHwIhAPGsACtTq6yXQ/dOPhyxj63VPXIS011LkXbeNBbiwJd/"}]},"_npmUser":{"name":"tomeraberbach","email":"tomer@aberba.ch"},"directories":{},"maintainers":[{"name":"tomeraberbach","email":"tomer@aberba.ch"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/rollup-plugin-tree-shakeable_2.0.0_1756749056342_0.23701932525098313"},"_hasShrinkwrap":false}},"time":{"created":"2024-05-04T00:08:21.405Z","modified":"2025-09-01T17:50:56.728Z","1.0.0":"2024-05-04T00:08:21.738Z","1.0.1":"2024-05-04T00:27:09.199Z","1.0.2":"2024-06-02T21:26:03.197Z","1.0.3":"2024-10-21T03:07:29.331Z","2.0.0":"2025-09-01T17:50:56.550Z"},"bugs":{"url":"https://github.com/TomerAberbach/rollup-plugin-tree-shakeable/issues"},"author":{"name":"Tomer Aberbach","email":"tomer@aberba.ch","url":"https://tomeraberba.ch"},"license":"Apache-2.0 AND MIT","homepage":"https://github.com/TomerAberbach/rollup-plugin-tree-shakeable","keywords":["bundle","pure","rollup","rollup-plugin","tree-shaking"],"repository":{"type":"git","url":"git+https://github.com/TomerAberbach/rollup-plugin-tree-shakeable.git"},"description":"A Rollup plugin that automatically annotates your module as tree shakeable.","maintainers":[{"name":"tomeraberbach","email":"tomer@aberba.ch"}],"readme":"<h1 align=\"center\">\n  rollup-plugin-tree-shakeable\n</h1>\n\n<div align=\"center\">\n  <a href=\"https://npmjs.org/package/rollup-plugin-tree-shakeable\">\n    <img src=\"https://badgen.net/npm/v/rollup-plugin-tree-shakeable\" alt=\"version\" />\n  </a>\n  <a href=\"https://github.com/TomerAberbach/rollup-plugin-tree-shakeable/actions\">\n    <img src=\"https://github.com/TomerAberbach/rollup-plugin-tree-shakeable/workflows/CI/badge.svg\" alt=\"CI\" />\n  </a>\n  <a href=\"https://github.com/sponsors/TomerAberbach\">\n    <img src=\"https://img.shields.io/static/v1?label=Sponsor&message=%E2%9D%A4&logo=GitHub&color=%23fe8e86\" alt=\"Sponsor\">\n  </a>\n</div>\n\n<div align=\"center\">\n  A Rollup plugin that automatically annotates your module as tree shakeable.\n</div>\n\n## Install\n\n```sh\n$ npm i rollup-plugin-tree-shakeable\n```\n\n## Usage\n\n```js\nimport treeShakeable from 'rollup-plugin-tree-shakeable'\n\nexport default {\n  input: `src/index.js`,\n  output: {\n    dir: `output`,\n    format: `esm`,\n  },\n  plugins: [treeShakeable()],\n}\n```\n\n## Why?\n\nImagine you have code similar to this:\n\n**`src/index.js`**:\n\n<!-- eslint-disable no-inline-comments -->\n\n```js\nconst withLogging =\n  fn =>\n  (...args) => {\n    console.log(`Started call!`)\n    try {\n      return fn(...args)\n    } finally {\n      console.log(`Finished call!`)\n    }\n  }\n\nexport const f1 = withLogging(/* ... */)\nexport const f2 = withLogging(/* ... */)\nexport const f3 = withLogging(/* ... */)\n// ...\n```\n\nYou might expect that if a user of your package writes\n`import { f1 } from 'your-package'`, then bundlers will\n[tree shake](https://developer.mozilla.org/en-US/docs/Glossary/Tree_shaking) and\nomit `f1`, `f2`, etc. from the final bundle. Unfortunately, bundlers will\ngenerally include _all_ of your package's code in this case\n([yes, even if you set `\"sideEffects\": false` in your `package.json`](https://github.com/evanw/esbuild/issues/1241))\nbecause `withLogging` is called at the \"top-level\" of your package and the\nbundler cannot easily tell the call is side-effect free. There are _many_ other\ncode patterns that cause the same issue.\n\nThis plugin solves the problem by automatically adding\n[`@__PURE__` annotations](https://esbuild.github.io/api/#pure) to all top-level\nexpressions in your code that prevent tree-shaking, with the assumption that\nyour package is actually [pure](https://en.wikipedia.org/wiki/Pure_function),\nbut bundlers need a little convincing of that.\n\nFor example, for the code above, running it through this plugin would result in\nthe following code:\n\n<!-- eslint-disable no-inline-comments -->\n\n```js\nconst withLogging =\n  fn =>\n  (...args) => {\n    console.log(`Started call!`)\n    try {\n      return fn(...args)\n    } finally {\n      console.log(`Finished call!`)\n    }\n  }\n\nexport const f1 = /* @__PURE__*/ withLogging(/* ... */)\nexport const f2 = /* @__PURE__*/ withLogging(/* ... */)\nexport const f3 = /* @__PURE__*/ withLogging(/* ... */)\n// ...\n```\n\nAnd if a user of your package writes `import { f1 } from 'your-package'`, then\nbundlers _will_ tree shake and strip out all functions other than `f1` from the\nfinal bundle.\n\n> [!CAUTION]\n>\n> Only use this plugin if your package is actually tree-shakeable, meaning that\n> each export would still function correctly if all the other exports were\n> stripped out.\n>\n> This plugin does not give your package that property. It only _convinces_\n> bundlers that this is the case.\n\n## Contributing\n\nStars are always welcome!\n\nFor bugs and feature requests,\n[please create an issue](https://github.com/TomerAberbach/rollup-plugin-tree-shakeable/issues/new).\n\n## License\n\n[MIT](https://github.com/TomerAberbach/rollup-plugin-tree-shakeable/blob/main/license)\n© [Tomer Aberbach](https://github.com/TomerAberbach) \\\n[Apache 2.0](https://github.com/TomerAberbach/rollup-plugin-tree-shakeable/blob/main/license-apache) ©\n[Google](https://github.com/TomerAberbach/rollup-plugin-tree-shakeable/blob/main/notice-apache)\n","readmeFilename":"readme.md"}