module.exports = octokitRestNormalizeGitReferenceResponses;

const { RequestError } = require("@octokit/request-error");

function octokitRestNormalizeGitReferenceResponses(octokit) {
  octokit.hook.wrap("request", (request, options) => {
    const isGetOrListRefRequest = /\/repos\/:?\w+\/:?\w+\/git\/refs\/:?\w+/.test(
      options.url
    );

    if (!isGetOrListRefRequest) {
      return request(options);
    }

    const isGetRefRequest = "ref" in options;

    return request(options)
      .then(response => {
        // request single reference
        if (isGetRefRequest) {
          if (Array.isArray(response.data)) {
            throw new RequestError(
              `More than one reference found for "${options.ref}"`,
              404,
              {
                request: options
              }
            );
          }

          // ✅ received single reference
          return response;
        }

        // request list of references
        if (!Array.isArray(response.data)) {
          response.data = [response.data];
        }

        return response;
      })

      .catch(error => {
        if (isGetRefRequest) {
          throw error;
        }

        if (error.status === 404) {
          return {
            status: 200,
            headers: error.headers,
            data: []
          };
        }

        throw error;
      });
  });
}
