Skip to content

Commit b48e962

Browse files
authored
feat: GitHubProjectNotFoundError (#138)
closes #137
1 parent 1f3479e commit b48e962

File tree

9 files changed

+128
-247
lines changed

9 files changed

+128
-247
lines changed

README.md

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1040,6 +1040,35 @@ try {
10401040
}
10411041
```
10421042

1043+
#### `GitHubProjectNotFoundError`
1044+
1045+
Thrown when a project cannot be found based on the `owner` and `number` passed to the `Project` constructor. The error is also thrown if the project exists but cannot be found based on authentication.
1046+
1047+
```js
1048+
import Project, { GitHubProjectNotFoundError } from "github-project";
1049+
1050+
try {
1051+
await myScript(new Project(options));
1052+
} catch (error) {
1053+
if (error instanceof GitHubProjectNotFoundError) {
1054+
analytics.track("GitHubProjectNotFoundError", {
1055+
owner: error.details.owner,
1056+
number: error.details.number,
1057+
});
1058+
1059+
myLogger.error(
1060+
{
1061+
code: error.code,
1062+
details: error.details,
1063+
},
1064+
error.toHumanMessage(),
1065+
);
1066+
}
1067+
1068+
throw error;
1069+
}
1070+
```
1071+
10431072
<table>
10441073
<thead align=left>
10451074
<tr>
@@ -1062,7 +1091,7 @@ try {
10621091
<td>
10631092
<code>constant</code>
10641093
</td>
1065-
<td><code>GitHubProjectUnknownFieldError</code></td>
1094+
<td><code>GitHubProjectNotFoundError</code></td>
10661095
</tr>
10671096
<tr>
10681097
<th>

api/errors.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,17 @@ export class GitHubProjectError extends Error {
1313
/* c8 ignore stop */
1414
}
1515

16+
export class GitHubProjectNotFoundError extends GitHubProjectError {
17+
constructor(details) {
18+
super("Project cannot be found");
19+
this.details = details;
20+
}
21+
22+
toHumanMessage() {
23+
return `Project #${this.details.number} could not be found for @${this.details.owner}`;
24+
}
25+
}
26+
1627
export class GitHubProjectUnknownFieldError extends GitHubProjectError {
1728
constructor(details) {
1829
super("Project field cannot be found");

api/lib/get-state-with-project-fields.js

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import { getProjectCoreDataQuery } from "./queries.js";
44
import { projectFieldsNodesToFieldsMap } from "./project-fields-nodes-to-fields-map.js";
5+
import { GitHubProjectNotFoundError } from "../../index.js";
56

67
/**
78
* This method assures that the project fields are loaded. It returns the new
@@ -17,10 +18,7 @@ export async function getStateWithProjectFields(project, state) {
1718
return state;
1819
}
1920

20-
const response = await project.octokit.graphql(getProjectCoreDataQuery, {
21-
owner: project.owner,
22-
number: project.number,
23-
});
21+
const response = await getProjectCoreData(project);
2422

2523
const {
2624
userOrOrganization: { projectV2 },
@@ -45,3 +43,25 @@ export async function getStateWithProjectFields(project, state) {
4543
fields,
4644
});
4745
}
46+
47+
/**
48+
*
49+
* @param {import("../..").default} project
50+
* @returns {Promise<any>}
51+
*/
52+
async function getProjectCoreData(project) {
53+
try {
54+
return await project.octokit.graphql(getProjectCoreDataQuery, {
55+
owner: project.owner,
56+
number: project.number,
57+
});
58+
} catch (error) {
59+
/* c8 ignore next */
60+
if (error?.response?.errors[0]?.type !== "NOT_FOUND") throw error;
61+
62+
throw new GitHubProjectNotFoundError({
63+
owner: project.owner,
64+
number: project.number,
65+
});
66+
}
67+
}

index.d.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,19 @@ export declare class GitHubProjectError extends Error {
311311
toHumanMessage(): string;
312312
}
313313

314+
type GitHubProjectNotFoundErrorDetails = {
315+
owner: string;
316+
number: number;
317+
};
318+
319+
export declare class GitHubProjectNotFoundError<
320+
TDetails extends GitHubProjectNotFoundErrorDetails,
321+
> extends GitHubProjectError {
322+
name: "GitHubProjectNotFoundError";
323+
details: TDetails;
324+
constructor(details: TDetails);
325+
}
326+
314327
type GitHubProjectUnknownFieldErrorDetails = {
315328
projectFieldNames: string[];
316329
userFieldName: string;

index.test-d.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ import { expectType, expectNotType } from "tsd";
22
import { Octokit } from "@octokit/core";
33
import GitHubProject, {
44
GitHubProjectError,
5+
GitHubProjectNotFoundError,
56
GitHubProjectUnknownFieldError,
67
GitHubProjectUnknownFieldOptionError,
8+
GitHubProjectUpdateReadOnlyFieldError,
79
} from "./index";
810

911
export function smokeTest() {
@@ -655,6 +657,18 @@ export function testGitHubProjectError() {
655657
expectType<string>(error.toHumanMessage());
656658
}
657659

660+
export function testGitHubProjectNotFoundError() {
661+
const details = {
662+
owner: "owner",
663+
number: 1,
664+
};
665+
const error = new GitHubProjectNotFoundError(details);
666+
667+
expectType<"GitHubProjectNotFoundError">(error.name);
668+
expectType<typeof details>(error.details);
669+
expectType<string>(error.toHumanMessage());
670+
}
671+
658672
export function testGitHubProjectUnknownFieldError() {
659673
const details = {
660674
projectFieldNames: ["one", "two"],
@@ -688,3 +702,21 @@ export function testGitHubProjectUnknownFieldOptionError() {
688702
expectType<typeof details>(error.details);
689703
expectType<string>(error.toHumanMessage());
690704
}
705+
706+
export function testGitHubProjectUpdateReadOnlyFieldError() {
707+
const details = {
708+
fields: [
709+
{
710+
id: "field id",
711+
name: "field name",
712+
userName: "user name",
713+
userValue: "user value",
714+
},
715+
],
716+
};
717+
const error = new GitHubProjectUpdateReadOnlyFieldError(details);
718+
719+
expectType<"GitHubProjectUpdateReadOnlyFieldError">(error.name);
720+
expectType<typeof details>(error.details);
721+
expectType<string>(error.toHumanMessage());
722+
}

test/recorded/api.getProperties-project-not-found/test.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ export function test(defaultTestProject) {
1515
() => {
1616
throw new Error("Should not resolve");
1717
},
18-
(error) => error
18+
(error) => ({
19+
error,
20+
humanMessage: error.toHumanMessage(),
21+
})
1922
);
2023
}

test/recorded/getInstance-project-not-found/test.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ export function test(defaultTestProject) {
1313
() => {
1414
throw new Error("Should not resolve");
1515
},
16-
(error) => error
16+
(error) => ({
17+
error,
18+
humanMessage: error.toHumanMessage(),
19+
})
1720
);
1821
}

0 commit comments

Comments
 (0)