zerostarter 0.0.18 → 0.0.19-canary.0

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.
Files changed (2) hide show
  1. package/dist/bin/index.mjs +18 -12
  2. package/package.json +1 -1
@@ -1,9 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import{a as e,c as t,d as n,f as r,i,l as a,n as o,o as s,r as c,s as l,t as u,u as d}from"../convert-DMU8fiBc.mjs";import{basename as f,join as p,resolve as m}from"node:path";import{existsSync as h,readdirSync as g}from"node:fs";import{createInterface as _}from"node:readline/promises";import{parseArgs as v}from"node:util";import{execFileSync as y}from"node:child_process";import{randomBytes as b}from"node:crypto";var ee={name:`zerostarter`,version:`0.0.18`,description:`Go from zero to a production-ready SaaS, rebranded and ready to ship.`,keywords:[`cli`,`saas`,`scaffold`,`starter`,`template`,`zerostarter`],homepage:`https://github.com/nrjdalal/zerostarter#readme`,bugs:`https://github.com/nrjdalal/zerostarter/issues`,license:`MIT`,author:{name:`Neeraj Dalal`,email:`admin@nrjdalal.com`,url:`https://nrjdalal.com`},repository:`nrjdalal/zerostarter`,funding:`https://github.com/sponsors/nrjdalal`,bin:{zerostarter:`dist/bin/index.mjs`},files:[`dist`],type:`module`,types:`./dist/index.d.mts`,exports:`./dist/index.mjs`,scripts:{build:`tsdown`,"check-types":`tsc --noEmit`,dev:`tsdown --watch`,test:`bun test`},devDependencies:{"@packages/config":`workspace:*`,"@types/bun":`catalog:`,"@types/node":`catalog:`,tsdown:`catalog:`,typescript:`catalog:`}};const x=()=>!!(process.stdin.isTTY&&process.stdout.isTTY),S=(e,t=e)=>process.stdout.isTTY?`\x1b]8;;${e}\x07${t}\x1b]8;;\x07`:e,C=(e,t=process.stdout)=>n=>t.isTTY?`\x1b[${e}m${n}\x1b[0m`:n,w=C(`38;5;208`),T=C(`38;2;63;185;80`),E=C(`38;2;210;153;34`),D=C(`38;2;248;81;73`,process.stderr),te=async(e,t=``)=>{let n=_({input:process.stdin,output:process.stdout});try{return(await n.question(`${e}${t?` (${t})`:``}: `)).trim()||t}finally{n.close()}},O=async(e,t=!0)=>{let n=_({input:process.stdin,output:process.stdout});try{let r=(await n.question(`${e} (${t?`Y/n`:`y/N`}) `)).trim().toLowerCase();return r?r===`y`||r===`yes`:t}finally{n.close()}},k=`pglaunch@5.5.7`,A=(e,t,n)=>y(e,t,{cwd:n,encoding:`utf8`,maxBuffer:1<<26,stdio:[`ignore`,`pipe`,`pipe`]}),ne=()=>{try{return y(`docker`,[`info`],{stdio:`ignore`}),!0}catch{return!1}},j=e=>{let r=p(e,`.env`);if(!s(r)){let i=p(e,`.env.example`);n(r,s(i)?t(i):``)}return r},M=(e,n)=>{let r=`${n}=`,i=t(e).split(`
3
- `).find(e=>e.startsWith(r));return i?i.slice(r.length).trim():``},N=(e,r,i)=>{let a=`${r}=`,o=t(e).split(`
2
+ import{a as e,c as t,d as n,f as r,i,l as a,n as o,o as s,r as c,s as l,t as u,u as d}from"../convert-DMU8fiBc.mjs";import{createRequire as f}from"node:module";import{basename as p,delimiter as m,join as h,resolve as g}from"node:path";import{existsSync as _,readdirSync as v}from"node:fs";import{createInterface as y}from"node:readline/promises";import{parseArgs as b}from"node:util";import{randomBytes as ee}from"node:crypto";import{homedir as te}from"node:os";var ne=Object.create,x=Object.defineProperty,re=Object.getOwnPropertyDescriptor,ie=Object.getOwnPropertyNames,ae=Object.getPrototypeOf,oe=Object.prototype.hasOwnProperty,S=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),se=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=ie(t),a=0,o=i.length,s;a<o;a++)s=i[a],!oe.call(e,s)&&s!==n&&x(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=re(t,s))||r.enumerable});return e},ce=(e,t,n)=>(n=e==null?{}:ne(ae(e)),se(t||!e||!e.__esModule?x(n,`default`,{value:e,enumerable:!0}):n,e)),C=f(import.meta.url),le={name:`zerostarter`,version:`0.0.19-canary.0`,description:`Go from zero to a production-ready SaaS, rebranded and ready to ship.`,keywords:[`cli`,`saas`,`scaffold`,`starter`,`template`,`zerostarter`],homepage:`https://github.com/nrjdalal/zerostarter#readme`,bugs:`https://github.com/nrjdalal/zerostarter/issues`,license:`MIT`,author:{name:`Neeraj Dalal`,email:`admin@nrjdalal.com`,url:`https://nrjdalal.com`},repository:`nrjdalal/zerostarter`,funding:`https://github.com/sponsors/nrjdalal`,bin:{zerostarter:`dist/bin/index.mjs`},files:[`dist`],type:`module`,types:`./dist/index.d.mts`,exports:`./dist/index.mjs`,scripts:{build:`tsdown`,"check-types":`tsc --noEmit`,dev:`tsdown --watch`,test:`bun test`},devDependencies:{"@packages/config":`workspace:*`,"@types/bun":`catalog:`,"@types/cross-spawn":`catalog:`,"@types/node":`catalog:`,"cross-spawn":`catalog:`,tsdown:`catalog:`,typescript:`catalog:`}};const w=()=>!!(process.stdin.isTTY&&process.stdout.isTTY),ue=(e,t=e)=>process.stdout.isTTY?`\x1b]8;;${e}\x07${t}\x1b]8;;\x07`:e,T=(e,t=process.stdout)=>n=>t.isTTY?`\x1b[${e}m${n}\x1b[0m`:n,E=T(`38;5;208`),D=T(`38;2;63;185;80`),O=T(`38;2;210;153;34`),k=T(`38;2;248;81;73`,process.stderr),de=async(e,t=``)=>{let n=y({input:process.stdin,output:process.stdout});try{return(await n.question(`${e}${t?` (${t})`:``}: `)).trim()||t}finally{n.close()}},A=async(e,t=!0)=>{let n=y({input:process.stdin,output:process.stdout});try{let r=(await n.question(`${e} (${t?`Y/n`:`y/N`}) `)).trim().toLowerCase();return r?r===`y`||r===`yes`:t}finally{n.close()}};var fe=S(((e,t)=>{t.exports=a,a.sync=o;var n=C(`fs`);function r(e,t){var n=t.pathExt===void 0?process.env.PATHEXT:t.pathExt;if(!n||(n=n.split(`;`),n.indexOf(``)!==-1))return!0;for(var r=0;r<n.length;r++){var i=n[r].toLowerCase();if(i&&e.substr(-i.length).toLowerCase()===i)return!0}return!1}function i(e,t,n){return!e.isSymbolicLink()&&!e.isFile()?!1:r(t,n)}function a(e,t,r){n.stat(e,function(n,a){r(n,n?!1:i(a,e,t))})}function o(e,t){return i(n.statSync(e),e,t)}})),pe=S(((e,t)=>{t.exports=r,r.sync=i;var n=C(`fs`);function r(e,t,r){n.stat(e,function(e,n){r(e,e?!1:a(n,t))})}function i(e,t){return a(n.statSync(e),t)}function a(e,t){return e.isFile()&&o(e,t)}function o(e,t){var n=e.mode,r=e.uid,i=e.gid,a=t.uid===void 0?process.getuid&&process.getuid():t.uid,o=t.gid===void 0?process.getgid&&process.getgid():t.gid,s=64,c=8,l=1,u=s|c;return n&l||n&c&&i===o||n&s&&r===a||n&u&&a===0}})),me=S(((e,t)=>{C(`fs`);var n=process.platform===`win32`||global.TESTING_WINDOWS?fe():pe();t.exports=r,r.sync=i;function r(e,t,i){if(typeof t==`function`&&(i=t,t={}),!i){if(typeof Promise!=`function`)throw TypeError(`callback not provided`);return new Promise(function(n,i){r(e,t||{},function(e,t){e?i(e):n(t)})})}n(e,t||{},function(e,n){e&&(e.code===`EACCES`||t&&t.ignoreErrors)&&(e=null,n=!1),i(e,n)})}function i(e,t){try{return n.sync(e,t||{})}catch(e){if(t&&t.ignoreErrors||e.code===`EACCES`)return!1;throw e}}})),he=S(((e,t)=>{let n=process.platform===`win32`||process.env.OSTYPE===`cygwin`||process.env.OSTYPE===`msys`,r=C(`path`),i=n?`;`:`:`,a=me(),o=e=>Object.assign(Error(`not found: ${e}`),{code:`ENOENT`}),s=(e,t)=>{let r=t.colon||i,a=e.match(/\//)||n&&e.match(/\\/)?[``]:[...n?[process.cwd()]:[],...(t.path||process.env.PATH||``).split(r)],o=n?t.pathExt||process.env.PATHEXT||`.EXE;.CMD;.BAT;.COM`:``,s=n?o.split(r):[``];return n&&e.indexOf(`.`)!==-1&&s[0]!==``&&s.unshift(``),{pathEnv:a,pathExt:s,pathExtExe:o}},c=(e,t,n)=>{typeof t==`function`&&(n=t,t={}),t||={};let{pathEnv:i,pathExt:c,pathExtExe:l}=s(e,t),u=[],d=n=>new Promise((a,s)=>{if(n===i.length)return t.all&&u.length?a(u):s(o(e));let c=i[n],l=/^".*"$/.test(c)?c.slice(1,-1):c,d=r.join(l,e),p=!l&&/^\.[\\\/]/.test(e)?e.slice(0,2)+d:d;a(f(p,n,0))}),f=(e,n,r)=>new Promise((i,o)=>{if(r===c.length)return i(d(n+1));let s=c[r];a(e+s,{pathExt:l},(a,o)=>{if(!a&&o)if(t.all)u.push(e+s);else return i(e+s);return i(f(e,n,r+1))})});return n?d(0).then(e=>n(null,e),n):d(0)};t.exports=c,c.sync=(e,t)=>{t||={};let{pathEnv:n,pathExt:i,pathExtExe:c}=s(e,t),l=[];for(let o=0;o<n.length;o++){let s=n[o],u=/^".*"$/.test(s)?s.slice(1,-1):s,d=r.join(u,e),f=!u&&/^\.[\\\/]/.test(e)?e.slice(0,2)+d:d;for(let e=0;e<i.length;e++){let n=f+i[e];try{if(a.sync(n,{pathExt:c}))if(t.all)l.push(n);else return n}catch{}}}if(t.all&&l.length)return l;if(t.nothrow)return null;throw o(e)}})),ge=S(((e,t)=>{let n=(e={})=>{let t=e.env||process.env;return(e.platform||process.platform)===`win32`?Object.keys(t).reverse().find(e=>e.toUpperCase()===`PATH`)||`Path`:`PATH`};t.exports=n,t.exports.default=n})),_e=S(((e,t)=>{let n=C(`path`),r=he(),i=ge();function a(e,t){let a=e.options.env||process.env,o=process.cwd(),s=e.options.cwd!=null,c=s&&process.chdir!==void 0&&!process.chdir.disabled;if(c)try{process.chdir(e.options.cwd)}catch{}let l;try{l=r.sync(e.command,{path:a[i({env:a})],pathExt:t?n.delimiter:void 0})}catch{}finally{c&&process.chdir(o)}return l&&=n.resolve(s?e.options.cwd:``,l),l}function o(e){return a(e)||a(e,!0)}t.exports=o})),ve=S(((e,t)=>{let n=/([()\][%!^"`<>&|;, *?])/g;function r(e){return e=e.replace(n,`^$1`),e}function i(e,t){return e=`${e}`,e=e.replace(/(?=(\\+?)?)\1"/g,`$1$1\\"`),e=e.replace(/(?=(\\+?)?)\1$/,`$1$1`),e=`"${e}"`,e=e.replace(n,`^$1`),t&&(e=e.replace(n,`^$1`)),e}t.exports.command=r,t.exports.argument=i})),ye=S(((e,t)=>{t.exports=/^#!(.*)/})),be=S(((e,t)=>{let n=ye();t.exports=(e=``)=>{let t=e.match(n);if(!t)return null;let[r,i]=t[0].replace(/#! ?/,``).split(` `),a=r.split(`/`).pop();return a===`env`?i:i?`${a} ${i}`:a}})),xe=S(((e,t)=>{let n=C(`fs`),r=be();function i(e){let t=Buffer.alloc(150),i;try{i=n.openSync(e,`r`),n.readSync(i,t,0,150,0),n.closeSync(i)}catch{}return r(t.toString())}t.exports=i})),Se=S(((e,t)=>{let n=C(`path`),r=_e(),i=ve(),a=xe(),o=process.platform===`win32`,s=/\.(?:com|exe)$/i,c=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function l(e){e.file=r(e);let t=e.file&&a(e.file);return t?(e.args.unshift(e.file),e.command=t,r(e)):e.file}function u(e){if(!o)return e;let t=l(e),r=!s.test(t);if(e.options.forceShell||r){let r=c.test(t);e.command=n.normalize(e.command),e.command=i.command(e.command),e.args=e.args.map(e=>i.argument(e,r)),e.args=[`/d`,`/s`,`/c`,`"${[e.command].concat(e.args).join(` `)}"`],e.command=process.env.comspec||`cmd.exe`,e.options.windowsVerbatimArguments=!0}return e}function d(e,t,n){t&&!Array.isArray(t)&&(n=t,t=null),t=t?t.slice(0):[],n=Object.assign({},n);let r={command:e,args:t,options:n,file:void 0,original:{command:e,args:t}};return n.shell?r:u(r)}t.exports=d})),Ce=S(((e,t)=>{let n=process.platform===`win32`;function r(e,t){return Object.assign(Error(`${t} ${e.command} ENOENT`),{code:`ENOENT`,errno:`ENOENT`,syscall:`${t} ${e.command}`,path:e.command,spawnargs:e.args})}function i(e,t){if(!n)return;let r=e.emit;e.emit=function(n,i){if(n===`exit`){let n=a(i,t);if(n)return r.call(e,`error`,n)}return r.apply(e,arguments)}}function a(e,t){return n&&e===1&&!t.file?r(t.original,`spawn`):null}function o(e,t){return n&&e===1&&!t.file?r(t.original,`spawnSync`):null}t.exports={hookChildProcess:i,verifyENOENT:a,verifyENOENTSync:o,notFoundError:r}})),j=ce(S(((e,t)=>{let n=C(`child_process`),r=Se(),i=Ce();function a(e,t,a){let o=r(e,t,a),s=n.spawn(o.command,o.args,o.options);return i.hookChildProcess(s,o),s}function o(e,t,a){let o=r(e,t,a),s=n.spawnSync(o.command,o.args,o.options);return s.error=s.error||i.verifyENOENTSync(s.status,o),s}t.exports=a,t.exports.spawn=a,t.exports.sync=o,t.exports._parse=r,t.exports._enoent=i}))(),1);const M=(e,t,n)=>{let r=j.default.sync(e,t,{cwd:n,encoding:`utf8`,maxBuffer:1<<26,stdio:[`ignore`,`pipe`,`pipe`]});if(r.error)throw r.error;if(r.status!==0)throw Object.assign(Error(`${e} ${t.join(` `)} exited with code ${r.status}`),{status:r.status,stdout:r.stdout,stderr:r.stderr});return r.stdout||``},N=(e,t,n)=>{let r=j.default.sync(e,t,{cwd:n,stdio:`inherit`});if(r.error)throw r.error;if(r.status!==0)throw Error(`${e} ${t.join(` `)} exited with code ${r.status}`)},P=(e,t)=>{let n=j.default.sync(e,t,{stdio:`ignore`});return!n.error&&n.status===0},F=`pglaunch@5.5.7`,we=()=>P(`docker`,[`info`]),I=e=>{let r=h(e,`.env`);if(!s(r)){let i=h(e,`.env.example`);n(r,s(i)?t(i):``)}return r},L=(e,n)=>{let r=`${n}=`,i=t(e).split(`
3
+ `).find(e=>e.startsWith(r));return i?i.slice(r.length).trim():``},R=(e,r,i)=>{let a=`${r}=`,o=t(e).split(`
4
4
  `),s=o.findIndex(e=>e.startsWith(a));if(s>=0)o[s]=`${a}${i}`;else{for(;o.length&&o[o.length-1]===``;)o.pop();o.push(`${a}${i}`,``)}n(e,o.join(`
5
- `))},P=e=>{let t=j(e);M(t,`BETTER_AUTH_SECRET`)||N(t,`BETTER_AUTH_SECRET`,b(32).toString(`base64`))},F=e=>{let t=p(e,`.env`);return s(t)&&M(t,`POSTGRES_URL`)!==``},re=e=>{let t=e.match(/postgres(?:ql)?:\/\/[\w.:@\-/%?=&]+/);if(!t)return null;let n=e.match(/name "([^" ]+) :\d+" started/),r=e.match(/similar name "([^"]+)"/);return{url:t[0],container:n?n[1]:r?r[1]:``,reused:!n}},I=(e,t)=>{let n=t?[k,`-k`,`-c`]:[k,`-k`],r;try{r=A(`bunx`,n,e)}catch(e){let t=e;r=[t.stdout,t.stderr].filter(Boolean).join(`
6
- `)}return re(r)},ie=e=>{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,e)},L=e=>{if(e)for(let t=0;t<30;t++)try{y(`docker`,[`exec`,e,`pg_isready`,`-U`,`postgres`],{stdio:`ignore`});return}catch{ie(1e3)}},ae=e=>{let t=j(e),n=n=>{N(t,`POSTGRES_URL`,n.url),L(n.container),A(`bun`,[`run`,`db:migrate`],e)},r=I(e,!1);if(r&&r.reused){n(r);return}if(r)try{n(r);return}catch{}let i=I(e,!0);if(!i)throw Error(`pglaunch did not print a connection URL`);n(i)},R=(e,t,n)=>y(e,t,{cwd:n,encoding:`utf8`,stdio:[`ignore`,`pipe`,`pipe`]}),oe=()=>{y(`bun`,[`--version`],{stdio:`ignore`})},z=(e=oe)=>{try{e()}catch(e){throw Error("ZeroStarter needs Bun, but `bun` isn't on your PATH. Install it from https://bun.sh, then re-run with `bunx zerostarter ...` (not `npx`). The CLI shells out to bun and bunx to fetch, install, and migrate.",{cause:e})}},se=(e,t=`main`)=>{R(`bunx`,[`gitpick@6.0.0`,`https://github.com/nrjdalal/zerostarter/tree/${t}`,e])},B=(e,t=`main`)=>{R(`bunx`,[`gitpick@6.0.0`,`https://github.com/nrjdalal/zerostarter/tree/${t}`,e,`-o`])},ce=async(e=`main`)=>{let t=`https://raw.githubusercontent.com/nrjdalal/zerostarter/${e}/.gitpickignore`,n=await fetch(t);if(!n.ok)throw Error(`Could not fetch .gitpickignore from ${e} (HTTP ${n.status}).`);return n.text()},V=e=>R(`git`,[`status`,`--porcelain`],e).trim()===``,H=(e,t)=>{for(let n of t)try{R(`git`,[`checkout`,`--`,n],e),R(`git`,[`clean`,`-fd`,`--`,n],e)}catch{}},U=e=>{R(`git`,[`reset`,`--hard`,`HEAD`],e),R(`git`,[`clean`,`-fd`],e)},W=(e,t,n)=>{if(!s(p(e,`.git`)))throw Error(t);if(!V(e))throw Error(n)},G=async(e,t,n)=>{try{await n()}catch(n){throw U(e),console.log(t),n}},K=e=>{R(`bun`,[`install`],e)},le=e=>{R(`git`,[`init`,`-q`,`-b`,`canary`],e)},ue=(e,t)=>{R(`git`,[`branch`,t],e)},q=(e,t)=>{R(`git`,[`add`,`-A`],e);try{R(`git`,[`commit`,`--no-verify`,`-q`,`-m`,t],e)}catch{}},J=e=>!h(e)||g(e).filter(e=>e!==`.git`).length===0,Y=e=>s(p(e,`packages/config/src/site.ts`)),de=async e=>{let{positionals:t,values:n}=v({allowPositionals:!0,args:e,options:{db:{type:`boolean`},"dry-run":{type:`boolean`},help:{short:`h`,type:`boolean`},yes:{short:`y`,type:`boolean`}}});if(n.help){console.log(`Usage:
5
+ `))},z=e=>{let t=I(e);L(t,`BETTER_AUTH_SECRET`)||R(t,`BETTER_AUTH_SECRET`,ee(32).toString(`base64`))},B=e=>{let t=h(e,`.env`);return s(t)&&L(t,`POSTGRES_URL`)!==``},Te=e=>{let t=e.match(/postgres(?:ql)?:\/\/[\w.:@\-/%?=&]+/);if(!t)return null;let n=e.match(/name "([^" ]+) :\d+" started/),r=e.match(/similar name "([^"]+)"/);return{url:t[0],container:n?n[1]:r?r[1]:``}},V=(e,t)=>{let n=t?[`--bun`,F,`-k`,`-c`]:[`--bun`,F,`-k`],r;try{r=M(`bunx`,n,e)}catch(e){let t=e;r=[t.stdout,t.stderr].filter(Boolean).join(`
6
+ `)}return Te(r)},Ee=e=>{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,e)},De=e=>{if(e)for(let t=0;t<30;t++){if(P(`docker`,[`exec`,e,`pg_isready`,`-U`,`postgres`]))return;Ee(1e3)}},Oe=e=>{let t=I(e),n=V(e,!1)||V(e,!0);if(!n)throw Error(`pglaunch did not print a connection URL`);R(t,`POSTGRES_URL`,n.url),De(n.container),N(`bun`,[`run`,`db:migrate`],e)},H=e=>{N(`bun`,[`install`],e)},ke=()=>{if(!P(`bun`,[`--version`]))throw Error(`bun is not on PATH`)},U=(e=ke,t=!!process.versions.bun,n=process.env.npm_config_user_agent||``)=>{if(t||n.startsWith(`bun/`))return!0;try{return e(),!0}catch{return!1}},Ae=(e,t=`main`)=>{M(`bunx`,[`--bun`,`gitpick@6.0.0`,`https://github.com/nrjdalal/zerostarter/tree/${t}`,e])},W=(e,t=`main`)=>{M(`bunx`,[`--bun`,`gitpick@6.0.0`,`https://github.com/nrjdalal/zerostarter/tree/${t}`,e,`-o`])},je=async(e=`main`)=>{let t=`https://raw.githubusercontent.com/nrjdalal/zerostarter/${e}/.gitpickignore`,n=await fetch(t);if(!n.ok)throw Error(`Could not fetch .gitpickignore from ${e} (HTTP ${n.status}).`);return n.text()},Me=e=>M(`git`,[`status`,`--porcelain`],e).trim()===``,Ne=(e,t)=>{for(let n of t)try{M(`git`,[`checkout`,`--`,n],e),M(`git`,[`clean`,`-fd`,`--`,n],e)}catch{}},Pe=e=>{M(`git`,[`reset`,`--hard`,`HEAD`],e),M(`git`,[`clean`,`-fd`],e)},G=(e,t,n)=>{if(!s(h(e,`.git`)))throw Error(t);if(!Me(e))throw Error(n)},K=async(e,t,n)=>{try{await n()}catch(n){throw Pe(e),console.log(t),n}},Fe=e=>{M(`git`,[`init`,`-q`,`-b`,`canary`],e)},Ie=(e,t)=>{M(`git`,[`branch`,t],e)},q=(e,t)=>{M(`git`,[`add`,`-A`],e);try{M(`git`,[`commit`,`--no-verify`,`-q`,`-m`,t],e)}catch{}},Le=(e=process.env.npm_config_user_agent||``)=>e.startsWith(`bun/`)?`bunx`:e.startsWith(`pnpm/`)?`pnpm dlx`:e.startsWith(`yarn/`)?`yarn dlx`:e.startsWith(`npm/`)?`npx`:`unknown`,Re=(e=process.platform)=>e===`win32`?{cmd:`powershell`,args:[`-Command`,`irm bun.sh/install.ps1 | iex`]}:{cmd:`bash`,args:[`-c`,`curl -fsSL https://bun.sh/install | bash`]},ze=(e=process.argv.slice(2))=>[`zerostarter`,...e].join(` `),Be=()=>h(process.env.BUN_INSTALL||h(te(),`.bun`),`bin`),J=async(e=!1)=>{if(U())return;let t=Le(),n=`bunx --bun ${ze()}`;if(console.error(k(`Seems like you are using ${t===`unknown`?`npx/pnpx`:t} or Windows, try using:`)),console.error(E(` ${n}`)),console.error(``),e||w()&&await A(`Or install bun now and continue?`,!0)){let{cmd:e,args:t}=Re();console.error(`Installing bun from https://bun.sh/install ...`);try{if(N(e,t),process.env.PATH=`${Be()}${m}${process.env.PATH||``}`,U())return;console.error(k(`
7
+ bun is installed but isn't on this shell's PATH yet. Open a new terminal and re-run:`)),console.error(E(` ${n}`))}catch{console.error(k(`
8
+ Could not install bun. Install it from https://bun.sh, then re-run:`)),console.error(E(` ${n}`))}}process.exit(1)},Ve=e=>!_(e)||v(e).filter(e=>e!==`.git`).length===0,Y=e=>s(h(e,`packages/config/src/site.ts`)),He=async e=>{let{positionals:t,values:n}=b({allowPositionals:!0,args:e,options:{db:{type:`boolean`},"dry-run":{type:`boolean`},help:{short:`h`,type:`boolean`},yes:{short:`y`,type:`boolean`}}});if(n.help){console.log(`Usage:
7
9
  $ bunx zerostarter init [dir] [options]
8
10
 
9
11
  Scaffold ZeroStarter into dir (default .) as a fresh product. The author's
@@ -16,11 +18,15 @@ Options:
16
18
  -y, --yes Skip prompts, taking defaults (provisions Postgres when Docker is running)
17
19
  --db Provision a local Postgres (pglaunch) and migrate; needs Docker
18
20
  --dry-run Print the plan without writing anything
19
- -h, --help Display help`);return}n[`dry-run`]||z();let r=x()&&!n.yes,i=t[0]??`.`,a=m(i),o=Y(a);if(!o&&!J(a)){if(!r)throw Error(`Directory is not empty. Run it in an empty directory, or pass a project name: bunx zerostarter init <name>`);let e=await te(`Directory isn't empty. Project name`);if(!e)throw Error(`No directory name provided.`);i=e}let c=m(i),l=f(c),d={name:l};if(n[`dry-run`]){console.log(`bunx zerostarter init (dry run)`),console.log(` target: ${c}`),console.log(` name: ${l}`),console.log(` mode: ${Y(c)?`in place`:`fetch first`}`);return}if(o&&r&&!await O(E(`Convert ${c} in place? This rewrites files and commits.`),!1)){console.log(`Aborted.`);return}console.log(),Y(c)||(console.log(`Fetching the latest ZeroStarter ...`),se(c)),s(p(c,`.git`))||(le(c),q(c,`ci(init): scaffold from zerostarter`),ue(c,`main`)),console.log(`Removing starter content and rebranding ...`),u(c,d),console.log(`Installing dependencies ...`),K(c),q(c,`ci(init): re-baseline as ${l}`),P(c);let h=!1,g=ne(),_=F(c),y=!1;if(_?n.db&&console.log(E(` --db ignored: POSTGRES_URL is already set in .env.`)):y=n.db?!0:r?await O(`Provision a local Postgres database now?`,g):g,y&&g)try{console.log(`Provisioning a local database with pglaunch and migrating ...`),ae(c),h=!0}catch(e){let t=e.stderr,n=t?String(t).trim():e instanceof Error?e.message:String(e);console.log(E(` Database setup failed; set POSTGRES_URL in .env yourself.`)),n&&console.log(E(` ${n}`))}else y&&console.log(E(` Docker isn't running, so the database wasn't provisioned. Set POSTGRES_URL in .env, or start Docker and re-run for automatic setup.`));let b=[[`packages/config/src/site.ts`,`your brand: name, tagline, links`],[`web/next/content`,`your docs and blog`],[`web/next/public`,`your logo and assets`]];console.log(`\n${T(`✓`)} ${l} is ready.\n`),console.log(`Next steps:`),c!==process.cwd()&&console.log(` ${w(`cd ${i}`)}`),h||(console.log(` ${w(`set POSTGRES_URL in .env`)} # your Postgres connection string`),console.log(` ${w(`bun run db:migrate`)}`)),console.log(` ${w(`bun run dev`)}`),console.log(`
20
- Push to an empty GitHub repo when ready:`),console.log(` ${w(`git push origin canary`)}`),console.log(`canary becomes the default branch; your next push seeds main and opens the release PR.`),console.log(`
21
- Make it yours:`);for(let[e,t]of b)console.log(` ${e.padEnd(29)} ${t}`);console.log(h?`
22
- Everything works out of the box. Try it now; add OAuth or other credentials to .env whenever you like.`:`
23
- It needs a Postgres database to run: a hosted one like Neon works, or a local Docker one. OAuth and other credentials are optional.`)},fe=async t=>{let{positionals:n,values:r}=v({allowPositionals:!0,args:t,options:{help:{short:`h`,type:`boolean`},yes:{short:`y`,type:`boolean`}}});if(r.help){console.log(`Usage:
21
+ -h, --help Display help`);return}n[`dry-run`]||await J(!!n.yes);let r=w()&&!n.yes,i=t[0]??`.`,a=g(i),o=Y(a);if(!o&&!Ve(a)){if(!r)throw Error(`Directory is not empty. Run it in an empty directory, or pass a project name: bunx zerostarter init <name>`);let e=await de(`Directory isn't empty. Project name`);if(!e)throw Error(`No directory name provided.`);i=e}let c=g(i),l=p(c),d={name:l};if(n[`dry-run`]){console.log(`bunx zerostarter init (dry run)`),console.log(` target: ${c}`),console.log(` name: ${l}`),console.log(` mode: ${Y(c)?`in place`:`fetch first`}`);return}if(o&&r&&!await A(O(`Convert ${c} in place? This rewrites files and commits.`),!1)){console.log(`Aborted.`);return}console.log(),Y(c)||(console.log(`Fetching the latest ZeroStarter ...`),Ae(c)),s(h(c,`.git`))||(Fe(c),q(c,`ci(init): scaffold from zerostarter`),Ie(c,`main`)),console.log(`Removing starter content and rebranding ...`),u(c,d),console.log(`Installing dependencies ...`),console.log(),H(c),q(c,`ci(init): re-baseline as ${l}`),z(c);let f=!1,m=we(),_=B(c),v=!1;if(_?n.db&&console.log(O(` --db ignored: POSTGRES_URL is already set in .env.`)):v=n.db?!0:r?await A(`Provision a local Postgres database now?`,m):m,v&&m)try{console.log(`
22
+ Provisioning a local Postgres with pglaunch and migrating ...`),console.log(),Oe(c),console.log(),f=!0}catch(e){let t=e.stderr,n=t?String(t).trim():e instanceof Error?e.message:String(e);B(c)?console.log(O(`
23
+ Postgres is provisioned, but the migration failed; run bun run db:migrate.`)):console.log(O(`
24
+ Database setup failed; set POSTGRES_URL in .env yourself.`)),n&&console.log(O(` ${n}`))}else v&&console.log(O(`
25
+ Docker isn't running, so the database wasn't provisioned. Set POSTGRES_URL in .env, or start Docker and re-run for automatic setup.`));let y=[[`packages/config/src/site.ts`,`your brand: name, tagline, links`],[`web/next/content`,`your docs and blog`],[`web/next/public`,`your logo and assets`]];console.log(`\n${D(`✓`)} ${l} is ready.\n`),console.log(`Next steps:`),c!==process.cwd()&&console.log(` ${E(`cd ${i}`)}`),B(c)||console.log(` ${E(`set POSTGRES_URL in .env`)} # your Postgres connection string`),f||console.log(` ${E(`bun run db:migrate`)}`),console.log(` ${E(`bun run dev`)}`),console.log(`
26
+ Push to an empty GitHub repo when ready:`),console.log(` ${E(`git push origin canary`)}`),console.log(`canary becomes the default branch; your next push seeds main and opens the release PR.`),console.log(`
27
+ Make it yours:`);for(let[e,t]of y)console.log(` ${e.padEnd(29)} ${t}`);console.log(f?`
28
+ Everything works out of the box: dependencies are installed and the local Postgres is migrated. Add OAuth or other credentials to .env whenever you like.`:`
29
+ It needs a Postgres database to run: a hosted one like Neon works, or a local Docker one (re-run with Docker running to auto-provision). OAuth and other credentials are optional.`)},Ue=async t=>{let{positionals:n,values:r}=b({allowPositionals:!0,args:t,options:{help:{short:`h`,type:`boolean`},yes:{short:`y`,type:`boolean`}}});if(r.help){console.log(`Usage:
24
30
  $ bunx zerostarter reinit [dir] [options]
25
31
 
26
32
  Re-scaffold an existing git repo (default .) as a fresh ZeroStarter: delete every
@@ -30,7 +36,7 @@ branch; push when ready.
30
36
 
31
37
  Options:
32
38
  -y, --yes Skip the confirmation prompt
33
- -h, --help Display help`);return}z();let i=m(n[0]??`.`),a=f(i),o=x()&&!r.yes;if(W(i,`No git repository in ${i}. reinit re-scaffolds an existing repo; use init for a new project.`,`Working tree has uncommitted changes. Commit or stash them first; reinit deletes every tracked file.`),o&&!await O(E(`Delete every file in ${i} (keeping .git and .env*) and re-scaffold as ${a}?`),!1)){console.log(`Aborted.`);return}console.log(),console.log(`Removing all files (keeping .git and your .env* files) ...`),await G(i,E(`reinit failed; restored your committed files (deleted gitignored files, except .env*, are gone).`),()=>{e(i),console.log(`Fetching the latest ZeroStarter ...`),B(i),console.log(`Rebranding ...`),u(i,{name:a}),console.log(`Installing dependencies ...`),K(i),P(i),q(i,`ci(reinit): re-baseline as ${a}`)}),console.log(`\n${T(`✓`)} ${a} re-scaffolded; .git history, remote, and .env* files are intact.`),console.log(`Next steps:`),F(i)||(console.log(` ${w(`set POSTGRES_URL in .env`)} # your Postgres connection string`),console.log(` ${w(`bun run db:migrate`)}`)),console.log(` ${w(`bun run dev`)}`),console.log(` ${w(`git push`)} # to your existing remote`)},pe=async e=>{let{positionals:t,values:n}=v({allowPositionals:!0,args:e,options:{help:{short:`h`,type:`boolean`}}});if(n.help){console.log(`Usage:
39
+ -h, --help Display help`);return}await J(!!r.yes);let i=g(n[0]??`.`),a=p(i),o=w()&&!r.yes;if(G(i,`No git repository in ${i}. reinit re-scaffolds an existing repo; use init for a new project.`,`Working tree has uncommitted changes. Commit or stash them first; reinit deletes every tracked file.`),o&&!await A(O(`Delete every file in ${i} (keeping .git and .env*) and re-scaffold as ${a}?`),!1)){console.log(`Aborted.`);return}console.log(),console.log(`Removing all files (keeping .git and your .env* files) ...`),await K(i,O(`reinit failed; restored your committed files (deleted gitignored files, except .env*, are gone).`),()=>{e(i),console.log(`Fetching the latest ZeroStarter ...`),W(i),console.log(`Rebranding ...`),u(i,{name:a}),console.log(`Installing dependencies ...`),console.log(),H(i),z(i),q(i,`ci(reinit): re-baseline as ${a}`)}),console.log(`\n${D(`✓`)} ${a} re-scaffolded; .git history, remote, and .env* files are intact.`),console.log(`Next steps:`),B(i)||console.log(` ${E(`set POSTGRES_URL in .env`)} # your Postgres connection string`),console.log(` ${E(`bun run db:migrate`)}`),console.log(` ${E(`bun run dev`)}`),console.log(` ${E(`git push`)} # to your existing remote`)},We=async e=>{let{positionals:t,values:n}=b({allowPositionals:!0,args:e,options:{help:{short:`h`,type:`boolean`}}});if(n.help){console.log(`Usage:
34
40
  $ bunx zerostarter sync [dir] [options]
35
41
 
36
42
  Re-baseline an existing fork (default .) on the latest ZeroStarter: a gitpick overlay
@@ -39,7 +45,7 @@ identity, and favicon are preserved. Requires a clean tree; lands as a reviewabl
39
45
  you commit yourself.
40
46
 
41
47
  Options:
42
- -h, --help Display help`);return}z();let u=m(t[0]??`.`);W(u,`No git repository in ${u}. Run sync inside an existing fork.`,`Working tree has uncommitted changes. Commit or stash them first so the sync lands as a reviewable diff.`);let f=p(u,`package.json`),h=new Map(l(u).map(e=>[e,a(e)])),g=i(await ce());g.length===0&&console.log(E(`Warning: no PRESERVE_ON_SYNC directive found; fork-owned files may be overwritten.`)),console.log(),console.log(`Overlaying the latest ZeroStarter (content, public/marketing, and site.ts preserved) ...`),await G(u,E(`Sync failed; rolled the working tree back to your last commit.`),()=>{B(u),o(u),d(p(u,`.gitpickignore`));for(let[e,t]of h)s(e)&&r(e,c(t,a(e),e===f));H(u,g)}),console.log(`Installing dependencies ...`),K(u),console.log(),console.log(w(`Synced to the latest ZeroStarter.`)),console.log(`Starter files were updated (edits to them were overwritten); files you added and your`),console.log(`content, public/marketing, and branding were preserved.`),console.log(E(`Review the diff and commit: git -C ${u} status`))},{author:X,name:Z,version:Q}=ee,$=`Version:
48
+ -h, --help Display help`);return}await J();let u=g(t[0]??`.`);G(u,`No git repository in ${u}. Run sync inside an existing fork.`,`Working tree has uncommitted changes. Commit or stash them first so the sync lands as a reviewable diff.`);let f=h(u,`package.json`),p=new Map(l(u).map(e=>[e,a(e)])),m=i(await je());m.length===0&&console.log(O(`Warning: no PRESERVE_ON_SYNC directive found; fork-owned files may be overwritten.`)),console.log(),console.log(`Overlaying the latest ZeroStarter (content, public/marketing, and site.ts preserved) ...`),await K(u,O(`Sync failed; rolled the working tree back to your last commit.`),()=>{W(u),o(u),d(h(u,`.gitpickignore`));for(let[e,t]of p)s(e)&&r(e,c(t,a(e),e===f));Ne(u,m)}),console.log(`Installing dependencies ...`),console.log(),H(u),console.log(),console.log(E(`Synced to the latest ZeroStarter.`)),console.log(`Starter files were updated (edits to them were overwritten); files you added and your`),console.log(`content, public/marketing, and branding were preserved.`),console.log(O(`Review the diff and commit: git -C ${u} status`))},{author:X,name:Z,version:Q}=le,$=`Version:
43
49
  ${Z}@${Q}
44
50
 
45
51
  Go from zero to a production-ready SaaS, rebranded and ready to ship.
@@ -58,4 +64,4 @@ Options:
58
64
  -h, --help Display help
59
65
 
60
66
  Author:
61
- ${X.name} <${X.email}> (${S(X.url)})`;(async()=>{try{let e=process.argv.slice(2),t=e[0],n=e.slice(1);switch(t){case`init`:return await de(n);case`reinit`:return await fe(n);case`sync`:return await pe(n);case void 0:case`-h`:case`--help`:console.log($);return;case`-v`:case`--version`:console.log(`${Z}@${Q}`);return;default:console.error(D(`Unknown command: ${t}\n`)),console.log($),process.exit(1)}}catch(e){console.error(D(e instanceof Error?e.message:String(e))),process.exit(1)}})();export{};
67
+ ${X.name} <${X.email}> (${ue(X.url)})`;(async()=>{try{let e=process.argv.slice(2),t=e[0],n=e.slice(1);switch(t){case`init`:return await He(n);case`reinit`:return await Ue(n);case`sync`:return await We(n);case void 0:case`-h`:case`--help`:console.log($);return;case`-v`:case`--version`:console.log(`${Z}@${Q}`);return;default:console.error(k(`Unknown command: ${t}\n`)),console.log($),process.exit(1)}}catch(e){console.error(k(e instanceof Error?e.message:String(e))),process.exit(1)}})();export{};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zerostarter",
3
- "version": "0.0.18",
3
+ "version": "0.0.19-canary.0",
4
4
  "description": "Go from zero to a production-ready SaaS, rebranded and ready to ship.",
5
5
  "keywords": [
6
6
  "cli",