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; }