npm-pkg-lint 5.1.10 → 5.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +105 -42
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -10950,6 +10950,20 @@ function jsonLocation(ast, pick, ...datapath) {
|
|
|
10950
10950
|
}
|
|
10951
10951
|
}
|
|
10952
10952
|
|
|
10953
|
+
// src/utils/normalize-dependency.ts
|
|
10954
|
+
function normalizeDependency(key, value) {
|
|
10955
|
+
if (value.startsWith("npm:")) {
|
|
10956
|
+
const spec = value.slice("npm:".length);
|
|
10957
|
+
const [name, version2 = ""] = spec.split(/(?<=.)@/, 2);
|
|
10958
|
+
return { key, name, version: version2 };
|
|
10959
|
+
}
|
|
10960
|
+
return {
|
|
10961
|
+
key,
|
|
10962
|
+
name: key,
|
|
10963
|
+
version: value
|
|
10964
|
+
};
|
|
10965
|
+
}
|
|
10966
|
+
|
|
10953
10967
|
// node_modules/nano-spawn/source/context.js
|
|
10954
10968
|
import process3 from "node:process";
|
|
10955
10969
|
import { stripVTControlCharacters } from "node:util";
|
|
@@ -11320,19 +11334,19 @@ function createEntry(key, version2, source) {
|
|
|
11320
11334
|
if (version2.startsWith("file:")) {
|
|
11321
11335
|
return null;
|
|
11322
11336
|
}
|
|
11323
|
-
|
|
11324
|
-
|
|
11325
|
-
|
|
11326
|
-
version2 = newVersion;
|
|
11337
|
+
const { name, version: normalizedVersion } = normalizeDependency(key, version2);
|
|
11338
|
+
if (normalizedVersion === "") {
|
|
11339
|
+
return null;
|
|
11327
11340
|
}
|
|
11328
|
-
if (
|
|
11341
|
+
if (name === "@types/node") {
|
|
11329
11342
|
return null;
|
|
11330
11343
|
}
|
|
11331
|
-
const minVersion = import_semver.default.minVersion(
|
|
11344
|
+
const minVersion = import_semver.default.minVersion(normalizedVersion);
|
|
11332
11345
|
return {
|
|
11333
|
-
|
|
11334
|
-
|
|
11335
|
-
|
|
11346
|
+
key,
|
|
11347
|
+
name,
|
|
11348
|
+
version: normalizedVersion,
|
|
11349
|
+
spec: `${name}@${minVersion ? minVersion.version : normalizedVersion}`,
|
|
11336
11350
|
source
|
|
11337
11351
|
};
|
|
11338
11352
|
}
|
|
@@ -11369,7 +11383,7 @@ async function deprecatedDependency(pkg, pkgAst, options) {
|
|
|
11369
11383
|
if (!deprecated) {
|
|
11370
11384
|
continue;
|
|
11371
11385
|
}
|
|
11372
|
-
const { line, column } = jsonLocation(pkgAst, "member", dependency.source, dependency.
|
|
11386
|
+
const { line, column } = jsonLocation(pkgAst, "member", dependency.source, dependency.key);
|
|
11373
11387
|
messages.push({
|
|
11374
11388
|
ruleId: ruleId3,
|
|
11375
11389
|
severity: 2,
|
|
@@ -11382,7 +11396,7 @@ async function deprecatedDependency(pkg, pkgAst, options) {
|
|
|
11382
11396
|
if (dependency.source === "devDependencies") {
|
|
11383
11397
|
continue;
|
|
11384
11398
|
}
|
|
11385
|
-
const { line, column } = jsonLocation(pkgAst, "member", dependency.source, dependency.
|
|
11399
|
+
const { line, column } = jsonLocation(pkgAst, "member", dependency.source, dependency.key);
|
|
11386
11400
|
messages.push({
|
|
11387
11401
|
ruleId: ruleId3,
|
|
11388
11402
|
severity: 1,
|
|
@@ -11884,10 +11898,59 @@ function* shadowedTypes(pkg, pkgAst) {
|
|
|
11884
11898
|
}
|
|
11885
11899
|
}
|
|
11886
11900
|
|
|
11887
|
-
// src/rules/
|
|
11901
|
+
// src/rules/tsconfig-base-matching-engine.ts
|
|
11888
11902
|
var import_semver3 = __toESM(require_semver2(), 1);
|
|
11889
|
-
var ruleId12 = "
|
|
11903
|
+
var ruleId12 = "tsconfig-base-matching-engine";
|
|
11890
11904
|
var severity10 = Severity.ERROR;
|
|
11905
|
+
var matchDependency = /^@tsconfig\/node(\d+)$/;
|
|
11906
|
+
function* tsconfigBaseMatchingEngine(pkg, pkgAst) {
|
|
11907
|
+
if (!pkg.engines?.node) {
|
|
11908
|
+
return;
|
|
11909
|
+
}
|
|
11910
|
+
const nodeVersion = import_semver3.default.validRange(pkg.engines.node) ? import_semver3.default.minVersion(pkg.engines.node, {}) : null;
|
|
11911
|
+
if (!nodeVersion) {
|
|
11912
|
+
return;
|
|
11913
|
+
}
|
|
11914
|
+
for (const source of ["dependencies", "devDependencies", "peerDependencies"]) {
|
|
11915
|
+
const dependencies = pkg[source] ?? {};
|
|
11916
|
+
const tsconfig = Object.keys(dependencies).filter((it2) => matchDependency.test(it2));
|
|
11917
|
+
if (tsconfig.length === 0) {
|
|
11918
|
+
continue;
|
|
11919
|
+
}
|
|
11920
|
+
const [first, ...duplicates] = tsconfig;
|
|
11921
|
+
if (duplicates.length > 0) {
|
|
11922
|
+
for (const dup of duplicates) {
|
|
11923
|
+
const { line, column } = jsonLocation(pkgAst, "member", source, dup);
|
|
11924
|
+
yield {
|
|
11925
|
+
ruleId: ruleId12,
|
|
11926
|
+
severity: severity10,
|
|
11927
|
+
message: `${dup} and ${first} cannot be used at the same time`,
|
|
11928
|
+
line,
|
|
11929
|
+
column
|
|
11930
|
+
};
|
|
11931
|
+
}
|
|
11932
|
+
continue;
|
|
11933
|
+
}
|
|
11934
|
+
const match2 = matchDependency.exec(first);
|
|
11935
|
+
const baseVersion = Number(match2[1]);
|
|
11936
|
+
if (baseVersion !== nodeVersion.major) {
|
|
11937
|
+
const { line, column } = jsonLocation(pkgAst, "member", source, first);
|
|
11938
|
+
const expectedVersion = `v${String(nodeVersion.major)}`;
|
|
11939
|
+
yield {
|
|
11940
|
+
ruleId: ruleId12,
|
|
11941
|
+
severity: severity10,
|
|
11942
|
+
message: `${first} does not match engines.node ${expectedVersion}`,
|
|
11943
|
+
line,
|
|
11944
|
+
column
|
|
11945
|
+
};
|
|
11946
|
+
}
|
|
11947
|
+
}
|
|
11948
|
+
}
|
|
11949
|
+
|
|
11950
|
+
// src/rules/types-node-matching-engine.ts
|
|
11951
|
+
var import_semver4 = __toESM(require_semver2(), 1);
|
|
11952
|
+
var ruleId13 = "types-node-matching-engine";
|
|
11953
|
+
var severity11 = Severity.ERROR;
|
|
11891
11954
|
function* typesNodeMatchingEngine(pkg, pkgAst) {
|
|
11892
11955
|
if (!pkg.engines?.node) {
|
|
11893
11956
|
return;
|
|
@@ -11901,8 +11964,8 @@ function* typesNodeMatchingEngine(pkg, pkgAst) {
|
|
|
11901
11964
|
if (declaredVersion === "latest") {
|
|
11902
11965
|
continue;
|
|
11903
11966
|
}
|
|
11904
|
-
const nodeVersion =
|
|
11905
|
-
const typesVersion =
|
|
11967
|
+
const nodeVersion = import_semver4.default.minVersion(pkg.engines.node);
|
|
11968
|
+
const typesVersion = import_semver4.default.minVersion(declaredVersion);
|
|
11906
11969
|
if (!nodeVersion || !typesVersion) {
|
|
11907
11970
|
continue;
|
|
11908
11971
|
}
|
|
@@ -11911,8 +11974,8 @@ function* typesNodeMatchingEngine(pkg, pkgAst) {
|
|
|
11911
11974
|
const actualVersion = `v${String(typesVersion.major)}`;
|
|
11912
11975
|
const expectedVersion = `v${String(nodeVersion.major)}`;
|
|
11913
11976
|
yield {
|
|
11914
|
-
ruleId:
|
|
11915
|
-
severity:
|
|
11977
|
+
ruleId: ruleId13,
|
|
11978
|
+
severity: severity11,
|
|
11916
11979
|
message: `@types/node ${actualVersion} does not equal engines.node ${expectedVersion}`,
|
|
11917
11980
|
line,
|
|
11918
11981
|
column
|
|
@@ -11922,8 +11985,8 @@ function* typesNodeMatchingEngine(pkg, pkgAst) {
|
|
|
11922
11985
|
}
|
|
11923
11986
|
|
|
11924
11987
|
// src/rules/verify-engine-constraint.ts
|
|
11925
|
-
var
|
|
11926
|
-
var
|
|
11988
|
+
var import_semver5 = __toESM(require_semver2(), 1);
|
|
11989
|
+
var ruleId14 = "invalid-engine-constraint";
|
|
11927
11990
|
async function* getDeepDependencies(pkg, visited, dependency) {
|
|
11928
11991
|
if (dependency) {
|
|
11929
11992
|
if (visited.has(dependency)) {
|
|
@@ -11937,15 +12000,16 @@ async function* getDeepDependencies(pkg, visited, dependency) {
|
|
|
11937
12000
|
}
|
|
11938
12001
|
const { dependencies = {} } = pkgData;
|
|
11939
12002
|
for (let [key, version2] of Object.entries(dependencies)) {
|
|
11940
|
-
|
|
11941
|
-
|
|
11942
|
-
|
|
11943
|
-
|
|
12003
|
+
const normalized = normalizeDependency(key, version2);
|
|
12004
|
+
key = normalized.name;
|
|
12005
|
+
version2 = normalized.version;
|
|
12006
|
+
if (version2 === "") {
|
|
12007
|
+
continue;
|
|
11944
12008
|
}
|
|
11945
12009
|
if (key === "@types/node") {
|
|
11946
12010
|
continue;
|
|
11947
12011
|
}
|
|
11948
|
-
const minVersion =
|
|
12012
|
+
const minVersion = import_semver5.default.minVersion(version2);
|
|
11949
12013
|
const deep = `${key}@${minVersion ? minVersion.version : version2}`;
|
|
11950
12014
|
yield deep;
|
|
11951
12015
|
yield* getDeepDependencies(pkg, visited, deep);
|
|
@@ -11960,9 +12024,9 @@ async function verifyDependency(dependency, minDeclared, declaredConstraint) {
|
|
|
11960
12024
|
if (!constraint) {
|
|
11961
12025
|
return null;
|
|
11962
12026
|
}
|
|
11963
|
-
if (!
|
|
12027
|
+
if (!import_semver5.default.satisfies(minDeclared, constraint)) {
|
|
11964
12028
|
return {
|
|
11965
|
-
ruleId:
|
|
12029
|
+
ruleId: ruleId14,
|
|
11966
12030
|
severity: 2,
|
|
11967
12031
|
message: `the transitive dependency "${dependency}" (node ${constraint}) does not satisfy the declared node engine "${declaredConstraint}"`,
|
|
11968
12032
|
line: 1,
|
|
@@ -11976,7 +12040,7 @@ async function verifyEngineConstraint(pkg) {
|
|
|
11976
12040
|
if (!declaredConstraint) {
|
|
11977
12041
|
return [];
|
|
11978
12042
|
}
|
|
11979
|
-
const minDeclared =
|
|
12043
|
+
const minDeclared = import_semver5.default.minVersion(declaredConstraint);
|
|
11980
12044
|
if (!minDeclared) {
|
|
11981
12045
|
throw new Error(`Failed to parse engine constraint "${declaredConstraint}"`);
|
|
11982
12046
|
}
|
|
@@ -11991,7 +12055,7 @@ async function verifyEngineConstraint(pkg) {
|
|
|
11991
12055
|
} catch (err) {
|
|
11992
12056
|
if (isNpmInfoError(err) && err.code === "E404") {
|
|
11993
12057
|
messages.push({
|
|
11994
|
-
ruleId:
|
|
12058
|
+
ruleId: ruleId14,
|
|
11995
12059
|
severity: 1,
|
|
11996
12060
|
message: `the transitive dependency "${dependency}" is not published to the NPM registry`,
|
|
11997
12061
|
line: 1,
|
|
@@ -12194,11 +12258,7 @@ function verifyFields(pkg, pkgAst, options) {
|
|
|
12194
12258
|
return messages;
|
|
12195
12259
|
}
|
|
12196
12260
|
function getActualDependency(key, version2) {
|
|
12197
|
-
|
|
12198
|
-
const [name] = version2.slice("npm:".length).split("@", 2);
|
|
12199
|
-
return name;
|
|
12200
|
-
}
|
|
12201
|
-
return key;
|
|
12261
|
+
return normalizeDependency(key, version2).name;
|
|
12202
12262
|
}
|
|
12203
12263
|
function verifyDependencies(pkg, pkgAst, options) {
|
|
12204
12264
|
const messages = [];
|
|
@@ -12223,27 +12283,29 @@ function verifyDependencies(pkg, pkgAst, options) {
|
|
|
12223
12283
|
});
|
|
12224
12284
|
}
|
|
12225
12285
|
}
|
|
12226
|
-
function verifyObsolete(
|
|
12286
|
+
function verifyObsolete(key, version2, source) {
|
|
12287
|
+
const { name: dependency } = normalizeDependency(key, version2);
|
|
12227
12288
|
const obsolete2 = isObsoleteDependency(dependency);
|
|
12228
12289
|
if (obsolete2) {
|
|
12229
|
-
const { line, column } = jsonLocation(pkgAst, "member", source,
|
|
12290
|
+
const { line, column } = jsonLocation(pkgAst, "member", source, key);
|
|
12291
|
+
const name = key === dependency ? `"${dependency}"` : `"${key}" ("npm:${dependency}")`;
|
|
12230
12292
|
messages.push({
|
|
12231
12293
|
ruleId: "obsolete-dependency",
|
|
12232
12294
|
severity: 2,
|
|
12233
|
-
message:
|
|
12295
|
+
message: `${name} is obsolete and should no longer be used: ${obsolete2.message}`,
|
|
12234
12296
|
line,
|
|
12235
12297
|
column
|
|
12236
12298
|
});
|
|
12237
12299
|
}
|
|
12238
12300
|
}
|
|
12239
|
-
for (const
|
|
12240
|
-
verifyObsolete(
|
|
12301
|
+
for (const [key, version2] of Object.entries(dependencies)) {
|
|
12302
|
+
verifyObsolete(key, version2, "dependencies");
|
|
12241
12303
|
}
|
|
12242
|
-
for (const
|
|
12243
|
-
verifyObsolete(
|
|
12304
|
+
for (const [key, version2] of Object.entries(devDependencies)) {
|
|
12305
|
+
verifyObsolete(key, version2, "devDependencies");
|
|
12244
12306
|
}
|
|
12245
|
-
for (const
|
|
12246
|
-
verifyObsolete(
|
|
12307
|
+
for (const [key, version2] of Object.entries(peerDependencies)) {
|
|
12308
|
+
verifyObsolete(key, version2, "peerDependencies");
|
|
12247
12309
|
}
|
|
12248
12310
|
return messages;
|
|
12249
12311
|
}
|
|
@@ -12263,6 +12325,7 @@ async function verifyPackageJson(pkg, pkgAst, filePath, options = { allowedDepen
|
|
|
12263
12325
|
...outdatedEngines(pkg, pkgAst, ignoreNodeVersion),
|
|
12264
12326
|
...preferTypes(pkg, pkgAst),
|
|
12265
12327
|
...shadowedTypes(pkg, pkgAst),
|
|
12328
|
+
...tsconfigBaseMatchingEngine(pkg, pkgAst),
|
|
12266
12329
|
...typesNodeMatchingEngine(pkg, pkgAst)
|
|
12267
12330
|
];
|
|
12268
12331
|
if (messages.length === 0) {
|