@doubao-apps/kit 0.0.33 → 0.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/805.js ADDED
@@ -0,0 +1,3 @@
1
+ var e,t,r,i;import{createRequire as n}from"node:module";import o from"node:fs";import a from"node:path";import{loadEnv as s,logger as l}from"@rsbuild/core";import c from"chalk";import d from"ora";import u from"node:os";import{createHash as p}from"node:crypto";import{getPackagesSync as f}from"@manypkg/get-packages";import{readWantedLockfile as h}from"@pnpm/lockfile.fs";import m from"archiver";import{detect as v}from"package-manager-detector/detect";import{loadConfig as y,requestDoubaoAppsPlatform as g,fetchWithProxyDispatcher as b,isInternal as w,resolveLoginCookie as k,loadAppConfig as S,getErrorMessage as C}from"./709.js";async function $({appKey:e,versionTag:t,cloudBuildSource:r,runner:i,config:n,variables:o,properties:a,internal:s,domainId:l,cookie:c}){return await g({internal:s,domainId:l,path:`/developer/resource_api/apps/${encodeURIComponent(e)}/versions/${encodeURIComponent(t)}/cloud_build/create_job`,method:"POST",body:JSON.stringify({cloud_build_source:r,runner:i,config:n,variables:o,properties:a}),headers:{"Content-Type":"application/json",...c?{Cookie:c}:{}}})}async function _({appKey:e,jobId:t,reason:r,internal:i,domainId:n,cookie:o}){return await g({internal:i,domainId:n,path:`/developer/resource_api/apps/${encodeURIComponent(e)}/cloud_build/jobs/${encodeURIComponent(t)}/cancel`,method:"POST",body:JSON.stringify({reason:r}),headers:{"Content-Type":"application/json",...o?{Cookie:o}:{}}})}async function E({appKey:e,jobId:t,internal:r,domainId:i,cookie:n}){return await g({internal:r,domainId:i,path:`/developer/resource_api/apps/${encodeURIComponent(e)}/cloud_build/jobs/${encodeURIComponent(t)}`,method:"GET",headers:n?{Cookie:n}:void 0})}async function j({appKey:e,jobId:t,start:r,end:i,internal:n,domainId:o,cookie:a}){return await g({internal:n,domainId:o,path:`/developer/resource_api/apps/${encodeURIComponent(e)}/cloud_build/jobs/${encodeURIComponent(t)}/logs`,query:{start:r,end:i},method:"GET",headers:a?{Cookie:a}:void 0})}(r=e||(e={}))[r.WAITING=0]="WAITING",r[r.QUEUED=1]="QUEUED",r[r.RUNNING=2]="RUNNING",r[r.PENDING=3]="PENDING",r[r.SUCCESS=4]="SUCCESS",r[r.FAIL=5]="FAIL",r[r.CANCELED=6]="CANCELED",r[r.TIMEOUT=7]="TIMEOUT",r[r.UNKNOWN=8]="UNKNOWN";let I=["dependencies","devDependencies","optionalDependencies","peerDependencies"],N=".doubao-cloud-build",D=["@doubao-apps/*","@byted-doubao-apps/*","@bridge/*","@byted-*/*","@byted/*","@bytesso/*","@byted-service/*","@cfe/*","@dp/*","@ies/*","@net-fe/*"],A=new Set(["registry.npmjs.org","registry.npmjs.com","registry.yarnpkg.com"]),U=new Set([".cache",".git",".hg",".pnpm-store",".svn",".temp",".turbo","coverage","dist","node_modules","output","output_resource"]),P=new Set([".DS_Store"]),F="win32"===process.platform||"darwin"===process.platform;async function W(e,t){let r=[["pnpm","pnpm-lock.yaml"],["yarn","yarn.lock"],["npm","package-lock.json"],["bun","bun.lockb"]].filter(([,t])=>o.existsSync(a.resolve(e,t)));r.length>1&&t.push(`Multiple lockfiles found: ${r.map(([,e])=>e).join(", ")}.`);let i=await v({cwd:e,stopDir:e,strategies:["lockfile","packageManager-field","devEngines-field","install-metadata"]});return i?.name==="pnpm"||i?.name==="npm"||i?.name==="yarn"||i?.name==="bun"?i.name:"unknown"}async function O(e,t){let r=new Set;if(0===t.length)return r;let i=await h(e,{ignoreIncompatible:!0});if(!i?.packages)return r;for(let[e,n]of Object.entries(i.packages))for(let i of function e(t){return"string"==typeof t.tarball?[t.tarball]:"string"==typeof t.url?[t.url]:Array.isArray(t.variants)?t.variants.flatMap(t=>e(t.resolution)):[]}(n.resolution)){let o=G(i);o&&Z(o,t)&&r.add(n.name||function(e){let t=e.replace(/^\//,"").replace(/\(.+$/,"");if(t.startsWith("@")){let e=t.indexOf("/"),r=t.indexOf("@",e);return -1===r?t:t.slice(0,r)}let r=t.indexOf("@");return -1===r?t:t.slice(0,r)}(e))}return r}async function T(e,t){let r=await O(e,t);for(let i of function(e,t){let r=new Set,i=a.resolve(e,"package-lock.json");if(0===t.length||!o.existsSync(i))return r;let n=JSON.parse(o.readFileSync(i,"utf8"));if(n.packages)for(let[e,i]of Object.entries(n.packages)){if(!e||!i.resolved||!H(i.resolved,t))continue;let n=i.name||function(e){let t=e.split(/[\\/]/),r=t.lastIndexOf("node_modules")+1,i=t[r];if(i){if(i.startsWith("@")){let e=t[r+1];return e?`${i}/${e}`:void 0}return i}}(e);n&&r.add(n)}return function e(t,r,i){if(t)for(let[n,o]of Object.entries(t))o.resolved&&H(o.resolved,r)&&i.add(n),e(o.dependencies,r,i)}(n.dependencies,t,r),r}(e,t))r.add(i);return r}async function x({source:e,destination:t}){var r,i;return await (r=t,i=t=>{t.directory(e,!1)},new Promise((e,t)=>{let n=o.createWriteStream(r),a=m("zip",{zlib:{level:9}}),s=!1,l=r=>{s||(s=!0,r?t(r):e())};n.on("close",()=>l()),n.on("error",l),a.on("error",l),a.pipe(n);try{i(a),a.finalize().catch(l)}catch(e){l(e)}}))}function R(e){return JSON.parse(o.readFileSync(e,"utf8"))}function L(e){return e.split(a.sep).join("/")}function z(e){return Array.from(new Set(e.filter(Boolean)))}function J(e){return e.replace(/^@/,"").replace(/[^a-zA-Z0-9._-]+/g,"-")}function M(e){return p("sha256").update(e).digest("hex")}function K(e){let t=a.resolve(e);return F?t.toLowerCase():t}function q(e,t,r=U){if(o.existsSync(e))for(let i of o.readdirSync(e,{withFileTypes:!0})){let n=a.resolve(e,i.name);if(i.isDirectory()){r.has(i.name)||i.name===N||q(n,t,r);continue}i.isFile()&&t(n)}}function B(e){return e.replace(/[|\\{}()[\]^$+?.]/g,"\\$&")}function G(e){try{return new URL(e).host}catch{return}}function H(e,t){let r=G(e);return!(!r||A.has(r))&&(!t||Z(r,t))}function Z(e,t){return t.some(t=>e===t||e.endsWith(`.${t}`))}let Q=n(import.meta.url)("npm-packlist");async function V({name:e,packageSource:t,vendorRoot:r,stagingSourceRoot:i,cache:n}){let s=`${e}:${t.kind}:${t.path}`,l=n.get(s);if(l)return l;o.mkdirSync(r,{recursive:!0});let c="directory"===t.kind?R(a.resolve(t.path,"package.json")):void 0,d=c?.version,u=`${J(e)}-${J(d||"local")}-${M(t.path).slice(0,8)}`,p=a.resolve(r,"tarball"===t.kind?`${u}.tgz`:u);o.rmSync(p,{recursive:!0,force:!0}),"tarball"===t.kind?o.cpSync(t.path,p):await X({source:t.path,destination:p,packageJson:c});let f={name:e,version:d,source:t.source,vendorPath:L(a.relative(i,p))};return n.set(s,f),f}async function X({source:e,destination:t,packageJson:r}){for(let i of z([...await Q({path:e,package:r,isProjectRoot:!0,edgesOut:new Map}),...function(e){let t=["package.json"];if(Y(t,e.main),"string"==typeof e.bin)Y(t,e.bin);else if(e.bin)for(let r of Object.values(e.bin))Y(t,r);return t}(r)])){let r=a.resolve(e,i);if(!o.existsSync(r))continue;let n=a.resolve(t,i),s=o.statSync(r);o.mkdirSync(a.dirname(n),{recursive:!0}),s.isDirectory()?o.mkdirSync(n,{recursive:!0}):o.cpSync(r,n,{dereference:!1})}}function Y(e,t){if(!t||t.includes("*")||a.isAbsolute(t))return;let r=L(a.normalize(t)).replace(/^\.\//,"");!r||r.startsWith("../")||e.push(r)}async function ee(e={}){var t;let r,i,n=a.resolve(e.appDir||e.projectDir||process.cwd()),s=function(e){let t=e;for(;;){if(o.existsSync(a.resolve(t,"package.json")))return t;let r=a.dirname(t);if(r===t)throw Error(`Cannot find package.json from ${e}`);t=r}}(n),l=function(e){let t=e;for(;;){try{let e=f(t);if("root"!==e.tool.type)return e}catch{}let e=a.dirname(t);if(e===t)return;t=e}}(s),c=l?.rootDir,d=c||s,p=R(a.resolve(s,"package.json")),h=[],m=[],v=await W(d,h),y=!!(c&&c!==s),g=J(p.name||a.basename(s)),b=a.resolve(e.outputDir||a.join(u.tmpdir(),"doubao-cloud-build",`${g}-${M(s).slice(0,8)}`)),w=a.resolve(b,"source"),k=a.resolve(b,e.archiveName||`${g}-source.zip`);o.mkdirSync(b,{recursive:!0}),o.rmSync(w,{recursive:!0,force:!0}),o.rmSync(k,{force:!0}),function e(t,r,i){for(let c of(o.mkdirSync(r,{recursive:!0}),o.readdirSync(t,{withFileTypes:!0}))){var n,s,l;let d=a.resolve(t,c.name),u=a.resolve(r,c.name);n=d,s=c,!(function(e,t){let r=K(e),i=K(t);return r===i||r.startsWith(`${i}${a.sep}`)}(n,(l=i).workDir)||s.isDirectory()&&U.has(s.name)||s.isFile()&&P.has(s.name))&&(!(s.isFile()&&s.name.startsWith(".env"))||!0===l.includeEnvFiles||Array.isArray(l.includeEnvFiles)&&l.includeEnvFiles.includes(s.name))&&(c.isDirectory()?e(d,u,i):(c.isFile()||c.isSymbolicLink())&&(o.mkdirSync(a.dirname(u),{recursive:!0}),o.cpSync(d,u,{dereference:!1})))}}(s,w,{workDir:b,includeEnvFiles:e.includeEnvFiles}),o.writeFileSync(a.resolve(w,".npmrc"),"registry=https://registry.npmjs.org/\n");let S=(r=[],q(s,e=>{"package.json"===a.basename(e)&&r.push({relativePath:a.relative(s,e),directory:a.dirname(e),packageJson:R(e)})}),r),C=l?l.packages.map(e=>({relativePath:L(a.relative(l.rootDir,a.resolve(e.dir,"package.json"))),directory:e.dir,packageJson:e.packageJson})):S,$=function(e){let t=[],r=[];for(let s of z(e)){let e=a.resolve(s,".npmrc");if(o.existsSync(e))for(let a of o.readFileSync(e,"utf8").split(/\r?\n/)){var i,n;let e=a.trim();if(!e||e.startsWith("#")||e.startsWith(";"))continue;let o=e.match(/^(@[^:]+):registry=(.+)$/);if(o){let[,e,n]=o,a=G(n);a&&(i=a,!A.has(i))&&(t.push(`${e}/*`),r.push(a));continue}let s=e.match(/^registry=(.+)$/);if(s){let e=G(s[1]);e&&(n=e,!A.has(n))&&r.push(e)}}}return{privatePackagePatterns:z(t),privateRegistryHosts:z(r)}}([d,s]),_=z([...D,...$.privatePackagePatterns,...e.privatePackagePatterns||[]]),E=z([...$.privateRegistryHosts,...e.privateRegistryHosts||[]]),j=new Set,I=[],N=[];await et({manifests:S,workspaceManifests:C,contextRoot:d,packageRoot:s,stagingSourceRoot:w,privatePackagePatterns:_,privatePackagesFromLockfile:await T(d,E),vendoredPackages:I,unvendoredPackages:N,rewrittenManifests:j}),N.length>0&&m.push(...N.map(e=>e.reason)),j.size>0&&!e.installCommand&&h.push("Package manifests were rewritten to local vendor packages. The original lockfile may no longer be reusable with --frozen-lockfile."),y&&!e.installCommand&&h.push("Workspace root lockfile is not uploaded. Cloud build will install without --frozen-lockfile.");let F=e.installCommand||(t=0===j.size&&!y,"pnpm"===v?t?"pnpm install --frozen-lockfile":"pnpm install --no-frozen-lockfile":"yarn"===v?t?"yarn install --frozen-lockfile":"yarn install":"bun"===v?t?"bun install --frozen-lockfile":"bun install":"npm"===v&&t?"npm ci":"npm install"),O=e.buildCommand||("npm"==(i="yarn"===v?"yarn":"bun"===v?"bun":"npm"===v?"npm":"pnpm")?"npm run build":`${i} run build`),B=(function(e,t=U){let r=[];return q(e,e=>r.push(e),t),r.sort()})(w).map(e=>L(a.relative(w,e)));return await x({source:w,destination:k}),{archivePath:k,sourceRoot:w,appDir:a.resolve(w,a.relative(s,n)),packageManager:v,installCommand:F,buildCommand:O,warnings:h,blockers:m,includedFiles:B,vendoredPackages:Array.from(new Map(I.map(e=>[`${e.name}:${e.vendorPath}`,e])).values()),unvendoredPackages:N,rewrittenManifests:Array.from(j)}}async function et({manifests:e,workspaceManifests:t,contextRoot:r,packageRoot:i,stagingSourceRoot:s,privatePackagePatterns:l,privatePackagesFromLockfile:c,vendoredPackages:d,unvendoredPackages:u,rewrittenManifests:p}){let f=a.resolve(s,N,"vendor"),h=new Map,m=new Map(t.filter(e=>e.packageJson.name).map(e=>[e.packageJson.name,e])),v=e.map(e=>({manifest:e,dependencyFields:I})),y=new Set,g=new Set;for(let{manifest:e,dependencyFields:t}of v){let b=`${e.directory}:${e.relativePath}`;if(!y.has(b))for(let w of(y.add(b),t)){let t=e.packageJson[w];if(t)for(let[y,b]of Object.entries(t)){let t;if("peerDependencies"===w&&e.packageJson.peerDependenciesMeta?.[y]?.optional)continue;let k=()=>t??=function({name:e,specifier:t,manifest:r,sourceRoot:i,packageRoot:s,workspacePackages:l}){let c=function(e,t){let r=e.match(/^(file|link|portal):/),i=e.replace(/^(file|link|portal):/,"");return a.isAbsolute(i)?i:r||i.startsWith("./")||i.startsWith("../")?a.resolve(t,i):void 0}(t,r.directory);if(c&&o.existsSync(c))return o.statSync(c).isFile()?{kind:"tarball",path:c,source:"local-tarball"}:{kind:"directory",path:c,source:"local-directory"};if(t.startsWith("workspace:")){let t=l.get(e);if(t)return{kind:"directory",path:t.directory,source:"local-directory"}}let d=function(e,t){for(let r of z(t)){let t=r;for(;;){let r=function(e,t){try{return n(a.resolve(t,"package.json")).resolve(`${e}/package.json`)}catch{return}}(e,t);if(r)return a.dirname(r);let i=a.resolve(t,"node_modules",...e.split("/"),"package.json");if(o.existsSync(i))return a.dirname(i);let s=function(e,t){let r=a.resolve(t,"node_modules",".pnpm");if(!o.existsSync(r))return;let i=e.startsWith("@")?e.replace("/","+"):e;for(let t of o.readdirSync(r)){if(!t.startsWith(`${i}@`))continue;let n=a.resolve(r,t,"node_modules",...e.split("/"),"package.json");if(o.existsSync(n))return a.dirname(n)}}(e,t);if(s)return s;let l=a.dirname(t);if(l===t)break;t=l}}}(e,[r.directory,s,i]);return d?{kind:"directory",path:d,source:"node_modules"}:void 0}({name:y,specifier:b,manifest:e,sourceRoot:r,packageRoot:i,workspacePackages:m}),S=function({name:e,specifier:t,privatePackagePatterns:r,privatePackagesFromLockfile:i}){var n;return(n=t,/^(file|link|portal|workspace):/.test(n)||a.isAbsolute(n)||n.startsWith("./")||n.startsWith("../"))?"local dependency":i.has(e)?"private registry tarball":r.some(t=>RegExp(`^${t.split("*").map(B).join(".*")}$`).test(e))?"private package pattern":void 0}({name:y,specifier:b,privatePackagePatterns:l,privatePackagesFromLockfile:c});if(S||(S=function(e){if(e?.kind!=="directory")return;let t=R(a.resolve(e.path,"package.json"));return t.publishConfig?.registry&&H(t.publishConfig.registry)?"private package registry":void 0}(k())),!S)continue;if(!(t=k())){if("optionalDependencies"!==w){let e=`Unable to vendor ${y} (${S}). Install it locally before cloud build.`,t=`${y}:${e}`;g.has(t)||(g.add(t),u.push({name:y,reason:e}))}continue}let C=await V({name:y,packageSource:t,vendorRoot:f,stagingSourceRoot:s,cache:h});d.push(C),function({stagingSourceRoot:e,manifest:t,dependencyField:r,name:i,vendoredPackage:n}){let s,l=a.resolve(e,t.relativePath),c=R(l),d=c[r];if(!d)return;let u=a.resolve(e,n.vendorPath);d[i]=`file:${(s=L(a.relative(a.dirname(l),u))).startsWith("./")||s.startsWith("../")?s:`./${s}`}`,o.writeFileSync(l,`${JSON.stringify(c,null,2)}
2
+ `)}({stagingSourceRoot:s,manifest:e,dependencyField:w,name:y,vendoredPackage:C}),p.add(L(e.relativePath)),"directory"===t.kind&&v.push({manifest:{relativePath:L(a.join(C.vendorPath,"package.json")),directory:t.path,packageJson:R(a.resolve(t.path,"package.json"))},dependencyFields:["dependencies","optionalDependencies","peerDependencies"]})}}}}async function er({appKey:e,filename:t,sha256:r,category:i,internal:n,domainId:o,cookie:a,signal:s}){return await g({internal:n,domainId:o,path:`/developer/resource_api/apps/${encodeURIComponent(e)}/cloud_build/file_upload/start`,method:"POST",body:JSON.stringify({filename:t,sha256:r,category:i}),headers:{"Content-Type":"application/json",...a?{Cookie:a}:{}},signal:s})}async function ei({appKey:e,uploadToken:t,size:r,internal:i,domainId:n,cookie:o,signal:a}){return await g({internal:i,domainId:n,path:`/developer/resource_api/apps/${encodeURIComponent(e)}/cloud_build/file_upload/finish`,method:"POST",body:JSON.stringify({upload_token:t,size:r}),headers:{"Content-Type":"application/json",...o?{Cookie:o}:{}},signal:a})}async function en({appId:e,category:t,filePath:r,filename:i=a.basename(r),...n}){let s=new Uint8Array(o.readFileSync(r)),l=p("sha256").update(s).digest("hex"),c=(await er({appKey:e,filename:i,sha256:l,category:t,...n})).data;if(!c?.upload_url||!c.upload_token)throw Error("File upload session is incomplete");await eo({uploadUrl:c.upload_url,body:new Blob([s]),headers:c.upload_headers||{},signal:n.signal});let d=await ei({appKey:e,uploadToken:c.upload_token,size:s.byteLength,...n});if(!d.data?.stored_file_id)throw Error("File upload finish response did not return stored_file_id");return d.data}async function eo({uploadUrl:e,body:t,headers:r,signal:i}){let n=await b(e,{method:"PUT",body:t,headers:r,signal:i}),o=n.headers.get("x-tt-logid")||"";if(!n.ok){let e=await n.text();throw Error([`File upload failed with HTTP ${n.status}`,e?`message: ${e}`:"",o?`log_id: ${o}`:""].filter(Boolean).join(", "))}}(i=t||(t={}))[i.UNKNOWN=0]="UNKNOWN",i[i.SOURCE=1]="SOURCE",i[i.ARTIFACT=2]="ARTIFACT";let ea=new Set([e.SUCCESS,e.FAIL,e.CANCELED,e.TIMEOUT]);class es{options;appDir;internal;env;secretEnv;appInfo;constructor(e,t){this.options=e,this.appDir=a.resolve(e.appDir||t),s({cwd:this.appDir,mode:e.envMode}),this.internal=w(this.appDir)}async start({versionTag:e,logs:t,runner:r,config:i,variables:n,properties:o}={}){this.resolveEnv(),this.resolveSecretEnv();let a=await this.upload();if(!a)throw Error("Cloud upload did not return stored_file_id");let s=await this.build({sourceRef:a,versionTag:e,runner:r,config:i,variables:n,properties:o});return t&&await this.waitForBuildJob({jobId:s}),s}async upload({packOnly:e}={}){let r={appDir:this.appDir,internal:this.internal};if(e){let e=await this.runWithSpinner("Preparing cloud build source...",()=>ee(r));if(this.logSourceDiagnostics(e),l.info(c.green(`Cloud build source archive: ${e.archivePath}`)),e.blockers.length>0)throw Error(e.blockers.join("\n"));return}let i=await this.resolveAppId("upload"),n=await this.resolveCookie(),o=await this.runWithSpinner("Preparing cloud build source...",()=>ee(r));if(this.logSourceDiagnostics(o),o.blockers.length>0)throw Error(o.blockers.join("\n"));let a=(await this.runWithSpinner("Uploading cloud build source...",()=>en({appId:i,category:t.SOURCE,filePath:o.archivePath,internal:this.internal,cookie:n}))).stored_file_id;if(!a)throw Error("Cloud build source upload did not return stored_file_id");return l.info(c.green(`Uploaded source: ${a}`)),a}async build({sourceRef:t,versionTag:r,runner:i,config:n,variables:s,properties:d}={}){let u;if(!t)throw Error("Cloud build requires --source-ref.");let{appId:p,appConfig:f}=await this.resolveAppInfo();if(!p)throw Error("Cloud build requires appId in doubao.config.ts or src/app.config.ts.");try{u=JSON.parse(o.readFileSync(a.resolve(this.appDir,"package.json"),"utf-8")).version}catch{u=void 0}let h=r||f.version||u;if(!h)throw Error("Cloud build requires --version-tag or version in src/app.config.ts/package.json.");let m=await this.resolveCookie(),v=(await this.runWithSpinner("Creating cloud build job...",()=>$({appKey:p,versionTag:h,cloudBuildSource:{type:"stored_file",ref:t},runner:i,config:n,variables:this.resolveBuildVariables(s),properties:d,internal:this.internal,cookie:m}))).data;if(!v?.job_id)throw Error("Cloud build create_job response did not return job_id");let y=e[v.status]||String(v.status);return l.info(c.green(`Created cloud build job: ${v.job_id}`)),l.info(`Cloud build status: ${y}`),v.job_id}async cancel({jobId:e,reason:t}){if(!e)throw Error("Cloud cancel requires job id.");let r=await this.resolveAppId("cancel"),i=await this.resolveCookie(),n=await this.runWithSpinner("Canceling cloud build job...",()=>_({appKey:r,jobId:e,reason:t||"Canceled by doubao CLI",internal:this.internal,cookie:i})),o=n.data?.job_id;if(!o)throw Error("Cloud build cancel response did not return job_id");return l.info(c.green(`Canceled cloud build job: ${o}`)),o}async getStatus({jobId:t}){if(!t)throw Error("Cloud status requires job id.");let r=await this.resolveAppId("build"),i=await this.resolveCookie(),n=(await E({appKey:r,jobId:t,internal:this.internal,cookie:i})).data;if(!n)throw Error("Cloud build status response did not return data");let o=e[n.status]||String(n.status);return l.info(c.green(`Cloud build job: ${n.job_id}`)),l.info(`Cloud build status: ${o}`),n}async log({jobId:e,start:t,end:r}){if(!e)throw Error("Cloud log requires job id.");let i=Number(t??1),n=Number(r??i+200-1);if(!Number.isInteger(i)||!Number.isInteger(n)||i<1||n<i)throw Error("Cloud log requires a valid line range.");let o=await this.resolveAppId("log"),a=await this.resolveCookie(),s=(await j({appKey:o,jobId:e,start:i,end:n,internal:this.internal,cookie:a})).data;if(!s)throw Error("Cloud build log response did not return data");return this.printLogLines(s.lines),l.info(`Cloud build logs: ${s.start??i}-${s.end??n} / ${s.total_line_count}`),s}async waitForBuildJob({jobId:t}){let r=await this.resolveAppId("build"),i=await this.resolveCookie(),n=d("Waiting for cloud build to finish...").start(),o=!1;try{for(;;){let a=await E({appKey:r,jobId:t,internal:this.internal,cookie:i}),s=a.data?.status,l=void 0===s?"UNKNOWN":e[s]||String(s);if(n.text=`Cloud build status: ${l}`,void 0!==s&&ea.has(s)){if(s===e.SUCCESS){n.succeed(`Cloud build status: ${l}`),o=!0;return}throw n.fail(`Cloud build status: ${l}`),o=!0,await this.printFailureLogs({appId:r,jobId:t,cookie:i}),Error(`Cloud build ended with status: ${l}`)}await new Promise(e=>setTimeout(e,5e3))}}catch(e){throw o||n.fail(),e}}async printFailureLogs({appId:e,jobId:t,cookie:r}){let i=1,n=0,o=!1;try{for(l.info(c.yellow("Fetching cloud build failure logs..."));n<1e3&&i<=1e3;){let a=Math.min(i+200-1,1e3),s=(await j({appKey:e,jobId:t,start:i,end:a,internal:this.internal,cookie:r})).data;if(!s||0===s.lines.length)break;this.printLogLines(s.lines),n+=s.lines.length;let l=s.lines.at(-1)?.line_number,c=void 0!==l&&l>=i?l+1:void 0!==s.end&&s.end>=i?s.end+1:i,d=c>i;if(!(o=s.has_more_after&&d))break;i=c}o&&l.info(c.yellow(`Cloud build failure logs truncated after 1000 lines. Use jobId ${t} to query more logs.`))}catch(e){l.info(c.yellow(`Warning: Failed to fetch cloud build failure logs: ${C(e)}`))}}async resolveCookie(){return await k(this.options,{internal:this.internal})}resolveBuildVariables(e){let t=new Map;for(let[e,r]of Object.entries(this.resolveEnv()))t.set(e,{name:e,value:r,env_var_name:e});for(let[e,r]of Object.entries(this.resolveSecretEnv()))t.set(e,{name:e,value:r,env_var_name:e,is_secret:!0});for(let r of e||[])t.set(r.env_var_name||r.name,r);return t.size>0?Array.from(t.values()):void 0}resolveEnv(){return this.options.env?(this.env??=el(this.resolveAppPath(this.options.env),"Env"),this.env):{}}resolveSecretEnv(){return this.options.secretEnv?(this.secretEnv??=el(this.resolveAppPath(this.options.secretEnv),"Secret env"),this.secretEnv):{}}resolveAppPath(e){return a.isAbsolute(e)?e:a.resolve(this.appDir,e)}async resolveAppId(e){let{appId:t}=await this.resolveAppInfo();if(!t)throw Error(`Cloud ${e} requires appId in doubao.config.ts or src/app.config.ts.`);return t}async resolveAppInfo(){if(this.appInfo)return this.appInfo;let e=await y({cwd:this.appDir,customConfigFile:this.options.config}),t=await S({cwd:this.appDir})??{};return this.appInfo={appId:e.experiments?.taro?.appId?e.experiments?.taro?.appId:t.appId,appConfig:t},this.appInfo}logSourceDiagnostics(e){for(let t of e.warnings)l.info(c.yellow(`Warning: ${t}`));for(let t of e.blockers)l.error(c.red(`Blocker: ${t}`))}printLogLines(e){for(let t of e)console.log(t.content)}async runWithSpinner(e,t){let r=d(e).start();try{let e=await t();return r.succeed(),e}catch(e){throw r.fail(),e}}}function el(e,t){if(!o.existsSync(e))throw Error(`${t} file does not exist: ${e}`);return function(e){let t={};for(let r of e.split(/\r?\n/)){let e=r.trim();if(!e||e.startsWith("#"))continue;let i=e.startsWith("export ")?e.slice(7).trimStart():e,n=i.indexOf("=");if(n<=0)continue;let o=i.slice(0,n).trim();/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(o)&&(t[o]=function(e){let t=e[0];if(('"'===t||"'"===t)&&e.endsWith(t))return e.slice(1,-1);let r=e.indexOf(" #");return -1===r?e:e.slice(0,r).trimEnd()}(i.slice(n+1).trim()))}return t}(o.readFileSync(e,"utf8"))}export{es as CloudBuildLauncher};
3
+ //# sourceMappingURL=805.js.map
package/dist/cli/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import"node:module";import{logger as e}from"@rsbuild/core";import o from"chalk";import{program as r}from"commander";import{dev as a,login as t,logout as i,build as n,analyze as c}from"../384.js";function s(){if(!process.env.NODE_ENV){let e=process.argv[2];process.env.NODE_ENV=["build","package","deploy","analyze","perf"].includes(e)?"production":"development"}e.greet("Doubao Apps SDK v0.0.33")}function p(e){return e.option("-c --config <config>","specify the configuration file, can be a relative or absolute path").option("--env-mode <mode>","specify the env mode to load the `.env.[mode]` file"),e}function d(s=process.cwd(),l={},m="0.0.33"){var u;r.name("doubao").usage("<command> [options]").version(m),p(r.command("dev")).description("starting the dev server...").action(async o=>{try{await a(o)}catch(o){e.error("Failed to dev"),e.error(o),process.exit(1)}}),((u=r.command("login")).option("--login-browser <browser>","browser for interactive login: system Chrome/Edge first, optional Playwright Chromium fallback (auto/chrome/msedge/chromium)","auto").option("--login-browser-path <path>","custom Chromium-based browser executable path for login"),u).description("login to Doubao Apps").action(async r=>{try{await t(r),e.info(o.green("Login succeeded."))}catch(r){e.error(o.red("Failed to login")),e.error(r),process.exit(1)}}),r.command("logout").description("clear Doubao Apps login state").action(async()=>{try{await i(),e.info(o.green("Logout succeeded."))}catch(r){e.error(o.red("Failed to logout")),e.error(r),process.exit(1)}}),p(r.command("build")).description("starting build the applet").option("-a --archive","Archive all package",!1).option("-ch --channel <string>","Need channel name").action(async o=>{try{await n(o)}catch(o){e.error("Failed to build"),e.error(o),process.exit(1)}}),p(r.command("analyze")).description("analyze the applet package").action(async r=>{try{await c(r)}catch(r){e.error(o.red("Failed to analyze")),e.error(r),process.exit(1)}}),r.parse()}export{s as prepareCli,d as runCli};
1
+ import"node:module";import{logger as o}from"@rsbuild/core";import e from"chalk";import{program as r}from"commander";import{dev as i,login as a,logout as t,build as n,analyze as c}from"../384.js";import{CloudBuildLauncher as d}from"../805.js";function l(){if(!process.env.NODE_ENV){let o=process.argv[2];process.env.NODE_ENV=["build","package","deploy","analyze","perf"].includes(o)?"production":"development"}o.greet("Doubao Apps SDK v0.0.34")}function s(o){return o.option("-c --config <config>","specify the configuration file, can be a relative or absolute path").option("--env-mode <mode>","specify the env mode to load the `.env.[mode]` file"),o}function p(o){return o.option("--login-browser <browser>","browser for interactive login: system Chrome/Edge first, optional Playwright Chromium fallback (auto/chrome/msedge/chromium)","auto").option("--login-browser-path <path>","custom Chromium-based browser executable path for login"),o}function u(l=process.cwd(),b={},g="0.0.34"){r.name("doubao").usage("<command> [options]").version(g),s(r.command("dev")).description("starting the dev server...").option("--hdt","use HDT debug driver").option("--devtools","use DevTools debug driver").action(async e=>{try{await i(function(o){let{hdt:e,devtools:r,...i}=o;if(e&&r)throw Error("Only one debug driver flag can be used: --hdt or --devtools.");return e?{...i,debugDriver:"hdt"}:r?{...i,debugDriver:"devtools"}:i}(e))}catch(e){o.error("Failed to dev"),o.error(e),process.exit(1)}}),p(r.command("login")).description("login to Doubao Apps").action(async r=>{try{await a(r),o.info(e.green("Login succeeded."))}catch(r){o.error(e.red("Failed to login")),o.error(r),process.exit(1)}}),r.command("logout").description("clear Doubao Apps login state").action(async()=>{try{await t(),o.info(e.green("Logout succeeded."))}catch(r){o.error(e.red("Failed to logout")),o.error(r),process.exit(1)}}),s(r.command("build")).description("starting build the applet").option("-a --archive","Archive all package",!1).option("-ch --channel <string>","Need channel name").action(async e=>{try{await n(e)}catch(e){o.error("Failed to build"),o.error(e),process.exit(1)}}),s(r.command("analyze")).description("analyze the applet package").action(async r=>{try{await c(r)}catch(r){o.error(e.red("Failed to analyze")),o.error(r),process.exit(1)}});let m=p(s(r.command("cloud"))).description("upload source and create a cloud build job").option("--app-dir <dir>","app source directory").option("--version-tag <tag>","cloud build version tag").option("--env <file>","env file for cloud build variables").option("--secret-env <file>","secret env file for cloud build variables").option("--logs","wait for cloud build result and print failure logs").action(async r=>{try{await new d(r,l).start({versionTag:r.versionTag,logs:r.logs})}catch(r){o.error(e.red("Failed to cloud build")),o.error(r),process.exit(1)}});p(s(m.command("upload"))).description("prepare and upload a cloud build source archive").option("--app-dir <dir>","app source directory").option("--pack-only","only create the cloud build source archive").action(async r=>{try{await new d(r,l).upload({packOnly:r.packOnly})}catch(r){o.error(e.red("Failed to cloud upload")),o.error(r),process.exit(1)}}),p(s(m.command("build"))).description("create a cloud build job from an uploaded source archive").option("--app-dir <dir>","app source directory").option("--source-ref <storedFileId>","uploaded cloud build source stored_file_id").option("--version-tag <tag>","cloud build version tag").option("--env <file>","env file for cloud build variables").option("--secret-env <file>","secret env file for cloud build variables").action(async r=>{try{await new d(r,l).build({sourceRef:r.sourceRef,versionTag:r.versionTag})}catch(r){o.error(e.red("Failed to cloud build")),o.error(r),process.exit(1)}}),p(s(m.command("cancel"))).description("cancel a cloud build job").argument("<job-id>","cloud build job id").option("--app-dir <dir>","app source directory").option("--reason <reason>","cloud build cancel reason").action(async(r,i)=>{try{await new d(i,l).cancel({jobId:r,reason:i.reason})}catch(r){o.error(e.red("Failed to cloud cancel")),o.error(r),process.exit(1)}}),p(s(m.command("log"))).description("print cloud build job logs").argument("<job-id>","cloud build job id").option("--app-dir <dir>","app source directory").option("--start <line>","start log line").option("--end <line>","end log line").action(async(r,i)=>{try{await new d(i,l).log({jobId:r,start:i.start,end:i.end})}catch(r){o.error(e.red("Failed to cloud log")),o.error(r),process.exit(1)}}),r.parse()}export{l as prepareCli,u as runCli};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
- import"node:module";import e from"fs";import t,{promises as a}from"node:fs";import r from"node:path";import{execFileSync as o}from"node:child_process";import{fileURLToPath as i}from"node:url";import{dev_server_log_plugin_getDebugDriver as n,getErrorMessage as s,getDebugScenes as c,requestDoubaoAppsPlatform as p,Launcher as l,executeDebugScene as u,loadDebugScene as d,archivePackage as f,isDebugMode as y}from"../751.js";async function h({appId:e,versionTag:a,versionCode:r,packagePath:o,internal:i,domainId:n,cookie:s,needAuth:c=!0}){let l=new FormData,u=new Blob([new Uint8Array(t.readFileSync(o))],{type:"application/zip"});l.append("applet_file",u,"doubao_app.zip"),l.append("applet_version_code",r.toString());let d=`/developer/${c?"resource_api":"resource_internal_api"}/apps/${encodeURIComponent(e)}/versions/${encodeURIComponent(a)}/package/upload_applet`;return await p({internal:i,domainId:n,path:d,method:"POST",body:l,headers:s?{Cookie:s}:void 0})}let m=r.join("src","app.config.ts"),w=r.join("src","app.ts");function g(e){return e.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}async function b(e,t,o=""){for(let i of[m,w].map(t=>r.join(e,t))){let e;try{e=await a.readFile(i,"utf8")}catch(e){if(e?.code==="ENOENT")continue;throw e}let r=e.replace("<%= appId %>",g(t)).replace("<%= name %>",g(o));r!==e&&await a.writeFile(i,r,"utf8")}}let j=new Set(["node_modules","dist",".git"]);async function E(e,t,o={}){let{includeAI:i=!0}=o,n=async(e,t)=>{for(let o of(await a.mkdir(t,{recursive:!0}),await a.readdir(e,{withFileTypes:!0}))){let s=r.join(e,o.name),c=r.join(t,o.name);if(o.isDirectory()){if(j.has(o.name)||"references"===o.name&&!i)continue;await n(s,c)}else{if("AGENTS.md"===o.name&&!i)continue;await a.copyFile(s,c)}}};await n(e,t)}let v=new Set([".js",".cjs",".mjs",".ts",".tsx",".jsx",".json",".md",".txt",".scss",".css",".less",".html",".yml",".yaml"]),D=[["@byted-doubao-apps/framework","@doubao-apps/framework"],["@byted-doubao-apps/kit","@doubao-apps/kit"],["@byted-doubao-apps/ai","@doubao-apps/ai"],["@byted-doubao-apps/create","@doubao-apps/create"],["@byted-doubao-apps/taro-runtime","@doubao-apps/taro-runtime"]],O=["doubao.config.ts"],N=["@byted-doubao-apps/deploy","@doubao-apps/deploy"],S=["deploy"],_=["pnpm run deploy","doubao.config.ts","部署到豆包平台"];function $(e){let t=e;for(let[e,a]of D)t=t.replace(RegExp(e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g"),a);return t}async function k(e,t){for(let i of(await a.readdir(e,{withFileTypes:!0}))){var o;let n=r.join(e,i.name);if(function(e){return O.some(t=>t===e)}(i.name)){await a.rm(n,{recursive:!0,force:!0});continue}if(i.isDirectory()){await k(n,t);continue}if(o=i.name,!v.has(r.extname(o))&&"package.json"!==o&&"tsconfig.json"!==o)continue;let s=await a.readFile(n,"utf-8");await a.writeFile(n,function(e,t,a){if("package.json"===e){let e=JSON.parse($(t));if(e.scripts&&"object"==typeof e.scripts){for(let t of S)delete e.scripts[t];0===Object.keys(e.scripts).length&&delete e.scripts}for(let t of["dependencies","devDependencies","peerDependencies"])if(e[t]&&"object"==typeof e[t]){for(let r of Object.keys(e[t]))N.some(e=>e===r)?delete e[t][r]:r.startsWith("@doubao-apps/")&&(e[t][r]=`^${a}`);0===Object.keys(e[t]).length&&delete e[t]}return`${JSON.stringify(e,null,2)}
2
- `}return"README.md"===e||"AGENTS.md"===e?$(t).split("\n").filter(e=>!_.some(t=>e.includes(t))).join("\n"):$(t)}(i.name,s,t))}}async function T(e,a){let o=r.join(e,"package.json");if(!t.existsSync(o))throw Error("package.json not found in template");let i=JSON.parse(t.readFileSync(o,"utf-8"));i.name=a,t.writeFileSync(o,`${JSON.stringify(i,null,2)}
3
- `)}let x=["starter","empty"],P=i(import.meta.url),F=r.dirname(P),C={".gitignore":["dist","node_modules",".DS_Store"]};async function I(e){for(let[t,o]of Object.entries(C))await a.writeFile(r.join(e,t),`${o.join("\n")}
4
- `)}async function A(){let e=r.resolve(F,"..","package.json");return JSON.parse(await a.readFile(e,"utf-8")).version??"0.0.1"}async function J(e){let t=r.join(e,".git");if(!await a.stat(t).then(e=>e.isDirectory()).catch(e=>{if(e?.code==="ENOENT")return!1;throw e}))try{o("git",["init"],{cwd:e,stdio:"ignore"})}catch(t){if(t?.code==="ENOENT")return;throw Error(`Failed to initialize git repository: ${e}`,{cause:t})}}async function R({template:e,projectDir:t,public:o=!0,includeAI:i,appId:n,name:s,packageName:c,overwrite:p}){if(!r.isAbsolute(t))throw Error(`Project directory must be an absolute path: ${t}`);if(!x.includes(e))throw Error(`Invalid template: ${e}. Valid options: ${x.join(", ")}`);let l=r.resolve(F,`template-${e}`);try{if(!(await a.stat(l)).isDirectory())throw Error(`Template path is not a directory: ${l}`)}catch(e){if(e?.code==="ENOENT")throw Error(`Template directory not found: ${l}`,{cause:e});throw Error(`Unable to access template directory: ${l}`,{cause:e})}if(await a.stat(t).then(e=>{if(!e.isDirectory())throw Error(`Project path is not a directory: ${t}`);return!0}).catch(e=>{if(e?.code==="ENOENT")return!1;throw Error(`Unable to access project directory: ${t}`,{cause:e})})){if((await a.readdir(t)).length>0&&!p)throw Error(`Project directory is not empty: ${t}`)}else await a.mkdir(t,{recursive:!0});await E(l,t,{includeAI:i}),o&&await k(t,await A()),await I(t),await J(t);let u=c??r.basename(t).trim().toLowerCase().replace(/\s+/g,"-").replace(/^[._]/,"").replace(/[^a-z0-9-~._]+/g,"-");await T(t,u),await b(t,n??`com.doubao.${u}`,s??"")}function U(e){return[{name:"DoubaoAppsDevPlugin",setup(t){t.onDevCompileDone(()=>{e?.onDevCompileDone?.()})}}]}class z{appDirectory;launcher;constructor(e,t=l){this.appDirectory=e,this.launcher=new t(e)}async create(e){await R(e)}async dev(e={}){let{compileHooks:t,...a}=e;return await this.launcher.dev({...a,rsbuildPlugins:U(t),signingEncryptionOptions:e.signingEncryptionOptions})}async build(e={}){process.env.NODE_ENV="production";let{compileHooks:t,...a}=e;await this.launcher.build({...a,rsbuildPlugins:U(t),signingEncryptionOptions:e.signingEncryptionOptions,versionTag:e.versionTag})}async discoverWidgets(){return Object.values(this.launcher.context.metadata.getData().widgets)}async discoverPages(){return Object.values(this.launcher.context.metadata.getData().pages)}async discoverTools(){return Object.values(this.launcher.context.metadata.getData().tools)}async pushWidget(e){let{widgetId:t,deviceId:a,botId:r,widgetData:o,hdt:i}=e,s=await n({hdt:i,deviceId:a}),c=this.launcher.context.metadata.appId;s.pushWidget({appId:c,widgetId:t,widgetData:o,botId:r})}async openPage(e){let{pageId:t,pageData:a,pageSettings:r,mode:o,hdt:i,deviceId:s}=e,c=await n({hdt:i,deviceId:s}),p=this.launcher.context.metadata.appId;c.openPage({appId:p,pageId:t,pageData:a,pageSettings:r,mode:o})}async callTool(e){let{toolId:t,toolData:a,hdt:r,deviceId:o}=e,i=await n({hdt:r,deviceId:o}),s=this.launcher.context.metadata.appId;i.callTool({appId:s,toolId:t,toolData:a})}async executeDebugScene(e){let{matchedScene:t,variables:a,deviceId:r,hdt:o}=e,i=this.launcher.context.metadata.appId,s=await n({hdt:o,deviceId:r});await u({matchedScene:t,appId:i,driver:s,variables:a})}async getDebugScenes(){let e=await c(this.appDirectory||process.cwd());return await Promise.all(e.map(async e=>({...e,content:await d(e.path)})))}async deploy(t){let{versionTag:a,cookie:r,appKey:o,signingEncryptionOptions:i}=t;process.env.NODE_ENV="production",await this.launcher.build({skipCleanupRootPath:!0,cookie:r,signingEncryptionOptions:i,versionTag:t.versionTag});let{manifest:n}=this.launcher.context,{appId:c,versionCode:p}=n,{packageResource:l}=await f({channelName:"doubao_app",manifest:n,rootPath:this.launcher.rootPath});if(!l)throw Error("Failed to archive package");try{let e=await h({appId:o||c,versionTag:a,versionCode:p,packagePath:l.resource,internal:t.internal??this.launcher.context.internal,cookie:r});return console.log("Deploy success:",e),e}catch(t){console.error("Deploy error:",s(t));let e=s(t);try{return JSON.parse(e)}catch{return{code:-1,message:e,data:null,log_id:""}}}finally{y()||e.rmSync(this.launcher.rootPath,{recursive:!0,force:!0})}}}export{z as DoubaoAppsSDK};
1
+ import"node:module";import e from"fs";import t from"node:path";import a,{promises as r}from"node:fs";import{execFileSync as o}from"node:child_process";import{fileURLToPath as i}from"node:url";import{isDebugMode as n}from"../709.js";import{getDebugScenes as c,deployDoubaoAppsPlatformPackage as s,Launcher as l,executeDebugScene as u,loadDebugScene as p,dev_server_log_plugin_getDebugDriver as d}from"../751.js";import{CloudBuildLauncher as h}from"../805.js";let f=t.join("src","app.config.ts"),y=t.join("src","app.ts");function m(e){return e.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}async function w(e,a,o=""){for(let i of[f,y].map(a=>t.join(e,a))){let e;try{e=await r.readFile(i,"utf8")}catch(e){if(e?.code==="ENOENT")continue;throw e}let t=e.replace("<%= appId %>",m(a)).replace("<%= name %>",m(o));t!==e&&await r.writeFile(i,t,"utf8")}}let g=new Set(["node_modules","dist",".git"]);async function b(e,a){let o=async(e,a)=>{for(let i of(await r.mkdir(a,{recursive:!0}),await r.readdir(e,{withFileTypes:!0}))){let n=t.join(e,i.name),c=t.join(a,i.name);if(i.isDirectory()){if(g.has(i.name))continue;await o(n,c)}else await r.copyFile(n,c)}};await o(e,a)}let E=new Set([".js",".cjs",".mjs",".ts",".tsx",".jsx",".json",".md",".txt",".scss",".css",".less",".html",".yml",".yaml"]),j=[["@byted-doubao-apps/framework","@doubao-apps/framework"],["@byted-doubao-apps/kit","@doubao-apps/kit"],["@byted-doubao-apps/ai","@doubao-apps/ai"],["@byted-doubao-apps/create","@doubao-apps/create"],["@byted-doubao-apps/taro-runtime","@doubao-apps/taro-runtime"]],D=["doubao.config.ts"],_=["@byted-doubao-apps/deploy","@doubao-apps/deploy"],S=["deploy"],v=["pnpm run deploy","doubao.config.ts","部署到豆包平台"];function x(e){let t=e;for(let[e,a]of j)t=t.replace(RegExp(e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g"),a);return t}async function N(e,a){for(let i of(await r.readdir(e,{withFileTypes:!0}))){var o;let n=t.join(e,i.name);if(function(e){return D.some(t=>t===e)}(i.name)){await r.rm(n,{recursive:!0,force:!0});continue}if(i.isDirectory()){await N(n,a);continue}if(o=i.name,!E.has(t.extname(o))&&"package.json"!==o&&"tsconfig.json"!==o)continue;let c=await r.readFile(n,"utf-8");await r.writeFile(n,function(e,t,a){if("package.json"===e){let e=JSON.parse(x(t));if(e.scripts&&"object"==typeof e.scripts){for(let t of S)delete e.scripts[t];0===Object.keys(e.scripts).length&&delete e.scripts}for(let t of["dependencies","devDependencies","peerDependencies"])if(e[t]&&"object"==typeof e[t]){for(let r of Object.keys(e[t]))_.some(e=>e===r)?delete e[t][r]:r.startsWith("@doubao-apps/")&&(e[t][r]=`^${a}`);0===Object.keys(e[t]).length&&delete e[t]}return`${JSON.stringify(e,null,2)}
2
+ `}return"README.md"===e||"AGENTS.md"===e?x(t).split("\n").filter(e=>!v.some(t=>e.includes(t))).join("\n"):x(t)}(i.name,c,a))}}async function O(e,r){let o=t.join(e,"package.json");if(!a.existsSync(o))throw Error("package.json not found in template");let i=JSON.parse(a.readFileSync(o,"utf-8"));i.name=r,a.writeFileSync(o,`${JSON.stringify(i,null,2)}
3
+ `)}let C=["starter","empty"],P=i(import.meta.url),k=t.dirname(P),T={".gitignore":["dist","node_modules",".DS_Store"]};async function $(e){for(let[a,o]of Object.entries(T))await r.writeFile(t.join(e,a),`${o.join("\n")}
4
+ `)}async function F(){let e=t.resolve(k,"..","package.json");return JSON.parse(await r.readFile(e,"utf-8")).version??"0.0.1"}async function A(e){let a=t.join(e,".git");if(!await r.stat(a).then(e=>e.isDirectory()).catch(e=>{if(e?.code==="ENOENT")return!1;throw e}))try{o("git",["init"],{cwd:e,stdio:"ignore"})}catch(t){if(t?.code==="ENOENT")return;throw Error(`Failed to initialize git repository: ${e}`,{cause:t})}}async function K({template:e,projectDir:a,public:o=!0,appId:i,name:n,packageName:c,overwrite:s}){if(!t.isAbsolute(a))throw Error(`Project directory must be an absolute path: ${a}`);if(!C.includes(e))throw Error(`Invalid template: ${e}. Valid options: ${C.join(", ")}`);let l=t.resolve(k,`template-${e}`);try{if(!(await r.stat(l)).isDirectory())throw Error(`Template path is not a directory: ${l}`)}catch(e){if(e?.code==="ENOENT")throw Error(`Template directory not found: ${l}`,{cause:e});throw Error(`Unable to access template directory: ${l}`,{cause:e})}if(await r.stat(a).then(e=>{if(!e.isDirectory())throw Error(`Project path is not a directory: ${a}`);return!0}).catch(e=>{if(e?.code==="ENOENT")return!1;throw Error(`Unable to access project directory: ${a}`,{cause:e})})){if((await r.readdir(a)).length>0&&!s)throw Error(`Project directory is not empty: ${a}`)}else await r.mkdir(a,{recursive:!0});await b(l,a),o&&await N(a,await F()),await $(a),await A(a);let u=c??t.basename(a).trim().toLowerCase().replace(/\s+/g,"-").replace(/^[._]/,"").replace(/[^a-z0-9-~._]+/g,"-");await O(a,u),await w(a,i??"db_xxxxxx",n??"")}function B(e){return[{name:"DoubaoAppsDevPlugin",setup(t){t.onDevCompileDone(()=>{e?.onDevCompileDone?.()})}}]}class L{appDirectory;launcher;constructor(e,t=l){this.appDirectory=e,this.launcher=new t(e)}createCloudBuildLauncher(e={}){return new h(e,this.appDirectory||process.cwd())}async create(e){await K(e)}async dev(e={}){let{compileHooks:t,...a}=e;return await this.launcher.dev({...a,rsbuildPlugins:B(t),signingEncryptionOptions:e.signingEncryptionOptions})}async build(e={}){process.env.NODE_ENV="production";let{compileHooks:t,...a}=e;await this.launcher.build({...a,rsbuildPlugins:B(t),signingEncryptionOptions:e.signingEncryptionOptions,versionTag:e.versionTag})}async discoverWidgets(){return Object.values(this.launcher.context.metadata.getData().widgets)}async discoverPages(){return Object.values(this.launcher.context.metadata.getData().pages)}async discoverTools(){return Object.values(this.launcher.context.metadata.getData().tools)}async pushWidget(e){let{widgetId:t,deviceId:a,botId:r,widgetData:o,debugDriver:i}=e,n=await d({debugDriver:i,deviceId:a}),c=this.launcher.context.metadata.appId;n.pushWidget({appId:c,widgetId:t,widgetData:o,botId:r})}async openPage(e){let{pageId:t,pageData:a,pageSettings:r,mode:o,debugDriver:i,deviceId:n}=e,c=await d({debugDriver:i,deviceId:n}),s=this.launcher.context.metadata.appId;c.openPage({appId:s,pageId:t,pageData:a,pageSettings:r,mode:o})}async callTool(e){let{toolId:t,toolData:a,debugDriver:r,deviceId:o}=e,i=await d({debugDriver:r,deviceId:o}),n=this.launcher.context.metadata.appId;i.callTool({appId:n,toolId:t,toolData:a})}async executeDebugScene(e){let{matchedScene:t,variables:a,deviceId:r,debugDriver:o}=e,i=this.launcher.context.metadata.appId,n=await d({debugDriver:o,deviceId:r});await u({matchedScene:t,appId:i,driver:n,variables:a})}async getDebugScenes(){let e=await c(this.appDirectory||process.cwd());return await Promise.all(e.map(async e=>({...e,content:await p(e.path)})))}async cloud(e={}){let{versionTag:t,logs:a,runner:r,createJobConfig:o,variables:i,properties:n,...c}=e;return await this.createCloudBuildLauncher(c).start({versionTag:t,logs:a,runner:r,config:o,variables:i,properties:n})}async cloudUpload(e={}){let{packOnly:t,...a}=e;return await this.createCloudBuildLauncher(a).upload({packOnly:t})}async cloudBuild(e){let{sourceRef:t,versionTag:a,runner:r,createJobConfig:o,variables:i,properties:n,...c}=e;return await this.createCloudBuildLauncher(c).build({sourceRef:t,versionTag:a,runner:r,config:o,variables:i,properties:n})}async cloudCancel(e){let{jobId:t,reason:a,...r}=e;return await this.createCloudBuildLauncher(r).cancel({jobId:t,reason:a})}async cloudGetStatus(e){let{jobId:t,...a}=e;return await this.createCloudBuildLauncher(a).getStatus({jobId:t})}async cloudLog(e){let{jobId:t,start:a,end:r,...o}=e;return await this.createCloudBuildLauncher(o).log({jobId:t,start:a,end:r})}async deploy(t){let{versionTag:a,cookie:r,token:o,appKey:i,signingEncryptionOptions:c}=t;if(!r&&!o)throw Error("Doubao Apps SDK deploy requires cookie or Developer Open Build Token.");process.env.NODE_ENV="production",await this.launcher.build({skipCleanupRootPath:!0,cookie:r,signingEncryptionOptions:c,versionTag:a});let{manifest:l}=this.launcher.context;try{return await s({versionTag:a,...i?{appKey:i}:{},manifest:l,rootPath:this.launcher.rootPath,internal:t.internal??this.launcher.context.internal,cookie:r,token:o})}finally{n()||e.rmSync(this.launcher.rootPath,{recursive:!0,force:!0})}}}export{DebugDriverType}from"../709.js";export{L as DoubaoAppsSDK};
5
5
  //# sourceMappingURL=sdk.js.map
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import"node:module";let e=e=>e,o=e=>e;export{o as defineAppConfig,e as defineConfig};
1
+ import"node:module";let e=e=>e,_=e=>e;export{CloudBuildLauncher}from"./805.js";export{DEBUG_DRIVER_NAMES,DebugDriverType,isDebugDriverName}from"./709.js";export{_ as defineAppConfig,e as defineConfig};
2
2
  //# sourceMappingURL=index.js.map
package/dist/types.d.ts CHANGED
@@ -22,7 +22,7 @@ declare interface AIAppMetadata {
22
22
  *
23
23
  * 1x, 2x, 3x 分别对应 1x, 2x, 3x 倍的图标
24
24
  */
25
- icons?: string | Record<'1x' | '2x' | '3x', string>;
25
+ icons?: Icons;
26
26
  /**
27
27
  * 应用关键词
28
28
  */
@@ -63,7 +63,7 @@ declare type AIWidgetMetadata = {
63
63
  /**
64
64
  * Icons
65
65
  */
66
- icons?: string | Record<'1x' | '2x' | '3x', string>;
66
+ icons?: Icons;
67
67
  /**
68
68
  * Set extra widget properties
69
69
  */
@@ -103,7 +103,7 @@ declare interface BaseModuleDefinition extends BaseDefinition {
103
103
  /**
104
104
  * Icons
105
105
  */
106
- icons?: string | Record<'1x' | '2x' | '3x', string>;
106
+ icons?: Icons;
107
107
  /**
108
108
  * Used to check widget is corrected for this package
109
109
  */
@@ -207,7 +207,7 @@ declare type DoubaoAppsLegacyEntryConfig<Meta extends object> = Record<string, M
207
207
  * });
208
208
  * ```
209
209
  */
210
- export declare interface DoubaoAppsMetaConfig extends Omit<AIAppMetadata, 'appId'> {
210
+ export declare interface DoubaoAppsMetaConfig extends AIAppMetadata {
211
211
  /**
212
212
  * Doubao app ID.
213
213
  */
@@ -250,6 +250,8 @@ export declare type DoubaoAppsWidgetMetaConfig = Omit<AIWidgetMetadata, 'id'> &
250
250
  id?: string;
251
251
  };
252
252
 
253
+ declare type Icons = string | Record<'1x' | '2x' | '3x', string>;
254
+
253
255
  declare interface PageDefinition extends UIModuleDefinition {
254
256
  /**
255
257
  * The page navbar title
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@doubao-apps/kit",
3
- "version": "0.0.33",
3
+ "version": "0.0.34",
4
4
  "type": "module",
5
5
  "types": "./dist/types.d.ts",
6
6
  "bin": {
@@ -38,49 +38,41 @@
38
38
  "dist",
39
39
  "bin",
40
40
  "README.md",
41
+ "SDK.md",
41
42
  "LICENCE",
42
43
  "!dist/**/*.map"
43
44
  ],
44
45
  "dependencies": {
45
- "@ast-grep/napi": "^0.30.0",
46
46
  "@lynx-js/external-bundle-rsbuild-plugin": "npm:@lynx-js/external-bundle-rsbuild-plugin-canary@0.1.1-canary-20260415-e5b0f668",
47
47
  "@lynx-js/react-alias-rsbuild-plugin": "0.12.7",
48
48
  "@lynx-js/react-rsbuild-plugin": "npm:@lynx-js/react-rsbuild-plugin-canary@0.12.11-canary-20260312-39fdf1ab",
49
49
  "@lynx-js/rspeedy": "0.13.3",
50
50
  "@lynx-js/runtime-wrapper-webpack-plugin": "0.1.3",
51
- "@lynx-js/types": "3.6.0",
51
+ "@manypkg/get-packages": "2.2.0",
52
+ "@pnpm/lockfile.fs": "1001.1.18",
52
53
  "@rsbuild/core": "1.7.2",
53
54
  "@rsbuild/plugin-less": "1.2.4",
54
- "@rsbuild/plugin-react": "1.4.5",
55
55
  "@rsbuild/plugin-sass": "1.5.0",
56
- "@rsbuild/plugin-svgr": "1.2.0",
57
56
  "@rsbuild/plugin-type-check": "1.2.1",
58
57
  "@swc/core": "1.15.11",
59
- "@types/json-schema": "7.0.15",
60
58
  "ansi-escapes": "7.2.0",
61
59
  "archiver": "7.0.1",
62
- "axios": "1.13.6",
63
60
  "chalk": "5.6.2",
64
61
  "commander": "12.0.0",
65
- "defu": "6.1.4",
66
- "detect-port": "2.1.0",
67
62
  "execa": "5.0.1",
68
63
  "express": "5.2.1",
69
- "gradient-string": "2.0.2",
70
64
  "inquirer": "13.1.0",
71
65
  "inquirer-search-list": "^1.2.6",
72
66
  "jiti": "^2.4.2",
73
67
  "lodash-es": "4.17.21",
74
68
  "magic-string": "^0.30.0",
69
+ "npm-packlist": "10.0.1",
75
70
  "ora": "^5.0.0",
71
+ "package-manager-detector": "1.3.0",
76
72
  "picocolors": "1.1.1",
77
73
  "playwright-core": "^1.56.1",
78
- "schema-utils": "^4.2.0",
79
74
  "swc-walk": "1.0.1",
80
- "tapable": "2.2.1",
81
- "tmp": "0.2.5",
82
- "uqr": "0.1.2",
83
- "zod": "3.23.8"
75
+ "tapable": "2.2.1"
84
76
  },
85
77
  "optionalDependencies": {
86
78
  "@napi-rs/keyring": "^1.2.0"