@giteeteam/apps-cli 1.1.0 → 1.1.2-alpha.1
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/index.js +8 -8
- package/dist/templates/skill/guides/02-extension-points.md +44 -0
- package/dist/templates/skill/guides/05-agent-prompt-template.md +1 -0
- package/package.json +3 -2
- package/templates/skill/guides/02-extension-points.md +44 -0
- package/templates/skill/guides/05-agent-prompt-template.md +1 -0
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var
|
|
3
|
-
`);let{pass:l,errors:u}=a.validate();if(!l){if(u!=null&&u.length){let{message:g,path:v}=u[0];console.error(`Manifest valid error: Path '${v}', ${g}`)}else console.error("Manifest valid error");return}if(await at.default.emptyDir(e),s&&await d({start:"start build ui",error:"build ui failed",succeed:"build ui success"},()=>Ze({appKey:m,rspackConfig:i})),await d({start:"start bundle",error:"bundle failed",succeed:"bundle success"},()=>nt({outputDir:e,inputDir:t,manifest:a,mode:r?"production":"development"})),await d({start:"start package",error:"package failed",succeed:"package success"},()=>it({outputDir:e,manifest:a,filesToCopy:n})),o){let g=`${m}_${
|
|
4
|
-
The output file of the build is ${H.default.bold.green(g)}`)}};var pt=async e=>{let{input:t="functions",output:r="package",prod:n,dev:o,copy:s=[],zip:i,ui:a,rspack:p}=e;await ct({outputDir:de.default.resolve(r),inputDir:de.default.resolve(t),prod:n??!o,filesToCopy:[...B,...s],zip:i,ui:!!a,rspackConfig:p}).catch(()=>{})};var bt=c(require("fs")),kt=c(require("path")),J=c(require("chalk"));var lt=c(require("path")),mt=c(require("lowdb")),ut=c(require("lowdb/adapters/FileSync"));var ge,ye=()=>{if(!ge){let e=lt.default.join(__dirname,"user.json"),t=new ut.default(e);ge=(0,mt.default)(t)}return ge},ft=()=>{let e=ye(),t=e.get("version").value();(!t||t!==E)&&e.defaults({version:E,user:{}}).write()},he=e=>{ft(),ye().set("user",e).write()},T=()=>(ft(),ye().get("user").value());var gt=c(require("fs")),yt=c(require("path")),ht=c(require("form-data"));var dt=c(require("axios"));var k={GET:"GET",POST:"POST",PUT:"PUT",DELETE:"DELETE"},S=async({url:e,method:t,data:r,headers:n})=>{let{domain:o,cookie:s}=T();return(await(0,dt.default)({method:t,baseURL:o,url:e,data:r,headers:{...n,cookie:s}})).data};var vt=async(e,t)=>{let r=new ht.default;return r.append("environmentKey",t),r.append("package",gt.default.createReadStream(yt.default.resolve(e))),S({method:k.POST,url:"/apps/api/v1/apps/deploy",data:r,headers:{...r.getHeaders()}})},W=async({tenants:e,environmentKey:t,appKey:r,versionKey:n})=>S({method:k.POST,url:"/apps/api/v1/apps/install/batch",data:{tenants:e,environmentKey:t,appKey:r,versionKey:n,subscriptionSource:"manual"}});var wt=c(require("chalk")),Dr=wt.default.bold.red,f={error:e=>{console.info(Dr(e))}};var Q=(n=>(n.DEVELOPMENT="development",n.STAGING="staging",n.PRODUCTION="production",n))(Q||{}),Cr=e=>e?(Array.isArray(e)?e:[e]).flatMap(r=>r.split(",")).map(r=>r.trim()).filter(Boolean):[],Rr=e=>{let t=kt.default.basename(e,".zip"),r=t.lastIndexOf("_");return r<=0||r===t.length-1?null:{appKey:t.slice(0,r),versionKey:t.slice(r+1)}},Pt=async(e,t)=>{let{domain:r}=T(),{environment:n="development",subscribe:o,appKey:s,versionKey:i}=t,a=Cr(o);if(!Object.values(Q).includes(n)){f.error("Only support development, staging, production environment.");return}if(!r){f.error("Please login in first!");return}if(!bt.default.existsSync(e)){f.error(`File:${e} is not exist`);return}if(console.info(`Deploying to ${J.default.bold.green(r)}`),await d({start:"start deploy",error:"deploy failed",succeed:"deploy success"},()=>vt(e,n)).catch(()=>{}),a.length===0)return;let p=Rr(e),m=s||(p==null?void 0:p.appKey),l=i||(p==null?void 0:p.versionKey);if(!m||!l){f.error("subscribe needs appKey and versionKey. please pass --app-key and --version-key, or use zip name <appKey>_<versionKey>.zip");return}console.info(`Subscribing app ${J.default.bold.green(m)}:${J.default.bold.green(l)}`),await d({start:"start subscribe",error:"subscribe failed",succeed:"subscribe success"},()=>W({tenants:a,environmentKey:n,appKey:m,versionKey:l})).catch(()=>{})};var N=c(require("path")),M=c(require("fs-extra")),ke=c(require("inquirer"));var xt=c(require("readline")),Et=require("chalk"),Ot=c(require("execa")),Ar=e=>{if(!Et.supportsColor){e.write("\r");return}xt.default.cursorTo(e,0)},jr=(e,t)=>{let r=Math.min(Math.max(e/t,0),1),n=` ${e}/${t}`,o=Math.max(0,process.stderr.columns-n.length-3),s=Math.min(t,o),i=Math.round(s*r),a="#".repeat(i),p="-".repeat(s-i);Ar(process.stderr),process.stderr.write(`[${a}${p}]${n}`)},_r=(e,t,r,n)=>new Promise((o,s)=>{var a;let i=(0,Ot.default)(e,t,{cwd:r,stdio:["inherit","inherit","pipe"],env:n});(a=i.stderr)==null||a.on("data",p=>{let m=p.toString();if(/warning/.test(m))return;let l=m.match(/\[.*] (\d+)\/(\d+)/);if(l){jr(parseFloat(l[1]),parseFloat(l[2]));return}process.stderr.write(p)}),i.on("close",p=>{if(p!==0){s(new Error(`command failed: ${e} ${t.join(" ")}`));return}o()})}),Tt={executeCommand:_r};var ve=c(require("fs-extra")),we=c(require("simple-git")),St=async e=>{await(0,we.default)(e).init()},Y=async(e,t,r)=>{await ve.default.pathExists(t)||await ve.default.mkdir(t);let n=(0,we.default)(t),o=[];r!=null&&r.branch&&o.push("--branch",r.branch),r!=null&&r.singleBranch&&o.push("--single-branch"),await n.clone(e,t,o)};var P=c(require("path")),A=c(require("fs-extra"));var X=c(require("fs-extra")),Dt=process.env.APPS_TEMPLATE_REPO||"https://github.com/moriahq/apps-template.git",be=(r=>(r.micro="micro",r.uikit="uikit",r))(be||{}),Z=async(e,t)=>{if(!await X.default.pathExists(e))return;let r=await X.default.readFile(e,{encoding:"utf-8"});await X.default.writeFile(e,r.replace(/{{(\w+)}}/g,(n,o)=>typeof t[o]=="string"?t[o]:n))};var $r=async()=>{let e=[P.default.resolve(__dirname,"templates/skill"),P.default.resolve(__dirname,"../templates/skill")];for(let t of e)if(await A.default.pathExists(t))return t;return""},Ct=async(e,t)=>{let r=await A.default.readdir(e,{withFileTypes:!0});return(await Promise.all(r.map(async o=>{let s=P.default.join(e,o.name);return o.isDirectory()?Ct(s,t):o.isFile()?[P.default.relative(t,s)]:[]}))).flat()},$=async(e,t)=>{let{appName:r,appKey:n,overwrite:o=!1}=t,s=await $r();if(!s||!await A.default.pathExists(s))throw new Error(`skill templates not found: ${s}`);let i=await Ct(s,s);for(let a of i){let p=P.default.join(s,a),m=a==="SKILL.md"||a.startsWith("skill/")?a:P.default.join("skill",a),l=P.default.join(e,m);!o&&await A.default.pathExists(l)||(await A.default.ensureDir(P.default.dirname(l)),await A.default.copy(p,l),l.endsWith(".md")&&await Z(l,{appName:r,appKey:n}))}};var Nr=async()=>(await ke.default.createPromptModule()({type:"input",name:"App Name",message:"Please enter an app name",validate:r=>!!r}))["App Name"],Ir=async()=>(await ke.default.createPromptModule()({type:"input",name:"App key",message:"Please enter a valid app key",validate:r=>/^[a-z][a-z0-9_]*$/.test(r)?!0:(console.info(""),console.info("only supports letters, numbers, underscores and starts with letters"),!1)}))["App key"],Mr=()=>{if(Number(E.split(".")[0])>=1)return"v1"},Fr=async(e,t)=>{let r=Mr();if(!r){await d({start:"Start clone repository",error:"Clone repository failed!",succeed:"Clone repository success!"},()=>Y(e,t));return}try{await d({start:`Start clone repository (branch: ${r})`,error:"Clone repository failed!",succeed:"Clone repository success!"},()=>Y(e,t,{branch:r,singleBranch:!0}))}catch{console.info(`Template branch '${r}' not found, fallback to default branch.`),await d({start:"Start clone repository (default branch)",error:"Clone repository failed!",succeed:"Clone repository success!"},()=>Y(e,t))}},Ur=async e=>{await d({start:"Start install dependencies",error:"Install dependencies failed!",succeed:"Install dependencies success!"},()=>Tt.executeCommand("pnpm",["install"],e))},Rt=async e=>{let{cwd:t}=e,r="micro",n=await Nr(),o=await Ir(),s=N.default.join(t,o);if(await M.default.pathExists(s)){console.error(`Project path already exists: ${s}`);return}await Fr(Dt,s),await M.default.copy(N.default.join(s,r),s),await Promise.all(Object.values(be).map(a=>M.default.remove(N.default.join(s,a)))),await M.default.remove(N.default.join(s,"./.git"));let i=["./manifest.yml","./package.json","./rspack.config.js","./public/index.html","./src/App.tsx","./src/index.tsx","./static/App.tsx","./static/index.tsx","./SKILL.md"];await Promise.all(i.map(a=>Z(N.default.join(s,a),{appName:n,appKey:o}))),await $(s,{appName:n,appKey:o}),await Ur(s),await St(s),console.info("Project init success!"),console.info("Project path:"+s)};var At=async()=>{let e=process.cwd();await Rt({cwd:e})};var ee=c(require("inquirer"));var Pe=c(require("axios"));var jt=["/api/gateway/login","/login"],Kr=e=>{var n;let t=(n=e==null?void 0:e.response)==null?void 0:n.status,r=e==null?void 0:e.code;return[404,405,502,503,504].includes(t)||["ECONNREFUSED","ENOTFOUND","ECONNABORTED"].includes(r)},_t=async({baseUrl:e,username:t,password:r})=>{var o;let n;for(let s of jt)try{let i=await(0,Pe.default)({method:k.POST,url:`${e}${s}`,data:{username:t,password:r}});return console.info(`Login endpoint: ${s}`),{cookie:(o=i.headers)==null?void 0:o["set-cookie"]}}catch(i){if(n=i,!Kr(i))return console.error(`Login error (${s}):`,i==null?void 0:i.message),{cookie:""}}return console.error(`Login error: all endpoints failed (${jt.join(", ")})`,(n==null?void 0:n.message)||""),{cookie:""}},Lt=async e=>{try{return await(0,Pe.default)({method:k.GET,url:`${e}/apps/api/v1/tenants`}),!1}catch{return!0}};var $t=e=>{try{return new URL(e).origin}catch{return e}};var Nt=c(require("crypto"));var It=e=>{try{let t=Nt.default.createCipheriv(Le,_e,je),r=t.update(e,"utf8","base64");return r+=t.final("base64"),r.toString()}catch(t){return console.error(`Encryption error: ${t}`),null}};var Br=async()=>(await ee.default.createPromptModule()({type:"input",name:"Domain",message:"Please enter the domain address",validate:r=>{try{return new URL(r),!0}catch{return"Please enter a valid domain name"}}})).Domain,Gr=async()=>(await ee.default.createPromptModule()({type:"input",name:"Username",message:"Please enter username",validate:r=>!!r})).Username,Vr=async()=>(await ee.default.createPromptModule()({type:"password",name:"Password",message:"Please enter password",validate:r=>!!r})).Password,Mt=async({domain:e,username:t,password:r})=>{if(e||(e=await Br()),e=$t(e),await Lt(e)){t||(t=await Gr()),r||(r=await Vr());let{cookie:o}=await _t({baseUrl:e,username:t,password:It(r)||r});o?(he({domain:e,username:t,cookie:o}),console.info("Login success!")):console.error("Login failed!")}else he({domain:e}),console.info("Login success!")};var Ft=async e=>{await Mt(e)};var Ut=c(require("chalk"));var qr=e=>e?(Array.isArray(e)?e:[e]).flatMap(r=>r.split(",")).map(r=>r.trim()).filter(Boolean):[],Kt=async(e,t,r)=>{let{domain:n}=T(),{environment:o="development",tenants:s}=r,i=qr(s);if(!n){f.error("Please login in first!");return}if(!Object.values(Q).includes(o)){f.error("Only support development, staging, production environment.");return}if(!e||!t){f.error("Please provide appKey and versionKey.");return}if(i.length===0){f.error("Please provide subscribe tenants by -t/--tenants.");return}console.info(`Subscribing to ${Ut.default.bold.green(n)}`),await d({start:"start subscribe",error:"subscribe failed",succeed:"subscribe success"},()=>W({tenants:i,environmentKey:o,appKey:e,versionKey:t})).catch(()=>{})};var te=c(require("path")),re=c(require("fs-extra"));var zr=async e=>{var a,p,m,l;let t=te.default.join(e,"manifest.yml"),r=te.default.basename(e),n=r;if(!await re.default.pathExists(t))return{appName:r,appKey:n};let o=await re.default.readFile(t,"utf8"),s=((p=(a=o.match(/^\s*name:\s*(.+)\s*$/m))==null?void 0:a[1])==null?void 0:p.trim())||r,i=((l=(m=o.match(/^\s*key:\s*(.+)\s*$/m))==null?void 0:m[1])==null?void 0:l.trim())||n;return{appName:s,appKey:i}},Bt=async e=>{let t=te.default.resolve(e||process.cwd());if(!await re.default.pathExists(t)){f.error(`project path not found: ${t}`);return}let{appName:r,appKey:n}=await zr(t);await $(t,{appName:r,appKey:n,overwrite:!0}),console.info("sync-skill finished."),console.info(`Project path: ${t}`)};var ie=c(require("path"));var tr=c(require("path")),se=c(require("chalk")),rr=c(require("debug")),Ee=c(require("fs-extra"));var Gt=async()=>{var t;return((t=(await S({method:k.GET,url:"/apps/api/v1/config"}).catch(r=>{var n,o;console.info(`getRuntimeConfig error ${((o=(n=r==null?void 0:r.response)==null?void 0:n.data)==null?void 0:o.message)||(r==null?void 0:r.message)}`)})).data)==null?void 0:t.runtime)||{}};var ne=require("child_process"),F=class{constructor(t,r){this.imageName=t,this.containerName=r}async downloadImage(){console.info(`Downloading image(${this.imageName}) ...`),await this.execPromise(`docker pull ${this.imageName}`),console.info(`Download image(${this.imageName}) success!`)}async runContainer({port:t,env:r,volume:n=[]}){await this.removeContainer();let o=Object.keys(r).filter(a=>r[a]!==void 0).map(a=>`-e ${a}=${r[a]}`).join(" "),s=n==null?void 0:n.map(a=>`-v ${a}`).join(" "),i=`docker run -d -p ${t}:${t} ${o} ${s} --name ${this.containerName} ${this.imageName}`;await this.execPromise(i)}async removeContainer(){await this.execPromise(`docker rm -f ${this.containerName}`).catch(()=>{})}logs(){let t=(0,ne.spawn)("docker",["logs","-f",this.containerName]);t.stdout.on("data",r=>{console.info(`${r}`)}),t.stderr.on("data",r=>{console.info(`${r}`)})}execPromise(t){return new Promise((r,n)=>{(0,ne.exec)(t,(o,s,i)=>{if(o)return n(o);r({stdout:s,stderr:i})})})}};var Vt=c(require("localtunnel"));var qt=async({appKey:e,runtimeHost:t,resources:r,resourcePort:n})=>{r!=null&&r.length&&r.forEach(o=>{o.path=`http://127.0.0.1:${n}`}),await S({method:k.POST,url:`/apps/api/v1/apps/tunnel/${e}`,data:{resources:r,runtimeHost:t}}).catch(o=>{var s,i;console.info(`addTunnel error ${((i=(s=o==null?void 0:o.response)==null?void 0:s.data)==null?void 0:i.message)||(o==null?void 0:o.message)}`)})},zt=async e=>{await S({method:"DELETE",url:`/apps/api/v1/apps/tunnel/${e}`}).catch(()=>{})},Ht=async e=>{var t,r;try{return(await(0,Vt.default)({port:e,host:((t=process.env)==null?void 0:t.TUNNEL_HOST)==="OFFICIAL"?void 0:((r=process.env)==null?void 0:r.TUNNEL_HOST)||"http://tunnel.gitee.work:1777"})).url}catch(n){return console.info("runTunnel error",n==null?void 0:n.message),""}};var xe=c(require("path")),Wt=require("@rspack/core"),Jt=require("@rspack/dev-middleware"),Qt=c(require("cors")),Yt=c(require("express"));var oe=async({appKey:e,rspackConfig:t})=>{let n=(await V())({environment:"development",appKey:e});if(t){let p=require(xe.default.resolve(t));n=I(n,p)}let o=(0,Wt.rspack)(n),s=(0,Yt.default)(),i=Number(process.env.UI_PORT)||8e3,a=(0,Jt.devMiddleware)(o);s.use((0,Qt.default)()),s.use(a),s.get("*",(p,m)=>{var l,u;(u=o.outputFileSystem)==null||u.readFile(xe.default.join(((l=n.output)==null?void 0:l.path)||"","index.html"),(g,v)=>{if(g||!v){m.sendStatus(404);return}m.send(v.toString())})}),s.listen(i,"0.0.0.0",()=>{console.info(`The React app is listening on port ${i}!
|
|
5
|
-
`)})};var
|
|
6
|
-
`);let{domain:U}=T();if(!U){f.error("Please login in first!");return}console.info(`Tunneling to ${se.default.bold.green(U)}`);let w=[],ae=async j=>{j instanceof Error&&console.error(j);try{await Promise.all(w.map(
|
|
7
|
-
`).replace(/import\s+\{\s*merge\s*\}\s+from\s+['"]webpack-merge['"];?/g,"import merge from 'deepmerge';").replace(/const\s+\{\s*merge\s*\}\s*=\s*require\((['"])webpack-merge\1\);?/g,"const merge = require('deepmerge');").replace(/(['"])webpack-merge\1/g,"$1deepmerge$1").replace(/^.*(rspack-bundle-analyzer|webpack-bundle-analyzer).*\n?/gm,"").replace(/^.*ANALYZER_PACKAGE.*\n?/gm,"").replace(/(['"])webpack\1/g,"$1@rspack/core$1");a!==i&&(await y.default.writeFile(s,a),t=!0)}return t},
|
|
8
|
-
`),!s&&!i&&!a&&!
|
|
9
|
-
`);var h=new cr.Command;h.version(E,"-v -V --vers").description("Giteeteam Apps Cli");h.command("build").option("--prod","build in production").option("--dev","build in development").option("--no-zip","no archive").option("-c --copy [letters...]","copy files").option("-i --input [dir]","input dir").option("-o --output [dir]","output dir").option("--ui","build ui").option("-r --rspack [file]","build ui rspack config file").action(
|
|
2
|
+
"use strict";var dr=Object.create;var ce=Object.defineProperty;var gr=Object.getOwnPropertyDescriptor;var yr=Object.getOwnPropertyNames;var hr=Object.getPrototypeOf,vr=Object.prototype.hasOwnProperty;var wr=(e,t)=>()=>(e&&(t=e(e=0)),t);var br=(e,t)=>{for(var r in t)ce(e,r,{get:t[r],enumerable:!0})},kr=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of yr(t))!vr.call(e,o)&&o!==r&&ce(e,o,{get:()=>t[o],enumerable:!(n=gr(t,o))||n.enumerable});return e};var p=(e,t,r)=>(r=e!=null?dr(hr(e)):{},kr(t||!e||!e.__esModule?ce(r,"default",{value:e,enumerable:!0}):r,e));var We={};br(We,{default:()=>Dr});function Dr({environment:e,appKey:t,distOutputPath:r="dist"}){let n=e==="production",o=e==="development",s=Sr(),i=Ve.default.existsSync(C.default.resolve("locales")),a=D=>D?{filename:"js/[name].[chunkhash].min.js",path:C.default.resolve(r),publicPath:"./",library:{type:"umd",name:t},clean:!0}:{filename:"main.js",path:C.default.resolve(r),publicPath:"/",library:{type:"umd",name:t}},c=({resourcePath:D},U,w)=>w===t||/\.global\.(css|less)$/.test(D)||/node_modules/.test(D)?w:`${w}__${(0,He.default)(`${D}${w}`,{algorithm:"md5"}).slice(0,8)}`,m={loader:"@ecomfe/class-names-loader",options:{classNamesModule:require.resolve("classnames")}},l=n?L.rspack.CssExtractRspackPlugin.loader:"style-loader",u={loader:"postcss-loader",options:{postcssOptions:{plugins:[qe.default]}}},g={loader:"css-loader",options:{modules:{getLocalIdent:c},importLoaders:1}},v={loader:"less-loader",options:{lessOptions:{javascriptEnabled:!0,modifyVars:{"ant-prefix":t}}}};return{mode:e,entry:"./src/index.tsx",output:a(n),devtool:n?!1:"source-map",resolve:{alias:{"@":C.default.join(process.cwd(),"src/")},extensions:[".js",".ts",".jsx",".tsx",".css",".less"]},optimization:{minimize:n},plugins:[new L.rspack.DefinePlugin({"process.env":JSON.stringify(process.env),"process.env.appKey":JSON.stringify(t)}),new L.rspack.HtmlRspackPlugin({template:C.default.resolve("public/index.html"),filename:"index.html",inject:!0,appKey:t}),n&&new L.rspack.CssExtractRspackPlugin({filename:"[name].[contenthash].css",chunkFilename:"[name].[contenthash].chunk.css"}),o&&new L.rspack.HotModuleReplacementPlugin,o&&new ze.default({overlay:!1})].filter(Boolean),module:{rules:[{oneOf:[{test:/\.(js|mjs|jsx|ts|tsx)$/,exclude:/node_modules/,loader:"builtin:swc-loader",options:{sourceMaps:Tr,jsc:{parser:{syntax:"typescript",tsx:!0},transform:{react:{runtime:"automatic",development:!n,refresh:!n}}},env:{targets:"chrome >= 72",mode:"usage",coreJs:"3.38"}},type:"javascript/auto"},s&&i&&{test:/locales/,loader:s,include:[C.default.resolve("locales")]},{test:/\.css$/,use:[m,l,"css-loader",u]},{test:/\.less$/,use:[m,l,g,u,v]},{test:/\.(png|jpg|gif)$/i,type:"asset",parser:{dataUrlCondition:{maxSize:2400}},generator:{filename:"[name]_[hash][ext]"}},{test:/\.svg$/i,use:["@svgr/webpack"]}]}]}}}var Ve,C,L,ze,qe,He,Tr,Sr,Je=wr(()=>{"use strict";Ve=p(require("fs")),C=p(require("path")),L=require("@rspack/core"),ze=p(require("@rspack/plugin-react-refresh")),qe=p(require("autoprefixer")),He=p(require("hasha")),Tr=process.env.GENERATE_SOURCEMAP==="true",Sr=()=>{try{return require.resolve("@alienfast/i18next-loader")}catch{return null}}});var vs=require("dotenv/config"),Te=p(require("chalk")),cr=require("commander");var E="1.1.2-alpha.1";var de=p(require("path"));var B=["manifest.yml","locales"],je=Buffer.from(process.env.ONE_AUTH_IV||"ABCDEFGHIJKLM_iv","utf-8"),_e=Buffer.from(process.env.ONE_AUTH_SECRET_KEY||"ABCDEFGHIJKL_key","utf-8"),Le=process.env.ONE_AUTH_ALGORITHM||"aes-128-cbc";var H=p(require("chalk")),at=p(require("fs-extra"));var Ie=p(require("fs")),me=p(require("path")),Fe=p(require("@rollup/plugin-commonjs")),Me=require("rollup");var _=require("fs"),b=require("path"),$e=require("esbuild"),Pr={treeShaking:!0,format:"esm",loader:"tsx"};var Er=({source:e,dirPath:t,mode:r})=>{let n="";if(r==="development")try{return n=require.resolve(e+"/src/index.ts",{paths:[t]}),n}catch{}try{return n=require.resolve(e,{paths:[t]}),n}catch{}return n};function le({mode:e,...t}){return t={...Pr,...t},{name:"esbuild",resolveId(r,n,o){if(!n)return r;let s=(0,b.dirname)(n),i;if((0,_.existsSync)(i=(0,b.resolve)(s,r,"index.ts")))return i;if((0,_.existsSync)(i=(0,b.resolve)(s,r,"index.tsx")))return i;if((0,_.existsSync)(i=(0,b.resolve)(s,r+".ts")))return i;if((0,_.existsSync)(i=(0,b.resolve)(s,r+".tsx")))return i;{let a=Er({source:r,dirPath:s,mode:e});if((0,_.existsSync)(a))return a;throw console.error({source:r,importer:n,options:o}),i=(0,b.relative)(".",(0,b.resolve)(n,r)),new Error(`ENOENT: ${i.replace(/\\/g,"/")}`)}},async transform(r,n){t.sourcefile=n,t.loader=n.endsWith(".json")?"json":t.loader;let{code:o,map:s}=await(0,$e.transform)(r,t);return s?{code:o,map:s}:o}}}function Or(e,t,r="development"){let n=[(0,Fe.default)()];n.push(le({mode:r,sourcemap:r==="development",minify:r!=="development",target:"es2018",jsx:"transform",jsxFactory:"AppsUI.createElement",jsxFragment:"AppsUI.Fragment"}));let o={input:e,plugins:n},s={file:t,format:"es",sourcemap:r==="development"};return{inputOptions:o,outputOptions:s}}async function G(e){let{fileName:t,inputDir:r,outputDir:n,mode:o="development"}=e,s=me.default.join(r,`${t}.ts`);try{await Ie.default.promises.access(s)}catch{console.error(`${s} is not exist`);return}let i=me.default.join(n,`${t}.js`),{inputOptions:a,outputOptions:c}=Or(s,i,o);await(await(0,Me.rollup)(a)).write(c)}var Ue=p(require("ora")),d=async(e,t)=>{var n,o;let r=(0,Ue.default)(e.start).start();try{let s=await t();return r.succeed(e.succeed),s}catch(s){throw r.fail(`${e.error}: ${((o=(n=s==null?void 0:s.response)==null?void 0:n.data)==null?void 0:o.message)||s.message}`),s}};var Ke=p(require("path")),Be=require("@giteeteam/apps-manifest"),Ge=p(require("fs-extra")),O=async()=>{let e=Ke.default.resolve("manifest.yml"),t=await Ge.default.readFile(e);return new Be.Manifest(t.toString())};var Ye=p(require("path")),Xe=require("@rspack/core");var V=async()=>(await Promise.resolve().then(()=>(Je(),We))).default;var Qe=e=>Object.prototype.toString.call(e)==="[object Object]",I=(e,t)=>{if(t===void 0)return e;if(Array.isArray(e)&&Array.isArray(t))return[...e,...t];if(Qe(e)&&Qe(t)){let r={...e};for(let[n,o]of Object.entries(t))r[n]=n in r?I(r[n],o):o;return r}return t};var Ze=async({appKey:e,rspackConfig:t})=>{let r=await V();return new Promise((n,o)=>{let s=r({environment:"production",appKey:e});if(t){let a=require(Ye.default.resolve(t));s=I(s,a)}(0,Xe.rspack)(s).run((a,c)=>{if(a)return console.error(a),o(a);if(console.info(c==null?void 0:c.toString()),c!=null&&c.hasErrors())return o(new Error("build-ui-error"));n()})})};var et=p(require("path")),tt=p(require("archiver")),ue=p(require("fs-extra")),rt=async(e,t)=>{let r=et.default.resolve(t);return await ue.default.remove(r),new Promise((n,o)=>{let s=ue.default.createWriteStream(r),i=(0,tt.default)("zip",{zlib:{level:9}});s.on("close",function(){n()}),i.on("warning",function(a){console.info(a),a.code==="ENOENT"||o(a)}),i.on("error",function(a){console.info(a),o(a)}),i.pipe(s),i.directory(e,!1),i.finalize()})};var nt=async e=>{let{manifest:t,mode:r,outputDir:n,inputDir:o}=e,i=t.getFunctionFiles().map(async a=>{await G({inputDir:o,fileName:a,outputDir:n,mode:r})});await Promise.all(i)};var q=p(require("path")),st=p(require("fs-extra"));var fe=p(require("path")),ot=p(require("fs-extra")),z=async(e,t)=>{for(let r of t)try{let n=fe.default.resolve(r),o=fe.default.join(e,r);await ot.default.copy(n,o)}catch(n){if(n.code==="ENOENT"&&r==="locales")continue;throw n}};var it=async({outputDir:e,manifest:t,filesToCopy:r})=>{let{resources:n}=t;if(n)for(let{key:o,path:s}of n){let i=q.default.resolve(q.default.join("./",s)),a=q.default.join(e,o);await st.default.copy(i,a)}await z(e,r)};var pt=async({outputDir:e,inputDir:t,prod:r,filesToCopy:n,zip:o,ui:s,rspackConfig:i})=>{let a=await O(),{version:c,key:m}=a.app;if(!m){console.error("manifest app key is required");return}if(!c){console.error("manifest app version is required");return}console.info(`App key: ${H.default.bold.green(m)}`),console.info(`App version: ${H.default.bold.green(c)}
|
|
3
|
+
`);let{pass:l,errors:u}=a.validate();if(!l){if(u!=null&&u.length){let{message:g,path:v}=u[0];console.error(`Manifest valid error: Path '${v}', ${g}`)}else console.error("Manifest valid error");return}if(await at.default.emptyDir(e),s&&await d({start:"start build ui",error:"build ui failed",succeed:"build ui success"},()=>Ze({appKey:m,rspackConfig:i})),await d({start:"start bundle",error:"bundle failed",succeed:"bundle success"},()=>nt({outputDir:e,inputDir:t,manifest:a,mode:r?"production":"development"})),await d({start:"start package",error:"package failed",succeed:"package success"},()=>it({outputDir:e,manifest:a,filesToCopy:n})),o){let g=`${m}_${c}.zip`;await d({start:"start archive",error:"archive failed",succeed:"archive success"},()=>rt(e,g)),console.info(`
|
|
4
|
+
The output file of the build is ${H.default.bold.green(g)}`)}};var ct=async e=>{let{input:t="functions",output:r="package",prod:n,dev:o,copy:s=[],zip:i,ui:a,rspack:c}=e;await pt({outputDir:de.default.resolve(r),inputDir:de.default.resolve(t),prod:n??!o,filesToCopy:[...B,...s],zip:i,ui:!!a,rspackConfig:c}).catch(()=>{})};var bt=p(require("fs")),kt=p(require("path")),J=p(require("chalk"));var lt=p(require("path")),mt=p(require("lowdb")),ut=p(require("lowdb/adapters/FileSync"));var ge,ye=()=>{if(!ge){let e=lt.default.join(__dirname,"user.json"),t=new ut.default(e);ge=(0,mt.default)(t)}return ge},ft=()=>{let e=ye(),t=e.get("version").value();(!t||t!==E)&&e.defaults({version:E,user:{}}).write()},he=e=>{ft(),ye().set("user",e).write()},T=()=>(ft(),ye().get("user").value());var gt=p(require("fs")),yt=p(require("path")),ht=p(require("form-data"));var dt=p(require("axios"));var k={GET:"GET",POST:"POST",PUT:"PUT",DELETE:"DELETE"},S=async({url:e,method:t,data:r,headers:n})=>{let{domain:o,cookie:s}=T();return(await(0,dt.default)({method:t,baseURL:o,url:e,data:r,headers:{...n,cookie:s}})).data};var vt=async(e,t)=>{let r=new ht.default;return r.append("environmentKey",t),r.append("package",gt.default.createReadStream(yt.default.resolve(e))),S({method:k.POST,url:"/apps/api/v1/apps/deploy",data:r,headers:{...r.getHeaders()}})},W=async({tenants:e,environmentKey:t,appKey:r,versionKey:n})=>S({method:k.POST,url:"/apps/api/v1/apps/install/batch",data:{tenants:e,environmentKey:t,appKey:r,versionKey:n,subscriptionSource:"manual"}});var wt=p(require("chalk")),Rr=wt.default.bold.red,f={error:e=>{console.info(Rr(e))}};var Q=(n=>(n.DEVELOPMENT="development",n.STAGING="staging",n.PRODUCTION="production",n))(Q||{}),Cr=e=>e?(Array.isArray(e)?e:[e]).flatMap(r=>r.split(",")).map(r=>r.trim()).filter(Boolean):[],Ar=e=>{let t=kt.default.basename(e,".zip"),r=t.lastIndexOf("_");return r<=0||r===t.length-1?null:{appKey:t.slice(0,r),versionKey:t.slice(r+1)}},xt=async(e,t)=>{let{domain:r}=T(),{environment:n="development",subscribe:o,appKey:s,versionKey:i}=t,a=Cr(o);if(!Object.values(Q).includes(n)){f.error("Only support development, staging, production environment.");return}if(!r){f.error("Please login in first!");return}if(!bt.default.existsSync(e)){f.error(`File:${e} is not exist`);return}if(console.info(`Deploying to ${J.default.bold.green(r)}`),await d({start:"start deploy",error:"deploy failed",succeed:"deploy success"},()=>vt(e,n)).catch(()=>{}),a.length===0)return;let c=Ar(e),m=s||(c==null?void 0:c.appKey),l=i||(c==null?void 0:c.versionKey);if(!m||!l){f.error("subscribe needs appKey and versionKey. please pass --app-key and --version-key, or use zip name <appKey>_<versionKey>.zip");return}console.info(`Subscribing app ${J.default.bold.green(m)}:${J.default.bold.green(l)}`),await d({start:"start subscribe",error:"subscribe failed",succeed:"subscribe success"},()=>W({tenants:a,environmentKey:n,appKey:m,versionKey:l})).catch(()=>{})};var N=p(require("path")),F=p(require("fs-extra")),ke=p(require("inquirer"));var Pt=p(require("readline")),Et=require("chalk"),Ot=p(require("execa")),jr=e=>{if(!Et.supportsColor){e.write("\r");return}Pt.default.cursorTo(e,0)},_r=(e,t)=>{let r=Math.min(Math.max(e/t,0),1),n=` ${e}/${t}`,o=Math.max(0,process.stderr.columns-n.length-3),s=Math.min(t,o),i=Math.round(s*r),a="#".repeat(i),c="-".repeat(s-i);jr(process.stderr),process.stderr.write(`[${a}${c}]${n}`)},Lr=(e,t,r,n)=>new Promise((o,s)=>{var a;let i=(0,Ot.default)(e,t,{cwd:r,stdio:["inherit","inherit","pipe"],env:n});(a=i.stderr)==null||a.on("data",c=>{let m=c.toString();if(/warning/.test(m))return;let l=m.match(/\[.*] (\d+)\/(\d+)/);if(l){_r(parseFloat(l[1]),parseFloat(l[2]));return}process.stderr.write(c)}),i.on("close",c=>{if(c!==0){s(new Error(`command failed: ${e} ${t.join(" ")}`));return}o()})}),Tt={executeCommand:Lr};var ve=p(require("fs-extra")),we=p(require("simple-git")),St=async e=>{await(0,we.default)(e).init()},Y=async(e,t,r)=>{await ve.default.pathExists(t)||await ve.default.mkdir(t);let n=(0,we.default)(t),o=[];r!=null&&r.branch&&o.push("--branch",r.branch),r!=null&&r.singleBranch&&o.push("--single-branch"),await n.clone(e,t,o)};var x=p(require("path")),A=p(require("fs-extra"));var X=p(require("fs-extra")),Dt=process.env.APPS_TEMPLATE_REPO||"https://github.com/moriahq/apps-template.git",be=(r=>(r.micro="micro",r.uikit="uikit",r))(be||{}),Z=async(e,t)=>{if(!await X.default.pathExists(e))return;let r=await X.default.readFile(e,{encoding:"utf-8"});await X.default.writeFile(e,r.replace(/{{(\w+)}}/g,(n,o)=>typeof t[o]=="string"?t[o]:n))};var Nr=async()=>{let e=[x.default.resolve(__dirname,"templates/skill"),x.default.resolve(__dirname,"../templates/skill")];for(let t of e)if(await A.default.pathExists(t))return t;return""},Rt=async(e,t)=>{let r=await A.default.readdir(e,{withFileTypes:!0});return(await Promise.all(r.map(async o=>{let s=x.default.join(e,o.name);return o.isDirectory()?Rt(s,t):o.isFile()?[x.default.relative(t,s)]:[]}))).flat()},$=async(e,t)=>{let{appName:r,appKey:n,overwrite:o=!1}=t,s=await Nr();if(!s||!await A.default.pathExists(s))throw new Error(`skill templates not found: ${s}`);let i=await Rt(s,s);for(let a of i){let c=x.default.join(s,a),m=a==="SKILL.md"||a.startsWith("skill/")?a:x.default.join("skill",a),l=x.default.join(e,m);!o&&await A.default.pathExists(l)||(await A.default.ensureDir(x.default.dirname(l)),await A.default.copy(c,l),l.endsWith(".md")&&await Z(l,{appName:r,appKey:n}))}};var Ir=async()=>(await ke.default.createPromptModule()({type:"input",name:"App Name",message:"Please enter an app name",validate:r=>!!r}))["App Name"],Fr=async()=>(await ke.default.createPromptModule()({type:"input",name:"App key",message:"Please enter a valid app key",validate:r=>/^[a-z][a-z0-9_]*$/.test(r)?!0:(console.info(""),console.info("only supports letters, numbers, underscores and starts with letters"),!1)}))["App key"],Mr=()=>{if(Number(E.split(".")[0])>=1)return"v1"},Ur=async(e,t)=>{let r=Mr();if(!r){await d({start:"Start clone repository",error:"Clone repository failed!",succeed:"Clone repository success!"},()=>Y(e,t));return}try{await d({start:`Start clone repository (branch: ${r})`,error:"Clone repository failed!",succeed:"Clone repository success!"},()=>Y(e,t,{branch:r,singleBranch:!0}))}catch{console.info(`Template branch '${r}' not found, fallback to default branch.`),await d({start:"Start clone repository (default branch)",error:"Clone repository failed!",succeed:"Clone repository success!"},()=>Y(e,t))}},Kr=async e=>{await d({start:"Start install dependencies",error:"Install dependencies failed!",succeed:"Install dependencies success!"},()=>Tt.executeCommand("pnpm",["install"],e))},Ct=async e=>{let{cwd:t}=e,r="micro",n=await Ir(),o=await Fr(),s=N.default.join(t,o);if(await F.default.pathExists(s)){console.error(`Project path already exists: ${s}`);return}await Ur(Dt,s),await F.default.copy(N.default.join(s,r),s),await Promise.all(Object.values(be).map(a=>F.default.remove(N.default.join(s,a)))),await F.default.remove(N.default.join(s,"./.git"));let i=["./manifest.yml","./package.json","./rspack.config.js","./public/index.html","./src/App.tsx","./src/index.tsx","./static/App.tsx","./static/index.tsx","./SKILL.md"];await Promise.all(i.map(a=>Z(N.default.join(s,a),{appName:n,appKey:o}))),await $(s,{appName:n,appKey:o}),await Kr(s),await St(s),console.info("Project init success!"),console.info("Project path:"+s)};var At=async()=>{let e=process.cwd();await Ct({cwd:e})};var ee=p(require("inquirer"));var xe=p(require("axios"));var jt=["/api/gateway/login","/login"],Br=e=>{var n;let t=(n=e==null?void 0:e.response)==null?void 0:n.status,r=e==null?void 0:e.code;return[404,405,502,503,504].includes(t)||["ECONNREFUSED","ENOTFOUND","ECONNABORTED"].includes(r)},_t=async({baseUrl:e,username:t,password:r})=>{var o;let n;for(let s of jt)try{let i=await(0,xe.default)({method:k.POST,url:`${e}${s}`,data:{username:t,password:r}});return console.info(`Login endpoint: ${s}`),{cookie:(o=i.headers)==null?void 0:o["set-cookie"]}}catch(i){if(n=i,!Br(i))return console.error(`Login error (${s}):`,i==null?void 0:i.message),{cookie:""}}return console.error(`Login error: all endpoints failed (${jt.join(", ")})`,(n==null?void 0:n.message)||""),{cookie:""}},Lt=async e=>{try{return await(0,xe.default)({method:k.GET,url:`${e}/apps/api/v1/tenants`}),!1}catch{return!0}};var $t=e=>{try{return new URL(e).origin}catch{return e}};var Nt=p(require("crypto"));var It=e=>{try{let t=Nt.default.createCipheriv(Le,_e,je),r=t.update(e,"utf8","base64");return r+=t.final("base64"),r.toString()}catch(t){return console.error(`Encryption error: ${t}`),null}};var Gr=async()=>(await ee.default.createPromptModule()({type:"input",name:"Domain",message:"Please enter the domain address",validate:r=>{try{return new URL(r),!0}catch{return"Please enter a valid domain name"}}})).Domain,Vr=async()=>(await ee.default.createPromptModule()({type:"input",name:"Username",message:"Please enter username",validate:r=>!!r})).Username,zr=async()=>(await ee.default.createPromptModule()({type:"password",name:"Password",message:"Please enter password",validate:r=>!!r})).Password,Ft=async({domain:e,username:t,password:r})=>{if(e||(e=await Gr()),e=$t(e),await Lt(e)){t||(t=await Vr()),r||(r=await zr());let{cookie:o}=await _t({baseUrl:e,username:t,password:It(r)||r});o?(he({domain:e,username:t,cookie:o}),console.info("Login success!")):console.error("Login failed!")}else he({domain:e}),console.info("Login success!")};var Mt=async e=>{await Ft(e)};var Ut=p(require("chalk"));var qr=e=>e?(Array.isArray(e)?e:[e]).flatMap(r=>r.split(",")).map(r=>r.trim()).filter(Boolean):[],Kt=async(e,t,r)=>{let{domain:n}=T(),{environment:o="development",tenants:s}=r,i=qr(s);if(!n){f.error("Please login in first!");return}if(!Object.values(Q).includes(o)){f.error("Only support development, staging, production environment.");return}if(!e||!t){f.error("Please provide appKey and versionKey.");return}if(i.length===0){f.error("Please provide subscribe tenants by -t/--tenants.");return}console.info(`Subscribing to ${Ut.default.bold.green(n)}`),await d({start:"start subscribe",error:"subscribe failed",succeed:"subscribe success"},()=>W({tenants:i,environmentKey:o,appKey:e,versionKey:t})).catch(()=>{})};var te=p(require("path")),re=p(require("fs-extra"));var Hr=async e=>{var a,c,m,l;let t=te.default.join(e,"manifest.yml"),r=te.default.basename(e),n=r;if(!await re.default.pathExists(t))return{appName:r,appKey:n};let o=await re.default.readFile(t,"utf8"),s=((c=(a=o.match(/^\s*name:\s*(.+)\s*$/m))==null?void 0:a[1])==null?void 0:c.trim())||r,i=((l=(m=o.match(/^\s*key:\s*(.+)\s*$/m))==null?void 0:m[1])==null?void 0:l.trim())||n;return{appName:s,appKey:i}},Bt=async e=>{let t=te.default.resolve(e||process.cwd());if(!await re.default.pathExists(t)){f.error(`project path not found: ${t}`);return}let{appName:r,appKey:n}=await Hr(t);await $(t,{appName:r,appKey:n,overwrite:!0}),console.info("sync-skill finished."),console.info(`Project path: ${t}`)};var ie=p(require("path"));var rr=p(require("path")),se=p(require("chalk")),nr=p(require("debug")),Ee=p(require("fs-extra"));var Gt=async()=>{var t;return((t=(await S({method:k.GET,url:"/apps/api/v1/config"}).catch(r=>{var n,o;console.info(`getRuntimeConfig error ${((o=(n=r==null?void 0:r.response)==null?void 0:n.data)==null?void 0:o.message)||(r==null?void 0:r.message)}`)})).data)==null?void 0:t.runtime)||{}};var ne=require("child_process"),M=class{constructor(t,r){this.imageName=t,this.containerName=r}async downloadImage(){console.info(`Downloading image(${this.imageName}) ...`),await this.execPromise(`docker pull ${this.imageName}`),console.info(`Download image(${this.imageName}) success!`)}async runContainer({port:t,env:r,volume:n=[]}){await this.removeContainer();let o=Object.keys(r).filter(a=>r[a]!==void 0).map(a=>`-e ${a}=${r[a]}`).join(" "),s=n==null?void 0:n.map(a=>`-v ${a}`).join(" "),i=`docker run -d -p ${t}:${t} ${o} ${s} --name ${this.containerName} ${this.imageName}`;await this.execPromise(i)}async removeContainer(){await this.execPromise(`docker rm -f ${this.containerName}`).catch(()=>{})}logs(){let t=(0,ne.spawn)("docker",["logs","-f",this.containerName]);t.stdout.on("data",r=>{console.info(`${r}`)}),t.stderr.on("data",r=>{console.info(`${r}`)})}execPromise(t){return new Promise((r,n)=>{(0,ne.exec)(t,(o,s,i)=>{if(o)return n(o);r({stdout:s,stderr:i})})})}};var Vt=p(require("localtunnel"));var zt=async({appKey:e,runtimeHost:t,resources:r,resourcePort:n})=>{r!=null&&r.length&&r.forEach(o=>{o.path=`http://127.0.0.1:${n}`}),await S({method:k.POST,url:`/apps/api/v1/apps/tunnel/${e}`,data:{resources:r,runtimeHost:t}}).catch(o=>{var s,i;console.info(`addTunnel error ${((i=(s=o==null?void 0:o.response)==null?void 0:s.data)==null?void 0:i.message)||(o==null?void 0:o.message)}`)})},qt=async e=>{await S({method:"DELETE",url:`/apps/api/v1/apps/tunnel/${e}`}).catch(()=>{})},Ht=async e=>{var t,r;try{return(await(0,Vt.default)({port:e,host:((t=process.env)==null?void 0:t.TUNNEL_HOST)==="OFFICIAL"?void 0:((r=process.env)==null?void 0:r.TUNNEL_HOST)||"http://tunnel.gitee.work:1777"})).url}catch(n){return console.info("runTunnel error",n==null?void 0:n.message),""}};var Pe=p(require("path")),Wt=require("@rspack/core"),Jt=require("@rspack/dev-middleware"),Qt=p(require("cors")),Yt=p(require("express")),Xt=require("http-proxy-middleware");function Wr(e,t){var n;let r=(n=t==null?void 0:t.devServer)==null?void 0:n.proxy;if(!(!Array.isArray(r)||r.length===0))for(let o of r){if(!o||!o.target)continue;let s=o.context&&!o.pathFilter?{...o,pathFilter:o.context}:o;e.use((0,Xt.createProxyMiddleware)(s))}}var oe=async({appKey:e,rspackConfig:t})=>{let n=(await V())({environment:"development",appKey:e});if(t){let c=require(Pe.default.resolve(t));n=I(n,c)}let o=(0,Wt.rspack)(n),s=(0,Yt.default)(),i=Number(process.env.UI_PORT)||8e3,a=(0,Jt.devMiddleware)(o);s.use((0,Qt.default)()),Wr(s,n),s.use(a),s.get("*",(c,m)=>{var l,u;(u=o.outputFileSystem)==null||u.readFile(Pe.default.join(((l=n.output)==null?void 0:l.path)||"","index.html"),(g,v)=>{if(g||!v){m.sendStatus(404);return}m.send(v.toString())})}),s.listen(i,"0.0.0.0",()=>{console.info(`The React app is listening on port ${i}!
|
|
5
|
+
`)})};var er=p(require("chokidar"));var Zt=(e,t,r)=>{for(let n of e)G({inputDir:t,outputDir:r,fileName:n,mode:"development"})},tr=async e=>{let{inputDir:t,outputDir:r,watchFilePaths:n}=e,s=(await O()).getFunctionFiles();Zt(s,t,r);let i,a=[t,...n],c=er.default.watch(a);console.info(`watch: ${a.join(", ")}`),c.on("change",m=>{clearTimeout(i),i=setTimeout(()=>{console.info(`${m} has change`),Zt(s,t,r)},1e3)})};var Jr=(0,nr.default)("cli:tunnel"),Qr=async()=>{let e=await Gt(),t=process.env.RUNTIME_IMAGE||e.image||"docker-hub.gitee.work/gitee-prod/proxima-apps-runtime-server:4.4.0-alpha-86",r=Number(process.env.CONTAINER_PORT)||8455,n=process.env.CONTAINER_NAME||"cli-dev-apps-runtime-server",o=process.env.PULL_IMAGE!=="false",s={PORT:r,APPS_DIR:"/usr/src/app/apps",LRU_TTL:1,FS_MODE:"local",DEBUG:process.env.DEBUG||"runtime*",LOG_LEVEL:process.env.LOG_LEVEL,APPS_DEFAULT_LOCALE:process.env.APPS_DEFAULT_LOCALE||"zh-CN",PARSE_PUBLIC_SERVER_URL:process.env.PARSE_PUBLIC_SERVER_URL||e.parsePublicServerUrl,PARSE_SERVER_MASTER_KEY:process.env.PARSE_SERVER_MASTER_KEY||e.parseServerMasterKey,PROXIMA_CORE_URL:process.env.PROXIMA_CORE_URL||e.proximaCoreUrl,APPS_SERVER_URL:process.env.APPS_SERVER_URL||e.appsServerUrl,APPS_PARSE_SERVER_URL:process.env.APPS_PARSE_SERVER_URL||e.appsParseServerUrl,PGSQL_CLIENT_HOST:process.env.PGSQL_CLIENT_HOST,PGSQL_CLIENT_PORT:process.env.PGSQL_CLIENT_PORT,PGSQL_CLIENT_USER:process.env.PGSQL_CLIENT_USER,PGSQL_CLIENT_PASSWORD:process.env.PGSQL_CLIENT_PASSWORD,APPS_RUNTIME_IOREDIS_OPTIONS:process.env.APPS_RUNTIME_IOREDIS_OPTIONS?`'${process.env.APPS_RUNTIME_IOREDIS_OPTIONS}'`:void 0};return{runtimeImage:t,containerPort:r,containerName:n,containerEnv:s,pullImage:o}},or=async e=>{var Re,Ce,Ae;let{inputDir:t,outputDir:r,server:n,filesToCopy:o,resourcePort:s,ui:i,rspackConfig:a,noProxy:c,watchFilePaths:m=[]}=e;await Ee.default.emptyDir(r);let l=await O(),u=l.app.key,g=l.app.version,v=l.getFunctionFiles(),D=l.resources||[];if(!u){f.error("appKey is required!");return}if(!g){f.error("version is required!");return}console.info(`App key: ${se.default.bold.green(u)}`),console.info(`App version: ${se.default.bold.green(g)}
|
|
6
|
+
`);let{domain:U}=T();if(!U){f.error("Please login in first!");return}console.info(`Tunneling to ${se.default.bold.green(U)}`);let w=[],ae=async j=>{j instanceof Error&&console.error(j);try{await Promise.all(w.map(R=>R()))}catch(R){console.error("other error:",R)}process.exit()};process.on("SIGINT",ae),process.on("uncaughtException",ae),process.on("unhandledRejection",ae),i&&oe({appKey:u,rspackConfig:a});let lr=`${`/${u}/development/${g}`}/server-side`,Se=rr.default.join(r,lr);await z(Se,o),await tr({inputDir:t,outputDir:Se,watchFilePaths:m}),w.push(()=>Ee.default.remove(r));let pe="",De;if(n&&v.length>0){let{runtimeImage:j,containerPort:R,containerEnv:mr,containerName:ur,pullImage:fr}=await Qr();De=R;let K=new M(j,ur);fr&&await K.downloadImage(),await K.runContainer({port:R,env:mr,volume:[`${r}:/usr/src/app/apps`]}),w.push(()=>K.removeContainer()),c||(pe=await d({start:"start tunnel",error:"tunnel failed",succeed:"tunnel success"},()=>Ht(R)),Jr("runtimeHost",pe)),K.logs()}if(c){console.info(`\u4EE3\u7406\u5173\u95ED \u274C\uFF1A\u8BF7\u628A\u8BF7\u6C42\u6307\u5411localhost:${De}`);return}if(await zt({appKey:u,runtimeHost:pe,resources:D,resourcePort:s}),w.push(()=>qt(u)),n&&((Ae=(Ce=(Re=l.getManifest())==null?void 0:Re.modules)==null?void 0:Ce.webtrigger)!=null&&Ae.length)){console.info("You can use this url for test:");let j=`${U}/apps/api/v1/:tenant/apps/${u}/environments/development/webtriggers/:webtriggerKey`;console.info(`POST ${j}`)}};var sr=async e=>{let{copy:t=[],input:r="functions",output:n="cache",server:o=!0,resourcePort:s,ui:i,rspack:a,proxy:c,watch:m=[]}=e;await or({outputDir:ie.default.resolve(n),inputDir:ie.default.resolve(r),filesToCopy:[...B,...t],server:o,resourcePort:Number(s)||8e3,ui:!!i,rspackConfig:a,noProxy:!c,watchFilePaths:m.map(l=>ie.default.resolve(l))})};var Yr=async({rspackConfig:e})=>{let t=await O(),{key:r}=t.app;if(!r){f.error("manifest app key is required");return}oe({appKey:r,rspackConfig:e})},ir=Yr;var ar=async e=>{let{rspack:t}=e;await ir({rspackConfig:t})};var P=p(require("path")),y=p(require("fs-extra"));var Xr=["@ant-design/compatible","@giteeteam/apps-team-theme","webpack","webpack-cli","webpack-dev-server","webpack-merge","webpack-bundle-analyzer"],Zr={"@rspack/core":"^2.0.0","@rspack/plugin-react-refresh":"^1.4.2",deepmerge:"^4.3.1"},en=["webpack.config.js","webpack.config.cjs","webpack.config.mjs","webpack.config.ts"],Oe=e=>Object.fromEntries(Object.entries(e).sort(([t],[r])=>t.localeCompare(r))),tn=e=>{let t=e.peerDependencies;if(!t||typeof t!="object")return!1;let r=!1;for(let n of["@ant-design/compatible","@giteeteam/apps-team-theme"])n in t&&(delete t[n],r=!0);return r&&(e.peerDependencies=Oe(t)),r},rn=e=>{let t=["dependencies","devDependencies"],r=!1;for(let n of t){let o=e[n];if(!(!o||typeof o!="object"))for(let s of Xr)s in o&&(delete o[s],r=!0)}(!e.dependencies||typeof e.dependencies!="object")&&(e.dependencies={},r=!0);for(let[n,o]of Object.entries(Zr))e.dependencies[n]||(e.dependencies[n]=o,r=!0);return e.dependencies&&typeof e.dependencies=="object"&&(e.dependencies=Oe(e.dependencies)),e.devDependencies&&typeof e.devDependencies=="object"&&(e.devDependencies=Oe(e.devDependencies)),r},nn=e=>{if(!e.scripts||typeof e.scripts!="object")return!1;let t=!1;for(let[r,n]of Object.entries(e.scripts)){let o=n;o=o.replace(/\byarn\b/g,"pnpm"),o=o.replace(/\bwebpack-dev-server\b/g,"rspack serve"),o=o.replace(/\bwebpack serve\b/g,"rspack serve"),o=o.replace(/\bwebpack\b/g,"rspack"),o=o.replace(/--webpack\b/g,"--rspack"),o=o.replace(/(^|\s)-w(\s+)/g,"$1-r$2"),o=o.replace(/webpack\.config\.(js|cjs|mjs|ts)\b/g,"rspack.config.$1"),o!==n&&(e.scripts[r]=o,t=!0)}return t},on=async e=>{let t=P.default.join(e,"yarn.lock");return await y.default.pathExists(t)?(await y.default.remove(t),!0):!1},sn=async e=>{let t=!1;for(let r of en){let n=P.default.join(e,r);if(!await y.default.pathExists(n))continue;let o=r.replace(/^webpack\.config/,"rspack.config"),s=P.default.join(e,o);await y.default.pathExists(s)||(await y.default.move(n,s),t=!0);let i=await y.default.readFile(s,"utf8"),a=i.replace(/webpack配置/g,"rspack\u914D\u7F6E").replace(/import\s+\{\s*themeConfig\s*\}\s+from\s+['"]@giteeteam\/apps-team-theme['"];?\n?/g,"").replace(/import\s+\{\s*convertLegacyToken\s*\}\s+from\s+['"]@ant-design\/compatible['"];?\n?/g,"").replace(/const\s+mapToken\s*=\s*defaultAlgorithm\(\{\s*\.\.\.defaultSeed\s*,\s*\.\.\.themeConfig\.token\s*\}\);?/g,"const mapToken = defaultAlgorithm({ ...defaultSeed });").replace(/const\s+v4Token\s*=\s*convertLegacyToken\(\{\s*\.\.\.mapToken\s*\}\);?\n?/g,"").replace(/\n([ \t]*)\.\.\.v4Token,\n/g,`
|
|
7
|
+
`).replace(/import\s+\{\s*merge\s*\}\s+from\s+['"]webpack-merge['"];?/g,"import merge from 'deepmerge';").replace(/const\s+\{\s*merge\s*\}\s*=\s*require\((['"])webpack-merge\1\);?/g,"const merge = require('deepmerge');").replace(/(['"])webpack-merge\1/g,"$1deepmerge$1").replace(/^.*(rspack-bundle-analyzer|webpack-bundle-analyzer).*\n?/gm,"").replace(/^.*ANALYZER_PACKAGE.*\n?/gm,"").replace(/(['"])webpack\1/g,"$1@rspack/core$1");a!==i&&(await y.default.writeFile(s,a),t=!0)}return t},an=async e=>{var a,c,m,l;let t=P.default.join(e,"manifest.yml"),r=P.default.basename(e),n=r;if(!await y.default.pathExists(t))return{appName:r,appKey:n};let o=await y.default.readFile(t,"utf8"),s=((c=(a=o.match(/^\s*name:\s*(.+)\s*$/m))==null?void 0:a[1])==null?void 0:c.trim())||r,i=((l=(m=o.match(/^\s*key:\s*(.+)\s*$/m))==null?void 0:m[1])==null?void 0:l.trim())||n;return{appName:s,appKey:i}},pr=async e=>{let t=P.default.resolve(e||process.cwd()),r=P.default.join(t,"package.json");if(!await y.default.pathExists(r)){f.error(`package.json not found in ${t}`);return}let n=await y.default.readFile(r,"utf8"),o=JSON.parse(n),s=rn(o),i=tn(o),a=nn(o),c=await on(t),m=await sn(t),{appName:l,appKey:u}=await an(t),g=await y.default.pathExists(P.default.join(t,"SKILL.md"));await $(t,{appName:l,appKey:u});let v=!g;if((s||i||a)&&await y.default.writeFile(r,`${JSON.stringify(o,null,2)}
|
|
8
|
+
`),!s&&!i&&!a&&!c&&!m&&!v){console.info("Nothing to upgrade. Project already uses rspack settings.");return}console.info("upgrade-v1 finished."),console.info(`Project path: ${t}`),console.info("Please run: pnpm install")};var pn=`v${E}`;console.info(`GiteeTeam Apps Cli ${Te.default.bold.green(pn)}`);console.info(`Node.js ${Te.default.bold.green(process.version)}
|
|
9
|
+
`);var h=new cr.Command;h.version(E,"-v -V --vers").description("Giteeteam Apps Cli");h.command("build").option("--prod","build in production").option("--dev","build in development").option("--no-zip","no archive").option("-c --copy [letters...]","copy files").option("-i --input [dir]","input dir").option("-o --output [dir]","output dir").option("--ui","build ui").option("-r --rspack [file]","build ui rspack config file").action(ct);h.command("init").action(At);h.command("sync-skill [projectPath]").description("sync builtin skill files to project").action(Bt);h.command("upgrade-v1 [projectPath]").description("upgrade webpack project to rspack").action(pr);h.command("login").option("--domain [domain]","login domain").option("-u --username [username]","login username").option("-p --password [password]","login user password").action(Mt);h.command("tunnel").option("-c --copy [letters...]","copy files").option("-i --input [dir]","input dir").option("-o --output [dir]","output dir,default cache").option("--no-server","no server").option("--resourcePort [number]","resource port").option("--ui","build ui").option("-r --rspack [file]","build ui rspack config file").option("--no-proxy","no proxy").option("-w --watch [paths...]","watch files change").action(sr);h.command("deploy [filename]").option("-e --environment [environment]","app environment").option("-s --subscribe [tenants...]","subscribe tenants after deploy").option("--app-key [appKey]","app key used for subscribe").option("--version-key [versionKey]","version key used for subscribe").action(xt);h.command("subscribe <appKey> <versionKey>").option("-t --tenants [tenants...]","subscribe tenants, support comma split").option("-e --environment [environment]","app environment").action(Kt);h.command("ui-dev").option("-r --rspack [file]","build ui rspack config file").action(ar);h.parse(process.argv);
|
|
@@ -23,9 +23,53 @@
|
|
|
23
23
|
6. 修改模块定义后,优先执行构建并检查 manifest 校验报错。
|
|
24
24
|
7. 对已发布应用,禁止直接修改已有字段类型;使用新增字段 + 数据迁移方式演进。
|
|
25
25
|
|
|
26
|
+
## invoke 关键约束(Micro)
|
|
27
|
+
|
|
28
|
+
1. `Micro` 前端使用 `invoke` 时,SDK 会读取 `module.resolver.function` 来定位后端函数 key。
|
|
29
|
+
2. 因此页面模块必须写成:
|
|
30
|
+
|
|
31
|
+
```yaml
|
|
32
|
+
resolver:
|
|
33
|
+
function: <resolver-function-key>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
3. 如果只写顶层 `function: xxx`(未配置 `resolver`),常见报错:
|
|
37
|
+
`Cannot read properties of undefined (reading 'function')`。
|
|
38
|
+
|
|
26
39
|
## 常见自检
|
|
27
40
|
|
|
28
41
|
1. 页面模块是否有对应资源声明。
|
|
29
42
|
2. resolver 的 function key 与 `modules.function` 是否一致。
|
|
30
43
|
3. trigger/webtrigger 的入参与返回结构是否和调用方约定一致。
|
|
31
44
|
4. 表结构是否包含查询高频字段的索引。
|
|
45
|
+
5. 若 `invoke` 报 `reading 'function'`,优先检查当前页面模块是否配置了 `resolver.function`。
|
|
46
|
+
|
|
47
|
+
## item 接入点弹层挂载(共性问题)
|
|
48
|
+
|
|
49
|
+
`itemPanel` 场景中,`Select/DatePicker/Cascader` 等弹层组件经常被父容器裁剪,表现为下拉显示不全或被遮挡。
|
|
50
|
+
这是弹层挂载容器与 item 详情容器层级不一致导致的共性问题。
|
|
51
|
+
|
|
52
|
+
建议在弹窗或表单内显式指定 `getPopupContainer`,挂载到当前弹窗内的独立 DOM 节点,而不是依赖默认挂载:
|
|
53
|
+
|
|
54
|
+
```tsx
|
|
55
|
+
const popupRef = useRef<HTMLDivElement | null>(null);
|
|
56
|
+
const getPopupContainer = useCallback(() => popupRef.current || document.body, []);
|
|
57
|
+
|
|
58
|
+
<Modal
|
|
59
|
+
open={open}
|
|
60
|
+
modalRender={node => (
|
|
61
|
+
<div>
|
|
62
|
+
{node}
|
|
63
|
+
<div ref={popupRef} />
|
|
64
|
+
</div>
|
|
65
|
+
)}
|
|
66
|
+
>
|
|
67
|
+
<Select getPopupContainer={getPopupContainer} />
|
|
68
|
+
</Modal>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
自检顺序建议:
|
|
72
|
+
|
|
73
|
+
1. 先确认数据是否已正确拉取(排除“无数据”误判为“下拉显示不全”)。
|
|
74
|
+
2. 再确认弹层是否挂在当前 `itemPanel` 可视容器内。
|
|
75
|
+
3. 若仍异常,检查父容器是否存在 `overflow: hidden`、`transform`、`z-index` 冲突。
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
- 默认采用 `manifest.tables + getParseQuery/getParseObject`;`storage.entities` 仅用于 Storage API
|
|
21
21
|
- 已发布应用禁止直接修改已有字段类型;只能新增字段并给出迁移方案
|
|
22
22
|
- `manifest.yml` 定义完整且可校验
|
|
23
|
+
- Micro 页面若使用 `invoke`,对应模块必须配置 `resolver.function`(不能只写顶层 `function`)
|
|
23
24
|
- 需要发布时必须递增 `manifest.app.version`
|
|
24
25
|
- trigger 与 webtrigger 的 function 声明完整
|
|
25
26
|
- 发布/订阅失败时按顺序处理:先正常请求,再提权,最后提权 + `NO_PROXY/no_proxy`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@giteeteam/apps-cli",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2-alpha.1",
|
|
4
4
|
"description": "Giteeteam Apps cli",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -40,10 +40,10 @@
|
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
42
|
"@giteeteam/apps-manifest": "0.8.7",
|
|
43
|
+
"@rollup/plugin-commonjs": "^29.0.2",
|
|
43
44
|
"@rspack/core": "^2.0.0",
|
|
44
45
|
"@rspack/dev-middleware": "^2.0.1",
|
|
45
46
|
"@rspack/plugin-react-refresh": "^1.4.2",
|
|
46
|
-
"@rollup/plugin-commonjs": "^29.0.2",
|
|
47
47
|
"archiver": "^5.3.1",
|
|
48
48
|
"autoprefixer": "^10.4.20",
|
|
49
49
|
"axios": "^1.13.6",
|
|
@@ -59,6 +59,7 @@
|
|
|
59
59
|
"form-data": "^4.0.0",
|
|
60
60
|
"fs-extra": "^11.2.0",
|
|
61
61
|
"hasha": "^5.2.2",
|
|
62
|
+
"http-proxy-middleware": "^3.0.5",
|
|
62
63
|
"inquirer": "^8.2.6",
|
|
63
64
|
"localtunnel": "2.0.2",
|
|
64
65
|
"lowdb": "1.0.0",
|
|
@@ -23,9 +23,53 @@
|
|
|
23
23
|
6. 修改模块定义后,优先执行构建并检查 manifest 校验报错。
|
|
24
24
|
7. 对已发布应用,禁止直接修改已有字段类型;使用新增字段 + 数据迁移方式演进。
|
|
25
25
|
|
|
26
|
+
## invoke 关键约束(Micro)
|
|
27
|
+
|
|
28
|
+
1. `Micro` 前端使用 `invoke` 时,SDK 会读取 `module.resolver.function` 来定位后端函数 key。
|
|
29
|
+
2. 因此页面模块必须写成:
|
|
30
|
+
|
|
31
|
+
```yaml
|
|
32
|
+
resolver:
|
|
33
|
+
function: <resolver-function-key>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
3. 如果只写顶层 `function: xxx`(未配置 `resolver`),常见报错:
|
|
37
|
+
`Cannot read properties of undefined (reading 'function')`。
|
|
38
|
+
|
|
26
39
|
## 常见自检
|
|
27
40
|
|
|
28
41
|
1. 页面模块是否有对应资源声明。
|
|
29
42
|
2. resolver 的 function key 与 `modules.function` 是否一致。
|
|
30
43
|
3. trigger/webtrigger 的入参与返回结构是否和调用方约定一致。
|
|
31
44
|
4. 表结构是否包含查询高频字段的索引。
|
|
45
|
+
5. 若 `invoke` 报 `reading 'function'`,优先检查当前页面模块是否配置了 `resolver.function`。
|
|
46
|
+
|
|
47
|
+
## item 接入点弹层挂载(共性问题)
|
|
48
|
+
|
|
49
|
+
`itemPanel` 场景中,`Select/DatePicker/Cascader` 等弹层组件经常被父容器裁剪,表现为下拉显示不全或被遮挡。
|
|
50
|
+
这是弹层挂载容器与 item 详情容器层级不一致导致的共性问题。
|
|
51
|
+
|
|
52
|
+
建议在弹窗或表单内显式指定 `getPopupContainer`,挂载到当前弹窗内的独立 DOM 节点,而不是依赖默认挂载:
|
|
53
|
+
|
|
54
|
+
```tsx
|
|
55
|
+
const popupRef = useRef<HTMLDivElement | null>(null);
|
|
56
|
+
const getPopupContainer = useCallback(() => popupRef.current || document.body, []);
|
|
57
|
+
|
|
58
|
+
<Modal
|
|
59
|
+
open={open}
|
|
60
|
+
modalRender={node => (
|
|
61
|
+
<div>
|
|
62
|
+
{node}
|
|
63
|
+
<div ref={popupRef} />
|
|
64
|
+
</div>
|
|
65
|
+
)}
|
|
66
|
+
>
|
|
67
|
+
<Select getPopupContainer={getPopupContainer} />
|
|
68
|
+
</Modal>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
自检顺序建议:
|
|
72
|
+
|
|
73
|
+
1. 先确认数据是否已正确拉取(排除“无数据”误判为“下拉显示不全”)。
|
|
74
|
+
2. 再确认弹层是否挂在当前 `itemPanel` 可视容器内。
|
|
75
|
+
3. 若仍异常,检查父容器是否存在 `overflow: hidden`、`transform`、`z-index` 冲突。
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
- 默认采用 `manifest.tables + getParseQuery/getParseObject`;`storage.entities` 仅用于 Storage API
|
|
21
21
|
- 已发布应用禁止直接修改已有字段类型;只能新增字段并给出迁移方案
|
|
22
22
|
- `manifest.yml` 定义完整且可校验
|
|
23
|
+
- Micro 页面若使用 `invoke`,对应模块必须配置 `resolver.function`(不能只写顶层 `function`)
|
|
23
24
|
- 需要发布时必须递增 `manifest.app.version`
|
|
24
25
|
- trigger 与 webtrigger 的 function 声明完整
|
|
25
26
|
- 发布/订阅失败时按顺序处理:先正常请求,再提权,最后提权 + `NO_PROXY/no_proxy`
|