create-workery
Version:
CLI command for creating application projects for [Workery](https://github.com/iann838/workery).
3 lines (2 loc) • 4.63 kB
JavaScript
import e from"prompts";import o from"cross-spawn";import r from"which-pm-runs";import t from"semver";import n from"node:fs";let a=/^[a-z0-9-]+$/,l=[{value:"hello-world",title:"hello-world",description:"Get started with a basic Worker with Workery"},{value:"d1-drizzle",title:"d1-drizzle",description:"Get started with a Worker using D1 SQL with the Workery framework and Drizzle ORM"},{value:"do-sql-drizzle",title:"do-sql-drizzle",description:"Get started with a Worker using Durable Objects SQL API integrated with the Workery framework and Drizzle ORM"}],s={"hello-world":"iann838/workery/templates/hello-world","d1-drizzle":"iann838/workery/templates/d1-drizzle","do-sql-drizzle":"iann838/workery/templates/do-sql-drizzle"};function i(e){e.aborted&&(console.log(),console.log(p("!"),"Operation aborted by user"),console.log(),process.exit(1))}const c=(e,o)=>{try{n.writeFileSync(e,o)}catch(e){throw new Error(e)}},d=e=>{try{return n.readFileSync(e,"utf-8")}catch(e){throw new Error(e)}},p=e=>`[31m${e}[0m`,m=e=>`[32m${e}[0m`,g=e=>`[36m${e}[0m`,y=e=>`[90m${e}[0m`,u=e=>`[1m${e}[0m`;!async function(){const{directory:h,template:v}=await e([{type:"select",name:"template",onState:i,message:"Select a base template for your application",choices:l},{type:"text",name:"directory",onState:i,message:"The directory where the application should be created",validate:e=>a.test(e)||"."==e?"."!=e&&n.existsSync(e)?`Directory "${e}" already exists. Please choose a different directory.`:!("."==e&&n.readdirSync(".").length>0)||"Current directory is not empty. Please choose a different directory or an empty directory.":"Directory must be alphanumeric separated by hyphens (-) or current directory (.)"}]),{npx:w,version:x}=(()=>{const e=r();let{name:o,version:n}=e??{name:"npm",version:"0.0.0"};switch(process.env.TEST_PM&&process.env.TEST_PM_VERSION&&(o=process.env.TEST_PM,n=process.env.TEST_PM_VERSION,process.env.npm_config_user_agent=o),o){case"pnpm":return t.gt(n,"6.0.0")?{name:o,version:n,npm:"pnpm",npx:"pnpm",dlx:["pnpm","dlx"]}:{name:o,version:n,npm:"pnpm",npx:"pnpx",dlx:["pnpx"]};case"yarn":return t.gt(n,"2.0.0")?{name:o,version:n,npm:"yarn",npx:"yarn",dlx:["yarn","dlx"]}:{name:o,version:n,npm:"yarn",npx:"yarn",dlx:["yarn"]};case"bun":return{name:o,version:n,npm:"bun",npx:"bunx",dlx:["bunx"]};default:return{name:o,version:n,npm:"npm",npx:"npx",dlx:["npx"]}}})(),b="yarn"==w&&t.lt(x,"2.0.0")?"cloudflare":"cloudflare@latest",f=s[v];if(o.sync(w,["create",b,"--template",f,"--lang","ts","--deploy","false","--git","true",h],{stdio:"inherit"}),n.existsSync(h)||(console.log(),console.log(p("!"),"Failed to create the application directory"),console.log(),process.exit(1)),"hello-world"==v)console.log(),console.log("💻",u("Start developing")),console.log(y("> Change directories:"),g(`cd ${h}`)),console.log(y("> Start dev server:"),g(`${w} run dev`)),console.log(y("> Deploy application:"),g(`${w} run deploy`)),console.log();else if("d1-drizzle"==v){const{d1Name:o}=await e([{type:"text",name:"d1Name",onState:i,message:"Name of the D1 database (must be unique on your Cloudflare account)",validate:e=>a.test(e)||"Database name must be alphanumeric separated by hyphens (-)"}]),r=d(`${h}/wrangler.toml`),t=d(`${h}/package.json`);c(`${h}/wrangler.toml`,r.replace(/<TBD_D1NAME>/,o)),c(`${h}/package.json`,t.replace(/<TBD_D1NAME>/,o)),console.log(m("√"),"Updated wrangler.toml and package.json with D1 database name"),console.log(),console.log("🚣",u("Extra setup required, must be completed before deployment")),console.log(y("> Change directories:"),g(`cd ${h}`)),console.log(y("> Create the D1 database via Wrangler:"),g(`npx wrangler d1 create ${o}`)),console.log(y("> Update the D1 database ID in"),m("wrangler.toml (under [[d1_databases]])")),console.log(),console.log("💻",u("After setup completion, start developing")),console.log(y("> Start dev server:"),g(`${w} run dev`)),console.log(y("> Deploy application:"),g(`${w} run deploy`)),console.log(y("> Detect and generate migrations:"),g(`${w} run migrations:generate`)),console.log(y("> Apply migrations to local database:"),g(`${w} run migrations:apply`)),console.log(y("> Apply migrations to deployed database:"),g(`${w} run migrations:apply --remote`)),console.log()}else"do-sql-drizzle"==v&&(console.log(),console.log("💻",u("Start developing")),console.log(y("> Change directories:"),g(`cd ${h}`)),console.log(y("> Start dev server:"),g(`${w} run dev`)),console.log(y("> Deploy application:"),g(`${w} run deploy`)),console.log(y("> Detect and generate migrations:"),g(`${w} run migrations:generate`)),console.log())}();