提交 faa45e73 编写于 作者: fxy060608's avatar fxy060608

feat(automator): UNI_AUTOMATOR_PORT

上级 dca594c7
此差异已折叠。
"use strict";var e=require("os"),t=require("path"),s=require("debug"),a=require("licia/isWindows"),r=require("fs"),o=require("child_process"),n=require("licia/sleep"),i=require("licia/toStr"),c=require("licia/waitUntil"),l=require("licia/concat"),u=require("licia/getPort"),p=require("licia/dateFormat"),d=require("ws"),m=require("events"),f=require("licia/uuid"),h=require("licia/stringify");function g(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var w=g(e),y=g(t),E=g(s),v=g(a),b=g(r),P=g(o),j=g(n),M=g(i),O=g(c),$=g(l),q=g(u),C=g(p),S=g(d),A=g(f),T=g(h);const L=/(^[a-z][a-z0-9-]*)/i,H=/^navigator/i,k=/^swan-nav$/i;var R;!function(e){e.SELECTOR="selector",e.TAGNAME="tagName"}(R||(R={}));const N={[R.SELECTOR]:[{test:H,processor:e=>e.replace(H,"nav")},{test:L,processor:e=>`swan-${e}`}],[R.TAGNAME]:[{test:k,processor:e=>e.replace(k,"swan-navigator")},{test:L,processor:e=>e.toLocaleLowerCase().replace("swan-","")}]},x=e=>t=>{const s=(N[e]||[]).filter((e=>e.test.test(t)));for(const e of s)t=e.processor(t);return t},D=x(R.SELECTOR),F=x(R.TAGNAME),I=e=>Object.assign({},e,{type:"id",info:{id:e.elementId}});/^win/.test(process.platform);class W extends m.EventEmitter{constructor(e){super(),this.ws=e,this.ws.addEventListener("message",(e=>{this.emit("message",e.data)})),this.ws.addEventListener("close",(()=>{this.emit("close")}))}send(e){this.ws.send(e)}close(){this.ws.close()}}const B=new Map,G=new Map,z="Connection closed";class J extends m.EventEmitter{constructor(e,t,s){super(),this.puppet=t,this.namespace=s,this.callbacks=new Map,this.transport=e,this.debug=E.default("automator:protocol:"+this.namespace),this.onMessage=e=>{var t,s;this.debug(`${C.default("yyyy-mm-dd HH:MM:ss:l")} ◀ RECV ${e}`);const{id:a,method:r,error:o,result:n,params:i}=JSON.parse(e);if(null===(t=null==n?void 0:n.method)||void 0===t?void 0:t.startsWith("on"))return void((e,t,s)=>{const a=B.get(e);(null==a?void 0:a.has(t))&&a.get(t)(s)})(n.method,a,n);if(null===(s=null==n?void 0:n.method)||void 0===s?void 0:s.startsWith("Socket.")){return void((e,t,s)=>{const a=G.get(t);(null==a?void 0:a.has(e))&&a.get(e)(s)})(n.method.replace("Socket.",""),n.id,n.data)}if(!a)return this.puppet.emit(r,i);const{callbacks:c}=this;if(a&&c.has(a)){const e=c.get(a);c.delete(a),o?e.reject(Error(o.message||o.detailMessage)):e.resolve(n)}},this.onClose=()=>{this.callbacks.forEach((e=>{e.reject(Error(z))}))},this.transport.on("message",this.onMessage),this.transport.on("close",this.onClose)}send(e,t={},s=!0){if(s&&this.puppet.adapter.has(e))return this.puppet.adapter.send(this,e,t);const a=A.default(),r=T.default({id:a,method:e,params:t});return this.debug(`${C.default("yyyy-mm-dd HH:MM:ss:l")} SEND ► ${r}`),new Promise(((e,t)=>{try{this.transport.send(r)}catch(e){t(Error(z))}this.callbacks.set(a,{resolve:e,reject:t})}))}dispose(){this.transport.close()}static createDevtoolConnection(e,t){return new Promise(((s,a)=>{const r=new S.default(e);r.addEventListener("open",(()=>{s(new J(new W(r),t,"devtool"))})),r.addEventListener("error",a)}))}static createRuntimeConnection(e,t,s){return new Promise(((a,r)=>{E.default("automator:runtime")(`${C.default("yyyy-mm-dd HH:MM:ss:l")} port=${e}`);const o=new S.default.Server({port:e});O.default((async()=>{if(t.runtimeConnection)return!0}),s,1e3).catch((()=>{o.close(),r("Failed to connect to runtime, please make sure the project is running")})),o.on("connection",(function(e){E.default("automator:runtime")(`${C.default("yyyy-mm-dd HH:MM:ss:l")} connected`);const s=new J(new W(e),t,"runtime");t.setRuntimeConnection(s),a(s)})),t.setRuntimeServer(o)}))}}const U=E.default("automator:devtool");async function V(e,t,s){const{port:a,cliPath:r,timeout:o,cwd:n="",account:i="",args:c=[],launch:l=!0}=t;let u=!1,p=!1;if(!1!==l){const t={stdio:"ignore"};n&&(t.cwd=n);let s=$.default(c,[]);s=$.default(s,["--auto"]),s=$.default(s,[e,"--auto-port",M.default(a)]),i&&(s=$.default(s,["--auto-account",i]));try{U("%s %o %o",r,s,t);const e=P.default.spawn(r,s,t);e.on("error",(e=>{u=!0})),e.on("exit",(()=>{setTimeout((()=>{p=!0}),15e3)})),e.unref()}catch(e){u=!1}}else setTimeout((()=>{p=!0}),15e3);const d=await O.default((async()=>{try{if(u||p)return!0;const e=await async function(e,t){let s;try{s=await J.createDevtoolConnection(e.wsEndpoint,t)}catch(t){throw Error(`Failed connecting to ${e.wsEndpoint}, check if target project window is opened with automation enabled`)}return s}({wsEndpoint:`ws://127.0.0.1:${a}`},s);return e}catch(e){}}),o,1e3);if(u)throw Error(`Failed to launch ${s.devtools.name}, please make sure cliPath is correctly specified`);if(p)throw Error(`Failed to launch ${s.devtools.name} , please make sure http port is open`);return await j.default(5e3),U(`${C.default("yyyy-mm-dd HH:MM:ss:l")} connected`),d}const _=[];["","-rc"].forEach((e=>{v.default?(_.push(y.default.join(w.default.homedir(),`AppData/Local/Programs/swan-ide-gui${e}/cli.bat`)),_.push(`C:/Program Files/swan-ide-gui${e}/cli.bat`)):_.push(`/Applications/百度开发者工具${e}.app/Contents/MacOS/cli`)}));const K={devtools:{name:"Baidu DevTools",remote:!0,automator:!0,paths:_,required:["project.swan.json","app.json","app.js"],defaultPort:9430,validate:async function(e,t){const s=function(e,t){const s=t.devtools.paths.slice(0);e&&s.unshift(e);for(const e of s)if(b.default.existsSync(e))return e;throw Error(`${t.devtools.name} not found, please specify executablePath option`)}(e.executablePath,t);let a=e.port||t.devtools.defaultPort;if(!1!==e.launch)try{a=await async function(e,t){const s=await q.default(e||t);if(e&&s!==e)throw Error(`Port ${e} is in use, please specify another port`);return s}(a)}catch(t){e.launch=!1}else{a===await q.default(a)&&(e.launch=!0)}return Object.assign(Object.assign({},e),{port:a,cliPath:s})},async create(e,t,s){const a=await V(e,t,s);return s.compiled?E.default("automator:devtool")("Waiting for runtime automator"):(E.default("automator:devtool")("initRuntimeAutomator"),a.send("smartapp.swan",{api:"$$initRuntimeAutomator",params:[]})),a}},adapter:{"Tool.enableRemoteDebug":{reflect:async e=>({qrCode:(await e("Tool.enablePreview")).url})},"App.exit":{reflect:async()=>Promise.resolve()},"Page.getElement":{reflect:async(e,t)=>(await e("Page.getElements",t)).elements[0]},"Page.getElements":{reflect:async(e,t)=>{return{elements:(await e("smartapp.element.getBySelector",Object.assign(Object.assign({},t),{properties:["id","tagName"],selector:(s=t.selector,s.split(" ").map((e=>D(e))).join(" "))}))).map((e=>{const t=e.properties;return{elementId:t.id,nodeId:t.id,tagName:F(t.tagName)}}))};var s}},"Page.getWindowProperties":{reflect:async(e,t)=>{const s=t.names.map((e=>e.replace("document.documentElement.",""))),a=(await e("smartapp.element.getBySelector",{properties:s,selector:"html"}))[0];return{properties:s.map((e=>a.properties[e]))}}},"Element.getHTML":{reflect:async(e,t)=>{const s=[t.type+"HTML"];return{html:(await e("Element.getDOMProperties",Object.assign(Object.assign({},t),{names:s}))).properties[0]}}},"Element.getElement":{reflect:async(e,t)=>(await e("Element.getElements",t)).elements[0]},"Element.getElements":{reflect:async(e,t)=>{const{elements:s}=await e("Page.getElements",Object.assign(Object.assign({},t),{selector:`#${t.elementId} ${t.selector}`}));return s.forEach((e=>{e.nodeId=e.id})),{elements:s}}},"Element.getAttributes":{reflect:async(e,t)=>{const s=[];for(const a of t.names)s.push(await e("smartapp.element.getAttribute",Object.assign({attribute:a},t)));return{attributes:s}},params:I},"Element.getStyles":{reflect:async(e,t)=>{const s=[];for(const a of t.names)s.push(await e("smartapp.element.getComputedStyle",Object.assign({style:a},t)));return{styles:s}},params:I},"Element.getDOMProperties":{reflect:async(e,t)=>{const s=[];for(const a of t.names)s.push(await e("smartapp.element.getProperty",Object.assign({property:a},t)));return{properties:s}},params:I},"Element.getProperties":{reflect:async(e,t)=>{const s=[];for(const a of t.names)s.push(await e("smartapp.element.getAttribute",Object.assign({attribute:a},t)));return{properties:s}},params:I},"Element.getOffset":{reflect:async(e,t)=>({left:await e("smartapp.element.getProperty",Object.assign({property:"offsetLeft"},t)),top:await e("smartapp.element.getProperty",Object.assign({property:"offsetTop"},t))}),params:I},"Element.tap":{reflect:"smartapp.element.touch",params:I}}};module.exports=K;
"use strict";var e=require("os"),t=require("path"),s=require("debug"),a=require("licia/isWindows"),r=require("fs"),o=require("child_process"),n=require("licia/sleep"),i=require("licia/toStr"),c=require("licia/waitUntil"),l=require("licia/concat"),u=require("licia/getPort"),p=require("licia/dateFormat"),d=require("ws"),m=require("events"),f=require("licia/uuid"),h=require("licia/stringify");function g(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var w=g(e),y=g(t),E=g(s),v=g(a),b=g(r),P=g(o),j=g(n),M=g(i),O=g(c),$=g(l),q=g(u),C=g(p),S=g(d),A=g(f),T=g(h);const L=/(^[a-z][a-z0-9-]*)/i,H=/^navigator/i,k=/^swan-nav$/i;var R;!function(e){e.SELECTOR="selector",e.TAGNAME="tagName"}(R||(R={}));const N={[R.SELECTOR]:[{test:H,processor:e=>e.replace(H,"nav")},{test:L,processor:e=>`swan-${e}`}],[R.TAGNAME]:[{test:k,processor:e=>e.replace(k,"swan-navigator")},{test:L,processor:e=>e.toLocaleLowerCase().replace("swan-","")}]},x=e=>t=>{const s=(N[e]||[]).filter((e=>e.test.test(t)));for(const e of s)t=e.processor(t);return t},D=x(R.SELECTOR),F=x(R.TAGNAME),I=e=>Object.assign({},e,{type:"id",info:{id:e.elementId}});/^win/.test(process.platform);class W extends m.EventEmitter{constructor(e){super(),this.ws=e,this.ws.addEventListener("message",(e=>{this.emit("message",e.data)})),this.ws.addEventListener("close",(()=>{this.emit("close")}))}send(e){this.ws.send(e)}close(){this.ws.close()}}const B=new Map,G=new Map,z="Connection closed";class J extends m.EventEmitter{constructor(e,t,s){super(),this.puppet=t,this.namespace=s,this.callbacks=new Map,this.transport=e,this.debug=E.default("automator:protocol:"+this.namespace),this.onMessage=e=>{var t,s;this.debug(`${C.default("yyyy-mm-dd HH:MM:ss:l")} ◀ RECV ${e}`);const{id:a,method:r,error:o,result:n,params:i}=JSON.parse(e);if(null===(t=null==n?void 0:n.method)||void 0===t?void 0:t.startsWith("on"))return void((e,t)=>{const s=B.get(e.method);(null==s?void 0:s.has(t))&&s.get(t)(e.data)})(n,a);if(null===(s=null==n?void 0:n.method)||void 0===s?void 0:s.startsWith("Socket.")){return void((e,t,s)=>{const a=G.get(t);(null==a?void 0:a.has(e))&&a.get(e)(s)})(n.method.replace("Socket.",""),n.id,n.data)}if(!a)return this.puppet.emit(r,i);const{callbacks:c}=this;if(a&&c.has(a)){const e=c.get(a);c.delete(a),o?e.reject(Error(o.message||o.detailMessage||o.errMsg)):e.resolve(n)}},this.onClose=()=>{this.callbacks.forEach((e=>{e.reject(Error(z))}))},this.transport.on("message",this.onMessage),this.transport.on("close",this.onClose)}send(e,t={},s=!0){if(s&&this.puppet.adapter.has(e))return this.puppet.adapter.send(this,e,t);const a=A.default(),r=T.default({id:a,method:e,params:t});return this.debug(`${C.default("yyyy-mm-dd HH:MM:ss:l")} SEND ► ${r}`),new Promise(((e,t)=>{try{this.transport.send(r)}catch(e){t(Error(z))}this.callbacks.set(a,{resolve:e,reject:t})}))}dispose(){this.transport.close()}static createDevtoolConnection(e,t){return new Promise(((s,a)=>{const r=new S.default(e);r.addEventListener("open",(()=>{s(new J(new W(r),t,"devtool"))})),r.addEventListener("error",a)}))}static createRuntimeConnection(e,t,s){return new Promise(((a,r)=>{E.default("automator:runtime")(`${C.default("yyyy-mm-dd HH:MM:ss:l")} port=${e}`);const o=new S.default.Server({port:e});O.default((async()=>{if(t.runtimeConnection)return!0}),s,1e3).catch((()=>{o.close(),r("Failed to connect to runtime, please make sure the project is running")})),o.on("connection",(function(e){E.default("automator:runtime")(`${C.default("yyyy-mm-dd HH:MM:ss:l")} connected`);const s=new J(new W(e),t,"runtime");t.setRuntimeConnection(s),a(s)})),t.setRuntimeServer(o)}))}}const U=E.default("automator:devtool");async function V(e,t,s){const{port:a,cliPath:r,timeout:o,cwd:n="",account:i="",args:c=[],launch:l=!0}=t;let u=!1,p=!1;if(!1!==l){const t={stdio:"ignore"};n&&(t.cwd=n);let s=$.default(c,[]);s=$.default(s,["--auto"]),s=$.default(s,[e,"--auto-port",M.default(a)]),i&&(s=$.default(s,["--auto-account",i]));try{U("%s %o %o",r,s,t);const e=P.default.spawn(r,s,t);e.on("error",(e=>{u=!0})),e.on("exit",(()=>{setTimeout((()=>{p=!0}),15e3)})),e.unref()}catch(e){u=!1}}else setTimeout((()=>{p=!0}),15e3);const d=await O.default((async()=>{try{if(u||p)return!0;const e=await async function(e,t){let s;try{s=await J.createDevtoolConnection(e.wsEndpoint,t)}catch(t){throw Error(`Failed connecting to ${e.wsEndpoint}, check if target project window is opened with automation enabled`)}return s}({wsEndpoint:`ws://127.0.0.1:${a}`},s);return e}catch(e){}}),o,1e3);if(u)throw Error(`Failed to launch ${s.devtools.name}, please make sure cliPath is correctly specified`);if(p)throw Error(`Failed to launch ${s.devtools.name} , please make sure http port is open`);return await j.default(5e3),U(`${C.default("yyyy-mm-dd HH:MM:ss:l")} connected`),d}const _=[];["","-rc"].forEach((e=>{v.default?(_.push(y.default.join(w.default.homedir(),`AppData/Local/Programs/swan-ide-gui${e}/cli.bat`)),_.push(`C:/Program Files/swan-ide-gui${e}/cli.bat`)):_.push(`/Applications/百度开发者工具${e}.app/Contents/MacOS/cli`)}));const K={devtools:{name:"Baidu DevTools",remote:!0,automator:!0,paths:_,required:["project.swan.json","app.json","app.js"],defaultPort:9430,validate:async function(e,t){const s=function(e,t){const s=t.devtools.paths.slice(0);e&&s.unshift(e);for(const e of s)if(b.default.existsSync(e))return e;throw Error(`${t.devtools.name} not found, please specify executablePath option`)}(e.executablePath,t);let a=e.port||t.devtools.defaultPort;if(!1!==e.launch)try{a=await async function(e,t){const s=await q.default(e||t);if(e&&s!==e)throw Error(`Port ${e} is in use, please specify another port`);return s}(a)}catch(t){e.launch=!1}else{a===await q.default(a)&&(e.launch=!0)}return Object.assign(Object.assign({},e),{port:a,cliPath:s})},async create(e,t,s){const a=await V(e,t,s);return s.compiled?E.default("automator:devtool")("Waiting for runtime automator"):(E.default("automator:devtool")("initRuntimeAutomator"),a.send("smartapp.swan",{api:"$$initRuntimeAutomator",params:[]})),a}},adapter:{"Tool.enableRemoteDebug":{reflect:async e=>({qrCode:(await e("Tool.enablePreview")).url})},"App.exit":{reflect:async()=>Promise.resolve()},"Page.getElement":{reflect:async(e,t)=>(await e("Page.getElements",t)).elements[0]},"Page.getElements":{reflect:async(e,t)=>{return{elements:(await e("smartapp.element.getBySelector",Object.assign(Object.assign({},t),{properties:["id","tagName"],selector:(s=t.selector,s.split(" ").map((e=>D(e))).join(" "))}))).map((e=>{const t=e.properties;return{elementId:t.id,nodeId:t.id,tagName:F(t.tagName)}}))};var s}},"Page.getWindowProperties":{reflect:async(e,t)=>{const s=t.names.map((e=>e.replace("document.documentElement.",""))),a=(await e("smartapp.element.getBySelector",{properties:s,selector:"html"}))[0];return{properties:s.map((e=>a.properties[e]))}}},"Element.getHTML":{reflect:async(e,t)=>{const s=[t.type+"HTML"];return{html:(await e("Element.getDOMProperties",Object.assign(Object.assign({},t),{names:s}))).properties[0]}}},"Element.getElement":{reflect:async(e,t)=>(await e("Element.getElements",t)).elements[0]},"Element.getElements":{reflect:async(e,t)=>{const{elements:s}=await e("Page.getElements",Object.assign(Object.assign({},t),{selector:`#${t.elementId} ${t.selector}`}));return s.forEach((e=>{e.nodeId=e.id})),{elements:s}}},"Element.getAttributes":{reflect:async(e,t)=>{const s=[];for(const a of t.names)s.push(await e("smartapp.element.getAttribute",Object.assign({attribute:a},t)));return{attributes:s}},params:I},"Element.getStyles":{reflect:async(e,t)=>{const s=[];for(const a of t.names)s.push(await e("smartapp.element.getComputedStyle",Object.assign({style:a},t)));return{styles:s}},params:I},"Element.getDOMProperties":{reflect:async(e,t)=>{const s=[];for(const a of t.names)s.push(await e("smartapp.element.getProperty",Object.assign({property:a},t)));return{properties:s}},params:I},"Element.getProperties":{reflect:async(e,t)=>{const s=[];for(const a of t.names)s.push(await e("smartapp.element.getAttribute",Object.assign({attribute:a},t)));return{properties:s}},params:I},"Element.getOffset":{reflect:async(e,t)=>({left:await e("smartapp.element.getProperty",Object.assign({property:"offsetLeft"},t)),top:await e("smartapp.element.getProperty",Object.assign({property:"offsetTop"},t))}),params:I},"Element.tap":{reflect:"smartapp.element.touch",params:I}}};module.exports=K;
"use strict";var e=require("debug"),t=require("licia/isWindows"),o=require("licia/getPort"),n=require("qrcode-reader"),a=require("fs"),r=require("child_process"),s=require("licia/sleep"),i=require("licia/toStr"),c=require("licia/waitUntil"),l=require("licia/concat"),u=require("licia/dateFormat"),d=require("ws"),p=require("events"),h=require("licia/uuid"),m=require("licia/stringify");function f(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var w=f(e),v=f(t),y=f(o),g=f(n),b=f(a),E=f(r),q=f(s),M=f(i),j=f(c),$=f(l),P=f(u),C=f(d),x=f(h),k=f(m);/^win/.test(process.platform);class H extends p.EventEmitter{constructor(e){super(),this.ws=e,this.ws.addEventListener("message",(e=>{this.emit("message",e.data)})),this.ws.addEventListener("close",(()=>{this.emit("close")}))}send(e){this.ws.send(e)}close(){this.ws.close()}}const S=new Map,F=new Map,R="Connection closed";class D extends p.EventEmitter{constructor(e,t,o){super(),this.puppet=t,this.namespace=o,this.callbacks=new Map,this.transport=e,this.debug=w.default("automator:protocol:"+this.namespace),this.onMessage=e=>{var t,o;this.debug(`${P.default("yyyy-mm-dd HH:MM:ss:l")} ◀ RECV ${e}`);const{id:n,method:a,error:r,result:s,params:i}=JSON.parse(e);if(null===(t=null==s?void 0:s.method)||void 0===t?void 0:t.startsWith("on"))return void((e,t,o)=>{const n=S.get(e);(null==n?void 0:n.has(t))&&n.get(t)(o)})(s.method,n,s);if(null===(o=null==s?void 0:s.method)||void 0===o?void 0:o.startsWith("Socket.")){return void((e,t,o)=>{const n=F.get(t);(null==n?void 0:n.has(e))&&n.get(e)(o)})(s.method.replace("Socket.",""),s.id,s.data)}if(!n)return this.puppet.emit(a,i);const{callbacks:c}=this;if(n&&c.has(n)){const e=c.get(n);c.delete(n),r?e.reject(Error(r.message||r.detailMessage)):e.resolve(s)}},this.onClose=()=>{this.callbacks.forEach((e=>{e.reject(Error(R))}))},this.transport.on("message",this.onMessage),this.transport.on("close",this.onClose)}send(e,t={},o=!0){if(o&&this.puppet.adapter.has(e))return this.puppet.adapter.send(this,e,t);const n=x.default(),a=k.default({id:n,method:e,params:t});return this.debug(`${P.default("yyyy-mm-dd HH:MM:ss:l")} SEND ► ${a}`),new Promise(((e,t)=>{try{this.transport.send(a)}catch(e){t(Error(R))}this.callbacks.set(n,{resolve:e,reject:t})}))}dispose(){this.transport.close()}static createDevtoolConnection(e,t){return new Promise(((o,n)=>{const a=new C.default(e);a.addEventListener("open",(()=>{o(new D(new H(a),t,"devtool"))})),a.addEventListener("error",n)}))}static createRuntimeConnection(e,t,o){return new Promise(((n,a)=>{w.default("automator:runtime")(`${P.default("yyyy-mm-dd HH:MM:ss:l")} port=${e}`);const r=new C.default.Server({port:e});j.default((async()=>{if(t.runtimeConnection)return!0}),o,1e3).catch((()=>{r.close(),a("Failed to connect to runtime, please make sure the project is running")})),r.on("connection",(function(e){w.default("automator:runtime")(`${P.default("yyyy-mm-dd HH:MM:ss:l")} connected`);const o=new D(new H(e),t,"runtime");t.setRuntimeConnection(o),n(o)})),t.setRuntimeServer(r)}))}}const T=w.default("automator:devtool");async function W(e,t,o){const{port:n,cliPath:a,timeout:r,cwd:s="",account:i="",args:c=[],launch:l=!0}=t;let u=!1,d=!1;if(!1!==l){const t={stdio:"ignore",detached:!0};s&&(t.cwd=s);let o=$.default(c,[]);o=$.default(o,["auto","--project"]),o=$.default(o,[e,"--auto-port",M.default(n)]),i&&(o=$.default(o,["--auto-account",i]));try{T("%s %o %o",a,o,t);const e=E.default.spawn(a,o,t);e.on("error",(e=>{u=!0})),e.on("exit",(()=>{setTimeout((()=>{d=!0}),15e3)})),e.unref()}catch(e){u=!1}}else setTimeout((()=>{d=!0}),15e3);const p=await j.default((async()=>{try{if(u||d)return!0;const e=await async function(e,t){let o;try{o=await D.createDevtoolConnection(e.wsEndpoint,t)}catch(t){throw Error(`Failed connecting to ${e.wsEndpoint}, check if target project window is opened with automation enabled`)}return o}({wsEndpoint:`ws://127.0.0.1:${n}`},o);return e}catch(e){}}),r,1e3);if(u)throw Error(`Failed to launch ${o.devtools.name}, please make sure cliPath is correctly specified`);if(d)throw Error(`Failed to launch ${o.devtools.name} , please make sure http port is open`);return await q.default(5e3),T(`${P.default("yyyy-mm-dd HH:MM:ss:l")} connected`),p}const A={devtools:{name:"Wechat web devTools",remote:!0,automator:!0,paths:[v.default?"C:/Program Files (x86)/Tencent/微信web开发者工具/cli.bat":"/Applications/wechatwebdevtools.app/Contents/MacOS/cli"],required:["project.config.json","app.json","app.js"],defaultPort:9420,validate:async function(e,t){const o=function(e,t){const o=t.devtools.paths.slice(0);e&&o.unshift(e);for(const e of o)if(b.default.existsSync(e))return e;throw Error(`${t.devtools.name} not found, please specify executablePath option`)}(e.executablePath,t);let n=e.port||t.devtools.defaultPort;if(!1!==e.launch)try{n=await async function(e,t){const o=await y.default(e||t);if(e&&o!==e)throw Error(`Port ${e} is in use, please specify another port`);return o}(n)}catch(t){e.launch=!1}else{n===await y.default(n)&&(e.launch=!0)}return Object.assign(Object.assign({},e),{port:n,cliPath:o})},async create(e,t,o){const n=await W(e,t,o);return o.compiled?w.default("automator:devtool")("Waiting for runtime automator"):(w.default("automator:devtool")("initRuntimeAutomator"),n.send("App.callWxMethod",{method:"$$initRuntimeAutomator",args:[]})),n}},adapter:{"Tool.enableRemoteDebug":{reflect:async(e,t)=>{let{qrCode:o}=await e("Tool.enableRemoteDebug",t,!1);return o&&(o=await function(e){const t=new Buffer(e,"base64");return new Promise((async(e,o)=>{const n=await require("jimp").read(t),a=new g.default;a.callback=function(t,n){if(t)return o(t);e(n.result)},a.decode(n.bitmap)}))}(o)),{qrCode:o}}},"App.callFunction":{reflect:async(e,t)=>{return e("App.callFunction",Object.assign(Object.assign({},t),{functionDeclaration:(o=t.functionDeclaration,"}"===o[o.length-1]?o.replace("{","{\nvar uni = wx;\n"):o.replace("=>","=>{\nvar uni = wx;\nreturn ")+"}")}),!1);var o}},"Element.getHTML":{reflect:async(e,t)=>({html:(await e("Element.getWXML",t,!1)).wxml})}}};module.exports=A;
"use strict";var e=require("debug"),t=require("licia/isWindows"),o=require("licia/getPort"),a=require("qrcode-reader"),n=require("fs"),r=require("child_process"),s=require("licia/sleep"),i=require("licia/toStr"),c=require("licia/waitUntil"),l=require("licia/concat"),u=require("licia/dateFormat"),d=require("ws"),p=require("events"),h=require("licia/uuid"),m=require("licia/stringify");function f(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var w=f(e),v=f(t),y=f(o),g=f(a),b=f(n),E=f(r),M=f(s),q=f(i),j=f(c),$=f(l),P=f(u),C=f(d),x=f(h),k=f(m);/^win/.test(process.platform);class H extends p.EventEmitter{constructor(e){super(),this.ws=e,this.ws.addEventListener("message",(e=>{this.emit("message",e.data)})),this.ws.addEventListener("close",(()=>{this.emit("close")}))}send(e){this.ws.send(e)}close(){this.ws.close()}}const S=new Map,F=new Map,R="Connection closed";class D extends p.EventEmitter{constructor(e,t,o){super(),this.puppet=t,this.namespace=o,this.callbacks=new Map,this.transport=e,this.debug=w.default("automator:protocol:"+this.namespace),this.onMessage=e=>{var t,o;this.debug(`${P.default("yyyy-mm-dd HH:MM:ss:l")} ◀ RECV ${e}`);const{id:a,method:n,error:r,result:s,params:i}=JSON.parse(e);if(null===(t=null==s?void 0:s.method)||void 0===t?void 0:t.startsWith("on"))return void((e,t)=>{const o=S.get(e.method);(null==o?void 0:o.has(t))&&o.get(t)(e.data)})(s,a);if(null===(o=null==s?void 0:s.method)||void 0===o?void 0:o.startsWith("Socket.")){return void((e,t,o)=>{const a=F.get(t);(null==a?void 0:a.has(e))&&a.get(e)(o)})(s.method.replace("Socket.",""),s.id,s.data)}if(!a)return this.puppet.emit(n,i);const{callbacks:c}=this;if(a&&c.has(a)){const e=c.get(a);c.delete(a),r?e.reject(Error(r.message||r.detailMessage||r.errMsg)):e.resolve(s)}},this.onClose=()=>{this.callbacks.forEach((e=>{e.reject(Error(R))}))},this.transport.on("message",this.onMessage),this.transport.on("close",this.onClose)}send(e,t={},o=!0){if(o&&this.puppet.adapter.has(e))return this.puppet.adapter.send(this,e,t);const a=x.default(),n=k.default({id:a,method:e,params:t});return this.debug(`${P.default("yyyy-mm-dd HH:MM:ss:l")} SEND ► ${n}`),new Promise(((e,t)=>{try{this.transport.send(n)}catch(e){t(Error(R))}this.callbacks.set(a,{resolve:e,reject:t})}))}dispose(){this.transport.close()}static createDevtoolConnection(e,t){return new Promise(((o,a)=>{const n=new C.default(e);n.addEventListener("open",(()=>{o(new D(new H(n),t,"devtool"))})),n.addEventListener("error",a)}))}static createRuntimeConnection(e,t,o){return new Promise(((a,n)=>{w.default("automator:runtime")(`${P.default("yyyy-mm-dd HH:MM:ss:l")} port=${e}`);const r=new C.default.Server({port:e});j.default((async()=>{if(t.runtimeConnection)return!0}),o,1e3).catch((()=>{r.close(),n("Failed to connect to runtime, please make sure the project is running")})),r.on("connection",(function(e){w.default("automator:runtime")(`${P.default("yyyy-mm-dd HH:MM:ss:l")} connected`);const o=new D(new H(e),t,"runtime");t.setRuntimeConnection(o),a(o)})),t.setRuntimeServer(r)}))}}const T=w.default("automator:devtool");async function W(e,t,o){const{port:a,cliPath:n,timeout:r,cwd:s="",account:i="",args:c=[],launch:l=!0}=t;let u=!1,d=!1;if(!1!==l){const t={stdio:"ignore",detached:!0};s&&(t.cwd=s);let o=$.default(c,[]);o=$.default(o,["auto","--project"]),o=$.default(o,[e,"--auto-port",q.default(a)]),i&&(o=$.default(o,["--auto-account",i]));try{T("%s %o %o",n,o,t);const e=E.default.spawn(n,o,t);e.on("error",(e=>{u=!0})),e.on("exit",(()=>{setTimeout((()=>{d=!0}),15e3)})),e.unref()}catch(e){u=!1}}else setTimeout((()=>{d=!0}),15e3);const p=await j.default((async()=>{try{if(u||d)return!0;const e=await async function(e,t){let o;try{o=await D.createDevtoolConnection(e.wsEndpoint,t)}catch(t){throw Error(`Failed connecting to ${e.wsEndpoint}, check if target project window is opened with automation enabled`)}return o}({wsEndpoint:`ws://127.0.0.1:${a}`},o);return e}catch(e){}}),r,1e3);if(u)throw Error(`Failed to launch ${o.devtools.name}, please make sure cliPath is correctly specified`);if(d)throw Error(`Failed to launch ${o.devtools.name} , please make sure http port is open`);return await M.default(5e3),T(`${P.default("yyyy-mm-dd HH:MM:ss:l")} connected`),p}const A={devtools:{name:"Wechat web devTools",remote:!0,automator:!0,paths:[v.default?"C:/Program Files (x86)/Tencent/微信web开发者工具/cli.bat":"/Applications/wechatwebdevtools.app/Contents/MacOS/cli"],required:["project.config.json","app.json","app.js"],defaultPort:9420,validate:async function(e,t){const o=function(e,t){const o=t.devtools.paths.slice(0);e&&o.unshift(e);for(const e of o)if(b.default.existsSync(e))return e;throw Error(`${t.devtools.name} not found, please specify executablePath option`)}(e.executablePath,t);let a=e.port||t.devtools.defaultPort;if(!1!==e.launch)try{a=await async function(e,t){const o=await y.default(e||t);if(e&&o!==e)throw Error(`Port ${e} is in use, please specify another port`);return o}(a)}catch(t){e.launch=!1}else{a===await y.default(a)&&(e.launch=!0)}return Object.assign(Object.assign({},e),{port:a,cliPath:o})},async create(e,t,o){const a=await W(e,t,o);return o.compiled?w.default("automator:devtool")("Waiting for runtime automator"):(w.default("automator:devtool")("initRuntimeAutomator"),a.send("App.callWxMethod",{method:"$$initRuntimeAutomator",args:[]})),a}},adapter:{"Tool.enableRemoteDebug":{reflect:async(e,t)=>{let{qrCode:o}=await e("Tool.enableRemoteDebug",t,!1);return o&&(o=await function(e){const t=new Buffer(e,"base64");return new Promise((async(e,o)=>{const a=await require("jimp").read(t),n=new g.default;n.callback=function(t,a){if(t)return o(t);e(a.result)},n.decode(a.bitmap)}))}(o)),{qrCode:o}}},"App.callFunction":{reflect:async(e,t)=>{return e("App.callFunction",Object.assign(Object.assign({},t),{functionDeclaration:(o=t.functionDeclaration,"}"===o[o.length-1]?o.replace("{","{\nvar uni = wx;\n"):o.replace("=>","=>{\nvar uni = wx;\nreturn ")+"}")}),!1);var o}},"Element.getHTML":{reflect:async(e,t)=>({html:(await e("Element.getWXML",t,!1)).wxml})}}};module.exports=A;
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册