This commit is contained in:
eric sciple 2020-01-24 12:20:19 -05:00
parent beb1329f9f
commit 2b95e76931
7736 changed files with 1874747 additions and 51184 deletions

View file

@ -1,9 +1,9 @@
module.exports = paginatePlugin
module.exports = paginatePlugin;
const iterator = require('./iterator')
const paginate = require('./paginate')
const iterator = require("./iterator");
const paginate = require("./paginate");
function paginatePlugin (octokit) {
octokit.paginate = paginate.bind(null, octokit)
octokit.paginate.iterator = iterator.bind(null, octokit)
function paginatePlugin(octokit) {
octokit.paginate = paginate.bind(null, octokit);
octokit.paginate.iterator = iterator.bind(null, octokit);
}

View file

@ -1,31 +1,34 @@
module.exports = iterator
module.exports = iterator;
const normalizePaginatedListResponse = require('./normalize-paginated-list-response')
const normalizePaginatedListResponse = require("./normalize-paginated-list-response");
function iterator (octokit, options) {
const headers = options.headers
let url = octokit.request.endpoint(options).url
function iterator(octokit, options) {
const headers = options.headers;
let url = octokit.request.endpoint(options).url;
return {
[Symbol.asyncIterator]: () => ({
next () {
next() {
if (!url) {
return Promise.resolve({ done: true })
return Promise.resolve({ done: true });
}
return octokit.request({ url, headers })
return octokit
.request({ url, headers })
.then((response) => {
normalizePaginatedListResponse(octokit, url, response)
.then(response => {
normalizePaginatedListResponse(octokit, url, response);
// `response.headers.link` format:
// '<https://api.github.com/users/aseemk/followers?page=2>; rel="next", <https://api.github.com/users/aseemk/followers?page=2>; rel="last"'
// sets `url` to undefined if "next" URL is not present or `link` header is not set
url = ((response.headers.link || '').match(/<([^>]+)>;\s*rel="next"/) || [])[1]
url = ((response.headers.link || "").match(
/<([^>]+)>;\s*rel="next"/
) || [])[1];
return { value: response }
})
return { value: response };
});
}
})
}
};
}

View file

@ -10,6 +10,7 @@
* - https://developer.github.com/v3/checks/suites/#response-1 (key: `check_suites`)
* - https://developer.github.com/v3/apps/installations/#list-repositories (key: `repositories`)
* - https://developer.github.com/v3/apps/installations/#list-installations-for-a-user (key `installations`)
* - https://developer.github.com/v3/orgs/#list-installations-for-an-organization (key `installations`)
*
* Octokit normalizes these responses so that paginated results are always returned following
* the same structure. One challenge is that if the list response has only one page, no Link
@ -19,73 +20,97 @@
* property because it also exists in the response of Get the combined status for a specific ref.
*/
module.exports = normalizePaginatedListResponse
module.exports = normalizePaginatedListResponse;
const { Deprecation } = require('deprecation')
const once = require('once')
const { Deprecation } = require("deprecation");
const once = require("once");
const deprecateIncompleteResults = once((log, deprecation) => log.warn(deprecation))
const deprecateTotalCount = once((log, deprecation) => log.warn(deprecation))
const deprecateNamespace = once((log, deprecation) => log.warn(deprecation))
const deprecateIncompleteResults = once((log, deprecation) =>
log.warn(deprecation)
);
const deprecateTotalCount = once((log, deprecation) => log.warn(deprecation));
const deprecateNamespace = once((log, deprecation) => log.warn(deprecation));
const REGEX_IS_SEARCH_PATH = /^\/search\//
const REGEX_IS_CHECKS_PATH = /^\/repos\/[^/]+\/[^/]+\/commits\/[^/]+\/(check-runs|check-suites)/
const REGEX_IS_INSTALLATION_REPOSITORIES_PATH = /^\/installation\/repositories/
const REGEX_IS_USER_INSTALLATIONS_PATH = /^\/user\/installations/
const REGEX_IS_SEARCH_PATH = /^\/search\//;
const REGEX_IS_CHECKS_PATH = /^\/repos\/[^/]+\/[^/]+\/commits\/[^/]+\/(check-runs|check-suites)/;
const REGEX_IS_INSTALLATION_REPOSITORIES_PATH = /^\/installation\/repositories/;
const REGEX_IS_USER_INSTALLATIONS_PATH = /^\/user\/installations/;
const REGEX_IS_ORG_INSTALLATIONS_PATH = /^\/orgs\/[^/]+\/installations/;
function normalizePaginatedListResponse (octokit, url, response) {
const path = url.replace(octokit.request.endpoint.DEFAULTS.baseUrl, '')
function normalizePaginatedListResponse(octokit, url, response) {
const path = url.replace(octokit.request.endpoint.DEFAULTS.baseUrl, "");
if (
!REGEX_IS_SEARCH_PATH.test(path) &&
!REGEX_IS_CHECKS_PATH.test(path) &&
!REGEX_IS_INSTALLATION_REPOSITORIES_PATH.test(path) &&
!REGEX_IS_USER_INSTALLATIONS_PATH.test(path)
!REGEX_IS_USER_INSTALLATIONS_PATH.test(path) &&
!REGEX_IS_ORG_INSTALLATIONS_PATH.test(path)
) {
return
return;
}
// keep the additional properties intact to avoid a breaking change,
// but log a deprecation warning when accessed
const incompleteResults = response.data.incomplete_results
const repositorySelection = response.data.repository_selection
const totalCount = response.data.total_count
delete response.data.incomplete_results
delete response.data.repository_selection
delete response.data.total_count
const incompleteResults = response.data.incomplete_results;
const repositorySelection = response.data.repository_selection;
const totalCount = response.data.total_count;
delete response.data.incomplete_results;
delete response.data.repository_selection;
delete response.data.total_count;
const namespaceKey = Object.keys(response.data)[0]
const namespaceKey = Object.keys(response.data)[0];
response.data = response.data[namespaceKey]
response.data = response.data[namespaceKey];
Object.defineProperty(response.data, namespaceKey, {
get () {
deprecateNamespace(octokit.log, new Deprecation(`[@octokit/rest] "result.data.${namespaceKey}" is deprecated. Use "result.data" instead`))
return response.data
get() {
deprecateNamespace(
octokit.log,
new Deprecation(
`[@octokit/rest] "result.data.${namespaceKey}" is deprecated. Use "result.data" instead`
)
);
return response.data;
}
})
});
if (typeof incompleteResults !== 'undefined') {
Object.defineProperty(response.data, 'incomplete_results', {
get () {
deprecateIncompleteResults(octokit.log, new Deprecation('[@octokit/rest] "result.data.incomplete_results" is deprecated.'))
return incompleteResults
if (typeof incompleteResults !== "undefined") {
Object.defineProperty(response.data, "incomplete_results", {
get() {
deprecateIncompleteResults(
octokit.log,
new Deprecation(
'[@octokit/rest] "result.data.incomplete_results" is deprecated.'
)
);
return incompleteResults;
}
})
});
}
if (typeof repositorySelection !== 'undefined') {
Object.defineProperty(response.data, 'repository_selection', {
get () {
deprecateTotalCount(octokit.log, new Deprecation('[@octokit/rest] "result.data.repository_selection" is deprecated.'))
return repositorySelection
if (typeof repositorySelection !== "undefined") {
Object.defineProperty(response.data, "repository_selection", {
get() {
deprecateTotalCount(
octokit.log,
new Deprecation(
'[@octokit/rest] "result.data.repository_selection" is deprecated.'
)
);
return repositorySelection;
}
})
});
}
Object.defineProperty(response.data, 'total_count', {
get () {
deprecateTotalCount(octokit.log, new Deprecation('[@octokit/rest] "result.data.total_count" is deprecated.'))
return totalCount
Object.defineProperty(response.data, "total_count", {
get() {
deprecateTotalCount(
octokit.log,
new Deprecation(
'[@octokit/rest] "result.data.total_count" is deprecated.'
)
);
return totalCount;
}
})
});
}

View file

@ -1,34 +1,40 @@
module.exports = paginate
module.exports = paginate;
const iterator = require('./iterator')
const iterator = require("./iterator");
function paginate (octokit, route, options, mapFn) {
if (typeof options === 'function') {
mapFn = options
options = undefined
function paginate(octokit, route, options, mapFn) {
if (typeof options === "function") {
mapFn = options;
options = undefined;
}
options = octokit.request.endpoint.merge(route, options)
return gather(octokit, [], iterator(octokit, options)[Symbol.asyncIterator](), mapFn)
options = octokit.request.endpoint.merge(route, options);
return gather(
octokit,
[],
iterator(octokit, options)[Symbol.asyncIterator](),
mapFn
);
}
function gather (octokit, results, iterator, mapFn) {
return iterator.next()
.then(result => {
if (result.done) {
return results
}
function gather(octokit, results, iterator, mapFn) {
return iterator.next().then(result => {
if (result.done) {
return results;
}
let earlyExit = false
function done () {
earlyExit = true
}
let earlyExit = false;
function done() {
earlyExit = true;
}
results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data)
results = results.concat(
mapFn ? mapFn(result.value, done) : result.value.data
);
if (earlyExit) {
return results
}
if (earlyExit) {
return results;
}
return gather(octokit, results, iterator, mapFn)
})
return gather(octokit, results, iterator, mapFn);
});
}