Fix dependency incompatibilities

This commit is contained in:
Henry Mercer 2023-07-13 11:17:33 +01:00
parent 40a500c743
commit c1f49580cf
749 changed files with 372856 additions and 91172 deletions

View file

@ -13,12 +13,15 @@
Browsers
</th><td width=100%>
Load `@octokit/plugin-paginate-rest` and [`@octokit/core`](https://github.com/octokit/core.js) (or core-compatible module) directly from [cdn.pika.dev](https://cdn.pika.dev)
Load `@octokit/plugin-paginate-rest` and [`@octokit/core`](https://github.com/octokit/core.js) (or core-compatible module) directly from [cdn.skypack.dev](https://cdn.skypack.dev)
```html
<script type="module">
import { Octokit } from "https://cdn.pika.dev/@octokit/core";
import { paginateRest } from "https://cdn.pika.dev/@octokit/plugin-paginate-rest";
import { Octokit } from "https://cdn.skypack.dev/@octokit/core";
import {
paginateRest,
composePaginateRest,
} from "https://cdn.skypack.dev/@octokit/plugin-paginate-rest";
</script>
```
@ -31,7 +34,10 @@ Install with `npm install @octokit/core @octokit/plugin-paginate-rest`. Optional
```js
const { Octokit } = require("@octokit/core");
const { paginateRest } = require("@octokit/plugin-paginate-rest");
const {
paginateRest,
composePaginateRest,
} = require("@octokit/plugin-paginate-rest");
```
</td></tr>
@ -43,7 +49,7 @@ const MyOctokit = Octokit.plugin(paginateRest);
const octokit = new MyOctokit({ auth: "secret123" });
// See https://developer.github.com/v3/issues/#list-issues-for-a-repository
const issues = await octokit.paginate("GET /repos/:owner/:repo/issues", {
const issues = await octokit.paginate("GET /repos/{owner}/{repo}/issues", {
owner: "octocat",
repo: "hello-world",
since: "2010-10-01",
@ -51,6 +57,22 @@ const issues = await octokit.paginate("GET /repos/:owner/:repo/issues", {
});
```
If you want to utilize the pagination methods in another plugin, use `composePaginateRest`.
```js
function myPlugin(octokit, options) {
return {
allStars({owner, repo}) => {
return composePaginateRest(
octokit,
"GET /repos/{owner}/{repo}/stargazers",
{owner, repo }
)
}
}
}
```
## `octokit.paginate()`
The `paginateRest` plugin adds a new `octokit.paginate()` method which accepts the same parameters as [`octokit.request`](https://github.com/octokit/request.js#request). Only "List ..." endpoints such as [List issues for a repository](https://developer.github.com/v3/issues/#list-issues-for-a-repository) are supporting pagination. Their [response includes a Link header](https://developer.github.com/v3/issues/#response-1). For other endpoints, `octokit.paginate()` behaves the same as `octokit.request()`.
@ -61,7 +83,7 @@ An optional `mapFunction` can be passed to map each page response to a new value
```js
const issueTitles = await octokit.paginate(
"GET /repos/:owner/:repo/issues",
"GET /repos/{owner}/{repo}/issues",
{
owner: "octocat",
repo: "hello-world",
@ -76,7 +98,7 @@ The `mapFunction` gets a 2nd argument `done` which can be called to end the pagi
```js
const issues = await octokit.paginate(
"GET /repos/:owner/:repo/issues",
"GET /repos/{owner}/{repo}/issues",
{
owner: "octocat",
repo: "hello-world",
@ -84,7 +106,7 @@ const issues = await octokit.paginate(
per_page: 100,
},
(response, done) => {
if (response.data.find((issues) => issue.title.includes("something"))) {
if (response.data.find((issue) => issue.title.includes("something"))) {
done();
}
return response.data;
@ -95,7 +117,7 @@ const issues = await octokit.paginate(
Alternatively you can pass a `request` method as first argument. This is great when using in combination with [`@octokit/plugin-rest-endpoint-methods`](https://github.com/octokit/plugin-rest-endpoint-methods.js/):
```js
const issues = await octokit.paginate(octokit.issues.listForRepo, {
const issues = await octokit.paginate(octokit.rest.issues.listForRepo, {
owner: "octocat",
repo: "hello-world",
since: "2010-10-01",
@ -115,11 +137,12 @@ const parameters = {
per_page: 100,
};
for await (const response of octokit.paginate.iterator(
"GET /repos/:owner/:repo/issues",
"GET /repos/{owner}/{repo}/issues",
parameters
)) {
// do whatever you want with each response, break out of the loop, etc.
console.log(response.data.title);
const issues = response.data;
console.log("%d issues found", issues.length);
}
```
@ -133,14 +156,19 @@ const parameters = {
per_page: 100,
};
for await (const response of octokit.paginate.iterator(
octokit.issues.listForRepo,
octokit.rest.issues.listForRepo,
parameters
)) {
// do whatever you want with each response, break out of the loop, etc.
console.log(response.data.title);
const issues = response.data;
console.log("%d issues found", issues.length);
}
```
## `composePaginateRest` and `composePaginateRest.iterator`
The `compose*` methods work just like their `octokit.*` counterparts described above, with the differenct that both methods require an `octokit` instance to be passed as first argument
## How it works
`octokit.paginate()` wraps `octokit.request()`. As long as a `rel="next"` link value is present in the response's `Link` header, it sends another request for that URL, and so on.
@ -157,6 +185,81 @@ Most of GitHub's paginating REST API endpoints return an array, but there are a
If a response is lacking the `Link` header, `octokit.paginate()` still resolves with an array, even if the response returns a single object.
## Types
The plugin also exposes some types and runtime type guards for TypeScript projects.
<table>
<tbody valign=top align=left>
<tr><th>
Types
</th><td>
```typescript
import {
PaginateInterface,
PaginatingEndpoints,
} from "@octokit/plugin-paginate-rest";
```
</td></tr>
<tr><th>
Guards
</th><td>
```typescript
import { isPaginatingEndpoint } from "@octokit/plugin-paginate-rest";
```
</td></tr>
</tbody>
</table>
### PaginateInterface
An `interface` that declares all the overloads of the `.paginate` method.
### PaginatingEndpoints
An `interface` which describes all API endpoints supported by the plugin. Some overloads of `.paginate()` method and `composePaginateRest()` function depend on `PaginatingEndpoints`, using the `keyof PaginatingEndpoints` as a type for one of its arguments.
```typescript
import { Octokit } from "@octokit/core";
import {
PaginatingEndpoints,
composePaginateRest,
} from "@octokit/plugin-paginate-rest";
type DataType<T> = "data" extends keyof T ? T["data"] : unknown;
async function myPaginatePlugin<E extends keyof PaginatingEndpoints>(
octokit: Octokit,
endpoint: E,
parameters?: PaginatingEndpoints[E]["parameters"]
): Promise<DataType<PaginatingEndpoints[E]["response"]>> {
return await composePaginateRest(octokit, endpoint, parameters);
}
```
### isPaginatingEndpoint
A type guard, `isPaginatingEndpoint(arg)` returns `true` if `arg` is one of the keys in `PaginatingEndpoints` (is `keyof PaginatingEndpoints`).
```typescript
import { Octokit } from "@octokit/core";
import {
isPaginatingEndpoint,
composePaginateRest,
} from "@octokit/plugin-paginate-rest";
async function myPlugin(octokit: Octokit, arg: unknown) {
if (isPaginatingEndpoint(arg)) {
return await composePaginateRest(octokit, arg);
}
// ...
}
```
## Contributing
See [CONTRIBUTING.md](CONTRIBUTING.md)