forked from mirrored/github-readme-stats
Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d0cb83cfd2 | ||
|
|
7b87177734 | ||
|
|
7e30ca6cc0 | ||
|
|
22a201df41 |
@@ -46,6 +46,8 @@ export default async (req, res) => {
|
||||
if (locale && !isLocaleAvailable(locale)) {
|
||||
return res.send(renderError("Something went wrong", "Language not found"));
|
||||
}
|
||||
|
||||
theme = theme.replace(/-/g, "_")
|
||||
|
||||
try {
|
||||
const stats = await fetchStats(
|
||||
|
||||
@@ -35,6 +35,8 @@ export default async (req, res) => {
|
||||
if (locale && !isLocaleAvailable(locale)) {
|
||||
return res.send(renderError("Something went wrong", "Language not found"));
|
||||
}
|
||||
|
||||
theme = theme.replace(/-/g, "_")
|
||||
|
||||
try {
|
||||
const repoData = await fetchRepo(username, repo);
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
* @file Contains a simple cloud function that can be used to check which PATs are no
|
||||
* longer working. It returns a list of valid PATs, expired PATs and PATs with errors.
|
||||
*
|
||||
* @description This function is currently rate limited to 1 request per 5 minutes.
|
||||
* @description This function is currently rate limited to 1 request per 10 minutes.
|
||||
*/
|
||||
|
||||
import { logger, request, dateDiff } from "../../src/common/utils.js";
|
||||
export const RATE_LIMIT_SECONDS = 60 * 5; // 1 request per 5 minutes
|
||||
export const RATE_LIMIT_SECONDS = 60 * 5; // 1 request per 10 minutes
|
||||
|
||||
/**
|
||||
* Simple uptime check fetcher for the PATs.
|
||||
|
||||
+2
-2
@@ -2,13 +2,13 @@
|
||||
* @file Contains a simple cloud function that can be used to check if the PATs are still
|
||||
* functional.
|
||||
*
|
||||
* @description This function is currently rate limited to 1 request per 5 minutes.
|
||||
* @description This function is currently rate limited to 1 request per 10 minutes.
|
||||
*/
|
||||
|
||||
import retryer from "../../src/common/retryer.js";
|
||||
import { logger, request } from "../../src/common/utils.js";
|
||||
|
||||
export const RATE_LIMIT_SECONDS = 60 * 5; // 1 request per 5 minutes
|
||||
export const RATE_LIMIT_SECONDS = 60 * 10; // 1 request per 10 minutes
|
||||
|
||||
/**
|
||||
* Simple uptime check fetcher for the PATs.
|
||||
|
||||
@@ -41,6 +41,8 @@ export default async (req, res) => {
|
||||
if (locale && !isLocaleAvailable(locale)) {
|
||||
return res.send(renderError("Something went wrong", "Locale not found"));
|
||||
}
|
||||
|
||||
theme = theme.replace(/-/g, "_")
|
||||
|
||||
try {
|
||||
const topLangs = await fetchTopLanguages(
|
||||
|
||||
@@ -38,6 +38,8 @@ export default async (req, res) => {
|
||||
if (locale && !isLocaleAvailable(locale)) {
|
||||
return res.send(renderError("Something went wrong", "Language not found"));
|
||||
}
|
||||
|
||||
theme = theme.replace(/-/g, "_")
|
||||
|
||||
try {
|
||||
const stats = await fetchWakatimeStats({ username, api_domain, range });
|
||||
|
||||
+56
-123
@@ -43,23 +43,6 @@ const ACCEPTED_COLOR_PROPS = Object.keys(COLOR_PROPS);
|
||||
const REQUIRED_COLOR_PROPS = ACCEPTED_COLOR_PROPS.slice(0, 4);
|
||||
const INVALID_REVIEW_COMMENT = (commentUrl) =>
|
||||
`Some themes are invalid. See the [Automated Theme Preview](${commentUrl}) comment above for more information.`;
|
||||
var OCTOKIT;
|
||||
var OWNER;
|
||||
var REPO;
|
||||
var PULL_REQUEST_ID;
|
||||
|
||||
/**
|
||||
* Incorrect JSON format error.
|
||||
* @extends Error
|
||||
* @param {string} message Error message.
|
||||
* @returns {Error} IncorrectJsonFormatError.
|
||||
*/
|
||||
class IncorrectJsonFormatError extends Error {
|
||||
constructor(message) {
|
||||
super(message);
|
||||
this.name = "IncorrectJsonFormatError";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve PR number from the event payload.
|
||||
@@ -143,36 +126,15 @@ const findComment = async (octokit, issueNumber, owner, repo, commenter) => {
|
||||
* Create or update the preview comment.
|
||||
*
|
||||
* @param {Object} octokit Octokit instance.
|
||||
* @param {number} issueNumber Issue number.
|
||||
* @param {Object} repo Repository name.
|
||||
* @param {Object} owner Owner of the repository.
|
||||
* @param {number} commentId Comment ID.
|
||||
* @param {string} body Comment body.
|
||||
* @param {Object} props Comment properties.
|
||||
* @return {string} The comment URL.
|
||||
*/
|
||||
const upsertComment = async (
|
||||
octokit,
|
||||
issueNumber,
|
||||
repo,
|
||||
owner,
|
||||
commentId,
|
||||
body,
|
||||
) => {
|
||||
const upsertComment = async (octokit, props) => {
|
||||
let resp;
|
||||
if (commentId !== undefined) {
|
||||
resp = await octokit.issues.updateComment({
|
||||
owner,
|
||||
repo,
|
||||
comment_id: commentId,
|
||||
body,
|
||||
});
|
||||
if (props.comment_id !== undefined) {
|
||||
resp = await octokit.issues.updateComment(props);
|
||||
} else {
|
||||
resp = await octokit.issues.createComment({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issueNumber,
|
||||
body,
|
||||
});
|
||||
resp = await octokit.issues.createComment(props);
|
||||
}
|
||||
return resp.data.html_url;
|
||||
};
|
||||
@@ -307,38 +269,22 @@ const parseJSON = (json) => {
|
||||
if (typeof parsedJson === "object") {
|
||||
return parsedJson;
|
||||
} else {
|
||||
throw new IncorrectJsonFormatError(
|
||||
"PR diff is not a valid theme JSON object.",
|
||||
);
|
||||
throw new Error("PR diff is not a valid theme JSON object.");
|
||||
}
|
||||
} catch (error) {
|
||||
// Remove trailing commas (if any).
|
||||
let parsedJson = json.replace(/(,\s*})/g, "}");
|
||||
|
||||
// Remove JS comments (if any).
|
||||
parsedJson = parsedJson.replace(/\/\/[A-z\s]*\s/g, "");
|
||||
|
||||
// Fix incorrect open bracket (if any).
|
||||
const splitJson = parsedJson
|
||||
let parsedJson = json
|
||||
.split(/([\s\r\s]*}[\s\r\s]*,[\s\r\s]*)(?=[\w"-]+:)/)
|
||||
.filter((x) => typeof x !== "string" || !!x.trim()); // Split json into array of strings and objects.
|
||||
if (splitJson[0].replace(/\s+/g, "") === "},") {
|
||||
splitJson[0] = "},";
|
||||
if (!/\s*}\s*,?\s*$/.test(splitJson[1])) {
|
||||
splitJson.push(splitJson.shift());
|
||||
.filter((x) => typeof x !== "string" || !!x.trim());
|
||||
if (parsedJson[0].replace(/\s+/g, "") === "},") {
|
||||
parsedJson[0] = "},";
|
||||
if (!/\s*}\s*,?\s*$/.test(parsedJson[1])) {
|
||||
parsedJson.push(parsedJson.shift());
|
||||
} else {
|
||||
splitJson.shift();
|
||||
parsedJson.shift();
|
||||
}
|
||||
parsedJson = splitJson.join("");
|
||||
}
|
||||
|
||||
// Try to parse the fixed json.
|
||||
try {
|
||||
return Hjson.parse(parsedJson);
|
||||
} catch (error) {
|
||||
throw new IncorrectJsonFormatError(
|
||||
`Theme JSON file could not be parsed: ${error.message}`,
|
||||
);
|
||||
return Hjson.parse(parsedJson.join(""));
|
||||
} else {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -357,7 +303,7 @@ const DRY_RUN = process.env.DRY_RUN === "true" || false;
|
||||
/**
|
||||
* Main function.
|
||||
*/
|
||||
export const run = async () => {
|
||||
export const run = async (prNumber) => {
|
||||
try {
|
||||
debug("Retrieve action information from context...");
|
||||
debug(`Context: ${inspect(github.context)}`);
|
||||
@@ -366,50 +312,40 @@ export const run = async () => {
|
||||
\r${THEME_CONTRIB_GUIDELINESS}
|
||||
`;
|
||||
const ccc = new ColorContrastChecker();
|
||||
OCTOKIT = github.getOctokit(getGithubToken());
|
||||
PULL_REQUEST_ID = getPrNumber();
|
||||
const { owner, repo } = getRepoInfo(github.context);
|
||||
OWNER = owner;
|
||||
REPO = repo;
|
||||
const octokit = github.getOctokit(getGithubToken());
|
||||
const pullRequestId = prNumber ? prNumber : getPrNumber();
|
||||
const commenter = getCommenter();
|
||||
PULL_REQUEST_ID = getPrNumber();
|
||||
debug(`Owner: ${OWNER}`);
|
||||
debug(`Repo: ${REPO}`);
|
||||
const { owner, repo } = getRepoInfo(github.context);
|
||||
debug(`Owner: ${owner}`);
|
||||
debug(`Repo: ${repo}`);
|
||||
debug(`Commenter: ${commenter}`);
|
||||
|
||||
// Retrieve the PR diff and preview-theme comment.
|
||||
debug("Retrieve PR diff...");
|
||||
const res = await OCTOKIT.pulls.get({
|
||||
owner: OWNER,
|
||||
repo: REPO,
|
||||
pull_number: PULL_REQUEST_ID,
|
||||
const res = await octokit.pulls.get({
|
||||
owner,
|
||||
repo,
|
||||
pull_number: pullRequestId,
|
||||
mediaType: {
|
||||
format: "diff",
|
||||
},
|
||||
});
|
||||
debug("Retrieve preview-theme comment...");
|
||||
const comment = await findComment(
|
||||
OCTOKIT,
|
||||
PULL_REQUEST_ID,
|
||||
OWNER,
|
||||
REPO,
|
||||
octokit,
|
||||
pullRequestId,
|
||||
owner,
|
||||
repo,
|
||||
commenter,
|
||||
);
|
||||
|
||||
// Retrieve theme changes from the PR diff.
|
||||
debug("Retrieve themes...");
|
||||
const diff = parse(res.data);
|
||||
|
||||
// Retrieve all theme changes from the PR diff and convert to JSON.
|
||||
debug("Retrieve theme changes...");
|
||||
const content = diff
|
||||
.find((file) => file.to === "themes/index.js")
|
||||
.chunks.map((chunk) =>
|
||||
chunk.changes
|
||||
.filter((c) => c.type === "add")
|
||||
.map((c) => c.content.replace("+", ""))
|
||||
.join(""),
|
||||
)
|
||||
.chunks[0].changes.filter((c) => c.type === "add")
|
||||
.map((c) => c.content.replace("+", ""))
|
||||
.join("");
|
||||
const themeObject = parseJSON(content);
|
||||
if (
|
||||
@@ -579,14 +515,13 @@ export const run = async () => {
|
||||
debug("Create or update theme-preview comment...");
|
||||
let comment_url;
|
||||
if (!DRY_RUN) {
|
||||
comment_url = await upsertComment(
|
||||
OCTOKIT,
|
||||
PULL_REQUEST_ID,
|
||||
REPO,
|
||||
OWNER,
|
||||
comment?.id,
|
||||
commentBody,
|
||||
);
|
||||
comment_url = await upsertComment(octokit, {
|
||||
comment_id: comment?.id,
|
||||
issue_number: pullRequestId,
|
||||
owner,
|
||||
repo,
|
||||
body: commentBody,
|
||||
});
|
||||
} else {
|
||||
info(`DRY_RUN: Comment body: ${commentBody}`);
|
||||
comment_url = "";
|
||||
@@ -603,18 +538,18 @@ export const run = async () => {
|
||||
: INVALID_REVIEW_COMMENT(comment_url);
|
||||
if (!DRY_RUN) {
|
||||
await addReview(
|
||||
OCTOKIT,
|
||||
PULL_REQUEST_ID,
|
||||
OWNER,
|
||||
REPO,
|
||||
octokit,
|
||||
pullRequestId,
|
||||
owner,
|
||||
repo,
|
||||
reviewState,
|
||||
reviewReason,
|
||||
);
|
||||
await addRemoveLabel(
|
||||
OCTOKIT,
|
||||
PULL_REQUEST_ID,
|
||||
OWNER,
|
||||
REPO,
|
||||
octokit,
|
||||
pullRequestId,
|
||||
owner,
|
||||
repo,
|
||||
"invalid",
|
||||
!themesValid,
|
||||
);
|
||||
@@ -626,20 +561,18 @@ export const run = async () => {
|
||||
debug("Set review state to `REQUEST_CHANGES` and add `invalid` label...");
|
||||
if (!DRY_RUN) {
|
||||
await addReview(
|
||||
OCTOKIT,
|
||||
PULL_REQUEST_ID,
|
||||
OWNER,
|
||||
REPO,
|
||||
octokit,
|
||||
pullRequestId,
|
||||
owner,
|
||||
repo,
|
||||
"REQUEST_CHANGES",
|
||||
"**Something went wrong in the theme preview action:** `" +
|
||||
error.message +
|
||||
"`",
|
||||
error.message,
|
||||
);
|
||||
await addRemoveLabel(
|
||||
OCTOKIT,
|
||||
PULL_REQUEST_ID,
|
||||
OWNER,
|
||||
REPO,
|
||||
octokit,
|
||||
pullRequestId,
|
||||
owner,
|
||||
repo,
|
||||
"invalid",
|
||||
true,
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user