tiny-app-cli
Version:
自动提审与发布微信、支付宝小程序, 更好的实现小程序的CI/CD
2 lines (1 loc) • 9.41 kB
JavaScript
import{program as E,Option as p}from"commander";import v from"node:process";import{red as f,yellow as h,reset as A,green as I,blue as O,bgGreen as R}from"kolorist";import B from"prompts";import L from"puppeteer";import T from"ora";import D from"node:path";import j from"node:fs";import{fileURLToPath as P}from"node:url";import $ from"qrcode-terminal";import V from"jsqr";import b from"upng-js";const N="tiny-app-cli",W="0.4.1",U="\u81EA\u52A8\u63D0\u5BA1\u4E0E\u53D1\u5E03\u5FAE\u4FE1\u3001\u652F\u4ED8\u5B9D\u5C0F\u7A0B\u5E8F, \u66F4\u597D\u7684\u5B9E\u73B0\u5C0F\u7A0B\u5E8F\u7684CI/CD",X="https://mp.weixin.qq.com/";var w=(u=>(u.WEIXIN="weixin",u.ALIPAY="alipay",u))(w||{}),_=(u=>(u.REVIEW="review",u.RELEASE="release",u))(_||{}),M=(u=>(u.TRUE="true",u.FALSE="false",u))(M||{});const g={width:1920,height:1080,deviceScaleFactor:1.5},C=v.env.NODE_ENV==="development",G=D.dirname(P(import.meta.url));function y(...u){return D.resolve(G,...u)}async function k(u){return new Promise((t,o)=>{const a=b.decode(j.readFileSync(u)),i=V(new Uint8ClampedArray(b.toRGBA8(a)[0]),a.width,a.height);i?$.generate(i.data,{small:!0},c=>{t(c)}):o(new Error("QR code not found"))})}function l(u=500){return new Promise(t=>{setTimeout(t,u)})}function S(u){return u==null?!0:typeof u=="string"||Array.isArray(u)?u.length===0:typeof u=="object"?Object.keys(u).length===0:!1}function H(u){return u==="true"?!0:u==="false"?!1:u}function Q(u){return u.headless=H(u.headless),u}function x(){throw new Error(`${f("\u2716")} Operation cancelled`)}let F,e,n,m;async function Y(u=m){n=T("\u6B63\u5728\u83B7\u53D6\u767B\u5F55\u4E8C\u7EF4\u7801...").start(),F=await L.launch({headless:C?!1:u.headless}),e=await F.newPage(),await e.setViewport(g),await e.goto(X);const t=".login_frame.input_login",o=await e.waitForSelector(t);await e.evaluate(()=>new Promise((d,r)=>{const s=document.querySelector(".login__type__container__scan__qrcode");s?(s.onload=()=>d(),s.onerror=r):r(new Error("\u767B\u5F55\u5931\u8D25"))}));const a=y("../cache/login-qr.png"),i=async()=>{await o?.screenshot({path:a,type:"png"});try{return await k(a)}catch{return await l(),i()}},c=await i();n.succeed(h("\u8BF7\u4F7F\u7528\u5FAE\u4FE1\u626B\u63CF\u4E8C\u7EF4\u7801\u767B\u5F55\u5FAE\u4FE1\u516C\u4F17\u5E73\u53F0")),console.log(c),await e.waitForSelector(".weui-desktop-icon.weui-desktop-icon__success.weui-desktop-icon__large",{timeout:0}),n.succeed("\u626B\u7801\u6210\u529F")}async function z(){if(n.start("\u6B63\u5728\u8DF3\u8F6C\u5230\u7248\u672C\u7BA1\u7406\u9875\u9762..."),!await e.waitForSelector(".menu_item .tab-bar__wrap.tab-bar__wrap--submenu",{timeout:0}))throw n.fail("\u672A\u627E\u5230\u7248\u672C\u7BA1\u7406"),new Error("\u672A\u627E\u5230\u7248\u672C\u7BA1\u7406");n.start("\u6B63\u5728\u8DF3\u8F6C\u5230\u7248\u672C\u7BA1\u7406\u9875\u9762...");const u=new URL(e.url()).searchParams.get("token");await e.goto(`https://mp.weixin.qq.com/wxamp/wacodepage/getcodepage?token=${u}&lang=zh_CN`)}async function q(){const u=".mod_default_box.code_version_dev .code_version_log .weui-desktop-btn.weui-desktop-btn_primary";let t=await e.waitForSelector(u);const o=await e.$$(".mod_default_box.code_version_dev .code_version_log");if(o.length>1)for await(const a of o)await a.evaluate(i=>i.querySelector(".js_show_exp_version")!==null)&&(t=await a.$(".weui-desktop-btn.weui-desktop-btn_primary"));return t}async function J(){let u=await q();if(!u)throw n.fail("\u672A\u627E\u5230\u63D0\u4EA4\u5BA1\u6838\u6309\u94AE"),new Error("\u672A\u627E\u5230\u63D0\u4EA4\u5BA1\u6838\u6309\u94AE");const t=await u.evaluate(r=>r.classList.contains("weui-desktop-btn_disabled")),o=await e.$(".mod_default_bd.default_box.test_version");if(o&&!await o.evaluate(r=>r.textContent?.includes("\u4F60\u6682\u65E0\u63D0\u4EA4\u5BA1\u6838\u7684\u7248\u672C\u6216\u8005\u7248\u672C\u5DF2\u53D1\u5E03\u4E0A\u7EBF"))&&!m.forceSubmit)if(n.stop(),(await B([{type:"confirm",name:"forceSubmit",message:"\u5F53\u524D\u5DF2\u5B58\u5728\u7248\u672C\uFF0C\u662F\u5426\u7EE7\u7EED\u5F3A\u5236\u63D0\u4EA4\u5BA1\u6838\uFF1F",initial:!1}],{onCancel:x})).forceSubmit)n.start();else throw new Error("\u9000\u51FA\u63D0\u5BA1");t&&(await e.evaluate(()=>{document.querySelector(".mod_default_bd.default_box.test_version .weui-desktop-dropdown__list-ele__text").click()}),await l(),await(await e.$("body > div:nth-child(9) > div.weui-desktop-dialog__wrp.self-weui-modal > div > div.weui-desktop-dialog__ft > div > div:nth-child(2) > button"))?.click(),await l(2e3),u=await q()),await u.click(),n.start("\u6B63\u5728\u63D0\u4EA4\u5BA1\u6838\u4E2D...");const a=await e.waitForSelector(".weui-desktop-icon-checkbox",{visible:!0}),i=await e.waitForSelector(".code_submit_dialog .weui-desktop-btn.weui-desktop-btn_primary",{visible:!0});if(!a||!i)throw new Error("\u672A\u627E\u9605\u8BFB\u5E76\u4E86\u89E3\u5E73\u53F0\u5BA1\u6838\u89C4\u5219");await a.click(),await i.click(),await e.evaluate(()=>{const r=[...document.querySelectorAll(".weui-desktop-dialog")].reverse();for(const s of r)if(s.querySelector("h4")?.textContent==="\u4EE3\u7801\u5BA1\u6838\u8FDB\u884C\u5B89\u5168\u6D4B\u8BD5\u63D0\u9192"){s.querySelector(".weui-desktop-btn_primary")?.click();break}}),await l(1e3),await e.close(),await l(1e3);const c=await F.pages();let d=!1;for(const r of c)if(r.url().includes("wxamp/wadevelopcode/get_class")){e=r,d=!0;break}if(e.setViewport(g),!d)throw new Error("\u83B7\u53D6\u63D0\u4EA4\u5BA1\u6838\u9875\u9762\u5931\u8D25")}async function K(){const u=await e.waitForSelector(".btn_primary");if(await l(200),!u)throw new Error("\u83B7\u53D6\u63D0\u4EA4\u5BA1\u6838\u5931\u8D25");if(await u.click(),await e.waitForSelector(".msg_icon_wrp .icon_msg.success"),(await e.evaluate(()=>document.querySelector(".msg_content")?.innerHTML))?.includes("\u5DF2\u63D0\u4EA4\u5BA1\u6838"))n.succeed("\u63D0\u4EA4\u5BA1\u6838\u6210\u529F");else throw new Error("\u63D0\u4EA4\u5BA1\u6838\u5931\u8D25")}async function Z(){const u=await e.waitForSelector("#js_container_box > div.col_main > div > div:nth-child(4) > div.main_bd > span > div.code_mod.mod_default_box.code_version_test > div.mod_default_bd.default_box.test_version > div > div > div.code_version_log_hd > div > p:nth-child(3) > span"),t=await e.evaluate(i=>i?.innerHTML,u);if(t!=="\u5BA1\u6838\u901A\u8FC7\u5F85\u53D1\u5E03")throw n.fail(t),new Error(t);await(await e.waitForSelector("#js_container_box > div.col_main > div > div:nth-child(4) > div.main_bd > span > div.code_mod.mod_default_box.code_version_test > div.mod_default_bd.default_box.test_version > div > div > div.code_version_log_ft > div > div.weui-desktop-popover__wrp > span > div > button"))?.click(),await(await e.waitForSelector("#js_container_box > div.col_main > div > div:nth-child(4) > div:nth-child(9) > div.weui-desktop-dialog__wrp.self-weui-modal > div > div.weui-desktop-dialog__ft > div > div:nth-child(1) > button"))?.click();const o=y("../cache/release.png"),a=await e.waitForSelector("#js_container_box > div.col_main > div > div:nth-child(4) > div.qrcheck_dialog_simple > div.weui-desktop-dialog__wrp.self-weui-modal > div > div.weui-desktop-dialog__bd > div > div > div > div.weui-desktop-qrcheck__qrcode-area > div > img");await e.evaluate(i=>new Promise((c,d)=>{i?(i.onload=c,i.onerror=d):d(new Error("\u83B7\u53D6\u53D1\u5E03\u4E8C\u7EF4\u7801\u5931\u8D25"))}),a),await a?.screenshot({path:o,type:"png"}),n.clear(),console.clear(),n.succeed(h("\u8BF7\u4F7F\u7528\u5FAE\u4FE1\u626B\u63CF\u4E8C\u7EF4\u7801\u53D1\u5E03")),console.log(await k(o)),await e.waitForSelector("#js_container_box > div.col_main > div > div:nth-child(4) > div.main_bd > span > div.code_mod.mod_default_box.code_version_test > div.mod_default_bd.default_box.test_version > div > div > p")&&n.succeed("\u53D1\u5E03\u6210\u529F")}async function uu(u){m=u;try{await Y(),await z(),m.action===_.REVIEW?(await J(),await K()):await Z(),v.exit(0)}catch(t){if(C){console.error(t);return}v.exit(1)}}async function eu(u){const t=await B([{type:S(u.platform)?"select":null,message:A("\u8BF7\u9009\u62E9\u53D1\u5E03\u5E73\u53F0"),name:"platform",choices:[{title:I("\u5FAE\u4FE1"),description:"\u767B\u5F55\u5FAE\u4FE1\u516C\u4F17\u5E73\u53F0",value:w.WEIXIN},{title:O("\u652F\u4ED8\u5B9D"),description:"\u767B\u5F55\u652F\u4ED8\u5B9D\u516C\u4F17\u5E73\u53F0",value:w.ALIPAY}],initial:0},{type:S(u.action)?"select":null,message:A("\u60A8\u662F\u63D0\u4EA4\u5BA1\u6838\u8FD8\u662F\u53D1\u5E03\uFF1F"),name:"action",choices:[{title:"\u63D0\u5BA1",description:"\u63D0\u5BA1\u5C0F\u7A0B\u5E8F",value:_.REVIEW},{title:f("\u53D1\u5E03"),description:"\u53D1\u5E03\u5C0F\u7A0B\u5E8F",value:_.RELEASE}],initial:0}],{onCancel:x}),o={...u,...t};o.platform===w.WEIXIN?await uu(o):console.log(R("\u6B63\u5728\u5F00\u53D1\u4E2D..."))}E.name(N).version(W).description(U).addOption(new p("-p, --platform <platform>","\u64CD\u4F5C\u7684\u5E73\u53F0").choices(Object.values(w))).addOption(new p("-a, --action <action>","\u63D0\u5BA1\u6216\u8005\u53D1\u5E03").choices(Object.values(_))).addOption(new p("-f, --force-submit","\u5982\u679C\u5B58\u5728\u3010\u5BA1\u6838\u4E2D\u3011\u6216\u3010\u5BA1\u6838\u901A\u8FC7\u3011\u7684\u7248\u672C\uFF0C\u8FD9\u5C06\u5F3A\u5236\u63D0\u4EA4\u65B0\u7684\u5BA1\u6838\u7248\u672C")).addOption(new p("-hl, --headless [headless]","\u6D4F\u89C8\u5668\u65E0\u5934\u6A21\u5F0F").default("new").choices(["false","new"])),E.parse();const tu=Q(E.opts());eu(tu).catch(u=>{console.error(u)});