npm-pkg-lint 1.13.0 → 1.14.0

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/README.md CHANGED
@@ -60,6 +60,12 @@ Verifies the presence of files specified in:
60
60
  - `bin`
61
61
  - `man`
62
62
 
63
+ ## TypeScript `types` in `exports`
64
+
65
+ Requires `types` to be the first condition in `exports`.
66
+
67
+ **Why?** For TypeScript to properly detect `types` it need to come before `require` or `import`, else it will fall back to detecting by filename.
68
+
63
69
  ## Disallowed dependencies
64
70
 
65
71
  Disallows certain packages from being included as `dependencies` (use `devDependencies` or `peerDependencies` instead).
package/dist/index.js CHANGED
@@ -9250,7 +9250,7 @@ var require_pack = __commonJS({
9250
9250
  };
9251
9251
  var MiniPass = require_minipass();
9252
9252
  var zlib = require_minizlib();
9253
- var ReadEntry2 = require_read_entry();
9253
+ var ReadEntry = require_read_entry();
9254
9254
  var WriteEntry = require_write_entry();
9255
9255
  var WriteEntrySync = WriteEntry.Sync;
9256
9256
  var WriteEntryTar = WriteEntry.Tar;
@@ -9346,7 +9346,7 @@ var require_pack = __commonJS({
9346
9346
  if (this[ENDED]) {
9347
9347
  throw new Error("write after end");
9348
9348
  }
9349
- if (path8 instanceof ReadEntry2) {
9349
+ if (path8 instanceof ReadEntry) {
9350
9350
  this[ADDTARENTRY](path8);
9351
9351
  } else {
9352
9352
  this[ADDFSENTRY](path8);
@@ -15892,7 +15892,7 @@ async function getFileContent(tarball, filenames) {
15892
15892
  rs.pipe(t);
15893
15893
  });
15894
15894
  }
15895
- async function blacklistedFiles(filelist) {
15895
+ function blacklistedFiles(filelist) {
15896
15896
  return filelist.filter(isBlacklisted);
15897
15897
  }
15898
15898
  function normalizeRequiredFiles(src) {
@@ -15972,7 +15972,7 @@ function fileExists(filelist, filename2) {
15972
15972
  async function verifyTarball(pkg, tarball) {
15973
15973
  const messages = [];
15974
15974
  const filelist = await getFileList(tarball.filePath);
15975
- for (const filename2 of await blacklistedFiles(filelist)) {
15975
+ for (const filename2 of blacklistedFiles(filelist)) {
15976
15976
  messages.push({
15977
15977
  ruleId: "no-disallowed-files",
15978
15978
  severity: 2,
@@ -16035,9 +16035,11 @@ function nonempty(key, value) {
16035
16035
  }
16036
16036
  return;
16037
16037
  }
16038
- const values = Object.values(value);
16039
- if (values.length === 0) {
16040
- throw new Error(`"${key}" must not be empty`);
16038
+ if (value && typeof value === "object") {
16039
+ const values = Object.values(value);
16040
+ if (values.length === 0) {
16041
+ throw new Error(`"${key}" must not be empty`);
16042
+ }
16041
16043
  }
16042
16044
  }
16043
16045
 
@@ -16148,6 +16150,37 @@ function isDisallowedDependency(pkg, dependency) {
16148
16150
  return match(disallowedDependencies, dependency);
16149
16151
  }
16150
16152
 
16153
+ // src/rules/exports-types-order.ts
16154
+ var ruleId2 = "exports-types-order";
16155
+ var severity = Severity.ERROR;
16156
+ function* validateOrder(value, path7) {
16157
+ if (!value || typeof value === "string") {
16158
+ return;
16159
+ }
16160
+ const keys = Object.keys(value);
16161
+ if (keys.length === 0) {
16162
+ return;
16163
+ }
16164
+ if (keys.includes("types") && keys[0] !== "types") {
16165
+ const property = path7.map((it) => `["${it}"]`).join("");
16166
+ yield {
16167
+ ruleId: ruleId2,
16168
+ severity,
16169
+ message: `"types" must be the first condition in "exports${property}"`,
16170
+ line: 1,
16171
+ column: 1
16172
+ };
16173
+ }
16174
+ for (const key of keys) {
16175
+ yield* validateOrder(value[key], [...path7, key]);
16176
+ }
16177
+ }
16178
+ function* exportsTypesOrder(pkg) {
16179
+ if (pkg.exports) {
16180
+ yield* validateOrder(pkg.exports, []);
16181
+ }
16182
+ }
16183
+
16151
16184
  // src/rules/outdated-engines.ts
16152
16185
  var import_semver = __toESM(require_semver2(), 1);
16153
16186
 
@@ -16167,13 +16200,13 @@ var nodeVersions = [
16167
16200
  ];
16168
16201
 
16169
16202
  // src/rules/outdated-engines.ts
16170
- var ruleId2 = "outdated-engines";
16171
- var severity = Severity.ERROR;
16203
+ var ruleId3 = "outdated-engines";
16204
+ var severity2 = Severity.ERROR;
16172
16205
  function* outdatedEngines(pkg) {
16173
16206
  if (!pkg.engines || !pkg.engines.node) {
16174
16207
  yield {
16175
- ruleId: ruleId2,
16176
- severity,
16208
+ ruleId: ruleId3,
16209
+ severity: severity2,
16177
16210
  message: "Missing engines.node field",
16178
16211
  line: 1,
16179
16212
  column: 1
@@ -16183,8 +16216,8 @@ function* outdatedEngines(pkg) {
16183
16216
  const range = pkg.engines.node;
16184
16217
  if (!import_semver.default.validRange(range)) {
16185
16218
  yield {
16186
- ruleId: ruleId2,
16187
- severity,
16219
+ ruleId: ruleId3,
16220
+ severity: severity2,
16188
16221
  message: `engines.node "${range}" is not a valid semver range`,
16189
16222
  line: 1,
16190
16223
  column: 1
@@ -16200,11 +16233,11 @@ function* outdatedEngines(pkg) {
16200
16233
  if (!import_semver.default.satisfies(expanded, range)) {
16201
16234
  continue;
16202
16235
  }
16203
- const nodeRelease = (parsed == null ? void 0 : parsed.major) || `0.${parsed == null ? void 0 : parsed.minor}`;
16236
+ const nodeRelease = (parsed == null ? void 0 : parsed.major) || `0.${(parsed == null ? void 0 : parsed.minor) ?? ""}`;
16204
16237
  const message = `engines.node is satisfied by Node ${nodeRelease} (EOL since ${descriptor.eol})`;
16205
16238
  yield {
16206
- ruleId: ruleId2,
16207
- severity,
16239
+ ruleId: ruleId3,
16240
+ severity: severity2,
16208
16241
  message,
16209
16242
  line: 1,
16210
16243
  column: 1
@@ -17356,7 +17389,7 @@ async function npmInfo(pkg) {
17356
17389
  }
17357
17390
 
17358
17391
  // src/rules/verify-engine-constraint.ts
17359
- var ruleId3 = "invalid-engine-constraint";
17392
+ var ruleId4 = "invalid-engine-constraint";
17360
17393
  async function* getDeepDependencies(pkg, dependency) {
17361
17394
  const pkgData = dependency ? await npmInfo(dependency) : pkg;
17362
17395
  for (const [key, value] of Object.entries(pkgData.dependencies ?? {})) {
@@ -17365,7 +17398,7 @@ async function* getDeepDependencies(pkg, dependency) {
17365
17398
  }
17366
17399
  const deep = `${key}@${value}`;
17367
17400
  yield deep;
17368
- yield* await getDeepDependencies(pkg, deep);
17401
+ yield* getDeepDependencies(pkg, deep);
17369
17402
  }
17370
17403
  }
17371
17404
  async function verifyEngineConstraint(pkg) {
@@ -17387,7 +17420,7 @@ async function verifyEngineConstraint(pkg) {
17387
17420
  }
17388
17421
  if (!import_semver2.default.satisfies(minDeclared, constraint)) {
17389
17422
  messages.push({
17390
- ruleId: ruleId3,
17423
+ ruleId: ruleId4,
17391
17424
  severity: 2,
17392
17425
  message: `the transitive dependency "${dependency}" (node ${constraint}) does not satisfy the declared node engine "${declaredConstraint}"`,
17393
17426
  line: 1,
@@ -17400,8 +17433,8 @@ async function verifyEngineConstraint(pkg) {
17400
17433
 
17401
17434
  // src/rules/types-node-matching-engine.ts
17402
17435
  var import_semver3 = __toESM(require_semver2(), 1);
17403
- var ruleId4 = "types-node-matching-engine";
17404
- var severity2 = Severity.ERROR;
17436
+ var ruleId5 = "types-node-matching-engine";
17437
+ var severity3 = Severity.ERROR;
17405
17438
  function* typesNodeMatchingEngine(pkg) {
17406
17439
  if (!pkg.engines || !pkg.engines.node) {
17407
17440
  return;
@@ -17421,8 +17454,8 @@ function* typesNodeMatchingEngine(pkg) {
17421
17454
  }
17422
17455
  if (typesVersion.major !== nodeVersion.major) {
17423
17456
  yield {
17424
- ruleId: ruleId4,
17425
- severity: severity2,
17457
+ ruleId: ruleId5,
17458
+ severity: severity3,
17426
17459
  message: `@types/node v${typesVersion.major} does not equal engines.node v${nodeVersion.major}`,
17427
17460
  line: 1,
17428
17461
  column: 1
@@ -17487,6 +17520,7 @@ function verifyDependencies(pkg, options) {
17487
17520
  async function verifyPackageJson(pkg, filePath, options = {}) {
17488
17521
  const messages = [
17489
17522
  ...await verifyEngineConstraint(pkg),
17523
+ ...exportsTypesOrder(pkg),
17490
17524
  ...verifyFields(pkg, options),
17491
17525
  ...verifyDependencies(pkg, options),
17492
17526
  ...outdatedEngines(pkg),
@@ -17661,7 +17695,10 @@ async function run() {
17661
17695
  }, 0);
17662
17696
  process.exitCode = totalErrors > 0 ? 1 : 0;
17663
17697
  }
17664
- run();
17698
+ run().catch((err) => {
17699
+ console.error(err);
17700
+ process.exitCode = 1;
17701
+ });
17665
17702
  /*! Bundled license information:
17666
17703
 
17667
17704
  tmp/lib/tmp.js: