@calljmp/cli
Version:
12 lines (9 loc) • 5.4 kB
JavaScript
;var I=Object.create;var C=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var O=Object.getPrototypeOf,D=Object.prototype.hasOwnProperty;var J=(e,t)=>{for(var n in t)C(e,n,{get:t[n],enumerable:!0})},P=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of _(t))!D.call(e,r)&&r!==n&&C(e,r,{get:()=>t[r],enumerable:!(a=S(t,r))||a.enumerable});return e};var d=(e,t,n)=>(n=e!=null?I(O(e)):{},P(t||!e||!e.__esModule?C(n,"default",{value:e,enumerable:!0}):n,e)),U=e=>P(C({},"__esModule",{value:!0}),e);var A={};J(A,{configureDependencies:()=>K,configureIgnores:()=>M,configureService:()=>L});module.exports=U(A);var F=d(require("handlebars")),s=d(require("fs/promises")),o=d(require("path")),l=d(require("chalk")),k=require("child_process"),$=d(require("ora")),x=d(require("enquirer")),y=d(require("./logger")),T=require("./env"),h=require("./mobile");async function M({directory:e,entries:t}){const n=o.default.join(e,".gitignore");let a="";try{a=await s.default.readFile(n,"utf-8")}catch(i){if(i.code!=="ENOENT")throw i;y.default.info(l.default.yellow("Creating new .gitignore"))}const r=a.split(`
`);let f=!1;for(const i of t)r.some(c=>{const m=c.trim();return m===i||m===`/${i}`||m===`${i}/`})||(!a.endsWith(`
`)&&a!==""&&(a+=`
`),a+=`${i}
`,y.default.info(l.default.yellow(`Adding ${i} to .gitignore`)),f=!0);f&&await s.default.writeFile(n,a,"utf-8")}F.default.registerHelper("camelCase",function(e){return e.toLowerCase().replace(/[-_]+(.)?/g,(t,n)=>n?n.toUpperCase():"").replace(/^(.)/,t=>t.toLowerCase())});async function b(e,t={}){const n=await s.default.readFile(o.default.join(__dirname,"../templates",e),"utf-8");return F.default.compile(n)(t)}async function L({directory:e,entry:t,buckets:n={}}){const a=Object.keys(await(0,T.readVariables)(e,"production")),r=a.filter(p=>!p.toUpperCase().startsWith("SECRET_")),f=a.filter(p=>p.toUpperCase().startsWith("SECRET_")).map(p=>p.toUpperCase().replace("SECRET_",""));await s.default.mkdir(o.default.dirname(t),{recursive:!0}),await M({directory:e,entries:[".calljmp",".service.env",".env"]});const i=o.default.join(e,".calljmp","types");await s.default.mkdir(i,{recursive:!0});const g=o.default.join(i,"service.d.ts"),c=await b("service-types.hbr",{variables:r,secrets:f,buckets:Object.entries(n).map(([p,v])=>({name:p,binding:v}))});await s.default.writeFile(g,c,"utf-8");const m=o.default.join(i,"cf.d.ts"),w=await b("cf-types.hbr");await s.default.writeFile(m,w,"utf-8");const u=o.default.join(i,"index.d.ts");if(await s.default.writeFile(u,`// Do not edit this file directly. It is generated by the Calljmp CLI.
/* eslint-disable */
export * from './service';
export * from './cf';
`,"utf-8"),!await s.default.access(t,s.default.constants.R_OK).then(()=>!0).catch(()=>!1)){const p=await b("entry.hbr");await s.default.writeFile(t,p,"utf-8")}await q(e)}async function R(e,t,n={}){const{dev:a=!1,promptForPackageManager:r=!0,packageManagerMessage:f}=n,i=o.default.join(e,"package.json"),g=await s.default.readFile(i,"utf-8"),c=JSON.parse(g);if(!a&&c.dependencies&&t in c.dependencies||a&&c.devDependencies&&t in c.devDependencies)return;let m="npm";if(r){const u=await s.default.access(o.default.join(e,"yarn.lock")).then(()=>!0).catch(()=>!1);m=(await x.default.prompt({type:"select",name:"packageManager",message:f||"Select package manager",choices:[{name:"npm",value:"npm"},{name:"yarn",value:"yarn"},{name:"pnpm",value:"pnpm"}],initial:u?1:0})).packageManager}const w=(0,$.default)(l.default.dim(`Installing ${t}...`)).start();try{const u=m==="yarn"?"yarn add":m==="pnpm"?"pnpm add":"npm install",j=[];a&&j.push("--save-dev"),await new Promise((E,p)=>{(0,k.exec)(`${u} ${j.join(" ")} ${t}`,{cwd:e},v=>{v?p(v):E(null)})}),w.succeed(l.default.dim(`Installed ${t}`))}catch(u){throw w.fail(l.default.red(`Failed to install ${t}`)),u}finally{w.stop()}return m}async function W(e){await R(e,"@calljmp/react-native")}async function H(e){const t=o.default.join(e,"pubspec.yaml");if(!await s.default.access(t,s.default.constants.R_OK).then(()=>!0).catch(()=>!1)){y.default.warn(l.default.yellow("No pubspec.yaml found, skipping Flutter dependencies"));return}await(async r=>{try{if((await s.default.readFile(t,"utf-8")).includes(`${r}:`))return}catch{}const f=(0,$.default)(l.default.dim(`Installing ${r}...`)).start();try{await new Promise((i,g)=>{(0,k.exec)(`flutter pub add ${r}`,{cwd:e},c=>{c?g(c):i(null)})}),f.succeed(l.default.dim(`Installed ${r}`))}catch(i){throw f.fail(l.default.red(`Failed to install ${r}`)),i}finally{f.stop()}})("calljmp")}async function K({directory:e}){if(!(await x.default.prompt({type:"confirm",name:"confirm",message:"Install dependencies now?",initial:!0})).confirm)return;const n=(0,h.detectProjectType)(e);n===h.ProjectType.ReactNative?await W(e):n===h.ProjectType.Flutter?await H(e):y.default.warn(l.default.yellow(`Unsupported project type: ${n}`)),await R(e,"@calljmp/service",{packageManagerMessage:"Select package manager for @calljmp/service"})}async function q(e){const t=o.default.join(e,"tsconfig.json");try{const n=await s.default.readFile(t,"utf-8"),a=JSON.parse(n);a.include||(a.include=[]),a.include.includes(".calljmp/types/**/*.ts")||(a.include.push(".calljmp/types/**/*.ts"),await s.default.writeFile(t,JSON.stringify(a,null,2),"utf-8"))}catch{}}0&&(module.exports={configureDependencies,configureIgnores,configureService});