@octokit-next/request
Advanced tools
Comparing version 2.3.0 to 2.3.1
import { endpoint } from "@octokit-next/endpoint"; | ||
import { getUserAgent } from "universal-user-agent"; | ||
import { VERSION } from "./version.js"; | ||
import withDefaults from "./with-defaults.js"; | ||
import { VERSION } from "./lib/version.js"; | ||
export { VERSION } from "./lib/version.js"; | ||
import withDefaults from "./lib/with-defaults.js"; | ||
export const request = withDefaults(endpoint, { | ||
@@ -8,0 +10,0 @@ headers: { |
{ | ||
"name": "@octokit-next/request", | ||
"version": "2.3.0", | ||
"version": "2.3.1", | ||
"publishConfig": { | ||
@@ -26,7 +26,7 @@ "access": "public" | ||
"test": "npm run test:code && npm run test:types", | ||
"test:code": "c8 uvu test", | ||
"test:code": "c8 ava test", | ||
"test:types": "tsd" | ||
}, | ||
"dependencies": { | ||
"@octokit-next/types": "2.3.0", | ||
"@octokit-next/types": "2.3.1", | ||
"is-plain-object": "^5.0.0", | ||
@@ -33,0 +33,0 @@ "type-fest": "^3.0.0", |
@@ -1,3 +0,2 @@ | ||
import { suite } from "uvu"; | ||
import * as assert from "uvu/assert"; | ||
import test from "ava"; | ||
import fetchMock from "fetch-mock"; | ||
@@ -7,8 +6,5 @@ | ||
const test = suite("request.defaults()"); | ||
test("is a function", () => { | ||
assert.instance( | ||
request.defaults, | ||
Function, | ||
test("request.defaults() is a function", (t) => { | ||
t.assert( | ||
request.defaults instanceof Function, | ||
"request.defaults() is a function" | ||
@@ -18,3 +14,3 @@ ); | ||
test("README example", () => { | ||
test("request.defaults() README example", (t) => { | ||
const mock = fetchMock | ||
@@ -48,7 +44,7 @@ .sandbox() | ||
return myRequest(`GET /orgs/{org}/repos`).then((response) => { | ||
assert.equal(response.status, 200); | ||
t.deepEqual(response.status, 200); | ||
}); | ||
}); | ||
test("repeated defaults", () => { | ||
test("request.defaults() repeated defaults", (t) => { | ||
const mock = fetchMock | ||
@@ -90,6 +86,4 @@ .sandbox() | ||
return myProjectRequestWithAuth(`GET /orgs/{org}/repos`).then((response) => { | ||
assert.equal(response.status, 200); | ||
t.deepEqual(response.status, 200); | ||
}); | ||
}); | ||
test.run(); |
@@ -5,4 +5,3 @@ import fs from "node:fs"; | ||
import { suite } from "uvu"; | ||
import * as assert from "uvu/assert"; | ||
import test from "ava"; | ||
import { getUserAgent } from "universal-user-agent"; | ||
@@ -17,9 +16,7 @@ import fetchMock from "fetch-mock"; | ||
const test = suite("request.request()"); | ||
test("is a function", () => { | ||
assert.instance(request, Function); | ||
test("request.request() is a function", (t) => { | ||
t.assert(request instanceof Function); | ||
}); | ||
test("README example", () => { | ||
test("request.request() README example", (t) => { | ||
const mock = fetchMock | ||
@@ -45,7 +42,7 @@ .sandbox() | ||
}).then((response) => { | ||
assert.equal(response.data, []); | ||
t.deepEqual(response.data, []); | ||
}); | ||
}); | ||
test("README example alternative", () => { | ||
test("request.request() README example alternative", (t) => { | ||
const mock = fetchMock | ||
@@ -67,3 +64,3 @@ .sandbox() | ||
}).then((response) => { | ||
assert.equal(response.data, []); | ||
t.deepEqual(response.data, []); | ||
}); | ||
@@ -73,3 +70,3 @@ }); | ||
// TODO: until we migrate @octokit/auth-app to ESM, I'll just use a dummy auth strategy instead | ||
test("README authentication example", async () => { | ||
test("request.request() README authentication example", async (t) => { | ||
const mock = fetchMock.sandbox().mock( | ||
@@ -105,6 +102,6 @@ "https://api.github.com/test", | ||
await requestWithAuth("GET /test"); | ||
assert.ok(mock.done()); | ||
t.assert(mock.done()); | ||
}); | ||
// test("README authentication example", async () => { | ||
// test("request.request() README authentication example", async (t) => { | ||
// const clock = lolex.install({ | ||
@@ -197,7 +194,7 @@ // now: 0, | ||
// }); | ||
// assert.ok(mock.done()) | ||
// t.assert(mock.done()) | ||
// clock.reset(); | ||
// }); | ||
test("Request with body", () => { | ||
test("request.request() Request with body", async (t) => { | ||
const mock = fetchMock | ||
@@ -211,3 +208,3 @@ .sandbox() | ||
request("POST /repos/{owner}/{repo}/issues", { | ||
const response = await request("POST /repos/{owner}/{repo}/issues", { | ||
owner: "octocat", | ||
@@ -226,8 +223,8 @@ repo: "hello-world", | ||
}, | ||
}).then((response) => { | ||
assert.equal(response.status, 201); | ||
}); | ||
t.deepEqual(response.status, 201); | ||
}); | ||
test("Put without request body", () => { | ||
test("request.request() Put without request body", async (t) => { | ||
const mock = fetchMock | ||
@@ -239,3 +236,3 @@ .sandbox() | ||
request("PUT /user/starred/{owner}/{repo}", { | ||
const response = await request("PUT /user/starred/{owner}/{repo}", { | ||
headers: { | ||
@@ -249,8 +246,8 @@ authorization: `token 0000000000000000000000000000000000000001`, | ||
}, | ||
}).then((response) => { | ||
assert.equal(response.status, 204); | ||
}); | ||
t.deepEqual(response.status, 204); | ||
}); | ||
test("HEAD requests (octokit/rest.js#841)", () => { | ||
test("request.request() HEAD requests (octokit/rest.js#841)", async (t) => { | ||
const mock = fetchMock | ||
@@ -282,19 +279,17 @@ .sandbox() | ||
request(`HEAD /repos/{owner}/{repo}/pulls/{number}`, options) | ||
.then((response) => { | ||
assert.equal(response.status, 200); | ||
const response = await request( | ||
`HEAD /repos/{owner}/{repo}/pulls/{number}`, | ||
options | ||
); | ||
t.deepEqual(response.status, 200); | ||
return request( | ||
`HEAD /repos/{owner}/{repo}/pulls/{number}`, | ||
Object.assign(options, { number: 2 }) | ||
); | ||
}) | ||
.then(() => { | ||
throw new Error("should not resolve"); | ||
}) | ||
.catch((error) => { | ||
assert.equal(error.status, 404); | ||
}); | ||
try { | ||
await request( | ||
`HEAD /repos/{owner}/{repo}/pulls/{number}`, | ||
Object.assign(options, { number: 2 }) | ||
); | ||
t.fail("should not resolve"); | ||
} catch (error) { | ||
t.deepEqual(error.status, 404); | ||
} | ||
}); | ||
@@ -330,7 +325,7 @@ | ||
}).then((response) => { | ||
assert.equal(response.data.length, 172); | ||
t.deepEqual(response.data.length, 172); | ||
}); | ||
}); | ||
test("304 etag", () => { | ||
test("request.request() 304 etag", (t) => { | ||
const mock = fetchMock.sandbox().get((url, { headers }) => { | ||
@@ -355,7 +350,7 @@ return ( | ||
.catch((error) => { | ||
assert.equal(error.status, 304); | ||
t.deepEqual(error.status, 304); | ||
}); | ||
}); | ||
test("304 last-modified", () => { | ||
test("request.request() 304 last-modified", (t) => { | ||
const mock = fetchMock.sandbox().get((url, { headers }) => { | ||
@@ -381,7 +376,7 @@ return ( | ||
.catch((error) => { | ||
assert.equal(error.status, 304); | ||
t.deepEqual(error.status, 304); | ||
}); | ||
}); | ||
test("Not found", () => { | ||
test("request.request() Not found", (t) => { | ||
const mock = fetchMock.sandbox().get("path:/orgs/nope", 404); | ||
@@ -400,9 +395,9 @@ | ||
.catch((error) => { | ||
assert.equal(error.status, 404); | ||
assert.equal(error.request.method, "GET"); | ||
assert.equal(error.request.url, "https://api.github.com/orgs/nope"); | ||
t.deepEqual(error.status, 404); | ||
t.deepEqual(error.request.method, "GET"); | ||
t.deepEqual(error.request.url, "https://api.github.com/orgs/nope"); | ||
}); | ||
}); | ||
test("non-JSON response", () => { | ||
test("request.request() non-JSON response", (t) => { | ||
const mock = fetchMock | ||
@@ -430,7 +425,7 @@ .sandbox() | ||
}).then((response) => { | ||
assert.equal(response.data, "# hello-world"); | ||
t.deepEqual(response.data, "# hello-world"); | ||
}); | ||
}); | ||
test("Request error", () => { | ||
test("request.request() Request error", (t) => { | ||
// port: 8 // officially unassigned port. See https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers | ||
@@ -443,7 +438,7 @@ return request("GET https://127.0.0.1:8/") | ||
.catch((error) => { | ||
assert.equal(error.status, 500); | ||
t.deepEqual(error.status, 500); | ||
}); | ||
}); | ||
test("custom user-agent", () => { | ||
test("request.request() custom user-agent", async (t) => { | ||
const mock = fetchMock | ||
@@ -456,16 +451,18 @@ .sandbox() | ||
return request("GET /", { | ||
headers: { | ||
"user-agent": "funky boom boom pow", | ||
}, | ||
request: { | ||
fetch: mock, | ||
}, | ||
}); | ||
await t.notThrowsAsync(() => | ||
request("GET /", { | ||
headers: { | ||
"user-agent": "funky boom boom pow", | ||
}, | ||
request: { | ||
fetch: mock, | ||
}, | ||
}) | ||
); | ||
}); | ||
test("passes node-fetch options to fetch only", () => { | ||
test("request.request() passes node-fetch options to fetch only", (t) => { | ||
const mock = (url, options) => { | ||
assert.equal(url, "https://api.github.com/"); | ||
assert.equal(options.timeout, 100); | ||
t.deepEqual(url, "https://api.github.com/"); | ||
t.deepEqual(options.timeout, 100); | ||
return Promise.reject(new Error("ok")); | ||
@@ -491,3 +488,3 @@ }; | ||
test("422 error with details", () => { | ||
test("request.request() 422 error with details", (t) => { | ||
const mock = fetchMock | ||
@@ -522,9 +519,9 @@ .sandbox() | ||
}).catch((error) => { | ||
assert.equal(error.status, 422); | ||
assert.equal(error.response.headers["x-foo"], "bar"); | ||
assert.equal( | ||
t.deepEqual(error.status, 422); | ||
t.deepEqual(error.response.headers["x-foo"], "bar"); | ||
t.deepEqual( | ||
error.response.data.documentation_url, | ||
"https://developer.github.com/v3/issues/labels/#create-a-label" | ||
); | ||
assert.equal(error.response.data.errors, [ | ||
t.deepEqual(error.response.data.errors, [ | ||
{ resource: "Label", code: "invalid", field: "color" }, | ||
@@ -535,3 +532,3 @@ ]); | ||
test("redacts credentials from error.request.headers.authorization", () => { | ||
test("request.request() redacts credentials from error.request.headers.authorization", (t) => { | ||
const mock = fetchMock.sandbox().get("https://api.github.com/", { | ||
@@ -549,7 +546,7 @@ status: 500, | ||
}).catch((error) => { | ||
assert.equal(error.request.headers.authorization, "token [REDACTED]"); | ||
t.deepEqual(error.request.headers.authorization, "token [REDACTED]"); | ||
}); | ||
}); | ||
test("redacts credentials from error.request.url", () => { | ||
test("request.request() redacts credentials from error.request.url", (t) => { | ||
const mock = fetchMock | ||
@@ -568,3 +565,3 @@ .sandbox() | ||
}).catch((error) => { | ||
assert.equal( | ||
t.deepEqual( | ||
error.request.url, | ||
@@ -575,3 +572,3 @@ "https://api.github.com/?client_id=123&client_secret=[REDACTED]" | ||
}); | ||
test("Just URL", () => { | ||
test("request.request() Just URL", (t) => { | ||
const mock = fetchMock.sandbox().get("path:/", 200); | ||
@@ -584,7 +581,7 @@ | ||
}).then(({ status }) => { | ||
assert.equal(status, 200); | ||
t.deepEqual(status, 200); | ||
}); | ||
}); | ||
test("options.request.signal is passed as option to fetch", function () { | ||
test("request.request() options.request.signal is passed as option to fetch", (t) => { | ||
return request("/", { | ||
@@ -604,7 +601,7 @@ request: { | ||
// Node versions. | ||
assert.match(error.message, /AbortSignal/); | ||
t.regex(error.message, /AbortSignal/); | ||
}); | ||
}); | ||
test("options.request.fetch", function () { | ||
test("request.request() options.request.fetch", (t) => { | ||
return request("/", { | ||
@@ -625,7 +622,7 @@ request: { | ||
}).then((result) => { | ||
assert.equal(result.data, "funk"); | ||
t.deepEqual(result.data, "funk"); | ||
}); | ||
}); | ||
test("options.request.hook", function () { | ||
test("request.request() options.request.hook", (t) => { | ||
const mock = fetchMock.sandbox().mock( | ||
@@ -642,5 +639,11 @@ "https://api.github.com/foo", | ||
const hook = (request, options) => { | ||
assert.instance(request.endpoint, Function); | ||
assert.instance(request.defaults, Function); | ||
assert.equal(options, { | ||
t.assert( | ||
request.endpoint instanceof Function, | ||
"request.endpoint, Function" | ||
); | ||
t.assert( | ||
request.defaults instanceof Function, | ||
"request.defaults, Function" | ||
); | ||
t.deepEqual(options, { | ||
baseUrl: "https://api.github.com", | ||
@@ -679,7 +682,7 @@ headers: { | ||
}).then((result) => { | ||
assert.equal(result.data, { ok: true }); | ||
t.deepEqual(result.data, { ok: true }); | ||
}); | ||
}); | ||
test("options.mediaType.format", function () { | ||
test("request.request() options.mediaType.format", (t) => { | ||
const mock = fetchMock | ||
@@ -709,7 +712,7 @@ .sandbox() | ||
}).then((response) => { | ||
assert.equal(response.data, "ok"); | ||
t.deepEqual(response.data, "ok"); | ||
}); | ||
}); | ||
test("options.mediaType.previews", function () { | ||
test("request.request() options.mediaType.previews", (t) => { | ||
const mock = fetchMock | ||
@@ -740,7 +743,7 @@ .sandbox() | ||
}).then((response) => { | ||
assert.equal(response.data, "ok"); | ||
t.deepEqual(response.data, "ok"); | ||
}); | ||
}); | ||
test("octokit/octokit.js#1497", function () { | ||
test("request.request() octokit/octokit.js#1497", (t) => { | ||
const mock = fetchMock.sandbox().mock( | ||
@@ -795,3 +798,3 @@ "https://request-errors-test.com/repos/gr2m/sandbox/branches/gr2m-patch-1/protection", | ||
.catch((error) => { | ||
assert.ok( | ||
t.assert( | ||
"message" in error, | ||
@@ -803,3 +806,3 @@ `Validation failed: "Only organization repositories can have users and team restrictions", {"resource":"Search","field":"q","code":"invalid"}` | ||
test("logs deprecation warning if `deprecation` header is present", function () { | ||
test("request.request() logs deprecation warning if `deprecation` header is present", (t) => { | ||
const mock = fetchMock.sandbox().mock( | ||
@@ -835,5 +838,5 @@ "https://api.github.com/teams/123", | ||
}).then((response) => { | ||
assert.equal(response.data, { id: 123 }); | ||
assert.equal(warn.calledOnce, true); | ||
assert.ok( | ||
t.deepEqual(response.data, { id: 123 }); | ||
t.deepEqual(warn.calledOnce, true); | ||
t.assert( | ||
warn.calledWith( | ||
@@ -846,3 +849,3 @@ '[@octokit/request] "GET https://api.github.com/teams/123" is deprecated. It is scheduled to be removed on Mon, 01 Feb 2021 00:00:00 GMT. See https://developer.github.com/changes/2020-01-21-moving-the-team-api-endpoints/' | ||
test("deprecation header without deprecation link", function () { | ||
test("request.request() deprecation header without deprecation link", (t) => { | ||
const mock = fetchMock.sandbox().mock( | ||
@@ -877,5 +880,5 @@ "https://api.github.com/teams/123", | ||
}).then((response) => { | ||
assert.equal(response.data, { id: 123 }); | ||
assert.equal(warn.calledOnce, true); | ||
assert.ok( | ||
t.deepEqual(response.data, { id: 123 }); | ||
t.deepEqual(warn.calledOnce, true); | ||
t.assert( | ||
warn.calledWith( | ||
@@ -888,3 +891,3 @@ '[@octokit/request] "GET https://api.github.com/teams/123" is deprecated. It is scheduled to be removed on Mon, 01 Feb 2021 00:00:00 GMT' | ||
test("404 not found", () => { | ||
test("request.request() 404 not found", (t) => { | ||
const mock = fetchMock | ||
@@ -907,5 +910,5 @@ .sandbox() | ||
}).catch((error) => { | ||
assert.equal(error.status, 404); | ||
assert.equal(error.response.data.message, "Not Found"); | ||
assert.equal( | ||
t.deepEqual(error.status, 404); | ||
t.deepEqual(error.response.data.message, "Not Found"); | ||
t.deepEqual( | ||
error.response.data.documentation_url, | ||
@@ -917,3 +920,3 @@ "https://docs.github.com/en/rest/reference/repos#get-a-repository" | ||
test("Request timeout", () => { | ||
test("request.request() Request timeout", (t) => { | ||
const delay = (millis = 3000) => { | ||
@@ -926,4 +929,4 @@ return new Promise((resolve) => { | ||
const mock = (url, options) => { | ||
assert.equal(url, "https://api.github.com/"); | ||
assert.equal(options.timeout, 100); | ||
t.deepEqual(url, "https://api.github.com/"); | ||
t.deepEqual(options.timeout, 100); | ||
return delay().then(() => { | ||
@@ -950,8 +953,8 @@ return { | ||
.catch((error) => { | ||
assert.equal(error.name, "HttpError"); | ||
assert.equal(error.status, 500); | ||
t.deepEqual(error.name, "HttpError"); | ||
t.deepEqual(error.status, 500); | ||
}); | ||
}); | ||
test("validate request with readstream data", () => { | ||
test("request.request() validate request with readstream data", async (t) => { | ||
const currentFilePath = url.fileURLToPath(import.meta.url); | ||
@@ -968,24 +971,30 @@ const size = fs.statSync(currentFilePath).size; | ||
return request("POST /repos/{owner}/{repo}/releases/{release_id}/assets", { | ||
owner: "octokit-fixture-org", | ||
repo: "release-assets", | ||
release_id: "v1.0.0", | ||
request: { | ||
fetch: mock, | ||
}, | ||
headers: { | ||
"content-type": "text/json", | ||
"content-length": size, | ||
}, | ||
data: fs.createReadStream(currentFilePath), | ||
name: "test-upload.txt", | ||
label: "test", | ||
}).then((response) => { | ||
assert.equal(response.status, 200); | ||
assert.instance(mock.lastOptions()?.body, stream.Readable); | ||
assert.ok(mock.done()); | ||
}); | ||
const response = await request( | ||
"POST /repos/{owner}/{repo}/releases/{release_id}/assets", | ||
{ | ||
owner: "octokit-fixture-org", | ||
repo: "release-assets", | ||
release_id: "v1.0.0", | ||
request: { | ||
fetch: mock, | ||
}, | ||
headers: { | ||
"content-type": "text/json", | ||
"content-length": size, | ||
}, | ||
data: fs.createReadStream(currentFilePath), | ||
name: "test-upload.txt", | ||
label: "test", | ||
} | ||
); | ||
t.deepEqual(response.status, 200); | ||
t.assert( | ||
mock.lastOptions()?.body instanceof stream.Readable, | ||
"mock.lastOptions()?.body, stream.Readable" | ||
); | ||
t.assert(mock.done()); | ||
}); | ||
test("validate request with data set to Buffer type", () => { | ||
test("request.request() validate request with data set to Buffer type", (t) => { | ||
const mock = fetchMock | ||
@@ -1014,9 +1023,9 @@ .sandbox() | ||
}).then((response) => { | ||
assert.equal(response.status, 200); | ||
assert.equal(mock.lastOptions()?.body, Buffer.from("Hello, world!\n")); | ||
assert.ok(mock.done()); | ||
t.deepEqual(response.status, 200); | ||
t.deepEqual(mock.lastOptions()?.body, Buffer.from("Hello, world!\n")); | ||
t.assert(mock.done()); | ||
}); | ||
}); | ||
test("validate request with data set to ArrayBuffer type", () => { | ||
test("request.request() validate request with data set to ArrayBuffer type", (t) => { | ||
const mock = fetchMock | ||
@@ -1045,12 +1054,12 @@ .sandbox() | ||
}).then((response) => { | ||
assert.equal(response.status, 200); | ||
assert.equal( | ||
t.deepEqual(response.status, 200); | ||
t.deepEqual( | ||
mock.lastOptions()?.body, | ||
stringToArrayBuffer("Hello, world!\n") | ||
); | ||
assert.ok(mock.done()); | ||
t.assert(mock.done()); | ||
}); | ||
}); | ||
test("bubbles up AbortError if the request is aborted", () => { | ||
test("request.request() bubbles up AbortError if the request is aborted", (t) => { | ||
// AbortSignal and AbortController do not exist on | ||
@@ -1098,6 +1107,4 @@ // Node < 15. The main parts of their API have been | ||
}).catch((error) => { | ||
assert.equal(error.name, "AbortError"); | ||
t.deepEqual(error.name, "AbortError"); | ||
}); | ||
}); | ||
test.run(); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
56841
1338
2
+ Added@octokit-next/types@2.3.1(transitive)
- Removed@octokit-next/types@2.3.0(transitive)
Updated@octokit-next/types@2.3.1