{"_id":"@loccy-dev/lint","_rev":"5-e6c510973a82cec085fc52b18f99d8c9","name":"@loccy-dev/lint","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"@loccy-dev/lint","version":"0.1.0","keywords":["i18n","l10n","lint","translations","react-i18next","next-intl","vue-i18n"],"author":{"url":"https://loccy.dev","name":"Loccy"},"license":"MIT","_id":"@loccy-dev/lint@0.1.0","maintainers":[{"name":"dimchy","email":"dipuzyrev@gmail.com"}],"homepage":"https://loccy.dev","bugs":{"url":"https://github.com/loccy-dev/monorepo/issues"},"bin":{"loccy":"dist/cli/index.js"},"dist":{"shasum":"83186be6b1df1a92aa02072e0a3abe3d8f49ef0e","tarball":"https://registry.npmjs.org/@loccy-dev/lint/-/lint-0.1.0.tgz","fileCount":4,"integrity":"sha512-FJ3s+hXkzURW1rgXP/s7JY1JWCC6298hRE7Nf5PU3hvnFpai0+UP9ecnMJ2eoAmZJuEttXNh8Ig2I0eOZeYkMQ==","signatures":[{"sig":"MEYCIQDQoj8Sbh6Dr1WFkOQ6EzrrQjngfApQ67vq9bMhe6oFOAIhALsMNjxHDIMSAz3VfLvSFyHpeL0L3qSJuZONWL/jUpWr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":511822},"type":"module","engines":{"node":">=18"},"gitHead":"b7776063a90e3d3c234f09758226610992c17269","scripts":{"dev":"node esbuild.config.js --watch","flt":"npm run format && npm run lint && npm run test","lint":"tsc --noEmit && prettier --check \"**/*.ts\"","test":"vitest run","build":"node esbuild.config.js","format":"prettier --write --list-different \"**/*.ts\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"dimchy","email":"dipuzyrev@gmail.com"},"repository":{"url":"git+https://github.com/loccy-dev/monorepo.git","type":"git","directory":"apps/lint"},"_npmVersion":"11.8.0","description":"I18n linter for React & Vue apps — unused keys, missing translations, unsorted resource files. Part of Loccy.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ora":"^9.3.0","chalk":"^5.6.2","commander":"^14.0.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.4","esbuild":"^0.28.0","prettier":"^3.8.2","typescript":"6.0.3","@repo/types":"workspace:*","@types/node":"^25.6.0","@repo/shared":"workspace:*","terminal-link":"^5.0.0","gradient-string":"^3.0.0","@repo/node-platform":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/lint_0.1.0_1785219012157_0.7227019084952886","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@loccy-dev/lint","version":"0.1.1","keywords":["i18n","l10n","lint","translations","react-i18next","next-intl","vue-i18n"],"author":{"url":"https://loccy.dev","name":"Loccy"},"license":"MIT","_id":"@loccy-dev/lint@0.1.1","maintainers":[{"name":"dimchy","email":"dipuzyrev@gmail.com"}],"homepage":"https://loccy.dev","bugs":{"url":"https://github.com/loccy-dev/monorepo/issues"},"bin":{"loccy":"dist/cli/index.js"},"dist":{"shasum":"2df3548e346e808e2944a312579afd5cf2bd1079","tarball":"https://registry.npmjs.org/@loccy-dev/lint/-/lint-0.1.1.tgz","fileCount":4,"integrity":"sha512-5Yot9rBfracDILYs9u53721HSQWfRJoOY2LdD7QLUWUV/NVdV0ValFXtDeM5KP4fEqalQht1WEL8boYFQ78GFA==","signatures":[{"sig":"MEQCIGYrmNaASTVvDVd/Z03a4w4zGW9+6e0NyY/aJEebqFMGAiADaS5jahb26QkPjyAJzNZ3k0Sj9ufbqHoH9A4zRVPqQQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":512325},"type":"module","engines":{"node":">=18"},"gitHead":"fc2a8cc6fb6f6853c1306becd4bad2205d8e3c4d","scripts":{"dev":"node esbuild.config.js --watch","flt":"npm run format && npm run lint && npm run test","lint":"tsc --noEmit && prettier --check \"**/*.ts\"","test":"vitest run","build":"node esbuild.config.js","format":"prettier --write --list-different \"**/*.ts\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"dimchy","email":"dipuzyrev@gmail.com"},"repository":{"url":"git+https://github.com/loccy-dev/monorepo.git","type":"git","directory":"apps/lint"},"_npmVersion":"11.16.0","description":"I18n linter for React & Vue apps — unused keys, missing translations, unsorted resource files. Part of Loccy.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ora":"^9.3.0","chalk":"^5.6.2","commander":"^14.0.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.4","esbuild":"^0.28.0","prettier":"^3.8.2","typescript":"6.0.3","@repo/types":"workspace:*","@types/node":"^25.6.0","@repo/shared":"workspace:*","terminal-link":"^5.0.0","gradient-string":"^3.0.0","@repo/node-platform":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/lint_0.1.1_1785307972084_0.0403816494218614","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@loccy-dev/lint","version":"0.1.2","keywords":["i18n","l10n","lint","translations","react-i18next","next-intl","vue-i18n"],"author":{"url":"https://loccy.dev","name":"Loccy"},"license":"MIT","_id":"@loccy-dev/lint@0.1.2","maintainers":[{"name":"dimchy","email":"dipuzyrev@gmail.com"}],"homepage":"https://loccy.dev","bugs":{"url":"https://github.com/loccy-dev/monorepo/issues"},"bin":{"loccy":"dist/cli/index.js"},"dist":{"shasum":"5d624c81eb9b41ad0f805475ee366470457949b2","tarball":"https://registry.npmjs.org/@loccy-dev/lint/-/lint-0.1.2.tgz","fileCount":4,"integrity":"sha512-GBpbaG80xElvedJyNIQ2SpjMnbACf310GFr9FBkyTk4+GvoAivh5c0W+pqm31FSq53xXKn7SVe8NMDc1DsDQiA==","signatures":[{"sig":"MEUCIQDndVvqyfYMtpFwxGHVVUkFTCHUOBqC8CgEOhFQG5PGLwIgCtJTGHZlab1CqY8ulss7D1179QgraWaxiwVyq27GFbw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":512217},"type":"module","engines":{"node":">=18"},"gitHead":"7cd9dc67f64c6f4768cf50e7bc85bcff799f3e13","scripts":{"dev":"node esbuild.config.js --watch","flt":"npm run format && npm run lint && npm run test","lint":"tsc --noEmit && prettier --check \"**/*.ts\"","test":"vitest run","build":"node esbuild.config.js","format":"prettier --write --list-different \"**/*.ts\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"dimchy","email":"dipuzyrev@gmail.com"},"repository":{"url":"git+https://github.com/loccy-dev/monorepo.git","type":"git","directory":"apps/lint"},"_npmVersion":"11.16.0","description":"I18n linter for React & Vue apps — unused keys, missing translations, unsorted resource files. Part of Loccy.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ora":"^9.3.0","chalk":"^5.6.2","commander":"^14.0.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.4","esbuild":"^0.28.0","prettier":"^3.8.2","typescript":"6.0.3","@repo/types":"workspace:*","@types/node":"^25.6.0","@repo/shared":"workspace:*","terminal-link":"^5.0.0","gradient-string":"^3.0.0","@repo/node-platform":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/lint_0.1.2_1785313000963_0.1280049392670286","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@loccy-dev/lint","version":"0.1.3","keywords":["i18n","l10n","lint","translations","react-i18next","next-intl","vue-i18n"],"author":{"url":"https://loccy.dev","name":"Loccy"},"license":"MIT","_id":"@loccy-dev/lint@0.1.3","maintainers":[{"name":"dimchy","email":"dipuzyrev@gmail.com"}],"homepage":"https://loccy.dev","bugs":{"url":"https://github.com/loccy-dev/monorepo/issues"},"bin":{"loccy":"dist/cli/index.js"},"dist":{"shasum":"b7f37ab0a195055386f21f4df19e1280d0f72b57","tarball":"https://registry.npmjs.org/@loccy-dev/lint/-/lint-0.1.3.tgz","fileCount":4,"integrity":"sha512-FVKoUFOMRmHLrxA4xl5TQh2cCi6XNbizyAj7nTZGn0lJDkH/fMuqqX6gI2J0UZ1/RZRgszC6dXoEw2M1Y8JnOA==","signatures":[{"sig":"MEQCID3wyuykaC3wQw/e/rvZnThXUgDox3OfXoVqS+Oz6l6iAiAerNNuLl0huPttgelhZV/Za1AnyNgBYHWKSNP7mNyBvQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":517199},"type":"module","engines":{"node":">=18"},"gitHead":"ac3652cee590b0af76064e51fb3eb308def39d55","scripts":{"dev":"node esbuild.config.js --watch","flt":"npm run format && npm run lint && npm run test","lint":"tsc --noEmit && prettier --check \"**/*.ts\"","test":"vitest run --passWithNoTests","build":"node esbuild.config.js","format":"prettier --write --list-different \"**/*.ts\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"dimchy","email":"dipuzyrev@gmail.com"},"repository":{"url":"git+https://github.com/loccy-dev/monorepo.git","type":"git","directory":"apps/lint"},"_npmVersion":"11.16.0","description":"I18n linter for React & Vue apps — unused keys, missing translations, unsorted resource files. Part of Loccy.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ora":"^9.3.0","chalk":"^5.6.2","commander":"^14.0.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.4","esbuild":"^0.28.0","prettier":"^3.8.2","typescript":"6.0.3","@repo/types":"workspace:*","@types/node":"^25.6.0","@repo/shared":"workspace:*","terminal-link":"^5.0.0","gradient-string":"^3.0.0","@repo/node-platform":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/lint_0.1.3_1785691744037_0.47977171798251117","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@loccy-dev/lint","version":"0.1.4","description":"I18n linter for React & Vue apps — unused keys, missing translations, unsorted resource files. Part of Loccy.","license":"MIT","author":{"name":"Loccy","url":"https://loccy.dev"},"type":"module","bin":{"loccy":"dist/cli/index.js"},"engines":{"node":">=18"},"homepage":"https://loccy.dev","repository":{"type":"git","url":"git+https://github.com/loccy-dev/monorepo.git","directory":"apps/lint"},"bugs":{"url":"https://github.com/loccy-dev/monorepo/issues"},"keywords":["i18n","l10n","lint","translations","react-i18next","next-intl","vue-i18n"],"scripts":{"build":"node esbuild.config.js","dev":"node esbuild.config.js --watch","format":"prettier --write --list-different \"**/*.ts\"","typecheck":"tsc --noEmit","lint":"tsc --noEmit && prettier --check \"**/*.ts\"","test":"vitest run --passWithNoTests","flt":"npm run format && npm run lint && npm run test","prepublishOnly":"npm run build"},"dependencies":{"chalk":"^5.6.2","commander":"^14.0.3","ora":"^9.3.0"},"devDependencies":{"@repo/node-platform":"workspace:*","@repo/shared":"workspace:*","@repo/types":"workspace:*","@types/node":"^25.6.0","esbuild":"^0.28.0","gradient-string":"^3.0.0","prettier":"^3.8.2","terminal-link":"^5.0.0","typescript":"6.0.3","vitest":"^4.1.4"},"gitHead":"3f58730ea28ffbc13c283e2c1a27d59f4a47821b","_id":"@loccy-dev/lint@0.1.4","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-q/L7YTrzBmhevuDQQLwDz1cpuBIFxn8FaMskbzBhwwii4XrO1yeJ7CctMS4S4U9wyNnMTn62DmbubJ04R1DnYQ==","shasum":"453bde6a1b6e6b4f8938edd4d2fc64aac214e0c4","tarball":"https://registry.npmjs.org/@loccy-dev/lint/-/lint-0.1.4.tgz","fileCount":4,"unpackedSize":518180,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDelG+o02yjg7AXi1MuvCa1Xm172el9/POLfsl2OoCGIAIgcfh1k3OvbcJds83LwvuDRUScy/yM/1wR/HQALtWf7fc="}]},"_npmUser":{"name":"dimchy","email":"dipuzyrev@gmail.com"},"directories":{},"maintainers":[{"name":"dimchy","email":"dipuzyrev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/lint_0.1.4_1787563771812_0.4626456998295714"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-28T06:10:12.045Z","modified":"2026-08-24T09:29:32.143Z","0.1.0":"2026-07-28T06:10:12.331Z","0.1.1":"2026-07-29T06:52:52.247Z","0.1.2":"2026-07-29T08:16:41.142Z","0.1.3":"2026-08-02T17:29:04.178Z","0.1.4":"2026-08-24T09:29:31.984Z"},"bugs":{"url":"https://github.com/loccy-dev/monorepo/issues"},"author":{"name":"Loccy","url":"https://loccy.dev"},"license":"MIT","homepage":"https://loccy.dev","keywords":["i18n","l10n","lint","translations","react-i18next","next-intl","vue-i18n"],"repository":{"type":"git","url":"git+https://github.com/loccy-dev/monorepo.git","directory":"apps/lint"},"description":"I18n linter for React & Vue apps — unused keys, missing translations, unsorted resource files. Part of Loccy.","maintainers":[{"name":"dimchy","email":"dipuzyrev@gmail.com"}],"readme":"# Loccy i18n linter\n\nKeeps translations for React & Vue apps clean and sorted. Catches unused keys, missing or empty translations, and keys used in code but absent from translations. Locally and in CI.\n\nPart of [Loccy](https://loccy.dev), open-source i18n devtooling. Reads the same `loccy.yaml` as the [editor extension](https://marketplace.visualstudio.com/items?itemName=loccy.loccy): configure once, use everywhere.\n\n## Install\n\n```bash\nnpm i -D @loccy-dev/lint\n```\n\nRequires Node.js >= 18.\n\n## Set up\n\nLoccy needs a `loccy.yaml`. Create it once, then commit it.\n\nFastest, let your AI agent do it:\n\n```bash\nnpx loccy init-prompt | pbcopy   # paste into your coding agent\n```\n\nOr do it yourself:\n\n```bash\nnpx loccy init                   # scaffold from auto-detection, then review\n```\n\n## Usage\n\n```bash\nnpx loccy lint             # check translations and key usage\nnpx loccy lint --fix       # same, and remove unused keys\nnpx loccy format           # sort keys in translation files\nnpx loccy format --check   # report unsorted files, write nothing\n```\n\nBoth commands exit with code `1` when issues remain, so they can gate merges:\n\n```yaml\n# .github/workflows/i18n.yml\n- run: npx loccy lint && npx loccy format --check\n```\n\nPass `--config <path>` to point at a config outside the project root. Set `LOCCY_LINT_DEBUG=1` for debug output.\n\nPass `--module <name>` to lint specific module.\n\n## Rules\n\nEach rule lives on its axis in `loccy.yaml`. [Configuration docs.](https://loccy.dev/docs/config)\n\n| Rule | What it catches |\n| :--- | :--- |\n| `translations.noUntranslatedKeys` | Keys missing or empty in some locales (`true`, or a list of locales to check) |\n| `translations.sortKeys` | Unsorted translation files (`loccy format` fixes them) |\n| `usages.noUnusedKeys` | Keys never referenced in code (`loccy lint --fix` removes them) |\n| `usages.noUnresolvedKeys` | Keys used in code but absent from translations |\n\n## Links\n\n[Website](https://loccy.dev) • [GitHub](https://github.com/loccy-dev/monorepo) • [Discord](https://discord.gg/btztGrejXU)","readmeFilename":"README.md"}