From ab005925a432dc3b3675c5c310efbcb530d5f7b5 Mon Sep 17 00:00:00 2001 From: Brett Zamir Date: Tue, 6 Jun 2023 07:16:06 -0700 Subject: [PATCH] fix(`imports-as-dependencies`): support Node builtins; fixes #1112 --- docs/rules/imports-as-dependencies.md | 12 +++++ package.json | 3 +- pnpm-lock.yaml | 47 ++++++++++--------- src/rules/importsAsDependencies.js | 7 ++- .../rules/assertions/importsAsDependencies.js | 21 +++++++++ 5 files changed, 67 insertions(+), 23 deletions(-) diff --git a/docs/rules/imports-as-dependencies.md b/docs/rules/imports-as-dependencies.md index 6d2130c1c..072a39ce3 100644 --- a/docs/rules/imports-as-dependencies.md +++ b/docs/rules/imports-as-dependencies.md @@ -83,5 +83,17 @@ The following patterns are not considered problems: /** * @type {null|import('./relativePath.js').Program} */ + +/** + * @type {null|import('fs').PathLike} + */ + +/** + * @type {null|import('fs/promises').FileHandle} + */ + +/** + * @type {null|import('node:fs').PathLike} + */ ```` diff --git a/package.json b/package.json index 6705c300b..4e7f6c211 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", "esquery": "^1.5.0", + "is-builtin-module": "^3.2.1", "semver": "^7.5.1", "spdx-expression-parse": "^3.0.1" }, @@ -37,7 +38,7 @@ "@types/estree": "^1.0.1", "@types/lodash.defaultsdeep": "^4.6.7", "@types/mocha": "^10.0.1", - "@types/node": "^20.2.3", + "@types/node": "^20.2.5", "@types/semver": "^7.5.0", "@types/spdx-expression-parse": "^3.0.2", "@typescript-eslint/parser": "^5.59.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ac905926a..4ab01cdaf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,8 @@ -lockfileVersion: '6.0' +lockfileVersion: '6.1' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: '@es-joy/jsdoccomment': @@ -19,6 +23,9 @@ dependencies: esquery: specifier: ^1.5.0 version: 1.5.0 + is-builtin-module: + specifier: ^3.2.1 + version: 3.2.1 semver: specifier: ^7.5.1 version: 7.5.1 @@ -91,8 +98,8 @@ devDependencies: specifier: ^10.0.1 version: 10.0.1 '@types/node': - specifier: ^20.2.3 - version: 20.2.3 + specifier: ^20.2.5 + version: 20.2.5 '@types/semver': specifier: ^7.5.0 version: 7.5.0 @@ -125,7 +132,7 @@ devDependencies: version: 8.41.0 eslint-config-canonical: specifier: ~41.0.4 - version: 41.0.4(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.5)(@types/node@20.2.3)(eslint@8.41.0)(graphql@16.6.0)(typescript@5.0.4) + version: 41.0.4(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.5)(@types/node@20.2.5)(eslint@8.41.0)(graphql@16.6.0)(typescript@5.0.4) espree: specifier: ^9.5.2 version: 9.5.2 @@ -1563,7 +1570,7 @@ packages: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} dev: true - /@graphql-eslint/eslint-plugin@3.18.0(@babel/core@7.21.8)(@types/node@20.2.3)(graphql@16.6.0): + /@graphql-eslint/eslint-plugin@3.18.0(@babel/core@7.21.8)(@types/node@20.2.5)(graphql@16.6.0): resolution: {integrity: sha512-riEEfRycc0+pWxcEWqHi8woRxzg1xZqAfh9DRACJUR7bTN8dmc1N04i7+pvW4sevClUFYC2wuL1Vtr+DwzXLUg==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 @@ -1576,7 +1583,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) fast-glob: 3.2.12 graphql: 16.6.0 - graphql-config: 4.5.0(@types/node@20.2.3)(graphql@16.6.0) + graphql-config: 4.5.0(@types/node@20.2.5)(graphql@16.6.0) graphql-depth-limit: 1.1.0(graphql@16.6.0) lodash.lowercase: 4.3.0 tslib: 2.5.0 @@ -1651,7 +1658,7 @@ packages: - utf-8-validate dev: true - /@graphql-tools/executor-http@0.1.10(@types/node@20.2.3)(graphql@16.6.0): + /@graphql-tools/executor-http@0.1.10(@types/node@20.2.5)(graphql@16.6.0): resolution: {integrity: sha512-hnAfbKv0/lb9s31LhWzawQ5hghBfHS+gYWtqxME6Rl0Aufq9GltiiLBcl7OVVOnkLF0KhwgbYP1mB5VKmgTGpg==} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -1662,7 +1669,7 @@ packages: dset: 3.1.2 extract-files: 11.0.0 graphql: 16.6.0 - meros: 1.2.1(@types/node@20.2.3) + meros: 1.2.1(@types/node@20.2.5) tslib: 2.5.0 value-or-promise: 1.0.12 transitivePeerDependencies: @@ -1785,7 +1792,7 @@ packages: value-or-promise: 1.0.12 dev: true - /@graphql-tools/url-loader@7.17.18(@types/node@20.2.3)(graphql@16.6.0): + /@graphql-tools/url-loader@7.17.18(@types/node@20.2.5)(graphql@16.6.0): resolution: {integrity: sha512-ear0CiyTj04jCVAxi7TvgbnGDIN2HgqzXzwsfcqiVg9cvjT40NcMlZ2P1lZDgqMkZ9oyLTV8Bw6j+SyG6A+xPw==} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -1793,7 +1800,7 @@ packages: '@ardatan/sync-fetch': 0.0.1 '@graphql-tools/delegate': 9.0.35(graphql@16.6.0) '@graphql-tools/executor-graphql-ws': 0.0.14(graphql@16.6.0) - '@graphql-tools/executor-http': 0.1.10(@types/node@20.2.3)(graphql@16.6.0) + '@graphql-tools/executor-http': 0.1.10(@types/node@20.2.5)(graphql@16.6.0) '@graphql-tools/executor-legacy-ws': 0.0.11(graphql@16.6.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) '@graphql-tools/wrap': 9.4.2(graphql@16.6.0) @@ -2341,8 +2348,8 @@ packages: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} dev: true - /@types/node@20.2.3: - resolution: {integrity: sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw==} + /@types/node@20.2.5: + resolution: {integrity: sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==} dev: true /@types/normalize-package-data@2.4.1: @@ -2364,7 +2371,7 @@ packages: /@types/ws@8.5.4: resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} dependencies: - '@types/node': 20.2.3 + '@types/node': 20.2.5 dev: true /@typescript-eslint/eslint-plugin@5.59.5(@typescript-eslint/parser@5.59.6)(eslint@8.41.0)(typescript@5.0.4): @@ -3111,7 +3118,6 @@ packages: /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - dev: true /bundle-name@3.0.0: resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} @@ -4161,7 +4167,7 @@ packages: lodash.zip: 4.2.0 dev: true - /eslint-config-canonical@41.0.4(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.5)(@types/node@20.2.3)(eslint@8.41.0)(graphql@16.6.0)(typescript@5.0.4): + /eslint-config-canonical@41.0.4(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.5)(@types/node@20.2.5)(eslint@8.41.0)(graphql@16.6.0)(typescript@5.0.4): resolution: {integrity: sha512-2wRKw0VsBzP+GyWMMy0cuNkEs3NI5mWNk83rHAXZtkBA72AUanQw+ufoGhN0Uso4OiH0tb+Mj0kQkPDnr0DTbg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -4171,7 +4177,7 @@ packages: '@babel/eslint-parser': 7.21.8(@babel/core@7.21.8)(eslint@8.41.0) '@babel/eslint-plugin': 7.19.1(@babel/eslint-parser@7.21.8)(eslint@8.41.0) '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.21.8) - '@graphql-eslint/eslint-plugin': 3.18.0(@babel/core@7.21.8)(@types/node@20.2.3)(graphql@16.6.0) + '@graphql-eslint/eslint-plugin': 3.18.0(@babel/core@7.21.8)(@types/node@20.2.5)(graphql@16.6.0) '@next/eslint-plugin-next': 13.4.2 '@rushstack/eslint-patch': 1.2.0 '@typescript-eslint/eslint-plugin': 5.59.5(@typescript-eslint/parser@5.59.6)(eslint@8.41.0)(typescript@5.0.4) @@ -5530,7 +5536,7 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true - /graphql-config@4.5.0(@types/node@20.2.3)(graphql@16.6.0): + /graphql-config@4.5.0(@types/node@20.2.5)(graphql@16.6.0): resolution: {integrity: sha512-x6D0/cftpLUJ0Ch1e5sj1TZn6Wcxx4oMfmhaG9shM0DKajA9iR+j1z86GSTQ19fShbGvrSSvbIQsHku6aQ6BBw==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -5544,7 +5550,7 @@ packages: '@graphql-tools/json-file-loader': 7.4.18(graphql@16.6.0) '@graphql-tools/load': 7.8.14(graphql@16.6.0) '@graphql-tools/merge': 8.4.2(graphql@16.6.0) - '@graphql-tools/url-loader': 7.17.18(@types/node@20.2.3)(graphql@16.6.0) + '@graphql-tools/url-loader': 7.17.18(@types/node@20.2.5)(graphql@16.6.0) '@graphql-tools/utils': 9.2.1(graphql@16.6.0) cosmiconfig: 8.0.0 graphql: 16.6.0 @@ -5975,7 +5981,6 @@ packages: engines: {node: '>=6'} dependencies: builtin-modules: 3.3.0 - dev: true /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} @@ -6989,7 +6994,7 @@ packages: engines: {node: '>= 8'} dev: true - /meros@1.2.1(@types/node@20.2.3): + /meros@1.2.1(@types/node@20.2.5): resolution: {integrity: sha512-R2f/jxYqCAGI19KhAvaxSOxALBMkaXWH2a7rOyqQw+ZmizX5bKkEYWLzdhC+U82ZVVPVp6MCXe3EkVligh+12g==} engines: {node: '>=13'} peerDependencies: @@ -6998,7 +7003,7 @@ packages: '@types/node': optional: true dependencies: - '@types/node': 20.2.3 + '@types/node': 20.2.5 dev: true /micro-spelling-correcter@1.1.1: diff --git a/src/rules/importsAsDependencies.js b/src/rules/importsAsDependencies.js index 44630e954..be843d087 100644 --- a/src/rules/importsAsDependencies.js +++ b/src/rules/importsAsDependencies.js @@ -7,6 +7,7 @@ import { import { readFileSync, } from 'fs'; +import isBuiltinModule from 'is-builtin-module'; import { join, } from 'path'; @@ -71,7 +72,11 @@ export default iterateJsdoc(({ return; } - if (!moduleCheck.has(mod)) { + if (isBuiltinModule(mod)) { + // mod = '@types/node'; + // moduleCheck.set(mod, !deps.has(mod)); + return; + } else if (!moduleCheck.has(mod)) { let pkg; try { pkg = JSON.parse( diff --git a/test/rules/assertions/importsAsDependencies.js b/test/rules/assertions/importsAsDependencies.js index 86e3b8418..6090b5d2d 100644 --- a/test/rules/assertions/importsAsDependencies.js +++ b/test/rules/assertions/importsAsDependencies.js @@ -116,5 +116,26 @@ export default { */ `, }, + { + code: ` + /** + * @type {null|import('fs').PathLike} + */ + `, + }, + { + code: ` + /** + * @type {null|import('fs/promises').FileHandle} + */ + `, + }, + { + code: ` + /** + * @type {null|import('node:fs').PathLike} + */ + `, + }, ], };