Compare commits

..
Author SHA1 Message Date
Zohan Subhash d0cb83cfd2 Update wakatime.js 2023-03-01 13:03:51 +05:30
Zohan Subhash 7b87177734 Update top-langs.js 2023-03-01 13:03:38 +05:30
Zohan Subhash 7e30ca6cc0 Update pin.js 2023-03-01 13:03:26 +05:30
Zohan Subhash 22a201df41 Update index.js 2023-03-01 13:02:52 +05:30
7 changed files with 68 additions and 127 deletions
+2
View File
@@ -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(
+2
View File
@@ -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 -2
View File
@@ -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
View File
@@ -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.
+2
View File
@@ -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(
+2
View File
@@ -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
View File
@@ -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,
);