From a10d818f494b18d98a24a2ba3461df03fb85c8e7 Mon Sep 17 00:00:00 2001 From: Rick Dutour Geerling Date: Tue, 9 Jan 2024 09:56:02 +0100 Subject: [PATCH 1/5] chore: add node-version file Auto-loads the correct Node version for many different version managers --- .node-version | 1 + 1 file changed, 1 insertion(+) create mode 100644 .node-version diff --git a/.node-version b/.node-version new file mode 100644 index 0000000..9a2a0e2 --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +v20 From aca1c14e17e05e4f8e3eb1a5303ed48a1707e49e Mon Sep 17 00:00:00 2001 From: Rick Dutour Geerling Date: Tue, 9 Jan 2024 09:57:57 +0100 Subject: [PATCH 2/5] chore: define build step We use a dedicated tsconfig file that only selects the files we need for the package. --- .gitignore | 4 +- package.json | 4 +- tsconfig.build.json | 8 +++ yarn.lock | 155 +++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 160 insertions(+), 11 deletions(-) create mode 100644 tsconfig.build.json 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/package.json b/package.json index ea2e1bb..3ff94f3 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "yarn": ">=4.0.2" }, "scripts": { - "tsc": "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" @@ -30,6 +30,8 @@ "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" } 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..ffcb2e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -327,6 +327,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 +574,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 +605,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 +631,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 +677,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 +726,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" @@ -880,6 +932,7 @@ __metadata: resolution: "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" @@ -887,8 +940,12 @@ __metadata: 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 @@ -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" From a1a41866ec8ff102ac0e02a47c1d1f12375af3b5 Mon Sep 17 00:00:00 2001 From: Rick Dutour Geerling Date: Tue, 9 Jan 2024 09:58:53 +0100 Subject: [PATCH 3/5] chore: prepare package for plugin --- package.json | 16 +++++++++++++++- src/index.ts | 10 ++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 3ff94f3..1fc53fa 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,13 @@ "description": "Official Trilon Eslint Plugin", "type": "commonjs", "main": "index.js", + "types": "./lib/index.d.ts", + "files": [ + "lib/**/*", + "package.json", + "README.md", + "LICENSE" + ], "engines": { "node": ">=20.9.0", "yarn": ">=4.0.2" @@ -16,13 +23,17 @@ }, "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", @@ -34,5 +45,8 @@ "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..3c1c0ed 100644 --- a/src/index.ts +++ b/src/index.ts @@ -0,0 +1,10 @@ +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 = { + rules: { + '@trilon/enforce-close-testing-module': enforceCloseTestingModuleRule, + }, +}; + +module.exports = plugin; From 1b9786a750417065b649fdff1390969d76a1fa19 Mon Sep 17 00:00:00 2001 From: Rick Dutour Geerling Date: Fri, 12 Jan 2024 10:08:54 +0100 Subject: [PATCH 4/5] chore: prepare for first publish Tested package with yalc --- README.md | 25 +++++++++++++++++++++++++ package.json | 7 ++++--- src/index.ts | 7 ++++++- yarn.lock | 44 ++++++++++++++++++++++---------------------- 4 files changed, 57 insertions(+), 26 deletions(-) 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 1fc53fa..ac84abd 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { - "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/**/*", @@ -16,6 +16,7 @@ "yarn": ">=4.0.2" }, "scripts": { + "prepublish": "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 .", diff --git a/src/index.ts b/src/index.ts index 3c1c0ed..e17f84e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,8 +2,13 @@ import enforceCloseTestingModuleRule from './rules/enforce-close-testing-module. // 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: { - '@trilon/enforce-close-testing-module': enforceCloseTestingModuleRule, + 'enforce-close-testing-module': enforceCloseTestingModuleRule, }, }; diff --git a/yarn.lock b/yarn.lock index ffcb2e6..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" @@ -927,28 +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" - "@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 - "eslint-scope@npm:^7.2.2": version: 7.2.2 resolution: "eslint-scope@npm:7.2.2" From b421622fd3b14ec047f3e95ec5f31cb5c41a9426 Mon Sep 17 00:00:00 2001 From: Rick Dutour Geerling Date: Fri, 12 Jan 2024 13:38:04 +0100 Subject: [PATCH 5/5] chore: fix pre-upload scripts prepublish is deprecated Co-authored-by: Tolga Paksoy --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ac84abd..aec3819 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "yarn": ">=4.0.2" }, "scripts": { - "prepublish": "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 .",