| module.exports = registerEndpoints; |
| |
| const { Deprecation } = require("deprecation"); |
| |
| 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] = function deprecatedEndpointMethod() { |
| octokit.log.warn( |
| new Deprecation(`[@octokit/rest] ${apiOptions.deprecated}`) |
| ); |
| octokit[namespaceName][apiName] = request; |
| return request.apply(null, arguments); |
| }; |
| |
| 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; |
| } |