| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- import { Deprecation } from "deprecation";
- export function registerEndpoints(octokit, routes) {
- Object.keys(routes).forEach(namespaceName => {
- if (!octokit[namespaceName]) {
- octokit[namespaceName] = {};
- }
- Object.keys(routes[namespaceName]).forEach(apiName => {
- const apiOptions = routes[namespaceName][apiName];
- const endpointDefaults = ["method", "url", "headers"].reduce((map, key) => {
- if (typeof apiOptions[key] !== "undefined") {
- map[key] = apiOptions[key];
- }
- return map;
- }, {});
- endpointDefaults.request = {
- validate: apiOptions.params
- };
- let request = octokit.request.defaults(endpointDefaults);
- // patch request & endpoint methods to support deprecated parameters.
- // Not the most elegant solution, but we don’t want to move deprecation
- // logic into octokit/endpoint.js as it’s out of scope
- const hasDeprecatedParam = Object.keys(apiOptions.params || {}).find(key => apiOptions.params[key].deprecated);
- if (hasDeprecatedParam) {
- const patch = patchForDeprecation.bind(null, octokit, apiOptions);
- request = patch(octokit.request.defaults(endpointDefaults), `.${namespaceName}.${apiName}()`);
- request.endpoint = patch(request.endpoint, `.${namespaceName}.${apiName}.endpoint()`);
- request.endpoint.merge = patch(request.endpoint.merge, `.${namespaceName}.${apiName}.endpoint.merge()`);
- }
- if (apiOptions.deprecated) {
- octokit[namespaceName][apiName] = Object.assign(function deprecatedEndpointMethod() {
- octokit.log.warn(new Deprecation(`[@octokit/rest] ${apiOptions.deprecated}`));
- octokit[namespaceName][apiName] = request;
- return request.apply(null, arguments);
- }, request);
- return;
- }
- octokit[namespaceName][apiName] = request;
- });
- });
- }
- function patchForDeprecation(octokit, apiOptions, method, methodName) {
- const patchedMethod = (options) => {
- options = Object.assign({}, options);
- Object.keys(options).forEach(key => {
- if (apiOptions.params[key] && apiOptions.params[key].deprecated) {
- const aliasKey = apiOptions.params[key].alias;
- octokit.log.warn(new Deprecation(`[@octokit/rest] "${key}" parameter is deprecated for "${methodName}". Use "${aliasKey}" instead`));
- if (!(aliasKey in options)) {
- options[aliasKey] = options[key];
- }
- delete options[key];
- }
- });
- return method(options);
- };
- Object.keys(method).forEach(key => {
- patchedMethod[key] = method[key];
- });
- return patchedMethod;
- }
|