Skip to content

Commit a973a99

Browse files
committed
Reject non-ranges in package dependencies
1 parent 98dac6a commit a973a99

3 files changed

Lines changed: 66 additions & 4 deletions

File tree

.changeset/social-cows-yell.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@definitelytyped/header-parser": patch
3+
---
4+
5+
Reject non-ranges in package dependencies

packages/header-parser/src/index.ts

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,13 @@ export function validatePackageJson(
9898
`${typesDirectoryName}'s package.json has bad "devDependencies": must include \`"@types/${typesDirectoryName}": "workspace:."\``,
9999
);
100100
}
101+
// dependency version ranges
102+
for (const depsKey of ["dependencies", "peerDependencies", "devDependencies"] as const) {
103+
const deps = packageJson[depsKey];
104+
if (deps && typeof deps === "object" && !Array.isArray(deps)) {
105+
errors.push(...checkDependencyVersions(typesDirectoryName, depsKey, deps as Record<string, unknown>));
106+
}
107+
}
101108
// typesVersions
102109
if (needsTypesVersions) {
103110
assert.strictEqual(
@@ -475,10 +482,6 @@ export function checkPackageJsonDependencies(
475482
Please make a pull request to microsoft/DefinitelyTyped-tools adding it to \`packages/definitions-parser/allowedPackageJsonDependencies.txt\`.`;
476483
errors.push(`In ${path}: ${msg}`);
477484
}
478-
const version = (dependencies as { [key: string]: unknown })[dependencyName];
479-
if (typeof version !== "string") {
480-
errors.push(`In ${path}: Dependency version for ${dependencyName} should be a string.`);
481-
}
482485
}
483486
if (devDependencySelfName) {
484487
const selfDependency = (dependencies as { [key: string]: string | undefined })[devDependencySelfName];
@@ -492,3 +495,26 @@ Please make a pull request to microsoft/DefinitelyTyped-tools adding it to \`pac
492495
}
493496
return errors;
494497
}
498+
499+
function checkDependencyVersions(
500+
typesDirectoryName: string,
501+
depsKey: "dependencies" | "peerDependencies" | "devDependencies",
502+
dependencies: Record<string, unknown>,
503+
): string[] {
504+
const errors: string[] = [];
505+
for (const dependencyName of Object.keys(dependencies)) {
506+
const version = dependencies[dependencyName];
507+
if (typeof version !== "string") {
508+
errors.push(
509+
`${typesDirectoryName}'s package.json has bad "${depsKey}": version for ${dependencyName} should be a string.`,
510+
);
511+
} else if (version !== "workspace:." && semver.validRange(version) === null) {
512+
errors.push(
513+
`${typesDirectoryName}'s package.json has bad "${depsKey}": version for ${dependencyName} (${JSON.stringify(
514+
version,
515+
)}) must be a valid semver range or "workspace:.".`,
516+
);
517+
}
518+
}
519+
return errors;
520+
}

packages/header-parser/test/index.test.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,37 @@ describe("validatePackageJson", () => {
9999
it("works with old-version packages", () => {
100100
expect(Array.isArray(validatePackageJson("hapi", { ...pkgJson, version: "16.6.9999" }, []))).toBeFalsy();
101101
});
102+
it("requires dependency versions to be valid semver ranges or 'workspace:.'", () => {
103+
expect(
104+
validatePackageJson(
105+
"hapi",
106+
{ ...pkgJson, dependencies: { ...(pkgJson.dependencies as object), joi: "not-a-range" } },
107+
[],
108+
),
109+
).toEqual([
110+
`hapi's package.json has bad "dependencies": version for joi ("not-a-range") must be a valid semver range or "workspace:.".`,
111+
]);
112+
});
113+
it("allows 'workspace:.' as a dependency version", () => {
114+
expect(
115+
Array.isArray(
116+
validatePackageJson(
117+
"hapi",
118+
{ ...pkgJson, dependencies: { ...(pkgJson.dependencies as object), joi: "workspace:." } },
119+
[],
120+
),
121+
),
122+
).toBeFalsy();
123+
});
124+
it("requires dependency versions to be strings", () => {
125+
expect(
126+
validatePackageJson(
127+
"hapi",
128+
{ ...pkgJson, peerDependencies: { foo: 5 } },
129+
[],
130+
),
131+
).toEqual([`hapi's package.json has bad "peerDependencies": version for foo should be a string.`]);
132+
});
102133
});
103134

104135
describe("makeTypesVersionsForPackageJson", () => {

0 commit comments

Comments
 (0)