UNPKG

create-chuntianxiaozhu

Version:

春天小猪模板工具

223 lines (202 loc) 5.42 kB
import { Request } from 'express'; import * as fs from 'fs'; import { resolve } from 'path'; import { v4 as uuidv4 } from 'uuid'; import * as puppeteer from 'puppeteer'; import { execa } from './async_import'; /** * 构建数据文件 */ export function buildDataFile( data: string, businessType: string, dataPath: string, fileName?: string, ) { if (!fileName) { fileName = uuidv4().replaceAll('-', ''); } if (fileName.indexOf('.json') == -1) { fileName += '.json'; } if (!fs.existsSync(`${dataPath}/${businessType}`)) { fs.mkdirSync(`${dataPath}/${businessType}`); } fs.writeFileSync(`${dataPath}/${businessType}/${fileName}`, data); } /** * 从request中获取userId * @param req * @returns */ export function getUid(req: Request) { const user = req['user'] || {}; const id = user.sub; return id; } /** * git提交commit */ export async function gitSubCommit( cwd: string, msg: string = '"feat: 增加数据"', ) { // 全部提交到暂存区 await execa.execa('git add -A', { cwd, shell: true, }); // 生成commit const args = ['-m', msg]; await execa .execa('git commit', args, { cwd, shell: true, }) .catch(() => {}); } /** * git pull push */ export async function gitPullPush(cwd: string) { // 拉一下代码,采用pull --rebase await execa.execa('git pull --rebase origin master', { cwd, shell: true, }); // 推代码 await execa.execa('git push origin master', { cwd, shell: true, }); } /** * gitee热更新 */ export async function giteeHotUpdate(projectName: string) { const browser = await puppeteer.launch({ // 此处可以使用 false 有头模式进行调试, 调试完注释即可 // headless: false, args: ['--no-sandbox'], }); const page = await browser.newPage(); await page.goto('https://gitee.com/login'); // 1. 获取账号input,自动输入 const accountElements = await page.$x('//*[@id="user_login"]'); // 🚨需要设置为自己的gitee账户🚨 await accountElements[0].type('13554468370'); // 2. 获取密码input,自动输入 const pwdElements = await page.$x('//*[@id="user_password"]'); // 🚨需要设置自己的gitee密码🚨 await pwdElements[0].type('lzh001520258'); // 3. 获取登录按钮,触发点击事件 const loginButtons = await page.$x( '//*[@class="git-login-form-fields"]/div[4]/input', ); await (loginButtons[0] as any).click(); // 4. 等待登录成功 await page.waitForTimeout(1000); // 🚨需要设置自己的gitee pages页面🚨 await page.goto(`https://gitee.com/ctxzl/${projectName}/pages`, { waitUntil: 'domcontentloaded', }); // 5. 监听触发的确认弹框,并点击确认 await page.on('dialog', async (dialog) => { dialog.accept(); }); await page.waitForXPath('//*[@id="pages-branch"]/div[6]'); // 6. 点击更新按钮,并弹出确认弹窗 const updateButtons = await page.$x('//*[@id="pages-branch"]/div[6]'); await (updateButtons[0] as any).click(); await page.waitForTimeout(2000); // 8.更新完毕,关闭浏览器 browser.close(); } const taskMap = {}; export function queueTask(interval, callback) { let lastTime = 0; let timer = null; return (force, ...params) => { if (force) { callback(...params); return; } const now = Date.now(); if (now - lastTime > interval) { // 如果当前时间减去上次间隔的时间已经大于间隔的时间则立即执行 if (timer) { // 如果有定时器或者定时器正在执行则直接返回 return; } lastTime = now; callback(...params); } else { // 否则设置定时器到下一个节点执行,如果前面已经有过定时器则不用在继续 if (timer) { return; } timer = setTimeout( () => { callback(...params); lastTime = Date.now(); timer = null; }, interval - now + lastTime, ); } }; } export const giteeHotUpdateTask = queueTask(300000, giteeHotUpdate); /** * 任务定制器缓存 * @param interval * @param callback * @param params * @returns */ export function queueTaskRun(interval, callback) { if (!taskMap[callback]) { taskMap[callback] = queueTask(interval, callback); } return taskMap[callback]; } export function getDate(date = new Date()) { date.getMilliseconds(); return { year: date.getFullYear(), month: date.getMonth() + 1, date: date.getDate(), hour: date.getHours(), minutes: date.getMinutes(), seconds: date.getSeconds(), milliseconds: date.getMilliseconds(), }; } export function frontDay(n) { const timeStamp = Date.now(); const frontTimeStamp = timeStamp - n * 86400000; return frontTimeStamp; } export function backDay(n) { const timeStamp = Date.now(); const backTimeStamp = timeStamp + n * 86400000; return backTimeStamp; } export function removeStaticFile(fileDir: 'screenshot', fileName: string) { fs.rmSync(resolve(__dirname, `../../${fileDir}`, fileName)); } /** * 从脚本中获取 * @param scriptText * @param varName * @returns */ export function getVarFromScript(scriptText, varName) { let value = null; try { value = eval(`(function anonymous() {${scriptText} return ${varName};})()`); } catch { return value; } return value; }