{"_id":"@boring-stack-pkg/eslint-plugin-db-transactions","_rev":"2-bef90dc733fbbf8e1ef3e74bf04676ab","name":"@boring-stack-pkg/eslint-plugin-db-transactions","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.1":{"name":"@boring-stack-pkg/eslint-plugin-db-transactions","version":"0.1.1","keywords":["eslint","eslintplugin","typescript","drizzle","database","transactions"],"author":"","license":"MIT","_id":"@boring-stack-pkg/eslint-plugin-db-transactions@0.1.1","maintainers":[{"name":"agjs","email":"hi@aleksandar.xyz"}],"homepage":"https://github.com/AI-Starter-Templates/eslint-plugins#readme","bugs":{"url":"https://github.com/AI-Starter-Templates/eslint-plugins/issues"},"dist":{"shasum":"74c1bb86bf58c9ebed0a8d8e1b82f0ac206d355e","tarball":"https://registry.npmjs.org/@boring-stack-pkg/eslint-plugin-db-transactions/-/eslint-plugin-db-transactions-0.1.1.tgz","fileCount":12,"integrity":"sha512-8yZRIr6HOkIx8AlsAeUd1F6jAdUXiHxIpf+mXRGE64GBhoyW3QCFohldLJ0qKBoV+wPsCsYztPfy3EZUfmxyjA==","signatures":[{"sig":"MEQCICQiQTrNy9iQCnueHDWHxF2VdfHc+xwH9Cc79Rq6peVUAiBKPI37ogdTGP55ATBOgrQBflzir/hrykhSPF6sU7ndPg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@boring-stack-pkg%2feslint-plugin-db-transactions@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":37286},"main":"./dist/index.cjs","type":"module","_from":"file:boring-stack-pkg-eslint-plugin-db-transactions-0.1.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"agjs","email":"hi@aleksandar.xyz"},"_resolved":"/tmp/67e228042f40b819ec72222996d76790/boring-stack-pkg-eslint-plugin-db-transactions-0.1.1.tgz","_integrity":"sha512-8yZRIr6HOkIx8AlsAeUd1F6jAdUXiHxIpf+mXRGE64GBhoyW3QCFohldLJ0qKBoV+wPsCsYztPfy3EZUfmxyjA==","repository":{"url":"git+https://github.com/AI-Starter-Templates/eslint-plugins.git","type":"git","directory":"eslint-plugin-db-transactions"},"_npmVersion":"10.9.7","description":"ESLint rules enforcing transactional correctness in Drizzle / any ORM with `db.transaction(...)`-style APIs.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.2","dependencies":{"@typescript-eslint/utils":"8.0.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.0.0","eslint":"9.0.0","vitest":"2.0.0","@eslint/js":"9.0.0","typescript":"6.0.3","@types/node":"22.0.0","@typescript-eslint/parser":"8.0.0","@typescript-eslint/rule-tester":"8.0.0"},"peerDependencies":{"eslint":"8.57.0 || ^9.0.0","typescript":">=5.0.0","@typescript-eslint/parser":">=8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-db-transactions_0.1.1_1779219580504_0.15948351365259783","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@boring-stack-pkg/eslint-plugin-db-transactions","version":"0.1.2","description":"ESLint rules enforcing transactional correctness in Drizzle / any ORM with `db.transaction(...)`-style APIs.","type":"module","license":"MIT","author":"","repository":{"type":"git","url":"git+https://github.com/boringstack-xyz/eslint-plugins.git","directory":"eslint-plugin-db-transactions"},"publishConfig":{"access":"public"},"sideEffects":false,"main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"keywords":["eslint","eslintplugin","typescript","drizzle","database","transactions"],"peerDependencies":{"@typescript-eslint/parser":">=8.0.0","eslint":"8.57.0 || ^9.0.0","typescript":">=5.0.0"},"dependencies":{"@typescript-eslint/utils":"8.0.0"},"devDependencies":{"@eslint/js":"9.0.0","@types/node":"22.0.0","@typescript-eslint/parser":"8.0.0","@typescript-eslint/rule-tester":"8.0.0","eslint":"9.0.0","tsup":"8.0.0","typescript":"6.0.3","vitest":"2.0.0"},"scripts":{"build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc --noEmit","test":"vitest run","test:watch":"vitest"},"_id":"@boring-stack-pkg/eslint-plugin-db-transactions@0.1.2","bugs":{"url":"https://github.com/boringstack-xyz/eslint-plugins/issues"},"homepage":"https://github.com/boringstack-xyz/eslint-plugins#readme","_integrity":"sha512-RpafmSULzCHhqh5u1f/4RInZfRT+t/4mHj6otS3zSb3HUiEWrNowJd1NZMJNPGgLdqCc1G5rKGsTRV8zGJapWg==","_resolved":"/tmp/653e296c7918e34372f473d41c956482/boring-stack-pkg-eslint-plugin-db-transactions-0.1.2.tgz","_from":"file:boring-stack-pkg-eslint-plugin-db-transactions-0.1.2.tgz","_nodeVersion":"22.22.3","_npmVersion":"11.15.0","dist":{"integrity":"sha512-RpafmSULzCHhqh5u1f/4RInZfRT+t/4mHj6otS3zSb3HUiEWrNowJd1NZMJNPGgLdqCc1G5rKGsTRV8zGJapWg==","shasum":"a67e203792e3705bc38a3673c3f1f47561ae74c2","tarball":"https://registry.npmjs.org/@boring-stack-pkg/eslint-plugin-db-transactions/-/eslint-plugin-db-transactions-0.1.2.tgz","fileCount":12,"unpackedSize":37584,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGjLucjxD9b4erZyzl5k/4zmrtRv58avz9NwybC2RObfAiBbDQLCaCpeu8Ed3bElHos58Wr5w8XC9gDq395XEUnzLg=="}]},"_npmUser":{"name":"agjs","email":"hi@aleksandar.xyz"},"directories":{},"maintainers":[{"name":"agjs","email":"hi@aleksandar.xyz"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/eslint-plugin-db-transactions_0.1.2_1779695633494_0.3474336526658701"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-19T19:39:40.321Z","modified":"2026-05-25T07:53:53.816Z","0.1.1":"2026-05-19T19:39:40.696Z","0.1.2":"2026-05-25T07:53:53.646Z"},"bugs":{"url":"https://github.com/boringstack-xyz/eslint-plugins/issues"},"license":"MIT","homepage":"https://github.com/boringstack-xyz/eslint-plugins#readme","keywords":["eslint","eslintplugin","typescript","drizzle","database","transactions"],"repository":{"type":"git","url":"git+https://github.com/boringstack-xyz/eslint-plugins.git","directory":"eslint-plugin-db-transactions"},"description":"ESLint rules enforcing transactional correctness in Drizzle / any ORM with `db.transaction(...)`-style APIs.","maintainers":[{"name":"agjs","email":"hi@aleksandar.xyz"}],"readme":"# eslint-plugin-db-transactions\n\n[![npm](https://img.shields.io/npm/v/@boring-stack-pkg/eslint-plugin-db-transactions?logo=npm)](https://www.npmjs.com/package/@boring-stack-pkg/eslint-plugin-db-transactions) [![source](https://img.shields.io/badge/source-github-blue?logo=github)](https://github.com/boringstack-xyz/eslint-plugins/tree/main/eslint-plugin-db-transactions)\n\nESLint rules enforcing transactional correctness in Drizzle (or any ORM\nwith `db.transaction(async (tx) => ...)` APIs):\n\n- **`multi-write-must-be-transactional`** — two or more DB writes in the\n  same function must run inside a single transaction. Catches the\n  partial-failure split-brain that comes from ad-hoc multi-write\n  service methods.\n- **`transaction-uses-tx-not-db`** — inside a transaction callback,\n  write calls must use the `tx` handle, not the outer `db`. Catches\n  the classic transaction-leak bug where a write runs on the outer\n  connection and silently bypasses rollback.\n\n## Install\n\n```sh\npnpm add -D @boring-stack-pkg/eslint-plugin-db-transactions\n```\n\nPeer deps: `eslint >= 8.57`, `@typescript-eslint/parser >= 8`,\n`typescript >= 5`.\n\n## Use (flat config)\n\n```js\nimport tsParser from \"@typescript-eslint/parser\";\nimport dbTransactions from \"@boring-stack-pkg/eslint-plugin-db-transactions\";\n\nexport default [\n  {\n    files: [\"**/*.{ts,tsx}\"],\n    languageOptions: { parser: tsParser },\n    plugins: { \"db-transactions\": dbTransactions },\n    rules: {\n      \"db-transactions/multi-write-must-be-transactional\": \"error\",\n      \"db-transactions/transaction-uses-tx-not-db\": \"error\",\n    },\n  },\n];\n```\n\nOr use the bundled config:\n\n```js\nimport dbTransactions from \"@boring-stack-pkg/eslint-plugin-db-transactions\";\n\nexport default [dbTransactions.configs.recommended];\n```\n\n## Notes\n\nThe \"split across two adjacent transactions\" warning in\n`multi-write-must-be-transactional` reflects the most common refactor\nbug — when splitting a service method, you separate writes that must\nroll back together. If your project genuinely uses multiple small\ntransactions per function, raise `thresholdWrites` or remove the\nrelevant methods from `writeMethods`.\n\n## Rules\n\n| Rule                                                                                   | Description                                                            | Fixable |\n| -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | ------- |\n| [`multi-write-must-be-transactional`](docs/rules/multi-write-must-be-transactional.md) | Multi-step writes in one function must run inside a single transaction | –       |\n| [`transaction-uses-tx-not-db`](docs/rules/transaction-uses-tx-not-db.md)               | Inside a transaction, write calls must use `tx`, not the outer `db`    | –       |\n\n## License\n\nMIT.\n","readmeFilename":"README.md"}