diff --git a/.gitignore b/.gitignore index 0794059..4c02070 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,5 @@ .pnp.* !.yarn/releases !.yarn/plugins -dist -node_modules \ No newline at end of file +lib +node_modules diff --git a/.node-version b/.node-version new file mode 100644 index 0000000..9a2a0e2 --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +v20 diff --git a/README.md b/README.md index 0fd563e..461cdc1 100644 --- a/README.md +++ b/README.md @@ -7,3 +7,28 @@ At Trilon, our goal is to help elevate teams - giving them the push they need to As part of that, we focus on developing tools that make **your** dev experience easier, enjoyable, and safer. The official Trilon Eslint Plugin is part of that toolbelt to help your team to thrive, applying best practices for NestJS, curated by our key contributors and core team. + +## Installation + +> Once this package gets published + +```sh +npm install @trilon/eslint-plugin +``` + +And add these the plugin to your `.eslintrc`: + +```js +{ + plugins: ['@trilon/eslint-plugin'], + extends: ['plugin:@trilon/recommended'], +} +``` + +The "recommended" preset contains the rules listed below. If you need custom configuration, please refer to the documentation of the individual linting rules. + +## Rules + +| Rule | Description | Recommended | +| ------------------------------------------------------------------------------------ | -------------------------------------------------------------- | ----------- | +| [`@trilon/enforce-close-testing-module`](docs/rules/enforce-close-testing-module.md) | Ensures NestJS testing modules are closed properly after tests | ✅ | diff --git a/package.json b/package.json index ea2e1bb..aec3819 100644 --- a/package.json +++ b/package.json @@ -1,28 +1,40 @@ { - "name": "eslint-plugin", - "version": "1.0.0", + "name": "@trilon/eslint-plugin", + "version": "0.0.1", "description": "Official Trilon Eslint Plugin", "type": "commonjs", - "main": "index.js", + "main": "./lib/index.js", + "types": "./lib/index.d.ts", + "files": [ + "lib/**/*", + "package.json", + "README.md", + "LICENSE" + ], "engines": { "node": ">=20.9.0", "yarn": ">=4.0.2" }, "scripts": { - "tsc": "tsc", + "prepare": "tsc", + "tsc": "rimraf ./lib && tsc -p tsconfig.build.json && tsc-alias", "test": "tsx --import ./tests/global.setup.js --test tests/**/*.spec.ts", "format": "prettier --write .", "lint": "eslint . --ext .ts --max-warnings 0" }, "keywords": [ "eslint", - "eslintplugin" + "eslintplugin", + "nestjs", + "nest", + "trilon" ], "author": "Trilon Team", "license": "ISC", "packageManager": "yarn@4.0.2", "devDependencies": { "@types/eslint": "^8", + "@types/node": "^20.10.7", "@typescript-eslint/eslint-plugin": "^6.13.1", "@typescript-eslint/parser": "^6.13.1", "@typescript-eslint/rule-tester": "^6.13.1", @@ -30,7 +42,12 @@ "eslint": "^8.54.0", "eslint-config-prettier": "^9.0.0", "prettier": "^3.1.0", + "rimraf": "^5.0.5", + "tsc-alias": "^1.8.8", "tsx": "^4.6.2", "typescript": "^5.3.2" + }, + "peerDependencies": { + "eslint": ">=8.0.0" } } diff --git a/src/index.ts b/src/index.ts index e69de29..e17f84e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -0,0 +1,15 @@ +import enforceCloseTestingModuleRule from './rules/enforce-close-testing-module.rule'; + +// TODO: we should type this as ESLint.Plugin but there's a type incompatibilities with the utils package +const plugin = { + configs: { + recommended: { + rules: { '@trilon/enforce-close-testing-module': 'error' }, + }, + }, + rules: { + 'enforce-close-testing-module': enforceCloseTestingModuleRule, + }, +}; + +module.exports = plugin; diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 0000000..aea5b4c --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/**/*ts"], + "exclude": ["tests"], + "compilerOptions": { + "rootDir": "./src" + } +} diff --git a/yarn.lock b/yarn.lock index 783f4ae..a54ec38 100644 --- a/yarn.lock +++ b/yarn.lock @@ -303,6 +303,28 @@ __metadata: languageName: node linkType: hard +"@trilon/eslint-plugin@workspace:.": + version: 0.0.0-use.local + resolution: "@trilon/eslint-plugin@workspace:." + dependencies: + "@types/eslint": "npm:^8" + "@types/node": "npm:^20.10.7" + "@typescript-eslint/eslint-plugin": "npm:^6.13.1" + "@typescript-eslint/parser": "npm:^6.13.1" + "@typescript-eslint/rule-tester": "npm:^6.13.1" + "@typescript-eslint/utils": "npm:^6.13.1" + eslint: "npm:^8.54.0" + eslint-config-prettier: "npm:^9.0.0" + prettier: "npm:^3.1.0" + rimraf: "npm:^5.0.5" + tsc-alias: "npm:^1.8.8" + tsx: "npm:^4.6.2" + typescript: "npm:^5.3.2" + peerDependencies: + eslint: ">=8.0.0" + languageName: unknown + linkType: soft + "@types/eslint@npm:^8": version: 8.44.8 resolution: "@types/eslint@npm:8.44.8" @@ -327,6 +349,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^20.10.7": + version: 20.10.7 + resolution: "@types/node@npm:20.10.7" + dependencies: + undici-types: "npm:~5.26.4" + checksum: d626cea1b7da4784ee7b335dcc54e64adba9725dab7ca51a690167de502ef89fec07b05ad8e25845d188d7ad7f72c192ec92964d456321ed5b9452113bf9351f + languageName: node + linkType: hard + "@types/semver@npm:^7.5.0": version: 7.5.6 resolution: "@types/semver@npm:7.5.6" @@ -565,6 +596,16 @@ __metadata: languageName: node linkType: hard +"anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac + languageName: node + linkType: hard + "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" @@ -586,6 +627,13 @@ __metadata: languageName: node linkType: hard +"binary-extensions@npm:^2.0.0": + version: 2.2.0 + resolution: "binary-extensions@npm:2.2.0" + checksum: d73d8b897238a2d3ffa5f59c0241870043aa7471335e89ea5e1ff48edb7c2d0bb471517a3e4c5c3f4c043615caa2717b5f80a5e61e07503d51dc85cb848e665d + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -605,7 +653,7 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.2": +"braces@npm:^3.0.2, braces@npm:~3.0.2": version: 3.0.2 resolution: "braces@npm:3.0.2" dependencies: @@ -651,6 +699,25 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:^3.5.3": + version: 3.5.3 + resolution: "chokidar@npm:3.5.3" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 1076953093e0707c882a92c66c0f56ba6187831aa51bb4de878c1fec59ae611a3bf02898f190efec8e77a086b8df61c2b2a3ea324642a0558bdf8ee6c5dc9ca1 + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -681,6 +748,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^9.0.0": + version: 9.5.0 + resolution: "commander@npm:9.5.0" + checksum: 5f7784fbda2aaec39e89eb46f06a999e00224b3763dc65976e05929ec486e174fe9aac2655f03ba6a5e83875bd173be5283dc19309b7c65954701c02025b3c1d + languageName: node + linkType: hard + "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -875,23 +949,6 @@ __metadata: languageName: node linkType: hard -"eslint-plugin@workspace:.": - version: 0.0.0-use.local - resolution: "eslint-plugin@workspace:." - dependencies: - "@types/eslint": "npm:^8" - "@typescript-eslint/eslint-plugin": "npm:^6.13.1" - "@typescript-eslint/parser": "npm:^6.13.1" - "@typescript-eslint/rule-tester": "npm:^6.13.1" - "@typescript-eslint/utils": "npm:^6.13.1" - eslint: "npm:^8.54.0" - eslint-config-prettier: "npm:^9.0.0" - prettier: "npm:^3.1.0" - tsx: "npm:^4.6.2" - typescript: "npm:^5.3.2" - languageName: unknown - linkType: soft - "eslint-scope@npm:^7.2.2": version: 7.2.2 resolution: "eslint-scope@npm:7.2.2" @@ -1131,7 +1188,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:~2.3.3": +"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -1141,7 +1198,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -1159,7 +1216,7 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:^5.1.2": +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" dependencies: @@ -1177,7 +1234,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10": +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7": version: 10.3.10 resolution: "glob@npm:10.3.10" dependencies: @@ -1215,7 +1272,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:^11.1.0": +"globby@npm:^11.0.4, globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -1341,6 +1398,15 @@ __metadata: languageName: node linkType: hard +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: "npm:^2.0.0" + checksum: a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38 + languageName: node + linkType: hard + "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -1355,7 +1421,7 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: @@ -1649,6 +1715,13 @@ __metadata: languageName: node linkType: hard +"mylas@npm:^2.1.9": + version: 2.1.13 + resolution: "mylas@npm:2.1.13" + checksum: 093dfaf88f444d9da956c68a61ddcfe05ab9411c0024b0c7f4d721639ba7d311ea8f9c052ce617344e67d40982f67614cd634b525b923048bf9a191234968c9c + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -1694,6 +1767,13 @@ __metadata: languageName: node linkType: hard +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 + languageName: node + linkType: hard + "once@npm:^1.3.0": version: 1.4.0 resolution: "once@npm:1.4.0" @@ -1791,13 +1871,22 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.3.1": +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be languageName: node linkType: hard +"plimit-lit@npm:^1.2.6": + version: 1.6.1 + resolution: "plimit-lit@npm:1.6.1" + dependencies: + queue-lit: "npm:^1.5.1" + checksum: af5d351bb55afe1eaa84b27c2b329699e150e4cf70464f3d474f5eabe9bdb9f48ed378ada1498d3b893f68ee7da2423ba6d9a4d88b1429d3b0aea22afcf5292b + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -1838,6 +1927,13 @@ __metadata: languageName: node linkType: hard +"queue-lit@npm:^1.5.1": + version: 1.5.2 + resolution: "queue-lit@npm:1.5.2" + checksum: 8aa838b2c939aeaa6cd272b5b6b172379a3fa1d9193b2a3e687643c68c0efee3cd3493af4f1f8a11ff79b8207e4d00cc5d0b072f6e4bbeaaa27ee01f567ec4ac + languageName: node + linkType: hard + "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -1845,6 +1941,15 @@ __metadata: languageName: node linkType: hard +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: "npm:^2.2.1" + checksum: 6fa848cf63d1b82ab4e985f4cf72bd55b7dcfd8e0a376905804e48c3634b7e749170940ba77b32804d5fe93b3cc521aa95a8d7e7d725f830da6d93f3669ce66b + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -1884,6 +1989,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^5.0.5": + version: 5.0.5 + resolution: "rimraf@npm:5.0.5" + dependencies: + glob: "npm:^10.3.7" + bin: + rimraf: dist/esm/bin.mjs + checksum: d50dbe724f33835decd88395b25ed35995077c60a50ae78ded06e0185418914e555817aad1b4243edbff2254548c2f6ad6f70cc850040bebb4da9e8cc016f586 + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -2073,6 +2189,22 @@ __metadata: languageName: node linkType: hard +"tsc-alias@npm:^1.8.8": + version: 1.8.8 + resolution: "tsc-alias@npm:1.8.8" + dependencies: + chokidar: "npm:^3.5.3" + commander: "npm:^9.0.0" + globby: "npm:^11.0.4" + mylas: "npm:^2.1.9" + normalize-path: "npm:^3.0.0" + plimit-lit: "npm:^1.2.6" + bin: + tsc-alias: dist/bin/index.js + checksum: 02d0e3309f5b4d5c2dfc09ddb1192faa75108025e37d51f85dd7cfaab1ebe69cd50a6ed17d2e5d692ddc406455c1b17dfc056ca6ac56f587cba7b63993de251c + languageName: node + linkType: hard + "tsx@npm:^4.6.2": version: 4.6.2 resolution: "tsx@npm:4.6.2" @@ -2125,6 +2257,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 + languageName: node + linkType: hard + "unique-filename@npm:^3.0.0": version: 3.0.0 resolution: "unique-filename@npm:3.0.0"