index.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import { endpoint } from '@octokit/endpoint';
  2. import { getUserAgent } from 'universal-user-agent';
  3. import isPlainObject from 'is-plain-object';
  4. import nodeFetch from 'node-fetch';
  5. import { RequestError } from '@octokit/request-error';
  6. const VERSION = "5.4.2";
  7. function getBufferResponse(response) {
  8. return response.arrayBuffer();
  9. }
  10. function fetchWrapper(requestOptions) {
  11. if (isPlainObject(requestOptions.body) ||
  12. Array.isArray(requestOptions.body)) {
  13. requestOptions.body = JSON.stringify(requestOptions.body);
  14. }
  15. let headers = {};
  16. let status;
  17. let url;
  18. const fetch = (requestOptions.request && requestOptions.request.fetch) || nodeFetch;
  19. return fetch(requestOptions.url, Object.assign({
  20. method: requestOptions.method,
  21. body: requestOptions.body,
  22. headers: requestOptions.headers,
  23. redirect: requestOptions.redirect,
  24. }, requestOptions.request))
  25. .then((response) => {
  26. url = response.url;
  27. status = response.status;
  28. for (const keyAndValue of response.headers) {
  29. headers[keyAndValue[0]] = keyAndValue[1];
  30. }
  31. if (status === 204 || status === 205) {
  32. return;
  33. }
  34. // GitHub API returns 200 for HEAD requests
  35. if (requestOptions.method === "HEAD") {
  36. if (status < 400) {
  37. return;
  38. }
  39. throw new RequestError(response.statusText, status, {
  40. headers,
  41. request: requestOptions,
  42. });
  43. }
  44. if (status === 304) {
  45. throw new RequestError("Not modified", status, {
  46. headers,
  47. request: requestOptions,
  48. });
  49. }
  50. if (status >= 400) {
  51. return response
  52. .text()
  53. .then((message) => {
  54. const error = new RequestError(message, status, {
  55. headers,
  56. request: requestOptions,
  57. });
  58. try {
  59. let responseBody = JSON.parse(error.message);
  60. Object.assign(error, responseBody);
  61. let errors = responseBody.errors;
  62. // Assumption `errors` would always be in Array format
  63. error.message =
  64. error.message + ": " + errors.map(JSON.stringify).join(", ");
  65. }
  66. catch (e) {
  67. // ignore, see octokit/rest.js#684
  68. }
  69. throw error;
  70. });
  71. }
  72. const contentType = response.headers.get("content-type");
  73. if (/application\/json/.test(contentType)) {
  74. return response.json();
  75. }
  76. if (!contentType || /^text\/|charset=utf-8$/.test(contentType)) {
  77. return response.text();
  78. }
  79. return getBufferResponse(response);
  80. })
  81. .then((data) => {
  82. return {
  83. status,
  84. url,
  85. headers,
  86. data,
  87. };
  88. })
  89. .catch((error) => {
  90. if (error instanceof RequestError) {
  91. throw error;
  92. }
  93. throw new RequestError(error.message, 500, {
  94. headers,
  95. request: requestOptions,
  96. });
  97. });
  98. }
  99. function withDefaults(oldEndpoint, newDefaults) {
  100. const endpoint = oldEndpoint.defaults(newDefaults);
  101. const newApi = function (route, parameters) {
  102. const endpointOptions = endpoint.merge(route, parameters);
  103. if (!endpointOptions.request || !endpointOptions.request.hook) {
  104. return fetchWrapper(endpoint.parse(endpointOptions));
  105. }
  106. const request = (route, parameters) => {
  107. return fetchWrapper(endpoint.parse(endpoint.merge(route, parameters)));
  108. };
  109. Object.assign(request, {
  110. endpoint,
  111. defaults: withDefaults.bind(null, endpoint),
  112. });
  113. return endpointOptions.request.hook(request, endpointOptions);
  114. };
  115. return Object.assign(newApi, {
  116. endpoint,
  117. defaults: withDefaults.bind(null, endpoint),
  118. });
  119. }
  120. const request = withDefaults(endpoint, {
  121. headers: {
  122. "user-agent": `octokit-request.js/${VERSION} ${getUserAgent()}`,
  123. },
  124. });
  125. export { request };
  126. //# sourceMappingURL=index.js.map