Socket
Socket
Sign inDemoInstall

@octokit-next/request

Package Overview
Dependencies
Maintainers
2
Versions
43
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@octokit-next/request - npm Package Compare versions

Comparing version 2.3.0 to 2.3.1

lib/fetch-wrapper.js

6

index.js
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();
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc