UNPKG

leetcode-tools

Version:
206 lines (205 loc) 9.29 kB
"use strict"; 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