@deveco-test/hmos-deveco-cli 0.3.1 → 0.3.2

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.
@@ -1,4 +1,5 @@
1
- import*as h from"fs";import*as T from"path";import Mi from"adm-zip";import ki from"proper-lockfile";import vi from"ora";import*as A from"fs";import*as at from"path";var Bt=["harmonyos-guides","harmonyos-references","best-practices","harmonyos-faqs","harmonyos-releases","harmonyos-roadmap"],dt={"harmonyos-guides":"\u5F00\u53D1\u6307\u5357","harmonyos-references":"API\u53C2\u8003","best-practices":"\u6700\u4F73\u5B9E\u8DF5","harmonyos-faqs":"FAQ","harmonyos-releases":"\u7248\u672C\u8BF4\u660E","harmonyos-roadmap":"\u53D8\u66F4\u9884\u544A"};var H="1.9.1",Vi=48*1024*1024,Ae=280,De=6,Ie=100,Te=3,Ce=28,Mt=10,Re=/API参考|APIReference/i;var Ne=6,mt=700,kt=250,vt=400,Pe=1320,Oe=120,Le=450,Be=250,Me=500,ke=480,ve=80,Fe=200,ze=60,He=200,je=40,Ue=200,Ze=200,$e=40,j=500,Ge=Object.fromEntries(Bt.map((t,e)=>[dt[t],e])),O=Object.fromEntries(Bt.map((t,e)=>[t,e]));import*as tt from"fs";import*as m from"path";import{fileURLToPath as Ve}from"url";import*as L from"fs";import*as qe from"path";import{homedir as xr}from"os";import*as Xe from"fs";import*as E from"path";function V(t,e){let n=E.relative(e,t);return n===""||!E.isAbsolute(n)&&!n.startsWith(`..${E.sep}`)&&n!==".."}function U(t){let e=E.resolve(t),n=[],r=e;for(;;)try{let o=Xe.realpathSync(r);return n.length===0?o:E.join(o,...n.reverse())}catch(o){if(o.code!=="ENOENT")throw o;let i=E.dirname(r);if(i===r)return e;n.push(E.basename(r)),r=i}}function We(t,e){let n=U(e),r=U(t);return V(r,n)?r:null}function Ft(t){let e=t.trim();return(e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'"))&&(e=e.slice(1,-1).trim()),e}function Qe(t){let e=Ft(t);if(!e)throw new Error("Path must not be empty.");return U(e)}var Er="deveco-cli",zt,k=class extends Error{constructor(e){super(e),this.name="CliDataDirError"}};function Je(){let t=process.env.DEVECO_CLI_DATA_DIR,n=(t===void 0||t===""?"":Ft(t))||qe.join(xr(),".local","share",Er);try{return Qe(n)}catch(r){throw new k(r instanceof Error?r.message:String(r))}}async function Ye(){let t=Je();await L.promises.mkdir(t,{recursive:!0});let e;try{e=await L.promises.realpath(t)}catch(r){throw new k(`DEVECO_CLI_DATA_DIR is not usable: ${r instanceof Error?r.message:String(r)}`)}if(!(await L.promises.stat(e)).isDirectory())throw new k("DEVECO_CLI_DATA_DIR must be a writable directory.");return zt=e,e}function K(){if(zt!==void 0)return zt;let t=Je();try{if(L.existsSync(t))return L.realpathSync(t)}catch{}return t}var _r="docs";function Z(){return m.join(K(),_r)}function g(){return m.join(Z(),".index")}function ft(){return m.join(g(),"build.lock")}function et(){return m.join(g(),"build-status.json")}function $(){return m.join(g(),"build-meta.json")}function G(){return m.join(g(),"search.db")}function nt(){return m.join(g(),"sqlite-backend.json")}function rt(){return m.join(g(),"jieba-backend.json")}function C(){return m.join(g(),".tmp")}function br(){return m.join(K(),"logs")}function Ht(){return m.join(br(),"doc-init.log")}function wr(t,e){let n=e;for(;!n.endsWith(`${m.sep}dist`)&&n!==m.dirname(n);)n=m.dirname(n);return n}function Ke(t,e){return m.dirname(wr(t,e))}function tn(){let t=Ve(import.meta.url),e=m.dirname(t);return t.includes(`${m.sep}dist${m.sep}`)?Ke(t,e):m.join(e,"..","..","..")}function Ar(...t){let e=Ve(import.meta.url),n=m.dirname(e);return e.includes(`${m.sep}dist${m.sep}`)?[m.join(Ke(e,n),...t)]:[m.join(n,"..","..","..",...t)]}function en(...t){let e=tn(),n=tt.realpathSync(e);for(let r of Ar(...t))try{let o=tt.lstatSync(r);if(o.isSymbolicLink()||!o.isFile())throw new Error(`Unsafe documentation package asset: ${t.join("/")} must be a regular file.`);let i=tt.realpathSync(r);if(!V(i,n))throw new Error(`Unsafe documentation package asset: ${t.join("/")} is outside the package.`);return i}catch(o){if(o.code!=="ENOENT")throw o}return null}function v(){return en("docs.zip")}function jt(){return en("index.zip")}function nn(){return m.join(tn(),"index","data")}import*as R from"fs";import*as F from"path";var N=["harmonyos-terms.txt","harmonyos-synonyms.json","harmonyos-stopwords.txt"],Ut=class extends Error{constructor(e){super(e),this.name="LexiconNotFoundError"}};var Zt=null;function $t(t){Zt=t}function rn(){if(Zt)return Zt;let t=g();if(N.every(o=>R.existsSync(F.join(t,o))))return t;let n=nn();if(N.every(o=>R.existsSync(F.join(n,o))))return n;throw new Ut("Lexicon files not found. Install the documentation index first (index.zip).")}function X(t){let e=F.join(rn(),t);return R.readFileSync(e,"utf-8")}function on(t,e){return R.readFileSync(F.join(e,t),"utf-8")}async function sn(t,e=rn()){await R.promises.mkdir(t,{recursive:!0});for(let n of N){let r=F.join(e,n),o=F.join(t,n);await R.promises.copyFile(r,o)}}import*as Gt from"fs";import*as Dr from"yauzl";function Xt(){let t=v();return t!==null&&Gt.existsSync(t)}import*as y from"fs";import*as P from"path";import an from"adm-zip";import*as ot from"fs";import*as gt from"path";var pt=class extends Error{constructor(e){super(`Unsafe documentation path: ${e}`),this.name="DocPathSafetyError"}};function qt(t){return t instanceof k||t instanceof pt||t instanceof Error&&(t.name==="CliDataDirError"||t.name==="DocPathSafetyError")}function Jt(t){return new pt(t)}function Ir(){return U(K())}function Qt(t,e,n){let r=We(t,e);if(r===null)throw Jt(`${n} resolves outside the data directory.`);return r}async function Wt(t,e){await ot.promises.mkdir(t,{recursive:!0});let n=Qt(t,e,"directory");if(!(await ot.promises.stat(n)).isDirectory())throw Jt("path must be a directory.")}function it(t){let e=Ir();try{let n=Qt(t,e,"file");if(!ot.statSync(n).isFile())throw Jt("path must be a regular file.")}catch(n){if(n.code==="ENOENT"){Qt(gt.dirname(t),e,"file parent");return}throw n}}async function st(t={}){let e=t.mode??"write",n=await Ye();await Wt(Z(),n),await Wt(g(),n),e==="write"&&await Wt(C(),n);for(let r of[G(),$(),et(),ft(),rt(),nt(),...N.map(o=>gt.join(g(),o))])it(r)}var Yt=["search.db","build-meta.json",...N],Tr=["corpus.json","corpus-offsets.json","orama.dpack"];async function Cr(t){for(let e of Tr)await y.promises.rm(P.join(t,e),{force:!0})}async function Rr(t){let e=await y.promises.readdir(t,{withFileTypes:!0});for(let n of e)n.name!==".index"&&await y.promises.rm(P.join(t,n.name),{recursive:!0,force:!0})}function cn(t){let n=new an(t).getEntry("build-meta.json");if(!n)throw new Error("index.zip is missing build-meta.json");return JSON.parse(n.getData().toString("utf-8"))}async function Nr(t){let e=g();await y.promises.mkdir(e,{recursive:!0});for(let n of Yt){let r=P.join(e,n);await y.promises.rm(r,{force:!0}),await y.promises.rename(P.join(t,n),r)}await Cr(e),await y.promises.rm(C(),{recursive:!0,force:!0})}function un(t){let e=jt();if(!e)return!1;try{let n=cn(e);return n.indexVersion===H&&n.docsZipSha256===t&&n.segmentCount>0}catch{return!1}}async function ln(t){await st({mode:"write"});let e=jt();if(!e)throw new Error("index.zip not found");let n=cn(e);if(n.docsZipSha256!==t)throw new Error("Bundled index.zip does not match docs.zip. Rebuild index.zip with npm run build:index.");if(n.segmentCount<=0)throw new Error("Bundled index.zip is empty");let r=C();await y.promises.rm(r,{recursive:!0,force:!0}),await y.promises.mkdir(r,{recursive:!0});let o=new an(e);for(let s of Yt){let a=o.getEntry(s);if(!a)throw new Error(`index.zip is missing ${s}`);await y.promises.writeFile(P.join(r,s),a.getData())}let i=JSON.parse(await y.promises.readFile(P.join(r,"build-meta.json"),"utf-8"));if(!y.existsSync(P.join(r,"search.db")))throw new Error("index.zip is missing search.db");return await Nr(r),await y.promises.mkdir(Z(),{recursive:!0}),await Rr(Z()),i}async function dn(){await y.promises.rm(C(),{recursive:!0,force:!0});let t=g();for(let e of Yt)await y.promises.rm(P.join(t,e),{force:!0})}import{createHash as mn}from"crypto";import*as fn from"fs";async function ht(t){return new Promise((e,n)=>{let r=mn("sha256"),o=fn.createReadStream(t);o.on("data",i=>r.update(i)),o.on("error",n),o.on("end",()=>e(r.digest("hex")))})}function pn(t){return mn("sha256").update(t,"utf8").digest("hex")}function gn(t,e){let n=e?on(t,e):X(t);return pn(n)}function St(t){return gn("harmonyos-synonyms.json",t)}function yt(t){return gn("harmonyos-terms.txt",t)}var Pr={state:"idle",phase:0,phaseLabel:"Idle",current:0,total:0,message:"",startedAt:0,updatedAt:0,error:null};async function hn(){try{let t=await A.promises.readFile(et(),"utf-8");return JSON.parse(t)}catch{return{...Pr}}}async function Vt(t){let e=et();await A.promises.mkdir(at.dirname(e),{recursive:!0}),await A.promises.writeFile(e,JSON.stringify(t,null,2))}function Sn(t){let e=Date.now();return{state:"extracting",phase:1,phaseLabel:"Extracting documentation",current:0,total:0,message:t,startedAt:e,updatedAt:e,error:null}}async function B(t){let n={...await hn(),...t,updatedAt:Date.now()};return await Vt(n),n}async function Kt(){let t=v();return t?ht(t):null}async function te(){try{let t=await A.promises.readFile($(),"utf-8");return JSON.parse(t)}catch{return null}}async function ee(t=!1){if(t)return"no-index";let e=await te();if(!e||e.segmentCount===0)return"no-index";let n=await Kt();return n&&e.docsZipSha256!==n?"docs-changed":e.indexVersion!==H?"engine-upgraded":e.termsHash!==yt()?"terms-changed":e.synonymsHash!==St()?"synonyms-changed":null}function ne(){if(!Xt()||!A.existsSync(G())||!A.existsSync($()))return!1;let t=at.dirname(G());if(!N.every(e=>A.existsSync(at.join(t,e))))return!1;try{let e=A.readFileSync($(),"utf-8");return JSON.parse(e).segmentCount>0}catch{return!1}}async function yn(t=!1){return t?!0:Xt()?ne()?await ee()!==null:!0:!1}import*as x from"fs";import*as mr from"os";import*as _ from"path";var xn=new Set(["picker","dialog","sheet","panel","popup","menu","layout","view","gesture","animation","transition","recognizer","manager","kit"]);var En=new Set(["a","an","and","api","app","application","arkts","arkui","for","get","harmonyos","how","in","oh","ohos","on","or","set","the","to","use","using","what","when","where","which","with","without","data","file","main","model","name","network","stage","system","type","user"]),_n=new Set(["ability","extension","module","service","context","options","config","info","event","code","state","type","data","request","response","client","server","handler","helper","utils","factory","builder","listener","callback","observer","provider","consumer","delegate","adapter","driver","buffer","stream","channel","session","task","worker","controller","component","container","attribute","descriptor","modifier","validator","parser","formatter","encoder","decoder","filter","converter","generator","iterator","dispatcher","resolver","scanner","tracker","monitor","scheduler","renderer","loader","subscriber","proxy","button","surface","stack","heap","map","set","array","list"]);var Or=/@ohos\.[a-z][a-zA-Z0-9.]+/gi,Lr=/\b[a-z][a-z0-9]*[A-Z][a-zA-Z0-9]+\b/g,Br=/[A-Z][a-zA-Z0-9]{2,}/g,Mr=/@[A-Z][a-zA-Z0-9]*/g,kr=/[a-z][a-zA-Z0-9]*\.[a-zA-Z][a-zA-Z0-9]+/g,bn=6,vr=/^[a-z][a-z0-9]{2,}$/,Fr=/^([a-z][a-z0-9]{2,})\s+([a-z][a-z0-9]{2,})$/,zr=/^@ohos\.[a-z][a-zA-Z0-9.]+$/i,Hr=/^[a-z][a-z0-9]*[A-Z][a-zA-Z0-9]+$/,jr=/^[A-Z][a-zA-Z0-9]+$/;function re(t){return zr.test(t)}function Ur(t){return Hr.test(t)&&t.length>=bn}function Zr(t){return jr.test(t)}function oe(t){return re(t)||Ur(t)||Zr(t)}function $r(t){let e=t.trim().toLowerCase();return _n.has(e)?!1:xn.has(e)}function Gr(t,e){let n=e.trim().charAt(0).toUpperCase(),r=e.trim().slice(1).toLowerCase();return`${t.trim().toLowerCase()}${n}${r}`}function xt(t){let n=t.replace(/^@ohos\./i,"").split(".").filter(Boolean);return n[n.length-1]?.trim()||void 0}function ie(t){return[...t.matchAll(Or)].map(e=>e[0])}function se(t,e=bn){let n=[];for(let r of t.matchAll(Lr))r[0].length>=e&&n.push(r[0]);return n}function W(t){return t.filter(e=>{let n=e.toLowerCase();return!t.some(r=>{if(r===e)return!1;let o=r.toLowerCase();return o.length>n.length&&o.endsWith(n)&&n.length>=4})})}function D(t,e){let n=e.trim();if(!n)return;t.add(n);let r=n.toLowerCase();r!==n&&t.add(r)}function Xr(t){let e=new Set;D(e,t);let n=xt(t);return n&&D(e,n),W([...e])}function ae(t){if(re(t))return Xr(t);let e=new Set;return D(e,t),W([...e])}function ce(t){let e=t.trim();if(/[A-Z]/.test(e))return null;let n=e.match(Fr);if(!n)return null;let r=n[1].toLowerCase(),o=n[2].toLowerCase();if(!vr.test(r)||En.has(r)||!$r(o))return null;let i=Gr(r,o);return{first:r,second:o,camelCase:i,lower:i.toLowerCase()}}function wn(t){let e=ce(t.trim());return!e||e.second!=="manager"?null:e}function ue(t,e,n){let r=n.toLowerCase(),o=new RegExp(`@ohos\\.[^\\s(]*${n}`,"i");for(let i of[t,e])if(i&&(i.toLowerCase().includes(r)||o.test(i)))return!0;return!1}function An(t){let e=t.trim();if(oe(e))return ae(e);let n=new Set;for(let r of ie(t)){D(n,r);let o=xt(r);o&&D(n,o)}for(let r of se(t))D(n,r);for(let r of t.matchAll(Mr))n.add(r[0]);for(let r of t.matchAll(kr))n.add(r[0]);for(let r of t.matchAll(Br))r[0].length>=4&&n.add(r[0]);return W([...n])}function Dn(t){let e=t.trim();if(oe(e))return ae(e);let n=new Set,r=ce(e);r&&D(n,r.camelCase);for(let o of An(e))n.add(o);for(let o of e.matchAll(/\b[a-z][a-zA-Z0-9]{3,}\b/g)){let i=o[0];i!==i.toLowerCase()&&n.add(i)}return W([...n])}var I={pureApiSymbol:/^[A-Z][a-zA-Z0-9]+$/,stageModelExact:/^Stage\s*模型$/i,stageModelEnglishExact:/^stage\s+model$/i,stageModel:/Stage\s*模型/i,stageModelEntryPage:/Stage\s*模型.*EntryAbility.*(页面|新页面)/,declarePermissionBoost:/声明.*权限|应用权限.*声明|如何声明应用权限/,declarePermissionCatalog:/如何声明应用权限/,declarePermissionTokens:/如何声明应用权限|声明应用权限/,uiAbilityLifecycleBoost:/UIAbility.*生命周期|生命周期.*UIAbility|UIAblity/i,uiAbilityLifecycleCatalog:/UIAblity.*生命周期|UIAbility.*生命周期/i,entryAbilityPage:/EntryAbility.*(页面|启动|跳转|新页面)/,stateDecoratorBoost:/@State|@Prop|@Link|@Provide|@Consume/,stateDecoratorCatalog:/@State\s*装饰器|@Prop\s*装饰器|@Link\s*装饰器/,stateManagement:/状态管理原理/,routerRoute:/Router\s+路由/,dialogPopupExact:/^Dialog\s+弹窗$/,dialogPopupBoost:/Dialog\s+弹窗/};function Tn(t){return I.pureApiSymbol.test(t.trim())}function In(t){let e=t.trim();return I.stageModelExact.test(e)||I.stageModelEnglishExact.test(e)}var Wr=[{matches:t=>I.uiAbilityLifecycleBoost.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.85},{catalog:"harmonyos-references",multiplier:.65},{catalog:"harmonyos-faqs",multiplier:.82}]},{matches:t=>In(t),weights:[{catalog:"harmonyos-guides",multiplier:1.85},{catalog:"harmonyos-references",multiplier:.55},{catalog:"harmonyos-faqs",multiplier:.85}]},{matches:t=>!In(t)&&I.stageModel.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.65},{catalog:"harmonyos-references",multiplier:.65}]},{matches:t=>I.entryAbilityPage.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.75},{catalog:"harmonyos-references",multiplier:.48}]},{matches:t=>I.declarePermissionBoost.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.65},{catalog:"best-practices",multiplier:.68}]},{matches:t=>I.stateDecoratorBoost.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.75},{catalog:"harmonyos-references",multiplier:.42}]},{matches:t=>I.stateManagement.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.6},{catalog:"best-practices",multiplier:.78}]},{matches:t=>I.routerRoute.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.65},{catalog:"harmonyos-references",multiplier:1.4},{catalog:"harmonyos-faqs",multiplier:.72},{catalog:"best-practices",multiplier:.72}]},{matches:t=>I.dialogPopupBoost.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.65},{catalog:"harmonyos-faqs",multiplier:.72},{catalog:"best-practices",multiplier:.72}]}];function Qr(t,e){for(let{catalog:n,multiplier:r}of e){let o=O[n];t.set(o,(t.get(o)??1)*r)}}function Cn(t,e){for(let n of Wr)n.matches(t)&&Qr(e,n.weights)}import*as Rn from"os";function le(){return qr().toLowerCase().includes("openharmony")}function qr(){return Rn.platform()}import*as Q from"fs";import*as Pn from"path";function z(t){process.env.DEVECO_CLI_DEBUG&&console.log(`[DEBUG] ${t}`)}var Et=null,de=null,me=null;function Jr(){return Q.existsSync(rt())}function Yr(t){let e=rt(),n={backend:"jieba-wasm",reason:"native-jieba-load-failed",message:t,createdAt:new Date().toISOString()};Q.mkdirSync(Pn.dirname(e),{recursive:!0}),it(e),Q.writeFileSync(e,JSON.stringify(n,null,2))}function Vr(){if(Et)return Et;let t=X("harmonyos-stopwords.txt");return Et=new Set(t.split(`
1
+ import*as h from"fs";import*as T from"path";import Mi from"adm-zip";import ki from"proper-lockfile";import vi from"ora";import*as A from"fs";import*as at from"path";var Bt=["harmonyos-guides","harmonyos-references","best-practices","harmonyos-faqs","harmonyos-releases","harmonyos-roadmap"],dt={"harmonyos-guides":"\u5F00\u53D1\u6307\u5357","harmonyos-references":"API\u53C2\u8003","best-practices":"\u6700\u4F73\u5B9E\u8DF5","harmonyos-faqs":"FAQ","harmonyos-releases":"\u7248\u672C\u8BF4\u660E","harmonyos-roadmap":"\u53D8\u66F4\u9884\u544A"};var H="1.9.1",Vi=48*1024*1024,Ae=280,De=6,Ie=100,Te=3,Ce=28,Mt=10,Re=/API参考|APIReference/i;var Ne=6,mt=700,kt=250,vt=400,Pe=1320,Oe=120,Le=450,Be=250,Me=500,ke=480,ve=80,Fe=200,ze=60,He=200,je=40,Ue=200,Ze=200,$e=40,j=500,Ge=Object.fromEntries(Bt.map((t,e)=>[dt[t],e])),O=Object.fromEntries(Bt.map((t,e)=>[t,e]));import*as tt from"fs";import*as m from"path";import{fileURLToPath as Ve}from"url";import*as L from"fs";import*as qe from"path";import{homedir as xr}from"os";import*as Xe from"fs";import*as E from"path";function V(t,e){let n=E.relative(e,t);return n===""||!E.isAbsolute(n)&&!n.startsWith(`..${E.sep}`)&&n!==".."}function U(t){let e=E.resolve(t),n=[],r=e;for(;;)try{let o=Xe.realpathSync(r);return n.length===0?o:E.join(o,...n.reverse())}catch(o){if(o.code!=="ENOENT")throw o;let i=E.dirname(r);if(i===r)return e;n.push(E.basename(r)),r=i}}function We(t,e){let n=U(e),r=U(t);return V(r,n)?r:null}function Ft(t){let e=t.trim();return(e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'"))&&(e=e.slice(1,-1).trim()),e}function Qe(t){let e=Ft(t);if(!e)throw new Error("Path must not be empty.");return U(e)}var Er="deveco-cli",zt,k=class extends Error{constructor(e){super(e),this.name="CliDataDirError"}};function Je(){let t=process.env.DEVECO_CLI_DATA_DIR,n=(t===void 0||t===""?"":Ft(t))||qe.join(xr(),".local","share",Er);try{return Qe(n)}catch(r){throw new k(r instanceof Error?r.message:String(r))}}async function Ye(){let t=Je();await L.promises.mkdir(t,{recursive:!0});let e;try{e=await L.promises.realpath(t)}catch(r){throw new k(`DEVECO_CLI_DATA_DIR is not usable: ${r instanceof Error?r.message:String(r)}`)}if(!(await L.promises.stat(e)).isDirectory())throw new k("DEVECO_CLI_DATA_DIR must be a writable directory.");return zt=e,e}function K(){if(zt!==void 0)return zt;let t=Je();try{if(L.existsSync(t))return L.realpathSync(t)}catch{}return t}var _r="docs";function Z(){return m.join(K(),_r)}function g(){return m.join(Z(),".index")}function ft(){return m.join(g(),"build.lock")}function et(){return m.join(g(),"build-status.json")}function $(){return m.join(g(),"build-meta.json")}function G(){return m.join(g(),"search.db")}function nt(){return m.join(g(),"sqlite-backend.json")}function rt(){return m.join(g(),"jieba-backend.json")}function C(){return m.join(g(),".tmp")}function br(){return m.join(K(),"logs")}function Ht(){return m.join(br(),"doc-init.log")}function wr(t,e){let n=e;for(;!n.endsWith(`${m.sep}dist`)&&n!==m.dirname(n);)n=m.dirname(n);return n}function Ke(t,e){return m.dirname(wr(t,e))}function tn(){let t=Ve(import.meta.url),e=m.dirname(t);return t.includes(`${m.sep}dist${m.sep}`)?Ke(t,e):m.join(e,"..","..","..")}function Ar(...t){let e=Ve(import.meta.url),n=m.dirname(e);return e.includes(`${m.sep}dist${m.sep}`)?[m.join(Ke(e,n),...t)]:[m.join(n,"..","..","..",...t)]}function en(...t){let e=tn(),n=tt.realpathSync(e);for(let r of Ar(...t))try{let o=tt.lstatSync(r);if(o.isSymbolicLink()||!o.isFile())throw new Error(`Unsafe documentation package asset: ${t.join("/")} must be a regular file.`);let i=tt.realpathSync(r);if(!V(i,n))throw new Error(`Unsafe documentation package asset: ${t.join("/")} is outside the package.`);return i}catch(o){if(o.code!=="ENOENT")throw o}return null}function v(){return en("docs.zip")}function jt(){return en("index.zip")}function nn(){return m.join(tn(),"index","data")}import*as R from"fs";import*as F from"path";var N=["harmonyos-terms.txt","harmonyos-synonyms.json","harmonyos-stopwords.txt"],Ut=class extends Error{constructor(e){super(e),this.name="LexiconNotFoundError"}};var Zt=null;function $t(t){Zt=t}function rn(){if(Zt)return Zt;let t=g();if(N.every(o=>R.existsSync(F.join(t,o))))return t;let n=nn();if(N.every(o=>R.existsSync(F.join(n,o))))return n;throw new Ut("Lexicon files not found. Install the documentation index first (index.zip).")}function X(t){let e=F.join(rn(),t);return R.readFileSync(e,"utf-8")}function on(t,e){return R.readFileSync(F.join(e,t),"utf-8")}async function sn(t,e=rn()){await R.promises.mkdir(t,{recursive:!0});for(let n of N){let r=F.join(e,n),o=F.join(t,n);await R.promises.copyFile(r,o)}}import*as Gt from"fs";import*as Dr from"yauzl";function Xt(){let t=v();return t!==null&&Gt.existsSync(t)}import*as y from"fs";import*as P from"path";import an from"adm-zip";import*as ot from"fs";import*as gt from"path";var pt=class extends Error{constructor(e){super(`Unsafe documentation path: ${e}`),this.name="DocPathSafetyError"}};function qt(t){return t instanceof k||t instanceof pt||t instanceof Error&&(t.name==="CliDataDirError"||t.name==="DocPathSafetyError")}function Jt(t){return new pt(t)}function Ir(){return U(K())}function Qt(t,e,n){let r=We(t,e);if(r===null)throw Jt(`${n} resolves outside the data directory.`);return r}async function Wt(t,e){await ot.promises.mkdir(t,{recursive:!0});let n=Qt(t,e,"directory");if(!(await ot.promises.stat(n)).isDirectory())throw Jt("path must be a directory.")}function it(t){let e=Ir();try{let n=Qt(t,e,"file");if(!ot.statSync(n).isFile())throw Jt("path must be a regular file.")}catch(n){if(n.code==="ENOENT"){Qt(gt.dirname(t),e,"file parent");return}throw n}}async function st(t={}){let e=t.mode??"write",n=await Ye();await Wt(Z(),n),await Wt(g(),n),e==="write"&&await Wt(C(),n);for(let r of[G(),$(),et(),ft(),rt(),nt(),...N.map(o=>gt.join(g(),o))])it(r)}var Yt=["search.db","build-meta.json",...N],Tr=["corpus.json","corpus-offsets.json","orama.dpack"];async function Cr(t){for(let e of Tr)await y.promises.rm(P.join(t,e),{force:!0})}async function Rr(t){let e=await y.promises.readdir(t,{withFileTypes:!0});for(let n of e)n.name!==".index"&&await y.promises.rm(P.join(t,n.name),{recursive:!0,force:!0})}function cn(t){let n=new an(t).getEntry("build-meta.json");if(!n)throw new Error("index.zip is missing build-meta.json");return JSON.parse(n.getData().toString("utf-8"))}async function Nr(t){let e=g();await y.promises.mkdir(e,{recursive:!0});for(let n of Yt){let r=P.join(e,n);await y.promises.rm(r,{force:!0}),await y.promises.rename(P.join(t,n),r)}await Cr(e),await y.promises.rm(C(),{recursive:!0,force:!0})}function un(t){let e=jt();if(!e)return!1;try{let n=cn(e);return n.indexVersion===H&&n.docsZipSha256===t&&n.segmentCount>0}catch{return!1}}async function ln(t){await st({mode:"write"});let e=jt();if(!e)throw new Error("index.zip not found");let n=cn(e);if(n.docsZipSha256!==t)throw new Error("Bundled index.zip does not match docs.zip. Rebuild index.zip with npm run build:index.");if(n.segmentCount<=0)throw new Error("Bundled index.zip is empty");let r=C();await y.promises.rm(r,{recursive:!0,force:!0}),await y.promises.mkdir(r,{recursive:!0});let o=new an(e);for(let s of Yt){let a=o.getEntry(s);if(!a)throw new Error(`index.zip is missing ${s}`);await y.promises.writeFile(P.join(r,s),a.getData())}let i=JSON.parse(await y.promises.readFile(P.join(r,"build-meta.json"),"utf-8"));if(!y.existsSync(P.join(r,"search.db")))throw new Error("index.zip is missing search.db");return await Nr(r),await y.promises.mkdir(Z(),{recursive:!0}),await Rr(Z()),i}async function dn(){await y.promises.rm(C(),{recursive:!0,force:!0});let t=g();for(let e of Yt)await y.promises.rm(P.join(t,e),{force:!0})}import{createHash as mn}from"crypto";import*as fn from"fs";async function ht(t){return new Promise((e,n)=>{let r=mn("sha256"),o=fn.createReadStream(t);o.on("data",i=>r.update(i)),o.on("error",n),o.on("end",()=>e(r.digest("hex")))})}function pn(t){return mn("sha256").update(t,"utf8").digest("hex")}function gn(t,e){let n=e?on(t,e):X(t);return pn(n)}function St(t){return gn("harmonyos-synonyms.json",t)}function yt(t){return gn("harmonyos-terms.txt",t)}var Pr={state:"idle",phase:0,phaseLabel:"Idle",current:0,total:0,message:"",startedAt:0,updatedAt:0,error:null};async function hn(){try{let t=await A.promises.readFile(et(),"utf-8");return JSON.parse(t)}catch{return{...Pr}}}async function Vt(t){let e=et();await A.promises.mkdir(at.dirname(e),{recursive:!0}),await A.promises.writeFile(e,JSON.stringify(t,null,2))}function Sn(t){let e=Date.now();return{state:"extracting",phase:1,phaseLabel:"Extracting documentation",current:0,total:0,message:t,startedAt:e,updatedAt:e,error:null}}async function B(t){let n={...await hn(),...t,updatedAt:Date.now()};return await Vt(n),n}async function Kt(){let t=v();return t?ht(t):null}async function te(){try{let t=await A.promises.readFile($(),"utf-8");return JSON.parse(t)}catch{return null}}async function ee(t=!1){if(t)return"no-index";let e=await te();if(!e||e.segmentCount===0)return"no-index";let n=await Kt();return n&&e.docsZipSha256!==n?"docs-changed":e.indexVersion!==H?"engine-upgraded":e.termsHash!==yt()?"terms-changed":e.synonymsHash!==St()?"synonyms-changed":null}function ne(){if(!Xt()||!A.existsSync(G())||!A.existsSync($()))return!1;let t=at.dirname(G());if(!N.every(e=>A.existsSync(at.join(t,e))))return!1;try{let e=A.readFileSync($(),"utf-8");return JSON.parse(e).segmentCount>0}catch{return!1}}async function yn(t=!1){return t?!0:Xt()?ne()?await ee()!==null:!0:!1}import*as x from"fs";import*as mr from"os";import*as _ from"path";var xn=new Set(["picker","dialog","sheet","panel","popup","menu","layout","view","gesture","animation","transition","recognizer","manager","kit"]);var En=new Set(["a","an","and","api","app","application","arkts","arkui","for","get","harmonyos","how","in","oh","ohos","on","or","set","the","to","use","using","what","when","where","which","with","without","data","file","main","model","name","network","stage","system","type","user"]),_n=new Set(["ability","extension","module","service","context","options","config","info","event","code","state","type","data","request","response","client","server","handler","helper","utils","factory","builder","listener","callback","observer","provider","consumer","delegate","adapter","driver","buffer","stream","channel","session","task","worker","controller","component","container","attribute","descriptor","modifier","validator","parser","formatter","encoder","decoder","filter","converter","generator","iterator","dispatcher","resolver","scanner","tracker","monitor","scheduler","renderer","loader","subscriber","proxy","button","surface","stack","heap","map","set","array","list"]);var Or=/@ohos\.[a-z][a-zA-Z0-9.]+/gi,Lr=/\b[a-z][a-z0-9]*[A-Z][a-zA-Z0-9]+\b/g,Br=/[A-Z][a-zA-Z0-9]{2,}/g,Mr=/@[A-Z][a-zA-Z0-9]*/g,kr=/[a-z][a-zA-Z0-9]*\.[a-zA-Z][a-zA-Z0-9]+/g,bn=6,vr=/^[a-z][a-z0-9]{2,}$/,Fr=/^([a-z][a-z0-9]{2,})\s+([a-z][a-z0-9]{2,})$/,zr=/^@ohos\.[a-z][a-zA-Z0-9.]+$/i,Hr=/^[a-z][a-z0-9]*[A-Z][a-zA-Z0-9]+$/,jr=/^[A-Z][a-zA-Z0-9]+$/;function re(t){return zr.test(t)}function Ur(t){return Hr.test(t)&&t.length>=bn}function Zr(t){return jr.test(t)}function oe(t){return re(t)||Ur(t)||Zr(t)}function $r(t){let e=t.trim().toLowerCase();return _n.has(e)?!1:xn.has(e)}function Gr(t,e){let n=e.trim().charAt(0).toUpperCase(),r=e.trim().slice(1).toLowerCase();return`${t.trim().toLowerCase()}${n}${r}`}function xt(t){let n=t.replace(/^@ohos\./i,"").split(".").filter(Boolean);return n[n.length-1]?.trim()||void 0}function ie(t){return[...t.matchAll(Or)].map(e=>e[0])}function se(t,e=bn){let n=[];for(let r of t.matchAll(Lr))r[0].length>=e&&n.push(r[0]);return n}function W(t){return t.filter(e=>{let n=e.toLowerCase();return!t.some(r=>{if(r===e)return!1;let o=r.toLowerCase();return o.length>n.length&&o.endsWith(n)&&n.length>=4})})}function D(t,e){let n=e.trim();if(!n)return;t.add(n);let r=n.toLowerCase();r!==n&&t.add(r)}function Xr(t){let e=new Set;D(e,t);let n=xt(t);return n&&D(e,n),W([...e])}function ae(t){if(re(t))return Xr(t);let e=new Set;return D(e,t),W([...e])}function ce(t){let e=t.trim();if(/[A-Z]/.test(e))return null;let n=e.match(Fr);if(!n)return null;let r=n[1].toLowerCase(),o=n[2].toLowerCase();if(!vr.test(r)||En.has(r)||!$r(o))return null;let i=Gr(r,o);return{first:r,second:o,camelCase:i,lower:i.toLowerCase()}}function wn(t){let e=ce(t.trim());return!e||e.second!=="manager"?null:e}function ue(t,e,n){let r=n.toLowerCase(),o=new RegExp(`@ohos\\.[^\\s(]*${n}`,"i");for(let i of[t,e])if(i&&(i.toLowerCase().includes(r)||o.test(i)))return!0;return!1}function An(t){let e=t.trim();if(oe(e))return ae(e);let n=new Set;for(let r of ie(t)){D(n,r);let o=xt(r);o&&D(n,o)}for(let r of se(t))D(n,r);for(let r of t.matchAll(Mr))n.add(r[0]);for(let r of t.matchAll(kr))n.add(r[0]);for(let r of t.matchAll(Br))r[0].length>=4&&n.add(r[0]);return W([...n])}function Dn(t){let e=t.trim();if(oe(e))return ae(e);let n=new Set,r=ce(e);r&&D(n,r.camelCase);for(let o of An(e))n.add(o);for(let o of e.matchAll(/\b[a-z][a-zA-Z0-9]{3,}\b/g)){let i=o[0];i!==i.toLowerCase()&&n.add(i)}return W([...n])}var I={pureApiSymbol:/^[A-Z][a-zA-Z0-9]+$/,stageModelExact:/^Stage\s*模型$/i,stageModelEnglishExact:/^stage\s+model$/i,stageModel:/Stage\s*模型/i,stageModelEntryPage:/Stage\s*模型.*EntryAbility.*(页面|新页面)/,declarePermissionBoost:/声明.*权限|应用权限.*声明|如何声明应用权限/,declarePermissionCatalog:/如何声明应用权限/,declarePermissionTokens:/如何声明应用权限|声明应用权限/,uiAbilityLifecycleBoost:/UIAbility.*生命周期|生命周期.*UIAbility|UIAblity/i,uiAbilityLifecycleCatalog:/UIAblity.*生命周期|UIAbility.*生命周期/i,entryAbilityPage:/EntryAbility.*(页面|启动|跳转|新页面)/,stateDecoratorBoost:/@State|@Prop|@Link|@Provide|@Consume/,stateDecoratorCatalog:/@State\s*装饰器|@Prop\s*装饰器|@Link\s*装饰器/,stateManagement:/状态管理原理/,routerRoute:/Router\s+路由/,dialogPopupExact:/^Dialog\s+弹窗$/,dialogPopupBoost:/Dialog\s+弹窗/};function Tn(t){return I.pureApiSymbol.test(t.trim())}function In(t){let e=t.trim();return I.stageModelExact.test(e)||I.stageModelEnglishExact.test(e)}var Wr=[{matches:t=>I.uiAbilityLifecycleBoost.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.85},{catalog:"harmonyos-references",multiplier:.65},{catalog:"harmonyos-faqs",multiplier:.82}]},{matches:t=>In(t),weights:[{catalog:"harmonyos-guides",multiplier:1.85},{catalog:"harmonyos-references",multiplier:.55},{catalog:"harmonyos-faqs",multiplier:.85}]},{matches:t=>!In(t)&&I.stageModel.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.65},{catalog:"harmonyos-references",multiplier:.65}]},{matches:t=>I.entryAbilityPage.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.75},{catalog:"harmonyos-references",multiplier:.48}]},{matches:t=>I.declarePermissionBoost.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.65},{catalog:"best-practices",multiplier:.68}]},{matches:t=>I.stateDecoratorBoost.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.75},{catalog:"harmonyos-references",multiplier:.42}]},{matches:t=>I.stateManagement.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.6},{catalog:"best-practices",multiplier:.78}]},{matches:t=>I.routerRoute.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.65},{catalog:"harmonyos-references",multiplier:1.4},{catalog:"harmonyos-faqs",multiplier:.72},{catalog:"best-practices",multiplier:.72}]},{matches:t=>I.dialogPopupBoost.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.65},{catalog:"harmonyos-faqs",multiplier:.72},{catalog:"best-practices",multiplier:.72}]}];function Qr(t,e){for(let{catalog:n,multiplier:r}of e){let o=O[n];t.set(o,(t.get(o)??1)*r)}}function Cn(t,e){for(let n of Wr)n.matches(t)&&Qr(e,n.weights)}import*as Rn from"os";function le(){return qr().toLowerCase().includes("openharmony")}function qr(){return Rn.platform()}import*as Q from"fs";import*as Pn from"path";function z(t){process.env.DEVECO_CLI_DEBUG&&process.stderr.write(`[DEBUG] ${t}
2
+ `)}var Et=null,de=null,me=null;function Jr(){return Q.existsSync(rt())}function Yr(t){let e=rt(),n={backend:"jieba-wasm",reason:"native-jieba-load-failed",message:t,createdAt:new Date().toISOString()};Q.mkdirSync(Pn.dirname(e),{recursive:!0}),it(e),Q.writeFileSync(e,JSON.stringify(n,null,2))}function Vr(){if(Et)return Et;let t=X("harmonyos-stopwords.txt");return Et=new Set(t.split(`
2
3
  `).map(e=>e.trim()).filter(Boolean)),Et}function Kr(t){let e=[];for(let n=0;n<t.length;n++){let r=t[n]?.trim();if(!r)continue;let o=t[n+1]?.trim();if(r==="@"&&o&&/^[A-Z][a-zA-Z0-9]*$/.test(o)){e.push(`@${o}`),n+=1;continue}e.push(r)}return e}function to(t){let e=Vr(),n=[];for(let r of Kr(t)){let o=r.trim();!o||e.has(o)||(n.push(o.toLowerCase()),/[A-Z]/.test(o)&&/[a-zA-Z]/.test(o)&&n.push(o))}return n}async function On(t){let{dict:e}=await import("@node-rs/jieba/dict.js"),n=t.withDict(e),r=X("harmonyos-terms.txt");return n.loadDict(Buffer.from(r,"utf-8")),n}async function eo(){let{Jieba:t}=await import("@node-rs/jieba");return On(t)}async function Nn(){let{Jieba:t}=await import("@node-rs/jieba-wasm32-wasi");return On(t)}async function no(){let t=await import("jieba-wasm"),e=X("harmonyos-terms.txt");return t.with_dict(e),{cut:t.cut,cutForSearch:t.cut_for_search}}async function ro(){if(le())return no();if(Jr())return Nn();try{let e=await eo();return z("doc-index: using @node-rs/jieba backend"),e}catch(e){let n=e instanceof Error?e.message:String(e);Yr(n),z(`doc-index: @node-rs/jieba unavailable (${n}); falling back to wasm32-wasi`)}let t=await Nn();return z("doc-index: using @node-rs/jieba-wasm32-wasi backend"),t}async function q(){return de||(me||(me=ro().then(t=>(de=t,t))),me)}async function oo(t){let e=await q();return to(e.cutForSearch(t,!0))}async function _t(t,e){let n=t.trim();if(!n||e<=0)return"";let r=(await oo(n)).join(" ");return r.length<=e?r:r.slice(0,e)}async function io(t,e){let n=[];for(let o of t){let i=o.trim();i&&(n.push(i.toLowerCase()),/[A-Z]/.test(i)&&n.push(i))}let r=[...new Set(n)].join(" ");return r.length<=e?r:r.slice(0,e)}async function bt(t){let e=!!t.sectionTitle.trim(),n=t.titleTokens.trim(),r=e?ke:Pe,o=e?Fe:Le,i=e?await io(t.apiSymbols,o):await _t(t.apiSymbols.join(" "),o),a=(await Promise.all([_t(n,e?ve:Oe),Promise.resolve(i),_t(t.headingsText,e?ze:Be),_t(t.bodySample,e?He:Me)])).filter(Boolean).join(" ");return a.length<=r?a:a.slice(0,r)}var Ln=["harmonyos-releases","harmonyos-roadmap"],so=new Set(Ln.map(t=>O[t])),ja=Ln.map(t=>`${dt[t]}/`);function ao(t){return so.has(t)}function Bn(t){let e=[],n=[];for(let r of t)ao(r.catalog_id)?n.push(r):e.push(r);return[...e,...n]}var co=[{pattern:/@ohos\./i,catalog:"harmonyos-references",multiplier:1.5},{pattern:/@[A-Z][a-zA-Z]+/,catalog:"harmonyos-guides",multiplier:1.35},{pattern:/(如何|怎么|怎样|步骤)/,catalog:"harmonyos-guides",multiplier:1.45},{pattern:/(生命周期|原理|概述|什么是|模型|介绍)/,catalog:"harmonyos-guides",multiplier:1.35},{pattern:/(报错|失败|错误|异常|排查)/,catalog:"harmonyos-guides",multiplier:1.25},{pattern:/(报错|失败|FAQ)/i,catalog:"harmonyos-faqs",multiplier:1.2},{pattern:/(构建|签名|打包|发布|上架|应用市场|hvigor|ohpm)/i,catalog:"harmonyos-guides",multiplier:1.3},{pattern:/(行为变更|changelog|升级|适配|版本说明)/i,catalog:"harmonyos-releases",multiplier:1.3},{pattern:/(路由|弹窗|手势|页面|权限|装饰器)/,catalog:"harmonyos-guides",multiplier:1.25,skipForPureApiSymbol:!0}];function ct(t,e,n){let r=O[e];t.set(r,(t.get(r)??1)*n)}function uo(t,e){let n=t.trim(),r=/[\u4e00-\u9fff]/.test(n),o=/\b[A-Z][a-zA-Z0-9]{2,}\b/.test(n),i=/\b[a-z][a-zA-Z0-9]{3,}\b/.test(n);if(r&&(o||i)){ct(e,"harmonyos-guides",1.45),ct(e,"harmonyos-references",1.35);return}(o||i)&&ct(e,"harmonyos-references",1.55),/\b[A-Z][a-zA-Z]*(Gesture|Dialog|Sheet|Transition|Recognizer)\b/.test(n)&&ct(e,"harmonyos-references",1.75)}function Mn(t){let e=new Map,n=t.trim();if(!n)return e;let r=Tn(n);uo(n,e),Cn(n,e);for(let o of co)o.pattern.test(n)&&(o.skipForPureApiSymbol&&r||ct(e,o.catalog,o.multiplier));return e}import*as Y from"fs";import*as Zn from"path";var lo=[" ","\u3002","\uFF0C","\uFF1B","\u3001",".","!","?"];function kn(t,e){let n=-1;for(let r of lo){let o=t.lastIndexOf(r);o>n&&(n=o)}return n>=e?n:-1}function vn(t,e){let n=t.trim();if(n.length<=e)return{text:n,excerptTruncated:!1};let r=n.slice(0,e),o=kn(r,e-20),i=o>=0?o:e;return{text:n.slice(0,i).trimEnd(),excerptTruncated:!0}}function Fn(t,e,n={}){let{maxLen:r=Ze,contextChars:o=$e,excerptTruncated:i=!1}=n,s=t.replace(/\s+/g," ").trim();if(!s)return"";if(s.length<=r)return i?`${s}...`:s;let a=e.split(/\s+/).map(Lt=>Lt.trim()).filter(Boolean),c=0;for(let Lt of a){let we=s.toLowerCase().indexOf(Lt.toLowerCase());if(we>=0){c=we;break}}let f=Math.max(0,c-o),p=Math.min(s.length,f+r),d=s.slice(f,p),b=kn(d,r-25);b>=0&&(p=f+b);let S=s.slice(f,p).trim(),w=f>0?"...":"",yr=p<s.length||i?"...":"";return`${w}${S}${yr}`}var mo=`
3
4
  SELECT d.document_id, d.doc_title, s.section_title, s.lead_text, s.excerpt_truncated,
4
5
  d.catalog_id, bm25(segments_fts) AS bm25
package/index.zip CHANGED
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deveco-test/hmos-deveco-cli",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "HarmonyOS application development command line tool",
5
5
  "license": "MIT",
6
6
  "type": "module",