{"_id":"@booga/vlint","_rev":"2-986ddc7fad57282b74b6c4ac6afb7c2d","name":"@booga/vlint","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@booga/vlint","version":"0.1.0","_id":"@booga/vlint@0.1.0","maintainers":[{"name":"dreaktor","email":"me@dreaktor.com"}],"bin":{"vlint":"dist/cli.js"},"dist":{"shasum":"d7381938f23d6840c86cb02c05cada09556695ca","tarball":"https://registry.npmjs.org/@booga/vlint/-/vlint-0.1.0.tgz","fileCount":29,"integrity":"sha512-PkF6YyPbV5YbFfFRQHQ70AtN+IydAndiFdyFxO5iUNcKikx2r3D8GtHngJC7GoIlT5YgGkCuSPumiuOklkjmWA==","signatures":[{"sig":"MEYCIQDnV1arvAaMnH3qr/PhBriL4f9+KRASouhRX+NwlS7kaQIhAMEnqx1ODt/whaC11U8Ljyj2RF6GbpJIKdbI75uGPCRe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":198350},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"4dd60f1a230778b8e0456726efdc00e1a0bb11ed","scripts":{"lint":"tsc --noEmit","test":"vitest run --coverage","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"dreaktor","email":"me@dreaktor.com"},"_npmVersion":"10.9.3","description":"AST linter for vDsl prop surface — token scale validation, className/style bypass guards, ESLint plugin.","directories":{},"_nodeVersion":"22.19.0","dependencies":{"zod":"^3.22.0","commander":"^12.0.0","picocolors":"^1.0.0","@babel/types":"^7.24.0","@babel/parser":"^7.24.0","@babel/traverse":"^7.24.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","eslint":"^8.57.0","vitest":"^3.0.0","typescript":"^5.4.0","@types/node":"^22.0.0","@vitest/coverage-v8":"^3.0.0","@types/babel__traverse":"^7.20.0"},"peerDependencies":{"eslint":"^8","@booga/vDsl":"^0.1"},"peerDependenciesMeta":{"eslint":{"optional":true},"@booga/vDsl":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/vlint_0.1.0_1778924503234_0.1681415563361277","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@booga/vlint","version":"0.1.1","description":"AST linter for vDsl prop surface — token scale validation, className/style bypass guards, ESLint plugin.","type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"}},"bin":{"vlint":"dist/cli.js"},"scripts":{"build":"tsup","typecheck":"tsc --noEmit","lint":"tsc --noEmit","test":"vitest run --coverage","test:watch":"vitest"},"dependencies":{"@babel/parser":"^7.24.0","@babel/traverse":"^7.24.0","@babel/types":"^7.24.0","commander":"^12.0.0","picocolors":"^1.0.0","zod":"^3.22.0"},"peerDependencies":{"@booga/vdsl":"^0.2.0","eslint":"^8"},"peerDependenciesMeta":{"@booga/vdsl":{"optional":true},"eslint":{"optional":true}},"devDependencies":{"@types/babel__traverse":"^7.20.0","@types/node":"^22.0.0","@vitest/coverage-v8":"^3.0.0","eslint":"^8.57.0","tsup":"^8.0.0","typescript":"^5.4.0","vitest":"^3.0.0"},"_id":"@booga/vlint@0.1.1","gitHead":"a23f2659db1b8a6ccf8158806087b1285fbe0dc4","_nodeVersion":"22.19.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-0pSjITgJCAyujMuqScKMhc4Eg0xylnbsPMcvZ4f9KIVs9vgMYnBh6SS6EqxiwnXuOM3I6CMJNOcFbM9Pe6/Q7w==","shasum":"f22dc924869c0b42c1c36428c45404a8cd3ef172","tarball":"https://registry.npmjs.org/@booga/vlint/-/vlint-0.1.1.tgz","fileCount":29,"unpackedSize":199484,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIB87pDNGyt3Z7PM9phlgFD8w0BQTngdxK+KAT/W7+aODAiEA2muO6gmleGQiv7ebjKGOtR7CCMKBH6g9IHVW/u6WoQI="}]},"_npmUser":{"name":"dreaktor","email":"me@dreaktor.com"},"directories":{},"maintainers":[{"name":"dreaktor","email":"me@dreaktor.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/vlint_0.1.1_1779133072537_0.9508358299749349"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-16T09:41:43.143Z","modified":"2026-05-18T19:37:52.859Z","0.1.0":"2026-05-16T09:41:43.372Z","0.1.1":"2026-05-18T19:37:52.712Z"},"description":"AST linter for vDsl prop surface — token scale validation, className/style bypass guards, ESLint plugin.","maintainers":[{"name":"dreaktor","email":"me@dreaktor.com"}],"readme":"# vLint\n\nAST linter for vDsl prop surface. Token scale validation, className/style bypass guards, `as`-prop consistency. CLI + ESLint plugin.\n\n## Why\n\nA design system holds only while every component uses it. The first hand-typed `className=\"mt-[13px]\"`, `style={{padding: 7}}`, or `bg-[#3a3a3a]` is a hole. Nothing stops it — types pass, build is green, the screen renders. The erosion is invisible until it is irreversible: months later half the app tracks the tokens and half is frozen ad-hoc pixels and hardcoded hex, theme changes propagate to one half, dark mode breaks in scattered places, the 8px grid is full of 7px and 13px gaps.\n\nvLint is the watchdog against that drift. Each escape from the vDsl surface is caught at lint time — on the pull request that introduced it — not discovered as rot a year later. Without vLint you have a design system everyone bypasses; with it, bypassing the system fails the build.\n\n## Install\n\n```bash\nnpm install @booga/vlint\n```\n\n## CLI\n\n```bash\nvlint src/**/*.tsx\nvlint src/components/Button.tsx --config vlint.config.json\n```\n\nExit codes: `0` clean, `1` error-severity violations, `2` internal failure.\n\n## Programmatic\n\n```typescript\nimport { lint, lintGlob, rules } from \"@booga/vlint\";\n\nconst result = lint(\"src/Button.tsx\");\nresult.diagnostics; // { file, line, column, ruleId, message, severity }[]\n\nconst results = await lintGlob(\"src/**/*.tsx\", {\n  ignore: [\"**/dist/**\"],\n  rules: { \"valid-token-values\": \"error\" },\n  tokenScale: [0, 1, 2, 3, 4, 6, 8, 12, 16],\n});\n```\n\n## ESLint plugin\n\n```javascript\n// .eslintrc.js\nmodule.exports = {\n  plugins: [\"vlint\"],\n  extends: [\"plugin:vlint/recommended\"],\n};\n```\n\n## Config\n\n```typescript\nimport { LintConfigSchema } from \"@booga/vlint\";\n\n// All fields optional — schema shows defaults\nLintConfigSchema.parse({\n  rules: { \"valid-token-values\": \"error\" },\n  ignore: [\"**/node_modules/**\", \"**/dist/**\"],\n  tokenScale: [0, 1, 2, 3, 4, 6, 8, 12, 16, 20, 24],\n  tokenProps: [\"p\", \"px\", \"py\", \"m\", \"mx\", \"my\", \"gap\", \"w\", \"h\"],\n});\n```\n\n## Rules\n\n| Rule | Default | What it flags | Drift it prevents |\n|---|---|---|---|\n| `no-raw-classname` | error | `className` on any lowercase HTML element | margins/padding that never track theme or spacing changes |\n| `no-raw-style` | error | `style` prop on any JSX element | inline pixel values off the 8px grid, frozen and unthemeable |\n| `valid-token-values` | warn | Token prop values not in the declared scale | off-grid spacing that breaks rhythm across screens |\n| `no-arbitrary-class` | error | Tailwind arbitrary values like `bg-[#fff]` | hardcoded hex that breaks dark mode and palette changes |\n| `consistent-as-prop` | warn | `as=\"div\"` polymorphism with raw HTML tags on vDsl components | polymorphic components downgraded to raw tags, losing semantic + styling guarantees |\n\n## Contributing\n\nCode of conduct: [Contributor Covenant 2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct/)\n\n## License\n\nMIT © 2026 bvasilenko\n","readmeFilename":"README.md"}