@deveco-test/hmos-deveco-cli 0.2.1 → 0.3.0-TD.1.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.
- package/README.md +68 -1
- package/SKILL.md +51 -1
- package/THIRD-PARTY-LICENSES +536 -4
- package/dist/cli.js +161 -100
- package/dist/internal/doc-init-background.js +8 -8
- package/index.zip +0 -0
- package/package.json +9 -2
- package/scripts/install-jieba-wasm.mjs +47 -0
- package/scripts/lib/jieba-wasm-vendor.mjs +102 -0
- package/scripts/postinstall.mjs +9 -0
- package/src/resources/aclPermission/aclPermissionsInfo.json +311 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import*as h from"fs";import*as H from"path";import ei from"adm-zip";import ni from"proper-lockfile";import ri from"ora";import*as b from"fs";import*as j from"path";var ht=["harmonyos-guides","harmonyos-references","best-practices","harmonyos-faqs","harmonyos-releases","harmonyos-roadmap"],G={"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 X="1.9.1",xi=48*1024*1024,te=280,ee=6,ne=100,re=3,oe=28,St=10,ie=/API参考|APIReference/i;var se=6,W=700,yt=250,xt=400,ae=1320,ce=120,ue=450,le=250,de=500,me=480,fe=80,pe=200,ge=60,he=200,Se=40,ye=200,xe=200,_e=40,B=500,Ee=Object.fromEntries(ht.map((t,e)=>[G[t],e])),w=Object.fromEntries(ht.map((t,e)=>[t,e]));import*as be from"fs";import*as m from"path";import{fileURLToPath as Te}from"url";import*as Q from"path";import{homedir as Zn}from"os";var Un="deveco-cli";function $n(t){let e=t.trim();return(e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'"))&&(e=e.slice(1,-1).trim()),e}function Ae(){return Q.join(Zn(),".local","share",Un)}function _t(){let t=process.env.DEVECO_CLI_DATA_DIR;if(t===void 0||t==="")return Ae();let e=$n(t);return e?Q.resolve(e):Ae()}var Gn="docs";function q(){return m.join(_t(),Gn)}function x(){return m.join(q(),".index")}function Ie(){return m.join(x(),"build.lock")}function Et(){return m.join(x(),"build-status.json")}function Y(){return m.join(x(),"build-meta.json")}function V(){return m.join(x(),"search.db")}function M(){return m.join(x(),".tmp")}function Xn(){return m.join(_t(),"logs")}function At(){return m.join(Xn(),"doc-init.log")}function Wn(t,e){let n=e;for(;!n.endsWith(`${m.sep}dist`)&&n!==m.dirname(n);)n=m.dirname(n);return n}function De(t,e){return m.dirname(Wn(t,e))}function Qn(){let t=Te(import.meta.url),e=m.dirname(t);return t.includes(`${m.sep}dist${m.sep}`)?De(t,e):m.join(e,"..","..","..")}function qn(...t){let e=Te(import.meta.url),n=m.dirname(e);return e.includes(`${m.sep}dist${m.sep}`)?[m.join(De(e,n),...t)]:[m.join(n,"..","..","..",...t)]}function we(...t){for(let e of qn(...t))if(be.existsSync(e))return e;return null}function O(){return we("docs.zip")}function bt(){return we("index.zip")}function Ce(){return m.join(Qn(),"index","data")}import*as D from"fs";import*as L from"path";var P=["harmonyos-terms.txt","harmonyos-synonyms.json","harmonyos-stopwords.txt"],Tt=class extends Error{constructor(e){super(e),this.name="LexiconNotFoundError"}};var It=null;function Dt(t){It=t}function Re(){if(It)return It;let t=x();if(P.every(o=>D.existsSync(L.join(t,o))))return t;let n=Ce();if(P.every(o=>D.existsSync(L.join(n,o))))return n;throw new Tt("Lexicon files not found. Install the documentation index first (index.zip).")}function k(t){let e=L.join(Re(),t);return D.readFileSync(e,"utf-8")}function Ne(t,e){return D.readFileSync(L.join(e,t),"utf-8")}async function Oe(t,e=Re()){await D.promises.mkdir(t,{recursive:!0});for(let n of P){let r=L.join(e,n),o=L.join(t,n);await D.promises.copyFile(r,o)}}import*as wt from"fs";import*as Yn from"yauzl";function Ct(){let t=O();return t!==null&&wt.existsSync(t)}import*as S from"fs";import*as C from"path";import Le from"adm-zip";var Pe=["search.db","build-meta.json",...P],Vn=["corpus.json","corpus-offsets.json","orama.dpack"];async function Kn(t){for(let e of Vn)await S.promises.rm(C.join(t,e),{force:!0})}async function Jn(t){let e=await S.promises.readdir(t,{withFileTypes:!0});for(let n of e)n.name!==".index"&&await S.promises.rm(C.join(t,n.name),{recursive:!0,force:!0})}function tr(t){let n=new Le(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 er(t){let e=x();await S.promises.mkdir(e,{recursive:!0});for(let n of Pe){let r=C.join(e,n);await S.promises.rm(r,{force:!0}),await S.promises.rename(C.join(t,n),r)}await Kn(e),await S.promises.rm(M(),{recursive:!0,force:!0})}function Rt(){let t=bt();return t!==null&&S.existsSync(t)}async function Be(t){let e=bt();if(!e)throw new Error("index.zip not found");let n=tr(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=M();await S.promises.rm(r,{recursive:!0,force:!0}),await S.promises.mkdir(r,{recursive:!0});let o=new Le(e);for(let s of Pe){let a=o.getEntry(s);if(!a)throw new Error(`index.zip is missing ${s}`);await S.promises.writeFile(C.join(r,s),a.getData())}let i=JSON.parse(await S.promises.readFile(C.join(r,"build-meta.json"),"utf-8"));if(!S.existsSync(C.join(r,"search.db")))throw new Error("index.zip is missing search.db");return await er(r),await S.promises.mkdir(q(),{recursive:!0}),await Jn(q()),i}import{createHash as Me}from"crypto";import*as ke from"fs";async function K(t){return new Promise((e,n)=>{let r=Me("sha256"),o=ke.createReadStream(t);o.on("data",i=>r.update(i)),o.on("error",n),o.on("end",()=>e(r.digest("hex")))})}function Fe(t){return Me("sha256").update(t,"utf8").digest("hex")}function ve(t,e){let n=e?Ne(t,e):k(t);return Fe(n)}function J(t){return ve("harmonyos-synonyms.json",t)}function tt(t){return ve("harmonyos-terms.txt",t)}var nr={state:"idle",phase:0,phaseLabel:"Idle",current:0,total:0,message:"",startedAt:0,updatedAt:0,error:null};async function ze(){try{let t=await b.promises.readFile(Et(),"utf-8");return JSON.parse(t)}catch{return{...nr}}}async function Nt(t){let e=Et();await b.promises.mkdir(j.dirname(e),{recursive:!0}),await b.promises.writeFile(e,JSON.stringify(t,null,2))}function He(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 R(t){let n={...await ze(),...t,updatedAt:Date.now()};return await Nt(n),n}async function Ot(){let t=O();return t?K(t):null}async function Lt(){try{let t=await b.promises.readFile(Y(),"utf-8");return JSON.parse(t)}catch{return null}}async function Pt(t=!1){if(t)return"no-index";let e=await Lt();if(!e||e.segmentCount===0)return"no-index";let n=await Ot();return n&&e.docsZipSha256!==n?"docs-changed":e.indexVersion!==X?"engine-upgraded":e.termsHash!==tt()?"terms-changed":e.synonymsHash!==J()?"synonyms-changed":null}function Bt(){if(!Ct()||!b.existsSync(V())||!b.existsSync(Y()))return!1;let t=j.dirname(V());if(!P.every(e=>b.existsSync(j.join(t,e))))return!1;try{let e=b.readFileSync(Y(),"utf-8");return JSON.parse(e).segmentCount>0}catch{return!1}}async function je(t=!1){return t?!0:Ct()?Bt()?await Pt()!==null:!0:!1}import*as y from"fs";import*as kn from"os";import*as _ from"path";var Ze=new Set(["picker","dialog","sheet","panel","popup","menu","layout","view","gesture","animation","transition","recognizer","manager","kit"]);var Ue=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"]),$e=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 rr=/@ohos\.[a-z][a-zA-Z0-9.]+/gi,or=/\b[a-z][a-z0-9]*[A-Z][a-zA-Z0-9]+\b/g,ir=/[A-Z][a-zA-Z0-9]{2,}/g,sr=/@[A-Z][a-zA-Z0-9]*/g,ar=/[a-z][a-zA-Z0-9]*\.[a-zA-Z][a-zA-Z0-9]+/g,Ge=6,cr=/^[a-z][a-z0-9]{2,}$/,ur=/^([a-z][a-z0-9]{2,})\s+([a-z][a-z0-9]{2,})$/,lr=/^@ohos\.[a-z][a-zA-Z0-9.]+$/i,dr=/^[a-z][a-z0-9]*[A-Z][a-zA-Z0-9]+$/,mr=/^[A-Z][a-zA-Z0-9]+$/;function Mt(t){return lr.test(t)}function fr(t){return dr.test(t)&&t.length>=Ge}function pr(t){return mr.test(t)}function kt(t){return Mt(t)||fr(t)||pr(t)}function gr(t){let e=t.trim().toLowerCase();return $e.has(e)?!1:Ze.has(e)}function hr(t,e){let n=e.trim().charAt(0).toUpperCase(),r=e.trim().slice(1).toLowerCase();return`${t.trim().toLowerCase()}${n}${r}`}function et(t){let n=t.replace(/^@ohos\./i,"").split(".").filter(Boolean);return n[n.length-1]?.trim()||void 0}function Ft(t){return[...t.matchAll(rr)].map(e=>e[0])}function vt(t,e=Ge){let n=[];for(let r of t.matchAll(or))r[0].length>=e&&n.push(r[0]);return n}function F(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 T(t,e){let n=e.trim();if(!n)return;t.add(n);let r=n.toLowerCase();r!==n&&t.add(r)}function Sr(t){let e=new Set;T(e,t);let n=et(t);return n&&T(e,n),F([...e])}function zt(t){if(Mt(t))return Sr(t);let e=new Set;return T(e,t),F([...e])}function Ht(t){let e=t.trim();if(/[A-Z]/.test(e))return null;let n=e.match(ur);if(!n)return null;let r=n[1].toLowerCase(),o=n[2].toLowerCase();if(!cr.test(r)||Ue.has(r)||!gr(o))return null;let i=hr(r,o);return{first:r,second:o,camelCase:i,lower:i.toLowerCase()}}function Xe(t){let e=Ht(t.trim());return!e||e.second!=="manager"?null:e}function jt(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 We(t){let e=t.trim();if(kt(e))return zt(e);let n=new Set;for(let r of Ft(t)){T(n,r);let o=et(r);o&&T(n,o)}for(let r of vt(t))T(n,r);for(let r of t.matchAll(sr))n.add(r[0]);for(let r of t.matchAll(ar))n.add(r[0]);for(let r of t.matchAll(ir))r[0].length>=4&&n.add(r[0]);return F([...n])}function Qe(t){let e=t.trim();if(kt(e))return zt(e);let n=new Set,r=Ht(e);r&&T(n,r.camelCase);for(let o of We(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 F([...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 Ye(t){return I.pureApiSymbol.test(t.trim())}function qe(t){let e=t.trim();return I.stageModelExact.test(e)||I.stageModelEnglishExact.test(e)}var yr=[{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=>qe(t),weights:[{catalog:"harmonyos-guides",multiplier:1.85},{catalog:"harmonyos-references",multiplier:.55},{catalog:"harmonyos-faqs",multiplier:.85}]},{matches:t=>!qe(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 xr(t,e){for(let{catalog:n,multiplier:r}of e){let o=w[n];t.set(o,(t.get(o)??1)*r)}}function Ve(t,e){for(let n of yr)n.matches(t)&&xr(e,n.weights)}import*as Ke from"os";function Zt(){return _r()==="openharmony"}function _r(){return Ke.platform()}var nt=null,tn=null,$t=null,Je=!1,Ut=null;function Er(){if(nt)return nt;let t=k("harmonyos-stopwords.txt");return nt=new Set(t.split(`
|
|
2
|
-
`).map(e=>e.trim()).filter(Boolean)),
|
|
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()==="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(`
|
|
2
|
+
`).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
3
|
SELECT d.document_id, d.doc_title, s.section_title, s.lead_text, s.excerpt_truncated,
|
|
4
4
|
d.catalog_id, bm25(segments_fts) AS bm25
|
|
5
5
|
FROM segments_fts
|
|
@@ -8,7 +8,7 @@ import*as h from"fs";import*as H from"path";import ei from"adm-zip";import ni fr
|
|
|
8
8
|
WHERE segments_fts MATCH ?
|
|
9
9
|
ORDER BY bm25(segments_fts)
|
|
10
10
|
LIMIT ?
|
|
11
|
-
`,
|
|
11
|
+
`,fo=`
|
|
12
12
|
SELECT d.document_id, d.doc_title, s.section_title, s.lead_text, s.excerpt_truncated,
|
|
13
13
|
d.catalog_id, bm25(segments_fts) AS bm25
|
|
14
14
|
FROM segments_fts
|
|
@@ -17,7 +17,7 @@ import*as h from"fs";import*as H from"path";import ei from"adm-zip";import ni fr
|
|
|
17
17
|
WHERE segments_fts MATCH ? AND d.catalog_id = ?
|
|
18
18
|
ORDER BY bm25(segments_fts)
|
|
19
19
|
LIMIT ?
|
|
20
|
-
`,
|
|
20
|
+
`,po=3.5,go=1.4,ho=4,So=1.8,yo=1.35,xo=3.5,Eo=1.8,_o=120,zn=6;function pe(t){return t.toLowerCase().replace(/[^\p{L}\p{N}@.]+/gu,"")}function bo(t){return t.split(/[^\p{L}\p{N}@.]+/u).map(pe).filter(e=>e.length>=2)}function wo(t,e){return e.length>1&&e.every(n=>t.includes(n))}function Ao(t){return/^[a-z0-9]{1,4}$/.test(t.trim().toLowerCase())}function Do(t,e){return t===e?xo:t.startsWith(e)||t.includes(`@ohos.${e}`)?Eo:1}function Io(t,e){let n=pe(e);if(n.length<2)return 1;let r=pe(t.doc_title);if(Ao(e))return Do(r,n);if(r.includes(n))return ho;if(n.length>=zn&&r.includes(n.slice(0,zn)))return So;let o=bo(e);return wo(r,o)?yo:1}function To(t,e){return e<=1?t:t<0?t*e:t/e}function wt(t,e,n,r){let o=t.bm25/(e.get(t.catalog_id)??1);return o=To(o,Io(t,n)),r&&ue(t.doc_title,t.section_title,r)&&(o/=po,t.catalog_id===O["harmonyos-references"]&&(o/=go)),o}function fe(t,e,n,r){return t.reduce((o,i)=>wt(i,e,n,r)<wt(o,e,n,r)?i:o)}function Co(t,e){return e.some(n=>t.section_title.includes(n)||t.doc_title.includes(n))}function Ro(t,e,n,r,o){if(o){let i=t.filter(s=>ue(s.doc_title,s.section_title,o));if(i.length>0)return fe(i,n,r,o)}if(e.length>0){let i=t.filter(s=>Co(s,e));if(i.length>0)return fe(i,n,r,o)}return fe(t,n,r,o)}function Hn(t,e,n,r,o){let i=Mn(e),s=Dn(e),c=wn(e)?.camelCase,f=new Map;for(let S of t){let w=f.get(S.document_id)??[];w.push(S),f.set(S.document_id,w)}let p=[];for(let S of f.values())p.push(Ro(S,s,i,n,c));let d=p.sort((S,w)=>wt(S,i,n,c)-wt(w,i,n,c));return(o?Bn(d):d).slice(0,r)}function At(t,e,n,r,o,i){let s=e?O[e]:void 0,a=Math.max(n,n*Ne,_o),c=s===void 0?t.all(mo,r,a):t.all(fo,r,s,a);return(s===void 0?Hn(c,i,o,n,!0):Hn(c,i,o,n,!1)).map(p=>({title:p.doc_title,documentId:p.document_id,sectionTitle:p.section_title||void 0,snippet:Fn(p.lead_text,o,{excerptTruncated:!!p.excerpt_truncated})}))}var Dt=`
|
|
21
21
|
CREATE TABLE documents (
|
|
22
22
|
id INTEGER PRIMARY KEY,
|
|
23
23
|
document_id TEXT NOT NULL UNIQUE,
|
|
@@ -55,11 +55,11 @@ CREATE TRIGGER segments_au AFTER UPDATE ON segments BEGIN
|
|
|
55
55
|
END;
|
|
56
56
|
|
|
57
57
|
CREATE INDEX segments_doc_id_idx ON segments(doc_id);
|
|
58
|
-
`;var
|
|
58
|
+
`;var J=null,ge=null;function No(){J?.close(),J=null,ge=null}function Po(t,e){if(J&&ge===e)return J;J?.close();let n=new t(e,{readonly:!0,fileMustExist:!0});return J=n,ge=e,n.pragma("mmap_size = 268435456"),n.pragma("cache_size = -8000"),n.pragma("query_only = ON"),n}function Oo(t,e){let n=new t(e);return n.pragma("journal_mode = OFF"),n.pragma("synchronous = OFF"),n.pragma("temp_store = MEMORY"),n.exec(Dt),n}function Lo(t,e,n){let r=e.get(n.documentId);if(r!==void 0)return r;let i=t.prepare("SELECT id FROM documents WHERE document_id = ?").get(n.documentId);if(i)return e.set(n.documentId,i.id),i.id;let a=t.prepare(`
|
|
59
59
|
INSERT INTO documents(document_id, catalog_id, doc_title)
|
|
60
60
|
VALUES (?, ?, ?)
|
|
61
|
-
`).run(n.documentId,n.catalogId,n.docTitle),c=Number(a.lastInsertRowid);return e.set(n.documentId,c),c}async function
|
|
61
|
+
`).run(n.documentId,n.catalogId,n.docTitle),c=Number(a.lastInsertRowid);return e.set(n.documentId,c),c}async function Bo(t,e,n,r){await q();let o=Oo(t,e),i=new Map,s=o.prepare(`
|
|
62
62
|
INSERT INTO segments(doc_id, section_title, lead_text, search_text, excerpt_truncated)
|
|
63
63
|
VALUES (?, ?, ?, ?, ?)
|
|
64
|
-
`),a=n.length;for(let c=0;c<a;c+=B){let f=n.slice(c,c+B),p=await Promise.all(f.map(async E=>({source:E,searchText:await ot(E)})));o.transaction(E=>{for(let g of E){let A=to(o,i,g.source);s.run(A,g.source.sectionTitle,g.source.leadText,g.searchText,g.source.excerptTruncated?1:0)}})(p),await r?.(Math.min(c+f.length,a),a)}o.exec("ANALYZE"),o.exec("VACUUM"),o.close()}function no(t,e,n,r,o,i,s){let a=Kr(t,e);return at({all(c,...f){return a.prepare(c).all(...f)}},n,r,o,i,s)}async function ln(){let e=(await import("better-sqlite3")).default;return{kind:"better-sqlite3",resetCache:Vr,buildSearchIndex:(n,r,o)=>eo(e,n,r,o),searchIndex:(n,r,o,i,s,a,c)=>Promise.resolve(no(e,i,r,o,s,a,c))}}import{readFile as ro,stat as oo,writeFile as io}from"fs/promises";var Qt=null,N=null;async function qt(){return Qt||(Qt=(async()=>{let t=(await import("@sqlite.org/sqlite-wasm")).default;return t()})()),Qt}function so(t){return{all(e,...n){let r=t.prepare(e);n.length>0&&r.bind(n);let o=[];for(;r.step();)o.push(r.get({}));return r.finalize(),o}}}async function ao(t){let e=await oo(t);if(N&&N.dbPath===t&&N.mtimeMs===e.mtimeMs)return N.db;N?.db.close();let n=await qt(),r=n.capi,o=n.wasm,i=new Uint8Array(await ro(t)),s=o.allocFromTypedArray(i),a=new n.oo1.DB(":memory:"),c=r.SQLITE_DESERIALIZE_READONLY|r.SQLITE_DESERIALIZE_RESIZEABLE|r.SQLITE_DESERIALIZE_FREEONCLOSE;return r.sqlite3_deserialize(a.pointer,"main",s,i.byteLength,i.byteLength,c),N={dbPath:t,mtimeMs:e.mtimeMs,db:a},a}function dn(){N?.db.close(),N=null}async function co(t,e,n,r){t.exec("BEGIN");for(let o of r){let i=n(o.source);e.bind([i,o.source.sectionTitle,o.source.leadText,o.searchText,o.source.excerptTruncated?1:0]),e.step(),e.reset()}t.exec("COMMIT")}function uo(t,e,n){return r=>{let o=e.get(r.documentId);if(o!==void 0)return o;let i=t.selectValue("SELECT id FROM documents WHERE document_id = ?",[r.documentId]);if(i!=null){let a=Number(i);return e.set(r.documentId,a),a}n.bind([r.documentId,r.catalogId,r.docTitle]),n.step(),n.reset();let s=Number(t.selectValue("SELECT last_insert_rowid()"));return e.set(r.documentId,s),s}}async function lo(t,e,n){await v();let r=await qt(),o=new r.oo1.DB(":memory:","c");o.exec(ct);let i=new Map,s=o.prepare("INSERT INTO documents(document_id, catalog_id, doc_title) VALUES (?, ?, ?)"),a=o.prepare("INSERT INTO segments(doc_id, section_title, lead_text, search_text, excerpt_truncated) VALUES (?, ?, ?, ?, ?)"),c=uo(o,i,s),f=e.length;for(let u=0;u<f;u+=B){let E=e.slice(u,u+B),g=await Promise.all(E.map(async A=>({source:A,searchText:await ot(A)})));await co(o,a,c,g),await n?.(Math.min(u+E.length,f),f)}o.exec("ANALYZE");let p=r.capi.sqlite3_js_db_export(o);await io(t,p),o.close(),dn()}async function mo(t,e,n,r,o,i){let s=await ao(t);return at(so(s),e,n,r,o,i)}async function mn(){return await qt(),{kind:"sqlite-wasm",resetCache:dn,buildSearchIndex:lo,searchIndex:(t,e,n,r,o,i,s)=>mo(r,e,n,o,i,s)}}var ut=null,Yt=null;async function fo(){try{let e=await ln();return it("doc-index: using better-sqlite3 SQLite backend"),e}catch(e){it(`doc-index: better-sqlite3 unavailable (${e.message}); falling back to sqlite-wasm`)}let t=await mn();return it("doc-index: using @sqlite.org/sqlite-wasm SQLite backend"),t}async function Vt(){return ut||(ut=fo().then(t=>(Yt=t,t))),ut}function fn(){Yt?.resetCache(),ut=null,Yt=null}function pn(){fn()}async function gn(t,e,n){await(await Vt()).buildSearchIndex(t,e,n)}import{unified as bn}from"unified";import Tn from"remark-parse";import In from"remark-gfm";import{toString as dt}from"mdast-util-to-string";var po=/^(.+?)(\d+\+)?(对象|枚举|错误码)说明$/,go=/^\[h2\]([A-Za-z][A-Za-z0-9]*)(\d+\+)?$/,ho=/^(.{2,20}?)\s*[((]([A-Za-z][a-zA-Z0-9]{1,40})[))]\s*$/,So=/^([A-Za-z@][A-Za-z0-9@]*?)(\d+\+)?$/,yo=/^(系统能力|元服务API|参数|返回值|说明|\*\*|表格|\|)/;function lt(t){let e=t.trim(),n=e.match(So);return n?n[1]:e}function xo(t){let e=t.match(po);if(!e)return;let n=lt(e[1].trim());return{displayTitle:t,symbolName:n,searchExtras:[n,e[3]]}}function _o(t){let e=lt(t.replace(/\([^)]*\)$/,""));if(/^[A-Z][A-Za-z0-9]*$/.test(e))return{displayTitle:t,symbolName:e,searchExtras:[e]};if(/^[A-Z][A-Za-z0-9]*(\([^)]*\))?$/.test(t))return{displayTitle:t,symbolName:e,searchExtras:[e]}}function U(t){let e=t.trim();return e?xo(e)??(()=>{let n=e.match(go);if(n){let r=n[1];return{displayTitle:e,symbolName:r,searchExtras:[r]}}})()??(()=>{let n=e.match(ho);if(!n)return;let r=n[1].trim(),o=n[2].trim();return{displayTitle:e,symbolName:o,searchExtras:[r,o]}})()??_o(e)??{displayTitle:e,searchExtras:[]}:{displayTitle:"",searchExtras:[]}}function Eo(t){if(t.length<2||t.length>36||yo.test(t))return!1;let e=[...t.replace(/\s/g,"")];return e.length===0?!1:e.filter(r=>new RegExp("\\p{Script=Han}","u").test(r)).length/e.length>=.4}function hn(t){for(let e of t){let n=e.trim().replace(/[。.!!??;;]+$/u,"").trim();if(Eo(n))return n}return""}function Sn(t,e,n){let r=[t,...n.searchExtras,e].filter(Boolean);return[...new Set(r)].join(" ")}var Ao=/[A-Z][a-zA-Z0-9]+(?:\.[a-zA-Z][a-zA-Z0-9]+)*/g,$=/@[A-Z][a-zA-Z]+/g,bo=/^[A-Z][A-Za-z0-9]*\.[A-Za-z][A-Za-z0-9]+/,To=/^[A-Z][A-Za-z0-9]+(?:\([^)]*\))?$/,Io=/^[a-z0-9]+(?:[-_][a-z0-9]+)+$/,Do=new Set(["API","Action","Code","Connect","Connection","Context","Direction","Element","Elements","Entry","Focused","Module","Modules","Name","Names","Stage","Type","Types","Value","Values","Rect","Error"]),wo=new Set(["HAP","HSP","HAR","NAPI","CAPI","NDK","ArkTS","ArkUI","OHPM"]),Co=new Set(["JSON","Object","Array","Promise","console","Math","Date","String","Number","Boolean","Error","Function","Map","Set","RegExp"]);function Dn(t,e){let n=new Set,r=[t,...e];for(let o of r){for(let i of Ft(o)){T(n,i);let s=et(i);s&&T(n,s)}for(let i of vt(o))T(n,i);for(let i of o.matchAll(Ao)){let s=i[0];Ro(s)&&n.add(s)}for(let i of o.matchAll($))n.add(i[0])}return F([...n])}function Ro(t){let e=t.trim();if(!e||$.test(e))return!!e;if(e.includes(".")){let n=e.split(".")[0]??"";return Co.has(n)?!1:/^[A-Z]/.test(n)}return Do.has(e)?!1:wo.has(e)?!0:e.length<=3?!1:/^[A-Z][a-z]+[A-Z]/.test(e)?!0:e.length>=6&&/^[A-Z][A-Za-z0-9]+$/.test(e)}function yn(t){let e=t.trim();return!!(!e||Io.test(e)||e.length>28&&!/[A-Z\u4e00-\u9fff]/.test(e)&&/^[a-z0-9_-]+$/.test(e))}function wn(t,e){let n=e.jsonTitle?.trim(),r=Po(t,"").trim(),o=e.fileName.trim();return n&&!yn(n)?n:r&&!yn(r)?r:n||r||o}function Cn(t){return bo.test(t.trim())}function Kt(t){let e=t.trim().replace(/\([^)]*\)$/,""),n=lt(e);return To.test(n)}function mt(t){let e=t.trim();return e?$.test(e)||Cn(e)||Kt(e)?!0:!!U(e).symbolName:!1}function No(t){let e=t.trim();return!(!e||Cn(e)||Kt(e))}function Oo(t){let e=new Set,n=[];for(let r of t){let o=r.trim();!No(o)||e.has(o)||(e.add(o),n.push(o))}return n}function xn(t){if(!t.includes("."))return 0;let e=t.split(".").pop()??"";return/^[a-z]/.test(e)?1:2}function Lo(t,e){let n=xn(t)-xn(e);return n!==0?n:t.localeCompare(e)}function Rn(t,e=[]){let n=[...new Set(e.map(i=>i.trim()).filter(Boolean))],r=new Set(n),o=[...new Set(t.map(i=>i.trim()).filter(Boolean))].filter(i=>!r.has(i));return o.sort(Lo),[...n,...o].slice(0,Se)}function ft(t){return t.replace(/\s+/g," ").trim()}function _n(t){return t.replace(/\\([\\`*_{}[\]()#+.!-])/g,"$1")}function Po(t,e=""){let n=t.split(/\r?\n/),r=0;for(;r<n.length&&!n[r].trim();)r+=1;if(r>=n.length)return e;let o=_n(n[r].trim()),i=o.match(/^#+\s+(.+)$/);if(i)return _n(i[1].trim());if(r+1<n.length){let s=n[r+1].trim();if(/^=+$/.test(s)||/^-+$/.test(s))return o}return o||e}function Nn(t){let e=ft(t.join(" "));if(e.length<=W)return e;let n=e.slice(0,W);return e.length<=W+yt?n:`${n} ${e.slice(-yt)}`}function Bo(t){let e=Oo(t).join(" ");return e.length<=xt?e:e.slice(0,xt)}function On(t){let e=ft(t),{text:n,excerptTruncated:r}=sn(e,ye);return{leadText:n,excerptTruncated:r}}function Mo(t,e){let{leadText:n,excerptTruncated:r}=On(t);return{leadText:n,excerptTruncated:r||!!e.trim()}}function Ln(t,e){if(t.type==="code"){e.codeBlocks.push(t.value??"");return}if("children"in t&&Array.isArray(t.children)){for(let r of t.children)Ln(r,e);return}let n=ft(dt(t));n&&e.bodyParts.push(n)}function ko(t){let e=bn().use(Tn).use(In).parse(t),n=[],r=null,o=()=>{r&&((r.sectionTitle||r.bodyParts.length||r.codeBlocks.length)&&n.push(r),r=null)},i=()=>{r||(r={sectionTitle:"",bodyParts:[],codeBlocks:[]})};for(let s of e.children){if(s.type==="heading"){let a=s,c=dt(a).trim();if(a.depth>=4&&c&&mt(c)){o(),r={sectionTitle:c,bodyParts:[],codeBlocks:[]};continue}i(),c&&r.bodyParts.push(c);continue}i(),Ln(s,r)}return o(),n.length===0?[{sectionTitle:"",bodyParts:[],codeBlocks:[]}]:n}function Fo(t){return ie.test(t)}function vo(t){return t.filter(e=>e.sectionTitle&&mt(e.sectionTitle)).length}function zo(t){return{sectionTitle:t.map(e=>e.sectionTitle.trim()).join(" | "),bodyParts:t.flatMap(e=>e.bodyParts).slice(0,40),codeBlocks:t.flatMap(e=>e.codeBlocks).slice(0,8)}}function En(t){let e=t.trim();return!e||$.test(e)?$.test(e):/对象说明$|枚举说明$/.test(e)?!0:Kt(e)}function Ho(t){let e=t.filter(u=>!u.sectionTitle||!mt(u.sectionTitle)),n=t.filter(u=>u.sectionTitle&&mt(u.sectionTitle)),r=n.filter(u=>En(u.sectionTitle)),o=n.filter(u=>!En(u.sectionTitle)),i=Math.max(0,oe-r.length),s=o.slice(0,i),a=o.slice(i),c=a.filter(u=>An(u.sectionTitle)),f=a.filter(u=>!An(u.sectionTitle)),p=[];for(let u=0;u<f.length;u+=St)p.push(zo(f.slice(u,u+St)));return[...e,...r,...s,...c,...p]}function jo(t,e,n){let r=t.split(/\r?\n/).length,o=vo(e);return o===0?!1:Fo(n)?r>=ne&&o>=re:r>=te&&o>=ee}var Zo=/^\[h2\][A-Za-z]/;function An(t){return Zo.test(t.trim())}function Pn(t){if(!t.includes(" | ")){let n=U(t);return n.symbolName?[n.symbolName]:[]}let e=[];for(let n of t.split(" | ")){let r=U(n.trim()).symbolName;r&&e.push(r)}return e}function Uo(t,e,n,r){let o=Pn(t),i=Dn(n,r);return e.symbolName&&i.push(e.symbolName),Rn([...o,...i],o)}function $o(t,e){let n=Nn(t.bodyParts),r=t.sectionTitle.trim(),o=U(r),i=hn(t.bodyParts),s=Sn(r,i,o),a=Pn(r),c=r?a.length>0?`${e.docTitle} ${a.join(" ")}`:`${e.docTitle} ${o.symbolName??r}`:e.docTitle,f=[e.docTitle,s,...t.bodyParts].join(" "),{leadText:p,excerptTruncated:u}=Mo(n,r);return{documentId:e.documentId,catalogId:e.catalogId,docTitle:e.docTitle,sectionTitle:r,titleTokens:c,headingsText:s,apiSymbols:Uo(r,o,f,t.codeBlocks),bodySample:n,leadText:p,excerptTruncated:u}}function Bn(t,e){for(let n of t){if(n.type==="heading"){let o=dt(n).trim();o&&e.headings.push(o);continue}if(n.type==="code"){e.codeBlocks.push(n.value??"");continue}if("children"in n&&Array.isArray(n.children)){Bn(n.children,e);continue}let r=ft(dt(n));r&&e.bodyParts.push(r)}}function Go(t){let e=bn().use(Tn).use(In).parse(t),n={headings:[],bodyParts:[],codeBlocks:[]};return Bn(e.children,n),n}function Xo(t,e){let n=Go(t),r=e.docTitle?.trim()||e.documentId,o=Nn(n.bodyParts),i=[r,...n.headings,o].join(" "),{leadText:s,excerptTruncated:a}=On(o);return{documentId:e.documentId,catalogId:e.catalogId,docTitle:r,sectionTitle:"",titleTokens:r,headingsText:Bo(n.headings),apiSymbols:Rn(Dn(i,n.codeBlocks)),bodySample:o,leadText:s,excerptTruncated:a}}function Mn(t,e){let n=e.docTitle?.trim()||e.documentId,r=ko(t);return jo(t,r,e.documentId)?Ho(r).filter(o=>o.sectionTitle||o.bodyParts.length>0||o.codeBlocks.length>0).map(o=>$o(o,{...e,docTitle:n})):[Xo(t,{...e,docTitle:n})]}async function Wo(t){let e=[];async function n(r){let o=await y.promises.readdir(r,{withFileTypes:!0});for(let i of o){if(i.name.startsWith("."))continue;let s=_.join(r,i.name);i.isDirectory()?await n(s):i.isFile()&&i.name.endsWith(".md")&&e.push(s)}}return await n(t),e}function Qo(t,e){let n=_.relative(e,t).split(_.sep).join("/").split("/");if(n[0]==="docs"&&(n=n.slice(1)),n.length<2)return null;let r=n[0],o=Ee[r];if(o===void 0)return null;let i=n[n.length-1].replace(/\.md$/,"");return n[n.length-1]=i,{documentId:n.join("/"),catalogId:o,docTitle:i}}async function qo(t){let e=t.replace(/\.md$/,".json");try{let n=await y.promises.readFile(e,"utf-8");return JSON.parse(n).title?.trim()||void 0}catch{return}}async function Yo(t,e){let n=Qo(t,e);if(!n)return[];let r=await y.promises.readFile(t,"utf-8"),o=wn(r,{jsonTitle:await qo(t),fileName:n.docTitle});return Mn(r,{...n,docTitle:o})}async function Vo(t,e,n){let r=_.join(e,"search.db");return await gn(r,t,async(o,i)=>{await n?.({current:o,total:i,message:`Building search index\u2026 ${o.toLocaleString()} / ${i.toLocaleString()} segments`})}),t.length}async function Ko(t){let e=await Wo(t),n=[];for(let r of e){let o=await Yo(r,t);n.push(...o)}return n}function Jo(t,e){return{indexVersion:X,docsZipSha256:t.docsZipSha256,termsHash:t.termsHash,synonymsHash:t.synonymsHash,segmentCount:e,builtAt:Date.now(),builtBy:t.builtBy}}async function Fn(t){t.lexiconDir&&Dt(t.lexiconDir);try{let e=await Ko(t.docsDir);await t.onProgress?.({current:0,total:e.length,message:`Building search index\u2026 0 / ${e.length.toLocaleString()} segments`}),await y.promises.mkdir(t.tmpDir,{recursive:!0});let n=await Vo(e,t.tmpDir,t.onProgress),r=Jo(t,n);return await y.promises.writeFile(_.join(t.tmpDir,"build-meta.json"),JSON.stringify(r,null,2)),await Oe(t.tmpDir),r}finally{t.lexiconDir&&Dt(null)}}async function vn(){return y.promises.mkdtemp(_.join(kn.tmpdir(),"deveco-docs-"))}async function ti(t,e){try{await y.promises.rename(t,e)}catch(n){let r=n.code;if(r!=="EPERM"&&r!=="EXDEV")throw n;await y.promises.cp(t,e,{recursive:!0}),await y.promises.rm(t,{recursive:!0,force:!0})}}async function zn(t){let e=_.join(t,"docs");try{await y.promises.access(e)}catch{return}let n=new Set(["docs","docs.zip"]);for(let r of await y.promises.readdir(e,{withFileTypes:!0})){if(n.has(r.name))continue;let o=_.join(e,r.name),i=_.join(t,r.name);await y.promises.rm(i,{recursive:!0,force:!0}),await ti(o,i)}await y.promises.rm(_.join(e,"docs"),{recursive:!0,force:!0}),await y.promises.rm(_.join(e,"docs.zip"),{force:!0}),await y.promises.rm(e,{recursive:!0,force:!0})}async function oi(t){let e=At();await h.promises.mkdir(H.dirname(e),{recursive:!0}),await h.promises.appendFile(e,`${new Date().toISOString()} ${t}
|
|
65
|
-
`)}async function
|
|
64
|
+
`),a=n.length;for(let c=0;c<a;c+=j){let f=n.slice(c,c+j),p=await Promise.all(f.map(async b=>({source:b,searchText:await bt(b)})));o.transaction(b=>{for(let S of b){let w=Lo(o,i,S.source);s.run(w,S.source.sectionTitle,S.source.leadText,S.searchText,S.source.excerptTruncated?1:0)}})(p),await r?.(Math.min(c+f.length,a),a)}o.exec("ANALYZE"),o.exec("VACUUM"),o.close()}function Mo(t,e,n,r,o,i,s){let a=Po(t,e);return At({all(c,...f){return a.prepare(c).all(...f)}},n,r,o,i,s)}async function jn(){let e=(await import("better-sqlite3")).default;return{kind:"better-sqlite3",resetCache:No,buildSearchIndex:(n,r,o)=>Bo(e,n,r,o),searchIndex:(n,r,o,i,s,a,c)=>Promise.resolve(Mo(e,i,r,o,s,a,c))}}import{readFile as ko,stat as vo,writeFile as Fo}from"fs/promises";var he=null,M=null;async function Se(){return he||(he=(async()=>{let t=(await import("@sqlite.org/sqlite-wasm")).default;return t()})()),he}function zo(t){return{all(e,...n){let r=t.prepare(e);n.length>0&&r.bind(n);let o=[];for(;r.step();)o.push(r.get({}));return r.finalize(),o}}}async function Ho(t){let e=await vo(t);if(M&&M.dbPath===t&&M.mtimeMs===e.mtimeMs)return M.db;M?.db.close();let n=await Se(),r=n.capi,o=n.wasm,i=new Uint8Array(await ko(t)),s=o.allocFromTypedArray(i),a=new n.oo1.DB(":memory:"),c=r.SQLITE_DESERIALIZE_READONLY|r.SQLITE_DESERIALIZE_RESIZEABLE|r.SQLITE_DESERIALIZE_FREEONCLOSE;return r.sqlite3_deserialize(a.pointer,"main",s,i.byteLength,i.byteLength,c),M={dbPath:t,mtimeMs:e.mtimeMs,db:a},a}function Un(){M?.db.close(),M=null}async function jo(t,e,n,r){t.exec("BEGIN");for(let o of r){let i=n(o.source);e.bind([i,o.source.sectionTitle,o.source.leadText,o.searchText,o.source.excerptTruncated?1:0]),e.step(),e.reset()}t.exec("COMMIT")}function Uo(t,e,n){return r=>{let o=e.get(r.documentId);if(o!==void 0)return o;let i=t.selectValue("SELECT id FROM documents WHERE document_id = ?",[r.documentId]);if(i!=null){let a=Number(i);return e.set(r.documentId,a),a}n.bind([r.documentId,r.catalogId,r.docTitle]),n.step(),n.reset();let s=Number(t.selectValue("SELECT last_insert_rowid()"));return e.set(r.documentId,s),s}}async function Zo(t,e,n){await q();let r=await Se(),o=new r.oo1.DB(":memory:","c");o.exec(Dt);let i=new Map,s=o.prepare("INSERT INTO documents(document_id, catalog_id, doc_title) VALUES (?, ?, ?)"),a=o.prepare("INSERT INTO segments(doc_id, section_title, lead_text, search_text, excerpt_truncated) VALUES (?, ?, ?, ?, ?)"),c=Uo(o,i,s),f=e.length;for(let d=0;d<f;d+=j){let b=e.slice(d,d+j),S=await Promise.all(b.map(async w=>({source:w,searchText:await bt(w)})));await jo(o,a,c,S),await n?.(Math.min(d+b.length,f),f)}o.exec("ANALYZE");let p=r.capi.sqlite3_js_db_export(o);await Fo(t,p),o.close(),Un()}async function $o(t,e,n,r,o,i){let s=await Ho(t);return At(zo(s),e,n,r,o,i)}async function ye(){return await Se(),{kind:"sqlite-wasm",resetCache:Un,buildSearchIndex:Zo,searchIndex:(t,e,n,r,o,i,s)=>$o(r,e,n,o,i,s)}}var It=null,xe=null;function Go(){return Y.existsSync(nt())}function Xo(t){let e=nt(),n={backend:"sqlite-wasm",reason:"better-sqlite3-load-failed",message:t,createdAt:new Date().toISOString()};Y.mkdirSync(Zn.dirname(e),{recursive:!0}),it(e),Y.writeFileSync(e,JSON.stringify(n,null,2))}async function Wo(){if(Go())return ye();try{let t=await jn();return z("doc-index: using better-sqlite3 SQLite backend"),t}catch(t){let e=t instanceof Error?t.message:String(t);Xo(e),z(`doc-index: better-sqlite3 unavailable (${e}); falling back to sqlite-wasm`)}return ye()}async function Ee(){return It||(It=Wo().then(t=>(xe=t,t))),It}function $n(){xe?.resetCache(),It=null,xe=null}function Tt(){$n()}async function Gn(t,e,n){await(await Ee()).buildSearchIndex(t,e,n)}import{unified as Kn}from"unified";import tr from"remark-parse";import er from"remark-gfm";import{toString as Rt}from"mdast-util-to-string";var Qo=/^(.+?)(\d+\+)?(对象|枚举|错误码)说明$/,qo=/^\[h2\]([A-Za-z][A-Za-z0-9]*)(\d+\+)?$/,Jo=/^(.{2,20}?)\s*[((]([A-Za-z][a-zA-Z0-9]{1,40})[))]\s*$/,Yo=/^([A-Za-z@][A-Za-z0-9@]*?)(\d+\+)?$/,Vo=/^(系统能力|元服务API|参数|返回值|说明|\*\*|表格|\|)/;function Ct(t){let e=t.trim(),n=e.match(Yo);return n?n[1]:e}function Ko(t){let e=t.match(Qo);if(!e)return;let n=Ct(e[1].trim());return{displayTitle:t,symbolName:n,searchExtras:[n,e[3]]}}function ti(t){let e=Ct(t.replace(/\([^)]*\)$/,""));if(/^[A-Z][A-Za-z0-9]*$/.test(e))return{displayTitle:t,symbolName:e,searchExtras:[e]};if(/^[A-Z][A-Za-z0-9]*(\([^)]*\))?$/.test(t))return{displayTitle:t,symbolName:e,searchExtras:[e]}}function ut(t){let e=t.trim();return e?Ko(e)??(()=>{let n=e.match(qo);if(n){let r=n[1];return{displayTitle:e,symbolName:r,searchExtras:[r]}}})()??(()=>{let n=e.match(Jo);if(!n)return;let r=n[1].trim(),o=n[2].trim();return{displayTitle:e,symbolName:o,searchExtras:[r,o]}})()??ti(e)??{displayTitle:e,searchExtras:[]}:{displayTitle:"",searchExtras:[]}}function ei(t){if(t.length<2||t.length>36||Vo.test(t))return!1;let e=[...t.replace(/\s/g,"")];return e.length===0?!1:e.filter(r=>new RegExp("\\p{Script=Han}","u").test(r)).length/e.length>=.4}function Xn(t){for(let e of t){let n=e.trim().replace(/[。.!!??;;]+$/u,"").trim();if(ei(n))return n}return""}function Wn(t,e,n){let r=[t,...n.searchExtras,e].filter(Boolean);return[...new Set(r)].join(" ")}var ni=/[A-Z][a-zA-Z0-9]+(?:\.[a-zA-Z][a-zA-Z0-9]+)*/g,lt=/@[A-Z][a-zA-Z]+/g,ri=/^[A-Z][A-Za-z0-9]*\.[A-Za-z][A-Za-z0-9]+/,oi=/^[A-Z][A-Za-z0-9]+(?:\([^)]*\))?$/,ii=/^[a-z0-9]+(?:[-_][a-z0-9]+)+$/,si=new Set(["API","Action","Code","Connect","Connection","Context","Direction","Element","Elements","Entry","Focused","Module","Modules","Name","Names","Stage","Type","Types","Value","Values","Rect","Error"]),ai=new Set(["HAP","HSP","HAR","NAPI","CAPI","NDK","ArkTS","ArkUI","OHPM"]),ci=new Set(["JSON","Object","Array","Promise","console","Math","Date","String","Number","Boolean","Error","Function","Map","Set","RegExp"]);function nr(t,e){let n=new Set,r=[t,...e];for(let o of r){for(let i of ie(o)){D(n,i);let s=xt(i);s&&D(n,s)}for(let i of se(o))D(n,i);for(let i of o.matchAll(ni)){let s=i[0];ui(s)&&n.add(s)}for(let i of o.matchAll(lt))n.add(i[0])}return W([...n])}function ui(t){let e=t.trim();if(!e||lt.test(e))return!!e;if(e.includes(".")){let n=e.split(".")[0]??"";return ci.has(n)?!1:/^[A-Z]/.test(n)}return si.has(e)?!1:ai.has(e)?!0:e.length<=3?!1:/^[A-Z][a-z]+[A-Z]/.test(e)?!0:e.length>=6&&/^[A-Z][A-Za-z0-9]+$/.test(e)}function Qn(t){let e=t.trim();return!!(!e||ii.test(e)||e.length>28&&!/[A-Z\u4e00-\u9fff]/.test(e)&&/^[a-z0-9_-]+$/.test(e))}function rr(t,e){let n=e.jsonTitle?.trim(),r=fi(t,"").trim(),o=e.fileName.trim();return n&&!Qn(n)?n:r&&!Qn(r)?r:n||r||o}function or(t){return ri.test(t.trim())}function _e(t){let e=t.trim().replace(/\([^)]*\)$/,""),n=Ct(e);return oi.test(n)}function Nt(t){let e=t.trim();return e?lt.test(e)||or(e)||_e(e)?!0:!!ut(e).symbolName:!1}function li(t){let e=t.trim();return!(!e||or(e)||_e(e))}function di(t){let e=new Set,n=[];for(let r of t){let o=r.trim();!li(o)||e.has(o)||(e.add(o),n.push(o))}return n}function qn(t){if(!t.includes("."))return 0;let e=t.split(".").pop()??"";return/^[a-z]/.test(e)?1:2}function mi(t,e){let n=qn(t)-qn(e);return n!==0?n:t.localeCompare(e)}function ir(t,e=[]){let n=[...new Set(e.map(i=>i.trim()).filter(Boolean))],r=new Set(n),o=[...new Set(t.map(i=>i.trim()).filter(Boolean))].filter(i=>!r.has(i));return o.sort(mi),[...n,...o].slice(0,je)}function Pt(t){return t.replace(/\s+/g," ").trim()}function Jn(t){return t.replace(/\\([\\`*_{}[\]()#+.!-])/g,"$1")}function fi(t,e=""){let n=t.split(/\r?\n/),r=0;for(;r<n.length&&!n[r].trim();)r+=1;if(r>=n.length)return e;let o=Jn(n[r].trim()),i=o.match(/^#+\s+(.+)$/);if(i)return Jn(i[1].trim());if(r+1<n.length){let s=n[r+1].trim();if(/^=+$/.test(s)||/^-+$/.test(s))return o}return o||e}function sr(t){let e=Pt(t.join(" "));if(e.length<=mt)return e;let n=e.slice(0,mt);return e.length<=mt+kt?n:`${n} ${e.slice(-kt)}`}function pi(t){let e=di(t).join(" ");return e.length<=vt?e:e.slice(0,vt)}function ar(t){let e=Pt(t),{text:n,excerptTruncated:r}=vn(e,Ue);return{leadText:n,excerptTruncated:r}}function gi(t,e){let{leadText:n,excerptTruncated:r}=ar(t);return{leadText:n,excerptTruncated:r||!!e.trim()}}function cr(t,e){if(t.type==="code"){e.codeBlocks.push(t.value??"");return}if("children"in t&&Array.isArray(t.children)){for(let r of t.children)cr(r,e);return}let n=Pt(Rt(t));n&&e.bodyParts.push(n)}function hi(t){let e=Kn().use(tr).use(er).parse(t),n=[],r=null,o=()=>{r&&((r.sectionTitle||r.bodyParts.length||r.codeBlocks.length)&&n.push(r),r=null)},i=()=>{r||(r={sectionTitle:"",bodyParts:[],codeBlocks:[]})};for(let s of e.children){if(s.type==="heading"){let a=s,c=Rt(a).trim();if(a.depth>=4&&c&&Nt(c)){o(),r={sectionTitle:c,bodyParts:[],codeBlocks:[]};continue}i(),c&&r.bodyParts.push(c);continue}i(),cr(s,r)}return o(),n.length===0?[{sectionTitle:"",bodyParts:[],codeBlocks:[]}]:n}function Si(t){return Re.test(t)}function yi(t){return t.filter(e=>e.sectionTitle&&Nt(e.sectionTitle)).length}function xi(t){return{sectionTitle:t.map(e=>e.sectionTitle.trim()).join(" | "),bodyParts:t.flatMap(e=>e.bodyParts).slice(0,40),codeBlocks:t.flatMap(e=>e.codeBlocks).slice(0,8)}}function Yn(t){let e=t.trim();return!e||lt.test(e)?lt.test(e):/对象说明$|枚举说明$/.test(e)?!0:_e(e)}function Ei(t){let e=t.filter(d=>!d.sectionTitle||!Nt(d.sectionTitle)),n=t.filter(d=>d.sectionTitle&&Nt(d.sectionTitle)),r=n.filter(d=>Yn(d.sectionTitle)),o=n.filter(d=>!Yn(d.sectionTitle)),i=Math.max(0,Ce-r.length),s=o.slice(0,i),a=o.slice(i),c=a.filter(d=>Vn(d.sectionTitle)),f=a.filter(d=>!Vn(d.sectionTitle)),p=[];for(let d=0;d<f.length;d+=Mt)p.push(xi(f.slice(d,d+Mt)));return[...e,...r,...s,...c,...p]}function _i(t,e,n){let r=t.split(/\r?\n/).length,o=yi(e);return o===0?!1:Si(n)?r>=Ie&&o>=Te:r>=Ae&&o>=De}var bi=/^\[h2\][A-Za-z]/;function Vn(t){return bi.test(t.trim())}function ur(t){if(!t.includes(" | ")){let n=ut(t);return n.symbolName?[n.symbolName]:[]}let e=[];for(let n of t.split(" | ")){let r=ut(n.trim()).symbolName;r&&e.push(r)}return e}function wi(t,e,n,r){let o=ur(t),i=nr(n,r);return e.symbolName&&i.push(e.symbolName),ir([...o,...i],o)}function Ai(t,e){let n=sr(t.bodyParts),r=t.sectionTitle.trim(),o=ut(r),i=Xn(t.bodyParts),s=Wn(r,i,o),a=ur(r),c=r?a.length>0?`${e.docTitle} ${a.join(" ")}`:`${e.docTitle} ${o.symbolName??r}`:e.docTitle,f=[e.docTitle,s,...t.bodyParts].join(" "),{leadText:p,excerptTruncated:d}=gi(n,r);return{documentId:e.documentId,catalogId:e.catalogId,docTitle:e.docTitle,sectionTitle:r,titleTokens:c,headingsText:s,apiSymbols:wi(r,o,f,t.codeBlocks),bodySample:n,leadText:p,excerptTruncated:d}}function lr(t,e){for(let n of t){if(n.type==="heading"){let o=Rt(n).trim();o&&e.headings.push(o);continue}if(n.type==="code"){e.codeBlocks.push(n.value??"");continue}if("children"in n&&Array.isArray(n.children)){lr(n.children,e);continue}let r=Pt(Rt(n));r&&e.bodyParts.push(r)}}function Di(t){let e=Kn().use(tr).use(er).parse(t),n={headings:[],bodyParts:[],codeBlocks:[]};return lr(e.children,n),n}function Ii(t,e){let n=Di(t),r=e.docTitle?.trim()||e.documentId,o=sr(n.bodyParts),i=[r,...n.headings,o].join(" "),{leadText:s,excerptTruncated:a}=ar(o);return{documentId:e.documentId,catalogId:e.catalogId,docTitle:r,sectionTitle:"",titleTokens:r,headingsText:pi(n.headings),apiSymbols:ir(nr(i,n.codeBlocks)),bodySample:o,leadText:s,excerptTruncated:a}}function dr(t,e){let n=e.docTitle?.trim()||e.documentId,r=hi(t);return _i(t,r,e.documentId)?Ei(r).filter(o=>o.sectionTitle||o.bodyParts.length>0||o.codeBlocks.length>0).map(o=>Ai(o,{...e,docTitle:n})):[Ii(t,{...e,docTitle:n})]}async function Ti(t){let e=[];async function n(r){let o=await x.promises.readdir(r,{withFileTypes:!0});for(let i of o){if(i.name.startsWith("."))continue;let s=_.join(r,i.name);i.isDirectory()?await n(s):i.isFile()&&i.name.endsWith(".md")&&e.push(s)}}return await n(t),e}function Ci(t,e){let n=_.relative(e,t).split(_.sep).join("/").split("/");if(n[0]==="docs"&&(n=n.slice(1)),n.length<2)return null;let r=n[0],o=Ge[r];if(o===void 0)return null;let i=n[n.length-1].replace(/\.md$/,"");return n[n.length-1]=i,{documentId:n.join("/"),catalogId:o,docTitle:i}}async function Ri(t){let e=t.replace(/\.md$/,".json");try{let n=await x.promises.readFile(e,"utf-8");return JSON.parse(n).title?.trim()||void 0}catch{return}}async function Ni(t,e){let n=Ci(t,e);if(!n)return[];let r=await x.promises.readFile(t,"utf-8"),o=rr(r,{jsonTitle:await Ri(t),fileName:n.docTitle});return dr(r,{...n,docTitle:o})}async function Pi(t,e,n){let r=_.join(e,"search.db");return await Gn(r,t,async(o,i)=>{await n?.({current:o,total:i,message:`Building search index\u2026 ${o.toLocaleString()} / ${i.toLocaleString()} segments`})}),t.length}async function Oi(t){let e=await Ti(t),n=[];for(let r of e){let o=await Ni(r,t);n.push(...o)}return n}function Li(t,e){return{indexVersion:H,docsZipSha256:t.docsZipSha256,termsHash:t.termsHash,synonymsHash:t.synonymsHash,segmentCount:e,builtAt:Date.now(),builtBy:t.builtBy}}async function fr(t){t.lexiconDir&&$t(t.lexiconDir);try{let e=await Oi(t.docsDir);await t.onProgress?.({current:0,total:e.length,message:`Building search index\u2026 0 / ${e.length.toLocaleString()} segments`}),await x.promises.mkdir(t.tmpDir,{recursive:!0});let n=await Pi(e,t.tmpDir,t.onProgress),r=Li(t,n);return await x.promises.writeFile(_.join(t.tmpDir,"build-meta.json"),JSON.stringify(r,null,2)),await sn(t.tmpDir),r}finally{t.lexiconDir&&$t(null)}}async function pr(){return x.promises.mkdtemp(_.join(mr.tmpdir(),"deveco-docs-"))}async function Bi(t,e){try{await x.promises.rename(t,e)}catch(n){let r=n.code;if(r!=="EPERM"&&r!=="EXDEV")throw n;await x.promises.cp(t,e,{recursive:!0}),await x.promises.rm(t,{recursive:!0,force:!0})}}async function gr(t){let e=_.join(t,"docs");try{await x.promises.access(e)}catch{return}let n=new Set(["docs","docs.zip"]);for(let r of await x.promises.readdir(e,{withFileTypes:!0})){if(n.has(r.name))continue;let o=_.join(e,r.name),i=_.join(t,r.name);await x.promises.rm(i,{recursive:!0,force:!0}),await Bi(o,i)}await x.promises.rm(_.join(e,"docs"),{recursive:!0,force:!0}),await x.promises.rm(_.join(e,"docs.zip"),{force:!0}),await x.promises.rm(e,{recursive:!0,force:!0})}async function Sr(t){let e=Ht();await h.promises.mkdir(T.dirname(e),{recursive:!0}),await h.promises.appendFile(e,`${new Date().toISOString()} ${t}
|
|
65
|
+
`)}async function Fi(t){let e=v();if(!e)throw new Error("docs.zip not found");await h.promises.rm(t,{recursive:!0,force:!0}),await h.promises.mkdir(t,{recursive:!0});let n=T.resolve(t),r=new Mi(e);for(let o of r.getEntries()){let i=T.resolve(n,o.entryName);if(!V(i,n))throw new Error(`Unsafe docs.zip entry path: ${o.entryName}`);if(o.isDirectory){await h.promises.mkdir(i,{recursive:!0});continue}await h.promises.mkdir(T.dirname(i),{recursive:!0}),await h.promises.writeFile(i,o.getData())}await gr(t)}async function zi(){await st({mode:"write"});let t=g(),e=C(),n=await h.promises.readdir(e);for(let r of n){let o=T.join(t,r);await h.promises.rm(o,{force:!0}),await h.promises.rename(T.join(e,r),o)}await h.promises.rm(e,{recursive:!0,force:!0}),await h.promises.rm(T.join(t,"orama.dpack"),{force:!0})}async function hr(t,e,n){e?.start(n),await B({state:"installing",phase:1,phaseLabel:"Installing index",message:n}),await ln(t),Tt(),e&&(e.text="Documentation index installed.")}async function Hi(t,e){try{return await hr(t,e,"Installing documentation index\u2026"),await be(e),!0}catch(n){if(qt(n))throw n}try{return await dn(),Tt(),await hr(t,e,"Retrying documentation index install\u2026"),await be(e),!0}catch(n){if(qt(n))throw n;let r=n instanceof Error?n.message:String(n);return await Sr(`Bundled index install failed; falling back to local rebuild: ${r}`),!1}}async function ji(t,e,n){let r=C(),o=await pr();await h.promises.mkdir(g(),{recursive:!0}),await h.promises.rm(r,{recursive:!0,force:!0}),n?.start("Building search index\u2026"),await B({state:"indexing",phase:2,phaseLabel:"Building search index",message:"Building search index\u2026"});try{await Fi(o),await fr({docsDir:o,tmpDir:r,docsZipSha256:e,termsHash:yt(),synonymsHash:St(),builtBy:t.builtBy??"doc-init",onProgress:async i=>{n&&(n.text=i.message),await B({state:"indexing",current:i.current,total:i.total,message:i.message})}})}finally{await h.promises.rm(o,{recursive:!0,force:!0})}await B({state:"persisting",phase:3,phaseLabel:"Persisting index",message:"Persisting index\u2026"}),await zi(),Tt()}async function be(t){await B({state:"done",phase:3,phaseLabel:"Done",message:"Documentation ready.",error:null}),t?.succeed("Documentation ready.")}async function Ui(t){let e=await te(),n=e?`Documentation already up to date. Documents: ${e.segmentCount.toLocaleString()}`:"Documentation already up to date.";t?.succeed(n),await B({state:"done",message:n,error:null})}async function Zi(t,e){let n=t instanceof Error?t.message:String(t);throw await B({state:"error",error:n}),await Sr(`ERROR: ${n}`),e?.fail(n),t}async function $i(){let t=g();await h.promises.mkdir(t,{recursive:!0});let e=ft();return h.existsSync(e)||await h.promises.writeFile(e,"","utf-8"),e}async function Gi(){let t=await $i();return ki.lock(t,{stale:1800*1e3})}async function Xi(){let t=v(),e=(t?await ht(t):null)??await Kt();if(!e)throw new Error("docs.zip not found");return e}async function Wi(t,e){let n=await Xi(),r=t.force||await yn(t.force),o=await ee(t.force);if(!r&&!o&&ne()){await Ui(e);return}!t.force&&un(n)&&await Hi(n,e)||(await ji(t,n,e),await be(e))}var Ot=class{static async run(e={}){let n=e.background??!1,o=e.quiet??n?void 0:vi({text:"Checking documentation\u2026",color:"cyan"}),i;try{e.assumeStorageSafe||await st({mode:"write"}),i=await Gi(),await Vt(Sn("Starting documentation setup\u2026")),await Wi(e,o)}catch(s){throw i&&await Zi(s,o),s}finally{i&&await i()}}};var Qi=process.env.DEVECO_CLI_POSTINSTALL?"postinstall":"doc-init";Ot.run({background:!0,builtBy:Qi}).then(()=>{process.exit(0)}).catch(()=>{process.exit(1)});
|
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
|
+
"version": "0.3.0-TD.1.2",
|
|
4
4
|
"description": "HarmonyOS application development command line tool",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -11,10 +11,13 @@
|
|
|
11
11
|
"dist",
|
|
12
12
|
"scripts/postinstall.mjs",
|
|
13
13
|
"scripts/install-better-sqlite3.mjs",
|
|
14
|
+
"scripts/install-jieba-wasm.mjs",
|
|
14
15
|
"scripts/lib/better-sqlite3-vendor.mjs",
|
|
16
|
+
"scripts/lib/jieba-wasm-vendor.mjs",
|
|
15
17
|
"scripts/lib/cli-data-dir.mjs",
|
|
16
18
|
"scripts/lib/doc-init-log-path.mjs",
|
|
17
19
|
"templates",
|
|
20
|
+
"src/resources",
|
|
18
21
|
"THIRD-PARTY-LICENSES",
|
|
19
22
|
"SKILL.md",
|
|
20
23
|
"docs.zip",
|
|
@@ -58,6 +61,7 @@
|
|
|
58
61
|
"tsx": "^4.21.0",
|
|
59
62
|
"turndown": "^7.2.4",
|
|
60
63
|
"typescript": "^6.0.3",
|
|
64
|
+
"@types/node-forge": "^1.3.14",
|
|
61
65
|
"typescript-eslint": "^8.59.1"
|
|
62
66
|
},
|
|
63
67
|
"dependencies": {
|
|
@@ -78,16 +82,19 @@
|
|
|
78
82
|
"proper-lockfile": "^4.1.2",
|
|
79
83
|
"regedit": "^5.1.4",
|
|
80
84
|
"remark-gfm": "^4.0.1",
|
|
85
|
+
"socket.io-client": "^4.7.5",
|
|
81
86
|
"remark-parse": "^11.0.0",
|
|
82
87
|
"smol-toml": "^1.6.1",
|
|
83
88
|
"unified": "^11.0.5",
|
|
84
89
|
"xdg-basedir": "^5.1.0",
|
|
85
90
|
"yauzl": "^3.2.0",
|
|
91
|
+
"node-forge": "^1.4.0",
|
|
86
92
|
"zod": "^4.4.3"
|
|
87
93
|
},
|
|
88
94
|
"optionalDependencies": {
|
|
89
95
|
"@node-rs/jieba": "^2.0.1",
|
|
90
|
-
"better-sqlite3": "^12.11.1"
|
|
96
|
+
"better-sqlite3": "^12.11.1",
|
|
97
|
+
"@node-rs/jieba-wasm32-wasi": "2.0.1"
|
|
91
98
|
},
|
|
92
99
|
"overrides": {
|
|
93
100
|
"dotenv": "16.4.7"
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2026 Huawei Device Co., Ltd.
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { appendFile, mkdir } from 'fs/promises';
|
|
7
|
+
import { dirname } from 'path';
|
|
8
|
+
import { getDocInitLogPath } from './lib/doc-init-log-path.mjs';
|
|
9
|
+
import { installJiebaWasmViaNpm } from './lib/jieba-wasm-vendor.mjs';
|
|
10
|
+
|
|
11
|
+
async function appendInstallLog(message) {
|
|
12
|
+
try {
|
|
13
|
+
const logPath = getDocInitLogPath();
|
|
14
|
+
await mkdir(dirname(logPath), { recursive: true });
|
|
15
|
+
await appendFile(
|
|
16
|
+
logPath,
|
|
17
|
+
`${new Date().toISOString()} [jieba-wasm] ${message}\n`
|
|
18
|
+
);
|
|
19
|
+
} catch {
|
|
20
|
+
// ignore logging failures
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export async function ensureJiebaWasmForDocs() {
|
|
25
|
+
await appendInstallLog(
|
|
26
|
+
`ensure @node-rs/jieba-wasm32-wasi@2.0.1 for Node ${process.version}`
|
|
27
|
+
);
|
|
28
|
+
const result = await installJiebaWasmViaNpm();
|
|
29
|
+
if (result.skipped) {
|
|
30
|
+
if (result.reason === 'already-installed') {
|
|
31
|
+
await appendInstallLog('skip: jieba wasm32-wasi already loadable');
|
|
32
|
+
} else if (result.reason === 'native-available') {
|
|
33
|
+
await appendInstallLog('skip: jieba native already loadable');
|
|
34
|
+
} else {
|
|
35
|
+
await appendInstallLog(`skip: ${result.reason}`);
|
|
36
|
+
}
|
|
37
|
+
} else if (result.ok) {
|
|
38
|
+
await appendInstallLog(
|
|
39
|
+
'installed @node-rs/jieba-wasm32-wasi@2.0.1 via npm'
|
|
40
|
+
);
|
|
41
|
+
} else {
|
|
42
|
+
await appendInstallLog(
|
|
43
|
+
`npm install failed (${result.reason}): ${result.error ?? 'unknown error'}`
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2026 Huawei Device Co., Ltd.
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { dirname, join } from 'path';
|
|
7
|
+
import { existsSync } from 'fs';
|
|
8
|
+
import { spawnSync } from 'child_process';
|
|
9
|
+
import { fileURLToPath } from 'url';
|
|
10
|
+
import { packageRoot } from './better-sqlite3-vendor.mjs';
|
|
11
|
+
|
|
12
|
+
const JIEBA_WASM_VERSION = '2.0.1';
|
|
13
|
+
|
|
14
|
+
function resolveNpmCliPath() {
|
|
15
|
+
const nodeDir = dirname(process.execPath);
|
|
16
|
+
const candidates = [
|
|
17
|
+
join(nodeDir, 'node_modules', 'npm', 'bin', 'npm-cli.js'),
|
|
18
|
+
join(nodeDir, '..', 'lib', 'node_modules', 'npm', 'bin', 'npm-cli.js'),
|
|
19
|
+
];
|
|
20
|
+
return candidates.find((candidate) => existsSync(candidate)) ?? null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function quoteWindowsCmdArg(arg) {
|
|
24
|
+
return /\s/.test(arg) ? `"${arg.replace(/"/g, '\\"')}"` : arg;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function spawnDetail(result) {
|
|
28
|
+
return [result.stderr, result.stdout, result.error?.message]
|
|
29
|
+
.filter(Boolean)
|
|
30
|
+
.join('\n')
|
|
31
|
+
.trim();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function runNpmInstallJiebaWasm(targetVersion) {
|
|
35
|
+
const args = [
|
|
36
|
+
'install',
|
|
37
|
+
`@node-rs/jieba-wasm32-wasi@${targetVersion}`,
|
|
38
|
+
'--no-save',
|
|
39
|
+
'--cpu=wasm32',
|
|
40
|
+
];
|
|
41
|
+
const npmCli = resolveNpmCliPath();
|
|
42
|
+
if (npmCli) {
|
|
43
|
+
return spawnSync(process.execPath, [npmCli, ...args], {
|
|
44
|
+
cwd: packageRoot,
|
|
45
|
+
stdio: 'pipe',
|
|
46
|
+
encoding: 'utf-8',
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (process.platform === 'win32') {
|
|
50
|
+
const command = ['npm', ...args].map(quoteWindowsCmdArg).join(' ');
|
|
51
|
+
return spawnSync(command, {
|
|
52
|
+
cwd: packageRoot,
|
|
53
|
+
stdio: 'pipe',
|
|
54
|
+
encoding: 'utf-8',
|
|
55
|
+
shell: true,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return spawnSync('npm', args, {
|
|
59
|
+
cwd: packageRoot,
|
|
60
|
+
stdio: 'pipe',
|
|
61
|
+
encoding: 'utf-8',
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function installJiebaWasmViaNpm(targetVersion = JIEBA_WASM_VERSION) {
|
|
66
|
+
try {
|
|
67
|
+
await import('@node-rs/jieba-wasm32-wasi');
|
|
68
|
+
return { ok: true, skipped: true, reason: 'already-installed' };
|
|
69
|
+
} catch {
|
|
70
|
+
// continue — try native or install wasm
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
try {
|
|
74
|
+
await import('@node-rs/jieba');
|
|
75
|
+
return { ok: true, skipped: true, reason: 'native-available' };
|
|
76
|
+
} catch {
|
|
77
|
+
// continue — install wasm fallback
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const result = runNpmInstallJiebaWasm(targetVersion);
|
|
81
|
+
if (result.status !== 0) {
|
|
82
|
+
return {
|
|
83
|
+
ok: false,
|
|
84
|
+
reason: 'npm-install-failed',
|
|
85
|
+
version: targetVersion,
|
|
86
|
+
error: spawnDetail(result) || `exit ${result.status ?? 'null'}`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
try {
|
|
91
|
+
await import('@node-rs/jieba-wasm32-wasi');
|
|
92
|
+
} catch {
|
|
93
|
+
return {
|
|
94
|
+
ok: false,
|
|
95
|
+
reason: 'load-failed',
|
|
96
|
+
version: targetVersion,
|
|
97
|
+
error:
|
|
98
|
+
'npm install finished but @node-rs/jieba-wasm32-wasi still cannot be imported',
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
return { ok: true, version: targetVersion, method: 'npm' };
|
|
102
|
+
}
|
package/scripts/postinstall.mjs
CHANGED
|
@@ -8,6 +8,7 @@ import { existsSync, mkdirSync } from 'fs';
|
|
|
8
8
|
import { dirname, join } from 'path';
|
|
9
9
|
import { fileURLToPath } from 'url';
|
|
10
10
|
import { ensureBetterSqlite3ForDocs } from './install-better-sqlite3.mjs';
|
|
11
|
+
import { ensureJiebaWasmForDocs } from './install-jieba-wasm.mjs';
|
|
11
12
|
import { getDocInitLogPath } from './lib/doc-init-log-path.mjs';
|
|
12
13
|
|
|
13
14
|
const root = join(dirname(fileURLToPath(import.meta.url)), '..');
|
|
@@ -21,6 +22,14 @@ if (!nativeResult.ok && !nativeResult.skipped) {
|
|
|
21
22
|
`${nativeResult.error ?? ''}\n`
|
|
22
23
|
);
|
|
23
24
|
}
|
|
25
|
+
|
|
26
|
+
const jiebaResult = await ensureJiebaWasmForDocs();
|
|
27
|
+
if (!jiebaResult.ok && !jiebaResult.skipped) {
|
|
28
|
+
console.warn(
|
|
29
|
+
`[deveco-cli] jieba wasm install via npm failed; docs search may fail on this machine.\n` +
|
|
30
|
+
`${jiebaResult.error ?? ''}\n`
|
|
31
|
+
);
|
|
32
|
+
}
|
|
24
33
|
const initScript = join(root, 'dist', 'internal', 'doc-init-background.js');
|
|
25
34
|
|
|
26
35
|
if (!existsSync(initScript)) {
|