@deveco-test/deveco-cli 1.2.0 → 1.3.0-Test.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/LICENSE +21 -21
- package/README.md +854 -766
- package/SKILL.md +130 -116
- package/THIRD-PARTY-LICENSES +5078 -3536
- package/dist/cli.js +171 -76
- package/dist/internal/doc-init-background.js +64 -0
- package/docs.zip +0 -0
- package/index.zip +0 -0
- package/package.json +24 -8
- package/scripts/install-better-sqlite3.mjs +51 -0
- package/scripts/lib/better-sqlite3-vendor.mjs +129 -0
- package/scripts/lib/doc-init-log-path.mjs +17 -0
- package/scripts/postinstall.mjs +47 -0
- package/templates/application/AppScope/app.json5 +10 -10
- package/templates/application/AppScope/resources/base/element/string.json +8 -8
- package/templates/application/AppScope/resources/base/media/layered_image.json +6 -6
- package/templates/application/build-profile.json5 +41 -41
- package/templates/application/code-linter.json5 +31 -31
- package/templates/application/entry/build-profile.json5 +32 -32
- package/templates/application/entry/gitignore.txt +6 -0
- package/templates/application/entry/hvigorfile.ts +7 -7
- package/templates/application/entry/obfuscation-rules.txt +19 -19
- package/templates/application/entry/oh-package.json5 +10 -10
- package/templates/application/entry/src/main/ets/entryability/EntryAbility.ets +62 -62
- package/templates/application/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets +30 -30
- package/templates/application/entry/src/main/ets/pages/Index.ets +37 -37
- package/templates/application/entry/src/main/module.json5 +49 -49
- package/templates/application/entry/src/main/resources/base/element/color.json +7 -7
- package/templates/application/entry/src/main/resources/base/element/float.json +8 -8
- package/templates/application/entry/src/main/resources/base/element/string.json +15 -15
- package/templates/application/entry/src/main/resources/base/media/layered_image.json +6 -6
- package/templates/application/entry/src/main/resources/base/profile/backup_config.json +2 -2
- package/templates/application/entry/src/main/resources/base/profile/main_pages.json +5 -5
- package/templates/application/entry/src/main/resources/dark/element/color.json +7 -7
- package/templates/application/gitignore.txt +12 -0
- package/templates/application/hvigor/hvigor-config.json5 +23 -23
- package/templates/application/hvigorfile.ts +7 -7
- package/templates/application/oh-package.json5 +10 -10
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import*as p from"fs";import*as M from"path";import ko from"adm-zip";import Fo from"proper-lockfile";import vo from"ora";import*as A from"fs";import*as j from"path";var pt=["harmonyos-guides","harmonyos-references","best-practices","harmonyos-faqs","harmonyos-releases","harmonyos-roadmap"],$={"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 Q="1.8.0",ti=80*1024*1024,qt=280,Wt=6,Yt=100,Jt=3,Kt=28,gt=10,Vt=/API参考|APIReference/i;var te=6,X=700,ht=250,St=400,ee=1320,ne=120,re=450,oe=250,ie=500,se=480,ae=80,ce=200,ue=60,le=200,de=40,yt=120,B=500,me=Object.fromEntries(pt.map((t,e)=>[$[t],e])),D=Object.fromEntries(pt.map((t,e)=>[t,e]));import*as fe from"fs";import*as m from"path";import{homedir as pe}from"os";import{fileURLToPath as ge}from"url";var he="deveco-cli",Rn="docs";function q(){return m.join(pe(),".local","share",he,Rn)}function E(){return m.join(q(),".index")}function Se(){return m.join(E(),"build.lock")}function _t(){return m.join(E(),"build-status.json")}function W(){return m.join(E(),"build-meta.json")}function Y(){return m.join(E(),"search.db")}function k(){return m.join(E(),".tmp")}function ye(){return m.join(pe(),".local","share",he,"logs")}function Nn(t,e){let n=e;for(;!n.endsWith(`${m.sep}dist`)&&n!==m.dirname(n);)n=m.dirname(n);return n}function _e(t,e){return m.dirname(Nn(t,e))}function On(){let t=ge(import.meta.url),e=m.dirname(t);return t.includes(`${m.sep}dist${m.sep}`)?_e(t,e):m.join(e,"..","..","..")}function Ln(...t){let e=ge(import.meta.url),n=m.dirname(e);return e.includes(`${m.sep}dist${m.sep}`)?[m.join(_e(e,n),...t)]:[m.join(n,"..","..","..",...t)]}function Ee(...t){for(let e of Ln(...t))if(fe.existsSync(e))return e;return null}function O(){return Ee("docs.zip")}function Et(){return Ee("index.zip")}function xe(){return m.join(On(),"index","data")}import*as w from"fs";import*as L from"path";var P=["harmonyos-terms.txt","harmonyos-synonyms.json","harmonyos-stopwords.txt"],xt=null;function At(t){xt=t}function Ae(){if(xt)return xt;let t=E();if(P.every(o=>w.existsSync(L.join(t,o))))return t;let n=xe();if(P.every(o=>w.existsSync(L.join(n,o))))return n;throw new Error("Lexicon files not found. Install the documentation index first (index.zip).")}function H(t){let e=L.join(Ae(),t);return w.readFileSync(e,"utf-8")}function be(t,e){return w.readFileSync(L.join(e,t),"utf-8")}async function Te(t,e=Ae()){await w.promises.mkdir(t,{recursive:!0});for(let n of P){let r=L.join(e,n),o=L.join(t,n);await w.promises.copyFile(r,o)}}import*as bt from"fs";import*as Pn from"yauzl";function Tt(){let t=O();return t!==null&&bt.existsSync(t)}import*as h from"fs";import*as C from"path";import Ie from"adm-zip";var we=["search.db","build-meta.json",...P],Mn=["corpus.json","corpus-offsets.json","orama.dpack"];async function Bn(t){for(let e of Mn)await h.promises.rm(C.join(t,e),{force:!0})}async function kn(t){let e=await h.promises.readdir(t,{withFileTypes:!0});for(let n of e)n.name!==".index"&&await h.promises.rm(C.join(t,n.name),{recursive:!0,force:!0})}function Fn(t){let n=new Ie(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=E();await h.promises.mkdir(e,{recursive:!0});for(let n of we){let r=C.join(e,n);await h.promises.rm(r,{force:!0}),await h.promises.rename(C.join(t,n),r)}await Bn(e),await h.promises.rm(k(),{recursive:!0,force:!0})}function It(){let t=Et();return t!==null&&h.existsSync(t)}async function De(t){let e=Et();if(!e)throw new Error("index.zip not found");let n=Fn(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=k();await h.promises.rm(r,{recursive:!0,force:!0}),await h.promises.mkdir(r,{recursive:!0});let o=new Ie(e);for(let s of we){let a=o.getEntry(s);if(!a)throw new Error(`index.zip is missing ${s}`);await h.promises.writeFile(C.join(r,s),a.getData())}let i=JSON.parse(await h.promises.readFile(C.join(r,"build-meta.json"),"utf-8"));if(!h.existsSync(C.join(r,"search.db")))throw new Error("index.zip is missing search.db");return await vn(r),await h.promises.mkdir(q(),{recursive:!0}),await kn(q()),i}import{createHash as Ce}from"crypto";import*as Re from"fs";async function J(t){return new Promise((e,n)=>{let r=Ce("sha256"),o=Re.createReadStream(t);o.on("data",i=>r.update(i)),o.on("error",n),o.on("end",()=>e(r.digest("hex")))})}function Ne(t){return Ce("sha256").update(t,"utf8").digest("hex")}function Oe(t,e){let n=e?be(t,e):H(t);return Ne(n)}function K(t){return Oe("harmonyos-synonyms.json",t)}function V(t){return Oe("harmonyos-terms.txt",t)}var zn={state:"idle",phase:0,phaseLabel:"Idle",current:0,total:0,message:"",startedAt:0,updatedAt:0,error:null};async function Le(){try{let t=await A.promises.readFile(_t(),"utf-8");return JSON.parse(t)}catch{return{...zn}}}async function wt(t){let e=_t();await A.promises.mkdir(j.dirname(e),{recursive:!0}),await A.promises.writeFile(e,JSON.stringify(t,null,2))}function Pe(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 Le(),...t,updatedAt:Date.now()};return await wt(n),n}async function Dt(){let t=O();return t?J(t):null}async function Ct(){try{let t=await A.promises.readFile(W(),"utf-8");return JSON.parse(t)}catch{return null}}async function Rt(t=!1){if(t)return"no-index";let e=await Ct();if(!e||e.segmentCount===0)return"no-index";let n=await Dt();return n&&e.docsZipSha256!==n?"docs-changed":e.indexVersion!==Q?"engine-upgraded":e.termsHash!==V()?"terms-changed":e.synonymsHash!==K()?"synonyms-changed":null}function Nt(){if(!Tt()||!A.existsSync(Y())||!A.existsSync(W()))return!1;let t=j.dirname(Y());if(!P.every(e=>A.existsSync(j.join(t,e))))return!1;try{let e=A.readFileSync(W(),"utf-8");return JSON.parse(e).segmentCount>0}catch{return!1}}async function Me(t=!1){return t?!0:Tt()?Nt()?await Rt()!==null:!0:!1}import*as S from"fs";import*as Tn from"os";import*as _ from"path";var Be=new Set(["picker","dialog","sheet","panel","popup","menu","layout","view","gesture","animation","transition","recognizer","manager","kit"]);var ke=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"]),Fe=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 Hn=/@ohos\.[a-z][a-zA-Z0-9.]+/gi,jn=/\b[a-z][a-z0-9]*[A-Z][a-zA-Z0-9]+\b/g,Zn=/[A-Z][a-zA-Z0-9]{2,}/g,Un=/@[A-Z][a-zA-Z0-9]*/g,Gn=/[a-z][a-zA-Z0-9]*\.[a-zA-Z][a-zA-Z0-9]+/g,ve=6,$n=/^[a-z][a-z0-9]{2,}$/,Qn=/^([a-z][a-z0-9]{2,})\s+([a-z][a-z0-9]{2,})$/,Xn=/^@ohos\.[a-z][a-zA-Z0-9.]+$/i,qn=/^[a-z][a-z0-9]*[A-Z][a-zA-Z0-9]+$/,Wn=/^[A-Z][a-zA-Z0-9]+$/;function Ot(t){return Xn.test(t)}function Yn(t){return qn.test(t)&&t.length>=ve}function Jn(t){return Wn.test(t)}function Lt(t){return Ot(t)||Yn(t)||Jn(t)}function Kn(t){let e=t.trim().toLowerCase();return Fe.has(e)?!1:Be.has(e)}function Vn(t,e){let n=e.trim().charAt(0).toUpperCase(),r=e.trim().slice(1).toLowerCase();return`${t.trim().toLowerCase()}${n}${r}`}function tt(t){let n=t.replace(/^@ohos\./i,"").split(".").filter(Boolean);return n[n.length-1]?.trim()||void 0}function Pt(t){return[...t.matchAll(Hn)].map(e=>e[0])}function Mt(t,e=ve){let n=[];for(let r of t.matchAll(jn))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 b(t,e){let n=e.trim();if(!n)return;t.add(n);let r=n.toLowerCase();r!==n&&t.add(r)}function tr(t){let e=new Set;b(e,t);let n=tt(t);return n&&b(e,n),F([...e])}function Bt(t){if(Ot(t))return tr(t);let e=new Set;return b(e,t),F([...e])}function kt(t){let e=t.trim();if(/[A-Z]/.test(e))return null;let n=e.match(Qn);if(!n)return null;let r=n[1].toLowerCase(),o=n[2].toLowerCase();if(!$n.test(r)||ke.has(r)||!Kn(o))return null;let i=Vn(r,o);return{first:r,second:o,camelCase:i,lower:i.toLowerCase()}}function ze(t){let e=kt(t.trim());return!e||e.second!=="manager"?null:e}function Ft(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 He(t){let e=t.trim();if(Lt(e))return Bt(e);let n=new Set;for(let r of Pt(t)){b(n,r);let o=tt(r);o&&b(n,o)}for(let r of Mt(t))b(n,r);for(let r of t.matchAll(Un))n.add(r[0]);for(let r of t.matchAll(Gn))n.add(r[0]);for(let r of t.matchAll(Zn))r[0].length>=4&&n.add(r[0]);return F([...n])}function je(t){let e=t.trim();if(Lt(e))return Bt(e);let n=new Set,r=kt(e);r&&b(n,r.camelCase);for(let o of He(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 T={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 Ue(t){return T.pureApiSymbol.test(t.trim())}function Ze(t){let e=t.trim();return T.stageModelExact.test(e)||T.stageModelEnglishExact.test(e)}var er=[{matches:t=>T.uiAbilityLifecycleBoost.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.85},{catalog:"harmonyos-references",multiplier:.65},{catalog:"harmonyos-faqs",multiplier:.82}]},{matches:t=>Ze(t),weights:[{catalog:"harmonyos-guides",multiplier:1.85},{catalog:"harmonyos-references",multiplier:.55},{catalog:"harmonyos-faqs",multiplier:.85}]},{matches:t=>!Ze(t)&&T.stageModel.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.65},{catalog:"harmonyos-references",multiplier:.65}]},{matches:t=>T.entryAbilityPage.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.75},{catalog:"harmonyos-references",multiplier:.48}]},{matches:t=>T.declarePermissionBoost.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.65},{catalog:"best-practices",multiplier:.68}]},{matches:t=>T.stateDecoratorBoost.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.75},{catalog:"harmonyos-references",multiplier:.42}]},{matches:t=>T.stateManagement.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.6},{catalog:"best-practices",multiplier:.78}]},{matches:t=>T.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=>T.dialogPopupBoost.test(t),weights:[{catalog:"harmonyos-guides",multiplier:1.65},{catalog:"harmonyos-faqs",multiplier:.72},{catalog:"best-practices",multiplier:.72}]}];function nr(t,e){for(let{catalog:n,multiplier:r}of e){let o=D[n];t.set(o,(t.get(o)??1)*r)}}function Ge(t,e){for(let n of er)n.matches(t)&&nr(e,n.weights)}import{Jieba as rr}from"@node-rs/jieba";import{dict as or}from"@node-rs/jieba/dict.js";var et=null,vt=null,zt=null;function ir(){if(et)return et;let t=H("harmonyos-stopwords.txt");return et=new Set(t.split(`
|
|
2
|
+
`).map(e=>e.trim()).filter(Boolean)),et}function sr(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 ar(t){let e=ir(),n=[];for(let r of sr(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 cr(){let t=rr.withDict(or),e=H("harmonyos-terms.txt");return t.loadDict(Buffer.from(e,"utf-8")),t}async function v(){return vt||(zt||(zt=cr().then(t=>(vt=t,t))),zt)}async function ur(t){let e=await v();return ar(e.cutForSearch(t,!0))}async function nt(t,e){let n=t.trim();if(!n||e<=0)return"";let r=(await ur(n)).join(" ");return r.length<=e?r:r.slice(0,e)}async function lr(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 rt(t){let e=!!t.sectionTitle.trim(),n=t.titleTokens.trim(),r=e?se:ee,o=e?ce:re,i=e?await lr(t.apiSymbols,o):await nt(t.apiSymbols.join(" "),o),a=(await Promise.all([nt(n,e?ae:ne),Promise.resolve(i),nt(t.headingsText,e?ue:oe),nt(t.bodySample,e?le:ie)])).filter(Boolean).join(" ");return a.length<=r?a:a.slice(0,r)}var $e=["harmonyos-releases","harmonyos-roadmap"],dr=new Set($e.map(t=>D[t])),ys=$e.map(t=>`${$[t]}/`);function mr(t){return dr.has(t)}function Qe(t){let e=[],n=[];for(let r of t)mr(r.catalog_id)?n.push(r):e.push(r);return[...e,...n]}var fr=[{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 Z(t,e,n){let r=D[e];t.set(r,(t.get(r)??1)*n)}function pr(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)){Z(e,"harmonyos-guides",1.45),Z(e,"harmonyos-references",1.35);return}(o||i)&&Z(e,"harmonyos-references",1.55),/\b[A-Z][a-zA-Z]*(Gesture|Dialog|Sheet|Transition|Recognizer)\b/.test(n)&&Z(e,"harmonyos-references",1.75)}function Xe(t){let e=new Map,n=t.trim();if(!n)return e;let r=Ue(n);pr(n,e),Ge(n,e);for(let o of fr)o.pattern.test(n)&&(o.skipForPureApiSymbol&&r||Z(e,o.catalog,o.multiplier));return e}function ot(t){process.env.DEVECO_CLI_DEBUG&&console.log(`[DEBUG] ${t}`)}function qe(t,e,n=200){let r=t.replace(/\s+/g," ").trim();if(r.length<=n)return r;let o=e.split(/\s+/).map(u=>u.trim()).filter(Boolean),i=0;for(let u of o){let x=r.toLowerCase().indexOf(u.toLowerCase());if(x>=0){i=x;break}}let s=Math.max(0,i-40),a=Math.min(r.length,s+n),c=r.slice(s,a).trim(),f=s>0?"...":"",g=a<r.length?"...":"";return`${f}${c}${g}`}var gr=`
|
|
3
|
+
SELECT d.document_id, d.doc_title, s.section_title, s.lead_text, d.catalog_id,
|
|
4
|
+
bm25(segments_fts) AS bm25
|
|
5
|
+
FROM segments_fts
|
|
6
|
+
JOIN segments s ON s.id = segments_fts.rowid
|
|
7
|
+
JOIN documents d ON d.id = s.doc_id
|
|
8
|
+
WHERE segments_fts MATCH ?
|
|
9
|
+
ORDER BY bm25(segments_fts)
|
|
10
|
+
LIMIT ?
|
|
11
|
+
`,hr=`
|
|
12
|
+
SELECT d.document_id, d.doc_title, s.section_title, s.lead_text, d.catalog_id,
|
|
13
|
+
bm25(segments_fts) AS bm25
|
|
14
|
+
FROM segments_fts
|
|
15
|
+
JOIN segments s ON s.id = segments_fts.rowid
|
|
16
|
+
JOIN documents d ON d.id = s.doc_id
|
|
17
|
+
WHERE segments_fts MATCH ? AND d.catalog_id = ?
|
|
18
|
+
ORDER BY bm25(segments_fts)
|
|
19
|
+
LIMIT ?
|
|
20
|
+
`,Sr=3.5,yr=1.4,_r=4,Er=1.8,xr=1.35,Ar=3.5,br=1.8,Tr=120,We=6;function jt(t){return t.toLowerCase().replace(/[^\p{L}\p{N}@.]+/gu,"")}function Ir(t){return t.split(/[^\p{L}\p{N}@.]+/u).map(jt).filter(e=>e.length>=2)}function wr(t,e){return e.length>1&&e.every(n=>t.includes(n))}function Dr(t){return/^[a-z0-9]{1,4}$/.test(t.trim().toLowerCase())}function Cr(t,e){return t===e?Ar:t.startsWith(e)||t.includes(`@ohos.${e}`)?br:1}function Rr(t,e){let n=jt(e);if(n.length<2)return 1;let r=jt(t.doc_title);if(Dr(e))return Cr(r,n);if(r.includes(n))return _r;if(n.length>=We&&r.includes(n.slice(0,We)))return Er;let o=Ir(e);return wr(r,o)?xr:1}function Nr(t,e){return e<=1?t:t<0?t*e:t/e}function it(t,e,n,r){let o=t.bm25/(e.get(t.catalog_id)??1);return o=Nr(o,Rr(t,n)),r&&Ft(t.doc_title,t.section_title,r)&&(o/=Sr,t.catalog_id===D["harmonyos-references"]&&(o/=yr)),o}function Ht(t,e,n,r){return t.reduce((o,i)=>it(i,e,n,r)<it(o,e,n,r)?i:o)}function Or(t,e){return e.some(n=>t.section_title.includes(n)||t.doc_title.includes(n))}function Lr(t,e,n,r,o){if(o){let i=t.filter(s=>Ft(s.doc_title,s.section_title,o));if(i.length>0)return Ht(i,n,r,o)}if(e.length>0){let i=t.filter(s=>Or(s,e));if(i.length>0)return Ht(i,n,r,o)}return Ht(t,n,r,o)}function Ye(t,e,n,r,o){let i=Xe(e),s=je(e),c=ze(e)?.camelCase,f=new Map;for(let y of t){let I=f.get(y.document_id)??[];I.push(y),f.set(y.document_id,I)}let g=[];for(let y of f.values())g.push(Lr(y,s,i,n,c));let u=g.sort((y,I)=>it(y,i,n,c)-it(I,i,n,c));return(o?Qe(u):u).slice(0,r)}function st(t,e,n,r,o,i){let s=e?D[e]:void 0,a=Math.max(n,n*te,Tr),c=s===void 0?t.all(gr,r,a):t.all(hr,r,s,a);return(s===void 0?Ye(c,i,o,n,!0):Ye(c,i,o,n,!1)).map(g=>({title:g.doc_title,documentId:g.document_id,sectionTitle:g.section_title||void 0,snippet:qe(g.lead_text,o)}))}var at=`
|
|
21
|
+
CREATE TABLE documents (
|
|
22
|
+
id INTEGER PRIMARY KEY,
|
|
23
|
+
document_id TEXT NOT NULL UNIQUE,
|
|
24
|
+
catalog_id INTEGER NOT NULL,
|
|
25
|
+
doc_title TEXT NOT NULL
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
CREATE TABLE segments (
|
|
29
|
+
id INTEGER PRIMARY KEY,
|
|
30
|
+
doc_id INTEGER NOT NULL REFERENCES documents(id),
|
|
31
|
+
section_title TEXT NOT NULL DEFAULT '',
|
|
32
|
+
lead_text TEXT NOT NULL DEFAULT '',
|
|
33
|
+
search_text TEXT NOT NULL
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
CREATE VIRTUAL TABLE segments_fts USING fts5(
|
|
37
|
+
search_text,
|
|
38
|
+
content='segments',
|
|
39
|
+
content_rowid='id',
|
|
40
|
+
tokenize='unicode61'
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
CREATE TRIGGER segments_ai AFTER INSERT ON segments BEGIN
|
|
44
|
+
INSERT INTO segments_fts(rowid, search_text) VALUES (new.id, new.search_text);
|
|
45
|
+
END;
|
|
46
|
+
|
|
47
|
+
CREATE TRIGGER segments_ad AFTER DELETE ON segments BEGIN
|
|
48
|
+
INSERT INTO segments_fts(segments_fts, rowid, search_text) VALUES('delete', old.id, old.search_text);
|
|
49
|
+
END;
|
|
50
|
+
|
|
51
|
+
CREATE TRIGGER segments_au AFTER UPDATE ON segments BEGIN
|
|
52
|
+
INSERT INTO segments_fts(segments_fts, rowid, search_text) VALUES('delete', old.id, old.search_text);
|
|
53
|
+
INSERT INTO segments_fts(rowid, search_text) VALUES (new.id, new.search_text);
|
|
54
|
+
END;
|
|
55
|
+
|
|
56
|
+
CREATE INDEX segments_doc_id_idx ON segments(doc_id);
|
|
57
|
+
`;var z=null,Zt=null;function Pr(){z?.close(),z=null,Zt=null}function Mr(t,e){if(z&&Zt===e)return z;z?.close();let n=new t(e,{readonly:!0,fileMustExist:!0});return z=n,Zt=e,n.pragma("mmap_size = 268435456"),n.pragma("cache_size = -8000"),n.pragma("query_only = ON"),n}function Br(t,e){let n=new t(e);return n.pragma("journal_mode = OFF"),n.pragma("synchronous = OFF"),n.pragma("temp_store = MEMORY"),n.exec(at),n}function kr(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(`
|
|
58
|
+
INSERT INTO documents(document_id, catalog_id, doc_title)
|
|
59
|
+
VALUES (?, ?, ?)
|
|
60
|
+
`).run(n.documentId,n.catalogId,n.docTitle),c=Number(a.lastInsertRowid);return e.set(n.documentId,c),c}async function Fr(t,e,n,r){await v();let o=Br(t,e),i=new Map,s=o.prepare(`
|
|
61
|
+
INSERT INTO segments(doc_id, section_title, lead_text, search_text)
|
|
62
|
+
VALUES (?, ?, ?, ?)
|
|
63
|
+
`),a=n.length;for(let c=0;c<a;c+=B){let f=n.slice(c,c+B),g=await Promise.all(f.map(async x=>({source:x,searchText:await rt(x)})));o.transaction(x=>{for(let y of x){let I=kr(o,i,y.source);s.run(I,y.source.sectionTitle,y.source.leadText,y.searchText)}})(g),await r?.(Math.min(c+f.length,a),a)}o.exec("ANALYZE"),o.exec("VACUUM"),o.close()}function vr(t,e,n,r,o,i,s){let a=Mr(t,e);return st({all(c,...f){return a.prepare(c).all(...f)}},n,r,o,i,s)}async function Je(){let e=(await import("better-sqlite3")).default;return{kind:"better-sqlite3",resetCache:Pr,buildSearchIndex:(n,r,o)=>Fr(e,n,r,o),searchIndex:(n,r,o,i,s,a,c)=>Promise.resolve(vr(e,i,r,o,s,a,c))}}import{readFile as zr,stat as Hr,writeFile as jr}from"fs/promises";var Ut=null,N=null;async function Gt(){return Ut||(Ut=(async()=>{let t=(await import("@sqlite.org/sqlite-wasm")).default;return t()})()),Ut}function Zr(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 Ur(t){let e=await Hr(t);if(N&&N.dbPath===t&&N.mtimeMs===e.mtimeMs)return N.db;N?.db.close();let n=await Gt(),r=n.capi,o=n.wasm,i=new Uint8Array(await zr(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 Ke(){N?.db.close(),N=null}async function Gr(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]),e.step(),e.reset()}t.exec("COMMIT")}function $r(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 Qr(t,e,n){await v();let r=await Gt(),o=new r.oo1.DB(":memory:","c");o.exec(at);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) VALUES (?, ?, ?, ?)"),c=$r(o,i,s),f=e.length;for(let u=0;u<f;u+=B){let x=e.slice(u,u+B),y=await Promise.all(x.map(async I=>({source:I,searchText:await rt(I)})));await Gr(o,a,c,y),await n?.(Math.min(u+x.length,f),f)}o.exec("ANALYZE");let g=r.capi.sqlite3_js_db_export(o);await jr(t,g),o.close(),Ke()}async function Xr(t,e,n,r,o,i){let s=await Ur(t);return st(Zr(s),e,n,r,o,i)}async function Ve(){return await Gt(),{kind:"sqlite-wasm",resetCache:Ke,buildSearchIndex:Qr,searchIndex:(t,e,n,r,o,i,s)=>Xr(r,e,n,o,i,s)}}var ct=null,$t=null;async function qr(){try{let e=await Je();return ot("doc-index: using better-sqlite3 SQLite backend"),e}catch(e){ot(`doc-index: better-sqlite3 unavailable (${e.message}); falling back to sqlite-wasm`)}let t=await Ve();return ot("doc-index: using @sqlite.org/sqlite-wasm SQLite backend"),t}async function Qt(){return ct||(ct=qr().then(t=>($t=t,t))),ct}function tn(){$t?.resetCache(),ct=null,$t=null}function en(){tn()}async function nn(t,e,n){await(await Qt()).buildSearchIndex(t,e,n)}import{unified as dn}from"unified";import mn from"remark-parse";import fn from"remark-gfm";import{toString as lt}from"mdast-util-to-string";var Wr=/^(.+?)(\d+\+)?(对象|枚举|错误码)说明$/,Yr=/^\[h2\]([A-Za-z][A-Za-z0-9]*)(\d+\+)?$/,Jr=/^(.{2,20}?)\s*[((]([A-Za-z][a-zA-Z0-9]{1,40})[))]\s*$/,Kr=/^([A-Za-z@][A-Za-z0-9@]*?)(\d+\+)?$/,Vr=/^(系统能力|元服务API|参数|返回值|说明|\*\*|表格|\|)/;function ut(t){let e=t.trim(),n=e.match(Kr);return n?n[1]:e}function to(t){let e=t.match(Wr);if(!e)return;let n=ut(e[1].trim());return{displayTitle:t,symbolName:n,searchExtras:[n,e[3]]}}function eo(t){let e=ut(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?to(e)??(()=>{let n=e.match(Yr);if(n){let r=n[1];return{displayTitle:e,symbolName:r,searchExtras:[r]}}})()??(()=>{let n=e.match(Jr);if(!n)return;let r=n[1].trim(),o=n[2].trim();return{displayTitle:e,symbolName:o,searchExtras:[r,o]}})()??eo(e)??{displayTitle:e,searchExtras:[]}:{displayTitle:"",searchExtras:[]}}function no(t){if(t.length<2||t.length>36||Vr.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 rn(t){for(let e of t){let n=e.trim().replace(/[。.!!??;;]+$/u,"").trim();if(no(n))return n}return""}function on(t,e,n){let r=[t,...n.searchExtras,e].filter(Boolean);return[...new Set(r)].join(" ")}var ro=/[A-Z][a-zA-Z0-9]+(?:\.[a-zA-Z][a-zA-Z0-9]+)*/g,G=/@[A-Z][a-zA-Z]+/g,oo=/^[A-Z][A-Za-z0-9]*\.[A-Za-z][A-Za-z0-9]+/,io=/^[A-Z][A-Za-z0-9]+(?:\([^)]*\))?$/,so=/^[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"]),co=new Set(["HAP","HSP","HAR","NAPI","CAPI","NDK","ArkTS","ArkUI","OHPM"]),uo=new Set(["JSON","Object","Array","Promise","console","Math","Date","String","Number","Boolean","Error","Function","Map","Set","RegExp"]);function pn(t,e){let n=new Set,r=[t,...e];for(let o of r){for(let i of Pt(o)){b(n,i);let s=tt(i);s&&b(n,s)}for(let i of Mt(o))b(n,i);for(let i of o.matchAll(ro)){let s=i[0];lo(s)&&n.add(s)}for(let i of o.matchAll(G))n.add(i[0])}return F([...n])}function lo(t){let e=t.trim();if(!e||G.test(e))return!!e;if(e.includes(".")){let n=e.split(".")[0]??"";return uo.has(n)?!1:/^[A-Z]/.test(n)}return ao.has(e)?!1:co.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 sn(t){let e=t.trim();return!!(!e||so.test(e)||e.length>28&&!/[A-Z\u4e00-\u9fff]/.test(e)&&/^[a-z0-9_-]+$/.test(e))}function gn(t,e){let n=e.jsonTitle?.trim(),r=go(t,"").trim(),o=e.fileName.trim();return n&&!sn(n)?n:r&&!sn(r)?r:n||r||o}function hn(t){return oo.test(t.trim())}function Xt(t){let e=t.trim().replace(/\([^)]*\)$/,""),n=ut(e);return io.test(n)}function dt(t){let e=t.trim();return e?G.test(e)||hn(e)||Xt(e)?!0:!!U(e).symbolName:!1}function mo(t){let e=t.trim();return!(!e||hn(e)||Xt(e))}function fo(t){let e=new Set,n=[];for(let r of t){let o=r.trim();!mo(o)||e.has(o)||(e.add(o),n.push(o))}return n}function an(t){if(!t.includes("."))return 0;let e=t.split(".").pop()??"";return/^[a-z]/.test(e)?1:2}function po(t,e){let n=an(t)-an(e);return n!==0?n:t.localeCompare(e)}function Sn(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(po),[...n,...o].slice(0,de)}function mt(t){return t.replace(/\s+/g," ").trim()}function cn(t){return t.replace(/\\([\\`*_{}[\]()#+.!-])/g,"$1")}function go(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=cn(n[r].trim()),i=o.match(/^#+\s+(.+)$/);if(i)return cn(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 yn(t){let e=mt(t.join(" "));if(e.length<=X)return e;let n=e.slice(0,X);return e.length<=X+ht?n:`${n} ${e.slice(-ht)}`}function ho(t){let e=fo(t).join(" ");return e.length<=St?e:e.slice(0,St)}function _n(t){let e=mt(t);return e.length<=yt?e:e.slice(0,yt)}function En(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)En(r,e);return}let n=mt(lt(t));n&&e.bodyParts.push(n)}function So(t){let e=dn().use(mn).use(fn).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=lt(a).trim();if(a.depth>=4&&c&&dt(c)){o(),r={sectionTitle:c,bodyParts:[],codeBlocks:[]};continue}i(),c&&r.bodyParts.push(c);continue}i(),En(s,r)}return o(),n.length===0?[{sectionTitle:"",bodyParts:[],codeBlocks:[]}]:n}function yo(t){return Vt.test(t)}function _o(t){return t.filter(e=>e.sectionTitle&&dt(e.sectionTitle)).length}function Eo(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 un(t){let e=t.trim();return!e||G.test(e)?G.test(e):/对象说明$|枚举说明$/.test(e)?!0:Xt(e)}function xo(t){let e=t.filter(u=>!u.sectionTitle||!dt(u.sectionTitle)),n=t.filter(u=>u.sectionTitle&&dt(u.sectionTitle)),r=n.filter(u=>un(u.sectionTitle)),o=n.filter(u=>!un(u.sectionTitle)),i=Math.max(0,Kt-r.length),s=o.slice(0,i),a=o.slice(i),c=a.filter(u=>ln(u.sectionTitle)),f=a.filter(u=>!ln(u.sectionTitle)),g=[];for(let u=0;u<f.length;u+=gt)g.push(Eo(f.slice(u,u+gt)));return[...e,...r,...s,...c,...g]}function Ao(t,e,n){let r=t.split(/\r?\n/).length,o=_o(e);return o===0?!1:yo(n)?r>=Yt&&o>=Jt:r>=qt&&o>=Wt}var bo=/^\[h2\][A-Za-z]/;function ln(t){return bo.test(t.trim())}function xn(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 To(t,e,n,r){let o=xn(t),i=pn(n,r);return e.symbolName&&i.push(e.symbolName),Sn([...o,...i],o)}function Io(t,e){let n=yn(t.bodyParts),r=t.sectionTitle.trim(),o=U(r),i=rn(t.bodyParts),s=on(r,i,o),a=xn(r),c=r?a.length>0?`${e.docTitle} ${a.join(" ")}`:`${e.docTitle} ${o.symbolName??r}`:e.docTitle,f=[e.docTitle,s,...t.bodyParts].join(" ");return{documentId:e.documentId,catalogId:e.catalogId,docTitle:e.docTitle,sectionTitle:r,titleTokens:c,headingsText:s,apiSymbols:To(r,o,f,t.codeBlocks),bodySample:n,leadText:_n(n)}}function An(t,e){for(let n of t){if(n.type==="heading"){let o=lt(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)){An(n.children,e);continue}let r=mt(lt(n));r&&e.bodyParts.push(r)}}function wo(t){let e=dn().use(mn).use(fn).parse(t),n={headings:[],bodyParts:[],codeBlocks:[]};return An(e.children,n),n}function Do(t,e){let n=wo(t),r=e.docTitle?.trim()||e.documentId,o=yn(n.bodyParts),i=[r,...n.headings,o].join(" ");return{documentId:e.documentId,catalogId:e.catalogId,docTitle:r,sectionTitle:"",titleTokens:r,headingsText:ho(n.headings),apiSymbols:Sn(pn(i,n.codeBlocks)),bodySample:o,leadText:_n(o)}}function bn(t,e){let n=e.docTitle?.trim()||e.documentId,r=So(t);return Ao(t,r,e.documentId)?xo(r).filter(o=>o.sectionTitle||o.bodyParts.length>0||o.codeBlocks.length>0).map(o=>Io(o,{...e,docTitle:n})):[Do(t,{...e,docTitle:n})]}async function Co(t){let e=[];async function n(r){let o=await S.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 Ro(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=me[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 No(t){let e=t.replace(/\.md$/,".json");try{let n=await S.promises.readFile(e,"utf-8");return JSON.parse(n).title?.trim()||void 0}catch{return}}async function Oo(t,e){let n=Ro(t,e);if(!n)return[];let r=await S.promises.readFile(t,"utf-8"),o=gn(r,{jsonTitle:await No(t),fileName:n.docTitle});return bn(r,{...n,docTitle:o})}async function Lo(t,e,n){let r=_.join(e,"search.db");return await nn(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 Po(t){let e=await Co(t),n=[];for(let r of e){let o=await Oo(r,t);n.push(...o)}return n}function Mo(t,e){return{indexVersion:Q,docsZipSha256:t.docsZipSha256,termsHash:t.termsHash,synonymsHash:t.synonymsHash,segmentCount:e,builtAt:Date.now(),builtBy:t.builtBy}}async function In(t){t.lexiconDir&&At(t.lexiconDir);try{let e=await Po(t.docsDir);await t.onProgress?.({current:0,total:e.length,message:`Building search index\u2026 0 / ${e.length.toLocaleString()} segments`}),await S.promises.mkdir(t.tmpDir,{recursive:!0});let n=await Lo(e,t.tmpDir,t.onProgress),r=Mo(t,n);return await S.promises.writeFile(_.join(t.tmpDir,"build-meta.json"),JSON.stringify(r,null,2)),await Te(t.tmpDir),r}finally{t.lexiconDir&&At(null)}}async function wn(){return S.promises.mkdtemp(_.join(Tn.tmpdir(),"deveco-docs-"))}async function Bo(t,e){try{await S.promises.rename(t,e)}catch(n){let r=n.code;if(r!=="EPERM"&&r!=="EXDEV")throw n;await S.promises.cp(t,e,{recursive:!0}),await S.promises.rm(t,{recursive:!0,force:!0})}}async function Dn(t){let e=_.join(t,"docs");try{await S.promises.access(e)}catch{return}let n=new Set(["docs","docs.zip"]);for(let r of await S.promises.readdir(e,{withFileTypes:!0})){if(n.has(r.name))continue;let o=_.join(e,r.name),i=_.join(t,r.name);await S.promises.rm(i,{recursive:!0,force:!0}),await Bo(o,i)}await S.promises.rm(_.join(e,"docs"),{recursive:!0,force:!0}),await S.promises.rm(_.join(e,"docs.zip"),{force:!0}),await S.promises.rm(e,{recursive:!0,force:!0})}async function zo(t){let e=process.env.DEVECO_DOC_INIT_LOG??M.join(ye(),"doc-init.log");await p.promises.mkdir(M.dirname(e),{recursive:!0}),await p.promises.appendFile(e,`${new Date().toISOString()} ${t}
|
|
64
|
+
`)}async function Ho(t){let e=O();if(!e)throw new Error("docs.zip not found");await p.promises.rm(t,{recursive:!0,force:!0}),await p.promises.mkdir(t,{recursive:!0}),new ko(e).extractAllTo(t,!0),await Dn(t)}async function jo(){let t=E(),e=k(),n=await p.promises.readdir(e);for(let r of n){let o=M.join(t,r);await p.promises.rm(o,{force:!0}),await p.promises.rename(M.join(e,r),o)}await p.promises.rm(e,{recursive:!0,force:!0}),await p.promises.rm(M.join(t,"orama.dpack"),{force:!0})}async function Zo(t,e){e?.start("Installing documentation index\u2026"),await R({state:"installing",phase:1,phaseLabel:"Installing index",message:"Installing documentation index\u2026"}),await De(t),e&&(e.text="Documentation index installed.")}async function Uo(t,e,n){let r=k(),o=await wn();await p.promises.mkdir(E(),{recursive:!0}),await p.promises.rm(r,{recursive:!0,force:!0}),n?.start("Building search index\u2026"),await R({state:"indexing",phase:2,phaseLabel:"Building search index",message:"Building search index\u2026"});try{await Ho(o),await In({docsDir:o,tmpDir:r,docsZipSha256:e,termsHash:V(),synonymsHash:K(),builtBy:t.builtBy??"doc-init",onProgress:async i=>{n&&(n.text=i.message),await R({state:"indexing",current:i.current,total:i.total,message:i.message})}})}finally{await p.promises.rm(o,{recursive:!0,force:!0})}await R({state:"persisting",phase:3,phaseLabel:"Persisting index",message:"Persisting index\u2026"}),await jo(),en()}async function Cn(t){await R({state:"done",phase:3,phaseLabel:"Done",message:"Documentation ready.",error:null}),t?.succeed("Documentation ready.")}async function Go(t){let e=await Ct(),n=e?`Documentation already up to date. Documents: ${e.segmentCount.toLocaleString()}`:"Documentation already up to date.";t?.succeed(n),await R({state:"done",message:n,error:null})}async function $o(t,e){let n=t instanceof Error?t.message:String(t);throw await R({state:"error",error:n}),await zo(`ERROR: ${n}`),e?.fail(n),t}async function Qo(){let t=E();await p.promises.mkdir(t,{recursive:!0});let e=Se();return p.existsSync(e)||await p.promises.writeFile(e,"","utf-8"),e}async function Xo(){let t=await Qo();return Fo.lock(t,{stale:1800*1e3})}async function qo(){let t=O(),e=(t?await J(t):null)??await Dt();if(!e)throw new Error("docs.zip not found");return e}async function Wo(t,e){let n=await qo(),r=t.force||await Me(t.force),o=await Rt(t.force);if(!r&&!o&&Nt()){await Go(e);return}if(It()&&!t.force){await Zo(n,e),await Cn(e);return}await Uo(t,n,e),await Cn(e)}var ft=class{static async run(e={}){let n=e.background??!1,o=e.quiet??n?void 0:vo({text:"Checking documentation\u2026",color:"cyan"}),i;try{i=await Xo(),await wt(Pe("Starting documentation setup\u2026")),await Wo(e,o)}catch(s){return $o(s,o)}finally{i&&await i()}}};var Yo=process.env.DEVECO_CLI_POSTINSTALL?"postinstall":"doc-init";ft.run({background:!0,builtBy:Yo}).catch(()=>{process.exit(1)});
|
package/docs.zip
CHANGED
|
Binary file
|
package/index.zip
ADDED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deveco-test/deveco-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0-Test.2",
|
|
4
4
|
"description": "HarmonyOS application development command line tool",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -9,16 +9,21 @@
|
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
11
|
"dist",
|
|
12
|
-
"scripts",
|
|
12
|
+
"scripts/postinstall.mjs",
|
|
13
|
+
"scripts/install-better-sqlite3.mjs",
|
|
14
|
+
"scripts/lib/better-sqlite3-vendor.mjs",
|
|
15
|
+
"scripts/lib/doc-init-log-path.mjs",
|
|
13
16
|
"templates",
|
|
14
17
|
"THIRD-PARTY-LICENSES",
|
|
15
18
|
"SKILL.md",
|
|
16
|
-
"docs.zip"
|
|
19
|
+
"docs.zip",
|
|
20
|
+
"index.zip"
|
|
17
21
|
],
|
|
18
22
|
"scripts": {
|
|
19
23
|
"prepare": "husky",
|
|
24
|
+
"postinstall": "node scripts/postinstall.mjs",
|
|
20
25
|
"build": "tsup",
|
|
21
|
-
"
|
|
26
|
+
"build:index": "tsx index/build-index-bundle.ts",
|
|
22
27
|
"dev": "tsx watch src/cli.ts",
|
|
23
28
|
"start": "tsx src/cli.ts",
|
|
24
29
|
"lint": "eslint src",
|
|
@@ -38,13 +43,15 @@
|
|
|
38
43
|
"devDependencies": {
|
|
39
44
|
"@eslint/js": "^10.0.1",
|
|
40
45
|
"@types/adm-zip": "^0.5.8",
|
|
46
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
41
47
|
"@types/fs-extra": "^11.0.4",
|
|
42
48
|
"@types/global-agent": "^3.0.0",
|
|
43
49
|
"@types/node": "^25.6.0",
|
|
44
50
|
"@types/turndown": "^5.0.5",
|
|
51
|
+
"@types/yauzl": "^2.10.3",
|
|
45
52
|
"eslint": "^10.2.1",
|
|
46
53
|
"generate-license-file": "^4.2.1",
|
|
47
|
-
"husky": "9.1.7",
|
|
54
|
+
"husky": "^9.1.7",
|
|
48
55
|
"prettier": "^3.8.3",
|
|
49
56
|
"tsup": "^8.5.1",
|
|
50
57
|
"tsx": "^4.21.0",
|
|
@@ -54,22 +61,31 @@
|
|
|
54
61
|
},
|
|
55
62
|
"dependencies": {
|
|
56
63
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
57
|
-
"@
|
|
64
|
+
"@node-rs/jieba": "^2.0.1",
|
|
65
|
+
"@sqlite.org/sqlite-wasm": "^3.49.1-build4",
|
|
58
66
|
"adm-zip": "^0.5.17",
|
|
59
|
-
"axios": "1.
|
|
67
|
+
"axios": "1.17.0",
|
|
60
68
|
"colorette": "^2.0.20",
|
|
61
69
|
"commander": "^13.1.0",
|
|
62
70
|
"execa": "^9.6.1",
|
|
63
71
|
"fs-extra": "^11.3.4",
|
|
64
72
|
"global-agent": "^4.1.3",
|
|
65
73
|
"json5": "^2.2.3",
|
|
66
|
-
"
|
|
74
|
+
"mdast-util-to-string": "^4.0.0",
|
|
75
|
+
"ora": "^9.4.0",
|
|
67
76
|
"p-limit": "^5.0.0",
|
|
68
77
|
"proper-lockfile": "^4.1.2",
|
|
69
78
|
"regedit": "^5.1.4",
|
|
79
|
+
"remark-gfm": "^4.0.1",
|
|
80
|
+
"remark-parse": "^11.0.0",
|
|
70
81
|
"smol-toml": "^1.6.1",
|
|
82
|
+
"unified": "^11.0.5",
|
|
83
|
+
"yauzl": "^3.2.0",
|
|
71
84
|
"zod": "^4.4.3"
|
|
72
85
|
},
|
|
86
|
+
"optionalDependencies": {
|
|
87
|
+
"better-sqlite3": "^12.11.1"
|
|
88
|
+
},
|
|
73
89
|
"overrides": {
|
|
74
90
|
"dotenv": "16.4.7"
|
|
75
91
|
}
|
|
@@ -0,0 +1,51 @@
|
|
|
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 {
|
|
10
|
+
installBetterSqlite3ViaNpm,
|
|
11
|
+
isBetterSqlite3Loadable,
|
|
12
|
+
resolveTargetVersion,
|
|
13
|
+
} from './lib/better-sqlite3-vendor.mjs';
|
|
14
|
+
|
|
15
|
+
async function appendInstallLog(message) {
|
|
16
|
+
try {
|
|
17
|
+
const logPath = getDocInitLogPath();
|
|
18
|
+
await mkdir(dirname(logPath), { recursive: true });
|
|
19
|
+
await appendFile(
|
|
20
|
+
logPath,
|
|
21
|
+
`${new Date().toISOString()} [better-sqlite3] ${message}\n`
|
|
22
|
+
);
|
|
23
|
+
} catch {
|
|
24
|
+
// ignore logging failures
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** @deprecated Use installBetterSqlite3ViaNpm */
|
|
29
|
+
export const ensureBetterSqlite3NativeBinary = installBetterSqlite3ViaNpm;
|
|
30
|
+
|
|
31
|
+
export async function ensureBetterSqlite3ForDocs() {
|
|
32
|
+
const targetVersion = resolveTargetVersion();
|
|
33
|
+
await appendInstallLog(
|
|
34
|
+
`ensure better-sqlite3@${targetVersion} for Node ${process.version} via npm install`
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
if (await isBetterSqlite3Loadable()) {
|
|
38
|
+
await appendInstallLog('skip: better-sqlite3 already loadable');
|
|
39
|
+
return { ok: true, skipped: true, reason: 'already-installed' };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const result = await installBetterSqlite3ViaNpm();
|
|
43
|
+
if (result.ok) {
|
|
44
|
+
await appendInstallLog(`installed better-sqlite3@${targetVersion} via npm`);
|
|
45
|
+
} else {
|
|
46
|
+
await appendInstallLog(
|
|
47
|
+
`npm install failed (${result.reason}): ${result.error ?? 'unknown error'}`
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2026 Huawei Device Co., Ltd.
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { dirname, join } from 'path';
|
|
7
|
+
import { fileURLToPath } from 'url';
|
|
8
|
+
import { existsSync } from 'fs';
|
|
9
|
+
import { readFile, stat, writeFile } from 'fs/promises';
|
|
10
|
+
import { spawnSync } from 'child_process';
|
|
11
|
+
|
|
12
|
+
export const BETTER_SQLITE3_VERSION_LEGACY = '11.10.0';
|
|
13
|
+
export const BETTER_SQLITE3_VERSION_NODE20 = '12.9.0';
|
|
14
|
+
export const BETTER_SQLITE3_VERSION_NODE21 = '9.6.0';
|
|
15
|
+
export const BETTER_SQLITE3_VERSION_LATEST = '12.11.1';
|
|
16
|
+
|
|
17
|
+
const scriptDir = dirname(fileURLToPath(import.meta.url));
|
|
18
|
+
export const packageRoot = join(scriptDir, '..', '..');
|
|
19
|
+
|
|
20
|
+
export function resolveTargetVersion(nodeVersion = process.version) {
|
|
21
|
+
const major = Number(nodeVersion.slice(1).split('.')[0]);
|
|
22
|
+
if (major === 18) {
|
|
23
|
+
return BETTER_SQLITE3_VERSION_LEGACY;
|
|
24
|
+
}
|
|
25
|
+
if (major === 20 || major === 23) {
|
|
26
|
+
return BETTER_SQLITE3_VERSION_NODE20;
|
|
27
|
+
}
|
|
28
|
+
if (major === 21) {
|
|
29
|
+
return BETTER_SQLITE3_VERSION_NODE21;
|
|
30
|
+
}
|
|
31
|
+
return BETTER_SQLITE3_VERSION_LATEST;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function isUnsupportedNodeVersion(nodeVersion = process.version) {
|
|
35
|
+
return Number(nodeVersion.slice(1).split('.')[0]) === 19;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function resolveNpmCliPath() {
|
|
39
|
+
const nodeDir = dirname(process.execPath);
|
|
40
|
+
const candidates = [
|
|
41
|
+
join(nodeDir, 'node_modules', 'npm', 'bin', 'npm-cli.js'),
|
|
42
|
+
join(nodeDir, '..', 'lib', 'node_modules', 'npm', 'bin', 'npm-cli.js'),
|
|
43
|
+
];
|
|
44
|
+
return candidates.find((candidate) => existsSync(candidate)) ?? null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function quoteWindowsCmdArg(arg) {
|
|
48
|
+
return /\s/.test(arg) ? `"${arg.replace(/"/g, '\\"')}"` : arg;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function spawnDetail(result) {
|
|
52
|
+
return [result.stderr, result.stdout, result.error?.message]
|
|
53
|
+
.filter(Boolean)
|
|
54
|
+
.join('\n')
|
|
55
|
+
.trim();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function runNpmInstallBetterSqlite3(targetVersion) {
|
|
59
|
+
const args = ['install', `better-sqlite3@${targetVersion}`, '--no-save'];
|
|
60
|
+
const npmCli = resolveNpmCliPath();
|
|
61
|
+
if (npmCli) {
|
|
62
|
+
return spawnSync(process.execPath, [npmCli, ...args], {
|
|
63
|
+
cwd: packageRoot,
|
|
64
|
+
stdio: 'pipe',
|
|
65
|
+
encoding: 'utf-8',
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (process.platform === 'win32') {
|
|
70
|
+
const command = ['npm', ...args].map(quoteWindowsCmdArg).join(' ');
|
|
71
|
+
return spawnSync(command, {
|
|
72
|
+
cwd: packageRoot,
|
|
73
|
+
stdio: 'pipe',
|
|
74
|
+
encoding: 'utf-8',
|
|
75
|
+
shell: true,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return spawnSync('npm', args, {
|
|
80
|
+
cwd: packageRoot,
|
|
81
|
+
stdio: 'pipe',
|
|
82
|
+
encoding: 'utf-8',
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export async function isBetterSqlite3Loadable() {
|
|
87
|
+
try {
|
|
88
|
+
await import('better-sqlite3');
|
|
89
|
+
return true;
|
|
90
|
+
} catch {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export async function installBetterSqlite3ViaNpm(nodeVersion = process.version) {
|
|
96
|
+
if (isUnsupportedNodeVersion(nodeVersion)) {
|
|
97
|
+
return {
|
|
98
|
+
ok: false,
|
|
99
|
+
reason: 'unsupported-node',
|
|
100
|
+
error: 'Node.js 19 is not supported for better-sqlite3',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (await isBetterSqlite3Loadable()) {
|
|
105
|
+
return { ok: true, skipped: true, reason: 'already-installed' };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const targetVersion = resolveTargetVersion(nodeVersion);
|
|
109
|
+
const result = runNpmInstallBetterSqlite3(targetVersion);
|
|
110
|
+
if (result.status !== 0) {
|
|
111
|
+
return {
|
|
112
|
+
ok: false,
|
|
113
|
+
reason: 'npm-install-failed',
|
|
114
|
+
version: targetVersion,
|
|
115
|
+
error: spawnDetail(result) || `exit ${result.status ?? 'null'}`,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (!(await isBetterSqlite3Loadable())) {
|
|
120
|
+
return {
|
|
121
|
+
ok: false,
|
|
122
|
+
reason: 'load-failed',
|
|
123
|
+
version: targetVersion,
|
|
124
|
+
error: 'npm install finished but better-sqlite3 still cannot be imported',
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return { ok: true, version: targetVersion, method: 'npm' };
|
|
129
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2026 Huawei Device Co., Ltd.
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { homedir } from 'os';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
|
|
9
|
+
const APP_NAME = 'deveco-cli';
|
|
10
|
+
|
|
11
|
+
export function getDocInitLogDir() {
|
|
12
|
+
return join(homedir(), '.local', 'share', APP_NAME, 'logs');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function getDocInitLogPath() {
|
|
16
|
+
return process.env.DEVECO_DOC_INIT_LOG ?? join(getDocInitLogDir(), 'doc-init.log');
|
|
17
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2026 Huawei Device Co., Ltd.
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { spawn } from 'child_process';
|
|
7
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
8
|
+
import { join, dirname } from 'path';
|
|
9
|
+
import { fileURLToPath } from 'url';
|
|
10
|
+
import { ensureBetterSqlite3ForDocs } from './install-better-sqlite3.mjs';
|
|
11
|
+
import { getDocInitLogPath } from './lib/doc-init-log-path.mjs';
|
|
12
|
+
|
|
13
|
+
const root = join(dirname(fileURLToPath(import.meta.url)), '..');
|
|
14
|
+
const logPath = getDocInitLogPath();
|
|
15
|
+
process.env.DEVECO_DOC_INIT_LOG = logPath;
|
|
16
|
+
mkdirSync(dirname(logPath), { recursive: true });
|
|
17
|
+
|
|
18
|
+
const nativeResult = await ensureBetterSqlite3ForDocs();
|
|
19
|
+
if (!nativeResult.ok && !nativeResult.skipped) {
|
|
20
|
+
console.warn(
|
|
21
|
+
`[deveco-cli] better-sqlite3 install via npm failed; docs search will use sqlite-wasm fallback.\n` +
|
|
22
|
+
`${nativeResult.error ?? ''}\n`
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
const initScript = join(root, 'dist', 'internal', 'doc-init-background.js');
|
|
26
|
+
|
|
27
|
+
if (!existsSync(initScript)) {
|
|
28
|
+
process.exit(0);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const child = spawn(
|
|
32
|
+
process.execPath,
|
|
33
|
+
[initScript],
|
|
34
|
+
{
|
|
35
|
+
detached: true,
|
|
36
|
+
stdio: ['ignore', 'ignore', 'ignore'],
|
|
37
|
+
env: {
|
|
38
|
+
...process.env,
|
|
39
|
+
DEVECO_CLI_SKIP_VERSION_CHECK: '1',
|
|
40
|
+
DEVECO_CLI_POSTINSTALL: '1',
|
|
41
|
+
DEVECO_DOC_INIT_LOG: logPath,
|
|
42
|
+
},
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
child.unref();
|
|
47
|
+
process.exit(0);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
{
|
|
2
|
-
"app": {
|
|
3
|
-
"bundleName": "com.example.myapplication",
|
|
4
|
-
"vendor": "example",
|
|
5
|
-
"versionCode": 1000000,
|
|
6
|
-
"versionName": "1.0.0",
|
|
7
|
-
"icon": "$media:layered_image",
|
|
8
|
-
"label": "$string:app_name"
|
|
9
|
-
}
|
|
10
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"app": {
|
|
3
|
+
"bundleName": "com.example.myapplication",
|
|
4
|
+
"vendor": "example",
|
|
5
|
+
"versionCode": 1000000,
|
|
6
|
+
"versionName": "1.0.0",
|
|
7
|
+
"icon": "$media:layered_image",
|
|
8
|
+
"label": "$string:app_name"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
{
|
|
2
|
-
"string": [
|
|
3
|
-
{
|
|
4
|
-
"name": "app_name",
|
|
5
|
-
"value": "MyApplication"
|
|
6
|
-
}
|
|
7
|
-
]
|
|
8
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"string": [
|
|
3
|
+
{
|
|
4
|
+
"name": "app_name",
|
|
5
|
+
"value": "MyApplication"
|
|
6
|
+
}
|
|
7
|
+
]
|
|
8
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
{
|
|
2
|
-
"layered-image":
|
|
3
|
-
{
|
|
4
|
-
"background" : "$media:background",
|
|
5
|
-
"foreground" : "$media:foreground"
|
|
6
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"layered-image":
|
|
3
|
+
{
|
|
4
|
+
"background" : "$media:background",
|
|
5
|
+
"foreground" : "$media:foreground"
|
|
6
|
+
}
|
|
7
7
|
}
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
{
|
|
2
|
-
"app": {
|
|
3
|
-
"signingConfigs": [],
|
|
4
|
-
"products": [
|
|
5
|
-
{
|
|
6
|
-
"name": "default",
|
|
7
|
-
"signingConfig": "default",
|
|
8
|
-
"targetSdkVersion": "6.0.2(22)",
|
|
9
|
-
"compatibleSdkVersion": "6.0.2(22)",
|
|
10
|
-
"runtimeOS": "HarmonyOS",
|
|
11
|
-
"buildOption": {
|
|
12
|
-
"strictMode": {
|
|
13
|
-
"caseSensitiveCheck": true,
|
|
14
|
-
"useNormalizedOHMUrl": true
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
],
|
|
19
|
-
"buildModeSet": [
|
|
20
|
-
{
|
|
21
|
-
"name": "debug",
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
"name": "release"
|
|
25
|
-
}
|
|
26
|
-
]
|
|
27
|
-
},
|
|
28
|
-
"modules": [
|
|
29
|
-
{
|
|
30
|
-
"name": "entry",
|
|
31
|
-
"srcPath": "./entry",
|
|
32
|
-
"targets": [
|
|
33
|
-
{
|
|
34
|
-
"name": "default",
|
|
35
|
-
"applyToProducts": [
|
|
36
|
-
"default"
|
|
37
|
-
]
|
|
38
|
-
}
|
|
39
|
-
]
|
|
40
|
-
}
|
|
41
|
-
]
|
|
1
|
+
{
|
|
2
|
+
"app": {
|
|
3
|
+
"signingConfigs": [],
|
|
4
|
+
"products": [
|
|
5
|
+
{
|
|
6
|
+
"name": "default",
|
|
7
|
+
"signingConfig": "default",
|
|
8
|
+
"targetSdkVersion": "6.0.2(22)",
|
|
9
|
+
"compatibleSdkVersion": "6.0.2(22)",
|
|
10
|
+
"runtimeOS": "HarmonyOS",
|
|
11
|
+
"buildOption": {
|
|
12
|
+
"strictMode": {
|
|
13
|
+
"caseSensitiveCheck": true,
|
|
14
|
+
"useNormalizedOHMUrl": true
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"buildModeSet": [
|
|
20
|
+
{
|
|
21
|
+
"name": "debug",
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"name": "release"
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
},
|
|
28
|
+
"modules": [
|
|
29
|
+
{
|
|
30
|
+
"name": "entry",
|
|
31
|
+
"srcPath": "./entry",
|
|
32
|
+
"targets": [
|
|
33
|
+
{
|
|
34
|
+
"name": "default",
|
|
35
|
+
"applyToProducts": [
|
|
36
|
+
"default"
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
42
|
}
|