{"_id":"@boring-stack-pkg/eslint-plugin-audit-log","_rev":"3-4d275db64d5c791b55a4c3840f86901a","name":"@boring-stack-pkg/eslint-plugin-audit-log","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.1":{"name":"@boring-stack-pkg/eslint-plugin-audit-log","version":"0.1.1","keywords":["eslint","eslintplugin","typescript","audit","audit-log","compliance","gdpr"],"author":"","license":"MIT","_id":"@boring-stack-pkg/eslint-plugin-audit-log@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":"39256518dc9eade17289adee1a0c5f7fc8fb7396","tarball":"https://registry.npmjs.org/@boring-stack-pkg/eslint-plugin-audit-log/-/eslint-plugin-audit-log-0.1.1.tgz","fileCount":13,"integrity":"sha512-k8fp/dzsUwgIGJKUHJiTsShg1vtoQtEQvUngwGctR6WnuYjGZpGhq7vFjO1mDf1/b3hqGdgkDGLuIVZQ50yecQ==","signatures":[{"sig":"MEUCIAwrsaFcn+KuQLGbuaMfq69AdMlDZbb05DhuwxtJYNymAiEAtS5s/iGqildi+fn6QrEtUb0mvmpm2po5vUlJJzoChnE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@boring-stack-pkg%2feslint-plugin-audit-log@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":45892},"main":"./dist/index.cjs","type":"module","_from":"file:boring-stack-pkg-eslint-plugin-audit-log-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/d5fe05668e2bd9a16bb3c890f0c847e3/boring-stack-pkg-eslint-plugin-audit-log-0.1.1.tgz","_integrity":"sha512-k8fp/dzsUwgIGJKUHJiTsShg1vtoQtEQvUngwGctR6WnuYjGZpGhq7vFjO1mDf1/b3hqGdgkDGLuIVZQ50yecQ==","repository":{"url":"git+https://github.com/AI-Starter-Templates/eslint-plugins.git","type":"git","directory":"eslint-plugin-audit-log"},"_npmVersion":"10.9.7","description":"ESLint rules ensuring mutations are audited, audit writes are fire-and-forget, and audit metadata never carries PII.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.2","dependencies":{"micromatch":"4.0.5","@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","@types/micromatch":"4.0.9","@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-audit-log_0.1.1_1779219580725_0.546109483791021","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@boring-stack-pkg/eslint-plugin-audit-log","version":"0.1.2","keywords":["eslint","eslintplugin","typescript","audit","audit-log","compliance","gdpr"],"author":"","license":"MIT","_id":"@boring-stack-pkg/eslint-plugin-audit-log@0.1.2","maintainers":[{"name":"agjs","email":"hi@aleksandar.xyz"}],"homepage":"https://github.com/boringstack-xyz/eslint-plugins#readme","bugs":{"url":"https://github.com/boringstack-xyz/eslint-plugins/issues"},"dist":{"shasum":"0202719ae6b8df0fa32da47e2e6bc80363e615e5","tarball":"https://registry.npmjs.org/@boring-stack-pkg/eslint-plugin-audit-log/-/eslint-plugin-audit-log-0.1.2.tgz","fileCount":13,"integrity":"sha512-A9elpl0mvn4gXh5TA1V8jUr4IYcdZiMfKIrB1riTG6Rbsd39l7+fSn5fkIBZ+8lIZgF156J1wKTmY7zPVG5dFA==","signatures":[{"sig":"MEUCIDe17M+g91bS3Ex35JiaVP9JF0U1AtoSSb5Aak5pu5TEAiEAnCNzbUnRVBrUQ3jIVc3eTeXEFK53XHGZaD9gEo+o1Rk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46288},"main":"./dist/index.cjs","type":"module","_from":"file:boring-stack-pkg-eslint-plugin-audit-log-0.1.2.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/24dccf4e5ca886efd71cc44fee2eceb8/boring-stack-pkg-eslint-plugin-audit-log-0.1.2.tgz","_integrity":"sha512-A9elpl0mvn4gXh5TA1V8jUr4IYcdZiMfKIrB1riTG6Rbsd39l7+fSn5fkIBZ+8lIZgF156J1wKTmY7zPVG5dFA==","repository":{"url":"git+https://github.com/boringstack-xyz/eslint-plugins.git","type":"git","directory":"eslint-plugin-audit-log"},"_npmVersion":"11.15.0","description":"ESLint rules ensuring mutations are audited, audit writes are fire-and-forget, and audit metadata never carries PII.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"micromatch":"4.0.5","@typescript-eslint/utils":"8.0.0"},"publishConfig":{"access":"public"},"_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","@types/micromatch":"4.0.9","@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-audit-log_0.1.2_1779695634683_0.802615331831344","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@boring-stack-pkg/eslint-plugin-audit-log","version":"0.2.0","description":"ESLint rules ensuring mutations are audited, audit writes are fire-and-forget, and audit metadata never carries PII.","type":"module","license":"MIT","author":"","repository":{"type":"git","url":"git+https://github.com/boringstack-xyz/eslint-plugins.git","directory":"eslint-plugin-audit-log"},"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","audit","audit-log","compliance","gdpr"],"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","micromatch":"4.0.5"},"devDependencies":{"@eslint/js":"9.0.0","@types/micromatch":"4.0.9","@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-audit-log@0.2.0","bugs":{"url":"https://github.com/boringstack-xyz/eslint-plugins/issues"},"homepage":"https://github.com/boringstack-xyz/eslint-plugins#readme","_integrity":"sha512-Gm38hKMJlJ1lAHARc9VIc/26X6+thJhMqn60wMuOiZH8ecS2XytPOpDPJL+z2WU5k3XRgxaRZopqfoU+GI0PCw==","_resolved":"/tmp/b54e065225816aef06ba1c8894a152d9/boring-stack-pkg-eslint-plugin-audit-log-0.2.0.tgz","_from":"file:boring-stack-pkg-eslint-plugin-audit-log-0.2.0.tgz","_nodeVersion":"22.23.2","_npmVersion":"11.19.1","dist":{"integrity":"sha512-Gm38hKMJlJ1lAHARc9VIc/26X6+thJhMqn60wMuOiZH8ecS2XytPOpDPJL+z2WU5k3XRgxaRZopqfoU+GI0PCw==","shasum":"4baf7416e3829ef28bfaf69d4c44b3c9bac2d2a4","tarball":"https://registry.npmjs.org/@boring-stack-pkg/eslint-plugin-audit-log/-/eslint-plugin-audit-log-0.2.0.tgz","fileCount":13,"unpackedSize":49268,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIG8lXk109F0l+3y1q0Z4+PAwSfTgj/XwL+6sWRS1QQPjAiEAiJIHkQLFBiD4+OC2RyjRj7Y6hBskNIoOJ84nhBt3D/A="}]},"_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-audit-log_0.2.0_1789408951237_0.02156557965156214"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-19T19:39:40.519Z","modified":"2026-09-14T18:02:31.640Z","0.1.1":"2026-05-19T19:39:40.895Z","0.1.2":"2026-05-25T07:53:54.824Z","0.2.0":"2026-09-14T18:02:31.399Z"},"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","audit","audit-log","compliance","gdpr"],"repository":{"type":"git","url":"git+https://github.com/boringstack-xyz/eslint-plugins.git","directory":"eslint-plugin-audit-log"},"description":"ESLint rules ensuring mutations are audited, audit writes are fire-and-forget, and audit metadata never carries PII.","maintainers":[{"name":"agjs","email":"hi@aleksandar.xyz"}],"readme":"# eslint-plugin-audit-log\n\n[![npm](https://img.shields.io/npm/v/@boring-stack-pkg/eslint-plugin-audit-log?logo=npm)](https://www.npmjs.com/package/@boring-stack-pkg/eslint-plugin-audit-log) [![source](https://img.shields.io/badge/source-github-blue?logo=github)](https://github.com/boringstack-xyz/eslint-plugins/tree/main/eslint-plugin-audit-log)\n\nESLint rules that keep audit trails honest:\n\n- **`mutating-service-must-audit`** — every mutating service method\n  (`create*`, `update*`, `delete*`, ...) must record an audit event.\n  Catches the silent-gap mistake before it spreads.\n- **`audit-write-must-be-fire-and-forget`** — audit-log writes must be\n  `void audit.record(...)`, never awaited. A flaky audit table must\n  never block a real request. Autofixes `await` → `void`.\n- **`audit-metadata-no-pii`** — the `metadata:` of an audit record must\n  not include PII keys. Audit tables are retained for compliance and\n  shouldn't quietly become a PII reservoir.\n\n## Install\n\n```sh\npnpm add -D @boring-stack-pkg/eslint-plugin-audit-log\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 auditLog from \"@boring-stack-pkg/eslint-plugin-audit-log\";\n\nexport default [\n  {\n    files: [\"**/*.{ts,tsx}\"],\n    languageOptions: { parser: tsParser },\n    plugins: { \"audit-log\": auditLog },\n    rules: {\n      \"audit-log/mutating-service-must-audit\": \"error\",\n      \"audit-log/audit-write-must-be-fire-and-forget\": \"error\",\n      \"audit-log/audit-metadata-no-pii\": \"warn\",\n    },\n  },\n];\n```\n\nOr use the bundled config:\n\n```js\nimport auditLog from \"@boring-stack-pkg/eslint-plugin-audit-log\";\n\nexport default [auditLog.configs.recommended];\n```\n\n## Rules\n\n| Rule                                                                                       | Description                                           | Default in recommended | Fixable |\n| ------------------------------------------------------------------------------------------ | ----------------------------------------------------- | ---------------------- | ------- |\n| [`mutating-service-must-audit`](docs/rules/mutating-service-must-audit.md)                 | Mutating service methods must call the audit recorder | `error`                | –       |\n| [`audit-write-must-be-fire-and-forget`](docs/rules/audit-write-must-be-fire-and-forget.md) | Audit writes must not be awaited                      | `error`                | yes     |\n| [`audit-metadata-no-pii`](docs/rules/audit-metadata-no-pii.md)                             | Audit metadata must not include PII keys              | `warn`                 | –       |\n\n## License\n\nMIT.\n","readmeFilename":"README.md"}