@deveco-test/deveco-cli 1.3.0-Test.4 → 1.3.0-Test.6
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 +25 -13
- package/SKILL.md +35 -11
- package/THIRD-PARTY-LICENSES +5 -35
- package/dist/cli.js +101 -90
- package/dist/internal/doc-init-background.js +8 -8
- package/docs.zip +0 -0
- package/index.zip +0 -0
- package/package.json +6 -4
- package/scripts/install-jieba-wasm.mjs +47 -0
- package/scripts/lib/jieba-wasm-vendor.mjs +102 -0
- package/scripts/postinstall.mjs +9 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import*as h from"fs";import*as z from"path";import Vo from"adm-zip";import Jo from"proper-lockfile";import Ko 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",gi=100*1024*1024,Kt=280,te=6,ee=100,ne=3,re=28,St=10,oe=/API参考|APIReference/i;var ie=6,Q=700,yt=250,xt=400,se=1320,ae=120,ce=450,ue=250,le=500,de=480,me=80,fe=200,pe=60,ge=200,he=40,Se=200,ye=200,xe=40,B=500,_e=Object.fromEntries(ht.map((t,e)=>[G[t],e])),w=Object.fromEntries(ht.map((t,e)=>[t,e]));import*as Ae from"fs";import*as m from"path";import{fileURLToPath as be}from"url";import*as W from"path";import{homedir as vn}from"os";var zn="deveco-cli";function Hn(t){let e=t.trim();return(e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'"))&&(e=e.slice(1,-1).trim()),e}function Ee(){return W.join(vn(),".local","share",zn)}function _t(){let t=process.env.DEVECO_CLI_DATA_DIR;if(t===void 0||t==="")return Ee();let e=Hn(t);return e?W.resolve(e):Ee()}var jn="docs";function q(){return m.join(_t(),jn)}function x(){return m.join(q(),".index")}function Te(){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 Zn(){return m.join(_t(),"logs")}function At(){return m.join(Zn(),"doc-init.log")}function Un(t,e){let n=e;for(;!n.endsWith(`${m.sep}dist`)&&n!==m.dirname(n);)n=m.dirname(n);return n}function Ie(t,e){return m.dirname(Un(t,e))}function $n(){let t=be(import.meta.url),e=m.dirname(t);return t.includes(`${m.sep}dist${m.sep}`)?Ie(t,e):m.join(e,"..","..","..")}function Gn(...t){let e=be(import.meta.url),n=m.dirname(e);return e.includes(`${m.sep}dist${m.sep}`)?[m.join(Ie(e,n),...t)]:[m.join(n,"..","..","..",...t)]}function De(...t){for(let e of Gn(...t))if(Ae.existsSync(e))return e;return null}function L(){return De("docs.zip")}function bt(){return De("index.zip")}function we(){return m.join($n(),"index","data")}import*as D from"fs";import*as O 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 Ce(){if(It)return It;let t=x();if(P.every(o=>D.existsSync(O.join(t,o))))return t;let n=we();if(P.every(o=>D.existsSync(O.join(n,o))))return n;throw new Tt("Lexicon files not found. Install the documentation index first (index.zip).")}function H(t){let e=O.join(Ce(),t);return D.readFileSync(e,"utf-8")}function Re(t,e){return D.readFileSync(O.join(e,t),"utf-8")}async function Ne(t,e=Ce()){await D.promises.mkdir(t,{recursive:!0});for(let n of P){let r=O.join(e,n),o=O.join(t,n);await D.promises.copyFile(r,o)}}import*as wt from"fs";import*as Xn from"yauzl";function Ct(){let t=L();return t!==null&&wt.existsSync(t)}import*as S from"fs";import*as C from"path";import Le from"adm-zip";var Oe=["search.db","build-meta.json",...P],Qn=["corpus.json","corpus-offsets.json","orama.dpack"];async function Wn(t){for(let e of Qn)await S.promises.rm(C.join(t,e),{force:!0})}async function qn(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 Yn(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 Vn(t){let e=x();await S.promises.mkdir(e,{recursive:!0});for(let n of Oe){let r=C.join(e,n);await S.promises.rm(r,{force:!0}),await S.promises.rename(C.join(t,n),r)}await Wn(e),await S.promises.rm(M(),{recursive:!0,force:!0})}function Rt(){let t=bt();return t!==null&&S.existsSync(t)}async function Pe(t){let e=bt();if(!e)throw new Error("index.zip not found");let n=Yn(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 Oe){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 Vn(r),await S.promises.mkdir(q(),{recursive:!0}),await qn(q()),i}import{createHash as Be}from"crypto";import*as Me from"fs";async function J(t){return new Promise((e,n)=>{let r=Be("sha256"),o=Me.createReadStream(t);o.on("data",i=>r.update(i)),o.on("error",n),o.on("end",()=>e(r.digest("hex")))})}function ke(t){return Be("sha256").update(t,"utf8").digest("hex")}function Fe(t,e){let n=e?Re(t,e):H(t);return ke(n)}function K(t){return Fe("harmonyos-synonyms.json",t)}function tt(t){return Fe("harmonyos-terms.txt",t)}var Jn={state:"idle",phase:0,phaseLabel:"Idle",current:0,total:0,message:"",startedAt:0,updatedAt:0,error:null};async function ve(){try{let t=await b.promises.readFile(Et(),"utf-8");return JSON.parse(t)}catch{return{...Jn}}}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 ze(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 ve(),...t,updatedAt:Date.now()};return await Nt(n),n}async function Lt(){let t=L();return t?J(t):null}async function Ot(){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 Ot();if(!e||e.segmentCount===0)return"no-index";let n=await Lt();return n&&e.docsZipSha256!==n?"docs-changed":e.indexVersion!==X?"engine-upgraded":e.termsHash!==tt()?"terms-changed":e.synonymsHash!==K()?"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 He(t=!1){return t?!0:Ct()?Bt()?await Pt()!==null:!0:!1}import*as y from"fs";import*as On from"os";import*as _ from"path";var je=new Set(["picker","dialog","sheet","panel","popup","menu","layout","view","gesture","animation","transition","recognizer","manager","kit"]);var Ze=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"]),Ue=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 Kn=/@ohos\.[a-z][a-zA-Z0-9.]+/gi,tr=/\b[a-z][a-z0-9]*[A-Z][a-zA-Z0-9]+\b/g,er=/[A-Z][a-zA-Z0-9]{2,}/g,nr=/@[A-Z][a-zA-Z0-9]*/g,rr=/[a-z][a-zA-Z0-9]*\.[a-zA-Z][a-zA-Z0-9]+/g,$e=6,or=/^[a-z][a-z0-9]{2,}$/,ir=/^([a-z][a-z0-9]{2,})\s+([a-z][a-z0-9]{2,})$/,sr=/^@ohos\.[a-z][a-zA-Z0-9.]+$/i,ar=/^[a-z][a-z0-9]*[A-Z][a-zA-Z0-9]+$/,cr=/^[A-Z][a-zA-Z0-9]+$/;function Mt(t){return sr.test(t)}function ur(t){return ar.test(t)&&t.length>=$e}function lr(t){return cr.test(t)}function kt(t){return Mt(t)||ur(t)||lr(t)}function dr(t){let e=t.trim().toLowerCase();return Ue.has(e)?!1:je.has(e)}function mr(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(Kn)].map(e=>e[0])}function vt(t,e=$e){let n=[];for(let r of t.matchAll(tr))r[0].length>=e&&n.push(r[0]);return n}function k(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 fr(t){let e=new Set;T(e,t);let n=et(t);return n&&T(e,n),k([...e])}function zt(t){if(Mt(t))return fr(t);let e=new Set;return T(e,t),k([...e])}function Ht(t){let e=t.trim();if(/[A-Z]/.test(e))return null;let n=e.match(ir);if(!n)return null;let r=n[1].toLowerCase(),o=n[2].toLowerCase();if(!or.test(r)||Ze.has(r)||!dr(o))return null;let i=mr(r,o);return{first:r,second:o,camelCase:i,lower:i.toLowerCase()}}function Ge(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 Xe(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(nr))n.add(r[0]);for(let r of t.matchAll(rr))n.add(r[0]);for(let r of t.matchAll(er))r[0].length>=4&&n.add(r[0]);return k([...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 Xe(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 k([...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 qe(t){return I.pureApiSymbol.test(t.trim())}function We(t){let e=t.trim();return I.stageModelExact.test(e)||I.stageModelEnglishExact.test(e)}var pr=[{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=>We(t),weights:[{catalog:"harmonyos-guides",multiplier:1.85},{catalog:"harmonyos-references",multiplier:.55},{catalog:"harmonyos-faqs",multiplier:.85}]},{matches:t=>!We(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 gr(t,e){for(let{catalog:n,multiplier:r}of e){let o=w[n];t.set(o,(t.get(o)??1)*r)}}function Ye(t,e){for(let n of pr)n.matches(t)&&gr(e,n.weights)}import{Jieba as hr}from"@node-rs/jieba";import{dict as Sr}from"@node-rs/jieba/dict.js";var nt=null,Zt=null,Ut=null;function yr(){if(nt)return nt;let t=H("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 Pi from"adm-zip";import Oi from"proper-lockfile";import Li from"ora";import*as w 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",Qi=48*1024*1024,Ae=280,we=6,De=100,Ie=3,Te=28,Mt=10,Ce=/API参考|APIReference/i;var Re=6,mt=700,kt=250,vt=400,Ne=1320,Pe=120,Oe=450,Le=250,Be=500,Me=480,ke=80,ve=200,Fe=60,ze=200,He=40,je=200,Ue=200,Ze=40,j=500,$e=Object.fromEntries(Bt.map((t,e)=>[dt[t],e])),O=Object.fromEntries(Bt.map((t,e)=>[t,e]));import*as K from"fs";import*as m from"path";import{fileURLToPath as Ye}from"url";import*as L from"fs";import*as Qe from"path";import{homedir as Sr}from"os";import*as Ge from"fs";import*as E from"path";function Y(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=Ge.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 Xe(t,e){let n=U(e),r=U(t);return Y(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 We(t){let e=Ft(t);if(!e)throw new Error("Path must not be empty.");return U(e)}var yr="deveco-cli",zt,k=class extends Error{constructor(e){super(e),this.name="CliDataDirError"}};function qe(){let t=process.env.DEVECO_CLI_DATA_DIR,n=(t===void 0||t===""?"":Ft(t))||Qe.join(Sr(),".local","share",yr);try{return We(n)}catch(r){throw new k(r instanceof Error?r.message:String(r))}}async function Je(){let t=qe();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 V(){if(zt!==void 0)return zt;let t=qe();try{if(L.existsSync(t))return L.realpathSync(t)}catch{}return t}var xr="docs";function Z(){return m.join(V(),xr)}function g(){return m.join(Z(),".index")}function ft(){return m.join(g(),"build.lock")}function tt(){return m.join(g(),"build-status.json")}function $(){return m.join(g(),"build-meta.json")}function G(){return m.join(g(),"search.db")}function et(){return m.join(g(),"sqlite-backend.json")}function nt(){return m.join(g(),"jieba-backend.json")}function C(){return m.join(g(),".tmp")}function Er(){return m.join(V(),"logs")}function Ht(){return m.join(Er(),"doc-init.log")}function _r(t,e){let n=e;for(;!n.endsWith(`${m.sep}dist`)&&n!==m.dirname(n);)n=m.dirname(n);return n}function Ve(t,e){return m.dirname(_r(t,e))}function Ke(){let t=Ye(import.meta.url),e=m.dirname(t);return t.includes(`${m.sep}dist${m.sep}`)?Ve(t,e):m.join(e,"..","..","..")}function br(...t){let e=Ye(import.meta.url),n=m.dirname(e);return e.includes(`${m.sep}dist${m.sep}`)?[m.join(Ve(e,n),...t)]:[m.join(n,"..","..","..",...t)]}function tn(...t){let e=Ke(),n=K.realpathSync(e);for(let r of br(...t))try{let o=K.lstatSync(r);if(o.isSymbolicLink()||!o.isFile())throw new Error(`Unsafe documentation package asset: ${t.join("/")} must be a regular file.`);let i=K.realpathSync(r);if(!Y(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 tn("docs.zip")}function jt(){return tn("index.zip")}function en(){return m.join(Ke(),"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 nn(){if(Zt)return Zt;let t=g();if(N.every(o=>R.existsSync(F.join(t,o))))return t;let n=en();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 rt(t){let e=F.join(nn(),t);return R.readFileSync(e,"utf-8")}function rn(t,e){return R.readFileSync(F.join(e,t),"utf-8")}async function on(t,e=nn()){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 Ar from"yauzl";function Xt(){let t=v();return t!==null&&Gt.existsSync(t)}import*as y from"fs";import*as P from"path";import sn 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 wr(){return U(V())}function Qt(t,e,n){let r=Xe(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=wr();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 Je();await Wt(Z(),n),await Wt(g(),n),e==="write"&&await Wt(C(),n);for(let r of[G(),$(),tt(),ft(),nt(),et(),...N.map(o=>gt.join(g(),o))])it(r)}var Yt=["search.db","build-meta.json",...N],Dr=["corpus.json","corpus-offsets.json","orama.dpack"];async function Ir(t){for(let e of Dr)await y.promises.rm(P.join(t,e),{force:!0})}async function Tr(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 an(t){let n=new sn(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 Cr(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 Ir(e),await y.promises.rm(C(),{recursive:!0,force:!0})}function cn(t){let e=jt();if(!e)return!1;try{let n=an(e);return n.indexVersion===H&&n.docsZipSha256===t&&n.segmentCount>0}catch{return!1}}async function un(t){await st({mode:"write"});let e=jt();if(!e)throw new Error("index.zip not found");let n=an(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 sn(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 Cr(r),await y.promises.mkdir(Z(),{recursive:!0}),await Tr(Z()),i}async function ln(){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 dn}from"crypto";import*as mn from"fs";async function ht(t){return new Promise((e,n)=>{let r=dn("sha256"),o=mn.createReadStream(t);o.on("data",i=>r.update(i)),o.on("error",n),o.on("end",()=>e(r.digest("hex")))})}function fn(t){return dn("sha256").update(t,"utf8").digest("hex")}function pn(t,e){let n=e?rn(t,e):rt(t);return fn(n)}function St(t){return pn("harmonyos-synonyms.json",t)}function yt(t){return pn("harmonyos-terms.txt",t)}var Rr={state:"idle",phase:0,phaseLabel:"Idle",current:0,total:0,message:"",startedAt:0,updatedAt:0,error:null};async function gn(){try{let t=await w.promises.readFile(tt(),"utf-8");return JSON.parse(t)}catch{return{...Rr}}}async function Vt(t){let e=tt();await w.promises.mkdir(at.dirname(e),{recursive:!0}),await w.promises.writeFile(e,JSON.stringify(t,null,2))}function hn(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 gn(),...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 w.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()||!w.existsSync(G())||!w.existsSync($()))return!1;let t=at.dirname(G());if(!N.every(e=>w.existsSync(at.join(t,e))))return!1;try{let e=w.readFileSync($(),"utf-8");return JSON.parse(e).segmentCount>0}catch{return!1}}async function Sn(t=!1){return t?!0:Xt()?ne()?await ee()!==null:!0:!1}import*as x from"fs";import*as lr from"os";import*as _ from"path";var yn=new Set(["picker","dialog","sheet","panel","popup","menu","layout","view","gesture","animation","transition","recognizer","manager","kit"]);var xn=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"]),En=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 Nr=/@ohos\.[a-z][a-zA-Z0-9.]+/gi,Pr=/\b[a-z][a-z0-9]*[A-Z][a-zA-Z0-9]+\b/g,Or=/[A-Z][a-zA-Z0-9]{2,}/g,Lr=/@[A-Z][a-zA-Z0-9]*/g,Br=/[a-z][a-zA-Z0-9]*\.[a-zA-Z][a-zA-Z0-9]+/g,_n=6,Mr=/^[a-z][a-z0-9]{2,}$/,kr=/^([a-z][a-z0-9]{2,})\s+([a-z][a-z0-9]{2,})$/,vr=/^@ohos\.[a-z][a-zA-Z0-9.]+$/i,Fr=/^[a-z][a-z0-9]*[A-Z][a-zA-Z0-9]+$/,zr=/^[A-Z][a-zA-Z0-9]+$/;function re(t){return vr.test(t)}function Hr(t){return Fr.test(t)&&t.length>=_n}function jr(t){return zr.test(t)}function oe(t){return re(t)||Hr(t)||jr(t)}function Ur(t){let e=t.trim().toLowerCase();return En.has(e)?!1:yn.has(e)}function Zr(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(Nr)].map(e=>e[0])}function se(t,e=_n){let n=[];for(let r of t.matchAll(Pr))r[0].length>=e&&n.push(r[0]);return n}function X(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 $r(t){let e=new Set;D(e,t);let n=xt(t);return n&&D(e,n),X([...e])}function ae(t){if(re(t))return $r(t);let e=new Set;return D(e,t),X([...e])}function ce(t){let e=t.trim();if(/[A-Z]/.test(e))return null;let n=e.match(kr);if(!n)return null;let r=n[1].toLowerCase(),o=n[2].toLowerCase();if(!Mr.test(r)||xn.has(r)||!Ur(o))return null;let i=Zr(r,o);return{first:r,second:o,camelCase:i,lower:i.toLowerCase()}}function bn(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(Lr))n.add(r[0]);for(let r of t.matchAll(Br))n.add(r[0]);for(let r of t.matchAll(Or))r[0].length>=4&&n.add(r[0]);return X([...n])}function wn(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 X([...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 In(t){return I.pureApiSymbol.test(t.trim())}function Dn(t){let e=t.trim();return I.stageModelExact.test(e)||I.stageModelEnglishExact.test(e)}var Gr=[{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=>Dn(t),weights:[{catalog:"harmonyos-guides",multiplier:1.85},{catalog:"harmonyos-references",multiplier:.55},{catalog:"harmonyos-faqs",multiplier:.85}]},{matches:t=>!Dn(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=O[n];t.set(o,(t.get(o)??1)*r)}}function Tn(t,e){for(let n of Gr)n.matches(t)&&Xr(e,n.weights)}import*as W from"fs";import*as Rn from"path";function z(t){process.env.DEVECO_CLI_DEBUG&&console.log(`[DEBUG] ${t}`)}var Et=null,le=null,de=null;function Wr(){return W.existsSync(nt())}function Qr(t){let e=nt(),n={backend:"jieba-wasm",reason:"native-jieba-load-failed",message:t,createdAt:new Date().toISOString()};W.mkdirSync(Rn.dirname(e),{recursive:!0}),it(e),W.writeFileSync(e,JSON.stringify(n,null,2))}function qr(){if(Et)return Et;let t=rt("harmonyos-stopwords.txt");return Et=new Set(t.split(`
|
|
2
|
+
`).map(e=>e.trim()).filter(Boolean)),Et}function Jr(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 Yr(t){let e=qr(),n=[];for(let r of Jr(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 Nn(t){let{dict:e}=await import("@node-rs/jieba/dict.js"),n=t.withDict(e),r=rt("harmonyos-terms.txt");return n.loadDict(Buffer.from(r,"utf-8")),n}async function Vr(){let{Jieba:t}=await import("@node-rs/jieba");return Nn(t)}async function Cn(){let{Jieba:t}=await import("@node-rs/jieba-wasm32-wasi");return Nn(t)}async function Kr(){if(Wr())return await Cn();try{let e=await Vr();return z("doc-index: using @node-rs/jieba backend"),e}catch(e){let n=e instanceof Error?e.message:String(e);Qr(n),z(`doc-index: @node-rs/jieba unavailable (${n}); falling back to wasm32-wasi`)}let t=await Cn();return z("doc-index: using @node-rs/jieba-wasm32-wasi backend"),t}async function Q(){return le||(de||(de=Kr().then(t=>(le=t,t))),de)}async function to(t){let e=await Q();return Yr(e.cutForSearch(t,!0))}async function _t(t,e){let n=t.trim();if(!n||e<=0)return"";let r=(await to(n)).join(" ");return r.length<=e?r:r.slice(0,e)}async function eo(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?Me:Ne,o=e?ve:Oe,i=e?await eo(t.apiSymbols,o):await _t(t.apiSymbols.join(" "),o),a=(await Promise.all([_t(n,e?ke:Pe),Promise.resolve(i),_t(t.headingsText,e?Fe:Le),_t(t.bodySample,e?ze:Be)])).filter(Boolean).join(" ");return a.length<=r?a:a.slice(0,r)}var Pn=["harmonyos-releases","harmonyos-roadmap"],no=new Set(Pn.map(t=>O[t])),Ba=Pn.map(t=>`${dt[t]}/`);function ro(t){return no.has(t)}function On(t){let e=[],n=[];for(let r of t)ro(r.catalog_id)?n.push(r):e.push(r);return[...e,...n]}var oo=[{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 io(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 Ln(t){let e=new Map,n=t.trim();if(!n)return e;let r=In(n);io(n,e),Tn(n,e);for(let o of oo)o.pattern.test(n)&&(o.skipForPureApiSymbol&&r||ct(e,o.catalog,o.multiplier));return e}import*as J from"fs";import*as jn from"path";var so=[" ","\u3002","\uFF0C","\uFF1B","\u3001",".","!","?"];function Bn(t,e){let n=-1;for(let r of so){let o=t.lastIndexOf(r);o>n&&(n=o)}return n>=e?n:-1}function Mn(t,e){let n=t.trim();if(n.length<=e)return{text:n,excerptTruncated:!1};let r=n.slice(0,e),o=Bn(r,e-20),i=o>=0?o:e;return{text:n.slice(0,i).trimEnd(),excerptTruncated:!0}}function kn(t,e,n={}){let{maxLen:r=Ue,contextChars:o=Ze,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 be=s.toLowerCase().indexOf(Lt.toLowerCase());if(be>=0){c=be;break}}let f=Math.max(0,c-o),p=Math.min(s.length,f+r),u=s.slice(f,p),b=Bn(u,r-25);b>=0&&(p=f+b);let S=s.slice(f,p).trim(),A=f>0?"...":"",hr=p<s.length||i?"...":"";return`${A}${S}${hr}`}var ao=`
|
|
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 z from"path";import Vo from"adm-zip";import Jo fr
|
|
|
8
8
|
WHERE segments_fts MATCH ?
|
|
9
9
|
ORDER BY bm25(segments_fts)
|
|
10
10
|
LIMIT ?
|
|
11
|
-
`,
|
|
11
|
+
`,co=`
|
|
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 z from"path";import Vo from"adm-zip";import Jo fr
|
|
|
17
17
|
WHERE segments_fts MATCH ? AND d.catalog_id = ?
|
|
18
18
|
ORDER BY bm25(segments_fts)
|
|
19
19
|
LIMIT ?
|
|
20
|
-
`,
|
|
20
|
+
`,uo=3.5,lo=1.4,mo=4,fo=1.8,po=1.35,go=3.5,ho=1.8,So=120,vn=6;function fe(t){return t.toLowerCase().replace(/[^\p{L}\p{N}@.]+/gu,"")}function yo(t){return t.split(/[^\p{L}\p{N}@.]+/u).map(fe).filter(e=>e.length>=2)}function xo(t,e){return e.length>1&&e.every(n=>t.includes(n))}function Eo(t){return/^[a-z0-9]{1,4}$/.test(t.trim().toLowerCase())}function _o(t,e){return t===e?go:t.startsWith(e)||t.includes(`@ohos.${e}`)?ho:1}function bo(t,e){let n=fe(e);if(n.length<2)return 1;let r=fe(t.doc_title);if(Eo(e))return _o(r,n);if(r.includes(n))return mo;if(n.length>=vn&&r.includes(n.slice(0,vn)))return fo;let o=yo(e);return xo(r,o)?po:1}function Ao(t,e){return e<=1?t:t<0?t*e:t/e}function At(t,e,n,r){let o=t.bm25/(e.get(t.catalog_id)??1);return o=Ao(o,bo(t,n)),r&&ue(t.doc_title,t.section_title,r)&&(o/=uo,t.catalog_id===O["harmonyos-references"]&&(o/=lo)),o}function me(t,e,n,r){return t.reduce((o,i)=>At(i,e,n,r)<At(o,e,n,r)?i:o)}function wo(t,e){return e.some(n=>t.section_title.includes(n)||t.doc_title.includes(n))}function Do(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 me(i,n,r,o)}if(e.length>0){let i=t.filter(s=>wo(s,e));if(i.length>0)return me(i,n,r,o)}return me(t,n,r,o)}function Fn(t,e,n,r,o){let i=Ln(e),s=wn(e),c=bn(e)?.camelCase,f=new Map;for(let S of t){let A=f.get(S.document_id)??[];A.push(S),f.set(S.document_id,A)}let p=[];for(let S of f.values())p.push(Do(S,s,i,n,c));let u=p.sort((S,A)=>At(S,i,n,c)-At(A,i,n,c));return(o?On(u):u).slice(0,r)}function wt(t,e,n,r,o,i){let s=e?O[e]:void 0,a=Math.max(n,n*Re,So),c=s===void 0?t.all(ao,r,a):t.all(co,r,s,a);return(s===void 0?Fn(c,i,o,n,!0):Fn(c,i,o,n,!1)).map(p=>({title:p.doc_title,documentId:p.document_id,sectionTitle:p.section_title||void 0,snippet:kn(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 q=null,pe=null;function Io(){q?.close(),q=null,pe=null}function To(t,e){if(q&&pe===e)return q;q?.close();let n=new t(e,{readonly:!0,fileMustExist:!0});return q=n,pe=e,n.pragma("mmap_size = 268435456"),n.pragma("cache_size = -8000"),n.pragma("query_only = ON"),n}function Co(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 Ro(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 No(t,e,n,r){await Q();let o=Co(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=Yr(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 Jr(t,e,n,r,o,i,s){let a=Wr(t,e);return at({all(c,...f){return a.prepare(c).all(...f)}},n,r,o,i,s)}async function sn(){let e=(await import("better-sqlite3")).default;return{kind:"better-sqlite3",resetCache:Qr,buildSearchIndex:(n,r,o)=>Vr(e,n,r,o),searchIndex:(n,r,o,i,s,a,c)=>Promise.resolve(Jr(e,i,r,o,s,a,c))}}import{readFile as Kr,stat as to,writeFile as eo}from"fs/promises";var Qt=null,N=null;async function Wt(){return Qt||(Qt=(async()=>{let t=(await import("@sqlite.org/sqlite-wasm")).default;return t()})()),Qt}function no(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 ro(t){let e=await to(t);if(N&&N.dbPath===t&&N.mtimeMs===e.mtimeMs)return N.db;N?.db.close();let n=await Wt(),r=n.capi,o=n.wasm,i=new Uint8Array(await Kr(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 an(){N?.db.close(),N=null}async function oo(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 io(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 so(t,e,n){await F();let r=await Wt(),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=io(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 oo(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 eo(t,p),o.close(),an()}async function ao(t,e,n,r,o,i){let s=await ro(t);return at(no(s),e,n,r,o,i)}async function cn(){return await Wt(),{kind:"sqlite-wasm",resetCache:an,buildSearchIndex:so,searchIndex:(t,e,n,r,o,i,s)=>ao(r,e,n,o,i,s)}}var ut=null,qt=null;async function co(){try{let e=await sn();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 cn();return it("doc-index: using @sqlite.org/sqlite-wasm SQLite backend"),t}async function Yt(){return ut||(ut=co().then(t=>(qt=t,t))),ut}function un(){qt?.resetCache(),ut=null,qt=null}function ln(){un()}async function dn(t,e,n){await(await Yt()).buildSearchIndex(t,e,n)}import{unified as xn}from"unified";import _n from"remark-parse";import En from"remark-gfm";import{toString as dt}from"mdast-util-to-string";var uo=/^(.+?)(\d+\+)?(对象|枚举|错误码)说明$/,lo=/^\[h2\]([A-Za-z][A-Za-z0-9]*)(\d+\+)?$/,mo=/^(.{2,20}?)\s*[((]([A-Za-z][a-zA-Z0-9]{1,40})[))]\s*$/,fo=/^([A-Za-z@][A-Za-z0-9@]*?)(\d+\+)?$/,po=/^(系统能力|元服务API|参数|返回值|说明|\*\*|表格|\|)/;function lt(t){let e=t.trim(),n=e.match(fo);return n?n[1]:e}function go(t){let e=t.match(uo);if(!e)return;let n=lt(e[1].trim());return{displayTitle:t,symbolName:n,searchExtras:[n,e[3]]}}function ho(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?go(e)??(()=>{let n=e.match(lo);if(n){let r=n[1];return{displayTitle:e,symbolName:r,searchExtras:[r]}}})()??(()=>{let n=e.match(mo);if(!n)return;let r=n[1].trim(),o=n[2].trim();return{displayTitle:e,symbolName:o,searchExtras:[r,o]}})()??ho(e)??{displayTitle:e,searchExtras:[]}:{displayTitle:"",searchExtras:[]}}function So(t){if(t.length<2||t.length>36||po.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 mn(t){for(let e of t){let n=e.trim().replace(/[。.!!??;;]+$/u,"").trim();if(So(n))return n}return""}function fn(t,e,n){let r=[t,...n.searchExtras,e].filter(Boolean);return[...new Set(r)].join(" ")}var yo=/[A-Z][a-zA-Z0-9]+(?:\.[a-zA-Z][a-zA-Z0-9]+)*/g,$=/@[A-Z][a-zA-Z]+/g,xo=/^[A-Z][A-Za-z0-9]*\.[A-Za-z][A-Za-z0-9]+/,_o=/^[A-Z][A-Za-z0-9]+(?:\([^)]*\))?$/,Eo=/^[a-z0-9]+(?:[-_][a-z0-9]+)+$/,Ao=new Set(["API","Action","Code","Connect","Connection","Context","Direction","Element","Elements","Entry","Focused","Module","Modules","Name","Names","Stage","Type","Types","Value","Values","Rect","Error"]),bo=new Set(["HAP","HSP","HAR","NAPI","CAPI","NDK","ArkTS","ArkUI","OHPM"]),To=new Set(["JSON","Object","Array","Promise","console","Math","Date","String","Number","Boolean","Error","Function","Map","Set","RegExp"]);function An(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(yo)){let s=i[0];Io(s)&&n.add(s)}for(let i of o.matchAll($))n.add(i[0])}return k([...n])}function Io(t){let e=t.trim();if(!e||$.test(e))return!!e;if(e.includes(".")){let n=e.split(".")[0]??"";return To.has(n)?!1:/^[A-Z]/.test(n)}return Ao.has(e)?!1:bo.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 pn(t){let e=t.trim();return!!(!e||Eo.test(e)||e.length>28&&!/[A-Z\u4e00-\u9fff]/.test(e)&&/^[a-z0-9_-]+$/.test(e))}function bn(t,e){let n=e.jsonTitle?.trim(),r=Ro(t,"").trim(),o=e.fileName.trim();return n&&!pn(n)?n:r&&!pn(r)?r:n||r||o}function Tn(t){return xo.test(t.trim())}function Vt(t){let e=t.trim().replace(/\([^)]*\)$/,""),n=lt(e);return _o.test(n)}function mt(t){let e=t.trim();return e?$.test(e)||Tn(e)||Vt(e)?!0:!!U(e).symbolName:!1}function Do(t){let e=t.trim();return!(!e||Tn(e)||Vt(e))}function wo(t){let e=new Set,n=[];for(let r of t){let o=r.trim();!Do(o)||e.has(o)||(e.add(o),n.push(o))}return n}function gn(t){if(!t.includes("."))return 0;let e=t.split(".").pop()??"";return/^[a-z]/.test(e)?1:2}function Co(t,e){let n=gn(t)-gn(e);return n!==0?n:t.localeCompare(e)}function In(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(Co),[...n,...o].slice(0,he)}function ft(t){return t.replace(/\s+/g," ").trim()}function hn(t){return t.replace(/\\([\\`*_{}[\]()#+.!-])/g,"$1")}function Ro(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=hn(n[r].trim()),i=o.match(/^#+\s+(.+)$/);if(i)return hn(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 Dn(t){let e=ft(t.join(" "));if(e.length<=Q)return e;let n=e.slice(0,Q);return e.length<=Q+yt?n:`${n} ${e.slice(-yt)}`}function No(t){let e=wo(t).join(" ");return e.length<=xt?e:e.slice(0,xt)}function wn(t){let e=ft(t),{text:n,excerptTruncated:r}=en(e,Se);return{leadText:n,excerptTruncated:r}}function Lo(t,e){let{leadText:n,excerptTruncated:r}=wn(t);return{leadText:n,excerptTruncated:r||!!e.trim()}}function Cn(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)Cn(r,e);return}let n=ft(dt(t));n&&e.bodyParts.push(n)}function Oo(t){let e=xn().use(_n).use(En).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(),Cn(s,r)}return o(),n.length===0?[{sectionTitle:"",bodyParts:[],codeBlocks:[]}]:n}function Po(t){return oe.test(t)}function Bo(t){return t.filter(e=>e.sectionTitle&&mt(e.sectionTitle)).length}function Mo(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 Sn(t){let e=t.trim();return!e||$.test(e)?$.test(e):/对象说明$|枚举说明$/.test(e)?!0:Vt(e)}function ko(t){let e=t.filter(u=>!u.sectionTitle||!mt(u.sectionTitle)),n=t.filter(u=>u.sectionTitle&&mt(u.sectionTitle)),r=n.filter(u=>Sn(u.sectionTitle)),o=n.filter(u=>!Sn(u.sectionTitle)),i=Math.max(0,re-r.length),s=o.slice(0,i),a=o.slice(i),c=a.filter(u=>yn(u.sectionTitle)),f=a.filter(u=>!yn(u.sectionTitle)),p=[];for(let u=0;u<f.length;u+=St)p.push(Mo(f.slice(u,u+St)));return[...e,...r,...s,...c,...p]}function Fo(t,e,n){let r=t.split(/\r?\n/).length,o=Bo(e);return o===0?!1:Po(n)?r>=ee&&o>=ne:r>=Kt&&o>=te}var vo=/^\[h2\][A-Za-z]/;function yn(t){return vo.test(t.trim())}function Rn(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 zo(t,e,n,r){let o=Rn(t),i=An(n,r);return e.symbolName&&i.push(e.symbolName),In([...o,...i],o)}function Ho(t,e){let n=Dn(t.bodyParts),r=t.sectionTitle.trim(),o=U(r),i=mn(t.bodyParts),s=fn(r,i,o),a=Rn(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}=Lo(n,r);return{documentId:e.documentId,catalogId:e.catalogId,docTitle:e.docTitle,sectionTitle:r,titleTokens:c,headingsText:s,apiSymbols:zo(r,o,f,t.codeBlocks),bodySample:n,leadText:p,excerptTruncated:u}}function Nn(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)){Nn(n.children,e);continue}let r=ft(dt(n));r&&e.bodyParts.push(r)}}function jo(t){let e=xn().use(_n).use(En).parse(t),n={headings:[],bodyParts:[],codeBlocks:[]};return Nn(e.children,n),n}function Zo(t,e){let n=jo(t),r=e.docTitle?.trim()||e.documentId,o=Dn(n.bodyParts),i=[r,...n.headings,o].join(" "),{leadText:s,excerptTruncated:a}=wn(o);return{documentId:e.documentId,catalogId:e.catalogId,docTitle:r,sectionTitle:"",titleTokens:r,headingsText:No(n.headings),apiSymbols:In(An(i,n.codeBlocks)),bodySample:o,leadText:s,excerptTruncated:a}}function Ln(t,e){let n=e.docTitle?.trim()||e.documentId,r=Oo(t);return Fo(t,r,e.documentId)?ko(r).filter(o=>o.sectionTitle||o.bodyParts.length>0||o.codeBlocks.length>0).map(o=>Ho(o,{...e,docTitle:n})):[Zo(t,{...e,docTitle:n})]}async function Uo(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 $o(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=_e[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 Go(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 Xo(t,e){let n=$o(t,e);if(!n)return[];let r=await y.promises.readFile(t,"utf-8"),o=bn(r,{jsonTitle:await Go(t),fileName:n.docTitle});return Ln(r,{...n,docTitle:o})}async function Qo(t,e,n){let r=_.join(e,"search.db");return await dn(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 Wo(t){let e=await Uo(t),n=[];for(let r of e){let o=await Xo(r,t);n.push(...o)}return n}function qo(t,e){return{indexVersion:X,docsZipSha256:t.docsZipSha256,termsHash:t.termsHash,synonymsHash:t.synonymsHash,segmentCount:e,builtAt:Date.now(),builtBy:t.builtBy}}async function Pn(t){t.lexiconDir&&Dt(t.lexiconDir);try{let e=await Wo(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 Qo(e,t.tmpDir,t.onProgress),r=qo(t,n);return await y.promises.writeFile(_.join(t.tmpDir,"build-meta.json"),JSON.stringify(r,null,2)),await Ne(t.tmpDir),r}finally{t.lexiconDir&&Dt(null)}}async function Bn(){return y.promises.mkdtemp(_.join(On.tmpdir(),"deveco-docs-"))}async function Yo(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 Mn(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 Yo(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 ti(t){let e=At();await h.promises.mkdir(z.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 A=Ro(o,i,S.source);s.run(A,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 Po(t,e,n,r,o,i,s){let a=To(t,e);return wt({all(c,...f){return a.prepare(c).all(...f)}},n,r,o,i,s)}async function zn(){let e=(await import("better-sqlite3")).default;return{kind:"better-sqlite3",resetCache:Io,buildSearchIndex:(n,r,o)=>No(e,n,r,o),searchIndex:(n,r,o,i,s,a,c)=>Promise.resolve(Po(e,i,r,o,s,a,c))}}import{readFile as Oo,stat as Lo,writeFile as Bo}from"fs/promises";var ge=null,M=null;async function he(){return ge||(ge=(async()=>{let t=(await import("@sqlite.org/sqlite-wasm")).default;return t()})()),ge}function Mo(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 ko(t){let e=await Lo(t);if(M&&M.dbPath===t&&M.mtimeMs===e.mtimeMs)return M.db;M?.db.close();let n=await he(),r=n.capi,o=n.wasm,i=new Uint8Array(await Oo(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 Hn(){M?.db.close(),M=null}async function vo(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 Fo(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 he(),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=Fo(o,i,s),f=e.length;for(let u=0;u<f;u+=j){let b=e.slice(u,u+j),S=await Promise.all(b.map(async A=>({source:A,searchText:await bt(A)})));await vo(o,a,c,S),await n?.(Math.min(u+b.length,f),f)}o.exec("ANALYZE");let p=r.capi.sqlite3_js_db_export(o);await Bo(t,p),o.close(),Hn()}async function Ho(t,e,n,r,o,i){let s=await ko(t);return wt(Mo(s),e,n,r,o,i)}async function Se(){return await he(),{kind:"sqlite-wasm",resetCache:Hn,buildSearchIndex:zo,searchIndex:(t,e,n,r,o,i,s)=>Ho(r,e,n,o,i,s)}}var It=null,ye=null;function jo(){return J.existsSync(et())}function Uo(t){let e=et(),n={backend:"sqlite-wasm",reason:"better-sqlite3-load-failed",message:t,createdAt:new Date().toISOString()};J.mkdirSync(jn.dirname(e),{recursive:!0}),it(e),J.writeFileSync(e,JSON.stringify(n,null,2))}async function Zo(){if(jo())return Se();try{let t=await zn();return z("doc-index: using better-sqlite3 SQLite backend"),t}catch(t){let e=t instanceof Error?t.message:String(t);Uo(e),z(`doc-index: better-sqlite3 unavailable (${e}); falling back to sqlite-wasm`)}return Se()}async function xe(){return It||(It=Zo().then(t=>(ye=t,t))),It}function Un(){ye?.resetCache(),It=null,ye=null}function Tt(){Un()}async function Zn(t,e,n){await(await xe()).buildSearchIndex(t,e,n)}import{unified as Yn}from"unified";import Vn from"remark-parse";import Kn from"remark-gfm";import{toString as Rt}from"mdast-util-to-string";var $o=/^(.+?)(\d+\+)?(对象|枚举|错误码)说明$/,Go=/^\[h2\]([A-Za-z][A-Za-z0-9]*)(\d+\+)?$/,Xo=/^(.{2,20}?)\s*[((]([A-Za-z][a-zA-Z0-9]{1,40})[))]\s*$/,Wo=/^([A-Za-z@][A-Za-z0-9@]*?)(\d+\+)?$/,Qo=/^(系统能力|元服务API|参数|返回值|说明|\*\*|表格|\|)/;function Ct(t){let e=t.trim(),n=e.match(Wo);return n?n[1]:e}function qo(t){let e=t.match($o);if(!e)return;let n=Ct(e[1].trim());return{displayTitle:t,symbolName:n,searchExtras:[n,e[3]]}}function Jo(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?qo(e)??(()=>{let n=e.match(Go);if(n){let r=n[1];return{displayTitle:e,symbolName:r,searchExtras:[r]}}})()??(()=>{let n=e.match(Xo);if(!n)return;let r=n[1].trim(),o=n[2].trim();return{displayTitle:e,symbolName:o,searchExtras:[r,o]}})()??Jo(e)??{displayTitle:e,searchExtras:[]}:{displayTitle:"",searchExtras:[]}}function Yo(t){if(t.length<2||t.length>36||Qo.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 $n(t){for(let e of t){let n=e.trim().replace(/[。.!!??;;]+$/u,"").trim();if(Yo(n))return n}return""}function Gn(t,e,n){let r=[t,...n.searchExtras,e].filter(Boolean);return[...new Set(r)].join(" ")}var Vo=/[A-Z][a-zA-Z0-9]+(?:\.[a-zA-Z][a-zA-Z0-9]+)*/g,lt=/@[A-Z][a-zA-Z]+/g,Ko=/^[A-Z][A-Za-z0-9]*\.[A-Za-z][A-Za-z0-9]+/,ti=/^[A-Z][A-Za-z0-9]+(?:\([^)]*\))?$/,ei=/^[a-z0-9]+(?:[-_][a-z0-9]+)+$/,ni=new Set(["API","Action","Code","Connect","Connection","Context","Direction","Element","Elements","Entry","Focused","Module","Modules","Name","Names","Stage","Type","Types","Value","Values","Rect","Error"]),ri=new Set(["HAP","HSP","HAR","NAPI","CAPI","NDK","ArkTS","ArkUI","OHPM"]),oi=new Set(["JSON","Object","Array","Promise","console","Math","Date","String","Number","Boolean","Error","Function","Map","Set","RegExp"]);function tr(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(Vo)){let s=i[0];ii(s)&&n.add(s)}for(let i of o.matchAll(lt))n.add(i[0])}return X([...n])}function ii(t){let e=t.trim();if(!e||lt.test(e))return!!e;if(e.includes(".")){let n=e.split(".")[0]??"";return oi.has(n)?!1:/^[A-Z]/.test(n)}return ni.has(e)?!1:ri.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 Xn(t){let e=t.trim();return!!(!e||ei.test(e)||e.length>28&&!/[A-Z\u4e00-\u9fff]/.test(e)&&/^[a-z0-9_-]+$/.test(e))}function er(t,e){let n=e.jsonTitle?.trim(),r=ui(t,"").trim(),o=e.fileName.trim();return n&&!Xn(n)?n:r&&!Xn(r)?r:n||r||o}function nr(t){return Ko.test(t.trim())}function Ee(t){let e=t.trim().replace(/\([^)]*\)$/,""),n=Ct(e);return ti.test(n)}function Nt(t){let e=t.trim();return e?lt.test(e)||nr(e)||Ee(e)?!0:!!ut(e).symbolName:!1}function si(t){let e=t.trim();return!(!e||nr(e)||Ee(e))}function ai(t){let e=new Set,n=[];for(let r of t){let o=r.trim();!si(o)||e.has(o)||(e.add(o),n.push(o))}return n}function Wn(t){if(!t.includes("."))return 0;let e=t.split(".").pop()??"";return/^[a-z]/.test(e)?1:2}function ci(t,e){let n=Wn(t)-Wn(e);return n!==0?n:t.localeCompare(e)}function rr(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(ci),[...n,...o].slice(0,He)}function Pt(t){return t.replace(/\s+/g," ").trim()}function Qn(t){return t.replace(/\\([\\`*_{}[\]()#+.!-])/g,"$1")}function ui(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=Qn(n[r].trim()),i=o.match(/^#+\s+(.+)$/);if(i)return Qn(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 or(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 li(t){let e=ai(t).join(" ");return e.length<=vt?e:e.slice(0,vt)}function ir(t){let e=Pt(t),{text:n,excerptTruncated:r}=Mn(e,je);return{leadText:n,excerptTruncated:r}}function di(t,e){let{leadText:n,excerptTruncated:r}=ir(t);return{leadText:n,excerptTruncated:r||!!e.trim()}}function sr(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)sr(r,e);return}let n=Pt(Rt(t));n&&e.bodyParts.push(n)}function mi(t){let e=Yn().use(Vn).use(Kn).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(),sr(s,r)}return o(),n.length===0?[{sectionTitle:"",bodyParts:[],codeBlocks:[]}]:n}function fi(t){return Ce.test(t)}function pi(t){return t.filter(e=>e.sectionTitle&&Nt(e.sectionTitle)).length}function gi(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 qn(t){let e=t.trim();return!e||lt.test(e)?lt.test(e):/对象说明$|枚举说明$/.test(e)?!0:Ee(e)}function hi(t){let e=t.filter(u=>!u.sectionTitle||!Nt(u.sectionTitle)),n=t.filter(u=>u.sectionTitle&&Nt(u.sectionTitle)),r=n.filter(u=>qn(u.sectionTitle)),o=n.filter(u=>!qn(u.sectionTitle)),i=Math.max(0,Te-r.length),s=o.slice(0,i),a=o.slice(i),c=a.filter(u=>Jn(u.sectionTitle)),f=a.filter(u=>!Jn(u.sectionTitle)),p=[];for(let u=0;u<f.length;u+=Mt)p.push(gi(f.slice(u,u+Mt)));return[...e,...r,...s,...c,...p]}function Si(t,e,n){let r=t.split(/\r?\n/).length,o=pi(e);return o===0?!1:fi(n)?r>=De&&o>=Ie:r>=Ae&&o>=we}var yi=/^\[h2\][A-Za-z]/;function Jn(t){return yi.test(t.trim())}function ar(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 xi(t,e,n,r){let o=ar(t),i=tr(n,r);return e.symbolName&&i.push(e.symbolName),rr([...o,...i],o)}function Ei(t,e){let n=or(t.bodyParts),r=t.sectionTitle.trim(),o=ut(r),i=$n(t.bodyParts),s=Gn(r,i,o),a=ar(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}=di(n,r);return{documentId:e.documentId,catalogId:e.catalogId,docTitle:e.docTitle,sectionTitle:r,titleTokens:c,headingsText:s,apiSymbols:xi(r,o,f,t.codeBlocks),bodySample:n,leadText:p,excerptTruncated:u}}function cr(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)){cr(n.children,e);continue}let r=Pt(Rt(n));r&&e.bodyParts.push(r)}}function _i(t){let e=Yn().use(Vn).use(Kn).parse(t),n={headings:[],bodyParts:[],codeBlocks:[]};return cr(e.children,n),n}function bi(t,e){let n=_i(t),r=e.docTitle?.trim()||e.documentId,o=or(n.bodyParts),i=[r,...n.headings,o].join(" "),{leadText:s,excerptTruncated:a}=ir(o);return{documentId:e.documentId,catalogId:e.catalogId,docTitle:r,sectionTitle:"",titleTokens:r,headingsText:li(n.headings),apiSymbols:rr(tr(i,n.codeBlocks)),bodySample:o,leadText:s,excerptTruncated:a}}function ur(t,e){let n=e.docTitle?.trim()||e.documentId,r=mi(t);return Si(t,r,e.documentId)?hi(r).filter(o=>o.sectionTitle||o.bodyParts.length>0||o.codeBlocks.length>0).map(o=>Ei(o,{...e,docTitle:n})):[bi(t,{...e,docTitle:n})]}async function Ai(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 wi(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=$e[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 Di(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 Ii(t,e){let n=wi(t,e);if(!n)return[];let r=await x.promises.readFile(t,"utf-8"),o=er(r,{jsonTitle:await Di(t),fileName:n.docTitle});return ur(r,{...n,docTitle:o})}async function Ti(t,e,n){let r=_.join(e,"search.db");return await Zn(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 Ci(t){let e=await Ai(t),n=[];for(let r of e){let o=await Ii(r,t);n.push(...o)}return n}function Ri(t,e){return{indexVersion:H,docsZipSha256:t.docsZipSha256,termsHash:t.termsHash,synonymsHash:t.synonymsHash,segmentCount:e,builtAt:Date.now(),builtBy:t.builtBy}}async function dr(t){t.lexiconDir&&$t(t.lexiconDir);try{let e=await Ci(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 Ti(e,t.tmpDir,t.onProgress),r=Ri(t,n);return await x.promises.writeFile(_.join(t.tmpDir,"build-meta.json"),JSON.stringify(r,null,2)),await on(t.tmpDir),r}finally{t.lexiconDir&&$t(null)}}async function mr(){return x.promises.mkdtemp(_.join(lr.tmpdir(),"deveco-docs-"))}async function Ni(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 fr(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 Ni(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 gr(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 Bi(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 Pi(e);for(let o of r.getEntries()){let i=T.resolve(n,o.entryName);if(!Y(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 fr(t)}async function Mi(){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 pr(t,e,n){e?.start(n),await B({state:"installing",phase:1,phaseLabel:"Installing index",message:n}),await un(t),Tt(),e&&(e.text="Documentation index installed.")}async function ki(t,e){try{return await pr(t,e,"Installing documentation index\u2026"),await _e(e),!0}catch(n){if(qt(n))throw n}try{return await ln(),Tt(),await pr(t,e,"Retrying documentation index install\u2026"),await _e(e),!0}catch(n){if(qt(n))throw n;let r=n instanceof Error?n.message:String(n);return await gr(`Bundled index install failed; falling back to local rebuild: ${r}`),!1}}async function vi(t,e,n){let r=C(),o=await mr();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 Bi(o),await dr({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 Mi(),Tt()}async function _e(t){await B({state:"done",phase:3,phaseLabel:"Done",message:"Documentation ready.",error:null}),t?.succeed("Documentation ready.")}async function Fi(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 gr(`ERROR: ${n}`),e?.fail(n),t}async function Hi(){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 ji(){let t=await Hi();return Oi.lock(t,{stale:1800*1e3})}async function Ui(){let t=v(),e=(t?await ht(t):null)??await Kt();if(!e)throw new Error("docs.zip not found");return e}async function Zi(t,e){let n=await Ui(),r=t.force||await Sn(t.force),o=await ee(t.force);if(!r&&!o&&ne()){await Fi(e);return}!t.force&&cn(n)&&await ki(n,e)||(await vi(t,n,e),await _e(e))}var Ot=class{static async run(e={}){let n=e.background??!1,o=e.quiet??n?void 0:Li({text:"Checking documentation\u2026",color:"cyan"}),i;try{e.assumeStorageSafe||await st({mode:"write"}),i=await ji(),await Vt(hn("Starting documentation setup\u2026")),await Zi(e,o)}catch(s){if(i)return zi(s,o);throw s}finally{i&&await i()}}};var $i=process.env.DEVECO_CLI_POSTINSTALL?"postinstall":"doc-init";Ot.run({background:!0,builtBy:$i}).then(()=>{process.exit(0)}).catch(()=>{process.exit(1)});
|
package/docs.zip
CHANGED
|
Binary file
|
package/index.zip
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deveco-test/deveco-cli",
|
|
3
|
-
"version": "1.3.0-Test.
|
|
3
|
+
"version": "1.3.0-Test.6",
|
|
4
4
|
"description": "HarmonyOS application development command line tool",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -11,7 +11,9 @@
|
|
|
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",
|
|
@@ -45,11 +47,11 @@
|
|
|
45
47
|
"@eslint/js": "^10.0.1",
|
|
46
48
|
"@types/adm-zip": "^0.5.8",
|
|
47
49
|
"@types/better-sqlite3": "^7.6.13",
|
|
50
|
+
"@types/yauzl": "^2.10.3",
|
|
48
51
|
"@types/fs-extra": "^11.0.4",
|
|
49
52
|
"@types/global-agent": "^3.0.0",
|
|
50
53
|
"@types/node": "^25.6.0",
|
|
51
54
|
"@types/turndown": "^5.0.5",
|
|
52
|
-
"@types/yauzl": "^2.10.3",
|
|
53
55
|
"eslint": "^10.2.1",
|
|
54
56
|
"generate-license-file": "^4.2.1",
|
|
55
57
|
"husky": "^9.1.7",
|
|
@@ -61,7 +63,6 @@
|
|
|
61
63
|
"typescript-eslint": "^8.59.1"
|
|
62
64
|
},
|
|
63
65
|
"dependencies": {
|
|
64
|
-
"@deveco-test/deveco-cli": "file:deveco-test-deveco-cli-1.3.0-Test.4.tgz",
|
|
65
66
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
66
67
|
"@node-rs/jieba": "^2.0.1",
|
|
67
68
|
"@sqlite.org/sqlite-wasm": "^3.49.1-build4",
|
|
@@ -86,7 +87,8 @@
|
|
|
86
87
|
"zod": "^4.4.3"
|
|
87
88
|
},
|
|
88
89
|
"optionalDependencies": {
|
|
89
|
-
"better-sqlite3": "^12.11.1"
|
|
90
|
+
"better-sqlite3": "^12.11.1",
|
|
91
|
+
"@node-rs/jieba-wasm32-wasi": "2.0.1"
|
|
90
92
|
},
|
|
91
93
|
"overrides": {
|
|
92
94
|
"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)) {
|