GT2/Ejectable/node_modules/react-native/bots/make-comment.js

113 lines
2.9 KiB
JavaScript

/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
'use strict';
/**
* Updates the comment matching specified pattern.
* @param {import('@octokit/rest').Octokit} octokit Octokit instance
* @param {{ owner: string; repo: string; issue_number: string; }} issueParams
* @param {string} body Comment body
* @param {string} replacePattern Pattern for finding the comment to update
*/
async function updateComment(octokit, issueParams, body, replacePattern) {
if (!replacePattern) {
return false;
}
const authenticatedUser = await octokit.users.getAuthenticated();
if (authenticatedUser.status !== 200 || !authenticatedUser.data) {
console.warn(authenticatedUser);
return false;
}
const comments = await octokit.issues.listComments(issueParams);
if (comments.status !== 200 || !comments.data) {
console.warn(comments);
return false;
}
const authedUserId = authenticatedUser.data.id;
const pattern = new RegExp(replacePattern, 'g');
const comment = comments.data.find(
({user, body}) => user.id === authedUserId && pattern.test(body),
);
if (!comment) {
return false;
}
octokit.issues.updateComment({
...issueParams,
comment_id: comment.id,
body,
});
return true;
}
/**
* Creates or updates a comment with specified pattern.
* @param {string} body Comment body
* @param {string} replacePattern Pattern for finding the comment to update
*/
async function createOrUpdateComment(body, replacePattern) {
const {
GITHUB_TOKEN,
GITHUB_OWNER,
GITHUB_REPO,
GITHUB_PR_NUMBER,
} = process.env;
if (!GITHUB_TOKEN || !GITHUB_OWNER || !GITHUB_REPO || !GITHUB_PR_NUMBER) {
if (!GITHUB_TOKEN) {
console.error(
'Missing GITHUB_TOKEN. Example: 5fd88b964fa214c4be2b144dc5af5d486a2f8c1e. PR feedback cannot be provided on GitHub without a valid token.',
);
}
if (!GITHUB_OWNER) {
console.error('Missing GITHUB_OWNER. Example: facebook');
}
if (!GITHUB_REPO) {
console.error('Missing GITHUB_REPO. Example: react-native');
}
if (!GITHUB_PR_NUMBER) {
console.error(
'Missing GITHUB_PR_NUMBER. Example: 4687. PR feedback cannot be provided on GitHub without a valid pull request number.',
);
}
process.exit(1);
}
if (!body) {
return;
}
const {Octokit} = require('@octokit/rest');
const octokit = new Octokit({auth: GITHUB_TOKEN});
const issueParams = {
owner: GITHUB_OWNER,
repo: GITHUB_REPO,
issue_number: GITHUB_PR_NUMBER,
};
if (await updateComment(octokit, issueParams, body, replacePattern)) {
return;
}
// We found no comments to replace, so we'll create a new one.
octokit.issues.createComment({
...issueParams,
body,
});
}
module.exports = {
createOrUpdateComment,
};