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 +6 -0
- package/dist/index.js +61 -24
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
16039
|
-
|
|
16040
|
-
|
|
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
|
|
16171
|
-
var
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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*
|
|
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:
|
|
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
|
|
17404
|
-
var
|
|
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:
|
|
17425
|
-
severity:
|
|
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:
|