@gkd-kit/inspect 0.0.1708769671055 → 0.0.1708870030346
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-jngFbeQf.js → ActionCard.vue_vue_type_script_setup_true_lang-bdXQg2SL.js} +2 -2
- package/dist/assets/{ActionCard.vue_vue_type_script_setup_true_lang-jngFbeQf.js.map → ActionCard.vue_vue_type_script_setup_true_lang-bdXQg2SL.js.map} +1 -1
- package/dist/assets/DevicePage-GscUE7HR.js +49 -0
- package/dist/assets/{DevicePage-9B9ZTvVw.js.map → DevicePage-GscUE7HR.js.map} +1 -1
- package/dist/assets/{HomePage-wy9XE0ke.js → HomePage-kmSgREFC.js} +3 -3
- package/dist/assets/{HomePage-wy9XE0ke.js.map → HomePage-kmSgREFC.js.map} +1 -1
- package/dist/assets/{ImportPage-AewXAGny.js → ImportPage-AtLyzz_a.js} +2 -2
- package/dist/assets/{ImportPage-AewXAGny.js.map → ImportPage-AtLyzz_a.js.map} +1 -1
- package/dist/assets/PreviewSharePage-ELyIj-er.js +2 -0
- package/dist/assets/PreviewSharePage-ELyIj-er.js.map +1 -0
- package/dist/assets/{SnapshotPage-SK-mnJl4.js → SnapshotPage-zjRkjuhk.js} +5 -5
- package/dist/assets/{SnapshotPage-SK-mnJl4.js.map → SnapshotPage-zjRkjuhk.js.map} +1 -1
- package/dist/assets/{_404Page-ChHh9e92.js → _404Page-x9Bj0WOa.js} +2 -2
- package/dist/assets/{_404Page-ChHh9e92.js.map → _404Page-x9Bj0WOa.js.map} +1 -1
- package/dist/assets/{fetch-6tFB_nYd.js → fetch-kusZEOhe.js} +2 -2
- package/dist/assets/{fetch-6tFB_nYd.js.map → fetch-kusZEOhe.js.map} +1 -1
- package/dist/assets/{import-YPx9djff.js → import-f6CuhzB-.js} +2 -2
- package/dist/assets/{import-YPx9djff.js.map → import-f6CuhzB-.js.map} +1 -1
- package/dist/assets/{index-Fg_38lfL.js → index-6TeLZlcS.js} +5 -5
- package/dist/assets/{index-Fg_38lfL.js.map → index-6TeLZlcS.js.map} +1 -1
- package/dist/assets/index-lqIjL-r0.js +281 -0
- package/dist/assets/index-lqIjL-r0.js.map +1 -0
- package/dist/assets/index-rsHOFDdF.js +2 -0
- package/dist/assets/index-rsHOFDdF.js.map +1 -0
- package/dist/assets/{jszip.min-tFykGZ3t.js → jszip.min-_o07wekS.js} +2 -2
- package/dist/assets/{jszip.min-tFykGZ3t.js.map → jszip.min-_o07wekS.js.map} +1 -1
- package/dist/assets/node-fHHpJjCz.js +466 -0
- package/dist/assets/node-fHHpJjCz.js.map +1 -0
- package/dist/assets/{polyfills-4ameGDja.js → polyfills-byjI2alS.js} +1 -1
- package/dist/assets/selector-_O185w4J.js +4 -0
- package/dist/assets/selector-_O185w4J.js.map +1 -0
- package/dist/assets/{storage-9sfgfqD9.js → storage-0XjIHrX_.js} +2 -2
- package/dist/assets/{storage-9sfgfqD9.js.map → storage-0XjIHrX_.js.map} +1 -1
- package/dist/assets/{table-H95kOr8O.js → table-9opumX3q.js} +11 -11
- package/dist/assets/{table-H95kOr8O.js.map → table-9opumX3q.js.map} +1 -1
- package/dist/index.html +4 -4
- package/package.json +1 -1
- package/dist/assets/DevicePage-9B9ZTvVw.js +0 -49
- package/dist/assets/PreviewSharePage-sPJuNh7z.js +0 -2
- package/dist/assets/PreviewSharePage-sPJuNh7z.js.map +0 -1
- package/dist/assets/index-BY10JCNw.js +0 -281
- package/dist/assets/index-BY10JCNw.js.map +0 -1
- package/dist/assets/node-x4zH_vr4.js +0 -466
- package/dist/assets/node-x4zH_vr4.js.map +0 -1
- package/dist/assets/selector-3VPNr-8q.js +0 -4
- package/dist/assets/selector-3VPNr-8q.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevicePage-9B9ZTvVw.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 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 updateSubscription: async (data: any) => {\n return blobRpc(`updateSubscription`, {\n init: {\n method: 'POST',\n body: JSON.stringify({\n ...data,\n id: -1,\n name: '内存订阅',\n version: 0,\n }),\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 device.value.release;\n const result = await api.snapshots();\n result.sort((a, b) => b.id - a.id);\n snapshots.value = result;\n subsText.value = '';\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 data = errorWrap(() => JSON5.parse(subsText.value.trim()));\n if (!data) return;\n if (device.value?.gkdVersionCode) {\n if (data.categories || data.globalGroups || data.apps) {\n await api.updateSubscription(data);\n } else if (typeof data.id == 'string') {\n await api.updateSubscription({\n apps: [data],\n });\n } else if (Array.isArray(data) && typeof data[0].id == 'string') {\n await api.updateSubscription({\n apps: data,\n });\n } else if (typeof data.key == 'number') {\n await api.updateSubscription({\n globalGroups: [data],\n });\n } else if (Array.isArray(data) && typeof data[0].key == 'number') {\n await api.updateSubscription({\n globalGroups: data,\n });\n } else {\n message.error(`无法识别的订阅文本`);\n return;\n }\n } else {\n await api.updateSubsApps([].concat(data));\n }\n message.success(`修改成功`);\n});\n\nconst showSelectorModel = shallowRef(false);\n\nconst actionOptions: {\n value?: string;\n label: string;\n}[] = [\n {\n value: 'click',\n label: 'click',\n },\n {\n value: 'clickNode',\n label: 'clickNode',\n },\n {\n value: 'clickCenter',\n label: 'clickCenter',\n },\n {\n value: 'back',\n label: 'back',\n },\n {\n value: 'longClick',\n label: 'longClick',\n },\n {\n value: 'longClickNode',\n label: 'longClickNode',\n },\n {\n value: 'longClickCenter',\n label: 'longClickCenter',\n },\n {\n label: '仅查询',\n },\n];\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 } else if (!result.action && result.result) {\n message.success(`查询成功`);\n }\n});\n\nconst placeholder = `\n请输入订阅文本(JSON5语法):\n示例1-更新单个应用的规则:\n{\n id: 'appId',\n groups: []\n}\n\n示例2-更新多个应用的规则:\n[\n {\n id: 'appId1',\n groups: []\n },\n {\n id: 'appId2',\n groups: []\n }\n]\n\n示例3-更新全局规则(1.7.0):\n{\n name: '全局规则-1',\n key: 0,\n rules: []\n}\n\n示例3-更新多个全局规则(1.7.0):\n[\n {\n name: '全局规则-1',\n key: 0,\n rules: []\n },\n {\n name: '全局规则-2',\n key: 1,\n rules: []\n }\n]\n\n示例4-更新整个订阅(1.7.0):\n{\n apps: [],\n globalGroups: [],\n categories: [],\n}\n`.trim();\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: 20,\n maxRows: 25,\n }\"\n :placeholder=\"placeholder\"\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://gkd.li/api/interfaces/RawCommonProps.html#quickfind\"\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://gkd.li/api/interfaces/RawRuleProps#action\"\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","release","result","sort","a","b","id","subsText","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","JSON5","parse","gkdVersionCode","categories","globalGroups","apps","updateSubscription","Array","isArray","updateSubsApps","concat","showSelectorModel","actionOptions","label","clickAction","selector","selectorValid","action","quickFind","checkSelectorValid","useDebounceFn","checkSelector","execSelector","placeholder"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DevicePage-GscUE7HR.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 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 updateSubscription: async (data: any) => {\n return blobRpc(`updateSubscription`, {\n init: {\n method: 'POST',\n body: JSON.stringify({\n ...data,\n id: -1,\n name: '内存订阅',\n version: 0,\n }),\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 device.value.release;\n const result = await api.snapshots();\n result.sort((a, b) => b.id - a.id);\n snapshots.value = result;\n subsText.value = '';\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 data = errorWrap(() => JSON5.parse(subsText.value.trim()));\n if (!data) return;\n if (device.value?.gkdVersionCode) {\n if (data.categories || data.globalGroups || data.apps) {\n await api.updateSubscription(data);\n } else if (typeof data.id == 'string') {\n await api.updateSubscription({\n apps: [data],\n });\n } else if (Array.isArray(data) && typeof data[0].id == 'string') {\n await api.updateSubscription({\n apps: data,\n });\n } else if (typeof data.key == 'number') {\n await api.updateSubscription({\n globalGroups: [data],\n });\n } else if (Array.isArray(data) && typeof data[0].key == 'number') {\n await api.updateSubscription({\n globalGroups: data,\n });\n } else {\n message.error(`无法识别的订阅文本`);\n return;\n }\n } else {\n await api.updateSubsApps([].concat(data));\n }\n message.success(`修改成功`);\n});\n\nconst showSelectorModel = shallowRef(false);\n\nconst actionOptions: {\n value?: string;\n label: string;\n}[] = [\n {\n value: 'click',\n label: 'click',\n },\n {\n value: 'clickNode',\n label: 'clickNode',\n },\n {\n value: 'clickCenter',\n label: 'clickCenter',\n },\n {\n value: 'back',\n label: 'back',\n },\n {\n value: 'longClick',\n label: 'longClick',\n },\n {\n value: 'longClickNode',\n label: 'longClickNode',\n },\n {\n value: 'longClickCenter',\n label: 'longClickCenter',\n },\n {\n label: '仅查询',\n },\n];\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 } else if (!result.action && result.result) {\n message.success(`查询成功`);\n }\n});\n\nconst placeholder = `\n请输入订阅文本(JSON5语法):\n示例1-更新单个应用的规则:\n{\n id: 'appId',\n groups: []\n}\n\n示例2-更新多个应用的规则:\n[\n {\n id: 'appId1',\n groups: []\n },\n {\n id: 'appId2',\n groups: []\n }\n]\n\n示例3-更新全局规则(1.7.0):\n{\n name: '全局规则-1',\n key: 0,\n rules: []\n}\n\n示例3-更新多个全局规则(1.7.0):\n[\n {\n name: '全局规则-1',\n key: 0,\n rules: []\n },\n {\n name: '全局规则-2',\n key: 1,\n rules: []\n }\n]\n\n示例4-更新整个订阅(1.7.0):\n{\n apps: [],\n globalGroups: [],\n categories: [],\n}\n`.trim();\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: 20,\n maxRows: 25,\n }\"\n :placeholder=\"placeholder\"\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://gkd.li/api/interfaces/RawCommonProps.html#quickfind\"\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://gkd.li/api/interfaces/RawRuleProps#action\"\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","release","result","sort","a","b","id","subsText","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","JSON5","parse","gkdVersionCode","categories","globalGroups","apps","updateSubscription","Array","isArray","updateSubsApps","concat","showSelectorModel","actionOptions","label","clickAction","selector","selectorValid","action","quickFind","checkSelectorValid","useDebounceFn","checkSelector","execSelector","placeholder"],"mappings":"mmBAUa,MAAAA,GAAgBC,GAAwB,CAC7C,MAAAC,EAASC,EAAWF,CAAU,EAC9BG,EAAM,MAAOC,EAAiBC,EAAsB,CAAA,IAAO,OAC3D,GAAA,CAACJ,EAAO,MACJ,MAAA,IAAI,MAAM,mBAAmB,EAErC,MAAMK,EAAI,IAAI,IAAI,QAAUF,EAASH,EAAO,KAAK,EAC1C,OAAA,QAAQI,EAAQ,OAAS,CAAA,CAAE,EAAE,QAAQ,CAAC,CAACE,EAAKC,CAAK,IAAM,CACxDA,IAAU,QACdF,EAAE,aAAa,IAAIC,EAAK,OAAOC,CAAK,CAAC,CAAA,CACtC,EACK,MAAAC,EAAW,MAAMC,GAAaJ,EAAGD,EAAQ,IAAI,EAAE,MAAOM,GAAM,CACxD,MAAAC,EAAA,MAAM,SAAWR,CAAO,EAC1BO,CAAA,CACP,EACG,GAAA,CAACF,EAAS,GACZ,MAAAG,EAAQ,MAAM,SAAWR,EAAU,IAAMK,EAAS,MAAM,EAClDA,EAER,IAAII,EAAAJ,EAAS,QAAQ,IAAI,cAAc,IAAnC,MAAAI,EAAsC,SAAS,oBAAqB,CACtE,MAAMC,EAAS,MAAML,EAAS,QAAQ,KAAK,EAC3C,GAAIK,EAAM,QACA,MAAAF,EAAA,MAAME,EAAM,OAAO,EACrBL,CAEV,CACO,OAAAA,CAAA,EAEHM,EAAU,SAAaC,IAEnB,MADS,MAAMb,EAAI,GAAGa,CAAI,GACX,OAEnBC,EAAU,SAAUD,IAEjB,MADU,MAAMb,EAAI,GAAGa,CAAI,GACZ,OAElBE,EAAiB,SAAUF,IAExB,MADU,MAAMb,EAAI,GAAGa,CAAI,GACZ,cA+DjB,MAAA,CAAE,OAAAf,EAAQ,IA7DL,CACV,OAAQ,SAAYc,EAAgB,QAAQ,EAC5C,SAAU,MAAOI,GACRJ,EAAkB,WAAY,CAAE,MAAAI,CAAO,CAAA,EAEhD,WAAY,MAAOA,GACVD,EAAe,aAAc,CAAE,MAAAC,CAAO,CAAA,EAE/C,gBAAiB,SACRJ,EAAkB,iBAAiB,EAE5C,UAAW,SACFA,EAAoB,WAAW,EAExC,eAAgB,MAAOK,GACdH,EAAQ,iBAAkB,CAC/B,KAAM,CACJ,OAAQ,OACR,KAAM,KAAK,UAAUG,CAAI,EACzB,QAAS,CACP,eAAgB,kBAClB,CACF,CAAA,CACD,EAEH,mBAAoB,MAAOA,GAClBH,EAAQ,qBAAsB,CACnC,KAAM,CACJ,OAAQ,OACR,KAAM,KAAK,UAAU,CACnB,GAAGG,EACH,GAAI,GACJ,KAAM,OACN,QAAS,CAAA,CACV,EACD,QAAS,CACP,eAAgB,kBAClB,CACF,CAAA,CACD,EAEH,aAAc,MAAOA,GAKZL,EACL,eACA,CACE,KAAM,CACJ,OAAQ,OAER,KAAM,KAAK,UAAU,CAAE,GAAGK,EAAM,MAAOA,EAAK,SAAU,EACtD,QAAS,CACP,eAAgB,kBAClB,CACF,CACF,CAAA,CAEJ,EAGJ,+5BC3EA,MAAMC,EAASC,KACTC,EAAQC,GAAU,KAAI,EACtB,CAAEC,IAAAA,EAAKxB,OAAAA,CAAQ,EAAGF,GAAY,EAC9B2B,EAAOC,GAAY,cAAe,EAAC,EACnCC,EAAS1B,IACT2B,EAAUC,EAAQ,SAAY,CAC7BJ,EAAKlB,QACVP,EAAOO,MAAQuB,EACb,IAAM,IAAIC,IAAIN,EAAKlB,MAAMyB,KAAM,CAAA,EAC/B,IAAO,QACT,EAAEhC,OACFyB,EAAKlB,MAAQP,EAAOO,MACpBoB,EAAOpB,MAAQ,MAAMiB,EAAIG,OAAM,EACjC,CAAC,EACDM,GAAU,SAAY,CACpB,MAAMC,GAAM,GAAG,EACXC,GAAWV,EAAKlB,KAAK,GACvBqB,EAAQQ,OAAM,CAElB,CAAC,EAED,MAAMC,EAAYpC,EAAuB,CAAA,CAAE,EAC3CqC,GAAY,SAAY,CACtB,GAAI,CAACX,EAAOpB,MAAO,OACnBe,EAAMf,MAAS,OAAQoB,EAAOpB,MAAMgC,aACpCZ,EAAOpB,MAAMiC,QACb,MAAMC,EAAS,MAAMjB,EAAIa,YACzBI,EAAOC,KAAK,CAACC,EAAGC,IAAMA,EAAEC,GAAKF,EAAEE,EAAE,EACjCR,EAAU9B,MAAQkC,EAClBK,EAASvC,MAAQ,EACnB,CAAC,EAED,MAAMwC,EAAkBlB,EAAQ,SAAY,CAC1C,MAAMmB,EAAW,MAAMxB,EAAIuB,kBACrBE,EAAa,MAAMzB,EAAIyB,WAAW,CAAEJ,GAAIG,EAASH,EAAG,CAAC,EAC3D,MAAMK,EAAgBC,QAAQH,EAASH,GAAIG,CAAQ,EACnD,MAAMI,EAAkBD,QAAQH,EAASH,GAAII,CAAU,EACvDtC,EAAQ0C,QAAS,QAAO,EACxB,MAAMZ,EAAS,MAAMjB,EAAIa,YACzBI,EAAOC,KAAK,CAACC,EAAGC,IAAMA,EAAEC,GAAKF,EAAEE,EAAE,EACjCR,EAAU9B,MAAQkC,CACpB,CAAC,EACKa,EAAsBzB,EAAQ,SAAY,CAC9C,MAAM0B,GAAe,MAAM/B,EAAIa,UAAS,GAAImB,IAAKC,GAAMA,EAAEZ,EAAE,EACrDa,EAAmB,IAAIC,KAC1B,MAAMP,EAAkBQ,QAAQJ,IAAKC,GAAMI,SAASJ,CAAC,CAAC,CACzD,EACMK,EAAsBP,EAAYQ,OACrCC,GAAM,CAACN,EAAiBO,IAAID,CAAC,CAChC,EACA,GAAIF,EAAoBI,QAAU,EAAG,CACnCvD,EAAQ0C,QAAS,UAAS,EAC1B,MACF,CACA,IAAIc,EAAI,EACR,MAAMC,EAAQC,GAAO,CAAC,EACtB,MAAMC,QAAQC,IACZT,EAAoBN,IAAKgB,GACvBJ,EAAM,SAAY,CAChB,KAAM,CAACK,EAAaC,EAAa,EAAI,MAAMJ,QAAQC,IAAI,CACrD/C,EAAIwB,SAAS,CAAEH,GAAI2B,CAAW,CAAC,EAC/BhD,EAAIyB,WAAW,CAAEJ,GAAI2B,CAAY,CAAA,CAAC,CAC1B,EACLC,EAAYE,QACjB,MAAML,QAAQC,IAAI,CAChBrB,EAAgBC,QAAQqB,EAAYC,CAAW,EAC/CrB,EAAkBD,QAAQqB,EAAYE,EAAa,CAAC,CACrD,EACDP,IACD,CAAA,CACH,CACF,EACAxD,EAAQ0C,QAAS,KAAIc,CAAE,MAAK,CAC9B,CAAC,EAEK,CACJS,cAAAA,EACAC,SAAAA,EACAC,WAAAA,EACAC,SAAAA,EACAC,kBAAAA,EACAC,kBAAAA,EACAC,aAAAA,CACD,EAAGC,GAAkB,EAChBC,GAAsBC,GAAsB,CAC5CA,EAAOC,WAAaP,EAASzE,MAC/ByE,EAASQ,UAAYF,EAAOG,QAG1BC,EAAkBC,GACtB,MAAOC,GAAkB,CAIvB,GAHM,MAAMzC,EAAgB0C,QAAQD,EAAI9C,EAAE,GACxC,MAAMK,EAAgBC,QAAQwC,EAAI9C,GAAI,MAAMrB,EAAIwB,SAAS,CAAEH,GAAI8C,EAAI9C,EAAI,CAAA,CAAC,EAEtE,CAAE,MAAMO,EAAkBwC,QAAQD,EAAI9C,EAAE,EAAI,CAC9C,MAAMgD,EAAK,MAAMrE,EAAIyB,WAAW,CAAEJ,GAAI8C,EAAI9C,EAAG,CAAC,EAC9C,MAAMO,EAAkBD,QAAQwC,EAAI9C,GAAIgD,CAAE,CAC5C,CACAC,OAAOC,KACL3E,EAAO4E,QAAQ,CACbC,KAAM,WACNC,OAAQ,CAAE1B,WAAYmB,EAAI9C,EAAG,EAC9B,EAAEsD,IACL,CACF,EACChC,GAAMA,EAAEtB,EACX,EAEMuD,GAAsC,CAC1CrB,EACAD,EACAD,EACAG,EACAC,EACAL,EACA,CACEtE,IAAM,UACNgB,MAAQ,SACR+E,MAAO,QACPC,MAAQ,QACRC,OAAOZ,EAAK,CACV,OAAAa,EAAAC,EAAA,CAAA,KAAA,OAAA,EAAA,CAAAC,QAAAA,IAAAF,CAAAA,EAAAG,EAAA,CAAA,KAAA,QAAA,QAIelB,EAAgBmB,QAAQjB,EAAI9C,EAAE,EAAC,QAC/BgE,IAAMpB,EAAgBrD,OAAOuD,CAAG,CAAC,EAAA,CAAAe,QAAAA,IAAA,CAAAI,EAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAMlD,CACF,CAAC,EAGGC,EAAaC,EAAiC,CAClDC,KAAM,EACNC,SAAU,GACVC,eAAgB,GAChBC,UAAW,CAAC,GAAI,GAAG,EACnBC,SAAWJ,GAAiB,CAC1BF,EAAWE,KAAOA,CACnB,EACDK,iBAAmBJ,GAAqB,CACtCH,EAAWG,SAAWA,EACtBH,EAAWE,KAAO,CACpB,CACF,CAAC,EACDM,EAAMR,EAAY7B,CAAY,EAE9B,MAAMsC,EAAgBvH,EAAW,EAAK,EAChC6C,EAAW7C,EAAY,EAAC,EACxBwH,EAAa5F,EAAQ,SAAY,OACrC,MAAMV,EAAOW,EAAU,IAAM4F,GAAMC,MAAM7E,EAASvC,MAAMyB,KAAM,CAAA,CAAC,EAC/D,GAAKb,EACL,KAAIQ,EAAAA,EAAOpB,QAAPoB,MAAAA,EAAciG,eAChB,GAAIzG,EAAK0G,YAAc1G,EAAK2G,cAAgB3G,EAAK4G,KAC/C,MAAMvG,EAAIwG,mBAAmB7G,CAAI,UACxB,OAAOA,EAAK0B,IAAM,SAC3B,MAAMrB,EAAIwG,mBAAmB,CAC3BD,KAAM,CAAC5G,CAAI,CACb,CAAC,UACQ8G,MAAMC,QAAQ/G,CAAI,GAAK,OAAOA,EAAK,CAAC,EAAE0B,IAAM,SACrD,MAAMrB,EAAIwG,mBAAmB,CAC3BD,KAAM5G,CACR,CAAC,UACQ,OAAOA,EAAKb,KAAO,SAC5B,MAAMkB,EAAIwG,mBAAmB,CAC3BF,aAAc,CAAC3G,CAAI,CACrB,CAAC,UACQ8G,MAAMC,QAAQ/G,CAAI,GAAK,OAAOA,EAAK,CAAC,EAAEb,KAAO,SACtD,MAAMkB,EAAIwG,mBAAmB,CAC3BF,aAAc3G,CAChB,CAAC,MACI,CACLR,EAAQE,MAAO,WAAU,EACzB,MACF,MAEA,MAAMW,EAAI2G,eAAe,CAAA,EAAGC,OAAOjH,CAAI,CAAC,EAE1CR,EAAQ0C,QAAS,MAAK,EACxB,CAAC,EAEKgF,EAAoBpI,EAAW,EAAK,EAEpCqI,EAGA,CACJ,CACE/H,MAAO,QACPgI,MAAO,OACT,EACA,CACEhI,MAAO,YACPgI,MAAO,WACT,EACA,CACEhI,MAAO,cACPgI,MAAO,aACT,EACA,CACEhI,MAAO,OACPgI,MAAO,MACT,EACA,CACEhI,MAAO,YACPgI,MAAO,WACT,EACA,CACEhI,MAAO,gBACPgI,MAAO,eACT,EACA,CACEhI,MAAO,kBACPgI,MAAO,iBACT,EACA,CACEA,MAAO,KACT,CAAC,EAEGC,EAAcxB,EAAgB,CAClCyB,SAAW,GACXC,cAAe,GACfC,OAAQL,EAAc,CAAC,EAAE/H,MACzBqI,UAAW,EACb,CAAC,EACKC,GAAqBC,GAAc,IAAM,CAC7CN,EAAYE,cAAgBK,GAAcP,EAAYC,QAAQ,CAC/D,EAAE,GAAG,EACNlB,EAAM,IAAMiB,EAAYC,SAASzG,KAAM,EAAE6G,EAAkB,EAC3D,MAAMG,EAAenH,EAAQ,SAAY,CACvC,MAAMY,EAAS,MAAMjB,EAAIwH,aAAa,CAAE,GAAGR,CAAY,CAAC,EACxD,GAAI/F,EAAO9B,QAAS,CAClBA,EAAQ0C,QAAS,QAASZ,EAAO9B,OAAO,EACxC,MACF,CACI8B,EAAOkG,OACThI,EAAQ0C,SAASZ,EAAOA,OAAU,QAAU,QAASA,EAAOkG,MAAM,EACzD,CAAClG,EAAOkG,QAAUlG,EAAOA,QAClC9B,EAAQ0C,QAAS,MAAK,CAE1B,CAAC,EAEK4F,GAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+CnBjH,KAAI"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import{d as j,u as oe,s as g,w as P,c as B,a,b as o,e,F as R,f as G,o as V,N as $,g as r,h as p,t as W,i as F,j as ne,r as se,k as ie,l as i,m as re,n as ce,p as ue,R as de}from"./index-
|
|
1
|
+
import{d as j,u as oe,s as g,w as P,c as B,a,b as o,e,F as R,f as G,o as V,N as $,g as r,h as p,t as W,i as F,j as ne,r as se,k as ie,l as i,m as re,n as ce,p as ue,R as de}from"./index-6TeLZlcS.js";import{u as pe,_ as ve,b as we,a as ge,c as fe,s as J,d as he}from"./ActionCard.vue_vue_type_script_setup_true_lang-bdXQg2SL.js";import{c as me,d as ke,g as q}from"./fetch-kusZEOhe.js";import{u as m,N as xe,a as T,b as z}from"./node-fHHpJjCz.js";import{l as L,N as K,u as Ce,a as b}from"./index-lqIjL-r0.js";import{i as ye,a as _e}from"./import-f6CuhzB-.js";import{s as ze,a as H}from"./storage-0XjIHrX_.js";import{u as be,N as Se,r as Ne}from"./table-9opumX3q.js";import"./jszip.min-_o07wekS.js";const Ue=j({__name:"BuildShareDlg",props:{show:{default:!1},showModifiers:{}},emits:["update:show"],setup(O){const S=G(),k=oe(O,"show"),u=g(""),d=g(!1),x=Ce(()=>{try{L.parse(u.value),d.value=!1}catch{d.value=!0}},500);P(()=>{u.value.trim()?x():d.value=!0});const f=g(!1),v=g(""),D=()=>{me(v.value),f.value=!1},h=m(async()=>{const C=L.parse(u.value),s=await pe(new TextEncoder().encode(L.stringify({data:C,ctime:Date.now(),type:"share"})),"file.txt","text/plain"),c=location.origin+S.resolve(`/s/${s.id}`).href;v.value=c,f.value=!0});return(C,s)=>(V(),B(R,null,[a(e($),{show:k.value,"onUpdate:show":s[1]||(s[1]=c=>k.value=c),preset:"dialog",title:"分享规则",positiveText:e(h).loading?"分享中...":"分享",onPositiveClick:e(h).invoke,loading:e(h).loading,positiveButtonProps:{disabled:d.value},style:{width:"800px"},onAfterLeave:s[2]||(s[2]=c=>u.value="")},{default:o(()=>[a(e(K),{class:"gkd_code h-[calc(var(--gkd-height)*0.6)]",type:"textarea","show-count":"",value:u.value,"onUpdate:value":s[0]||(s[0]=c=>{e(h).loading||(u.value=c)}),placeholder:"请输入需要分享的规则"},null,8,["value"])]),_:1},8,["show","positiveText","onPositiveClick","loading","positiveButtonProps"]),a(e($),{show:f.value,"onUpdate:show":s[3]||(s[3]=c=>f.value=c),preset:"dialog",title:"分享成功",positiveText:"复制并关闭",negativeText:"重新分享",onPositiveClick:D,onNegativeClick:s[4]||(s[4]=c=>{f.value=!1,u.value="",k.value=!0}),onAfterLeave:s[5]||(s[5]=c=>v.value="")},{default:o(()=>[a(e(r),{text:"",tag:"a",href:v.value,target:"_blank",type:"primary"},{default:o(()=>[p(W(v.value),1)]),_:1},8,["href"])]),_:1},8,["show"])],64))}}),Pe={flex:"","flex-col":"","p-10px":"","gap-10px":"","h-full":""},De={flex:""},Ie=i("svg",{viewBox:"0 0 32 32"},[i("path",{d:"M29 27.586l-7.552-7.552a11.018 11.018 0 1 0-1.414 1.414L27.586 29zM4 13a9 9 0 1 1 9 9a9.01 9.01 0 0 1-9-9z",fill:"currentColor"})],-1),Me={"h-full":"",flex:"","flex-items-center":""},Te=i("div",{"flex-1":""},null,-1),Le=i("svg",{xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},[i("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32",d:"M256 112v288"}),i("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32",d:"M400 256H112"})],-1),Be=i("svg",{xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 1024 1024"},[i("path",{d:"M270.1 741.7c0 23.4 19.1 42.5 42.6 42.5h48.7v120.4c0 30.5 24.5 55.4 54.6 55.4c30.2 0 54.6-24.8 54.6-55.4V784.1h85v120.4c0 30.5 24.5 55.4 54.6 55.4c30.2 0 54.6-24.8 54.6-55.4V784.1h48.7c23.5 0 42.6-19.1 42.6-42.5V346.4h-486v395.3zm357.1-600.1l44.9-65c2.6-3.8 2-8.9-1.5-11.4c-3.5-2.4-8.5-1.2-11.1 2.6l-46.6 67.6c-30.7-12.1-64.9-18.8-100.8-18.8c-35.9 0-70.1 6.7-100.8 18.8l-46.6-67.5c-2.6-3.8-7.6-5.1-11.1-2.6c-3.5 2.4-4.1 7.4-1.5 11.4l44.9 65c-71.4 33.2-121.4 96.1-127.8 169.6h486c-6.6-73.6-56.7-136.5-128-169.7zM409.5 244.1a26.9 26.9 0 1 1 26.9-26.9a26.97 26.97 0 0 1-26.9 26.9zm208.4 0a26.9 26.9 0 1 1 26.9-26.9a26.97 26.97 0 0 1-26.9 26.9zm223.4 100.7c-30.2 0-54.6 24.8-54.6 55.4v216.4c0 30.5 24.5 55.4 54.6 55.4c30.2 0 54.6-24.8 54.6-55.4V400.1c.1-30.6-24.3-55.3-54.6-55.3zm-658.6 0c-30.2 0-54.6 24.8-54.6 55.4v216.4c0 30.5 24.5 55.4 54.6 55.4c30.2 0 54.6-24.8 54.6-55.4V400.1c0-30.6-24.5-55.3-54.6-55.3z",fill:"currentColor"})],-1),Re=i("svg",{xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 24 24"},[i("path",{d:"M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81c1.66 0 3-1.34 3-3s-1.34-3-3-3s-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65c0 1.61 1.31 2.92 2.92 2.92s2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z",fill:"currentColor"})],-1),Ve={href:"https://github.com/gkd-kit/inspect",target:"_blank",rel:"noopener noreferrer"},$e=i("svg",{xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 496 512"},[i("path",{d:"M165.9 397.4c0 2-2.3 3.6-5.2 3.6c-3.3.3-5.6-1.3-5.6-3.6c0-2 2.3-3.6 5.2-3.6c3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9c2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9c.3 2 2.9 3.3 5.9 2.6c2.9-.7 4.9-2.6 4.6-4.6c-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2c12.8 2.3 17.3-5.6 17.3-12.1c0-6.2-.3-40.4-.3-61.4c0 0-70 15-84.7-29.8c0 0-11.4-29.1-27.8-36.6c0 0-22.9-15.7 1.6-15.4c0 0 24.9 2 38.6 25.8c21.9 38.6 58.6 27.5 72.9 20.9c2.3-16 8.8-27.1 16-33.7c-55.9-6.2-112.3-14.3-112.3-110.5c0-27.5 7.6-41.3 23.6-58.9c-2.6-6.5-11.1-33.3 2.6-67.9c20.9-6.5 69 27 69 27c20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27c13.7 34.7 5.2 61.4 2.6 67.9c16 17.7 25.8 31.5 25.8 58.9c0 96.5-58.9 104.2-114.8 110.5c9.2 7.9 17 22.9 17 46.4c0 33.7-.3 75.4-.3 83.6c0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252C496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2c1.6 1.6 3.9 2.3 5.2 1c1.3-1 1-3.3-.7-5.2c-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9c1.6 1 3.6.7 4.3-.7c.7-1.3-.3-2.9-2.3-3.9c-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2c2.3 2.3 5.2 2.6 6.5 1c1.3-1.3.7-4.3-1.3-6.2c-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9c1.6 2.3 4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2c-1.4-2.3-4-3.3-5.6-2z",fill:"currentColor"})],-1),He=j({__name:"HomePage",setup(O){const S=G(),k=g([]),u=async()=>{k.value=(await ze.getAllItems()).reverse(),w.value=[]};u();const d=F({query:"",actualQuery:"",updateQuery:()=>{d.actualQuery=d.query.trim(),w.value=[]}}),x=ne(()=>{const l=d.actualQuery;return l?k.value.filter(t=>(t.appName||"").includes(l)||(t.appId||"").includes(l)||(t.activityId||"").includes(l)):k.value}),f=m(async()=>{await ye(),await u()}),{activityIdCol:v,appIdCol:D,appNameCol:h,ctimeCol:C,mtimeCol:s,deviceCol:c,appVersionCodeCol:X,appVersionNameCol:Y,reseColWidth:ee}=be();P(()=>{const l=x.value.reduce((t,n)=>(t.add(Ne(n)),t),new Set);if(l.size<=1){c.filterOptions=void 0;return}c.filterOptions=[...l.values()].map(t=>({value:t,label:t}))}),P(()=>{const l=x.value.reduce((t,n)=>(t.add(n.appName),t),new Set);if(l.size<=1){h.filterOptions=void 0;return}h.filterOptions=[...l.values()].map(t=>({value:t,label:t}))}),P(()=>{const l=x.value.reduce((t,n)=>(t.add(n.activityId),t),new Set);if(l.size<=1){v.filterOptions=void 0;return}v.filterOptions=[...l.values()].map(t=>({value:t,label:t}))});const te=se([{type:"selection"},C,s,c,h,D,X,Y,v,{key:"actions",title:"操作",fixed:"right",width:"255px",render(l){return a(ve,{snapshot:l,onDelete:u},null)}}]),y=F({page:1,pageSize:50,showSizePicker:!0,pageSizes:[50,100],onChange:l=>{y.page=l},onUpdatePageSize:l=>{y.pageSize=l,y.page=1}});ie(y,ee);const ae=l=>{[C,s].forEach(t=>{l.columnKey!=t.key?t.sortOrder=void 0:t.sortOrder=l.order})};s.sortOrder="descend";const I=g(!1),_=g(""),N=m(async()=>{const l=_.value.trim().split(`
|
|
2
2
|
`).map(t=>t.trim()).filter(t=>re(t));l.length!=0&&(await _e(l),await u(),_.value="")}),w=g([]),U=()=>Promise.all(w.value.map(l=>H.getItem(l))),le=m(async()=>{await new Promise((l,t)=>{ke.warning({title:"删除",content:`是否批量删除 ${w.value.length} 个快照`,negativeText:"取消",positiveText:"确认",onClose:t,onEsc:t,onMaskClick:t,onNegativeClick:t,onPositiveClick:l})}),await Promise.all(w.value.map(l=>H.removeItem(l))),await u()}),Q=m(async()=>{await we(await U())}),Z=m(async()=>{await ge(await U())}),A=m(async()=>{const l=await fe(await U());J({content:l.map(t=>q(S,t)).join(`
|
|
3
3
|
`)+`
|
|
4
4
|
`})}),E=m(async()=>{const l=await he(await U());J({content:l.map(t=>q(S,t)).join(`
|
|
5
5
|
`)+`
|
|
6
|
-
`})}),M=g(!1);return(l,t)=>(V(),B(R,null,[i("div",Pe,[i("div",De,[a(e(z),null,{default:o(()=>[a(e(
|
|
6
|
+
`})}),M=g(!1);return(l,t)=>(V(),B(R,null,[i("div",Pe,[i("div",De,[a(e(z),null,{default:o(()=>[a(e(xe),null,{default:o(()=>[a(e(K),{placeholder:"请输入应用名称/应用ID/界面ID",clearable:"",class:"min-w-320px",value:e(d).query,"onUpdate:value":t[0]||(t[0]=n=>e(d).query=n),onKeyup:ce(e(d).updateQuery,["enter"]),onChange:e(d).updateQuery},null,8,["value","onKeyup","onChange"]),a(e(r),{onClick:e(d).updateQuery},{icon:o(()=>[a(e(b),null,{default:o(()=>[Ie]),_:1})]),_:1},8,["onClick"])]),_:1}),w.value.length?(V(),B(R,{key:0},[a(e(T),null,{trigger:o(()=>[a(e(r),null,{default:o(()=>[p(" 批量下载 ")]),_:1})]),default:o(()=>[a(e(z),{vertical:""},{default:o(()=>[a(e(r),{onClick:e(Z).invoke,loading:e(Z).loading},{default:o(()=>[p(" 批量下载-快照 ")]),_:1},8,["onClick","loading"]),a(e(r),{onClick:e(Q).invoke,loading:e(Q).loading},{default:o(()=>[p(" 批量下载-图片 ")]),_:1},8,["onClick","loading"])]),_:1})]),_:1}),a(e(T),null,{trigger:o(()=>[a(e(r),null,{default:o(()=>[p(" 批量分享 ")]),_:1})]),default:o(()=>[a(e(z),{vertical:""},{default:o(()=>[a(e(r),{onClick:e(E).invoke,loading:e(E).loading},{default:o(()=>[p(" 批量生成链接-快照 ")]),_:1},8,["onClick","loading"]),a(e(r),{onClick:e(A).invoke,loading:e(A).loading},{default:o(()=>[p(" 批量生成链接-图片 ")]),_:1},8,["onClick","loading"])]),_:1})]),_:1}),a(e(r),{onClick:e(le).invoke},{default:o(()=>[p(" 批量删除 ")]),_:1},8,["onClick"]),i("div",Me,W(`已选中 ${w.value.length} 个快照`),1)],64)):ue("",!0)]),_:1}),Te,a(e(z),null,{default:o(()=>[a(e(T),null,{trigger:o(()=>[a(e(r),null,{icon:o(()=>[a(e(b),null,{default:o(()=>[Le]),_:1})]),_:1})]),default:o(()=>[a(e(z),{vertical:""},{default:o(()=>[a(e(r),{onClick:e(f).invoke,loading:e(f).loading},{default:o(()=>[p(" 导入本地文件 ")]),_:1},8,["onClick","loading"]),a(e(r),{onClick:t[1]||(t[1]=n=>I.value=!0),loading:e(N).loading},{default:o(()=>[p(" 导入网络文件 ")]),_:1},8,["loading"])]),_:1})]),_:1}),a(e(de),{to:"/device",title:"连接设备"},{default:o(()=>[a(e(r),null,{icon:o(()=>[a(e(b),null,{default:o(()=>[Be]),_:1})]),_:1})]),_:1}),a(e(r),{title:"创建分享",onClick:t[2]||(t[2]=n=>M.value=!0)},{icon:o(()=>[a(e(b),null,{default:o(()=>[Re]),_:1})]),_:1}),i("a",Ve,[a(e(r),null,{icon:o(()=>[a(e(b),null,{default:o(()=>[$e]),_:1})]),_:1})])]),_:1})]),a(e(Se),{striped:"",data:x.value,columns:te,scrollX:1800,pagination:e(y),checkedRowKeys:w.value,"onUpdate:checkedRowKeys":t[3]||(t[3]=n=>w.value=n),rowKey:n=>n.id,"onUpdate:sorter":ae,size:"small",class:"flex-1",flexHeight:""},null,8,["data","columns","pagination","checkedRowKeys","rowKey"])]),a(e($),{show:I.value,"onUpdate:show":t[5]||(t[5]=n=>I.value=n),preset:"dialog",title:"导入网络文件",showIcon:!1,positiveText:"确认",negativeText:"取消",style:{width:"800px"},onPositiveClick:e(N).invoke,loading:e(N).loading,onAfterLeave:t[6]||(t[6]=n=>_.value="")},{default:o(()=>[a(e(K),{value:_.value,"onUpdate:value":t[4]||(t[4]=n=>{e(N).loading||(_.value=n)}),type:"textarea",placeholder:`仅支持ZIP文件链接
|
|
7
7
|
每行一个
|
|
8
8
|
空白行自动忽略
|
|
9
9
|
非法链接行自动忽略`,autosize:{minRows:8,maxRows:16},inputProps:{style:"white-space: nowrap;"}},null,8,["value"])]),_:1},8,["show","onPositiveClick","loading"]),a(Ue,{show:M.value,"onUpdate:show":t[7]||(t[7]=n=>M.value=n)},null,8,["show"])],64))}});export{He as default};
|
|
10
|
-
//# sourceMappingURL=HomePage-
|
|
10
|
+
//# sourceMappingURL=HomePage-kmSgREFC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HomePage-wy9XE0ke.js","sources":["../../src/components/BuildShareDlg.vue","../../src/views/HomePage.vue"],"sourcesContent":["<script setup lang=\"tsx\">\nimport { uploadPoliciesAssets } from '@/utils/github';\nimport { copy } from '@/utils/others';\nimport { useTask } from '@/utils/task';\nimport { useDebounceFn } from '@vueuse/core';\nimport JSON5 from 'json5';\nimport { NButton, NInput, NModal } from 'naive-ui';\nimport { shallowRef, watchEffect } from 'vue';\nimport { useRouter } from 'vue-router';\n\nconst router = useRouter();\n\nconst show = defineModel('show', { default: false });\n\nconst text = shallowRef('');\n\nconst disabled = shallowRef(false);\nconst checkJson = useDebounceFn(() => {\n try {\n JSON5.parse(text.value);\n disabled.value = false;\n } catch {\n disabled.value = true;\n }\n}, 500);\nwatchEffect(() => {\n if (text.value.trim()) {\n checkJson();\n } else {\n disabled.value = true;\n }\n});\n\nconst linkDlgShow = shallowRef(false);\nconst shareLink = shallowRef('');\nconst copyLink = () => {\n copy(shareLink.value);\n linkDlgShow.value = false;\n};\n\nconst buildShare = useTask(async () => {\n const data = JSON5.parse(text.value);\n const asset = await uploadPoliciesAssets(\n new TextEncoder().encode(\n JSON5.stringify({\n data,\n ctime: Date.now(),\n type: 'share',\n }),\n ),\n 'file.txt',\n 'text/plain',\n );\n const link = location.origin + router.resolve(`/s/${asset.id}`).href;\n shareLink.value = link;\n linkDlgShow.value = true;\n});\n</script>\n<template>\n <NModal\n v-model:show=\"show\"\n preset=\"dialog\"\n title=\"分享规则\"\n :positiveText=\"buildShare.loading ? '分享中...' : '分享'\"\n @positiveClick=\"buildShare.invoke\"\n :loading=\"buildShare.loading\"\n :positiveButtonProps=\"{ disabled }\"\n style=\"width: 800px\"\n @afterLeave=\"text = ''\"\n >\n <NInput\n class=\"gkd_code h-[calc(var(--gkd-height)*0.6)]\"\n type=\"textarea\"\n show-count\n :value=\"text\"\n @update:value=\"\n if (!buildShare.loading) {\n text = $event;\n }\n \"\n placeholder=\"请输入需要分享的规则\"\n />\n </NModal>\n <NModal\n v-model:show=\"linkDlgShow\"\n preset=\"dialog\"\n title=\"分享成功\"\n positiveText=\"复制并关闭\"\n negativeText=\"重新分享\"\n @positiveClick=\"copyLink\"\n @negativeClick=\"\n linkDlgShow = false;\n text = '';\n show = true;\n \"\n @afterLeave=\"shareLink = ''\"\n >\n <NButton text tag=\"a\" :href=\"shareLink\" target=\"_blank\" type=\"primary\">\n {{ shareLink }}\n </NButton>\n </NModal>\n</template>\n","<script lang=\"tsx\" setup>\nimport ActionCard from '@/components/ActionCard.vue';\nimport BuildShareDlg from '@/components/BuildShareDlg.vue';\nimport { toValidURL } from '@/utils/check';\nimport { showTextDLg } from '@/utils/dialog';\nimport { dialog } from '@/utils/discrete';\nimport {\n batchCreateJpgUrl,\n batchCreateZipUrl,\n batchJpgDownloadZip,\n batchZipDownloadZip,\n} from '@/utils/export';\nimport { importFromLocal, importFromNetwork } from '@/utils/import';\nimport { shallowSnapshotStorage, snapshotStorage } from '@/utils/storage';\nimport { renderDveice, useSnapshotColumns } from '@/utils/table';\nimport { useTask } from '@/utils/task';\nimport type { Snapshot } from '@/utils/types';\nimport { githubUrlToSelfUrl } from '@/utils/url';\nimport {\n NButton,\n NDataTable,\n NIcon,\n NInput,\n NInputGroup,\n NModal,\n NPopover,\n NSpace,\n PaginationProps,\n type DataTableColumns,\n} from 'naive-ui';\nimport type { SortState } from 'naive-ui/es/data-table/src/interface';\nimport {\n computed,\n reactive,\n shallowReactive,\n shallowRef,\n watch,\n watchEffect,\n} from 'vue';\nimport { RouterLink, useRouter } from 'vue-router';\n\nconst router = useRouter();\n\nconst snapshots = shallowRef<Snapshot[]>([]);\nconst updateSnapshots = async () => {\n snapshots.value = (await shallowSnapshotStorage.getAllItems()).reverse();\n checkedRowKeys.value = [];\n};\nupdateSnapshots();\nconst filterOption = shallowReactive({\n query: ``,\n actualQuery: ``,\n updateQuery: () => {\n filterOption.actualQuery = filterOption.query.trim();\n checkedRowKeys.value = [];\n },\n});\nconst filterSnapshots = computed(() => {\n const actualQuery = filterOption.actualQuery;\n if (!actualQuery) return snapshots.value;\n return snapshots.value.filter((s) => {\n return (\n (s.appName || ``).includes(actualQuery) ||\n (s.appId || ``).includes(actualQuery) ||\n (s.activityId || ``).includes(actualQuery)\n );\n });\n});\n\nconst importLoacl = useTask(async () => {\n await importFromLocal();\n await updateSnapshots();\n});\n\nconst {\n activityIdCol,\n appIdCol,\n appNameCol,\n ctimeCol,\n mtimeCol,\n deviceCol,\n appVersionCodeCol,\n appVersionNameCol,\n reseColWidth,\n} = useSnapshotColumns();\n\nwatchEffect(() => {\n const set = filterSnapshots.value.reduce(\n (p, c) => (p.add(renderDveice(c)), p),\n new Set<string>(),\n );\n if (set.size <= 1) {\n deviceCol.filterOptions = undefined;\n return;\n }\n deviceCol.filterOptions = [...set.values()].map((s) => ({\n value: s,\n label: s,\n }));\n});\n\nwatchEffect(() => {\n const set = filterSnapshots.value.reduce(\n (p, c) => (p.add(c.appName), p),\n new Set<string>(),\n );\n if (set.size <= 1) {\n appNameCol.filterOptions = undefined;\n return;\n }\n appNameCol.filterOptions = [...set.values()].map((s) => ({\n value: s,\n label: s,\n }));\n});\n\nwatchEffect(() => {\n const set = filterSnapshots.value.reduce(\n (p, c) => (p.add(c.activityId), p),\n new Set<string>(),\n );\n if (set.size <= 1) {\n activityIdCol.filterOptions = undefined;\n return;\n }\n activityIdCol.filterOptions = [...set.values()].map((s) => ({\n value: s,\n label: s,\n }));\n});\n\nconst columns: DataTableColumns<Snapshot> = reactive([\n {\n type: 'selection',\n },\n ctimeCol,\n mtimeCol,\n deviceCol,\n appNameCol,\n appIdCol,\n appVersionCodeCol,\n appVersionNameCol,\n activityIdCol,\n {\n key: `actions`,\n title: `操作`,\n fixed: 'right',\n width: `255px`,\n render(row) {\n return <ActionCard snapshot={row} onDelete={updateSnapshots} />;\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 handleSorterChange = (sorter: SortState) => {\n [ctimeCol, mtimeCol].forEach((c) => {\n if (sorter.columnKey != c.key) {\n c.sortOrder = undefined;\n } else {\n c.sortOrder = sorter.order;\n }\n });\n};\nmtimeCol.sortOrder = `descend`;\nconst showModal = shallowRef(false);\nconst text = shallowRef(``);\nconst importNetwork = useTask(async () => {\n const urls = text.value\n .trim()\n .split(`\\n`)\n .map((u) => u.trim())\n .filter((u) => toValidURL(u));\n if (urls.length == 0) return;\n await importFromNetwork(urls);\n await updateSnapshots();\n text.value = ``;\n});\n\nconst checkedRowKeys = shallowRef<number[]>([]);\nconst checkedSnapshots = () => {\n return Promise.all(\n checkedRowKeys.value.map(\n (id) => snapshotStorage.getItem(id) as Promise<Snapshot>,\n ),\n );\n};\nconst batchDelete = useTask(async () => {\n await new Promise((res, rej) => {\n dialog.warning({\n title: `删除`,\n content: `是否批量删除 ${checkedRowKeys.value.length} 个快照`,\n negativeText: `取消`,\n positiveText: `确认`,\n onClose: rej,\n onEsc: rej,\n onMaskClick: rej,\n onNegativeClick: rej,\n onPositiveClick: res,\n });\n });\n\n await Promise.all(\n checkedRowKeys.value.map((k) => snapshotStorage.removeItem(k)),\n );\n await updateSnapshots();\n});\nconst batchDownloadJpg = useTask(async () => {\n await batchJpgDownloadZip(await checkedSnapshots());\n});\nconst batchDownloadZip = useTask(async () => {\n await batchZipDownloadZip(await checkedSnapshots());\n});\n\nconst batchShareJpgUrl = useTask(async () => {\n const pngUrls = await batchCreateJpgUrl(await checkedSnapshots());\n showTextDLg({\n content:\n pngUrls.map((s) => githubUrlToSelfUrl(router, s)).join(`\\n`) + `\\n`,\n });\n});\nconst batchShareZipUrl = useTask(async () => {\n const zipUrls = await batchCreateZipUrl(await checkedSnapshots());\n showTextDLg({\n content:\n zipUrls.map((s) => githubUrlToSelfUrl(router, s)).join(`\\n`) + `\\n`,\n });\n});\n\nconst shareDlgShow = shallowRef(false);\n</script>\n<template>\n <div flex flex-col p-10px gap-10px h-full>\n <div flex>\n <NSpace>\n <NInputGroup>\n <NInput\n placeholder=\"请输入应用名称/应用ID/界面ID\"\n clearable\n class=\"min-w-320px\"\n v-model:value=\"filterOption.query\"\n @keyup.enter=\"filterOption.updateQuery\"\n @change=\"filterOption.updateQuery\"\n ></NInput>\n <NButton @click=\"filterOption.updateQuery\">\n <template #icon>\n <NIcon>\n <svg viewBox=\"0 0 32 32\">\n <path\n d=\"M29 27.586l-7.552-7.552a11.018 11.018 0 1 0-1.414 1.414L27.586 29zM4 13a9 9 0 1 1 9 9a9.01 9.01 0 0 1-9-9z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </NIcon>\n </template>\n </NButton>\n </NInputGroup>\n <template v-if=\"checkedRowKeys.length\">\n <NPopover>\n <template #trigger>\n <NButton> 批量下载 </NButton>\n </template>\n <NSpace vertical>\n <NButton\n @click=\"batchDownloadZip.invoke\"\n :loading=\"batchDownloadZip.loading\"\n >\n 批量下载-快照\n </NButton>\n <NButton\n @click=\"batchDownloadJpg.invoke\"\n :loading=\"batchDownloadJpg.loading\"\n >\n 批量下载-图片\n </NButton>\n </NSpace>\n </NPopover>\n <NPopover>\n <template #trigger>\n <NButton> 批量分享 </NButton>\n </template>\n <NSpace vertical>\n <NButton\n @click=\"batchShareZipUrl.invoke\"\n :loading=\"batchShareZipUrl.loading\"\n >\n 批量生成链接-快照\n </NButton>\n <NButton\n @click=\"batchShareJpgUrl.invoke\"\n :loading=\"batchShareJpgUrl.loading\"\n >\n 批量生成链接-图片\n </NButton>\n </NSpace>\n </NPopover>\n <NButton @click=\"batchDelete.invoke\"> 批量删除 </NButton>\n <div h-full flex flex-items-center>\n {{ `已选中 ${checkedRowKeys.length} 个快照` }}\n </div>\n </template>\n </NSpace>\n <div flex-1></div>\n <NSpace>\n <NPopover>\n <template #trigger>\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 512 512\"\n >\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"32\"\n d=\"M256 112v288\"\n ></path>\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"32\"\n d=\"M400 256H112\"\n ></path>\n </svg>\n </NIcon>\n </template>\n </NButton>\n </template>\n <NSpace vertical>\n <NButton @click=\"importLoacl.invoke\" :loading=\"importLoacl.loading\">\n 导入本地文件\n </NButton>\n <NButton @click=\"showModal = true\" :loading=\"importNetwork.loading\">\n 导入网络文件\n </NButton>\n </NSpace>\n </NPopover>\n <RouterLink to=\"/device\" title=\"连接设备\">\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 1024 1024\"\n >\n <path\n d=\"M270.1 741.7c0 23.4 19.1 42.5 42.6 42.5h48.7v120.4c0 30.5 24.5 55.4 54.6 55.4c30.2 0 54.6-24.8 54.6-55.4V784.1h85v120.4c0 30.5 24.5 55.4 54.6 55.4c30.2 0 54.6-24.8 54.6-55.4V784.1h48.7c23.5 0 42.6-19.1 42.6-42.5V346.4h-486v395.3zm357.1-600.1l44.9-65c2.6-3.8 2-8.9-1.5-11.4c-3.5-2.4-8.5-1.2-11.1 2.6l-46.6 67.6c-30.7-12.1-64.9-18.8-100.8-18.8c-35.9 0-70.1 6.7-100.8 18.8l-46.6-67.5c-2.6-3.8-7.6-5.1-11.1-2.6c-3.5 2.4-4.1 7.4-1.5 11.4l44.9 65c-71.4 33.2-121.4 96.1-127.8 169.6h486c-6.6-73.6-56.7-136.5-128-169.7zM409.5 244.1a26.9 26.9 0 1 1 26.9-26.9a26.97 26.97 0 0 1-26.9 26.9zm208.4 0a26.9 26.9 0 1 1 26.9-26.9a26.97 26.97 0 0 1-26.9 26.9zm223.4 100.7c-30.2 0-54.6 24.8-54.6 55.4v216.4c0 30.5 24.5 55.4 54.6 55.4c30.2 0 54.6-24.8 54.6-55.4V400.1c.1-30.6-24.3-55.3-54.6-55.3zm-658.6 0c-30.2 0-54.6 24.8-54.6 55.4v216.4c0 30.5 24.5 55.4 54.6 55.4c30.2 0 54.6-24.8 54.6-55.4V400.1c0-30.6-24.5-55.3-54.6-55.3z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </NIcon>\n </template>\n </NButton>\n </RouterLink>\n\n <NButton title=\"创建分享\" @click=\"shareDlgShow = true\">\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 24 24\"\n >\n <path\n d=\"M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81c1.66 0 3-1.34 3-3s-1.34-3-3-3s-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65c0 1.61 1.31 2.92 2.92 2.92s2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </NIcon>\n </template>\n </NButton>\n\n <a\n href=\"https://github.com/gkd-kit/inspect\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\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 496 512\"\n >\n <path\n d=\"M165.9 397.4c0 2-2.3 3.6-5.2 3.6c-3.3.3-5.6-1.3-5.6-3.6c0-2 2.3-3.6 5.2-3.6c3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9c2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9c.3 2 2.9 3.3 5.9 2.6c2.9-.7 4.9-2.6 4.6-4.6c-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2c12.8 2.3 17.3-5.6 17.3-12.1c0-6.2-.3-40.4-.3-61.4c0 0-70 15-84.7-29.8c0 0-11.4-29.1-27.8-36.6c0 0-22.9-15.7 1.6-15.4c0 0 24.9 2 38.6 25.8c21.9 38.6 58.6 27.5 72.9 20.9c2.3-16 8.8-27.1 16-33.7c-55.9-6.2-112.3-14.3-112.3-110.5c0-27.5 7.6-41.3 23.6-58.9c-2.6-6.5-11.1-33.3 2.6-67.9c20.9-6.5 69 27 69 27c20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27c13.7 34.7 5.2 61.4 2.6 67.9c16 17.7 25.8 31.5 25.8 58.9c0 96.5-58.9 104.2-114.8 110.5c9.2 7.9 17 22.9 17 46.4c0 33.7-.3 75.4-.3 83.6c0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252C496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2c1.6 1.6 3.9 2.3 5.2 1c1.3-1 1-3.3-.7-5.2c-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9c1.6 1 3.6.7 4.3-.7c.7-1.3-.3-2.9-2.3-3.9c-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2c2.3 2.3 5.2 2.6 6.5 1c1.3-1.3.7-4.3-1.3-6.2c-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9c1.6 2.3 4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2c-1.4-2.3-4-3.3-5.6-2z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </NIcon>\n </template>\n </NButton>\n </a>\n </NSpace>\n </div>\n <NDataTable\n striped\n :data=\"filterSnapshots\"\n :columns=\"columns\"\n :scrollX=\"1800\"\n :pagination=\"pagination\"\n v-model:checkedRowKeys=\"checkedRowKeys\"\n :rowKey=\"(r:Snapshot)=>r.id\"\n @update:sorter=\"handleSorterChange\"\n size=\"small\"\n class=\"flex-1\"\n flexHeight\n />\n </div>\n <NModal\n v-model:show=\"showModal\"\n preset=\"dialog\"\n title=\"导入网络文件\"\n :showIcon=\"false\"\n positiveText=\"确认\"\n negativeText=\"取消\"\n style=\"width: 800px\"\n @positiveClick=\"importNetwork.invoke\"\n :loading=\"importNetwork.loading\"\n @afterLeave=\"text = ``\"\n >\n <NInput\n :value=\"text\"\n @update:value=\"\n if (!importNetwork.loading) {\n text = $event;\n }\n \"\n type=\"textarea\"\n :placeholder=\"`仅支持ZIP文件链接\\n每行一个\\n空白行自动忽略\\n非法链接行自动忽略`\"\n :autosize=\"{\n minRows: 8,\n maxRows: 16,\n }\"\n :inputProps=\"{\n style: `white-space: nowrap;`,\n }\"\n />\n </NModal>\n <BuildShareDlg v-model:show=\"shareDlgShow\" />\n</template>\n"],"names":["router","useRouter","show","_useModel","text","shallowRef","disabled","checkJson","useDebounceFn","JSON5","parse","value","watchEffect","trim","linkDlgShow","shareLink","copyLink","copy","buildShare","useTask","data","asset","uploadPoliciesAssets","TextEncoder","encode","stringify","ctime","Date","now","type","link","location","origin","resolve","id","href","snapshots","updateSnapshots","shallowSnapshotStorage","getAllItems","reverse","checkedRowKeys","filterOption","shallowReactive","query","actualQuery","updateQuery","filterSnapshots","computed","filter","s","appName","includes","appId","activityId","importLoacl","importFromLocal","activityIdCol","appIdCol","appNameCol","ctimeCol","mtimeCol","deviceCol","appVersionCodeCol","appVersionNameCol","reseColWidth","useSnapshotColumns","set","reduce","p","c","add","renderDveice","Set","size","filterOptions","undefined","values","map","label","columns","reactive","key","title","fixed","width","render","row","_createVNode2","ActionCard","pagination","page","pageSize","showSizePicker","pageSizes","onChange","onUpdatePageSize","watch","handleSorterChange","sorter","forEach","columnKey","sortOrder","order","showModal","importNetwork","urls","split","u","toValidURL","length","importFromNetwork","checkedSnapshots","Promise","all","snapshotStorage","getItem","batchDelete","res","rej","dialog","warning","content","negativeText","positiveText","onClose","onEsc","onMaskClick","onNegativeClick","onPositiveClick","k","removeItem","batchDownloadJpg","batchJpgDownloadZip","batchDownloadZip","batchZipDownloadZip","batchShareJpgUrl","pngUrls","batchCreateJpgUrl","showTextDLg","githubUrlToSelfUrl","join","batchShareZipUrl","zipUrls","batchCreateZipUrl","shareDlgShow"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HomePage-kmSgREFC.js","sources":["../../src/components/BuildShareDlg.vue","../../src/views/HomePage.vue"],"sourcesContent":["<script setup lang=\"tsx\">\nimport { uploadPoliciesAssets } from '@/utils/github';\nimport { copy } from '@/utils/others';\nimport { useTask } from '@/utils/task';\nimport { useDebounceFn } from '@vueuse/core';\nimport JSON5 from 'json5';\nimport { NButton, NInput, NModal } from 'naive-ui';\nimport { shallowRef, watchEffect } from 'vue';\nimport { useRouter } from 'vue-router';\n\nconst router = useRouter();\n\nconst show = defineModel('show', { default: false });\n\nconst text = shallowRef('');\n\nconst disabled = shallowRef(false);\nconst checkJson = useDebounceFn(() => {\n try {\n JSON5.parse(text.value);\n disabled.value = false;\n } catch {\n disabled.value = true;\n }\n}, 500);\nwatchEffect(() => {\n if (text.value.trim()) {\n checkJson();\n } else {\n disabled.value = true;\n }\n});\n\nconst linkDlgShow = shallowRef(false);\nconst shareLink = shallowRef('');\nconst copyLink = () => {\n copy(shareLink.value);\n linkDlgShow.value = false;\n};\n\nconst buildShare = useTask(async () => {\n const data = JSON5.parse(text.value);\n const asset = await uploadPoliciesAssets(\n new TextEncoder().encode(\n JSON5.stringify({\n data,\n ctime: Date.now(),\n type: 'share',\n }),\n ),\n 'file.txt',\n 'text/plain',\n );\n const link = location.origin + router.resolve(`/s/${asset.id}`).href;\n shareLink.value = link;\n linkDlgShow.value = true;\n});\n</script>\n<template>\n <NModal\n v-model:show=\"show\"\n preset=\"dialog\"\n title=\"分享规则\"\n :positiveText=\"buildShare.loading ? '分享中...' : '分享'\"\n @positiveClick=\"buildShare.invoke\"\n :loading=\"buildShare.loading\"\n :positiveButtonProps=\"{ disabled }\"\n style=\"width: 800px\"\n @afterLeave=\"text = ''\"\n >\n <NInput\n class=\"gkd_code h-[calc(var(--gkd-height)*0.6)]\"\n type=\"textarea\"\n show-count\n :value=\"text\"\n @update:value=\"\n if (!buildShare.loading) {\n text = $event;\n }\n \"\n placeholder=\"请输入需要分享的规则\"\n />\n </NModal>\n <NModal\n v-model:show=\"linkDlgShow\"\n preset=\"dialog\"\n title=\"分享成功\"\n positiveText=\"复制并关闭\"\n negativeText=\"重新分享\"\n @positiveClick=\"copyLink\"\n @negativeClick=\"\n linkDlgShow = false;\n text = '';\n show = true;\n \"\n @afterLeave=\"shareLink = ''\"\n >\n <NButton text tag=\"a\" :href=\"shareLink\" target=\"_blank\" type=\"primary\">\n {{ shareLink }}\n </NButton>\n </NModal>\n</template>\n","<script lang=\"tsx\" setup>\nimport ActionCard from '@/components/ActionCard.vue';\nimport BuildShareDlg from '@/components/BuildShareDlg.vue';\nimport { toValidURL } from '@/utils/check';\nimport { showTextDLg } from '@/utils/dialog';\nimport { dialog } from '@/utils/discrete';\nimport {\n batchCreateJpgUrl,\n batchCreateZipUrl,\n batchJpgDownloadZip,\n batchZipDownloadZip,\n} from '@/utils/export';\nimport { importFromLocal, importFromNetwork } from '@/utils/import';\nimport { shallowSnapshotStorage, snapshotStorage } from '@/utils/storage';\nimport { renderDveice, useSnapshotColumns } from '@/utils/table';\nimport { useTask } from '@/utils/task';\nimport type { Snapshot } from '@/utils/types';\nimport { githubUrlToSelfUrl } from '@/utils/url';\nimport {\n NButton,\n NDataTable,\n NIcon,\n NInput,\n NInputGroup,\n NModal,\n NPopover,\n NSpace,\n PaginationProps,\n type DataTableColumns,\n} from 'naive-ui';\nimport type { SortState } from 'naive-ui/es/data-table/src/interface';\nimport {\n computed,\n reactive,\n shallowReactive,\n shallowRef,\n watch,\n watchEffect,\n} from 'vue';\nimport { RouterLink, useRouter } from 'vue-router';\n\nconst router = useRouter();\n\nconst snapshots = shallowRef<Snapshot[]>([]);\nconst updateSnapshots = async () => {\n snapshots.value = (await shallowSnapshotStorage.getAllItems()).reverse();\n checkedRowKeys.value = [];\n};\nupdateSnapshots();\nconst filterOption = shallowReactive({\n query: ``,\n actualQuery: ``,\n updateQuery: () => {\n filterOption.actualQuery = filterOption.query.trim();\n checkedRowKeys.value = [];\n },\n});\nconst filterSnapshots = computed(() => {\n const actualQuery = filterOption.actualQuery;\n if (!actualQuery) return snapshots.value;\n return snapshots.value.filter((s) => {\n return (\n (s.appName || ``).includes(actualQuery) ||\n (s.appId || ``).includes(actualQuery) ||\n (s.activityId || ``).includes(actualQuery)\n );\n });\n});\n\nconst importLoacl = useTask(async () => {\n await importFromLocal();\n await updateSnapshots();\n});\n\nconst {\n activityIdCol,\n appIdCol,\n appNameCol,\n ctimeCol,\n mtimeCol,\n deviceCol,\n appVersionCodeCol,\n appVersionNameCol,\n reseColWidth,\n} = useSnapshotColumns();\n\nwatchEffect(() => {\n const set = filterSnapshots.value.reduce(\n (p, c) => (p.add(renderDveice(c)), p),\n new Set<string>(),\n );\n if (set.size <= 1) {\n deviceCol.filterOptions = undefined;\n return;\n }\n deviceCol.filterOptions = [...set.values()].map((s) => ({\n value: s,\n label: s,\n }));\n});\n\nwatchEffect(() => {\n const set = filterSnapshots.value.reduce(\n (p, c) => (p.add(c.appName), p),\n new Set<string>(),\n );\n if (set.size <= 1) {\n appNameCol.filterOptions = undefined;\n return;\n }\n appNameCol.filterOptions = [...set.values()].map((s) => ({\n value: s,\n label: s,\n }));\n});\n\nwatchEffect(() => {\n const set = filterSnapshots.value.reduce(\n (p, c) => (p.add(c.activityId), p),\n new Set<string>(),\n );\n if (set.size <= 1) {\n activityIdCol.filterOptions = undefined;\n return;\n }\n activityIdCol.filterOptions = [...set.values()].map((s) => ({\n value: s,\n label: s,\n }));\n});\n\nconst columns: DataTableColumns<Snapshot> = reactive([\n {\n type: 'selection',\n },\n ctimeCol,\n mtimeCol,\n deviceCol,\n appNameCol,\n appIdCol,\n appVersionCodeCol,\n appVersionNameCol,\n activityIdCol,\n {\n key: `actions`,\n title: `操作`,\n fixed: 'right',\n width: `255px`,\n render(row) {\n return <ActionCard snapshot={row} onDelete={updateSnapshots} />;\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 handleSorterChange = (sorter: SortState) => {\n [ctimeCol, mtimeCol].forEach((c) => {\n if (sorter.columnKey != c.key) {\n c.sortOrder = undefined;\n } else {\n c.sortOrder = sorter.order;\n }\n });\n};\nmtimeCol.sortOrder = `descend`;\nconst showModal = shallowRef(false);\nconst text = shallowRef(``);\nconst importNetwork = useTask(async () => {\n const urls = text.value\n .trim()\n .split(`\\n`)\n .map((u) => u.trim())\n .filter((u) => toValidURL(u));\n if (urls.length == 0) return;\n await importFromNetwork(urls);\n await updateSnapshots();\n text.value = ``;\n});\n\nconst checkedRowKeys = shallowRef<number[]>([]);\nconst checkedSnapshots = () => {\n return Promise.all(\n checkedRowKeys.value.map(\n (id) => snapshotStorage.getItem(id) as Promise<Snapshot>,\n ),\n );\n};\nconst batchDelete = useTask(async () => {\n await new Promise((res, rej) => {\n dialog.warning({\n title: `删除`,\n content: `是否批量删除 ${checkedRowKeys.value.length} 个快照`,\n negativeText: `取消`,\n positiveText: `确认`,\n onClose: rej,\n onEsc: rej,\n onMaskClick: rej,\n onNegativeClick: rej,\n onPositiveClick: res,\n });\n });\n\n await Promise.all(\n checkedRowKeys.value.map((k) => snapshotStorage.removeItem(k)),\n );\n await updateSnapshots();\n});\nconst batchDownloadJpg = useTask(async () => {\n await batchJpgDownloadZip(await checkedSnapshots());\n});\nconst batchDownloadZip = useTask(async () => {\n await batchZipDownloadZip(await checkedSnapshots());\n});\n\nconst batchShareJpgUrl = useTask(async () => {\n const pngUrls = await batchCreateJpgUrl(await checkedSnapshots());\n showTextDLg({\n content:\n pngUrls.map((s) => githubUrlToSelfUrl(router, s)).join(`\\n`) + `\\n`,\n });\n});\nconst batchShareZipUrl = useTask(async () => {\n const zipUrls = await batchCreateZipUrl(await checkedSnapshots());\n showTextDLg({\n content:\n zipUrls.map((s) => githubUrlToSelfUrl(router, s)).join(`\\n`) + `\\n`,\n });\n});\n\nconst shareDlgShow = shallowRef(false);\n</script>\n<template>\n <div flex flex-col p-10px gap-10px h-full>\n <div flex>\n <NSpace>\n <NInputGroup>\n <NInput\n placeholder=\"请输入应用名称/应用ID/界面ID\"\n clearable\n class=\"min-w-320px\"\n v-model:value=\"filterOption.query\"\n @keyup.enter=\"filterOption.updateQuery\"\n @change=\"filterOption.updateQuery\"\n ></NInput>\n <NButton @click=\"filterOption.updateQuery\">\n <template #icon>\n <NIcon>\n <svg viewBox=\"0 0 32 32\">\n <path\n d=\"M29 27.586l-7.552-7.552a11.018 11.018 0 1 0-1.414 1.414L27.586 29zM4 13a9 9 0 1 1 9 9a9.01 9.01 0 0 1-9-9z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </NIcon>\n </template>\n </NButton>\n </NInputGroup>\n <template v-if=\"checkedRowKeys.length\">\n <NPopover>\n <template #trigger>\n <NButton> 批量下载 </NButton>\n </template>\n <NSpace vertical>\n <NButton\n @click=\"batchDownloadZip.invoke\"\n :loading=\"batchDownloadZip.loading\"\n >\n 批量下载-快照\n </NButton>\n <NButton\n @click=\"batchDownloadJpg.invoke\"\n :loading=\"batchDownloadJpg.loading\"\n >\n 批量下载-图片\n </NButton>\n </NSpace>\n </NPopover>\n <NPopover>\n <template #trigger>\n <NButton> 批量分享 </NButton>\n </template>\n <NSpace vertical>\n <NButton\n @click=\"batchShareZipUrl.invoke\"\n :loading=\"batchShareZipUrl.loading\"\n >\n 批量生成链接-快照\n </NButton>\n <NButton\n @click=\"batchShareJpgUrl.invoke\"\n :loading=\"batchShareJpgUrl.loading\"\n >\n 批量生成链接-图片\n </NButton>\n </NSpace>\n </NPopover>\n <NButton @click=\"batchDelete.invoke\"> 批量删除 </NButton>\n <div h-full flex flex-items-center>\n {{ `已选中 ${checkedRowKeys.length} 个快照` }}\n </div>\n </template>\n </NSpace>\n <div flex-1></div>\n <NSpace>\n <NPopover>\n <template #trigger>\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 512 512\"\n >\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"32\"\n d=\"M256 112v288\"\n ></path>\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"32\"\n d=\"M400 256H112\"\n ></path>\n </svg>\n </NIcon>\n </template>\n </NButton>\n </template>\n <NSpace vertical>\n <NButton @click=\"importLoacl.invoke\" :loading=\"importLoacl.loading\">\n 导入本地文件\n </NButton>\n <NButton @click=\"showModal = true\" :loading=\"importNetwork.loading\">\n 导入网络文件\n </NButton>\n </NSpace>\n </NPopover>\n <RouterLink to=\"/device\" title=\"连接设备\">\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 1024 1024\"\n >\n <path\n d=\"M270.1 741.7c0 23.4 19.1 42.5 42.6 42.5h48.7v120.4c0 30.5 24.5 55.4 54.6 55.4c30.2 0 54.6-24.8 54.6-55.4V784.1h85v120.4c0 30.5 24.5 55.4 54.6 55.4c30.2 0 54.6-24.8 54.6-55.4V784.1h48.7c23.5 0 42.6-19.1 42.6-42.5V346.4h-486v395.3zm357.1-600.1l44.9-65c2.6-3.8 2-8.9-1.5-11.4c-3.5-2.4-8.5-1.2-11.1 2.6l-46.6 67.6c-30.7-12.1-64.9-18.8-100.8-18.8c-35.9 0-70.1 6.7-100.8 18.8l-46.6-67.5c-2.6-3.8-7.6-5.1-11.1-2.6c-3.5 2.4-4.1 7.4-1.5 11.4l44.9 65c-71.4 33.2-121.4 96.1-127.8 169.6h486c-6.6-73.6-56.7-136.5-128-169.7zM409.5 244.1a26.9 26.9 0 1 1 26.9-26.9a26.97 26.97 0 0 1-26.9 26.9zm208.4 0a26.9 26.9 0 1 1 26.9-26.9a26.97 26.97 0 0 1-26.9 26.9zm223.4 100.7c-30.2 0-54.6 24.8-54.6 55.4v216.4c0 30.5 24.5 55.4 54.6 55.4c30.2 0 54.6-24.8 54.6-55.4V400.1c.1-30.6-24.3-55.3-54.6-55.3zm-658.6 0c-30.2 0-54.6 24.8-54.6 55.4v216.4c0 30.5 24.5 55.4 54.6 55.4c30.2 0 54.6-24.8 54.6-55.4V400.1c0-30.6-24.5-55.3-54.6-55.3z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </NIcon>\n </template>\n </NButton>\n </RouterLink>\n\n <NButton title=\"创建分享\" @click=\"shareDlgShow = true\">\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 24 24\"\n >\n <path\n d=\"M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81c1.66 0 3-1.34 3-3s-1.34-3-3-3s-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65c0 1.61 1.31 2.92 2.92 2.92s2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </NIcon>\n </template>\n </NButton>\n\n <a\n href=\"https://github.com/gkd-kit/inspect\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\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 496 512\"\n >\n <path\n d=\"M165.9 397.4c0 2-2.3 3.6-5.2 3.6c-3.3.3-5.6-1.3-5.6-3.6c0-2 2.3-3.6 5.2-3.6c3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9c2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9c.3 2 2.9 3.3 5.9 2.6c2.9-.7 4.9-2.6 4.6-4.6c-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2c12.8 2.3 17.3-5.6 17.3-12.1c0-6.2-.3-40.4-.3-61.4c0 0-70 15-84.7-29.8c0 0-11.4-29.1-27.8-36.6c0 0-22.9-15.7 1.6-15.4c0 0 24.9 2 38.6 25.8c21.9 38.6 58.6 27.5 72.9 20.9c2.3-16 8.8-27.1 16-33.7c-55.9-6.2-112.3-14.3-112.3-110.5c0-27.5 7.6-41.3 23.6-58.9c-2.6-6.5-11.1-33.3 2.6-67.9c20.9-6.5 69 27 69 27c20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27c13.7 34.7 5.2 61.4 2.6 67.9c16 17.7 25.8 31.5 25.8 58.9c0 96.5-58.9 104.2-114.8 110.5c9.2 7.9 17 22.9 17 46.4c0 33.7-.3 75.4-.3 83.6c0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252C496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2c1.6 1.6 3.9 2.3 5.2 1c1.3-1 1-3.3-.7-5.2c-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9c1.6 1 3.6.7 4.3-.7c.7-1.3-.3-2.9-2.3-3.9c-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2c2.3 2.3 5.2 2.6 6.5 1c1.3-1.3.7-4.3-1.3-6.2c-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9c1.6 2.3 4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2c-1.4-2.3-4-3.3-5.6-2z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </NIcon>\n </template>\n </NButton>\n </a>\n </NSpace>\n </div>\n <NDataTable\n striped\n :data=\"filterSnapshots\"\n :columns=\"columns\"\n :scrollX=\"1800\"\n :pagination=\"pagination\"\n v-model:checkedRowKeys=\"checkedRowKeys\"\n :rowKey=\"(r:Snapshot)=>r.id\"\n @update:sorter=\"handleSorterChange\"\n size=\"small\"\n class=\"flex-1\"\n flexHeight\n />\n </div>\n <NModal\n v-model:show=\"showModal\"\n preset=\"dialog\"\n title=\"导入网络文件\"\n :showIcon=\"false\"\n positiveText=\"确认\"\n negativeText=\"取消\"\n style=\"width: 800px\"\n @positiveClick=\"importNetwork.invoke\"\n :loading=\"importNetwork.loading\"\n @afterLeave=\"text = ``\"\n >\n <NInput\n :value=\"text\"\n @update:value=\"\n if (!importNetwork.loading) {\n text = $event;\n }\n \"\n type=\"textarea\"\n :placeholder=\"`仅支持ZIP文件链接\\n每行一个\\n空白行自动忽略\\n非法链接行自动忽略`\"\n :autosize=\"{\n minRows: 8,\n maxRows: 16,\n }\"\n :inputProps=\"{\n style: `white-space: nowrap;`,\n }\"\n />\n </NModal>\n <BuildShareDlg v-model:show=\"shareDlgShow\" />\n</template>\n"],"names":["router","useRouter","show","_useModel","text","shallowRef","disabled","checkJson","useDebounceFn","JSON5","parse","value","watchEffect","trim","linkDlgShow","shareLink","copyLink","copy","buildShare","useTask","data","asset","uploadPoliciesAssets","TextEncoder","encode","stringify","ctime","Date","now","type","link","location","origin","resolve","id","href","snapshots","updateSnapshots","shallowSnapshotStorage","getAllItems","reverse","checkedRowKeys","filterOption","shallowReactive","query","actualQuery","updateQuery","filterSnapshots","computed","filter","s","appName","includes","appId","activityId","importLoacl","importFromLocal","activityIdCol","appIdCol","appNameCol","ctimeCol","mtimeCol","deviceCol","appVersionCodeCol","appVersionNameCol","reseColWidth","useSnapshotColumns","set","reduce","p","c","add","renderDveice","Set","size","filterOptions","undefined","values","map","label","columns","reactive","key","title","fixed","width","render","row","_createVNode2","ActionCard","pagination","page","pageSize","showSizePicker","pageSizes","onChange","onUpdatePageSize","watch","handleSorterChange","sorter","forEach","columnKey","sortOrder","order","showModal","importNetwork","urls","split","u","toValidURL","length","importFromNetwork","checkedSnapshots","Promise","all","snapshotStorage","getItem","batchDelete","res","rej","dialog","warning","content","negativeText","positiveText","onClose","onEsc","onMaskClick","onNegativeClick","onPositiveClick","k","removeItem","batchDownloadJpg","batchJpgDownloadZip","batchDownloadZip","batchZipDownloadZip","batchShareJpgUrl","pngUrls","batchCreateJpgUrl","showTextDLg","githubUrlToSelfUrl","join","batchShareZipUrl","zipUrls","batchCreateZipUrl","shareDlgShow"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{d as f,s as u,ab as h,m as d,c as g,Q as v,S as w,l as _,t as x,as as S,f as R,o as b}from"./index-
|
|
2
|
-
//# sourceMappingURL=ImportPage-
|
|
1
|
+
import{d as f,s as u,ab as h,m as d,c as g,Q as v,S as w,l as _,t as x,as as S,f as R,o as b}from"./index-6TeLZlcS.js";import{m as y,a as l,l as n,h as I,i as U}from"./fetch-kusZEOhe.js";import{a as B}from"./import-f6CuhzB-.js";import{u as p,a as k,b as D,g as L}from"./storage-0XjIHrX_.js";import"./jszip.min-_o07wekS.js";const N={class:"h-[calc(100%-10px)]",flex:"","gap-5px":"","p-5px":"","flex-col":"","flex-items-center":""},J=f({__name:"ImportPage",setup(V){const m=S(),o=R(),a=String(m.query.url||""),c=u(!0),r=u("加载中...");return h(async()=>{var i;if(!d(a)){y.error("非法URL参数"),await l(1e3),o.replace({path:"/"});return}await l(1e3);const t=p[a];if(t)if(await k.getItem(t)){o.replace({name:"snapshot",params:{snapshotId:t}});return}else delete p[a];n.start();try{const[s]=(i=await B(a))!=null?i:[];if(s.status=="fulfilled"){n.finish();const e=s.value;e!=null&&e.id?(p[a]=e.id,a.match(I)?D[e.id]=a:a.match(U)&&(L[e.id]=a),c.value=!1,await l(500),o.replace({name:"snapshot",params:{snapshotId:e.id}})):r.value="获取资源失败"}else throw s.reason}catch{n.error(),r.value="加载资源失败"}}),(t,i)=>(b(),g("div",N,[v(_("div",{"mt-40px":""},x(r.value),513),[[w,c.value]])]))}});export{J as default};
|
|
2
|
+
//# sourceMappingURL=ImportPage-AtLyzz_a.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImportPage-
|
|
1
|
+
{"version":3,"file":"ImportPage-AtLyzz_a.js","sources":["../../src/views/ImportPage.vue"],"sourcesContent":["<script setup lang=\"tsx\">\nimport { toValidURL } from '@/utils/check';\nimport { loadingBar, message } from '@/utils/discrete';\nimport { importFromNetwork } from '@/utils/import';\nimport { delay } from '@/utils/others';\nimport { githubZipStorage } from '@/utils/storage';\nimport { githubJpgStorage } from '@/utils/storage';\nimport { urlStorage, snapshotStorage } from '@/utils/storage';\nimport { githubImageUrlReg, githubZipUrlReg } from '@/utils/url';\nimport { onMounted, shallowRef } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\n\nconst route = useRoute();\nconst router = useRouter();\n\nconst importUrl = String(route.query.url || ``);\n\nconst loading = shallowRef(true);\nconst tip = shallowRef(`加载中...`);\n\nonMounted(async () => {\n if (!toValidURL(importUrl)) {\n message.error(`非法URL参数`);\n await delay(1000);\n router.replace({\n path: `/`,\n });\n return;\n }\n await delay(1000);\n const snapshotId = urlStorage[importUrl];\n if (snapshotId) {\n const snapshot = await snapshotStorage.getItem(snapshotId);\n if (snapshot) {\n router.replace({\n name: 'snapshot',\n params: { snapshotId },\n });\n return;\n } else {\n delete urlStorage[importUrl];\n }\n }\n loadingBar.start();\n try {\n const [result] = (await importFromNetwork(importUrl)) ?? [];\n\n if (result.status == 'fulfilled') {\n loadingBar.finish();\n const snapshot = result.value;\n if (snapshot?.id) {\n urlStorage[importUrl] = snapshot.id;\n if (importUrl.match(githubZipUrlReg)) {\n githubZipStorage[snapshot.id] = importUrl;\n } else if (importUrl.match(githubImageUrlReg)) {\n githubJpgStorage[snapshot.id] = importUrl;\n }\n loading.value = false;\n await delay(500);\n router.replace({\n name: 'snapshot',\n params: { snapshotId: snapshot.id },\n });\n } else {\n tip.value = `获取资源失败`;\n }\n } else {\n throw result.reason;\n }\n } catch {\n loadingBar.error();\n tip.value = `加载资源失败`;\n }\n});\n</script>\n<template>\n <div\n class=\"h-[calc(100%-10px)]\"\n flex\n gap-5px\n p-5px\n flex-col\n flex-items-center\n >\n <div v-show=\"loading\" mt-40px>\n {{ tip }}\n </div>\n </div>\n</template>\n"],"names":["route","useRoute","router","useRouter","importUrl","String","query","url","loading","shallowRef","tip","onMounted","toValidURL","message","error","delay","replace","path","snapshotId","urlStorage","snapshotStorage","getItem","name","params","loadingBar","start","result","_a","importFromNetwork","status","finish","snapshot","value","id","match","githubZipUrlReg","githubZipStorage","githubImageUrlReg","githubJpgStorage","reason"],"mappings":"gdAYA,MAAMA,EAAQC,IACRC,EAASC,IAETC,EAAYC,OAAOL,EAAMM,MAAMC,KAAQ,EAAC,EAExCC,EAAUC,EAAW,EAAI,EACzBC,EAAMD,EAAY,QAAO,EAE/BE,OAAAA,EAAU,SAAY,OACpB,GAAI,CAACC,EAAWR,CAAS,EAAG,CAC1BS,EAAQC,MAAO,SAAQ,EACvB,MAAMC,EAAM,GAAI,EAChBb,EAAOc,QAAQ,CACbC,KAAO,GACT,CAAC,EACD,MACF,CACA,MAAMF,EAAM,GAAI,EAChB,MAAMG,EAAaC,EAAWf,CAAS,EACvC,GAAIc,EAEF,GADiB,MAAME,EAAgBC,QAAQH,CAAU,EAC3C,CACZhB,EAAOc,QAAQ,CACbM,KAAM,WACNC,OAAQ,CAAEL,WAAAA,CAAW,CACvB,CAAC,EACD,MACF,MACE,OAAOC,EAAWf,CAAS,EAG/BoB,EAAWC,MAAK,EAChB,GAAI,CACF,KAAM,CAACC,CAAM,GAAKC,EAAA,MAAMC,EAAkBxB,CAAS,IAAjC,KAAAuB,EAAuC,GAEzD,GAAID,EAAOG,QAAU,YAAa,CAChCL,EAAWM,OAAM,EACjB,MAAMC,EAAWL,EAAOM,MACpBD,GAAAA,MAAAA,EAAUE,IACZd,EAAWf,CAAS,EAAI2B,EAASE,GAC7B7B,EAAU8B,MAAMC,CAAe,EACjCC,EAAiBL,EAASE,EAAE,EAAI7B,EACvBA,EAAU8B,MAAMG,CAAiB,IAC1CC,EAAiBP,EAASE,EAAE,EAAI7B,GAElCI,EAAQwB,MAAQ,GAChB,MAAMjB,EAAM,GAAG,EACfb,EAAOc,QAAQ,CACbM,KAAM,WACNC,OAAQ,CAAEL,WAAYa,EAASE,EAAG,CACpC,CAAC,GAEDvB,EAAIsB,MAAS,QAEjB,KACE,OAAMN,EAAOa,MAEjB,MAAQ,CACNf,EAAWV,MAAK,EAChBJ,EAAIsB,MAAS,QACf,CACF,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as N,j as g,s as d,w as V,c as f,l as a,t as x,e as r,a as l,b as n,p as B,as as C,o as v,h as k,g as h,m as S}from"./index-6TeLZlcS.js";import{u as E,t as R,c as z,l as p,e as D}from"./fetch-kusZEOhe.js";import{a as G}from"./index-rsHOFDdF.js";import{a as F,N as H,l as w}from"./index-lqIjL-r0.js";const K={key:0,"pt-40px":"","text-center":""},L={key:1,"pt-40px":"","text-center":""},P=a("div",null,"解析失败",-1),U={key:2,"p-20px":"",flex:"","flex-col":"","gap-20px":"","h-full":"",relative:""},A={flex:"","flex-items-center":"","gap-10px":""},I=a("div",{"font-bold":""},"规则预览",-1),M=a("div",{"flex-1":""},null,-1),T={"h-full":"",relative:""},$=a("svg",{viewBox:"0 0 24 24"},[a("path",{d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z",fill:"currentColor"})],-1),W=N({__name:"PreviewSharePage",setup(j){const _=C();E(),G("GKD-规则预览");const m=g(()=>{const e=S(String(_.query.url));if(e)return e;const t=String(_.params.github_asset_id);return new URL(`https://github.com/gkd-kit/inspect/files/${t}/file.txt`)}),o=d(),i=d(""),u=g(()=>{var e,t;return(e=o.value)!=null&&e.data?w.stringify((t=o.value)==null?void 0:t.data,null,2):""}),c=d(!0);V(async()=>{var e,t;c.value=!0;try{p.start();const s=await D(m.value.href,void 0,{proxy:!0}).then(b=>b.text());if(s=="Not Found")throw new Error("Not Found");if(o.value=w.parse(s),(e=o.value)!=null&&e.ctime&&((t=o.value)!=null&&t.data))p.finish();else throw new Error(s)}catch(s){p.error(),s instanceof Error?i.value=s.message:i.value=String(s||"unknown error")}c.value=!1});const y=()=>{const e=new URL("gkd://import");e.searchParams.set("url",m.value.href),location.href=e.href};return(e,t)=>c.value?(v(),f("div",K,"加载中...")):i.value?(v(),f("div",L,[P,a("div",null,x(i.value),1)])):o.value&&u.value?(v(),f("div",U,[a("div",A,[I,a("div",null,x(r(R)(o.value.ctime)),1),M,l(r(h),{text:"",tag:"a",href:"https://gkd.li/guide/",target:"_blank",type:"primary"},{default:n(()=>[k(" 下载 GKD ")]),_:1})]),l(r(H),{class:"flex-1 gkd_code",type:"textarea","show-count":"",value:u.value,disabled:""},{suffix:n(()=>[a("div",T,[l(r(h),{class:"absolute right-0 top-10px",size:"small",onClick:t[0]||(t[0]=s=>r(z)(u.value))},{icon:n(()=>[l(r(F),null,{default:n(()=>[$]),_:1})]),_:1})])]),_:1},8,["value"]),l(r(h),{onClick:y},{default:n(()=>[k(" 导入 GKD ")]),_:1})])):B("",!0)}});export{W as default};
|
|
2
|
+
//# sourceMappingURL=PreviewSharePage-ELyIj-er.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreviewSharePage-ELyIj-er.js","sources":["../../src/views/PreviewSharePage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { toValidURL } from '@/utils/check';\nimport { loadingBar } from '@/utils/discrete';\nimport { enhanceFetch } from '@/utils/fetch';\nimport { copy, timeAgo, useAdaptMobile } from '@/utils/others';\nimport { useTitle } from '@vueuse/core';\nimport JSON5 from 'json5';\nimport { NButton, NIcon, NInput } from 'naive-ui';\nimport { computed, shallowRef, watchEffect } from 'vue';\nimport { useRoute } from 'vue-router';\n\nconst route = useRoute();\nuseAdaptMobile();\n\nuseTitle('GKD-规则预览');\n\nconst url = computed(() => {\n const u = toValidURL(String(route.query.url));\n if (u) {\n return u;\n }\n const github_asset_id = String(route.params.github_asset_id);\n return new URL(\n `https://github.com/gkd-kit/inspect/files/${github_asset_id}/file.txt`,\n );\n});\n// http://127.0.0.1:8444/s/14332516\nconst data = shallowRef<{\n data: unknown;\n ctime: number;\n}>();\nconst error = shallowRef('');\nconst dataString = computed(() => {\n if (!data.value?.data) return '';\n return JSON5.stringify(data.value?.data, null, 2);\n});\nconst loading = shallowRef(true);\nwatchEffect(async () => {\n loading.value = true;\n try {\n loadingBar.start();\n const text = await enhanceFetch(url.value.href, undefined, {\n proxy: true,\n }).then((r) => r.text());\n if (text == 'Not Found') {\n throw new Error('Not Found');\n }\n data.value = JSON5.parse(text);\n if (data.value?.ctime && data.value?.data) {\n loadingBar.finish();\n } else {\n throw new Error(text);\n }\n } catch (e) {\n loadingBar.error();\n if (e instanceof Error) {\n error.value = e.message;\n } else {\n error.value = String(e || 'unknown error');\n }\n }\n loading.value = false;\n});\nconst openGkd = () => {\n const u = new URL('gkd://import');\n u.searchParams.set('url', url.value.href);\n location.href = u.href;\n};\n</script>\n<template>\n <div v-if=\"loading\" pt-40px text-center>加载中...</div>\n <div v-else-if=\"error\" pt-40px text-center>\n <div>解析失败</div>\n <div>{{ error }}</div>\n </div>\n <div\n v-else-if=\"data && dataString\"\n p-20px\n flex\n flex-col\n gap-20px\n h-full\n relative\n >\n <div flex flex-items-center gap-10px>\n <div font-bold>规则预览</div>\n <div>{{ timeAgo(data.ctime) }}</div>\n <div flex-1></div>\n <NButton\n text\n tag=\"a\"\n href=\"https://gkd.li/guide/\"\n target=\"_blank\"\n type=\"primary\"\n >\n 下载 GKD\n </NButton>\n </div>\n <NInput\n class=\"flex-1 gkd_code\"\n type=\"textarea\"\n show-count\n :value=\"dataString\"\n disabled\n >\n <template #suffix>\n <div h-full relative>\n <NButton\n class=\"absolute right-0 top-10px\"\n size=\"small\"\n @click=\"copy(dataString)\"\n >\n <template #icon>\n <NIcon>\n <svg viewBox=\"0 0 24 24\">\n <path\n d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </NIcon>\n </template>\n </NButton>\n </div>\n </template>\n </NInput>\n <NButton @click=\"openGkd\"> 导入 GKD </NButton>\n </div>\n</template>\n"],"names":["route","useRoute","useAdaptMobile","useTitle","url","computed","u","toValidURL","github_asset_id","data","shallowRef","error","dataString","_a","JSON5","_b","loading","watchEffect","loadingBar","text","enhanceFetch","r","e","openGkd"],"mappings":"43BAWA,MAAMA,EAAQC,IACCC,IAEfC,EAAS,UAAU,EAEb,MAAAC,EAAMC,EAAS,IAAM,CACzB,MAAMC,EAAIC,EAAW,OAAOP,EAAM,MAAM,GAAG,CAAC,EAC5C,GAAIM,EACK,OAAAA,EAET,MAAME,EAAkB,OAAOR,EAAM,OAAO,eAAe,EAC3D,OAAO,IAAI,IACT,4CAA4CQ,CAAe,WAAA,CAC7D,CACD,EAEKC,EAAOC,IAIPC,EAAQD,EAAW,EAAE,EACrBE,EAAaP,EAAS,IAAM,SAC5B,OAACQ,EAAAJ,EAAK,QAAL,MAAAI,EAAY,KACVC,EAAM,WAAUC,EAAAN,EAAK,QAAL,YAAAM,EAAY,KAAM,KAAM,CAAC,EADlB,EACkB,CACjD,EACKC,EAAUN,EAAW,EAAI,EAC/BO,EAAY,SAAY,SACtBD,EAAQ,MAAQ,GACZ,GAAA,CACFE,EAAW,MAAM,EACjB,MAAMC,EAAO,MAAMC,EAAahB,EAAI,MAAM,KAAM,OAAW,CACzD,MAAO,EAAA,CACR,EAAE,KAAMiB,GAAMA,EAAE,KAAM,CAAA,EACvB,GAAIF,GAAQ,YACJ,MAAA,IAAI,MAAM,WAAW,EAG7B,GADKV,EAAA,MAAQK,EAAM,MAAMK,CAAI,GACzBN,EAAAJ,EAAK,QAAL,MAAAI,EAAY,SAASE,EAAAN,EAAK,QAAL,MAAAM,EAAY,MACnCG,EAAW,OAAO,MAEZ,OAAA,IAAI,MAAMC,CAAI,QAEfG,EAAG,CACVJ,EAAW,MAAM,EACbI,aAAa,MACfX,EAAM,MAAQW,EAAE,QAEVX,EAAA,MAAQ,OAAOW,GAAK,eAAe,CAE7C,CACAN,EAAQ,MAAQ,EAAA,CACjB,EACD,MAAMO,EAAU,IAAM,CACd,MAAAjB,EAAI,IAAI,IAAI,cAAc,EAChCA,EAAE,aAAa,IAAI,MAAOF,EAAI,MAAM,IAAI,EACxC,SAAS,KAAOE,EAAE,IAAA"}
|