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 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
- if (version2.startsWith("npm:")) {
11324
- const [newKey, newVersion] = version2.slice("npm:".length).split("@", 2);
11325
- key = newKey;
11326
- version2 = newVersion;
11337
+ const { name, version: normalizedVersion } = normalizeDependency(key, version2);
11338
+ if (normalizedVersion === "") {
11339
+ return null;
11327
11340
  }
11328
- if (key === "@types/node") {
11341
+ if (name === "@types/node") {
11329
11342
  return null;
11330
11343
  }
11331
- const minVersion = import_semver.default.minVersion(version2);
11344
+ const minVersion = import_semver.default.minVersion(normalizedVersion);
11332
11345
  return {
11333
- name: key,
11334
- version: version2,
11335
- spec: `${key}@${minVersion ? minVersion.version : version2}`,
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.name);
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.name);
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/types-node-matching-engine.ts
11901
+ // src/rules/tsconfig-base-matching-engine.ts
11888
11902
  var import_semver3 = __toESM(require_semver2(), 1);
11889
- var ruleId12 = "types-node-matching-engine";
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 = import_semver3.default.minVersion(pkg.engines.node);
11905
- const typesVersion = import_semver3.default.minVersion(declaredVersion);
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: ruleId12,
11915
- severity: severity10,
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 import_semver4 = __toESM(require_semver2(), 1);
11926
- var ruleId13 = "invalid-engine-constraint";
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
- if (version2.startsWith("npm:")) {
11941
- const [newKey, newVersion] = version2.slice("npm:".length).split("@", 2);
11942
- key = newKey;
11943
- version2 = newVersion;
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 = import_semver4.default.minVersion(version2);
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 (!import_semver4.default.satisfies(minDeclared, constraint)) {
12027
+ if (!import_semver5.default.satisfies(minDeclared, constraint)) {
11964
12028
  return {
11965
- ruleId: ruleId13,
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 = import_semver4.default.minVersion(declaredConstraint);
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: ruleId13,
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
- if (version2.startsWith("npm:")) {
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(dependency, source) {
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, dependency);
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: `"${dependency}" is obsolete and should no longer be used: ${obsolete2.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 dependency of Object.keys(dependencies)) {
12240
- verifyObsolete(dependency, "dependencies");
12301
+ for (const [key, version2] of Object.entries(dependencies)) {
12302
+ verifyObsolete(key, version2, "dependencies");
12241
12303
  }
12242
- for (const dependency of Object.keys(devDependencies)) {
12243
- verifyObsolete(dependency, "devDependencies");
12304
+ for (const [key, version2] of Object.entries(devDependencies)) {
12305
+ verifyObsolete(key, version2, "devDependencies");
12244
12306
  }
12245
- for (const dependency of Object.keys(peerDependencies)) {
12246
- verifyObsolete(dependency, "peerDependencies");
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) {