ms-vite-plugin 1.5.8 → 1.5.10
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/cli.js +6 -6
- package/dist/packaging/index.d.ts +4 -1
- package/dist/packaging/index.js +1 -1
- package/docs/api/device.md +5 -9
- package/docs/api/global.md +2 -2
- package/docs/api/jbclear.md +291 -0
- package/docs/api/jbdevice.md +574 -0
- package/docs/api/jbdylib.md +219 -0
- package/docs/api/jbshell.md +59 -0
- package/docs/api/jbsystem.md +211 -0
- package/docs/api/jbvpn.md +219 -0
- package/docs/api/pip.md +50 -15
- package/docs/api/plist.md +137 -0
- package/docs/api/ui.md +114 -0
- package/docs/apicn/device.md +4 -8
- package/docs/apicn/global.md +2 -2
- package/docs/apicn/pip.md +50 -15
- package/docs/apicn/ui.md +114 -0
- package/docs/apilua/device.md +5 -9
- package/docs/apilua/global.md +2 -2
- package/docs/apilua/jbclear.md +313 -0
- package/docs/apilua/jbdevice.md +609 -0
- package/docs/apilua/jbdylib.md +231 -0
- package/docs/apilua/jbshell.md +63 -0
- package/docs/apilua/jbsystem.md +225 -0
- package/docs/apilua/jbvpn.md +233 -0
- package/docs/apilua/pip.md +53 -15
- package/docs/apilua/plist.md +153 -0
- package/docs/apilua/ui.md +117 -0
- package/docs/apipython/device.md +6 -8
- package/docs/apipython/g.md +1 -1
- package/docs/apipython/jbclear.md +288 -0
- package/docs/apipython/jbdevice.md +570 -0
- package/docs/apipython/jbdylib.md +215 -0
- package/docs/apipython/jbshell.md +61 -0
- package/docs/apipython/jbsystem.md +216 -0
- package/docs/apipython/jbvpn.md +231 -0
- package/docs/apipython/overview.md +1 -1
- package/docs/apipython/pip.md +52 -15
- package/docs/apipython/plist.md +152 -0
- package/docs/apipython/ui.md +118 -0
- package/docs/httpapi/api.md +2 -2
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var R=exports&&exports.__createBinding||(Object.create?(function(e,t,r
|
|
3
|
-
`)}function K(e,t){return t.push(e),t}function q(e,t){const
|
|
4
|
-
`):"\u65E0\u65E5\u5FD7";await $(n,e.output,"\u65E5\u5FD7\u5DF2\u4FDD\u5B58"),
|
|
5
|
-
`);await $(_,e.output,"HTTP API \u54CD\u5E94\u5DF2\u4FDD\u5B58"),f.ok||process.exit(1)}finally{clearTimeout(I)}}catch(t){const
|
|
6
|
-
`)),O.body.success===!1&&process.exit(1)}catch(t){console.error("\u274C OCR \u6267\u884C\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function ft(e){try{const t=e.image?.trim();if(!t)throw new Error("\u8BF7\u901A\u8FC7 --image \u6307\u5B9A\u8F93\u5165\u56FE\u7247\u8DEF\u5F84\u3002");const
|
|
7
|
-
`)}c.program.name("ms-cli").description("\u5FEB\u70B9JS \u6784\u5EFA\u5DE5\u5177").version(k.PACKAGE_VERSION),c.program.addHelpText("after",Ot),c.program.command("build").description("\u6784\u5EFA \u5FEB\u70B9JS \u9879\u76EE").option("-d, --dev","\u5F00\u53D1\u6A21\u5F0F\u6784\u5EFA (\u5305\u542B source map)").action(rt),c.program.command("package").description("\u751F\u4EA7\u6784\u5EFA\u5E76\u52A0\u5BC6 ms.msbundle").action(nt),c.program.command("run").description("\u5728\u8BBE\u5907\u4E0A\u8FD0\u884C\u9879\u76EE").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").action(it),c.program.command("run-ui").description("\u5728\u8BBE\u5907\u4E0A\u9884\u89C8 UI").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").action(st),c.program.command("stop").description("\u505C\u6B62\u8BBE\u5907\u4E0A\u7684\u9879\u76EE").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").action(at),c.program.command("screenshot").description("\u83B7\u53D6\u8BBE\u5907\u622A\u56FE\uFF08JPG\uFF09").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").option("--format <format>","\u8FD4\u56DE\u683C\u5F0F: file|base64","file").option("--output <output>","\u622A\u56FE\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08format=file \u65F6\u751F\u6548\uFF09").action(ct),c.program.command("source").description("\u83B7\u53D6\u8BBE\u5907\u5F53\u524D\u9875\u9762\u8282\u70B9 XML").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").option("--max-depth <maxDepth>","\u8282\u70B9\u6700\u5927\u6DF1\u5EA6","50").option("--timeout <timeout>","\u8282\u70B9\u6293\u53D6\u8D85\u65F6\u79D2\u6570","120").option("--mode <mode>","\u8282\u70B9\u6293\u53D6\u6A21\u5F0F: 1=\u6A21\u5F0F1, 2=\u6A21\u5F0F2, 3=\u6A21\u5F0F3","1").option("--output <output>","\u8282\u70B9 XML \u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(pt),c.program.command("logs").description("\u83B7\u53D6\u8BBE\u5907\u5F53\u524D\u65E5\u5FD7\u6700\u65B0\u884C").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("--limit <limit>","\u8BFB\u53D6\u6700\u65B0\u65E5\u5FD7\u884C\u6570\uFF0C\u8303\u56F4 1..5000","200").option("--format <format>","\u8FD4\u56DE\u683C\u5F0F: text|json","text").option("--output <output>","\u65E5\u5FD7\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(ut),c.program.command("ocr").description("\u5728\u8BBE\u5907\u4E0A\u6267\u884C OCR \u8BC6\u522B").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("--engine <engine>","OCR \u5F15\u64CE: appleocr|paddleocr","appleocr").option("--mode <mode>","OCR \u6A21\u5F0F: recognize|numbers|findText","recognize").option("--input <input>",'\u8F93\u5165\u6E90\uFF0C\u9ED8\u8BA4 "screen"',"screen").option("--x <x>","\u533A\u57DF\u5DE6\u4E0A\u89D2 x","0").option("--y <y>","\u533A\u57DF\u5DE6\u4E0A\u89D2 y","0").option("--ex <ex>","\u533A\u57DF\u53F3\u4E0B\u89D2 x\uFF1B\u5168\u5C4F\u53EF\u4F20 0","0").option("--ey <ey>","\u533A\u57DF\u53F3\u4E0B\u89D2 y\uFF1B\u5168\u5C4F\u53EF\u4F20 0","0").option("--text <text>","findText \u6587\u672C\uFF0C\u53EF\u91CD\u590D",K,[]).option("--texts <texts>","findText \u6587\u672C\u6570\u7EC4\uFF0C\u652F\u6301 JSON \u6570\u7EC4\u6216\u9017\u53F7\u5206\u9694").option("--languages <languages>","Apple OCR \u8BED\u8A00\uFF0C\u652F\u6301 JSON \u6570\u7EC4\u6216\u9017\u53F7\u5206\u9694").option("--exact-match","findText \u8981\u6C42\u5B8C\u6574\u5339\u914D\u6587\u672C").option("--confidence-threshold <confidenceThreshold>","PaddleOCR \u7F6E\u4FE1\u5EA6\u9608\u503C","0.6").option("--paddle-model <paddleModel>","\u4EC5 paddleocr\uFF1A\u5207\u6362\u6A21\u578B ppocr-v6-tiny|ppocr-v6-small|ppocr-v5").option("--max-side-len <maxSideLen>","\u4EC5 paddleocr\uFF1A\u68C0\u6D4B\u6700\u5927\u8FB9\u957F\uFF0C0 \u56DE\u843D\u9ED8\u8BA4 768").option("--use-gpu","\u4EC5 paddleocr\uFF1A\u5207\u6362\u6A21\u578B\u65F6\u542F\u7528 GPU").option("--timeout-ms <timeoutMs>","\u8BF7\u6C42\u8D85\u65F6\u65F6\u95F4(\u6BEB\u79D2)","60000").option("--format <format>","\u8FD4\u56DE\u683C\u5F0F: summary|json","summary").option("--output <output>","OCR \u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(lt),c.program.command("image-crop").description("\u88C1\u5207\u672C\u5730\u56FE\u7247\u5E76\u8F93\u51FA PNG").requiredOption("--image <image>","\u8F93\u5165\u56FE\u7247\u8DEF\u5F84").option("--x <x>","\u88C1\u5207\u8D77\u70B9 x","0").option("--y <y>","\u88C1\u5207\u8D77\u70B9 y","0").requiredOption("--width <width>","\u88C1\u5207\u5BBD\u5EA6").requiredOption("--height <height>","\u88C1\u5207\u9AD8\u5EA6").option("--output <output>","\u8F93\u51FA PNG \u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(ft),c.program.command("screen-crop").description("\u4ECE\u8BBE\u5907\u622A\u56FE\u4E2D\u88C1\u5207 PNG").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("--x <x>","\u88C1\u5207\u8D77\u70B9 x","0").option("--y <y>","\u88C1\u5207\u8D77\u70B9 y","0").requiredOption("--width <width>","\u88C1\u5207\u5BBD\u5EA6").requiredOption("--height <height>","\u88C1\u5207\u9AD8\u5EA6").option("--output <output>","\u8F93\u51FA PNG \u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(gt),c.program.command("image-pick-color").description("\u8BFB\u53D6\u672C\u5730\u56FE\u7247\u6307\u5B9A\u5750\u6807\u989C\u8272").requiredOption("--image <image>","\u8F93\u5165\u56FE\u7247\u8DEF\u5F84").option("--x <x>","\u76EE\u6807\u5750\u6807 x","0").option("--y <y>","\u76EE\u6807\u5750\u6807 y","0").option("--radius <radius>","\u91C7\u6837\u534A\u5F84\uFF0C\u8303\u56F4 0..20","0").action(ht),c.program.command("screen-pick-color").description("\u8BFB\u53D6\u8BBE\u5907\u622A\u56FE\u6307\u5B9A\u5750\u6807\u989C\u8272").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("--x <x>","\u76EE\u6807\u5750\u6807 x","0").option("--y <y>","\u76EE\u6807\u5750\u6807 y","0").option("--radius <radius>","\u91C7\u6837\u534A\u5F84\uFF0C\u8303\u56F4 0..20","0").action(wt),c.program.command("image-transparent").description("\u5C06\u56FE\u7247\u4E2D\u63A5\u8FD1\u6307\u5B9A\u989C\u8272\u6216\u89D2\u843D\u80CC\u666F\u8272\u7684\u50CF\u7D20\u8BBE\u4E3A\u900F\u660E").requiredOption("--image <image>","\u8F93\u5165\u56FE\u7247\u8DEF\u5F84").option("--output <output>","\u8F93\u51FA PNG \u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").option("--transparent-color <transparentColor>","\u900F\u660E\u5316\u989C\u8272\uFF0C\u683C\u5F0F #RRGGBB").option("--sample-corner <sampleCorner>","\u672A\u4F20 transparent-color \u65F6\u91C7\u6837\u89D2\u843D: topLeft|topRight|bottomLeft|bottomRight","topLeft").option("--tolerance <tolerance>","RGB \u6B27\u6C0F\u8DDD\u79BB\u5BB9\u5DEE\uFF0C\u8303\u56F4 0..441","24").action(yt);const Ct=c.program.command("docs").description("\u663E\u793A KuaiJS \u672C\u5730\u6587\u6863\u8DEF\u5F84");Ct.command("paths").description("\u663E\u793A KuaiJS \u672C\u5730\u6587\u6863\u8DEF\u5F84").option("--output <output>","\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(mt),c.program.command("http-call").description("\u6309 HTTP API \u6587\u6863\u58F0\u660E\u8C03\u7528\u8BBE\u5907\u63A5\u53E3").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").requiredOption("--method <method>","HTTP \u65B9\u6CD5: GET|POST").requiredOption("--path <path>","HTTP API \u76F8\u5BF9\u8DEF\u5F84\uFF0C\u4F8B\u5982 /api/status").option("--query <query>","JSON \u5BF9\u8C61 query \u53C2\u6570").option("--body <body>","JSON \u8BF7\u6C42\u4F53\uFF1B\u666E\u901A\u5B57\u7B26\u4E32\u4F1A\u4F5C\u4E3A JSON \u5B57\u7B26\u4E32\u63D0\u4EA4").option("--response-format <responseFormat>","\u54CD\u5E94\u683C\u5F0F: json|text","json").option("--timeout-ms <timeoutMs>","\u8BF7\u6C42\u8D85\u65F6\u65F6\u95F4(\u6BEB\u79D2)","30000").option("--output <output>","\u54CD\u5E94\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(dt),c.program.command("ws-start").description("\u542F\u52A8 CLI \u5185\u7F6E WS \u670D\u52A1").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").action(xt),c.program.command("ws-stop").description("\u505C\u6B62 CLI \u5185\u7F6E WS \u670D\u52A1").action(Pt),c.program.command("ws-status").description("\u67E5\u770B CLI \u5185\u7F6E WS \u670D\u52A1\u72B6\u6001").action(St),c.program.parse();
|
|
2
|
+
"use strict";var R=exports&&exports.__createBinding||(Object.create?(function(e,t,o,r){r===void 0&&(r=o);var n=Object.getOwnPropertyDescriptor(t,o);(!n||("get"in n?!t.__esModule:n.writable||n.configurable))&&(n={enumerable:!0,get:function(){return t[o]}}),Object.defineProperty(e,r,n)}):(function(e,t,o,r){r===void 0&&(r=o),e[r]=t[o]})),J=exports&&exports.__setModuleDefault||(Object.create?(function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}):function(e,t){e.default=t}),N=exports&&exports.__importStar||(function(){var e=function(t){return e=Object.getOwnPropertyNames||function(o){var r=[];for(var n in o)Object.prototype.hasOwnProperty.call(o,n)&&(r[r.length]=n);return r},e(t)};return function(t){if(t&&t.__esModule)return t;var o={};if(t!=null)for(var r=e(t),n=0;n<r.length;n++)r[n]!=="default"&&R(o,t,r[n]);return J(o,t),o}})();Object.defineProperty(exports,"__esModule",{value:!0});const c=require("commander"),M=N(require("os")),m=N(require("path")),G=require("./build"),p=N(require("fs-extra")),h=require("./device/project"),W=require("./packaging"),H=require("./device/ws-manager"),k=require("./version"),A=require("./mcp/docs-service"),L=require("./mcp/httpapi-docs-service"),j=require("./mcp/tool-utils"),B=require("./mcp/types"),x=require("./mcp/ocr-tools"),P=require("./mcp/image-tools"),d=m.join(M.tmpdir(),"ms-cli-ws-server.json");async function U(e){try{const t=m.join(e,"package.json"),o=m.join(e,"scripts"),[r,n]=await Promise.all([p.pathExists(t),p.pathExists(o)]);return r&&n}catch{return!1}}async function C(e){await U(e)||(console.error("\u274C \u9519\u8BEF: \u5F53\u524D\u76EE\u5F55\u4E0D\u662F\u6709\u6548\u7684 \u5FEB\u70B9JS \u9879\u76EE"),console.error("\u8BF7\u786E\u4FDD\u76EE\u5F55\u5305\u542B\u4EE5\u4E0B\u6587\u4EF6:"),console.error(" - package.json"),console.error(" - scripts/ \u76EE\u5F55"),process.exit(1))}function a(e,t,o,r,n){const i=(e??String(t)).trim(),s=Number.parseInt(i,10);if(!Number.isInteger(s)||s<r||n!==void 0&&s>n)throw new Error(`\u65E0\u6548 ${o}: ${i}\uFF0C\u5141\u8BB8\u8303\u56F4 ${r}${n===void 0?"+":`..${n}`}`);return s}function F(e,t,o,r,n){const i=(e??String(t)).trim(),s=Number.parseFloat(i);if(!Number.isFinite(s)||s<r||s>n)throw new Error(`\u65E0\u6548 ${o}: ${i}\uFF0C\u5141\u8BB8\u8303\u56F4 ${r}..${n}`);return s}function g(e,t,o,r){const n=(e??t).trim();if(!o.includes(n))throw new Error(`\u65E0\u6548 ${r}: ${n}\uFF0C\u53EF\u9009\u503C: ${o.join("|")}`);return n}function V(e){const t=e?.trim().toUpperCase();return g(t,"GET",["GET","POST"],"method")}function E(e){const t=e.ip?.trim();if(!t)throw new Error("\u8BF7\u901A\u8FC7 --ip \u6307\u5B9A\u8BBE\u5907 IP \u5730\u5740");const o=a(e.port,9800,"port",1,65535);return{ip:t,port:String(o),label:`${t}:${o}`}}async function $(e,t,o){if(t?.trim()){const r=m.resolve(t.trim());await p.ensureDir(m.dirname(r)),await p.writeFile(r,e,"utf8"),console.log(`\u2705 ${o}: ${r}`);return}console.log(e)}function z(){const e=["js","js_zh","python","lua"];return["KuaiJS \u6587\u6863\u8DEF\u5F84:",`docsRoot: ${(0,A.getDocsRootDir)()}`,...e.map(t=>`${t}: ${(0,A.getDocsDirByLanguage)(t)} (${B.DOC_LANGUAGE_LABELS[t]})`),`httpApi: ${(0,L.getHttpApiDocPath)()}`,"\u8BF4\u660E: \u76F4\u63A5\u8BFB\u53D6\u4E0A\u8FF0 markdown \u8DEF\u5F84\u3002"].join(`
|
|
3
|
+
`)}function K(e,t){return t.push(e),t}function q(e,t){const o=e?.trim();if(!o)return;if(o.startsWith("[")){const n=JSON.parse(o);if(!Array.isArray(n)||!n.every(i=>typeof i=="string"&&i.trim()))throw new Error(`${t} \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4\u3002`);return n.map(i=>i.trim())}const r=o.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)throw new Error(`${t} \u4E0D\u80FD\u4E3A\u7A7A\u3002`);return r}function X(e){const t=q(e,"languages");if(!t)return;const o=new Set(x.APPLE_OCR_LANGUAGES),r=t.filter(n=>!o.has(n));if(r.length>0)throw new Error(`\u65E0\u6548 languages: ${r.join(", ")}\uFF0C\u53EF\u9009\u503C: ${x.APPLE_OCR_LANGUAGES.join(", ")}`);return t}function Q(e,t){const o=e?.trim();if(!o)return;const r=JSON.parse(o);if(!r||typeof r!="object"||Array.isArray(r)||!Object.values(r).every(n=>typeof n=="string"||typeof n=="number"||typeof n=="boolean"||n===null))throw new Error(`${t} \u5FC5\u987B\u662F JSON \u5BF9\u8C61\uFF0C\u4E14\u503C\u53EA\u80FD\u662F string/number/boolean/null\u3002`);return r}function Y(e){const t=e?.trim();if(!(t===void 0||t.length===0))try{return JSON.parse(t)}catch{return e}}function Z(e){const t=e.trim();if(/^https?:\/\//i.test(t))throw new Error("path \u53EA\u80FD\u4F20 HTTP API \u76F8\u5BF9\u8DEF\u5F84\uFF0C\u4E0D\u80FD\u4F20\u5B8C\u6574 URL\u3002");if(!t.startsWith("/"))throw new Error("path \u5FC5\u987B\u4EE5 / \u5F00\u5934\uFF0C\u4F8B\u5982 /api/status\u3002");if(t.includes("?"))throw new Error("path \u4E0D\u80FD\u5305\u542B query string\uFF0C\u8BF7\u4F7F\u7528 --query \u4F20\u9012\u67E5\u8BE2\u53C2\u6570\u3002");return t}function tt(e,t){if(t)for(const[o,r]of Object.entries(t))r!==null&&e.searchParams.set(o,String(r))}function et(e){return e===void 0?{}:{headers:{"Content-Type":"application/json"},requestBody:JSON.stringify(e)}}async function ot(e,t){const o=await e.text();return t==="text"?o:(0,j.formatRuntimeJsonText)(JSON.parse(o))}async function rt(e){try{const t=process.cwd(),o=e.dev||!1;console.log(`\u{1F50D} \u68C0\u67E5\u9879\u76EE\u76EE\u5F55: ${t}`),await C(t),console.log(`\u{1F680} \u5F00\u59CB\u6784\u5EFA\u9879\u76EE (${o?"\u5F00\u53D1\u6A21\u5F0F":"\u751F\u4EA7\u6A21\u5F0F"})...`),await(0,G.buildAll)(o,t),console.log("\u2705 \u6784\u5EFA\u5B8C\u6210!")}catch(t){console.error("\u274C \u6784\u5EFA\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function nt(e){try{const t=process.cwd();console.log(`\u{1F50D} \u68C0\u67E5\u9879\u76EE\u76EE\u5F55: ${t}`),await C(t),console.log("\u{1F4E6} \u5F00\u59CB\u6253\u5305\u751F\u4EA7\u6784\u5EFA\u5E76\u52A0\u5BC6 bundle...");const o=await(0,W.packageProject)(t,{v2:e.v2});console.log(`\u2705 \u6253\u5305\u5B8C\u6210: ${o}`)}catch(t){console.error("\u274C \u6253\u5305\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function it(e){try{const t=process.cwd();await C(t),await(0,h.runOnDevice)(e)}catch(t){console.error("\u274C \u8FD0\u884C\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function st(e){try{const t=process.cwd();await C(t),await(0,h.runUIOnDevice)(e)}catch(t){console.error("\u274C UI \u9884\u89C8\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function at(e){try{await(0,h.stopOnDevice)(e)}catch(t){console.error("\u274C \u505C\u6B62\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function ct(e){try{if((e.format??"file")==="base64"){const n=await(0,h.getScreenshotBase64OnDevice)(e);console.log(n);return}const o=await(0,h.getScreenshotOnDevice)(e),r=e.output?.trim()?m.resolve(e.output.trim()):m.resolve(process.cwd(),"screenshot.jpg");await p.ensureDir(m.dirname(r)),await p.writeFile(r,o),console.log(`\u2705 \u622A\u56FE\u6210\u529F: ${r} (${o.length} bytes)`)}catch(t){console.error("\u274C \u622A\u56FE\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function pt(e){try{const t=(e.maxDepth??"50").trim(),o=(e.timeout??"120").trim(),r=(e.mode??"1").trim(),n=Number.parseInt(t,10),i=Number.parseInt(o,10),s=Number.parseInt(r,10);if(!Number.isInteger(n)||n<1)throw new Error(`\u65E0\u6548 max-depth: ${t}`);if(!Number.isInteger(i)||i<1)throw new Error(`\u65E0\u6548 timeout: ${o}`);if(!Number.isInteger(s)||s!==1&&s!==2&&s!==3)throw new Error(`\u65E0\u6548 mode: ${r}`);const u=await(0,h.getSourceOnDevice)(e,n,i,s);if(e.output?.trim()){const l=m.resolve(e.output.trim());await p.ensureDir(m.dirname(l)),await p.writeFile(l,u,"utf8"),console.log(`\u2705 \u8282\u70B9\u5DF2\u4FDD\u5B58: ${l}`);return}console.log(u)}catch(t){console.error("\u274C \u83B7\u53D6\u8282\u70B9\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function ut(e){try{const t=a(e.limit,200,"limit",1,5e3),o=g(e.format,"text",["text","json"],"format"),r=await(0,h.getCurrentLogLinesOnDevice)(e,t),n=o==="json"?(0,j.formatRuntimeJsonText)(r):r.lines.length>0?r.lines.join(`
|
|
4
|
+
`):"\u65E0\u65E5\u5FD7";await $(n,e.output,"\u65E5\u5FD7\u5DF2\u4FDD\u5B58"),o==="text"&&r.hasMore&&!e.output?.trim()&&console.error(`\u8FD8\u6709\u66F4\u65E9\u65E5\u5FD7\uFF0C\u53EF\u589E\u5927 --limit\uFF0C\u5F53\u524D\u6700\u591A ${t} \u884C\u3002`)}catch(t){console.error("\u274C \u83B7\u53D6\u65E5\u5FD7\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function mt(e){try{await $(z(),e.output,"\u6587\u6863\u8DEF\u5F84\u5DF2\u4FDD\u5B58")}catch(t){console.error("\u274C \u8F93\u51FA\u6587\u6863\u8DEF\u5F84\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function dt(e){try{const t=E(e),o=V(e.method),r=Z(e.path??""),n=await(0,L.findHttpApiDocEntry)(r,o);if(!n)throw new Error(`HTTP API \u6587\u6863\u4E2D\u4E0D\u5B58\u5728\u8BE5\u63A5\u53E3: ${o} ${r}\u3002\u8BF7\u5148\u8BFB\u53D6 docs paths \u8FD4\u56DE\u7684 HTTP API \u6587\u6863\u8DEF\u5F84\u3002`);const i=Q(e.query,"query"),s=Y(e.body);if(o==="GET"&&s!==void 0)throw new Error("GET \u63A5\u53E3\u4E0D\u80FD\u4F20 body\uFF0C\u8BF7\u4F7F\u7528 --query\u3002");const u=g(e.responseFormat,"json",["json","text"],"response-format"),l=a(e.timeoutMs,3e4,"timeout-ms",1e3,6e5),w=new URL(`http://${t.ip}:${t.port}${r}`);tt(w,i);const S=new AbortController,I=setTimeout(()=>S.abort(),l);try{const{headers:b,requestBody:y}=et(s),f=await fetch(w.toString(),{method:o,signal:S.signal,headers:b,body:y}),T=await ot(f,u),_=[`HTTP API \u8C03\u7528${f.ok?"\u6210\u529F":"\u5931\u8D25"}: ${o} ${r}`,`\u8BBE\u5907: ${t.label}`,`\u6587\u6863: ${n.title} (lines ${n.startLine}-${n.endLine})`,`\u72B6\u6001\u7801: ${f.status}`,"",T].join(`
|
|
5
|
+
`);await $(_,e.output,"HTTP API \u54CD\u5E94\u5DF2\u4FDD\u5B58"),f.ok||process.exit(1)}finally{clearTimeout(I)}}catch(t){const o=t instanceof Error&&t.name==="AbortError"?"\u8BF7\u6C42\u8D85\u65F6":t instanceof Error?t.message:String(t);console.error("\u274C HTTP API \u8C03\u7528\u5931\u8D25:",o),process.exit(1)}}async function lt(e){try{const t=E(e),o=g(e.engine,"appleocr",["appleocr","paddleocr"],"engine"),r=g(e.mode,"recognize",["recognize","numbers","findText"],"mode"),n=e.input?.trim()||"screen",i=a(e.x,0,"x",0),s=a(e.y,0,"y",0),u=a(e.ex,0,"ex",0),l=a(e.ey,0,"ey",0),w=[...q(e.texts,"texts")??[],...e.text??[]],S=w.length>0?w:void 0,I=X(e.languages),b=F(e.confidenceThreshold,.6,"confidence-threshold",0,1),y=e.paddleModel===void 0?void 0:g(e.paddleModel,x.PADDLE_OCR_MODELS[0],x.PADDLE_OCR_MODELS,"paddle-model"),f=e.maxSideLen===void 0?void 0:a(e.maxSideLen,0,"max-side-len",0),T=e.useGpu===!0?!0:void 0,_=a(e.timeoutMs,6e4,"timeout-ms",1e3,6e5),v=g(e.format,"summary",["summary","json"],"format"),O=await(0,x.runOcrRecognitionOnDevice)(t,{engine:o,mode:r,input:n,x:i,y:s,ex:u,ey:l,texts:S,languages:I,confidenceThreshold:b,exactMatch:e.exactMatch===!0,paddleModel:y,maxSideLen:f,useGpu:T,outputPath:v==="summary"?e.output:void 0,timeoutMs:_}),D=v==="json"?(0,j.formatRuntimeJsonText)(O.body):O.text;v==="json"?await $(D,e.output,"OCR \u7ED3\u679C\u5DF2\u4FDD\u5B58"):console.log([D,"",`device: ${t.label}`,`engine: ${o}`,`mode: ${r}`,`input: ${n}`,`region: x=${i}, y=${s}, ex=${u}, ey=${l}`,...o==="paddleocr"&&y?[`paddleModel: ${y}`]:[],...o==="paddleocr"&&f!==void 0?[`maxSideLen: ${f}`]:[],`status: ${O.status}`].join(`
|
|
6
|
+
`)),O.body.success===!1&&process.exit(1)}catch(t){console.error("\u274C OCR \u6267\u884C\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function ft(e){try{const t=e.image?.trim();if(!t)throw new Error("\u8BF7\u901A\u8FC7 --image \u6307\u5B9A\u8F93\u5165\u56FE\u7247\u8DEF\u5F84\u3002");const o=a(e.x,0,"x",0),r=a(e.y,0,"y",0),n=a(e.width,1,"width",1),i=a(e.height,1,"height",1),s=await(0,P.cropLocalImage)(t,o,r,n,i,e.output);console.log(s)}catch(t){console.error("\u274C \u56FE\u7247\u88C1\u5207\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function gt(e){try{const t=E(e),o=a(e.x,0,"x",0),r=a(e.y,0,"y",0),n=a(e.width,1,"width",1),i=a(e.height,1,"height",1),s=await(0,P.cropDeviceScreen)(t,o,r,n,i,e.output);console.log(s)}catch(t){console.error("\u274C \u5C4F\u5E55\u88C1\u56FE\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function ht(e){try{const t=e.image?.trim();if(!t)throw new Error("\u8BF7\u901A\u8FC7 --image \u6307\u5B9A\u8F93\u5165\u56FE\u7247\u8DEF\u5F84\u3002");const o=a(e.x,0,"x",0),r=a(e.y,0,"y",0),n=a(e.radius,0,"radius",0,20),i=await(0,P.pickLocalImageColor)(t,o,r,n);console.log(i)}catch(t){console.error("\u274C \u56FE\u7247\u53D6\u8272\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function wt(e){try{const t=E(e),o=a(e.x,0,"x",0),r=a(e.y,0,"y",0),n=a(e.radius,0,"radius",0,20),i=await(0,P.pickDeviceScreenColor)(t,o,r,n);console.log(i)}catch(t){console.error("\u274C \u5C4F\u5E55\u53D6\u8272\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function yt(e){try{const t=e.image?.trim();if(!t)throw new Error("\u8BF7\u901A\u8FC7 --image \u6307\u5B9A\u8F93\u5165\u56FE\u7247\u8DEF\u5F84\u3002");const o=g(e.sampleCorner,"topLeft",["topLeft","topRight","bottomLeft","bottomRight"],"sample-corner"),r=a(e.tolerance,24,"tolerance",0,441),n=await(0,P.makeLocalImageTransparent)(t,e.output,e.transparentColor,o,r);console.log(n)}catch(t){console.error("\u274C \u900F\u660E\u56FE\u5236\u4F5C\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function xt(e){try{const t=(e.wsPort??"31111").trim(),o=Number.parseInt(t,10);if(!Number.isInteger(o)||o<1||o>65535)throw new Error(`\u65E0\u6548 ws \u7AEF\u53E3: ${t}`);const r=H.WSManager.get();await r.start(o);const n=async()=>{const s={pid:process.pid,port:o,address:r.getAddress(),startedAt:Date.now(),connected:r.isClientConnected(),clientIp:r.getConnectedClientIp()};await p.writeJSON(d,s)};await n();const i=setInterval(()=>{n().catch(()=>{})},1e3);await p.writeJSON(d,{pid:process.pid,port:o,address:r.getAddress(),startedAt:Date.now(),connected:r.isClientConnected(),clientIp:r.getConnectedClientIp()}),await new Promise(s=>{const u=async()=>{process.off("SIGINT",u),process.off("SIGTERM",u),clearInterval(i),await r.stop(),await p.remove(d),s()};process.on("SIGINT",u),process.on("SIGTERM",u)})}catch(t){console.error("\u274C WS \u670D\u52A1\u542F\u52A8\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function Pt(){try{if(!await p.pathExists(d)){console.log("WS \u670D\u52A1\u672A\u8FD0\u884C");return}const e=await p.readJSON(d),t=Number(e.pid);if(!Number.isInteger(t)||t<=0)throw await p.remove(d),new Error("WS PID \u6587\u4EF6\u635F\u574F");try{process.kill(t,"SIGTERM"),console.log(`\u2705 \u5DF2\u53D1\u9001\u505C\u6B62\u4FE1\u53F7\u5230 WS \u8FDB\u7A0B: ${t}`)}catch{console.log("WS \u8FDB\u7A0B\u4E0D\u5B58\u5728\uFF0C\u6E05\u7406 PID \u6587\u4EF6")}await p.remove(d)}catch(e){console.error("\u274C WS \u670D\u52A1\u505C\u6B62\u5931\u8D25:",e instanceof Error?e.message:e),process.exit(1)}}async function St(){if(!await p.pathExists(d)){console.log(JSON.stringify({status:"stopped",running:!1,pid:null,address:null,connected:!1,clientIp:null}));return}const e=await p.readJSON(d),t=Number(e.pid),o=String(e.address||"unknown"),r=!!e.connected,n=e.clientIp===null||e.clientIp===void 0?null:String(e.clientIp);let i=!1;try{process.kill(t,0),i=!0}catch{i=!1}if(!i){await p.remove(d),console.log(JSON.stringify({status:"stopped",running:!1,pid:null,address:null,connected:!1,clientIp:null}));return}console.log(JSON.stringify({status:"running",running:!0,pid:t,address:o,connected:r,clientIp:r?n||"unknown":null}))}function Ot(){const e=[];e.push(""),e.push("\u8BE6\u7EC6\u547D\u4EE4\u53C2\u6570:");const t=c.program.commands.filter(o=>o.name()!=="help");for(const o of t){if(e.push(` ${o.name()}:`),o.options.length===0){e.push(" (\u65E0\u989D\u5916\u53C2\u6570)");continue}for(const r of o.options){const n=r.defaultValue!==void 0&&r.defaultValue!==null?` (\u9ED8\u8BA4: ${String(r.defaultValue)})`:"",i=r.description?` ${r.description}${n}`:n;e.push(` ${r.flags}${i}`)}}return e.push(""),e.join(`
|
|
7
|
+
`)}c.program.name("ms-cli").description("\u5FEB\u70B9JS \u6784\u5EFA\u5DE5\u5177").version(k.PACKAGE_VERSION),c.program.addHelpText("after",Ot),c.program.command("build").description("\u6784\u5EFA \u5FEB\u70B9JS \u9879\u76EE").option("-d, --dev","\u5F00\u53D1\u6A21\u5F0F\u6784\u5EFA (\u5305\u542B source map)").action(rt),c.program.command("package").description("\u751F\u4EA7\u6784\u5EFA\u5E76\u52A0\u5BC6 ms.msbundle").option("--v2","\u6309\u9700\u70ED\u66F4\u65B0\u52A0\u5BC6").action(nt),c.program.command("run").description("\u5728\u8BBE\u5907\u4E0A\u8FD0\u884C\u9879\u76EE").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").action(it),c.program.command("run-ui").description("\u5728\u8BBE\u5907\u4E0A\u9884\u89C8 UI").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").action(st),c.program.command("stop").description("\u505C\u6B62\u8BBE\u5907\u4E0A\u7684\u9879\u76EE").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").action(at),c.program.command("screenshot").description("\u83B7\u53D6\u8BBE\u5907\u622A\u56FE\uFF08JPG\uFF09").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").option("--format <format>","\u8FD4\u56DE\u683C\u5F0F: file|base64","file").option("--output <output>","\u622A\u56FE\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08format=file \u65F6\u751F\u6548\uFF09").action(ct),c.program.command("source").description("\u83B7\u53D6\u8BBE\u5907\u5F53\u524D\u9875\u9762\u8282\u70B9 XML").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").option("--max-depth <maxDepth>","\u8282\u70B9\u6700\u5927\u6DF1\u5EA6","50").option("--timeout <timeout>","\u8282\u70B9\u6293\u53D6\u8D85\u65F6\u79D2\u6570","120").option("--mode <mode>","\u8282\u70B9\u6293\u53D6\u6A21\u5F0F: 1=\u6A21\u5F0F1, 2=\u6A21\u5F0F2, 3=\u6A21\u5F0F3","1").option("--output <output>","\u8282\u70B9 XML \u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(pt),c.program.command("logs").description("\u83B7\u53D6\u8BBE\u5907\u5F53\u524D\u65E5\u5FD7\u6700\u65B0\u884C").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("--limit <limit>","\u8BFB\u53D6\u6700\u65B0\u65E5\u5FD7\u884C\u6570\uFF0C\u8303\u56F4 1..5000","200").option("--format <format>","\u8FD4\u56DE\u683C\u5F0F: text|json","text").option("--output <output>","\u65E5\u5FD7\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(ut),c.program.command("ocr").description("\u5728\u8BBE\u5907\u4E0A\u6267\u884C OCR \u8BC6\u522B").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("--engine <engine>","OCR \u5F15\u64CE: appleocr|paddleocr","appleocr").option("--mode <mode>","OCR \u6A21\u5F0F: recognize|numbers|findText","recognize").option("--input <input>",'\u8F93\u5165\u6E90\uFF0C\u9ED8\u8BA4 "screen"',"screen").option("--x <x>","\u533A\u57DF\u5DE6\u4E0A\u89D2 x","0").option("--y <y>","\u533A\u57DF\u5DE6\u4E0A\u89D2 y","0").option("--ex <ex>","\u533A\u57DF\u53F3\u4E0B\u89D2 x\uFF1B\u5168\u5C4F\u53EF\u4F20 0","0").option("--ey <ey>","\u533A\u57DF\u53F3\u4E0B\u89D2 y\uFF1B\u5168\u5C4F\u53EF\u4F20 0","0").option("--text <text>","findText \u6587\u672C\uFF0C\u53EF\u91CD\u590D",K,[]).option("--texts <texts>","findText \u6587\u672C\u6570\u7EC4\uFF0C\u652F\u6301 JSON \u6570\u7EC4\u6216\u9017\u53F7\u5206\u9694").option("--languages <languages>","Apple OCR \u8BED\u8A00\uFF0C\u652F\u6301 JSON \u6570\u7EC4\u6216\u9017\u53F7\u5206\u9694").option("--exact-match","findText \u8981\u6C42\u5B8C\u6574\u5339\u914D\u6587\u672C").option("--confidence-threshold <confidenceThreshold>","PaddleOCR \u7F6E\u4FE1\u5EA6\u9608\u503C","0.6").option("--paddle-model <paddleModel>","\u4EC5 paddleocr\uFF1A\u5207\u6362\u6A21\u578B ppocr-v6-tiny|ppocr-v6-small|ppocr-v5").option("--max-side-len <maxSideLen>","\u4EC5 paddleocr\uFF1A\u68C0\u6D4B\u6700\u5927\u8FB9\u957F\uFF0C0 \u56DE\u843D\u9ED8\u8BA4 768").option("--use-gpu","\u4EC5 paddleocr\uFF1A\u5207\u6362\u6A21\u578B\u65F6\u542F\u7528 GPU").option("--timeout-ms <timeoutMs>","\u8BF7\u6C42\u8D85\u65F6\u65F6\u95F4(\u6BEB\u79D2)","60000").option("--format <format>","\u8FD4\u56DE\u683C\u5F0F: summary|json","summary").option("--output <output>","OCR \u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(lt),c.program.command("image-crop").description("\u88C1\u5207\u672C\u5730\u56FE\u7247\u5E76\u8F93\u51FA PNG").requiredOption("--image <image>","\u8F93\u5165\u56FE\u7247\u8DEF\u5F84").option("--x <x>","\u88C1\u5207\u8D77\u70B9 x","0").option("--y <y>","\u88C1\u5207\u8D77\u70B9 y","0").requiredOption("--width <width>","\u88C1\u5207\u5BBD\u5EA6").requiredOption("--height <height>","\u88C1\u5207\u9AD8\u5EA6").option("--output <output>","\u8F93\u51FA PNG \u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(ft),c.program.command("screen-crop").description("\u4ECE\u8BBE\u5907\u622A\u56FE\u4E2D\u88C1\u5207 PNG").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("--x <x>","\u88C1\u5207\u8D77\u70B9 x","0").option("--y <y>","\u88C1\u5207\u8D77\u70B9 y","0").requiredOption("--width <width>","\u88C1\u5207\u5BBD\u5EA6").requiredOption("--height <height>","\u88C1\u5207\u9AD8\u5EA6").option("--output <output>","\u8F93\u51FA PNG \u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(gt),c.program.command("image-pick-color").description("\u8BFB\u53D6\u672C\u5730\u56FE\u7247\u6307\u5B9A\u5750\u6807\u989C\u8272").requiredOption("--image <image>","\u8F93\u5165\u56FE\u7247\u8DEF\u5F84").option("--x <x>","\u76EE\u6807\u5750\u6807 x","0").option("--y <y>","\u76EE\u6807\u5750\u6807 y","0").option("--radius <radius>","\u91C7\u6837\u534A\u5F84\uFF0C\u8303\u56F4 0..20","0").action(ht),c.program.command("screen-pick-color").description("\u8BFB\u53D6\u8BBE\u5907\u622A\u56FE\u6307\u5B9A\u5750\u6807\u989C\u8272").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("--x <x>","\u76EE\u6807\u5750\u6807 x","0").option("--y <y>","\u76EE\u6807\u5750\u6807 y","0").option("--radius <radius>","\u91C7\u6837\u534A\u5F84\uFF0C\u8303\u56F4 0..20","0").action(wt),c.program.command("image-transparent").description("\u5C06\u56FE\u7247\u4E2D\u63A5\u8FD1\u6307\u5B9A\u989C\u8272\u6216\u89D2\u843D\u80CC\u666F\u8272\u7684\u50CF\u7D20\u8BBE\u4E3A\u900F\u660E").requiredOption("--image <image>","\u8F93\u5165\u56FE\u7247\u8DEF\u5F84").option("--output <output>","\u8F93\u51FA PNG \u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").option("--transparent-color <transparentColor>","\u900F\u660E\u5316\u989C\u8272\uFF0C\u683C\u5F0F #RRGGBB").option("--sample-corner <sampleCorner>","\u672A\u4F20 transparent-color \u65F6\u91C7\u6837\u89D2\u843D: topLeft|topRight|bottomLeft|bottomRight","topLeft").option("--tolerance <tolerance>","RGB \u6B27\u6C0F\u8DDD\u79BB\u5BB9\u5DEE\uFF0C\u8303\u56F4 0..441","24").action(yt);const Ct=c.program.command("docs").description("\u663E\u793A KuaiJS \u672C\u5730\u6587\u6863\u8DEF\u5F84");Ct.command("paths").description("\u663E\u793A KuaiJS \u672C\u5730\u6587\u6863\u8DEF\u5F84").option("--output <output>","\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(mt),c.program.command("http-call").description("\u6309 HTTP API \u6587\u6863\u58F0\u660E\u8C03\u7528\u8BBE\u5907\u63A5\u53E3").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").requiredOption("--method <method>","HTTP \u65B9\u6CD5: GET|POST").requiredOption("--path <path>","HTTP API \u76F8\u5BF9\u8DEF\u5F84\uFF0C\u4F8B\u5982 /api/status").option("--query <query>","JSON \u5BF9\u8C61 query \u53C2\u6570").option("--body <body>","JSON \u8BF7\u6C42\u4F53\uFF1B\u666E\u901A\u5B57\u7B26\u4E32\u4F1A\u4F5C\u4E3A JSON \u5B57\u7B26\u4E32\u63D0\u4EA4").option("--response-format <responseFormat>","\u54CD\u5E94\u683C\u5F0F: json|text","json").option("--timeout-ms <timeoutMs>","\u8BF7\u6C42\u8D85\u65F6\u65F6\u95F4(\u6BEB\u79D2)","30000").option("--output <output>","\u54CD\u5E94\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(dt),c.program.command("ws-start").description("\u542F\u52A8 CLI \u5185\u7F6E WS \u670D\u52A1").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").action(xt),c.program.command("ws-stop").description("\u505C\u6B62 CLI \u5185\u7F6E WS \u670D\u52A1").action(Pt),c.program.command("ws-status").description("\u67E5\u770B CLI \u5185\u7F6E WS \u670D\u52A1\u72B6\u6001").action(St),c.program.parse();
|
package/dist/packaging/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var s=exports&&exports.__createBinding||(Object.create?(function(e,n,r,t){t===void 0&&(t=r);var i=Object.getOwnPropertyDescriptor(n,r);(!i||("get"in i?!n.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return n[r]}}),Object.defineProperty(e,t,i)}):(function(e,n,r,t){t===void 0&&(t=r),e[t]=n[r]})),f=exports&&exports.__setModuleDefault||(Object.create?(function(e,n){Object.defineProperty(e,"default",{enumerable:!0,value:n})}):function(e,n){e.default=n}),o=exports&&exports.__importStar||(function(){var e=function(n){return e=Object.getOwnPropertyNames||function(r){var t=[];for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&(t[t.length]=i);return t},e(n)};return function(n){if(n&&n.__esModule)return n;var r={};if(n!=null)for(var t=e(n),i=0;i<t.length;i++)t[i]!=="default"&&s(r,n,t[i]);return f(r,n),r}})();Object.defineProperty(exports,"__esModule",{value:!0}),exports.packageProject=v;const l=require("module"),u=o(require("fs-extra")),a=o(require("path")),d=require("../build"),_=(0,l.createRequire)(__filename),c={BUNDLE_NAME:"ms.msbundle",ENCRYPTED_BUNDLE_NAME:"enc.msbundle"};function E(){return a.resolve(__dirname,"..","..")}function w(){const{platform:e,arch:n}=process;if(e==="darwin"&&n==="arm64")return"ms-bundle-enc.darwin-arm64.node";if(e==="darwin"&&n==="x64")return"ms-bundle-enc.darwin-x64.node";if(e==="win32"&&n==="x64")return"ms-bundle-enc.win32-x64-msvc.node";throw new Error(`\u4E0D\u652F\u6301\u7684\u7CFB\u7EDF\u5E73\u53F0: ${e}-${n}`)}function b(){const e=a.join(E(),"native",w());if(!u.pathExistsSync(e))throw new Error(`\u672A\u627E\u5230\u52A0\u5BC6\u6A21\u5757: ${e}`);return _(e)}async function h(e,n){if(n?.v2===!0)return!0;try{return(await u.readJson(a.join(e,"package.json")))?.hotUpdateVersion==="v2"}catch{return!1}}async function p(e,n){b().encrypt(e,{v2:n});const r=a.join(a.dirname(e),c.ENCRYPTED_BUNDLE_NAME);if(!await u.pathExists(r))throw new Error("\u52A0\u5BC6\u6A21\u5757\u672A\u751F\u6210 enc.msbundle \u6587\u4EF6");return await u.remove(e),r}async function v(e,n){await(0,d.buildAll)(!1,e);const r=a.join(e,"dist",c.BUNDLE_NAME);if(!await u.pathExists(r))throw new Error(`\u6784\u5EFA\u5931\u8D25\uFF0C\u672A\u627E\u5230 ${c.BUNDLE_NAME} \u6587\u4EF6`);const t=await h(e,n);return p(r,t)}
|
package/docs/api/device.md
CHANGED
|
@@ -59,12 +59,9 @@ logi(`剩余存储: ${storage.free}${storage.unit}`);
|
|
|
59
59
|
|
|
60
60
|
## 设备标识信息
|
|
61
61
|
|
|
62
|
-
### getDeviceID -
|
|
62
|
+
### getDeviceID - 获取设备 ID。
|
|
63
63
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
- 这个 ID 卸载重装 APP 后会改变。
|
|
67
|
-
- 更新 APP 后,不会改变。
|
|
64
|
+
越狱包返回芯片生成的固定 ID,卸载重装不变;免越狱包返回 IDFV,卸载重装会改变。
|
|
68
65
|
|
|
69
66
|
```typescript
|
|
70
67
|
function getDeviceID(): string;
|
|
@@ -72,14 +69,13 @@ function getDeviceID(): string;
|
|
|
72
69
|
|
|
73
70
|
**返回值:**
|
|
74
71
|
|
|
75
|
-
| 类型 | 描述
|
|
76
|
-
| ------ |
|
|
77
|
-
| string |
|
|
72
|
+
| 类型 | 描述 |
|
|
73
|
+
| ------ | ------- |
|
|
74
|
+
| string | 设备 ID |
|
|
78
75
|
|
|
79
76
|
**示例:**
|
|
80
77
|
|
|
81
78
|
```typescript
|
|
82
|
-
// 获取设备ID
|
|
83
79
|
const uuid = device.getDeviceID();
|
|
84
80
|
logi(`设备ID: ${uuid}`);
|
|
85
81
|
```
|
package/docs/api/global.md
CHANGED
|
@@ -66,10 +66,10 @@ logi(`运行状态: ${__isRunning__}`);
|
|
|
66
66
|
|
|
67
67
|
#### **platform**
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
免越狱包为 `"ios"`,越狱包为 `"ios_jb"`。
|
|
70
70
|
|
|
71
71
|
```typescript
|
|
72
|
-
declare const __platform__: "ios" | "
|
|
72
|
+
declare const __platform__: "ios" | "ios_jb";
|
|
73
73
|
```
|
|
74
74
|
|
|
75
75
|
**示例:**
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
# 清理模块 (JBClear)
|
|
2
|
+
|
|
3
|
+
仅越狱包可用。免越狱包没有 `jbclear`。
|
|
4
|
+
|
|
5
|
+
## API 参考
|
|
6
|
+
|
|
7
|
+
### keychain - 按关联名清理钥匙串。
|
|
8
|
+
|
|
9
|
+
空串返回 `false`。
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
function keychain(identifier: string): boolean;
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
**参数:**
|
|
16
|
+
|
|
17
|
+
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|
|
18
|
+
| ------------ | ------ | -------- | ------ | -------------------------------------- |
|
|
19
|
+
| `identifier` | string | 是 | - | 钥匙串关联名,例如 `"demo.sample.app"` |
|
|
20
|
+
|
|
21
|
+
**返回值:**
|
|
22
|
+
|
|
23
|
+
| 类型 | 描述 |
|
|
24
|
+
| --------- | ------------- |
|
|
25
|
+
| `boolean` | 成功为 `true` |
|
|
26
|
+
|
|
27
|
+
**示例:**
|
|
28
|
+
|
|
29
|
+
```javascript
|
|
30
|
+
jbclear.keychain("demo.sample.app");
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### allKeychain - 清理第三方应用钥匙串。
|
|
34
|
+
|
|
35
|
+
不清理本 App。
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
function allKeychain(): boolean;
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**返回值:**
|
|
42
|
+
|
|
43
|
+
| 类型 | 描述 |
|
|
44
|
+
| --------- | ------------- |
|
|
45
|
+
| `boolean` | 成功为 `true` |
|
|
46
|
+
|
|
47
|
+
**示例:**
|
|
48
|
+
|
|
49
|
+
```javascript
|
|
50
|
+
jbclear.allKeychain();
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### cookies - 清理 Safari Cookies。
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
function cookies(): boolean;
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**返回值:**
|
|
60
|
+
|
|
61
|
+
| 类型 | 描述 |
|
|
62
|
+
| --------- | ------------- |
|
|
63
|
+
| `boolean` | 成功为 `true` |
|
|
64
|
+
|
|
65
|
+
**示例:**
|
|
66
|
+
|
|
67
|
+
```javascript
|
|
68
|
+
jbclear.cookies();
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### caches - 清理系统缓存。
|
|
72
|
+
|
|
73
|
+
默认会重建图标缓存。传 `{ noUicache: true }` 跳过。
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
function caches(options?: { noUicache?: boolean }): boolean;
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**参数:**
|
|
80
|
+
|
|
81
|
+
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|
|
82
|
+
| --------- | ------ | -------- | ------ | ---------------------------------------- |
|
|
83
|
+
| `options` | object | 否 | - | `{ noUicache: true }` 时跳过重建图标缓存 |
|
|
84
|
+
|
|
85
|
+
**返回值:**
|
|
86
|
+
|
|
87
|
+
| 类型 | 描述 |
|
|
88
|
+
| --------- | ------------- |
|
|
89
|
+
| `boolean` | 成功为 `true` |
|
|
90
|
+
|
|
91
|
+
**示例:**
|
|
92
|
+
|
|
93
|
+
```javascript
|
|
94
|
+
jbclear.caches();
|
|
95
|
+
jbclear.caches({ noUicache: true });
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### photos - 删除本机相册里的本地照片。
|
|
99
|
+
|
|
100
|
+
不影响 iCloud 照片。
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
function photos(): boolean;
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**返回值:**
|
|
107
|
+
|
|
108
|
+
| 类型 | 描述 |
|
|
109
|
+
| --------- | ------------- |
|
|
110
|
+
| `boolean` | 成功为 `true` |
|
|
111
|
+
|
|
112
|
+
**示例:**
|
|
113
|
+
|
|
114
|
+
```javascript
|
|
115
|
+
jbclear.photos();
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### appData - 清理指定应用的本地数据,不卸载应用。
|
|
119
|
+
|
|
120
|
+
先结束该应用进程,再清数据容器、App Group、扩展数据容器,以及该应用钥匙串。不卸载。空包名或本 App 及其扩展返回 `false`。
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
function appData(bundleId: string): boolean;
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**参数:**
|
|
127
|
+
|
|
128
|
+
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|
|
129
|
+
| ---------- | ------ | -------- | ------ | -------------------------------------- |
|
|
130
|
+
| `bundleId` | string | 是 | - | 应用包标识符,例如 `"demo.sample.app"` |
|
|
131
|
+
|
|
132
|
+
**返回值:**
|
|
133
|
+
|
|
134
|
+
| 类型 | 描述 |
|
|
135
|
+
| --------- | ------------- |
|
|
136
|
+
| `boolean` | 成功为 `true` |
|
|
137
|
+
|
|
138
|
+
**示例:**
|
|
139
|
+
|
|
140
|
+
```javascript
|
|
141
|
+
jbclear.appData("demo.sample.app");
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### getIdfa - 读取整机广告标识(IDFA)。
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
function getIdfa(): string | null;
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
**返回值:**
|
|
151
|
+
|
|
152
|
+
| 类型 | 描述 |
|
|
153
|
+
| ---------------- | ------------------------------ |
|
|
154
|
+
| `string \| null` | UUID 字符串;读不到返回 `null` |
|
|
155
|
+
|
|
156
|
+
**示例:**
|
|
157
|
+
|
|
158
|
+
```javascript
|
|
159
|
+
const idfa = jbclear.getIdfa();
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### resetIdfa - 重置整机广告标识(IDFA)。
|
|
163
|
+
|
|
164
|
+
之后所有 App 读到的 IDFA 都会变。
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
function resetIdfa(): string | null;
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**返回值:**
|
|
171
|
+
|
|
172
|
+
| 类型 | 描述 |
|
|
173
|
+
| ---------------- | ------------------------------ |
|
|
174
|
+
| `string \| null` | 重置前的 UUID;失败返回 `null` |
|
|
175
|
+
|
|
176
|
+
**示例:**
|
|
177
|
+
|
|
178
|
+
```javascript
|
|
179
|
+
const old = jbclear.resetIdfa();
|
|
180
|
+
if (old) {
|
|
181
|
+
file.writeFile("idfa.txt", old);
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### setIdfa - 写入整机广告标识(IDFA)。
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
function setIdfa(value: string): string | null;
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**参数:**
|
|
192
|
+
|
|
193
|
+
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|
|
194
|
+
| ------- | ------ | -------- | ------ | ----------------------------------- |
|
|
195
|
+
| `value` | string | 是 | - | `getIdfa` / `resetIdfa` 返回的 UUID |
|
|
196
|
+
|
|
197
|
+
**返回值:**
|
|
198
|
+
|
|
199
|
+
| 类型 | 描述 |
|
|
200
|
+
| ---------------- | ------------------------------ |
|
|
201
|
+
| `string \| null` | 写入前的 UUID;失败返回 `null` |
|
|
202
|
+
|
|
203
|
+
**示例:**
|
|
204
|
+
|
|
205
|
+
```javascript
|
|
206
|
+
const old = file.readFile("idfa.txt");
|
|
207
|
+
if (old) {
|
|
208
|
+
jbclear.setIdfa(old);
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### getIdfv - 读取指定应用所属开发商的 IDFV。
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
function getIdfv(bundleId: string): string | null;
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**参数:**
|
|
219
|
+
|
|
220
|
+
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|
|
221
|
+
| ---------- | ------ | -------- | ------ | -------------------------------------- |
|
|
222
|
+
| `bundleId` | string | 是 | - | 应用包标识符,例如 `"demo.sample.app"` |
|
|
223
|
+
|
|
224
|
+
**返回值:**
|
|
225
|
+
|
|
226
|
+
| 类型 | 描述 |
|
|
227
|
+
| ---------------- | ------------------------------ |
|
|
228
|
+
| `string \| null` | UUID 字符串;读不到返回 `null` |
|
|
229
|
+
|
|
230
|
+
**示例:**
|
|
231
|
+
|
|
232
|
+
```javascript
|
|
233
|
+
const idfv = jbclear.getIdfv("demo.sample.app");
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### resetIdfv - 重置指定应用所属开发商的 IDFV。
|
|
237
|
+
|
|
238
|
+
同一开发商的 App 会一起变。
|
|
239
|
+
|
|
240
|
+
```typescript
|
|
241
|
+
function resetIdfv(bundleId: string): string | null;
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
**参数:**
|
|
245
|
+
|
|
246
|
+
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|
|
247
|
+
| ---------- | ------ | -------- | ------ | -------------------------------------- |
|
|
248
|
+
| `bundleId` | string | 是 | - | 应用包标识符,例如 `"demo.sample.app"` |
|
|
249
|
+
|
|
250
|
+
**返回值:**
|
|
251
|
+
|
|
252
|
+
| 类型 | 描述 |
|
|
253
|
+
| ---------------- | ------------------------------ |
|
|
254
|
+
| `string \| null` | 重置前的 UUID;失败返回 `null` |
|
|
255
|
+
|
|
256
|
+
**示例:**
|
|
257
|
+
|
|
258
|
+
```javascript
|
|
259
|
+
const old = jbclear.resetIdfv("demo.sample.app");
|
|
260
|
+
if (old) {
|
|
261
|
+
file.writeFile("idfv.txt", old);
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### setIdfv - 写入指定应用所属开发商的 IDFV。
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
function setIdfv(bundleId: string, value: string): string | null;
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
**参数:**
|
|
272
|
+
|
|
273
|
+
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|
|
274
|
+
| ---------- | ------ | -------- | ------ | -------------------------------------- |
|
|
275
|
+
| `bundleId` | string | 是 | - | 应用包标识符,例如 `"demo.sample.app"` |
|
|
276
|
+
| `value` | string | 是 | - | `getIdfv` / `resetIdfv` 返回的 UUID |
|
|
277
|
+
|
|
278
|
+
**返回值:**
|
|
279
|
+
|
|
280
|
+
| 类型 | 描述 |
|
|
281
|
+
| ---------------- | ------------------------------ |
|
|
282
|
+
| `string \| null` | 写入前的 UUID;失败返回 `null` |
|
|
283
|
+
|
|
284
|
+
**示例:**
|
|
285
|
+
|
|
286
|
+
```javascript
|
|
287
|
+
const old = file.readFile("idfv.txt");
|
|
288
|
+
if (old) {
|
|
289
|
+
jbclear.setIdfv("demo.sample.app", old);
|
|
290
|
+
}
|
|
291
|
+
```
|