leetcode-tools
Version:
A cli tool to enjoy leetcode!
206 lines (205 loc) • 9.29 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.GetSubmissions = exports.Submit = exports.Code = exports.DownloadProblem = exports.Pull = exports.New = void 0;
const Constant = __importStar(require("./constant"));
const leetcode_api_typescript_1 = require("leetcode-api-typescript");
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
const ErrorMsg = __importStar(require("./errorMsg"));
const log_1 = __importDefault(require("./log"));
const interface_1 = require("./interface");
const utils_1 = require("./utils");
async function New(slug, dst) {
const problem = await leetcode_api_typescript_1.Problem.build(slug);
const targetDirName = `${problem.frontendId}.${problem.slug}`;
dst = path.join(dst, targetDirName);
if (fs.existsSync(dst)) {
throw new Error(`${ErrorMsg.DestinationAlreadyExists}. [dst=${dst}]`);
}
fs.mkdirSync(dst, { recursive: true });
await DownloadProblem(problem, dst);
}
exports.New = New;
async function Pull(slug, dst) {
const problem = await leetcode_api_typescript_1.Problem.build(slug);
await DownloadProblem(problem, dst);
}
exports.Pull = Pull;
async function DownloadProblem(problem, dst) {
const problemAssetsPath = path.join(dst, Constant.ProblemAssetsName);
if (fs.existsSync(problemAssetsPath)) {
log_1.default.Warn(`${ErrorMsg.DestinationAlreadyExists}, will be removed. [dst=${problemAssetsPath}]`);
fs.rmSync(problemAssetsPath, { recursive: true });
}
fs.mkdirSync(problemAssetsPath, { recursive: true });
const problemContent = JSON.parse(JSON.stringify(problem));
const contentImages = await problem.getContentImages();
const downloadImages = (mp, content) => {
for (const key of mp.keys()) {
const replaceKey = key.replace(/\//g, "-");
content = content.replace(key, path.join(Constant.ProblemAssetsName, replaceKey));
const downloadPath = path.join(problemAssetsPath, replaceKey);
fs.writeFileSync(downloadPath, mp.get(key), "binary");
log_1.default.Info(`download image successfully. [url=${key}, downloadPath=${downloadPath}]`);
}
return content;
};
if (contentImages.content) {
problemContent.content = downloadImages(contentImages.content, problemContent.content);
}
if (contentImages.translatedContent) {
problemContent.translatedContent = downloadImages(contentImages.translatedContent, problemContent.translatedContent);
}
const problemJsonPath = path.join(problemAssetsPath, "problem.json");
fs.writeFileSync(problemJsonPath, JSON.stringify(problemContent), "utf-8");
log_1.default.Info(`download problem.json successfully. [path=${problemJsonPath}]`);
await (async () => {
const StatementPath = (locale) => {
return path.join(dst, (0, interface_1.StatementFileName)(locale));
};
(() => {
for (const locale in interface_1.LocaleEnum) {
const statementPath = StatementPath(locale);
if (fs.existsSync(statementPath)) {
log_1.default.Warn(`${ErrorMsg.DestinationAlreadyExists}, will be removed. [dst=${statementPath}`);
fs.rmSync(statementPath);
}
}
})();
const getProblemLink = (localeEnum) => {
const getBase = () => {
switch (localeEnum) {
case interface_1.LocaleEnum.en_US:
return leetcode_api_typescript_1.Config.uri.us.base;
case interface_1.LocaleEnum.zh_CN:
return leetcode_api_typescript_1.Config.uri.cn.base;
}
};
const getTitle = () => {
switch (localeEnum) {
case interface_1.LocaleEnum.en_US:
return problemContent.title;
case interface_1.LocaleEnum.zh_CN:
return problemContent.translatedTitle;
}
};
return `- Link: [${getTitle()}](${getBase()}problems/${problemContent.slug})`;
};
const getProblemDifficulty = () => {
return `- Difficulty: ${leetcode_api_typescript_1.ProblemDifficulty[problemContent.difficulty]}`;
};
const getProblemTag = (localeEnum) => {
const getTag = (t) => {
switch (localeEnum) {
case interface_1.LocaleEnum.en_US:
return t.name;
case interface_1.LocaleEnum.zh_CN:
return t.translatedName;
}
};
return `- Tag: ${problemContent.tag
.map((t) => `\`${getTag(t)}\``)
.join(" ")}`;
};
const getStatement = (localeEnum) => {
const getContent = () => {
switch (localeEnum) {
case interface_1.LocaleEnum.en_US:
return problemContent.content;
case interface_1.LocaleEnum.zh_CN:
return problemContent.translatedContent;
}
};
return `
??? info "Metadata"
${getProblemLink(localeEnum)}
${getProblemDifficulty()}
${getProblemTag(localeEnum)}
${getContent()}`;
};
if (problemContent.content) {
const statementPath = StatementPath(interface_1.LocaleEnum.en_US);
fs.writeFileSync(StatementPath(interface_1.LocaleEnum.en_US), getStatement(interface_1.LocaleEnum.en_US));
log_1.default.Info(`pull statement successfully. [path=${statementPath}]`);
}
if (problemContent.translatedContent) {
const statementPath = StatementPath(interface_1.LocaleEnum.zh_CN);
fs.writeFileSync(statementPath, getStatement(interface_1.LocaleEnum.zh_CN));
log_1.default.Info(`pull statement successfully. [path=${statementPath}]`);
}
})();
}
exports.DownloadProblem = DownloadProblem;
async function Code(slug, langSlug, template, dst) {
const problem = await leetcode_api_typescript_1.Problem.build(slug);
for (const codeSnippet of problem.codeSnippets ?? []) {
if (codeSnippet.langSlug === leetcode_api_typescript_1.LangSlug[langSlug]) {
if (fs.existsSync(dst)) {
throw new Error(`${ErrorMsg.DestinationAlreadyExists}. [dst=${dst}]`);
}
fs.writeFileSync(dst, template.replace((0, interface_1.CodeTemplateReplaceContent)(langSlug), codeSnippet.code));
log_1.default.Info(`generate code successfully. [dst=${dst}]`);
return;
}
}
throw new Error(`${ErrorMsg.UnsupportedLangslugType}. [langSlug=${langSlug}]`);
}
exports.Code = Code;
async function Submit(slug, langSlug, code) {
const problem = await leetcode_api_typescript_1.Problem.build(slug);
const submission = await problem.submit(langSlug, code);
log_1.default.Info(`submit successfully. [slug=${slug}, langSlug=${leetcode_api_typescript_1.LangSlug[langSlug]}]`);
for (let i = 0; i < 3; i++) {
await submission.detail();
if (submission.statusDisplay === "") {
(0, utils_1.Sleep)(500);
continue;
}
}
console.table(getSubmissionDisplay(submission));
}
exports.Submit = Submit;
async function GetSubmissions(slug) {
const problem = await leetcode_api_typescript_1.Problem.build(slug);
const submissions = await problem.getSubmissions();
console.table(submissions.map((s) => getSubmissionDisplay(s)));
}
exports.GetSubmissions = GetSubmissions;
function getSubmissionDisplay(submission) {
return {
id: submission.id,
lang: submission.lang,
runtime: submission.runtime,
memory: submission.memory,
status: submission.statusDisplay,
timestamp: new Date(submission.timestamp * 1000).toLocaleString(),
submissionUrl: submission.sourceUrl,
};
}
//# sourceMappingURL=problem.js.map