Skip to content

Commit d73dee6

Browse files
authored
feat: v6 (#401)
BREAKING CHANGE: remove `code` and `headers` properties that were previously deprecated BREAKING CHANGE: switch package to ESM instead of CommonJS
1 parent d15db41 commit d73dee6

File tree

7 files changed

+49
-127
lines changed

7 files changed

+49
-127
lines changed

package-lock.json

Lines changed: 8 additions & 20 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44
"publishConfig": {
55
"access": "public"
66
},
7+
"type": "module",
78
"description": "Error class for Octokit request errors",
89
"scripts": {
910
"build": "node scripts/build.mjs && tsc -p tsconfig.json",
1011
"lint": "prettier --check '{src,test}/**/*' README.md package.json",
1112
"lint:fix": "prettier --write '{src,test}/**/*' README.md package.json",
1213
"pretest": "npm run -s lint",
13-
"test": "jest --coverage"
14+
"test": "NODE_OPTIONS=\"$NODE_OPTIONS --experimental-vm-modules\" npx jest --coverage"
1415
},
1516
"repository": "github:octokit/request-error.js",
1617
"keywords": [
@@ -22,15 +23,12 @@
2223
"author": "Gregor Martynus (https://github.com/gr2m)",
2324
"license": "MIT",
2425
"dependencies": {
25-
"@octokit/types": "^12.0.0",
26-
"deprecation": "^2.0.0",
27-
"once": "^1.4.0"
26+
"@octokit/types": "^12.0.0"
2827
},
2928
"devDependencies": {
30-
"@octokit/tsconfig": "^2.0.0",
29+
"@octokit/tsconfig": "^3.0.0",
3130
"@types/jest": "^29.0.0",
3231
"@types/node": "^20.0.0",
33-
"@types/once": "^1.4.0",
3432
"esbuild": "^0.20.0",
3533
"glob": "^10.2.6",
3634
"jest": "^29.0.0",
@@ -39,14 +37,21 @@
3937
"typescript": "^5.0.0"
4038
},
4139
"jest": {
40+
"extensionsToTreatAsEsm": [
41+
".ts"
42+
],
4243
"transform": {
4344
"^.+\\.(ts|tsx)$": [
4445
"ts-jest",
4546
{
46-
"tsconfig": "test/tsconfig.test.json"
47+
"tsconfig": "test/tsconfig.test.json",
48+
"useESM": true
4749
}
4850
]
4951
},
52+
"moduleNameMapper": {
53+
"^(\\.{1,2}/.*)\\.js$": "$1"
54+
},
5055
"coverageThreshold": {
5156
"global": {
5257
"statements": 100,

scripts/build.mjs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ async function main() {
4343
bundle: true,
4444
platform: "node",
4545
target: "node18",
46-
format: "cjs",
46+
format: "esm",
4747
...sharedOptions,
4848
}),
4949
// Build an ESM browser bundle
@@ -74,10 +74,18 @@ async function main() {
7474
{
7575
...pkg,
7676
files: ["dist-*/**", "bin/**"],
77-
main: "dist-node/index.js",
78-
browser: "dist-web/index.js",
79-
types: "dist-types/index.d.ts",
80-
module: "dist-src/index.js",
77+
exports: {
78+
".": {
79+
node: {
80+
types: "./dist-types/index.d.ts",
81+
import: "./dist-node/index.js",
82+
},
83+
browser: {
84+
types: "./dist-types/index.d.ts",
85+
import: "./dist-web/index.js",
86+
}
87+
}
88+
},
8189
sideEffects: false,
8290
unpkg: "dist-web/index.js",
8391
},

src/index.ts

Lines changed: 2 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,5 @@
1-
import { Deprecation } from "deprecation";
2-
import once from "once";
3-
const logOnceCode = once((deprecation: any) => console.warn(deprecation));
4-
const logOnceHeaders = once((deprecation: any) => console.warn(deprecation));
5-
6-
import type {
7-
RequestOptions,
8-
ResponseHeaders,
9-
OctokitResponse,
10-
} from "@octokit/types";
11-
import type { RequestErrorOptions } from "./types";
1+
import type { RequestOptions, OctokitResponse } from "@octokit/types";
2+
import type { RequestErrorOptions } from "./types.js";
123

134
/**
145
* Error with extra properties to help with debugging
@@ -21,25 +12,11 @@ export class RequestError extends Error {
2112
*/
2213
status: number;
2314

24-
/**
25-
* http status code
26-
*
27-
* @deprecated `error.code` is deprecated in favor of `error.status`
28-
*/
29-
code!: number;
30-
3115
/**
3216
* Request options that lead to the error.
3317
*/
3418
request: RequestOptions;
3519

36-
/**
37-
* error response headers
38-
*
39-
* @deprecated `error.headers` is deprecated in favor of `error.response.headers`
40-
*/
41-
headers!: ResponseHeaders;
42-
4320
/**
4421
* Response object if a response was received
4522
*/
@@ -60,15 +37,9 @@ export class RequestError extends Error {
6037

6138
this.name = "HttpError";
6239
this.status = statusCode;
63-
let headers: ResponseHeaders;
64-
65-
if ("headers" in options && typeof options.headers !== "undefined") {
66-
headers = options.headers;
67-
}
6840

6941
if ("response" in options) {
7042
this.response = options.response;
71-
headers = options.response.headers;
7243
}
7344

7445
// redact request credentials without mutating original request options
@@ -91,27 +62,5 @@ export class RequestError extends Error {
9162
.replace(/\baccess_token=\w+/g, "access_token=[REDACTED]");
9263

9364
this.request = requestCopy;
94-
95-
// deprecations
96-
Object.defineProperty(this, "code", {
97-
get() {
98-
logOnceCode(
99-
new Deprecation(
100-
"[@octokit/request-error] `error.code` is deprecated, use `error.status`.",
101-
),
102-
);
103-
return statusCode;
104-
},
105-
});
106-
Object.defineProperty(this, "headers", {
107-
get() {
108-
logOnceHeaders(
109-
new Deprecation(
110-
"[@octokit/request-error] `error.headers` is deprecated, use `error.response.headers`.",
111-
),
112-
);
113-
return headers || {};
114-
},
115-
});
11665
}
11766
}

src/types.ts

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,6 @@
1-
import type {
2-
RequestOptions,
3-
ResponseHeaders,
4-
OctokitResponse,
5-
} from "@octokit/types";
1+
import type { RequestOptions, OctokitResponse } from "@octokit/types";
62

7-
export type RequestErrorOptions =
8-
| {
9-
/** @deprecated set `response` instead */
10-
headers?: ResponseHeaders;
11-
request: RequestOptions;
12-
}
13-
| {
14-
response: OctokitResponse<unknown>;
15-
request: RequestOptions;
16-
};
3+
export type RequestErrorOptions = {
4+
response?: OctokitResponse<unknown>;
5+
request: RequestOptions;
6+
};

test/request-error.test.ts

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
1-
import { RequestError } from "../src";
2-
import type { RequestErrorOptions } from "../src/types";
1+
import { RequestError } from "../src/index.js";
2+
import type { RequestErrorOptions } from "../src/types.js";
33

44
const mockOptions: RequestErrorOptions = {
55
request: {
66
method: "GET",
77
url: "https://api.github.com/",
88
headers: {},
99
},
10+
response: {
11+
headers: {},
12+
status: 200,
13+
url: "https://api.github.com/",
14+
data: {},
15+
},
1016
};
1117

1218
describe("RequestError", () => {
@@ -130,27 +136,4 @@ describe("RequestError", () => {
130136
url: "https://api.github.com/",
131137
});
132138
});
133-
134-
test("deprecates .code", () => {
135-
global.console.warn = jest.fn();
136-
expect(new RequestError("test", 123, mockOptions).code).toEqual(123);
137-
expect(new RequestError("test", 404, mockOptions).code).toEqual(404);
138-
expect(console.warn).toHaveBeenCalledTimes(1);
139-
});
140-
141-
test("deprecates .headers", () => {
142-
global.console.warn = jest.fn();
143-
expect(new RequestError("test", 123, mockOptions).headers).toStrictEqual(
144-
{},
145-
);
146-
expect(
147-
new RequestError("test", 404, { ...mockOptions, headers: { foo: "bar" } })
148-
.headers,
149-
).toStrictEqual({ foo: "bar" });
150-
expect(
151-
new RequestError("test", 404, { ...mockOptions, headers: undefined })
152-
.headers,
153-
).toStrictEqual({});
154-
expect(console.warn).toHaveBeenCalledTimes(1);
155-
});
156139
});

test/tsconfig.test.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
"extends": "../tsconfig.json",
33
"compilerOptions": {
44
"emitDeclarationOnly": false,
5-
"noEmit": true,
6-
"verbatimModuleSyntax": false
5+
"noEmit": true
76
},
87
"include": ["src/**/*"]
98
}

0 commit comments

Comments
 (0)