register-endpoints.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { Deprecation } from "deprecation";
  2. export function registerEndpoints(octokit, routes) {
  3. Object.keys(routes).forEach(namespaceName => {
  4. if (!octokit[namespaceName]) {
  5. octokit[namespaceName] = {};
  6. }
  7. Object.keys(routes[namespaceName]).forEach(apiName => {
  8. const apiOptions = routes[namespaceName][apiName];
  9. const endpointDefaults = ["method", "url", "headers"].reduce((map, key) => {
  10. if (typeof apiOptions[key] !== "undefined") {
  11. map[key] = apiOptions[key];
  12. }
  13. return map;
  14. }, {});
  15. endpointDefaults.request = {
  16. validate: apiOptions.params
  17. };
  18. let request = octokit.request.defaults(endpointDefaults);
  19. // patch request & endpoint methods to support deprecated parameters.
  20. // Not the most elegant solution, but we don’t want to move deprecation
  21. // logic into octokit/endpoint.js as it’s out of scope
  22. const hasDeprecatedParam = Object.keys(apiOptions.params || {}).find(key => apiOptions.params[key].deprecated);
  23. if (hasDeprecatedParam) {
  24. const patch = patchForDeprecation.bind(null, octokit, apiOptions);
  25. request = patch(octokit.request.defaults(endpointDefaults), `.${namespaceName}.${apiName}()`);
  26. request.endpoint = patch(request.endpoint, `.${namespaceName}.${apiName}.endpoint()`);
  27. request.endpoint.merge = patch(request.endpoint.merge, `.${namespaceName}.${apiName}.endpoint.merge()`);
  28. }
  29. if (apiOptions.deprecated) {
  30. octokit[namespaceName][apiName] = Object.assign(function deprecatedEndpointMethod() {
  31. octokit.log.warn(new Deprecation(`[@octokit/rest] ${apiOptions.deprecated}`));
  32. octokit[namespaceName][apiName] = request;
  33. return request.apply(null, arguments);
  34. }, request);
  35. return;
  36. }
  37. octokit[namespaceName][apiName] = request;
  38. });
  39. });
  40. }
  41. function patchForDeprecation(octokit, apiOptions, method, methodName) {
  42. const patchedMethod = (options) => {
  43. options = Object.assign({}, options);
  44. Object.keys(options).forEach(key => {
  45. if (apiOptions.params[key] && apiOptions.params[key].deprecated) {
  46. const aliasKey = apiOptions.params[key].alias;
  47. octokit.log.warn(new Deprecation(`[@octokit/rest] "${key}" parameter is deprecated for "${methodName}". Use "${aliasKey}" instead`));
  48. if (!(aliasKey in options)) {
  49. options[aliasKey] = options[key];
  50. }
  51. delete options[key];
  52. }
  53. });
  54. return method(options);
  55. };
  56. Object.keys(method).forEach(key => {
  57. patchedMethod[key] = method[key];
  58. });
  59. return patchedMethod;
  60. }