@gkd-kit/inspect 0.0.1706370661084 → 0.0.1707801467326
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/404.html +4 -4
- package/dist/assets/{ActionCard.vue_vue_type_script_setup_true_lang-gulAFZ4y.js → ActionCard.vue_vue_type_script_setup_true_lang-1Yto407O.js} +2 -2
- package/dist/assets/{ActionCard.vue_vue_type_script_setup_true_lang-gulAFZ4y.js.map → ActionCard.vue_vue_type_script_setup_true_lang-1Yto407O.js.map} +1 -1
- package/dist/assets/DevicePage--SWuuMpu.js +49 -0
- package/dist/assets/DevicePage--SWuuMpu.js.map +1 -0
- package/dist/assets/{HomePage-VhYykwn0.js → HomePage-dwvW9l-m.js} +2 -2
- package/dist/assets/{HomePage-VhYykwn0.js.map → HomePage-dwvW9l-m.js.map} +1 -1
- package/dist/assets/{ImportPage-yM0zuDrS.js → ImportPage-ggf4W2W2.js} +2 -2
- package/dist/assets/{ImportPage-yM0zuDrS.js.map → ImportPage-ggf4W2W2.js.map} +1 -1
- package/dist/assets/{SnapshotPage-Yrgt46hV.js → SnapshotPage-O4cx8yS1.js} +4 -4
- package/dist/assets/SnapshotPage-O4cx8yS1.js.map +1 -0
- package/dist/assets/{_404Page-wi2f75KG.js → _404Page-F3A3VVX7.js} +2 -2
- package/dist/assets/{_404Page-wi2f75KG.js.map → _404Page-F3A3VVX7.js.map} +1 -1
- package/dist/assets/{import-gPQUFYPT.js → import-idIX6rtn.js} +2 -2
- package/dist/assets/{import-gPQUFYPT.js.map → import-idIX6rtn.js.map} +1 -1
- package/dist/assets/{index-pw--bcaE.js → index-1Gn9hika.js} +50 -50
- package/dist/assets/index-1Gn9hika.js.map +1 -0
- package/dist/assets/{index-2UxnHIyb.js → index-F8vgJoZF.js} +2 -2
- package/dist/assets/{index-2UxnHIyb.js.map → index-F8vgJoZF.js.map} +1 -1
- package/dist/assets/index-JOZxsyd5.css +1 -0
- package/dist/assets/{jszip.min-js0Ysc8G.js → jszip.min-04P9LQ9z.js} +2 -2
- package/dist/assets/{jszip.min-js0Ysc8G.js.map → jszip.min-04P9LQ9z.js.map} +1 -1
- package/dist/assets/{node-cuE40aPC.js → node-1hvY6_AK.js} +2 -2
- package/dist/assets/{node-cuE40aPC.js.map → node-1hvY6_AK.js.map} +1 -1
- package/dist/assets/polyfills--bbXeJl6.js +1 -0
- package/dist/assets/{storage-ZRrZjqV_.js → storage-52nRpc3v.js} +2 -2
- package/dist/assets/{storage-ZRrZjqV_.js.map → storage-52nRpc3v.js.map} +1 -1
- package/dist/assets/{table-wvBpfMwJ.js → table-exJ-t_Ux.js} +3 -3
- package/dist/assets/{table-wvBpfMwJ.js.map → table-exJ-t_Ux.js.map} +1 -1
- package/dist/index.html +4 -4
- package/package.json +16 -16
- package/dist/assets/DevicePage-JtbITwNS.js +0 -4
- package/dist/assets/DevicePage-JtbITwNS.js.map +0 -1
- package/dist/assets/SnapshotPage-Yrgt46hV.js.map +0 -1
- package/dist/assets/index-pw--bcaE.js.map +0 -1
- package/dist/assets/index-wpljfJUa.css +0 -1
- package/dist/assets/polyfills-pn962c6m.js +0 -1
package/dist/index.html
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
<!doctype html>
|
|
2
2
|
<html lang="zh">
|
|
3
3
|
<head>
|
|
4
|
-
<script type="module" crossorigin src="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
4
|
+
<script type="module" crossorigin src="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1707801467326/files/dist/assets/polyfills--bbXeJl6.js"></script>
|
|
5
5
|
|
|
6
6
|
<meta charset="UTF-8" />
|
|
7
|
-
<link rel="icon" type="image/svg+xml" href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
7
|
+
<link rel="icon" type="image/svg+xml" href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1707801467326/files/dist/favicon.svg" />
|
|
8
8
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
9
9
|
<meta name="referrer" content="no-referrer" />
|
|
10
10
|
<title>GKD</title>
|
|
11
|
-
<script type="module" crossorigin src="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
12
|
-
<link rel="stylesheet" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
11
|
+
<script type="module" crossorigin src="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1707801467326/files/dist/assets/index-1Gn9hika.js"></script>
|
|
12
|
+
<link rel="stylesheet" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1707801467326/files/dist/assets/index-JOZxsyd5.css">
|
|
13
13
|
</head>
|
|
14
14
|
|
|
15
15
|
<body>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gkd-kit/inspect",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.1707801467326",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
@@ -12,12 +12,12 @@
|
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"@antv/g6": "^4.8.24",
|
|
14
14
|
"@gkd-kit/selector": "0.0.20",
|
|
15
|
-
"@rushstack/eslint-patch": "^1.7.
|
|
15
|
+
"@rushstack/eslint-patch": "^1.7.2",
|
|
16
16
|
"@types/file-saver": "^2.0.7",
|
|
17
17
|
"@types/fs-extra": "^11.0.4",
|
|
18
|
-
"@types/node": "^20.11.
|
|
19
|
-
"@vitejs/plugin-legacy": "^5.
|
|
20
|
-
"@vitejs/plugin-vue": "^5.0.
|
|
18
|
+
"@types/node": "^20.11.17",
|
|
19
|
+
"@vitejs/plugin-legacy": "^5.3.0",
|
|
20
|
+
"@vitejs/plugin-vue": "^5.0.4",
|
|
21
21
|
"@vitejs/plugin-vue-jsx": "^3.1.0",
|
|
22
22
|
"@vue/eslint-config-prettier": "^9.0.0",
|
|
23
23
|
"@vue/eslint-config-typescript": "^12.0.0",
|
|
@@ -31,12 +31,12 @@
|
|
|
31
31
|
"eslint": "^8.56.0",
|
|
32
32
|
"eslint-define-config": "^2.1.0",
|
|
33
33
|
"eslint-plugin-unused-imports": "3.0.0",
|
|
34
|
-
"eslint-plugin-vue": "^9.
|
|
34
|
+
"eslint-plugin-vue": "^9.21.1",
|
|
35
35
|
"file-saver": "^2.0.5",
|
|
36
36
|
"fs-extra": "^11.2.0",
|
|
37
37
|
"json5": "^2.2.3",
|
|
38
38
|
"jszip": "^3.10.1",
|
|
39
|
-
"lint-staged": "^15.2.
|
|
39
|
+
"lint-staged": "^15.2.2",
|
|
40
40
|
"localforage": "^1.10.0",
|
|
41
41
|
"naive-ui": "^2.37.3",
|
|
42
42
|
"node-html-parser": "^6.1.12",
|
|
@@ -44,24 +44,24 @@
|
|
|
44
44
|
"npm-run-all": "^4.1.5",
|
|
45
45
|
"p-limit": "^5.0.0",
|
|
46
46
|
"pinia": "^2.1.7",
|
|
47
|
-
"prettier": "^3.2.
|
|
47
|
+
"prettier": "^3.2.5",
|
|
48
48
|
"sass": "^1.70.0",
|
|
49
49
|
"simple-git": "^3.22.0",
|
|
50
50
|
"simple-git-hooks": "^2.9.0",
|
|
51
|
-
"tsx": "^4.7.
|
|
51
|
+
"tsx": "^4.7.1",
|
|
52
52
|
"typescript": "^5.3.3",
|
|
53
|
-
"unocss": "^0.58.
|
|
54
|
-
"vite": "^5.
|
|
53
|
+
"unocss": "^0.58.5",
|
|
54
|
+
"vite": "^5.1.1",
|
|
55
55
|
"vite-plugin-monkey": "^3.5.1",
|
|
56
|
-
"vue": "^3.4.
|
|
57
|
-
"vue-i18n": "^9.9.
|
|
56
|
+
"vue": "^3.4.18",
|
|
57
|
+
"vue-i18n": "^9.9.1",
|
|
58
58
|
"vue-router": "^4.2.5",
|
|
59
59
|
"vue-tsc": "^1.8.27"
|
|
60
60
|
},
|
|
61
61
|
"volta": {
|
|
62
|
-
"node": "
|
|
62
|
+
"node": "20.11.0"
|
|
63
63
|
},
|
|
64
|
-
"packageManager": "pnpm@8.
|
|
64
|
+
"packageManager": "pnpm@8.15.1",
|
|
65
65
|
"simple-git-hooks": {
|
|
66
66
|
"pre-commit": "pnpm exec lint-staged"
|
|
67
67
|
},
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
]
|
|
73
73
|
},
|
|
74
74
|
"scripts": {
|
|
75
|
-
"
|
|
75
|
+
"dev": "vite",
|
|
76
76
|
"build": "vite build",
|
|
77
77
|
"build:mirror": "cross-env MIRROR=ON vite build",
|
|
78
78
|
"preview": "vite preview",
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{s as y,d as ne,aa as ie,t as le,w as re,a as $,e as K,f as J,b as n,g as l,u as t,h as f,F as W,i as ce,k as w,l as k,at as ue,o as H,N as G,au as pe,j as de,m as he,n as ve}from"./index-pw--bcaE.js";import{o as fe,m as v,h as me,a as A,n as _,q as ge}from"./storage-ZRrZjqV_.js";import{u as we,b as ke,a as X,l as Q,c as ye,d as Se}from"./index-2UxnHIyb.js";import{u as be,a as xe,N as Ce}from"./table-wvBpfMwJ.js";import{u as N,y as _e,c as O,N as F,i as Ne,d as Pe,a as Re}from"./node-cuE40aPC.js";const Ie=M=>{const S=y(M),b=async(o,h={})=>{var R;if(!S.value)throw new Error("origin must exist");const x=new URL("/api/"+o,S.value);Object.entries(h.query||{}).forEach(([m,I])=>{I!==void 0&&x.searchParams.set(m,String(I))});const c=await fe(x,h.init).catch(m=>{throw v.error("网络错误:/"+o),m});if(!c.ok)throw v.error("接口错误:/"+o+":"+c.status),c;if((R=c.headers.get("Content-Type"))!=null&&R.includes("application/json")){const m=await c.clone().json();if(m.__error)throw v.error(m.message),c}return c},i=async(...o)=>await(await b(...o)).json(),P=async(...o)=>await(await b(...o)).blob(),d=async(...o)=>await(await b(...o)).arrayBuffer();return{origin:S,api:{device:async()=>i("device"),snapshot:async o=>i("snapshot",{query:o}),screenshot:async o=>d("screenshot",{query:o}),captureSnapshot:async()=>i("captureSnapshot"),snapshots:async()=>i("snapshots"),subsApps:async()=>i("subsApps"),updateSubsApps:async o=>P("updateSubsApps",{init:{method:"POST",body:JSON.stringify(o),headers:{"Content-Type":"application/json"}}}),execSelector:async o=>i("execSelector",{init:{method:"POST",body:JSON.stringify({...o,value:o.selector}),headers:{"Content-Type":"application/json"}}})}}},Ve=f("div",{"h-15px":""},null,-1),Ae=f("a",{href:"https://github.com/gkd-kit/subscription/blob/main/src/types.ts",target:"_blank",rel:"noopener noreferrer"}," 查找说明 ",-1),ze=f("div",{"h-10px":""},null,-1),Be={flex:"","gap-10px":"","flex-items-center":""},Ue=f("a",{href:"https://github.com/gkd-kit/subscription/blob/main/src/types.ts",target:"_blank",rel:"noopener noreferrer"}," 操作说明 ",-1),Te={flex:"","flex-col":"","p-10px":"","gap-10px":"","h-full":""},Le=f("svg",{xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 32 32"},[f("path",{d:"M16.612 2.214a1.01 1.01 0 0 0-1.242 0L1 13.419l1.243 1.572L4 13.621V26a2.004 2.004 0 0 0 2 2h20a2.004 2.004 0 0 0 2-2V13.63L29.757 15L31 13.428zM18 26h-4v-8h4zm2 0v-8a2.002 2.002 0 0 0-2-2h-4a2.002 2.002 0 0 0-2 2v8H6V12.062l10-7.79l10 7.8V26z",fill:"currentColor"})],-1),je={class:"h-full",flex:"","flex-items-center":""},Ee=ne({__name:"DevicePage",setup(M){const S=ce(),b=we("新设备"),{api:i,origin:P}=Ie(),d=ke("device_link",""),g=y(),o=N(async()=>{d.value&&(P.value=X(()=>new URL(d.value.trim()),()=>"非法设备地址").origin,d.value=P.value,g.value=await i.device())});ie(async()=>{await me(500),le(d.value)&&o.invoke()});const h=y([]);re(async()=>{if(!g.value)return;b.value="已连接 "+g.value.manufacturer;const e=await i.snapshots();e.sort((u,a)=>a.id-u.id),h.value=e;const s=await i.subsApps();V.value=Q.stringify(s||[],function(u,a){if(a!==null)return a},2)});const x=N(async()=>{const e=await i.captureSnapshot(),s=await i.screenshot({id:e.id});await A.setItem(e.id,e),await _.setItem(e.id,s),v.success("保存快照成功");const u=await i.snapshots();u.sort((a,j)=>j.id-a.id),h.value=u}),c=N(async()=>{const e=(await i.snapshots()).map(p=>p.id),s=new Set((await _.keys()).map(p=>parseInt(p))),u=e.filter(p=>!s.has(p));if(u.length==0){v.success("没有新记录可导入");return}let a=0;const j=ge(3);await Promise.all(u.map(p=>j(async()=>{const[E,oe]=await Promise.all([i.snapshot({id:p}),i.screenshot({id:p})]);E.nodes&&(await Promise.all([A.setItem(p,E),_.setItem(p,oe)]),a++)}))),v.success(`导入${a}条新记录`)}),{activityIdCol:R,appIdCol:m,appNameCol:I,ctimeCol:z,appVersionCodeCol:Y,appVersionNameCol:Z,reseColWidth:ee}=be(),te=e=>{e.columnKey==z.key&&(z.sortOrder=e.order)},q=_e(async e=>{if(await A.hasItem(e.id)||await A.setItem(e.id,await i.snapshot({id:e.id})),!await _.hasItem(e.id)){const s=await i.screenshot({id:e.id});await _.setItem(e.id,s)}window.open(S.resolve({name:"snapshot",params:{snapshotId:e.id}}).href)},e=>e.id),se=[z,I,m,Y,Z,R,{key:"actions",title:"Action",fixed:"right",width:"120px",render(e){return n(O,{size:"small"},{default:()=>[n(w,{size:"small",loading:q.loading[e.id],onClick:()=>q.invoke(e)},{default:()=>[k("查看")]})]})}}],C=$({page:1,pageSize:50,showSizePicker:!0,pageSizes:[50,100],onChange:e=>{C.page=e},onUpdatePageSize:e=>{C.pageSize=e,C.page=1}});K(C,ee);const B=y(!1),V=y(""),U=N(async()=>{const e=X(()=>Q.parse(V.value.trim()||"[]"));await i.updateSubsApps([].concat(e)),v.success("修改成功")}),T=y(!1),D=["click","clickNode","clickCenter","back","longClick","longClickNode","longClickCenter"].map(e=>({value:e,label:e})),r=$({selector:"",selectorValid:!1,action:D[0].value,quickFind:!1}),ae=ye(()=>{r.selectorValid=Se(r.selector)},500);K(()=>r.selector.trim(),ae);const L=N(async()=>{const e=await i.execSelector({...r});if(e.message){v.success("点击成功:"+e.message);return}e.action&&v.success((e.result?"点击成功:":"点击失败")+e.action)});return(e,s)=>{const u=ue("RouterLink");return H(),J(W,null,[n(t(G),{show:B.value,"onUpdate:show":s[1]||(s[1]=a=>B.value=a),preset:"dialog",style:{width:"800px"},title:"修改内存订阅","positive-text":"确认",positiveButtonProps:{loading:t(U).loading,onClick(){t(U).invoke()}}},{default:l(()=>[n(t(F),{value:V.value,"onUpdate:value":s[0]||(s[0]=a=>V.value=a),disabled:t(U).loading,type:"textarea",class:"gkd_code",autosize:{minRows:10,maxRows:25},placeholder:`请输入订阅文本
|
|
2
|
-
订阅支持JSON5
|
|
3
|
-
根节点可以是APP规则对象也可以是APP规则对象数组`},null,8,["value","disabled"])]),_:1},8,["show","positiveButtonProps"]),n(t(G),{show:T.value,"onUpdate:show":s[5]||(s[5]=a=>T.value=a),preset:"dialog",style:{width:"800px"},title:"执行选择器","positive-text":"确认",positiveButtonProps:{loading:t(L).loading,disabled:!t(r).selectorValid,onClick(){t(L).invoke()}}},{default:l(()=>[n(t(F),{value:t(r).selector,"onUpdate:value":s[2]||(s[2]=a=>t(r).selector=a),disabled:t(L).loading,type:"textarea",class:"gkd_code",autosize:{minRows:4,maxRows:10},placeholder:"请输入合法的选择器"},null,8,["value","disabled"]),Ve,n(t(O),null,{default:l(()=>[n(t(Ne),{checked:t(r).quickFind,"onUpdate:checked":s[3]||(s[3]=a=>t(r).quickFind=a)},{default:l(()=>[k(" 快速查找 ")]),_:1},8,["checked"]),Ae]),_:1}),ze,f("div",Be,[n(t(xe),{value:t(r).action,"onUpdate:value":s[4]||(s[4]=a=>t(r).action=a),options:t(D),class:"w-150px"},null,8,["value","options"]),Ue])]),_:1},8,["show","positiveButtonProps"]),f("div",Te,[n(t(O),null,{default:l(()=>[n(u,{to:"/"},{default:l(()=>[n(t(w),null,{icon:l(()=>[n(t(Pe),null,{default:l(()=>[Le]),_:1})]),_:1})]),_:1}),n(t(Re),null,{default:l(()=>[n(t(F),{value:t(d),"onUpdate:value":s[6]||(s[6]=a=>pe(d)?d.value=a:null),placeholder:"请输入设备地址",style:{minWidth:"250px"},onKeyup:de(t(o).invoke,["enter"])},null,8,["value","onKeyup"]),n(t(w),{onClick:t(o).invoke,loading:t(o).loading},{default:l(()=>[k(" 刷新连接 ")]),_:1},8,["onClick","loading"])]),_:1}),g.value?(H(),J(W,{key:0},[f("div",je,he(`已连接 ${g.value.manufacturer} Android ${g.value.release}`),1),n(t(w),{onClick:t(x).invoke,loading:t(x).loading},{default:l(()=>[k(" 快照 ")]),_:1},8,["onClick","loading"]),n(t(w),{onClick:t(c).invoke,loading:t(c).loading},{default:l(()=>[k(" 下载设备所有快照 ")]),_:1},8,["onClick","loading"]),n(t(w),{onClick:s[7]||(s[7]=a=>B.value=!0)},{default:l(()=>[k(" 修改内存订阅 ")]),_:1}),n(t(w),{onClick:s[8]||(s[8]=a=>T.value=!0)},{default:l(()=>[k(" 执行选择器 ")]),_:1})],64)):ve("",!0)]),_:1}),n(t(Ce),{striped:"",flexHeight:"",data:h.value,columns:se,pagination:t(C),"onUpdate:sorter":te,size:"small",class:"flex-1",scrollX:1200},null,8,["data","pagination"])])],64)}}});export{Ee as default};
|
|
4
|
-
//# sourceMappingURL=DevicePage-JtbITwNS.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DevicePage-JtbITwNS.js","sources":["../../src/utils/api.ts","../../src/views/DevicePage.vue"],"sourcesContent":["import { shallowRef } from 'vue';\nimport { message } from './discrete';\nimport { enhanceFetch } from './fetch';\nimport type { Device, RpcError, Snapshot } from './types';\n\ntype RpcOptions = {\n query?: Record<string, unknown>;\n init?: RequestInit;\n};\n\nexport const useDeviceApi = (initOrigin?: string) => {\n const origin = shallowRef(initOrigin);\n const rpc = async (rpcName: string, options: RpcOptions = {}) => {\n if (!origin.value) {\n throw new Error(`origin must exist`);\n }\n const u = new URL(`/api/` + rpcName, origin.value);\n Object.entries(options.query || {}).forEach(([key, value]) => {\n if (value === undefined) return;\n u.searchParams.set(key, String(value));\n });\n const response = await enhanceFetch(u, options.init).catch((e) => {\n message.error(`网络错误:/` + rpcName);\n throw e;\n });\n if (!response.ok) {\n message.error(`接口错误:/` + rpcName + `:` + response.status);\n throw response;\n }\n if (response.headers.get(`Content-Type`)?.includes(`application/json`)) {\n const error = (await response.clone().json()) as RpcError;\n if (error.__error) {\n message.error(error.message);\n throw response;\n }\n }\n return response;\n };\n const jsonRpc = async <T>(...args: Parameters<typeof rpc>) => {\n const response = await rpc(...args);\n return (await response.json()) as T;\n };\n const blobRpc = async (...args: Parameters<typeof rpc>) => {\n const response = await rpc(...args);\n return await response.blob();\n };\n const arrayBufferRpc = async (...args: Parameters<typeof rpc>) => {\n const response = await rpc(...args);\n return await response.arrayBuffer();\n };\n const api = {\n device: async () => jsonRpc<Device>(`device`),\n snapshot: async (query?: { id?: string | number }) => {\n return jsonRpc<Snapshot>(`snapshot`, { query });\n },\n screenshot: async (query: { id: string | number }) => {\n return arrayBufferRpc(`screenshot`, { query });\n },\n captureSnapshot: async () => {\n return jsonRpc<Snapshot>(`captureSnapshot`);\n },\n snapshots: async () => {\n return jsonRpc<Snapshot[]>(`snapshots`);\n },\n subsApps: async () => {\n return jsonRpc<unknown[]>(`subsApps`);\n },\n updateSubsApps: async (data: unknown[]) => {\n return blobRpc(`updateSubsApps`, {\n init: {\n method: 'POST',\n body: JSON.stringify(data),\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n });\n },\n execSelector: async (data: {\n selector: string;\n action?: string;\n quickFind?: boolean;\n }) => {\n return jsonRpc<{ message: string; action: string; result: boolean }>(\n `execSelector`,\n {\n init: {\n method: 'POST',\n // value 是旧版本的选择器\n body: JSON.stringify({ ...data, value: data.selector }),\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n },\n );\n },\n };\n return { origin, api };\n};\n","<script setup lang=\"tsx\">\nimport { useDeviceApi } from '@/utils/api';\nimport { toValidURL } from '@/utils/check';\nimport { message } from '@/utils/discrete';\nimport { errorWrap } from '@/utils/error';\nimport { delay } from '@/utils/others';\nimport { checkSelector } from '@/utils/selector';\nimport { snapshotStorage, screenshotStorage } from '@/utils/storage';\nimport { useSnapshotColumns } from '@/utils/table';\nimport { useBatchTask, useTask } from '@/utils/task';\nimport type { Device, Snapshot } from '@/utils/types';\nimport { useStorage, useTitle, useDebounceFn } from '@vueuse/core';\nimport JSON5 from 'json5';\nimport {\n DataTableColumns,\n NButton,\n NDataTable,\n NInput,\n NInputGroup,\n NSpace,\n PaginationProps,\n NIcon,\n NModal,\n NSelect,\n NCheckbox,\n} from 'naive-ui';\nimport { SortState } from 'naive-ui/es/data-table/src/interface';\nimport pLimit from 'p-limit';\nimport {\n onMounted,\n shallowReactive,\n shallowRef,\n watch,\n watchEffect,\n} from 'vue';\nimport { useRouter } from 'vue-router';\n\nconst router = useRouter();\nconst title = useTitle(`新设备`);\nconst { api, origin } = useDeviceApi();\nconst link = useStorage(`device_link`, ``);\nconst device = shallowRef<Device>();\nconst connect = useTask(async () => {\n if (!link.value) return;\n origin.value = errorWrap(\n () => new URL(link.value.trim()),\n () => `非法设备地址`,\n ).origin;\n link.value = origin.value;\n device.value = await api.device();\n});\nonMounted(async () => {\n await delay(500);\n if (toValidURL(link.value)) {\n connect.invoke();\n }\n});\n\nconst snapshots = shallowRef<Snapshot[]>([]);\nwatchEffect(async () => {\n if (!device.value) return;\n title.value = `已连接 ` + device.value.manufacturer;\n const result = await api.snapshots();\n result.sort((a, b) => b.id - a.id);\n snapshots.value = result;\n const subsApps = await api.subsApps();\n subsText.value = JSON5.stringify(\n subsApps || [],\n function (key, value) {\n if (value === null) return undefined;\n return value;\n },\n 2,\n );\n});\n\nconst captureSnapshot = useTask(async () => {\n const snapshot = await api.captureSnapshot();\n const screenshot = await api.screenshot({ id: snapshot.id });\n await snapshotStorage.setItem(snapshot.id, snapshot);\n await screenshotStorage.setItem(snapshot.id, screenshot);\n message.success(`保存快照成功`);\n const result = await api.snapshots();\n result.sort((a, b) => b.id - a.id);\n snapshots.value = result;\n});\nconst downloadAllSnapshot = useTask(async () => {\n const snapshotIds = (await api.snapshots()).map((s) => s.id);\n const existSnapshotIds = new Set(\n (await screenshotStorage.keys()).map((s) => parseInt(s)),\n );\n const unimportSnapshotIds = snapshotIds.filter(\n (k) => !existSnapshotIds.has(k),\n );\n if (unimportSnapshotIds.length == 0) {\n message.success(`没有新记录可导入`);\n return;\n }\n let r = 0;\n const limit = pLimit(3);\n await Promise.all(\n unimportSnapshotIds.map((snapshotId) =>\n limit(async () => {\n const [newSnapshot, newScreenshot] = await Promise.all([\n api.snapshot({ id: snapshotId }),\n api.screenshot({ id: snapshotId }),\n ] as const);\n if (!newSnapshot.nodes) return;\n await Promise.all([\n snapshotStorage.setItem(snapshotId, newSnapshot),\n screenshotStorage.setItem(snapshotId, newScreenshot),\n ]);\n r++;\n }),\n ),\n );\n message.success(`导入${r}条新记录`);\n});\n\nconst {\n activityIdCol,\n appIdCol,\n appNameCol,\n ctimeCol,\n appVersionCodeCol,\n appVersionNameCol,\n reseColWidth,\n} = useSnapshotColumns();\nconst handleSorterChange = (sorter: SortState) => {\n if (sorter.columnKey == ctimeCol.key) {\n ctimeCol.sortOrder = sorter.order;\n }\n};\nconst previewSnapshot = useBatchTask(\n async (row: Snapshot) => {\n if (!(await snapshotStorage.hasItem(row.id))) {\n await snapshotStorage.setItem(row.id, await api.snapshot({ id: row.id }));\n }\n if (!(await screenshotStorage.hasItem(row.id))) {\n const bf = await api.screenshot({ id: row.id });\n await screenshotStorage.setItem(row.id, bf);\n }\n window.open(\n router.resolve({\n name: 'snapshot',\n params: { snapshotId: row.id },\n }).href,\n );\n },\n (r) => r.id,\n);\n\nconst columns: DataTableColumns<Snapshot> = [\n ctimeCol,\n appNameCol,\n appIdCol,\n appVersionCodeCol,\n appVersionNameCol,\n activityIdCol,\n {\n key: `actions`,\n title: `Action`,\n fixed: 'right',\n width: `120px`,\n render(row) {\n return (\n <NSpace size=\"small\">\n <NButton\n size=\"small\"\n loading={previewSnapshot.loading[row.id]}\n onClick={() => previewSnapshot.invoke(row)}\n >\n 查看\n </NButton>\n </NSpace>\n );\n },\n },\n];\n\nconst pagination = shallowReactive<PaginationProps>({\n page: 1,\n pageSize: 50,\n showSizePicker: true,\n pageSizes: [50, 100],\n onChange: (page: number) => {\n pagination.page = page;\n },\n onUpdatePageSize: (pageSize: number) => {\n pagination.pageSize = pageSize;\n pagination.page = 1;\n },\n});\nwatch(pagination, reseColWidth);\n\nconst showSubsModel = shallowRef(false);\nconst subsText = shallowRef(``);\nconst updateSubs = useTask(async () => {\n const appsSubs = errorWrap(() => JSON5.parse(subsText.value.trim() || `[]`));\n await api.updateSubsApps([].concat(appsSubs));\n message.success(`修改成功`);\n});\n\nconst showSelectorModel = shallowRef(false);\n\nconst actionOptions = [\n 'click',\n 'clickNode',\n 'clickCenter',\n 'back',\n 'longClick',\n 'longClickNode',\n 'longClickCenter',\n].map((s) => ({ value: s, label: s }));\nconst clickAction = shallowReactive({\n selector: ``,\n selectorValid: false,\n action: actionOptions[0].value,\n quickFind: false,\n});\nconst checkSelectorValid = useDebounceFn(() => {\n clickAction.selectorValid = checkSelector(clickAction.selector);\n}, 500);\nwatch(() => clickAction.selector.trim(), checkSelectorValid);\nconst execSelector = useTask(async () => {\n const result = await api.execSelector({ ...clickAction });\n if (result.message) {\n message.success(`点击成功:` + result.message);\n return;\n }\n if (result.action) {\n message.success((result.result ? `点击成功:` : `点击失败`) + result.action);\n }\n});\n</script>\n<template>\n <NModal\n v-model:show=\"showSubsModel\"\n preset=\"dialog\"\n style=\"width: 800px\"\n title=\"修改内存订阅\"\n positive-text=\"确认\"\n :positiveButtonProps=\"{\n loading: updateSubs.loading,\n onClick() {\n updateSubs.invoke();\n },\n }\"\n >\n <NInput\n v-model:value=\"subsText\"\n :disabled=\"updateSubs.loading\"\n type=\"textarea\"\n class=\"gkd_code\"\n :autosize=\"{\n minRows: 10,\n maxRows: 25,\n }\"\n :placeholder=\"`请输入订阅文本\\n订阅支持JSON5\\n根节点可以是APP规则对象也可以是APP规则对象数组`\"\n />\n </NModal>\n <NModal\n v-model:show=\"showSelectorModel\"\n preset=\"dialog\"\n style=\"width: 800px\"\n title=\"执行选择器\"\n positive-text=\"确认\"\n :positiveButtonProps=\"{\n loading: execSelector.loading,\n disabled: !clickAction.selectorValid,\n onClick() {\n execSelector.invoke();\n },\n }\"\n >\n <NInput\n v-model:value=\"clickAction.selector\"\n :disabled=\"execSelector.loading\"\n type=\"textarea\"\n class=\"gkd_code\"\n :autosize=\"{\n minRows: 4,\n maxRows: 10,\n }\"\n placeholder=\"请输入合法的选择器\"\n />\n <div h-15px></div>\n <NSpace>\n <NCheckbox v-model:checked=\"clickAction.quickFind\"> 快速查找 </NCheckbox>\n <a\n href=\"https://github.com/gkd-kit/subscription/blob/main/src/types.ts\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n 查找说明\n </a>\n </NSpace>\n <div h-10px></div>\n <div flex gap-10px flex-items-center>\n <NSelect\n v-model:value=\"clickAction.action\"\n :options=\"actionOptions\"\n class=\"w-150px\"\n />\n <a\n href=\"https://github.com/gkd-kit/subscription/blob/main/src/types.ts\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n 操作说明\n </a>\n </div>\n </NModal>\n <div flex flex-col p-10px gap-10px h-full>\n <NSpace>\n <RouterLink to=\"/\">\n <NButton>\n <template #icon>\n <NIcon>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n viewBox=\"0 0 32 32\"\n >\n <path\n d=\"M16.612 2.214a1.01 1.01 0 0 0-1.242 0L1 13.419l1.243 1.572L4 13.621V26a2.004 2.004 0 0 0 2 2h20a2.004 2.004 0 0 0 2-2V13.63L29.757 15L31 13.428zM18 26h-4v-8h4zm2 0v-8a2.002 2.002 0 0 0-2-2h-4a2.002 2.002 0 0 0-2 2v8H6V12.062l10-7.79l10 7.8V26z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </NIcon>\n </template>\n </NButton>\n </RouterLink>\n <NInputGroup>\n <NInput\n v-model:value=\"link\"\n placeholder=\"请输入设备地址\"\n :style=\"{ minWidth: `250px` }\"\n @keyup.enter=\"connect.invoke\"\n ></NInput>\n <NButton @click=\"connect.invoke\" :loading=\"connect.loading\">\n 刷新连接\n </NButton>\n </NInputGroup>\n <template v-if=\"device\">\n <div class=\"h-full\" flex flex-items-center>\n {{ `已连接 ${device.manufacturer} Android ${device.release}` }}\n </div>\n <NButton\n @click=\"captureSnapshot.invoke\"\n :loading=\"captureSnapshot.loading\"\n >\n 快照\n </NButton>\n <NButton\n @click=\"downloadAllSnapshot.invoke\"\n :loading=\"downloadAllSnapshot.loading\"\n >\n 下载设备所有快照\n </NButton>\n <NButton @click=\"showSubsModel = true\"> 修改内存订阅 </NButton>\n <NButton @click=\"showSelectorModel = true\"> 执行选择器 </NButton>\n </template>\n </NSpace>\n <NDataTable\n striped\n flexHeight\n :data=\"snapshots\"\n :columns=\"columns\"\n :pagination=\"pagination\"\n @update:sorter=\"handleSorterChange\"\n size=\"small\"\n class=\"flex-1\"\n :scrollX=\"1200\"\n />\n </div>\n</template>\n"],"names":["useDeviceApi","initOrigin","origin","shallowRef","rpc","rpcName","options","u","key","value","response","enhanceFetch","e","message","_a","error","jsonRpc","args","blobRpc","arrayBufferRpc","query","data","router","useRouter","title","useTitle","api","link","useStorage","device","connect","useTask","errorWrap","URL","trim","onMounted","delay","toValidURL","invoke","snapshots","watchEffect","manufacturer","result","sort","a","b","id","subsApps","subsText","JSON5","stringify","captureSnapshot","snapshot","screenshot","snapshotStorage","setItem","screenshotStorage","success","downloadAllSnapshot","snapshotIds","map","s","existSnapshotIds","Set","keys","parseInt","unimportSnapshotIds","filter","k","has","length","r","limit","pLimit","Promise","all","snapshotId","newSnapshot","newScreenshot","nodes","activityIdCol","appIdCol","appNameCol","ctimeCol","appVersionCodeCol","appVersionNameCol","reseColWidth","useSnapshotColumns","handleSorterChange","sorter","columnKey","sortOrder","order","previewSnapshot","useBatchTask","row","hasItem","bf","window","open","resolve","name","params","href","columns","fixed","width","render","_createVNode2","NSpace","default","NButton","loading","onClick","_createTextVNode2","pagination","shallowReactive","page","pageSize","showSizePicker","pageSizes","onChange","onUpdatePageSize","watch","showSubsModel","updateSubs","appsSubs","parse","updateSubsApps","concat","showSelectorModel","actionOptions","label","clickAction","selector","selectorValid","action","quickFind","checkSelectorValid","useDebounceFn","checkSelector","execSelector"],"mappings":"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"}
|