Skip to content

Commit

Permalink
feat: GitHubProjectNotFoundError (#138)
Browse files Browse the repository at this point in the history
closes #137
  • Loading branch information
gr2m committed Oct 5, 2023
1 parent 1f3479e commit b48e962
Show file tree
Hide file tree
Showing 9 changed files with 128 additions and 247 deletions.
31 changes: 30 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1040,6 +1040,35 @@ try {
}
```

#### `GitHubProjectNotFoundError`

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.

```js
import Project, { GitHubProjectNotFoundError } from "github-project";

try {
await myScript(new Project(options));
} catch (error) {
if (error instanceof GitHubProjectNotFoundError) {
analytics.track("GitHubProjectNotFoundError", {
owner: error.details.owner,
number: error.details.number,
});

myLogger.error(
{
code: error.code,
details: error.details,
},
error.toHumanMessage(),
);
}

throw error;
}
```

<table>
<thead align=left>
<tr>
Expand All @@ -1062,7 +1091,7 @@ try {
<td>
<code>constant</code>
</td>
<td><code>GitHubProjectUnknownFieldError</code></td>
<td><code>GitHubProjectNotFoundError</code></td>
</tr>
<tr>
<th>
Expand Down
11 changes: 11 additions & 0 deletions api/errors.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,17 @@ export class GitHubProjectError extends Error {
/* c8 ignore stop */
}

export class GitHubProjectNotFoundError extends GitHubProjectError {
constructor(details) {
super("Project cannot be found");
this.details = details;
}

toHumanMessage() {
return `Project #${this.details.number} could not be found for @${this.details.owner}`;
}
}

export class GitHubProjectUnknownFieldError extends GitHubProjectError {
constructor(details) {
super("Project field cannot be found");
Expand Down
28 changes: 24 additions & 4 deletions api/lib/get-state-with-project-fields.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

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

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

const response = await project.octokit.graphql(getProjectCoreDataQuery, {
owner: project.owner,
number: project.number,
});
const response = await getProjectCoreData(project);

const {
userOrOrganization: { projectV2 },
Expand All @@ -45,3 +43,25 @@ export async function getStateWithProjectFields(project, state) {
fields,
});
}

/**
*
* @param {import("../..").default} project
* @returns {Promise<any>}
*/
async function getProjectCoreData(project) {
try {
return await project.octokit.graphql(getProjectCoreDataQuery, {
owner: project.owner,
number: project.number,
});
} catch (error) {
/* c8 ignore next */
if (error?.response?.errors[0]?.type !== "NOT_FOUND") throw error;

throw new GitHubProjectNotFoundError({
owner: project.owner,
number: project.number,
});
}
}
13 changes: 13 additions & 0 deletions index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,19 @@ export declare class GitHubProjectError extends Error {
toHumanMessage(): string;
}

type GitHubProjectNotFoundErrorDetails = {
owner: string;
number: number;
};

export declare class GitHubProjectNotFoundError<
TDetails extends GitHubProjectNotFoundErrorDetails,
> extends GitHubProjectError {
name: "GitHubProjectNotFoundError";
details: TDetails;
constructor(details: TDetails);
}

type GitHubProjectUnknownFieldErrorDetails = {
projectFieldNames: string[];
userFieldName: string;
Expand Down
32 changes: 32 additions & 0 deletions index.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ import { expectType, expectNotType } from "tsd";
import { Octokit } from "@octokit/core";
import GitHubProject, {
GitHubProjectError,
GitHubProjectNotFoundError,
GitHubProjectUnknownFieldError,
GitHubProjectUnknownFieldOptionError,
GitHubProjectUpdateReadOnlyFieldError,
} from "./index";

export function smokeTest() {
Expand Down Expand Up @@ -655,6 +657,18 @@ export function testGitHubProjectError() {
expectType<string>(error.toHumanMessage());
}

export function testGitHubProjectNotFoundError() {
const details = {
owner: "owner",
number: 1,
};
const error = new GitHubProjectNotFoundError(details);

expectType<"GitHubProjectNotFoundError">(error.name);
expectType<typeof details>(error.details);
expectType<string>(error.toHumanMessage());
}

export function testGitHubProjectUnknownFieldError() {
const details = {
projectFieldNames: ["one", "two"],
Expand Down Expand Up @@ -688,3 +702,21 @@ export function testGitHubProjectUnknownFieldOptionError() {
expectType<typeof details>(error.details);
expectType<string>(error.toHumanMessage());
}

export function testGitHubProjectUpdateReadOnlyFieldError() {
const details = {
fields: [
{
id: "field id",
name: "field name",
userName: "user name",
userValue: "user value",
},
],
};
const error = new GitHubProjectUpdateReadOnlyFieldError(details);

expectType<"GitHubProjectUpdateReadOnlyFieldError">(error.name);
expectType<typeof details>(error.details);
expectType<string>(error.toHumanMessage());
}
5 changes: 4 additions & 1 deletion test/recorded/api.getProperties-project-not-found/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ export function test(defaultTestProject) {
() => {
throw new Error("Should not resolve");
},
(error) => error
(error) => ({
error,
humanMessage: error.toHumanMessage(),
})
);
}
5 changes: 4 additions & 1 deletion test/recorded/getInstance-project-not-found/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ export function test(defaultTestProject) {
() => {
throw new Error("Should not resolve");
},
(error) => error
(error) => ({
error,
humanMessage: error.toHumanMessage(),
})
);
}

0 comments on commit b48e962

Please sign in to comment.