{"_id":"@dunkedtoast/sift-js","_rev":"4-8c61c12a19817afbec37cdfd0f78806e","name":"@dunkedtoast/sift-js","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@dunkedtoast/sift-js","version":"0.1.0","keywords":["static-analysis","linter","undefined","nodejs","typeerror"],"license":"MIT","_id":"@dunkedtoast/sift-js@0.1.0","maintainers":[{"name":"arjun0","email":"arjun0ingole@gmail.com"}],"homepage":"https://github.com/Arjun-Ingole/sift#readme","bugs":{"url":"https://github.com/Arjun-Ingole/sift/issues"},"bin":{"sift":"bin.js"},"dist":{"shasum":"66fc8df7d53ecb38530b39394bb0be440ed82933","tarball":"https://registry.npmjs.org/@dunkedtoast/sift-js/-/sift-js-0.1.0.tgz","fileCount":2,"integrity":"sha512-pyk/Jn+2H9gp9pABLEkE4GVRmY1q1jmfzwO3EeYlzD2yyTRJ/tSKkFWIPrO9T8SBE9olKyg7lA7MGTVcXwIHuA==","signatures":[{"sig":"MEYCIQDKv3XP4lU0FnZ0fENj5h7plcNe17nyII3/HHgsDEPzhwIhANlG20BU1cATkadYoOm4/1tL77Pkhe/TxZDSF3ECwmIR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4334},"engines":{"node":">=18"},"gitHead":"aa1159c2b66943020b898f8af0be7f2aa715d526","_npmUser":{"name":"arjun0","email":"arjun0ingole@gmail.com"},"repository":{"url":"git+https://github.com/Arjun-Ingole/sift.git","type":"git"},"_npmVersion":"10.8.2","description":"Static analysis for plain-JS Node.js backends. Finds undefined member accesses, broken imports and env typos before runtime.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sift-js_0.1.0_1787690697968_0.6386895593607929","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@dunkedtoast/sift-js","version":"0.1.1","keywords":["static-analysis","linter","undefined","nodejs","typeerror"],"license":"MIT","_id":"@dunkedtoast/sift-js@0.1.1","maintainers":[{"name":"arjun0","email":"arjun0ingole@gmail.com"}],"homepage":"https://github.com/Arjun-Ingole/sift#readme","bugs":{"url":"https://github.com/Arjun-Ingole/sift/issues"},"bin":{"sift":"bin.js"},"dist":{"shasum":"211dbb114b47e2a806b10ca66f3686b932f15cb9","tarball":"https://registry.npmjs.org/@dunkedtoast/sift-js/-/sift-js-0.1.1.tgz","fileCount":3,"integrity":"sha512-zbtkf5ptitVKelCD15deNf9klWZZCB5vjOvtCbHwnvyaPDSlYUnTJ/zZ02y94VI3+ev6pHABh6xg14QhLDXDPg==","signatures":[{"sig":"MEUCIBxbmcuM3UmOxx+vLBnoZi1t/7oLiqO8lXAMsLaZfL0bAiEA5k4ModsahJt4SVhxm3f2+dMGXblIoOBTfBnrqF1CZ1w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6908},"engines":{"node":">=18"},"gitHead":"139394c16bdb981d64e6b99be4858ca4d5f548f6","_npmUser":{"name":"arjun0","email":"arjun0ingole@gmail.com"},"repository":{"url":"git+https://github.com/Arjun-Ingole/sift.git","type":"git"},"_npmVersion":"10.8.2","description":"Static analysis for plain-JS Node.js backends. Finds undefined member accesses, broken imports and env typos before runtime.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sift-js_0.1.1_1787691123969_0.6286034697621707","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@dunkedtoast/sift-js","version":"0.1.2","keywords":["static-analysis","linter","undefined","nodejs","typeerror"],"license":"MIT","_id":"@dunkedtoast/sift-js@0.1.2","maintainers":[{"name":"arjun0","email":"arjun0ingole@gmail.com"}],"homepage":"https://github.com/Arjun-Ingole/sift#readme","bugs":{"url":"https://github.com/Arjun-Ingole/sift/issues"},"bin":{"sift":"bin.js"},"dist":{"shasum":"6185bf45c57da0cabc7f8bb053471c11acbec815","tarball":"https://registry.npmjs.org/@dunkedtoast/sift-js/-/sift-js-0.1.2.tgz","fileCount":3,"integrity":"sha512-EOYi4sUuPgWagiQAJrs/Omhe3idc8q5znoKcGa2VsDU/kErLm2a1mI+7GKO6wUD8V2x732t7XWtEHR/j+UobLw==","signatures":[{"sig":"MEYCIQClhBjiA66SfTYFciOphmGuXym5A6VYOK+Cqe/7asr1rQIhAL46DzIhFp/LwOiBhCSi0wEANpDoOD5c69ZiBFhD36+y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6908},"engines":{"node":">=18"},"gitHead":"c4cc8cb97f4d4fc492c71a970171b3d652d99815","_npmUser":{"name":"arjun0","email":"arjun0ingole@gmail.com"},"repository":{"url":"git+https://github.com/Arjun-Ingole/sift.git","type":"git"},"_npmVersion":"10.8.2","description":"Static analysis for plain-JS Node.js backends. Finds undefined member accesses, broken imports and env typos before runtime.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sift-js_0.1.2_1787694268915_0.8837039217675933","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@dunkedtoast/sift-js","version":"0.1.3","description":"Static analysis for plain-JS Node.js backends. Finds undefined member accesses, broken imports and env typos before runtime.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/Arjun-Ingole/sift.git"},"bin":{"sift":"bin.js"},"engines":{"node":">=18"},"keywords":["static-analysis","linter","undefined","nodejs","typeerror"],"publishConfig":{"access":"public"},"_id":"@dunkedtoast/sift-js@0.1.3","gitHead":"b1b440e5c7d8709566d38494f91b94764e7ffb01","bugs":{"url":"https://github.com/Arjun-Ingole/sift/issues"},"homepage":"https://github.com/Arjun-Ingole/sift#readme","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-htpe3RR2YFzetjk7pNKvUomBnu7RDzrzT77LktqGgdE7gp6E1L6lM6618MpyZ0HVELZoyLyfQ0/SpG4R3fvUDw==","shasum":"40783d8d69c44de90b78d2d369bcae9a13a544f5","tarball":"https://registry.npmjs.org/@dunkedtoast/sift-js/-/sift-js-0.1.3.tgz","fileCount":3,"unpackedSize":6923,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCVQjYgBMUwPx8k3e/tT6fBZ/b4yDXjm+VgFaf63M785wIhAK48IOMCP15n6YxxL2CgrRPhDmWiyZF2P3BbjmzI8Pxf"}]},"_npmUser":{"name":"arjun0","email":"arjun0ingole@gmail.com"},"directories":{},"maintainers":[{"name":"arjun0","email":"arjun0ingole@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sift-js_0.1.3_1787694550446_0.0837314179866433"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-25T20:44:57.780Z","modified":"2026-08-25T21:49:10.761Z","0.1.0":"2026-08-25T20:44:58.097Z","0.1.1":"2026-08-25T20:52:04.102Z","0.1.2":"2026-08-25T21:44:29.078Z","0.1.3":"2026-08-25T21:49:10.588Z"},"bugs":{"url":"https://github.com/Arjun-Ingole/sift/issues"},"license":"MIT","homepage":"https://github.com/Arjun-Ingole/sift#readme","keywords":["static-analysis","linter","undefined","nodejs","typeerror"],"repository":{"type":"git","url":"git+https://github.com/Arjun-Ingole/sift.git"},"description":"Static analysis for plain-JS Node.js backends. Finds undefined member accesses, broken imports and env typos before runtime.","maintainers":[{"name":"arjun0","email":"arjun0ingole@gmail.com"}],"readme":"# sift\n\nStatic analysis for plain-JS Node.js backends. JavaScript hands you `undefined`\nwhen you read a missing property, so typos like `user.acountEmail` or imports of\nexports that don't exist stay invisible until something breaks downstream.\nsift parses your whole project, learns which members every class and object\nactually has, and fails the build when an access or import cannot resolve.\n\nBuilt in Rust on the oxc parser. Scans about 500k lines per second on a laptop.\n\n## Install\n\n```bash\nnpm i -g @dunkedtoast/sift-js\n```\n\nThis downloads the prebuilt binary for your platform (macOS arm64/x64,\nlinux-x64), verifies its checksum, caches it under `~/.sift/bin`, and puts\n`sift` on your PATH.\n\n## Quick start\n\n```bash\nsift check .            # full report\nsift baseline .         # accept today's findings\nsift check .            # from now on, fails only on new findings\n```\n\nExample output:\n\n```js\n// services/mailer.js exports sendInvoice, nothing else\nconst { sendInvoices } = require('./services/mailer');\n\nsendInvoices(order); // TypeError at request time, invisible to ESLint\n```\n\n```text\napp.js\n   6:9    error  import/unresolved-binding\n      'sendInvoices' is not exported by 'services/mailer.js'\n      ↳ did you mean 'sendInvoice'?\n```\n\n## What it catches\n\n| Rule | Catches |\n|---|---|\n| `member/undefined` | `api.fetchAlUsers()`, `cfg.databseUrl`, `data['emial']`, misses across modules |\n| `import/unresolved-binding` | destructuring an export that doesn't exist, broken re-export chains |\n| `promise/floating` | un-awaited async calls whose rejections kill Node 15+ |\n| `code/dead` | functions referenced only by other unused functions |\n| `env/typo` | `DATABSE_URL` vs `DATABASE_URL` used in different files |\n| `env/undeclared` | env var read in code but absent from all `.env*` files |\n| `import/default-missing` | default import from an ESM module without a default |\n| `env/unused` | declared keys never read |\n\nDynamic code stays out of the way: optional chains, computed writes, spreads of\nunknown objects, and entry-file patterns are skipped, so findings stay actionable.\n\n## CI\n\nExit codes work as a gate: `0` clean or baselined, `1` new findings, `2`\ninternal error.\n\n```yaml\n- run: cargo install --git https://github.com/Arjun-Ingole/sift\n- run: sift check . --format github   # inline annotations on the PR diff\n```\n\nRun `sift baseline .` once on main after that, and only regressions can fail a\nbuild.\n\n## More\n\nFull docs, source, and release binaries:\n[github.com/Arjun-Ingole/sift](https://github.com/Arjun-Ingole/sift)\n","readmeFilename":"README.md"}