Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for peer deps #1072

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/fresh-masks-retire.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@definitelytyped/definitions-parser": patch
"@definitelytyped/eslint-plugin": patch
"@definitelytyped/header-parser": patch
---

Add support for peerDependencies
3 changes: 3 additions & 0 deletions packages/definitions-parser/src/lib/definition-parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,7 @@ async function getPackageJsonInfoForPackage(
const packageJson = fs.readJson(packageJsonName) as {
readonly license?: unknown;
readonly dependencies?: unknown;
readonly peerDependencies?: unknown;
readonly devDependencies?: unknown;
readonly imports?: unknown;
readonly exports?: unknown;
Expand All @@ -217,6 +218,7 @@ async function getPackageJsonInfoForPackage(
const header = Array.isArray(packageJsonResult) ? undefined : packageJsonResult;
const allowedDependencies = await getAllowedPackageJsonDependencies();
errors.push(...checkPackageJsonDependencies(packageJson.dependencies, packageJsonName, allowedDependencies));
errors.push(...checkPackageJsonDependencies(packageJson.peerDependencies, packageJsonName, allowedDependencies));
errors.push(
...checkPackageJsonDependencies(
packageJson.devDependencies,
Expand Down Expand Up @@ -248,6 +250,7 @@ async function getPackageJsonInfoForPackage(
license: license as License,
dependencies: packageJson.dependencies as Record<string, string>,
devDependencies: packageJson.devDependencies as Record<string, string>,
peerDependencies: packageJson.peerDependencies as Record<string, string> | undefined,
imports: imports as object | undefined,
exports: exports as string | object | undefined,
type: packageJsonType as "module" | undefined,
Expand Down
11 changes: 11 additions & 0 deletions packages/definitions-parser/src/packages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,11 @@ export interface TypingsDataRaw {
*/
readonly devDependencies: PackageJsonDependencies;

/**
* Packages that this package peer depends on.
*/
readonly peerDependencies?: PackageJsonDependencies;

/**
* The [older] version of the library that this definition package refers to, as represented *on-disk*.
*
Expand Down Expand Up @@ -523,13 +528,19 @@ export class TypingsData extends PackageBase {
get devDependencies(): PackageJsonDependencies {
return this.data.devDependencies ?? {};
}
get peerDependencies(): PackageJsonDependencies {
return this.data.peerDependencies ?? {};
}
*allPackageJsonDependencies(): Iterable<[string, string]> {
for (const [name, version] of Object.entries(this.dependencies)) {
yield [name, version];
}
for (const [name, version] of Object.entries(this.devDependencies)) {
yield [name, version];
}
for (const [name, version] of Object.entries(this.peerDependencies)) {
yield [name, version];
}
}

private _contentHash: string | undefined;
Expand Down
6 changes: 6 additions & 0 deletions packages/definitions-parser/test/packages.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,9 @@ describe(TypingsData, () => {
{
"@types/known": "workspace:.",
},
{
"peer-dependency-1": "*",
}
);
data = new TypingsData(dt.fs, versions["1.0"], true);
});
Expand Down Expand Up @@ -164,6 +167,9 @@ describe(TypingsData, () => {
expect(data.devDependencies).toEqual({
"@types/known": "workspace:.",
});
expect(data.peerDependencies).toEqual({
"peer-dependency-1": "*",
});
expect(data.id).toEqual({
typesDirectoryName: "known",
version: {
Expand Down
2 changes: 2 additions & 0 deletions packages/definitions-parser/test/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export function createTypingsVersionRaw(
libraryName: string,
dependencies: { readonly [name: string]: string },
devDependencies: { readonly [name: string]: string },
peerDependencies?: { readonly [name: string]: string },
): TypingsVersionsRaw {
return {
"1.0": {
Expand All @@ -29,6 +30,7 @@ export function createTypingsVersionRaw(
license: License.MIT,
dependencies,
devDependencies,
peerDependencies,
olderVersionDirectories: [],
},
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ const rule = createRule({
}
return dep;
})
.filter((dep) => dep !== info.realName && packageJson.dependencies?.[dep] === undefined); // TODO(jakebailey): add test for this case from https://github.com/microsoft/DefinitelyTyped-tools/pull/773
.filter((dep) => dep !== info.realName && packageJson.dependencies?.[dep] === undefined && packageJson.peerDependencies?.[dep] === undefined); // TODO(jakebailey): add test for this case from https://github.com/microsoft/DefinitelyTyped-tools/pull/773

commentsMatching(context.sourceCode, /<reference\s+types\s*=\s*"(.+)"\s*\/>/, (ref, comment) => {
if (devDeps.includes(ref)) {
Expand Down
1 change: 1 addition & 0 deletions packages/eslint-plugin/src/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ export interface PackageJSON {
owners: string[];
dependencies?: Record<string, string | undefined>;
devDependencies?: Record<string, string | undefined>;
peerDependencies?: Record<string, string | undefined>;
tsconfigs?: string[];
}

Expand Down
1 change: 1 addition & 0 deletions packages/header-parser/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ export function validatePackageJson(
case "name":
case "version":
case "devDependencies":
case "peerDependencies":
case "projects":
case "minimumTypeScriptVersion":
case "owners":
Expand Down
1 change: 1 addition & 0 deletions packages/header-parser/test/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ describe("validatePackageJson", () => {
const header = { ...pkgJson, nonNpm: false, libraryMajorVersion: 18, libraryMinorVersion: 0 };
delete (header as any).dependencies;
delete (header as any).devDependencies;
delete (header as any).peerDependencies;
delete (header as any).private;
delete (header as any).version;
it("requires private: true", () => {
Expand Down
3 changes: 3 additions & 0 deletions packages/mergebot/src/_tests/fixtures/70751/_downloads.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"express": 102459932
}
6 changes: 6 additions & 0 deletions packages/mergebot/src/_tests/fixtures/70751/_files.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"9856226df8d03bf135be670297bb5bf01f79625a:types/express/package.json": "{\n \"private\": true,\n \"name\": \"@types/express\",\n \"version\": \"5.0.9999\",\n \"projects\": [\n \"http://expressjs.com\"\n ],\n \"dependencies\": {\n \"@types/body-parser\": \"*\",\n \"@types/qs\": \"*\",\n \"@types/serve-static\": \"*\"\n },\n \"peerDependencies\": {\n \"@types/express-serve-static-core\": \"^5.0.0\"\n },\n \"devDependencies\": {\n \"@types/express\": \"workspace:.\",\n \"@types/node\": \"*\"\n },\n \"owners\": [\n {\n \"name\": \"Boris Yankov\",\n \"githubUsername\": \"borisyankov\"\n },\n {\n \"name\": \"China Medical University Hospital\",\n \"githubUsername\": \"CMUH\"\n },\n {\n \"name\": \"Puneet Arora\",\n \"githubUsername\": \"puneetar\"\n },\n {\n \"name\": \"Dylan Frankland\",\n \"githubUsername\": \"dfrankland\"\n }\n ]\n}\n",
"b6d1f2876fe51aed6de22ab5a293daf0e3b16ab2:types/express/package.json": "{\n \"private\": true,\n \"name\": \"@types/express\",\n \"version\": \"5.0.9999\",\n \"projects\": [\n \"http://expressjs.com\"\n ],\n \"dependencies\": {\n \"@types/body-parser\": \"*\",\n \"@types/express-serve-static-core\": \"^5.0.0\",\n \"@types/qs\": \"*\",\n \"@types/serve-static\": \"*\"\n },\n \"devDependencies\": {\n \"@types/express\": \"workspace:.\",\n \"@types/node\": \"*\"\n },\n \"owners\": [\n {\n \"name\": \"Boris Yankov\",\n \"githubUsername\": \"borisyankov\"\n },\n {\n \"name\": \"China Medical University Hospital\",\n \"githubUsername\": \"CMUH\"\n },\n {\n \"name\": \"Puneet Arora\",\n \"githubUsername\": \"puneetar\"\n },\n {\n \"name\": \"Dylan Frankland\",\n \"githubUsername\": \"dfrankland\"\n }\n ]\n}\n",
"9856226df8d03bf135be670297bb5bf01f79625a:types/express/v4/package.json": "{\n \"private\": true,\n \"name\": \"@types/express\",\n \"version\": \"4.17.9999\",\n \"projects\": [\n \"http://expressjs.com\"\n ],\n \"dependencies\": {\n \"@types/body-parser\": \"*\",\n \"@types/qs\": \"*\",\n \"@types/serve-static\": \"*\"\n },\n \"peerDependencies\": {\n \"@types/express-serve-static-core\": \"^4.17.33\"\n },\n \"devDependencies\": {\n \"@types/express\": \"workspace:.\",\n \"@types/node\": \"*\"\n },\n \"owners\": [\n {\n \"name\": \"Boris Yankov\",\n \"githubUsername\": \"borisyankov\"\n },\n {\n \"name\": \"China Medical University Hospital\",\n \"githubUsername\": \"CMUH\"\n },\n {\n \"name\": \"Puneet Arora\",\n \"githubUsername\": \"puneetar\"\n },\n {\n \"name\": \"Dylan Frankland\",\n \"githubUsername\": \"dfrankland\"\n }\n ]\n}\n",
"b6d1f2876fe51aed6de22ab5a293daf0e3b16ab2:types/express/v4/package.json": "{\n \"private\": true,\n \"name\": \"@types/express\",\n \"version\": \"4.17.9999\",\n \"projects\": [\n \"http://expressjs.com\"\n ],\n \"dependencies\": {\n \"@types/body-parser\": \"*\",\n \"@types/express-serve-static-core\": \"^4.17.33\",\n \"@types/qs\": \"*\",\n \"@types/serve-static\": \"*\"\n },\n \"devDependencies\": {\n \"@types/express\": \"workspace:.\",\n \"@types/node\": \"*\"\n },\n \"owners\": [\n {\n \"name\": \"Boris Yankov\",\n \"githubUsername\": \"borisyankov\"\n },\n {\n \"name\": \"China Medical University Hospital\",\n \"githubUsername\": \"CMUH\"\n },\n {\n \"name\": \"Puneet Arora\",\n \"githubUsername\": \"puneetar\"\n },\n {\n \"name\": \"Dylan Frankland\",\n \"githubUsername\": \"dfrankland\"\n }\n ]\n}\n"
}
149 changes: 149 additions & 0 deletions packages/mergebot/src/_tests/fixtures/70751/_response.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
{
"data": {
"repository": {
"id": "MDEwOlJlcG9zaXRvcnk2MDkzMzE2",
"pullRequest": {
"id": "PR_kwDOAFz6BM59K3Uu",
"title": "Use peer dep for express",
"createdAt": "2024-09-30T20:54:41Z",
"author": {
"login": "jakebailey",
"__typename": "User"
},
"authorAssociation": "MEMBER",
"baseRef": {
"name": "master",
"__typename": "Ref"
},
"labels": {
"nodes": [],
"__typename": "LabelConnection"
},
"isDraft": false,
"mergeable": "MERGEABLE",
"number": 70751,
"state": "OPEN",
"headRefOid": "9856226df8d03bf135be670297bb5bf01f79625a",
"changedFiles": 2,
"additions": 6,
"deletions": 2,
"commitIds": {
"nodes": [
{
"commit": {
"oid": "9856226df8d03bf135be670297bb5bf01f79625a",
"parents": {
"nodes": [
{
"oid": "b6d1f2876fe51aed6de22ab5a293daf0e3b16ab2",
"__typename": "Commit"
}
],
"__typename": "CommitConnection"
},
"__typename": "Commit"
},
"__typename": "PullRequestCommit"
}
],
"__typename": "PullRequestCommitConnection"
},
"timelineItems": {
"nodes": [],
"__typename": "PullRequestTimelineItemsConnection"
},
"reviews": {
"nodes": [],
"__typename": "PullRequestReviewConnection"
},
"commits": {
"totalCount": 1,
"nodes": [
{
"commit": {
"checkSuites": {
"nodes": [
{
"databaseId": 29037908492,
"app": {
"name": "GitHub Actions",
"__typename": "App"
},
"conclusion": null,
"resourcePath": "/DefinitelyTyped/DefinitelyTyped/commit/9856226df8d03bf135be670297bb5bf01f79625a/checks?check_suite_id=29037908492",
"status": "IN_PROGRESS",
"url": "https://github.com/DefinitelyTyped/DefinitelyTyped/commit/9856226df8d03bf135be670297bb5bf01f79625a/checks?check_suite_id=29037908492",
"checkRuns": {
"nodes": [
{
"title": null,
"__typename": "CheckRun"
}
],
"__typename": "CheckRunConnection"
},
"createdAt": "2024-09-30T20:54:45Z",
"workflowRun": {
"file": {
"path": ".github/workflows/CI.yml",
"__typename": "WorkflowRunFile"
},
"__typename": "WorkflowRun"
},
"__typename": "CheckSuite"
}
],
"__typename": "CheckSuiteConnection"
},
"status": null,
"authoredDate": "2024-09-30T20:54:04Z",
"committedDate": "2024-09-30T20:54:04Z",
"pushedDate": null,
"oid": "9856226df8d03bf135be670297bb5bf01f79625a",
"__typename": "Commit"
},
"__typename": "PullRequestCommit"
}
],
"__typename": "PullRequestCommitConnection"
},
"comments": {
"totalCount": 0,
"nodes": [],
"__typename": "IssueCommentConnection"
},
"files": {
"totalCount": 2,
"nodes": [
{
"path": "types/express/package.json",
"additions": 3,
"deletions": 1,
"__typename": "PullRequestChangedFile"
},
{
"path": "types/express/v4/package.json",
"additions": 3,
"deletions": 1,
"__typename": "PullRequestChangedFile"
}
],
"pageInfo": {
"hasNextPage": false,
"endCursor": "Mg",
"__typename": "PageInfo"
},
"__typename": "PullRequestChangedFileConnection"
},
"projectItems": {
"nodes": [],
"__typename": "ProjectV2ItemConnection"
},
"__typename": "PullRequest"
},
"__typename": "Repository"
}
},
"loading": false,
"networkStatus": 7
}
44 changes: 44 additions & 0 deletions packages/mergebot/src/_tests/fixtures/70751/derived.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
{
"type": "info",
"now": "2024-09-30T20:55:05.622Z",
"pr_number": 70751,
"author": "jakebailey",
"headCommitOid": "9856226df8d03bf135be670297bb5bf01f79625a",
"mergeBaseOid": "b6d1f2876fe51aed6de22ab5a293daf0e3b16ab2",
"lastPushDate": "2024-09-30T20:54:41.000Z",
"lastActivityDate": "2024-09-30T20:54:41.000Z",
"hasMergeConflict": false,
"isFirstContribution": false,
"tooManyFiles": false,
"hugeChange": false,
"popularityLevel": "Critical",
"pkgInfo": [
{
"name": "express",
"kind": "edit",
"files": [
{
"path": "types/express/package.json",
"kind": "package-meta",
"suspect": "not [the expected form](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-packagejson) and not moving towards it (check: `peerDependencies`)"
},
{
"path": "types/express/v4/package.json",
"kind": "package-meta",
"suspect": "not [the expected form](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-packagejson) and not moving towards it (check: `peerDependencies`)"
}
],
"owners": [
"borisyankov",
"CMUH",
"puneetar",
"dfrankland"
],
"addedOwners": [],
"deletedOwners": [],
"popularityLevel": "Critical"
}
],
"reviews": [],
"ciResult": "unknown"
}
54 changes: 54 additions & 0 deletions packages/mergebot/src/_tests/fixtures/70751/mutations.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
[
{
"mutation": "mutation ($input: AddCommentInput!) {\n addComment(input: $input) {\n __typename\n }\n}\n",
"variables": {
"input": {
"subjectId": "PR_kwDOAFz6BM59K3Uu",
"body": "@jakebailey Thank you for submitting this PR!\n\n***This is a live comment that I will keep updated.***\n\n## 1 package in this PR\n\n* `express` — [on npm](https://www.npmjs.com/package/express), [on unpkg](https://unpkg.com/browse/express@latest/)\n - Config files to check:\n - [`express/package.json`](https://github.com/DefinitelyTyped/DefinitelyTyped/pull/70751/files/9856226df8d03bf135be670297bb5bf01f79625a#diff-d8a8870b20691ea142d2c76db164e2732ff20bf2e1ba742a04d86e4a6adacc18): not [the expected form](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-packagejson) and not moving towards it (check: `peerDependencies`)\n - [`express/v4/package.json`](https://github.com/DefinitelyTyped/DefinitelyTyped/pull/70751/files/9856226df8d03bf135be670297bb5bf01f79625a#diff-6d96baa63d84c72911de2708233f00cd6bd6ef09dd3f91e9b4b412fa51cfd51b): not [the expected form](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-packagejson) and not moving towards it (check: `peerDependencies`)\n\n## Code Reviews\n\nBecause this is a widely-used package, a DT maintainer will need to review it before it can be merged.\n\nYou can test the changes of this PR [in the Playground](https://www.typescriptlang.org/play/?dtPR=70751&install-plugin=playground-dt-review).\n\n## Status\n\n * ✅ No merge conflicts\n * 🕐 Continuous integration tests are still running\n * 🕐 A DT maintainer needs to approve changes that affect module config files\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ...\n<!--typescript_bot_welcome-->"
}
}
},
{
"mutation": "mutation ($input: AddLabelsToLabelableInput!) {\n addLabelsToLabelable(input: $input) {\n __typename\n }\n}\n",
"variables": {
"input": {
"labelIds": [
"MDU6TGFiZWwxNjA4NjM0NDg0",
"MDU6TGFiZWwyMTU0ODE2NTQ5"
],
"labelableId": "PR_kwDOAFz6BM59K3Uu"
}
}
},
{
"mutation": "mutation ($input: AddProjectV2ItemByIdInput!) {\n addProjectV2ItemById(input: $input) {\n __typename\n item {\n id\n }\n }\n}\n",
"variables": {
"input": {
"contentId": "PR_kwDOAFz6BM59K3Uu",
"projectId": "PVT_kwDOADeBNM4AkH1q"
}
}
},
{
"mutation": "mutation ($input: UpdateProjectV2ItemFieldValueInput!) {\n updateProjectV2ItemFieldValue(input: $input) {\n __typename\n }\n}\n",
"variables": {
"input": {
"itemId": "TEST",
"projectId": "PVT_kwDOADeBNM4AkH1q",
"fieldId": "PVTSSF_lADOADeBNM4AkH1qzgcYOEM",
"value": {
"singleSelectOptionId": "98236657"
}
}
}
},
{
"mutation": "mutation ($input: AddCommentInput!) {\n addComment(input: $input) {\n __typename\n }\n}\n",
"variables": {
"input": {
"subjectId": "PR_kwDOAFz6BM59K3Uu",
"body": "🔔 @borisyankov @CMUH @puneetar @dfrankland — please [review this PR](https://github.com/DefinitelyTyped/DefinitelyTyped/pull/70751/files) in the next few days. Be sure to explicitly select **`Approve`** or **`Request Changes`** in the GitHub UI so I know what's going on.\n<!--typescript_bot_pinging-reviewers-->"
}
}
}
]
Loading
Loading