everyapp 0.1.8 → 0.2.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 (46) hide show
  1. package/bin/__everyapp_bash_complete.js +12 -0
  2. package/bin/everyapp.js +12 -0
  3. package/dist/bash-complete.js +1 -1
  4. package/dist/{chunk-APTBZ2LQ.js → chunk-7EBQPYFG.js} +1 -1
  5. package/dist/chunk-BIXKPCDH.js +2 -0
  6. package/dist/chunk-CEOIDQLQ.js +13 -0
  7. package/dist/chunk-DHWAR5AE.js +1 -0
  8. package/dist/chunk-F3HDGVHB.js +7 -0
  9. package/dist/chunk-FX3COD5Z.js +8 -0
  10. package/dist/chunk-H4JYEFV2.js +9 -0
  11. package/dist/chunk-KZH54DDZ.js +4 -0
  12. package/dist/chunk-L3RGZX6J.js +6 -0
  13. package/dist/chunk-MTESAO7S.js +8 -0
  14. package/dist/chunk-RUQ6WEWY.js +47 -0
  15. package/dist/chunk-SUM3EFB4.js +39 -0
  16. package/dist/chunk-UGQQTUTQ.js +1 -0
  17. package/dist/chunk-VEYSNPDH.js +3 -0
  18. package/dist/chunk-WO3NE7ZU.js +7 -0
  19. package/dist/chunk-YJ2DKIZS.js +1 -0
  20. package/dist/create-GG6PN3HY.js +22 -0
  21. package/dist/deploy-7OPEPS4F.js +55 -0
  22. package/dist/deploy-SERRD75Z.js +7 -0
  23. package/dist/dev-FLIUBC52.js +0 -0
  24. package/dist/generateConfig-46Z3ERF3.js +1 -0
  25. package/dist/index.js +1 -1
  26. package/dist/login-5YTO7Z67.js +1 -0
  27. package/dist/logout-ZOK6ABBB.js +1 -0
  28. package/dist/{remoteD1Shell-6YR7TPHZ.js → remoteD1Shell-ZNASWJ4Q.js} +1 -1
  29. package/dist/setupLocal-UDMQQEBD.js +6 -0
  30. package/gateway/every-app-gateway-build.tar.gz +0 -0
  31. package/package.json +26 -15
  32. package/dist/chunk-BEO4F5X6.js +0 -4
  33. package/dist/chunk-BFYVBU6B.js +0 -7
  34. package/dist/chunk-JWYVVDE3.js +0 -48
  35. package/dist/chunk-KIA3P5KV.js +0 -6
  36. package/dist/chunk-OYJHDLMN.js +0 -6
  37. package/dist/chunk-RHADZBGF.js +0 -21
  38. package/dist/chunk-TUDP36IL.js +0 -16
  39. package/dist/chunk-VOYWQ73B.js +0 -1
  40. package/dist/chunk-XKKQYCSJ.js +0 -7
  41. package/dist/chunk-ZR6E5CZN.js +0 -5
  42. package/dist/chunk-ZWRZQCN2.js +0 -1
  43. package/dist/create-MDOGNG7C.js +0 -22
  44. package/dist/deploy-5JWY65YE.js +0 -41
  45. package/dist/deploy-6OHCTGYN.js +0 -7
  46. package/dist/setupLocal-Y7ZUHJBN.js +0 -6
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ // Committed launcher so package managers can link the bin at install time,
3
+ // before dist/ exists (fresh CI checkouts install with --ignore-scripts).
4
+ import("../dist/bash-complete.js").catch((error) => {
5
+ if (error?.code === "ERR_MODULE_NOT_FOUND") {
6
+ console.error(
7
+ "everyapp CLI is not built. In the monorepo, run: pnpm -C packages/cli build",
8
+ );
9
+ process.exit(1);
10
+ }
11
+ throw error;
12
+ });
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ // Committed launcher so package managers can link the bin at install time,
3
+ // before dist/ exists (fresh CI checkouts install with --ignore-scripts).
4
+ import("../dist/index.js").catch((error) => {
5
+ if (error?.code === "ERR_MODULE_NOT_FOUND") {
6
+ console.error(
7
+ "everyapp CLI is not built. In the monorepo, run: pnpm -C packages/cli build",
8
+ );
9
+ process.exit(1);
10
+ }
11
+ throw error;
12
+ });
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import{a as o,b as s}from"./chunk-OYJHDLMN.js";import"./chunk-VOYWQ73B.js";import{proposeCompletions as r}from"@stricli/core";var t=process.argv.slice(3);process.env.COMP_LINE?.endsWith(" ")&&t.push("");await r(s,t,o(process));try{for(let{completion:p}of await r(s,t,o(process)))process.stdout.write(`${p}
2
+ import{a as o,b as s}from"./chunk-MTESAO7S.js";import"./chunk-DHWAR5AE.js";import"./chunk-YJ2DKIZS.js";import{proposeCompletions as r}from"@stricli/core";var t=process.argv.slice(3);process.env.COMP_LINE?.endsWith(" ")&&t.push("");await r(s,t,o(process));try{for(let{completion:p}of await r(s,t,o(process)))process.stdout.write(`${p}
3
3
  `)}catch{}
@@ -1 +1 @@
1
- import{c as n}from"./chunk-VOYWQ73B.js";import a from"chalk";var p="https://registry.npmjs.org/everyapp?fields=dist-tags",f=2e3,i=null;function y(){i||(i=d().then(t=>t&&t!==n&&g(n,t)?{updateAvailable:!0,latestVersion:t,currentVersion:n}:{updateAvailable:!1,currentVersion:n}))}var u=!1;async function m(){if(u||!i)return;u=!0;let t=await i;h(t)}async function V(t){await m(),process.exit(t)}async function d(){try{let t=new AbortController,o=setTimeout(()=>t.abort(),f),e=await fetch(p,{signal:t.signal});return clearTimeout(o),e.ok?(await e.json())["dist-tags"].latest:null}catch{return null}}function g(t,o){let e=t.split(".").map(Number),s=o.split(".").map(Number);for(let r=0;r<Math.max(e.length,s.length);r++){let l=e[r]??0,c=s[r]??0;if(l<c)return!0;if(l>c)return!1}return!1}function h(t){t.updateAvailable&&t.latestVersion&&(console.log(),console.log(a.yellow(` Update available: ${t.currentVersion} \u2192 ${t.latestVersion}`)),console.log(a.dim(` Update: ${a.cyan("npm install -g everyapp@latest")}`)))}export{y as a,m as b,V as c};
1
+ import{c as n}from"./chunk-DHWAR5AE.js";import a from"chalk";var p="https://registry.npmjs.org/everyapp?fields=dist-tags",f=2e3,i=null;function y(){i||(i=d().then(t=>t&&t!==n&&g(n,t)?{updateAvailable:!0,latestVersion:t,currentVersion:n}:{updateAvailable:!1,currentVersion:n}))}var u=!1;async function m(){if(u||!i)return;u=!0;let t=await i;h(t)}async function V(t){await m(),process.exit(t)}async function d(){try{let t=new AbortController,o=setTimeout(()=>t.abort(),f),e=await fetch(p,{signal:t.signal});return clearTimeout(o),e.ok?(await e.json())["dist-tags"].latest:null}catch{return null}}function g(t,o){let e=t.split(".").map(Number),s=o.split(".").map(Number);for(let r=0;r<Math.max(e.length,s.length);r++){let l=e[r]??0,c=s[r]??0;if(l<c)return!0;if(l>c)return!1}return!1}function h(t){t.updateAvailable&&t.latestVersion&&(console.log(),console.log(a.yellow(` Update available: ${t.currentVersion} \u2192 ${t.latestVersion}`)),console.log(a.dim(` Update: ${a.cyan("npm install -g everyapp@latest")}`)))}export{y as a,m as b,V as c};
@@ -0,0 +1,2 @@
1
+ import{b as w,c as y}from"./chunk-VEYSNPDH.js";var h=15e3,c="INTERNAL_APIS_DISABLED",a=class extends Error{status;code;constructor({message:e,status:r,code:o}){super(e),this.name="GatewayApiError",this.status=r,this.code=o}},i=class extends a{constructor(e="OUTDATED_GATEWAY"){super({message:e,status:404}),this.name="OutdatedGatewayError"}},u=class extends a{constructor(e="GATEWAY_INTERNAL_APIS_DISABLED"){super({message:e,status:404,code:c}),this.name="GatewayInternalApisDisabledError"}},p=class extends a{constructor(e,r="GATEWAY_INTERNAL_AUTH"){super({message:r,status:e}),this.name="GatewayAuthError"}};function A(s){return s instanceof i}function f(s){return s instanceof u}function G(s){return s instanceof p}var l=class{gatewayUrl;getAuthToken;constructor({gatewayUrl:e,getAuthToken:r}){this.gatewayUrl=e.replace(/\/+$/,""),this.getAuthToken=r??(()=>y(this.gatewayUrl))}getIdentityKeys(){return this.request("/api/deploy/identity-keys",{method:"GET"})}registerApp(e){return this.request("/api/deploy/register",{method:"POST",body:e})}async hasOwner(){let e=await this.request("/api/admin/has-owner",{method:"GET",auth:!1});if(typeof e.hasOwner!="boolean")throw new a({message:"Gateway returned an invalid owner response",status:200});return e.hasOwner}whoami(){return this.request("/api/deploy/whoami",{method:"GET"})}async request(e,r){let o={"content-type":"application/json"};if(r.auth!==!1){let g=await this.getAuthToken();o.authorization=`Bearer ${g}`}let t=await fetch(`${this.gatewayUrl}${e}`,{method:r.method,signal:AbortSignal.timeout(h),headers:o,body:r.body?JSON.stringify(r.body):void 0}),d=await t.text(),n=null;if(d.trim())try{n=JSON.parse(d)}catch{throw t.ok?new a({message:"Gateway returned an invalid JSON response",status:t.status}):new a({message:`Gateway request failed (${t.status})`,status:t.status})}if(t.status===404)throw n?.code===c?new u:new i;if(!t.ok)throw t.status===401||t.status===403?new p(t.status,[n?.error||"Gateway deploy-token authorization failed.",w(this.gatewayUrl)].join(`
2
+ `)):new a({message:n?.error||`Gateway request failed (${t.status})`,status:t.status,code:n?.code});return n??{}}};export{A as a,f as b,G as c,l as d};
@@ -0,0 +1,13 @@
1
+ import{f as u}from"./chunk-H4JYEFV2.js";import{d}from"./chunk-BIXKPCDH.js";import{c as y,d as f,k as w}from"./chunk-RUQ6WEWY.js";import{c as i}from"./chunk-7EBQPYFG.js";import t from"chalk";var P="every-app-gateway",o=class extends Error{url;cause;constructor(n,a){super(`Could not reach your Gateway at ${n} (${k(a)})`),this.name="GatewayUnreachableError",this.url=n,this.cause=a}};function b(e){return`Could not reach your Gateway at ${e.url} (${k(e.cause)})`}async function R(e){try{return await fetch(e,{method:"HEAD",signal:AbortSignal.timeout(5e3)}),!0}catch(n){let a=n instanceof Error?n.message.toLowerCase():"",r=n instanceof Error&&"cause"in n&&n.cause?.code?.toLowerCase()||"";if(["ssl","tls","certificate","cert","cipher","handshake","secure"].some(s=>a.includes(s)||r.includes(s)))return!1;throw new o(e,n)}}async function G(e){let n=new d({gatewayUrl:e,getAuthToken:async()=>""});try{return await n.hasOwner()}catch(a){throw new o(e,a)}}async function x(){try{let e=await f();return await y(`/accounts/${e}/workers/scripts/${P}/settings`),!0}catch{return!1}}async function h(){return w()}async function U(){if(!await x())return{isDeployed:!1,hasOwner:!1,gatewayUrl:await h()};let n=await h(),a;try{a=await G(n)}catch(r){throw r instanceof o&&(console.log(t.yellow(`
2
+ Gateway unreachable
3
+ `)),console.log(b(r)),console.log(t.dim(` Confirm the gateway URL is correct and reachable, then run this command again.
4
+ `)),await i(1)),r}return{isDeployed:!0,hasOwner:a,gatewayUrl:n}}async function W(){let{isDeployed:e,hasOwner:n,gatewayUrl:a}=await U();if(e||(console.log(t.yellow(`
5
+ Gateway not deployed
6
+ `)),console.log(`You need to deploy the Every App Gateway before creating or deploying apps.
7
+ `),console.log(t.dim(` Run: npx everyapp gateway deploy
8
+ `)),await i(1)),!n){let r=`${a}/sign-up`;console.log(t.yellow(`
9
+ Owner account required
10
+ `)),console.log(`You need to create an owner account on your Gateway before deploying apps.
11
+ `),console.log(` ${t.cyan(r)}
12
+ `),console.log(t.dim(` Visit the URL above to create your owner account, then run this command again.
13
+ `)),await i(1)}return a}function k(e){return e instanceof Error?e.message:String(e)}import E from"node:fs/promises";import c from"node:path";import C from"chalk";import{execa as O}from"execa";async function D(){try{return await O("pnpm",["--version"],{stdio:"pipe"}),!0}catch{return!1}}async function Y({cwd:e,description:n,install:a,verbose:r=!1}){if(a===!1){console.log(C.dim(" Skipping dependency install (manifest install=false)."));return}if(typeof a=="string"){await u(a,[],{cwd:e,verbose:r,description:n,shell:!0});return}let l=await I(e),{command:g,args:s}=await S(l);try{await u(g,s,{cwd:e,verbose:r,description:n})}catch(m){throw new Error(`Failed to install dependencies with ${l}: ${m instanceof Error?m.message:"Unknown error"}`)}}async function I(e){let n=await M(e);return n||(await p(c.join(e,"pnpm-lock.yaml"))?"pnpm":await p(c.join(e,"yarn.lock"))?"yarn":await p(c.join(e,"package-lock.json"))?"npm":"pnpm")}async function M(e){let n=c.join(e,"package.json");try{let r=JSON.parse(await E.readFile(n,"utf-8")).packageManager;return typeof r!="string"?null:r.startsWith("pnpm")?"pnpm":r.startsWith("yarn")?"yarn":r.startsWith("npm")?"npm":null}catch(a){if(a instanceof Error&&"code"in a&&a.code==="ENOENT")return null;throw a}}async function S(e){return e==="yarn"?{command:"yarn",args:["install"]}:e==="npm"?{command:"npm",args:["install"]}:await D()?{command:"pnpm",args:["install"]}:{command:"npx",args:["pnpm","install"]}}async function p(e){try{return await E.access(e),!0}catch(n){if(n instanceof Error&&"code"in n&&n.code==="ENOENT")return!1;throw n}}export{o as a,b,R as c,G as d,W as e,Y as f};
@@ -0,0 +1 @@
1
+ var s="everyapp";var t="Every App CLI - Deploy and manage apps.";var i="0.2.0";export{s as a,t as b,i as c};
@@ -0,0 +1,7 @@
1
+ import{f as r}from"./chunk-CEOIDQLQ.js";import{c as l,f as i}from"./chunk-H4JYEFV2.js";import c from"chalk";import a from"chalk";async function s({targetDir:n,verbose:o=!1}){try{o||console.log(`
2
+ Setting up Cloudflare for local dev...`),await i("pnpm",["run","cf-typegen"],{cwd:n,verbose:o,logCommandToConsole:!1}),await i("pnpm",["run","build"],{cwd:n,verbose:o,logCommandToConsole:!1}),o||console.log(a.dim(` Finished.
3
+ `)),await i("pnpm",["run","db:migrate:local"],{cwd:n,verbose:o}),console.log(`
4
+ Local database migrations complete.
5
+ `)}catch{console.warn(a.yellow(`
6
+ Failed to run local migrations. You can run them manually with:`)),console.warn(a.dim(` pnpm run db:migrate:local
7
+ `))}}async function v({targetDir:n,appId:o,gatewayUrl:e,verbose:t=!1,installDeps:m=!1,migrations:p}){if(m&&await r({cwd:n,description:"Installing dependencies for local development...",verbose:t}),await l({targetDir:n,appId:o,gatewayUrl:e}),p?.engine==="d1-sql"){console.log(c.dim("Skipping local migration scripts for d1-sql app; manage local D1 state with Wrangler migrations."));return}await s({targetDir:n,verbose:t})}export{v as a};
@@ -0,0 +1,8 @@
1
+ import{c as l,d as m,e as f,m as g,n as w,o as y}from"./chunk-RUQ6WEWY.js";import{c as d}from"./chunk-7EBQPYFG.js";import{c as h,d as k}from"./chunk-WO3NE7ZU.js";import I from"enquirer";import p from"chalk";async function x(){if(process.env.CLOUDFLARE_API_TOKEN){let r=process.env.CLOUDFLARE_ACCOUNT_ID;return r?f(r):(console.log(p.yellow(`
2
+ CLOUDFLARE_ACCOUNT_ID is required when using CLOUDFLARE_API_TOKEN
3
+ `)),d(1))}let e=await g(),{account:t,otherAccounts:o}=await y(e);return w(t,o),{id:t.account.id,name:t.account.name}}async function C(e="this",t=!1){let o=await x();if(process.env.CLOUDFLARE_API_TOKEN&&(console.log(p.dim(` ${o.name} (${o.id})`)),console.log()),t)return console.log(p.dim(`Skipping deployment confirmation due to -y flag.
4
+ `)),!0;let{confirm:r}=await I.prompt({type:"confirm",name:"confirm",message:`Do you want to deploy ${e} to ${o.name}?`,initial:!1});return r}function v({domain:e,accountId:t,mode:o,hostname:r}){let n=t?`https://dash.cloudflare.com/${t}/${e}/dns/records`:`https://dash.cloudflare.com -> ${e} -> DNS`,i=r??`todo.${e}`,s=o==="app-blocking"?[`Each app you deploy will live at [app].${e} - this app at`,`${i} - but that address does not resolve yet. To support`,"this, you must add the DNS record below:"]:[`Each app you deploy will live at [app].${e} - for example`,`todo.${e}. To support this, you must add the DNS record`,"below (the login this CLI uses isn't allowed to add it for you):"],a=o==="app-blocking"?["After DNS propagates, re-run everyapp app deploy.","If you know DNS is ready and this check is blocked locally, re-run with --skip-dns-check."]:["Continuing the deploy - once you add that record, apps at",`*.${e} will work properly. You only do this once.`];return["",...s,"",` Add record at: ${n}`," Type: CNAME"," Name: *",` Target: ${e}`," Proxy: ON (orange cloud)","","Here are the docs explaining how this works:"," https://developers.cloudflare.com/workers/configuration/routing/routes/"," https://github.com/cloudflare/workers-sdk/issues/5568","",...a,""].join(`
5
+ `)}import c from"chalk";async function u(e,t){let o=await m();if(t)return{accountId:o,workerName:t};let r=await k(e),n=h(r.id);return{accountId:o,workerName:n}}async function N(e){return await l(`/accounts/${e.accountId}/workers/scripts/${e.workerName}/secrets`)}async function W({cwd:e,workerName:t}){let o=await u(e,t);return(await N(o)).map(n=>n.name)}async function F({secretName:e,cwd:t,workerName:o,verbose:r=!1}){r&&console.log(c.dim(` Checking secret: ${e}`));let n=await u(t,o),s=(await N(n)).some(a=>a.name===e);return s&&r&&console.log(c.dim(` Secret already exists
6
+ `)),s}async function R({secretName:e,secretValue:t,cwd:o,workerName:r,verbose:n=!1,description:i}){n&&i&&console.log(c.dim(` ${i}
7
+ `));let s=await u(o,r);await l(`/accounts/${s.accountId}/workers/scripts/${s.workerName}/secrets`,{method:"PUT",body:JSON.stringify({name:e,text:t,type:"secret_text"})}),n&&console.log(c.green(`Created secret: ${e}
8
+ `))}export{C as a,W as b,F as c,R as d,v as e};
@@ -0,0 +1,9 @@
1
+ import{k as g}from"./chunk-RUQ6WEWY.js";import a from"node:fs/promises";import p from"node:path";import h from"node:os";import y from"chalk";async function C(t,e,o={}){let n=o.exclude||[];await a.mkdir(e,{recursive:!0});let i=await a.readdir(t,{withFileTypes:!0});for(let s of i){let r=p.join(t,s.name),c=p.join(e,s.name);n.some(l=>s.name===l)||(s.isDirectory()?await C(r,c,o):await a.copyFile(r,c))}}async function T(t){try{return(await a.stat(t)).isDirectory()}catch{return!1}}async function D({targetDir:t,appId:e,gatewayUrl:o}){let n=o??await g(),i=`# Vite client-side secrets
2
+ VITE_APP_ID=${e}
3
+ VITE_GATEWAY_URL=${n}
4
+ # Set Cloudflare secrets locally
5
+ GATEWAY_URL=${n}
6
+ `;await Promise.all([a.writeFile(p.join(t,".env.local"),i)])}async function $(t){return await a.mkdtemp(p.join(h.tmpdir(),t))}async function O({tmpDir:t,verbose:e=!1}){try{await a.rm(t,{recursive:!0,force:!0}),e&&console.log(y.dim(` Removed: ${t}`))}catch{console.warn(y.yellow("\u26A0\uFE0F Warning: Failed to clean up temporary directory:"),t)}}import{execa as f}from"execa";import m from"chalk";async function A(t,e,o){let{env:n,cwd:i,verbose:s=!1,description:r,logCommandToConsole:c=!0}=o;return s?v(t,e,o):c?(console.log(`Running: ${w(t,e)}`),r&&console.log(m.dim(` ${r}`)),await f(t,e,{cwd:i,env:n,shell:o.shell,stdio:"pipe"})):await f(t,e,{cwd:i,env:n,shell:o.shell,stdio:"pipe"})}async function v(t,e,{description:o,cwd:n,env:i,shell:s}){console.log(m.dim(` \u250C\u2500 Running: ${w(t,e)}`)),o&&console.log(m.dim(` \u2502 ${o}`));let r=f(t,e,{cwd:n,env:i,shell:s,stdio:void 0,all:!0});r.stdout&&r.stdout.on("data",l=>{l.toString().split(`
7
+ `).forEach(u=>{u.trim()&&console.log(m.dim(` \u2502 ${u}`))})}),r.stderr&&r.stderr.on("data",l=>{l.toString().split(`
8
+ `).forEach(u=>{u.trim()&&console.error(m.dim(` \u2502 ${u}`))})});let c=await r;return console.log(m.dim(` \u2514\u2500 Complete
9
+ `)),c}function w(t,e){return[t,...e].join(" ")}export{C as a,T as b,D as c,$ as d,O as e,A as f};
@@ -0,0 +1,4 @@
1
+ import{c as e}from"./chunk-7EBQPYFG.js";import n from"node:fs/promises";import p from"node:path";import o from"chalk";var i=["everyapp.config.ts"];async function l(){let t=process.cwd();for(let c of i){let r=p.join(t,c);try{await n.access(r);return}catch{}}console.log(o.yellow(`
2
+ Not inside an Every App project`)),console.log(o.dim(` No everyapp.config.ts found
3
+ `)),console.log("To create a new app, run the below command from the directory where you store your projects:"),console.log(o.dim(` npx everyapp app create
4
+ `)),await e(1)}export{l as a};
@@ -0,0 +1,6 @@
1
+ import{b as u,d as w,e as y,f as p}from"./chunk-H4JYEFV2.js";import{b}from"./chunk-UGQQTUTQ.js";import z from"node:fs/promises";import m from"node:path";import l from"chalk";import h from"chalk";function O(n,i){n&&console.log(h.dim(i))}function v(n,...i){n&&i.forEach(r=>console.log(h.dim(r)))}import{execFileSync as j}from"node:child_process";import P from"node:fs/promises";import{createRequire as k}from"node:module";import c from"node:path";async function d(n,i,r){let t=c.resolve(n),e=M();try{let o=await x(t,i),a=JSON.parse(await P.readFile(o,"utf-8")),s=typeof a.bin=="string"?a.bin:a.bin?.[r];if(!s)throw new Error(`Package does not declare the "${r}" binary.`);return{command:e,argsPrefix:[c.resolve(c.dirname(o),s)]}}catch(o){throw new Error(`Could not resolve the project-local "${r}" binary from project root "${t}". Install the project's declared ${i} dependency and try again. (If the install skipped devDependencies, include them; Yarn Plug'n'Play projects are not supported \u2014 use nodeLinker: node-modules.)`,{cause:o})}}function M(){if(!process.versions.bun)return process.execPath;try{return j("node",["--version"],{stdio:"ignore"}),"node"}catch{throw new Error("Every App CLI must run project binaries under Node.js because Wrangler deploys silently no-op under Bun. Install Node.js and ensure `node` is available on PATH.")}}async function x(n,i){let r=n;for(;;){let e=c.join(r,"node_modules",...i.split("/"),"package.json");try{return await P.realpath(e)}catch{}let o=c.dirname(r);if(o===r)break;r=o}return k(c.join(n,"package.json")).resolve(`${i}/package.json`)}var D=["migrate","--config=drizzle-prod.config.ts"],E="drizzle";function R(n,i){let r=i?.binding??n[0];if(!n.includes(r))throw new Error(`Manifest migrations binding "${r}" is not declared in resources.d1.`);return r}async function Q({cwd:n,workerName:i,d1Bindings:r,d1DatabaseIds:t,migrations:e,verbose:o=!1}){if(r.length===0){o&&console.log(l.dim(`No D1 resources declared; skipping migrations.
2
+ `));return}let a=R(r,e),s=t[a];if(!s)throw new Error(`No provisioned D1 database ID found for binding "${a}".`);if(!e||e.engine==="drizzle"){await L({cwd:n,d1DatabaseId:s,verbose:o});return}if(!e.dir)throw new Error('migrations.dir is required when migrations.engine is "d1-sql".');await A({cwd:n,binding:a,databaseName:C(i,a),databaseId:s,migrationsDir:m.resolve(n,e.dir),verbose:o})}async function L({cwd:n,d1DatabaseId:i,verbose:r=!1}){let{command:t,argsPrefix:e}=await d(n,"drizzle-kit","drizzle-kit");console.log(`
3
+ Running: project-local drizzle-kit ${D.join(" ")}`),console.log(l.dim(" Running database migrations...")),v(r," Running any pending migrations against your remote D1 Database..."),await b(t,[...e,...D],{cwd:n,d1DatabaseId:i,verbose:r}),console.log(l.dim(` Migrations completed.
4
+ `))}async function V({cwd:n,d1Bindings:i,migrations:r,configPath:t,verbose:e=!1}){if(i.length===0)return;let o=R(i,r),a=m.resolve(n,r?.dir??E);if(!await u(a))return;if(console.log(l.dim(" Applying local database migrations...")),r?.engine==="d1-sql"){let{command:g,argsPrefix:f}=await d(n,"wrangler","wrangler");await p(g,[...f,"d1","migrations","apply",o,"--local","--persist-to",m.join(n,".wrangler","state"),"-c",t],{cwd:n,verbose:e,logCommandToConsole:!1}),console.log(l.dim(" Local migrations applied."));return}if(!await I(m.join(n,".wrangler","state","v3","d1"))){let g=await d(n,"wrangler","wrangler");await p(g.command,[...g.argsPrefix,"d1","execute",o,"--local","--persist-to",m.join(n,".wrangler","state"),"-c",t,"--command","SELECT 1;"],{cwd:n,verbose:e,logCommandToConsole:!1})}let s=await d(n,"drizzle-kit","drizzle-kit");await p(s.command,[...s.argsPrefix,"migrate"],{cwd:n,verbose:e,logCommandToConsole:!1}),console.log(l.dim(" Local migrations applied."))}async function A({cwd:n,binding:i,databaseName:r,databaseId:t,migrationsDir:e,verbose:o=!1}){let{command:a,argsPrefix:s}=await d(n,"wrangler","wrangler");console.log(`
5
+ Running: project-local wrangler d1 migrations apply ${i} --remote -c <temp-config>`),console.log(l.dim(" Running database migrations..."));let g=await w("everyapp-d1-migrations-"),f=m.join(g,"wrangler.d1-migrations.json");try{await z.writeFile(f,JSON.stringify({d1_databases:[{binding:i,database_name:r,database_id:t,migrations_dir:e}]},null,2),"utf-8"),await p(a,[...s,"d1","migrations","apply",i,"--remote","-c",f],{cwd:n,verbose:o,logCommandToConsole:!1})}finally{await y({tmpDir:g,verbose:o})}console.log(l.dim(` Migrations completed.
6
+ `))}function C(n,i){return i==="DB"?n:`${n}-${i.toLowerCase()}`}async function I(n){try{return(await z.readdir(n,{recursive:!0})).some(r=>r.endsWith(".sqlite"))}catch(i){if(i instanceof Error&&"code"in i&&i.code==="ENOENT")return!1;throw i}}export{O as a,v as b,d as c,Q as d,L as e,V as f};
@@ -0,0 +1,8 @@
1
+ import{a as t,b as a,c as r}from"./chunk-DHWAR5AE.js";import l from"node:fs";import d from"node:os";import m from"node:path";function O(e){return{process:e,os:d,fs:l,path:m}}import{buildApplication as D,buildCommand as p,buildRouteMap as R}from"@stricli/core";import{buildInstallCommand as S,buildUninstallCommand as x}from"@stricli/auto-complete";import{buildCommand as o,buildRouteMap as u}from"@stricli/core";var c=o({loader:async()=>import("./create-GG6PN3HY.js"),parameters:{positional:{kind:"tuple",parameters:[{brief:"App ID (kebab-case format)",parse:String,optional:!0}]},flags:{verbose:{kind:"boolean",brief:"Show detailed output during creation",optional:!0},yes:{kind:"boolean",brief:"Skip deployment confirmation",optional:!0}},aliases:{y:"yes"}},docs:{brief:"Create a new app from the starter template",fullDescription:["Copies the simple-todo starter template, deploys to Cloudflare, and configures local development.","","Usage: every app create [name]","","The command will:"," 1. Prompt for app ID (or use provided name)"," 2. Deploy a private Cloudflare Worker from everyapp.config.ts"," 3. Configure package.json and local .env files"," 4. Install dependencies and run local migrations for the starter app","","After creation, run 'pnpm run dev' to start developing."].join(`
2
+ `)}}),f=o({loader:async()=>{let{deploy:e}=await import("./deploy-SERRD75Z.js");return e},parameters:{positional:{kind:"tuple",parameters:[]},flags:{verbose:{kind:"boolean",brief:"Show detailed output during deployment",optional:!0},yes:{kind:"boolean",brief:"Skip deployment confirmation",optional:!0},"skip-dns-check":{kind:"boolean",brief:"Skip app subdomain DNS preflight check",optional:!0},domain:{kind:"parsed",parse:String,brief:"Not for this command; configure the gateway domain instead",optional:!0,hidden:!0}},aliases:{y:"yes"}},docs:{brief:"Deploy an app to Cloudflare",fullDescription:["Deploys the current app as a private Cloudflare Worker from everyapp.config.ts.","The deployment process:"," 1. Loads and validates everyapp.config.ts"," 2. Verifies the app subdomain can resolve through Cloudflare DNS"," 3. Creates or links declared D1 databases and KV namespaces"," 4. Generates .everyapp/wrangler.json"," 5. Installs dependencies using the manifest install setting or package-manager auto-detection"," 6. Runs the configured database migration strategy against production D1"," 7. Runs the configured build, deploys, registers with the gateway, and ensures the service binding"].join(`
3
+ `)}}),g=o({loader:async()=>{let{generateConfig:e}=await import("./generateConfig-46Z3ERF3.js");return e},parameters:{positional:{kind:"tuple",parameters:[]},flags:{verbose:{kind:"boolean",brief:"Show generated config details",optional:!0}}},docs:{brief:"Generate .everyapp/wrangler.json from everyapp.config.ts",fullDescription:["Loads everyapp.config.ts, validates it, and writes the generated Wrangler config consumed by Vite and Wrangler.","","Run this before invoking vite directly."].join(`
4
+ `)}}),y=o({loader:async()=>{let{setupLocal:e}=await import("./setupLocal-UDMQQEBD.js");return e},parameters:{positional:{kind:"tuple",parameters:[]},flags:{verbose:{kind:"boolean",brief:"Show detailed output during local setup",optional:!0}}},docs:{brief:"Set up local development in an existing app",fullDescription:["Configures local development for an existing Every App project in the current directory.","","Usage: every app setup-local","","The command will:"," 1. Verify the current directory is an Every App project"," 2. Verify Cloudflare and gateway setup"," 3. Install dependencies using package-manager auto-detection"," 4. Create or refresh .env.local"," 5. Run local setup scripts for template-style apps","","This is useful after cloning an existing Every App repository."].join(`
5
+ `)}}),h=o({loader:async()=>{let{remoteD1Shell:e}=await import("./remoteD1Shell-ZNASWJ4Q.js");return e},parameters:{flags:{},positional:{kind:"array",parameter:{brief:"Command and arguments to run with environment variables",parse:String}}},docs:{brief:"Run a command with Cloudflare D1 connection environment variables",fullDescription:["Sets environment variables needed to connect to remote Cloudflare D1 and runs any command that requires D1 access.","","The command will:"," 1. Get the Cloudflare account ID"," 2. Look up the database ID from the generated Wrangler database name"," 3. Get a valid OAuth token"," 4. Run the provided command with CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_DATABASE_ID, CLOUDFLARE_API_TOKEN, and MIGRATE_REMOTE set","","Common use cases:"," - Running Drizzle migrations: npx everyapp app remote-d1-shell -- npx drizzle-kit migrate"," - Opening Drizzle Studio: npx everyapp app remote-d1-shell -- npx drizzle-kit studio"," - Pushing schema changes: npx everyapp app remote-d1-shell -- npx drizzle-kit push","","This command is useful for any operation that needs direct access to your production D1 database."].join(`
6
+ `)}}),n=u({routes:{create:c,deploy:f,"generate-config":g,"setup-local":y,"remote-d1-shell":h},docs:{brief:"App management commands"}});import{buildCommand as b,buildRouteMap as v}from"@stricli/core";var w=b({loader:async()=>{let{deploy:e}=await import("./deploy-7OPEPS4F.js");return e},parameters:{positional:{kind:"tuple",parameters:[]},flags:{verbose:{kind:"boolean",brief:"Show detailed output during deployment",optional:!0},localGateway:{kind:"parsed",parse:String,brief:"Path to local gateway tarball (for testing)",optional:!0},domain:{kind:"parsed",parse:String,brief:"Custom apex domain for the gateway and app subdomains",optional:!0},yes:{kind:"boolean",brief:"Skip deployment confirmation",optional:!0}},aliases:{y:"yes"}},docs:{brief:"Deploy the gateway application to Cloudflare",fullDescription:["Downloads the gateway release, links Cloudflare resources, reconstructs app service bindings, and deploys to Cloudflare Workers.","The deployment process:"," 1. Downloads the gateway release to a temporary directory"," 2. Creates or links gateway D1/KV resources"," 3. Reconstructs service bindings from the registry"," 4. Optionally configures custom-domain routes with --domain"," 5. Runs wrangler deploy"," 6. Runs database migrations against production D1"," 7. Cleans up temporary files"].join(`
7
+ `)}}),i=v({routes:{deploy:w},docs:{brief:"Gateway management commands"}});import{buildCommand as C}from"@stricli/core";import{numberParser as k}from"@stricli/core";var s=C({loader:async()=>import("./dev-FLIUBC52.js"),parameters:{flags:{port:{kind:"parsed",parse:k,brief:"Gateway port (defaults to $PORT, then 8787)",optional:!0},mode:{kind:"parsed",parse:String,brief:"stub (seeded dev user, default) | mirror (real login via local gateway)",optional:!0},gateway:{kind:"parsed",parse:String,brief:"mirror mode: URL of the separately-run local gateway (default http://localhost:3000)",optional:!0},baseHost:{kind:"parsed",parse:String,brief:"mirror mode: two-label base host for cookie scope (default everyapp.localhost)",optional:!0},"skip-migrations":{kind:"boolean",brief:"Start without applying local database migrations",optional:!0}}},docs:{brief:"Run the app behind a local gateway with the real perimeter",fullDescription:["Runs the app's configured dev server on an internal port and a gateway-lite","in front of it on $PORT (default 8787) \u2014 the REAL perimeter: public-route","policy, header strip/inject, a real RS256 identity JWT, and a seeded dev","user. Open http://<app-id>.localhost:8787 \u2014 the first Host label selects","the app, so portless per-worktree hosts work with no configuration.","","--mode stub (default): seeded dev user, zero setup.","--mode mirror: authenticate against a SEPARATELY-running local gateway"," (run `pnpm dev` in apps/every-app-gateway first). Real login/launcher"," are forwarded to it. Requires a two-label base host (e.g."," everyapp.localhost) so the session cookie crosses the subdomain"," boundary; the CLI prints setup guidance if the host is unusable."," Also settable via EVERYAPP_DEV_MODE; the flag wins."].join(`
8
+ `)}});var A=p({loader:async()=>{let{login:e}=await import("./login-5YTO7Z67.js");return e},parameters:{positional:{kind:"tuple",parameters:[]},flags:{}},docs:{brief:"Store a gateway deploy token"}}),E=p({loader:async()=>{let{logout:e}=await import("./logout-ZOK6ABBB.js");return e},parameters:{positional:{kind:"tuple",parameters:[]},flags:{}},docs:{brief:"Remove a stored gateway deploy token"}}),L=R({routes:{app:n,dev:s,gateway:i,login:A,logout:E,install:S("everyapp",{bash:"__everyapp_bash_complete"}),uninstall:x("everyapp",{bash:!0})},docs:{brief:a,hideRoute:{install:!0,uninstall:!0}}}),Y=D(L,{name:t,versionInfo:{currentVersion:r},scanner:{allowArgumentEscapeSequence:!0}});export{O as a,Y as b};
@@ -0,0 +1,47 @@
1
+ import{c as y}from"./chunk-7EBQPYFG.js";import R from"node:fs/promises";import g from"node:path";import v from"node:os";import*as A from"smol-toml";import c from"chalk";var d=class extends Error{status;codes;endpoint;constructor({message:t,status:n,codes:r,endpoint:o}){super(t),this.name="CloudflareAPIError",this.status=n,this.codes=r,this.endpoint=o}};function C(e){return e instanceof d&&(e.status===401||e.status===403||e.codes.includes(1e4))}function x(){let e=v.homedir(),t=v.platform(),n;return t==="win32"?n=g.join(process.env.LOCALAPPDATA||g.join(e,"AppData","Local"),".wrangler"):t==="darwin"?n=g.join(e,"Library","Preferences",".wrangler"):n=g.join(e,".wrangler"),g.join(n,"config","default.toml")}async function B(){let e=x();try{let t=await R.readFile(e,"utf-8"),n=A.parse(t);if(!n.oauth_token||!n.refresh_token)throw new Error("OAuth tokens not found in wrangler config");return n}catch(t){throw t.code==="ENOENT"?new Error("Wrangler config not found. Please run 'npx wrangler login' first."):t}}async function F(e){let t=x(),n=g.dirname(t);await R.mkdir(n,{recursive:!0});let r=A.stringify(e);await R.writeFile(t,r,"utf-8")}function M(e){let t=new Date(e).getTime(),n=Date.now(),r=1*60*1e3;return t-n<r}async function W(e){let t=await fetch("https://dash.cloudflare.com/oauth2/token",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"refresh_token",refresh_token:e,client_id:"54d11594-84e4-41aa-b438-e81b8fa78ee7"})});if(!t.ok)throw new Error(`Failed to refresh OAuth token: ${t.status} ${t.statusText}`);let n=await t.json();return{oauth_token:n.access_token,expiration_time:new Date(Date.now()+n.expires_in*1e3).toISOString(),refresh_token:n.refresh_token||e,scopes:n.scope?n.scope.split(" "):[]}}async function q(e={}){let{showNewUserHelp:t=!1}=e,n=!!process.env.CLOUDFLARE_API_TOKEN,r=!!process.env.CLOUDFLARE_ACCOUNT_ID;if(n&&!r&&(console.log(c.yellow(`
2
+ Missing CLOUDFLARE_ACCOUNT_ID
3
+ `)),console.log(`When using CLOUDFLARE_API_TOKEN, you must also set CLOUDFLARE_ACCOUNT_ID.
4
+ `),console.log(c.dim(` export CLOUDFLARE_ACCOUNT_ID=<your_account_id>
5
+ `)),await y(1)),!(n&&r))try{await I()}catch{console.log(t?c.yellow(`
6
+ Already have a Cloudflare account?
7
+ `):c.yellow(`
8
+ Please log in to Cloudflare.
9
+ `)),console.log(c.dim(" 1. Cloudflare CLI (recommended): npx wrangler login")),console.log(c.dim(` 2. Environment variables: CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID
10
+ `)),t&&(console.log(c.yellow(`Don't have a Cloudflare account?
11
+ `)),console.log("Every App uses Cloudflare so that you can inexpensively host your applications"),console.log("on a secure and powerful platform without needing to think about the machines"),console.log(`your code runs on.
12
+ `),console.log(`Here are the steps to get started:
13
+ `),console.log(c.dim(" 1. Create a Cloudflare account (free, no credit card required):")),console.log(c.cyan(` https://dash.cloudflare.com/sign-up
14
+ `)),console.log(c.dim(` - Skip any Cloudflare onboarding like configuring a domain, this is unnecessary for Every App.
15
+ `)),console.log(c.dim(` 2. Check your email to verify your email address
16
+ `)),console.log(c.dim(" 3. Log in to Cloudflare via the CLI:")),console.log(c.cyan(` npx wrangler login
17
+ `)),console.log(c.dim(" - Learn more: ")+c.cyan(`https://developers.cloudflare.com/workers/wrangler/commands/#login
18
+ `))),await y(1)}}async function I(){let e=process.env.CLOUDFLARE_API_TOKEN;if(e)return e;let t=await B();if(M(t.expiration_time)){let n=await W(t.refresh_token);return await F(n),n.oauth_token}return t.oauth_token}async function i(e,t={}){let n=await I(),r=typeof FormData<"u"&&t.body instanceof FormData,o=await fetch(`https://api.cloudflare.com/client/v4${e}`,{...t,headers:{Authorization:`Bearer ${n}`,...r?{}:{"Content-Type":"application/json"},...t.headers}}),a;try{a=await o.json()}catch(l){throw o.ok?l:new d({message:`Cloudflare API request failed: ${o.status} ${o.statusText||"Invalid JSON response"}`,status:o.status,codes:[],endpoint:e})}let s=Array.isArray(a.errors)?a.errors:[],m=s.map(l=>l.code).filter(l=>typeof l=="number");if(!o.ok){let l=s.length?s.map(w=>`[${w.code}] ${w.message}`).join(", "):o.statusText;throw new d({message:`Cloudflare API request failed: ${o.status} ${l}`,status:o.status,codes:m,endpoint:e})}if(!a.success){let l=s.map(w=>`[${w.code}] ${w.message}`).join(", ");throw new d({message:`Cloudflare API error: ${l}`,status:o.status,codes:m,endpoint:e})}return a.result}async function u(){let e=process.env.CLOUDFLARE_ACCOUNT_ID;if(e)return e;let t=await i("/accounts");if(!t||t.length===0)throw new Error("No Cloudflare accounts found");let n=t[0];if(!n)throw new Error("No Cloudflare accounts found");return n.id}async function V(e){let t=await i(`/accounts/${e}`);if(!t||!t.id)throw new Error(`Account ${e} not found`);return t}async function E(e){try{let t=await i(`/accounts/${e}/workers/subdomain`);if(!t||!t.subdomain)throw new Error("No workers.dev subdomain found for this account");return t.subdomain}catch(t){throw new Error(`Failed to get workers.dev subdomain: ${t instanceof Error?t.message:"Unknown error"}`)}}async function P(e,t){let n=t||await u(),r=await E(n);return`https://${e}.${r}.workers.dev`}var O="every-app-gateway";async function K(e){let t=e||await u();try{let o=(await i(`/accounts/${t}/workers/domains?service=${encodeURIComponent(O)}&per_page=100`)).filter(a=>a.service===O&&typeof a.hostname=="string"&&a.hostname.length>0).map(a=>a.hostname).sort((a,s)=>a.length-s.length||a.localeCompare(s))[0];if(o)return`https://${o}`}catch(n){if(!C(n))throw n}return P(O,t)}import b from"chalk";var T={EMAIL_NOT_VERIFIED:10034,R2_NOT_ENABLED:10042},G={[T.EMAIL_NOT_VERIFIED]:{userMessage:"Almost there! Your Cloudflare account email needs to be verified first.",action:`To verify your email address:
19
+
20
+ 1. Check your inbox for a verification email from Cloudflare
21
+ 2. Click the verification link in the email
22
+ 3. Or visit ${b.cyan("https://dash.cloudflare.com/profile")} to resend the verification email
23
+
24
+ Then run this command again.`},[T.R2_NOT_ENABLED]:{userMessage:"R2 not enabled",action:`R2 is Cloudflare's file storage service, used for storing images and files.
25
+
26
+ ${b.cyan("https://dash.cloudflare.com/{accountId}/r2/plans")}
27
+
28
+ ${b.dim(" Visit the URL above to enable R2, then run this command again.")}`}};function z(e){let t=e.match(/\[code:\s*(\d+)\]/);if(t?.[1])return parseInt(t[1],10);let n=e.match(/"code"\s*:\s*(\d+)/);if(n?.[1])return parseInt(n[1],10);let r=e.match(/\[(\d{5})\]/);if(r?.[1])return parseInt(r[1],10)}function $(e){let t=G[e];if(t)return{code:e,...t}}function j(e){let t="";return e instanceof Error?(t=e.message,"stdout"in e&&typeof e.stdout=="string"&&(t+=`
29
+ `+e.stdout),"stderr"in e&&typeof e.stderr=="string"&&(t+=`
30
+ `+e.stderr),"all"in e&&typeof e.all=="string"&&(t+=`
31
+ `+e.all)):typeof e=="string"&&(t=e),t}async function H(e,t){let n=e.action,r=t.accountId;if(!r&&n.includes("{accountId}"))try{r=await u()}catch{}return r&&(n=n.replace(/{accountId}/g,r)),`
32
+ ${b.yellow(e.userMessage)}
33
+
34
+ ${n}
35
+ `}async function J(e,t={}){let n=j(e),r=e instanceof d?e.codes.find(s=>$(s)):z(n);if(r===void 0)return;let o=$(r);return o?{formatted:await H(o,t),code:r}:void 0}import f from"chalk";import Z from"enquirer";async function Y(e,t){try{let n=t?{subdomain:t}:{},r=await i(`/accounts/${e}/workers/subdomain`,{method:"PUT",body:JSON.stringify(n)});if(!r||!r.subdomain)throw new Error("Failed to initialize workers.dev subdomain");return r.subdomain}catch(n){throw new Error(`Failed to initialize workers.dev subdomain: ${n instanceof Error?n.message:"Unknown error"}`)}}async function Q(){return(await Z.prompt({type:"input",name:"subdomain",message:" Choose a subdomain name:",validate:t=>!t||t.trim()===""?"Subdomain cannot be empty":/^[a-z0-9-]+$/.test(t)?t.startsWith("-")||t.endsWith("-")?"Subdomain cannot start or end with a hyphen":!0:"Subdomain must contain only lowercase letters, numbers, and hyphens"})).subdomain.trim()}async function X(){let e=await u();try{return await E(e)}catch{console.log(),console.log(f.yellow(` Please claim a Cloudflare subdomain.
36
+ `)),console.log(f.dim(` All your apps will be deployed to this domain.
37
+ `)),console.log(f.dim(" You can make it your name or a something fun.")),console.log(f.dim(` E.g. All apps will be deployed to "janedoe.workers.dev"
38
+ `));let t=await Q();console.log(f.dim(`
39
+ Creating subdomain: ${t}...
40
+ `));try{let n=await Y(e,t);return console.log(f.green(` Successfully created subdomain: ${f.cyan(n)}
41
+ `)),n}catch(n){throw console.error(f.red(`
42
+ Failed to create subdomain`),f.dim(`
43
+ ${n instanceof Error?n.message:"Unknown error"}`)),n}}}import{z as p}from"zod";var ee=p.object({uuid:p.string(),name:p.string(),created_at:p.string().optional(),version:p.string().optional()}),S=p.array(ee);async function k(e){let t=await i(`/accounts/${e}/d1/database?per_page=1000`);return S.parse(t)}async function te(e,t){let n=await i(`/accounts/${t}/d1/database`,{method:"POST",body:JSON.stringify({name:e})});if(!n||!n.uuid)throw new Error("Failed to create D1 database: no UUID returned");return n.uuid}async function ne(e,t){let r=(await k(t)).find(a=>a.name===e);return r?{id:r.uuid,name:e,wasCreated:!1}:{id:await te(e,t),name:e,wasCreated:!0}}var N="every-app-gateway",re="every-app-gateway",D="APP__";async function L(e){let t=e??await u(),r=(await k(t)).find(s=>s.name===re);if(!r)return[];let o;try{o=await ce(t,r.uuid)}catch(s){let m=s instanceof Error?s.message:String(s);if(s instanceof d&&(m.includes("no such table")||m.includes("no such column")||m.includes("D1_ERROR")))return[];throw s}let a=o.map(s=>s.worker_name).filter(s=>typeof s=="string"&&s.length>0);return[...new Set(a)].sort().map(s=>({binding:`${D}${s}`,service:s}))}async function oe(e){let t=e??await u(),r=(await se(t)).flatMap(s=>(ie(s),s.type==="service"&&s.name.startsWith(D)?[]:[{type:"inherit",name:s.name}])),o=await L(t),a=[...r,...o.map(s=>({type:"service",name:s.binding,service:s.service}))];return await ae(t,a),o}async function se(e){return(await i(`/accounts/${e}/workers/scripts/${N}/settings`)).bindings??[]}async function ae(e,t){let n=new FormData;n.set("settings",JSON.stringify({bindings:t})),await i(`/accounts/${e}/workers/scripts/${N}/settings`,{method:"PATCH",body:n})}function ie(e){if(e.name.startsWith(D)&&e.type!=="service")throw new Error(`Gateway binding "${e.name}" uses the reserved ${D} namespace but is not a service binding.`)}async function ce(e,t){let n=await i(`/accounts/${e}/d1/database/${t}/query`,{method:"POST",body:JSON.stringify({sql:"SELECT worker_name FROM apps WHERE status = 'active' AND worker_name IS NOT NULL AND hostname IS NOT NULL"})}),r=Array.isArray(n)?n[0]:n;return r?.results??r?.result??[]}import ue from"chalk";async function de({accountId:e,domain:t}){let r=(await i(`/zones?name=${encodeURIComponent(t)}&account.id=${encodeURIComponent(e)}&per_page=50`)).find(o=>o.name===t);if(!r)throw new Error(`Cloudflare zone "${t}" was not found on the authenticated account. Add the zone to this account or pass a different --domain.`);return r}async function le({zoneId:e,domain:t}){let n=`*.${t}`;try{return(await i(`/zones/${e}/dns_records?name=${encodeURIComponent(n)}&per_page=100`)).find(a=>a.name===n&&["A","AAAA","CNAME"].includes(a.type)&&a.proxied===!0)?"exists":(await i(`/zones/${e}/dns_records`,{method:"POST",body:JSON.stringify({type:"CNAME",name:"*",content:t,proxied:!0,ttl:1})}),"created")}catch(r){if(C(r))return await U(`everyapp-wildcard-check.${t}`)?"exists":"unauthorized";throw r}}async function U(e){let t=new URL("https://cloudflare-dns.com/dns-query");t.searchParams.set("name",e),t.searchParams.set("type","A");try{let n=await fetch(t,{headers:{accept:"application/dns-json"}});if(!n.ok)throw new Error(`Cloudflare DoH returned HTTP ${n.status}`);let r=await n.json();return r.Status===0&&Array.isArray(r.Answer)&&r.Answer.length>0}catch(n){return console.log(ue.dim(` Could not verify DNS through Cloudflare DoH (${n instanceof Error?n.message:String(n)}).`)),!1}}async function fe(e){return(await i(`/accounts/${e}/storage/kv/namespaces?per_page=1000`)).map(n=>({id:n.id,title:n.title}))}async function me(e,t){let n=await i(`/accounts/${t}/storage/kv/namespaces`,{method:"POST",body:JSON.stringify({title:e})});if(!n||!n.id)throw new Error("Failed to create KV namespace: no ID returned");return n.id}async function ge(e,t){let r=(await fe(t)).find(a=>a.title===e);return r?{id:r.id,name:e,wasCreated:!1}:{id:await me(e,t),name:e,wasCreated:!0}}async function pe(e){return(await i(`/accounts/${e}/r2/buckets?per_page=1000`)).buckets.map(n=>({name:n.name,creation_date:n.creation_date}))}async function he(e,t){let n=await i(`/accounts/${t}/r2/buckets`,{method:"POST",body:JSON.stringify({name:e})});if(!n||!n.name)throw new Error("Failed to create R2 bucket: no name returned");return n.name}async function we(e,t){return(await pe(t)).find(o=>o.name===e)?{name:e,wasCreated:!1}:(await he(e,t),{name:e,wasCreated:!0})}import h from"chalk";async function ye(){return await i("/memberships")}function _(e){return e.status==="pending"?" (pending)":""}function Ae(e,t){let n=_(e);console.log(h.dim(` ${e.account.name} (${e.account.id})${n}`)),t.length>0&&(console.log(),console.log(h.dim(" Other accounts (set CLOUDFLARE_ACCOUNT_ID to switch):")),t.forEach(r=>{let o=_(r);console.log(h.dim(` - ${r.account.name}: ${r.account.id}${o}`))})),console.log()}async function Ce(e){return console.log(h.yellow(`Multiple Cloudflare accounts found.
44
+ `)),console.log(`Please set the CLOUDFLARE_ACCOUNT_ID environment variable:
45
+ `),e.forEach(t=>{let n=_(t);console.log(h.dim(` ${t.account.name}: ${t.account.id}${n}`))}),console.log(h.dim(`
46
+ export CLOUDFLARE_ACCOUNT_ID=<account_id>
47
+ `)),y(1)}async function be(e){if(e.length===0)throw new Error("No Cloudflare accounts found");let t=process.env.CLOUDFLARE_ACCOUNT_ID;!t&&e.length>1&&await Ce(e);let n=t?e.find(o=>o.account.id===t):e[0];if(!n)throw new Error(`Account ${t} not found in your Cloudflare memberships`);let r=e.filter(o=>o.account.id!==n.account.id);return{account:n,otherAccounts:r}}export{q as a,I as b,i as c,u as d,V as e,P as f,k as g,ne as h,ge as i,we as j,K as k,J as l,ye as m,Ae as n,be as o,X as p,L as q,oe as r,de as s,le as t,U as u};
@@ -0,0 +1,39 @@
1
+ import{c as I,d as k,e as F}from"./chunk-FX3COD5Z.js";import{c as L,d as j}from"./chunk-L3RGZX6J.js";import{f as O}from"./chunk-CEOIDQLQ.js";import{f as v}from"./chunk-H4JYEFV2.js";import{a as W,b as B,c as U,d as w}from"./chunk-BIXKPCDH.js";import{d as h,h as S,i as $,j as _,k as x,l as A,r as V,u as T}from"./chunk-RUQ6WEWY.js";import{c as d}from"./chunk-7EBQPYFG.js";import{c as Y,d as K,e as E,f as z}from"./chunk-WO3NE7ZU.js";import u from"chalk";import p from"chalk";async function M({appId:e,d1Bindings:o=["DB"],kvBindings:t=["KV"],needsR2Bucket:n=!1,verbose:i=!1}){let a=[o.length>0?"D1 Database":null,t.length>0?"KV Store":null,n?"R2 Bucket":null].filter(Boolean);a.length>0&&console.log(`
2
+ Setting up your Cloudflare ${a.join(", ")}...
3
+ `);let s=await h(),l=E(e),r;n&&(r=await ce(l,s,i));let g={};for(let c of o){let y=E(e,c);g[c]=await se(y,s,i)}let m={};for(let c of t){let y=E(e,c);m[c]=await le(y,s,i)}return{d1DatabaseId:g.DB,kvNamespaceId:m.KV,d1DatabaseIds:g,kvNamespaceIds:m,r2BucketName:r,resourceName:l}}async function se(e,o,t){t&&(console.log(p.bold(`Processing D1 database...
4
+ `)),console.log(` Checking D1 database: ${e}`));let n=await S(e,o);return t?n.wasCreated?console.log(p.green(` Created D1 database: ${e} (${n.id})
5
+ `)):console.log(p.dim(` Linking to existing D1 database: ${e} (${n.id})
6
+ `)):n.wasCreated?console.log(p.green(" D1 successfully created.")):console.log(" D1 already set up."),n.id}async function le(e,o,t){t&&(console.log(p.bold(`Processing KV namespace...
7
+ `)),console.log(` Checking KV namespace: ${e}`));let n=await $(e,o);return t?n.wasCreated?console.log(p.green(` Created KV namespace: ${e} (${n.id})
8
+ `)):console.log(p.dim(` Linking to existing KV namespace: ${e} (${n.id})
9
+ `)):n.wasCreated?console.log(p.green(" KV successfully created.")):console.log(" KV already set up."),n.id}async function ce(e,o,t){t&&(console.log(p.bold(`Processing R2 bucket...
10
+ `)),console.log(` Checking R2 bucket: ${e}`));let n;try{n=await _(e,o)}catch(i){let a=await A(i,{accountId:o});throw a&&(console.log(a.formatted),await d(1)),i}return t?n.wasCreated?console.log(p.green(` Created R2 bucket: ${e}
11
+ `)):console.log(p.dim(` Linking to existing R2 bucket: ${e}
12
+ `)):n.wasCreated?console.log(p.green(" R2 successfully created.")):console.log(" R2 already set up."),n.name}import D from"chalk";import R from"node:fs/promises";import b from"node:path";import{parse as ge}from"jsonc-parser";async function J({cwd:e,buildCommand:o,gatewayUrl:t,appId:n,generatedWranglerConfigPath:i,verbose:a}){let s={...process.env,VITE_GATEWAY_URL:t,VITE_APP_ID:n,EVERYAPP_GATEWAY_URL:t,EVERYAPP_APP_ID:n};try{await fe(e),o?await v(o,[],{cwd:e,description:`Building your application...
13
+ `,env:s,shell:!0,verbose:a}):await ue(e)?await v("npx",["vite","build"],{cwd:e,description:`Building your application...
14
+ `,env:s,verbose:a}):a&&console.log(D.dim("No Vite config found; deploying generated worker config."));let l=await pe({cwd:e,generatedWranglerConfigPath:i,verbose:a}),{command:r,argsPrefix:g}=await L(e,"wrangler","wrangler");await v(r,[...g,"deploy","-c",l],{cwd:e,description:`Deploying your private application worker to Cloudflare...
15
+
16
+ This could take up to a minute.`,env:s,verbose:a})}catch(l){let r=await A(l);throw r&&(console.log(r.formatted),await d(1)),console.error(D.red(`
17
+ Failed to build or deploy`)),l}}async function pe({cwd:e,generatedWranglerConfigPath:o,verbose:t}){let n=b.join(e,"dist","server","wrangler.json");return await q(n)?(await de(n,o),t&&console.log(D.dim(`Using Vite-built deploy config: ${b.relative(e,n)}`)),n):(t&&console.log(D.dim("No Vite-built wrangler config found; using generated wrangler config.")),o)}async function de(e,o){let t=await H(e),n=await H(o);delete t.configPath,delete t.userConfigPath,delete t.routes,delete t.route;let i=n.name;if(typeof i!="string"||i.length===0)throw new Error(`Generated config ${o} has no worker name; aborting deploy.`);let a=n.vars;for(let l of["EVERYAPP_IDENTITY_PUBLIC_KEYS","EVERYAPP_IDENTITY_ISSUER"]){let r=a?.[l];if(typeof r!="string"||r.length===0)throw new Error(`Generated config ${o} is missing ${l}; aborting deploy.`)}t.name=i,"topLevelName"in t&&(t.topLevelName=i),t.workers_dev=!1,t.preview_urls=!1,t.vars={...t.vars,...a};let s=n.services;if(Array.isArray(s)&&s.length>0){let l=new Set(s.map(g=>g.binding)),r=Array.isArray(t.services)?t.services:[];t.services=[...r.filter(g=>!l.has(g.binding)),...s]}await R.writeFile(e,JSON.stringify(t,null,2)+`
18
+ `,"utf-8")}async function H(e){let o=await R.readFile(e,"utf-8"),t=[],n=ge(o,t,{allowTrailingComma:!0});if(t.length>0||n===void 0)throw new Error(`Failed to parse ${e} as JSONC.`);return n}async function fe(e){await R.rm(b.join(e,"dist","server","wrangler.json"),{force:!0})}async function q(e){try{return await R.access(e),!0}catch(o){if(o instanceof Error&&"code"in o&&o.code==="ENOENT")return!1;throw o}}async function ue(e){let o=["vite.config.ts","vite.config.mts","vite.config.js","vite.config.mjs","vite.config.cjs","vite.config.cts"];return(await Promise.all(o.map(n=>q(b.join(e,n))))).some(Boolean)}import f from"chalk";async function Q(e){return new w({gatewayUrl:e}).getIdentityKeys()}async function X(e){try{let t=await new w({gatewayUrl:e}).whoami();return t.capabilities?.appGateway===!0?{organizationId:t.organizationId,gatewayBinding:{organizationId:t.organizationId}}:(console.log(f.yellow("Upgrade your gateway to enable the AI proxy binding: npx everyapp gateway deploy")),{organizationId:t.organizationId})}catch(o){throw await ee(o),o}}async function Z(e){let{appId:o,workerName:t,manifest:n,gatewayUrl:i,verbose:a=!1,appName:s,appDescription:l}=e;try{console.log(""),a&&console.log("Registering app with gateway control plane...");let r=new w({gatewayUrl:i}),g=s||o,m=l||o,c=await r.registerApp({appId:o,name:g,description:m,workerName:t,manifest:n});return a&&(console.log(f.dim(` Gateway app: ${c.appSlug} (${c.existingApp?"updated":"created"})`)),console.log(f.dim(` Default access: ${c.defaultAccess?"enabled":"disabled"}`)),console.log(f.dim(` Access granted to ${c.grantedUserCount} users
19
+ `))),{hostname:c.hostname}}catch(r){throw await ee(r),r}}async function ee(e){W(e)&&(console.log(f.yellow(`
20
+ Gateway out of date
21
+ `)),console.log(f.dim(" Run: `npx everyapp gateway deploy` to update.\n")),await d(1)),U(e)&&(console.log(f.yellow(`
22
+ Gateway authorization failed
23
+ `)),console.log(f.dim(`${e.message}
24
+ `)),await d(1)),B(e)&&(console.log(f.yellow(`
25
+ Gateway internal APIs are disabled
26
+ `)),console.log(f.dim(` This gateway is running in hosted mode (or has invalid deployment mode config), so /api/deploy/* is intentionally unavailable.
27
+ `)),await d(1)),console.error(f.red(`
28
+ Failed to register app with gateway`),e instanceof Error?`
29
+ ${e.message}
30
+ `:"")}var te="GATEWAY_URL",ne="EVERY_APP_ORG_ID";async function oe({gatewayUrl:e,appPath:o,workerName:t,verbose:n=!1}){n&&console.log("Configuring Secrets...");try{if(await I({secretName:te,cwd:o,workerName:t,verbose:n})||await k({secretName:te,secretValue:e,cwd:o,workerName:t,verbose:n,description:`Setting GATEWAY_URL to: ${e}`}),!await I({secretName:ne,cwd:o,workerName:t,verbose:n})){let l=await new w({gatewayUrl:e}).whoami();await k({secretName:ne,secretValue:l.organizationId,cwd:o,workerName:t,verbose:n,description:`Setting EVERY_APP_ORG_ID to: ${l.organizationId}`})}n&&console.log(`Secret setup complete!
31
+ `)}catch(i){throw console.error(`
32
+ Failed to setup secrets`,i instanceof Error?`
33
+ ${i.message}`:""),i}}async function qe(e){let{cwd:o,verbose:t}=e,n=e.manifest??await K(o),i=n.id,a=Y(i),s=n.resources?.d1??[],l=n.resources?.kv??[],r=await x(),g=await X(r),{organizationId:m}=g,c=await Q(r),y=c.issuer??"",C=me(i,c.issuer);C&&await we({...C,skipDnsCheck:e.skipDnsCheck??!1});let{d1DatabaseIds:P,kvNamespaceIds:ie}=await M({appId:i,d1Bindings:s,kvBindings:l,verbose:t});console.log(),await O({cwd:o,description:"Installing dependencies for Cloudflare deployment...",install:n.install,verbose:t}),s.length>0?await j({cwd:o,workerName:a,d1Bindings:s,d1DatabaseIds:P,migrations:n.migrations,verbose:t}):t&&console.log(u.dim(`No D1 resources declared; skipping migrations.
34
+ `));let{configPath:ae}=await z(o,{manifest:n,d1DatabaseIds:P,kvNamespaceIds:ie,identityPublicKeys:c.keys,vars:{EVERYAPP_IDENTITY_ISSUER:y},gatewayBinding:g.gatewayBinding});await J({cwd:o,buildCommand:n.build,gatewayUrl:r,appId:i,generatedWranglerConfigPath:ae,verbose:t});let{hostname:G}=await Z({appId:i,workerName:a,manifest:n,gatewayUrl:r,verbose:t,appName:n.name,appDescription:n.description});await oe({gatewayUrl:r,appPath:o,workerName:a,verbose:t});let re=await h(),N=await V(re);return t&&console.log(u.dim(` Reconciled ${N.length} gateway app service binding${N.length===1?"":"s"}`)),{liveUrl:`https://${G}`,gatewayUrl:r,organizationId:m,hostname:G}}function me(e,o){if(!o)return null;let t=new URL(o).hostname;return{hostname:`${e}.${t}`,apex:t,issuerHost:t,isWorkersDev:t.endsWith(".workers.dev")}}async function we({hostname:e,apex:o,issuerHost:t,isWorkersDev:n,skipDnsCheck:i}){if(n&&(console.log(u.red(`
35
+ Gateway custom domain required
36
+ `)),console.log([` The gateway is currently configured at ${u.cyan(t)}.`," App subdomains cannot work on workers.dev domains.","",` Run ${u.cyan("everyapp gateway deploy --domain <apex-domain>")} first, then deploy the app again.`,""].join(`
37
+ `)),await d(1)),i||await T(e))return;console.log(u.red(`
38
+ App subdomain DNS is not ready
39
+ `));let a=await h().catch(()=>null);console.log(u.yellow(F({domain:o,accountId:a,mode:"app-blocking",hostname:u.cyan(e)}))),await d(1)}export{qe as a};
@@ -0,0 +1 @@
1
+ import{b as i,d,g as D}from"./chunk-RUQ6WEWY.js";import{f}from"./chunk-WO3NE7ZU.js";import{execa as A}from"execa";async function E(s){let{config:t}=await f(s);if(!t.d1_databases||t.d1_databases.length===0)throw new Error("No D1 databases found in everyapp.config.ts. Please add a D1 resource declaration.");let a=t.d1_databases[0];if(!a)throw new Error("No D1 database configuration found.");let e=a.database_name;if(!e)throw new Error("No database_name found in generated D1 database configuration.");let[n,r]=await Promise.all([d(),i()]),o=(await D(n)).find(u=>u.name===e);if(!o)throw new Error(`Database "${e}" not found in your Cloudflare account. Have you run deployment to create the database?`);return{CLOUDFLARE_ACCOUNT_ID:n,CLOUDFLARE_DATABASE_ID:o.uuid,CLOUDFLARE_API_TOKEN:r}}async function O(s,t,a){let{cwd:e,env:n={},verbose:r=!1}=a,c=a.d1DatabaseId?{CLOUDFLARE_ACCOUNT_ID:await d(),CLOUDFLARE_DATABASE_ID:a.d1DatabaseId,CLOUDFLARE_API_TOKEN:await i()}:await E(e),o={cwd:e,stdio:r?"inherit":"pipe",env:{...process.env,...n,...c}};await A(s,t,o)}export{E as a,O as b};
@@ -0,0 +1,3 @@
1
+ import r from"node:fs/promises";import d from"node:os";import l from"node:path";var n=class extends Error{gatewayUrl;constructor(e){super(y(e)),this.name="GatewayCredentialMissingError",this.gatewayUrl=e}};function i(t){let e=new URL(t);return e.pathname=e.pathname.replace(/\/+$/,""),e.search="",e.hash="",e.toString().replace(/\/+$/,"")}function o(t){return new URL(i(t)).host.toLowerCase()}function c(){return l.join(d.homedir(),".everyapp","credentials.json")}function y(t){let e=i(t);return[`No deploy token is configured for ${e}.`,`Open ${e}/admin/tokens, create a Deploy Token, then run:`," everyapp login"].join(`
2
+ `)}async function s(){let t=c();try{let e=await r.readFile(t,"utf-8"),a=JSON.parse(e);return{gateways:a.gateways&&typeof a.gateways=="object"?a.gateways:{}}}catch(e){if(e.code==="ENOENT")return{gateways:{}};throw e}}async function w(t){let e=c();await r.mkdir(l.dirname(e),{recursive:!0}),await r.writeFile(e,`${JSON.stringify(t,null,2)}
3
+ `,{encoding:"utf-8",mode:384}),await r.chmod(e,384)}async function g(t){return(await s()).gateways[o(t)]??null}async function m(t){let e=await g(t);if(!e?.token)throw new n(t);return e.token}async function h(t){let e=i(t.gatewayUrl),a=await s();a.gateways[o(e)]={...t,gatewayUrl:e},await w(a)}async function C(t){let e=await s(),a=o(t);return e.gateways[a]?(delete e.gateways[a],await w(e),!0):!1}export{i as a,y as b,m as c,h as d,C as e};
@@ -0,0 +1,7 @@
1
+ import{z as t}from"zod";var b=t.object({path:t.string(),methods:t.array(t.string()).optional()}),v=t.object({d1:t.array(t.string()).optional(),kv:t.array(t.string()).optional(),durableObjects:t.array(t.object({name:t.string(),className:t.string()})).optional()}).passthrough(),A=t.string().regex(/^\d{4}-\d{2}-\d{2}$/,"must be YYYY-MM-DD"),x=t.string().regex(/^[a-z0-9][a-z0-9:_-]{0,63}$/,"invalid scope id"),w=t.record(x,t.string().min(1).max(200)).superRefine((e,r)=>{for(let i of Object.keys(e))(i==="*"||i.startsWith("provider:"))&&r.addIssue({code:t.ZodIssueCode.custom,path:[i],message:"reserved scope id"})}),S=w,I=t.object({engine:t.enum(["drizzle","d1-sql"]),dir:t.string().optional(),binding:t.string().min(1).optional()}).strict().superRefine((e,r)=>{if(e.engine==="d1-sql"&&!e.dir?.trim()){r.addIssue({code:t.ZodIssueCode.custom,path:["dir"],message:'dir is required when migrations.engine is "d1-sql"'});return}e.dir&&!k(e.dir)&&r.addIssue({code:t.ZodIssueCode.custom,path:["dir"],message:"dir must be a relative path without .. segments"})}),R=t.union([t.literal(!1),t.string().min(1)]),M=t.string().regex(/^[a-z][a-z0-9-]*$/,"provider must start with a lowercase letter and contain only lowercase letters, digits, and hyphens"),N=t.array(M).refine(e=>new Set(e).size===e.length,"duplicate provider"),$=t.object({id:t.string().min(1).regex(/^[a-z]([a-z0-9-]*[a-z0-9])?$/,"id must be kebab-case (lowercase, digits, hyphens)"),name:t.string().min(1).optional(),description:t.string().optional(),main:t.string().optional(),compatibilityDate:A.optional(),resources:v.optional(),public:t.array(b).optional(),providers:N.optional(),scopes:w.optional(),build:t.string().min(1).optional(),dev:t.string().min(1).optional(),devPort:t.number().int().positive().optional(),install:R.optional(),migrations:I.optional()}).passthrough(),C=b.strict(),j=v.extend({durableObjects:t.array(t.object({name:t.string(),className:t.string()}).strict()).optional()}).strict(),z=$.extend({resources:j.optional(),public:t.array(C).optional(),scopes:S.optional()}).strict(),l="/__everyapp",a=class extends Error{constructor(r){super(r),this.name="ManifestError"}};function E(e){let r=z.safeParse(e);if(!r.success)throw new a(`Invalid everyapp.config: ${r.error.issues.map(n=>`${n.path.join(".")||"(root)"}: ${n.message}`).join("; ")}`);let i=r.data;for(let n of i.public??[])W(n.path);return i}function f(e){return e.startsWith("every-")?e:`every-${e}`}function W(e){if(!e.startsWith("/"))throw new a(`Public route path must be absolute (start with "/"): ${JSON.stringify(e)}`);if(e==="/*"||e==="/**"||e==="*"||e==="/")throw new a(`Public route "${e}" exposes the entire app. A catch-all public route is not allowed.`);if(e.includes("%"))throw new a(`Public route "${e}" must not contain percent-encoding; declare the decoded path.`);if(e.includes("\\"))throw new a(`Public route "${e}" must not contain backslashes.`);let r=e.split("/");if(r.some(n=>n==="."||n===".."))throw new a(`Public route "${e}" must not contain "." or ".." segments.`);for(let n of r)if(n.startsWith(":")&&!/^:[A-Za-z_][A-Za-z0-9_]*$/.test(n))throw new a(`Public route "${e}" has an invalid named segment "${n}".`);let i="/"+(r[1]??"");if(e===l||e.startsWith(l+"/")||i===l)throw new a(`Public route "${e}" targets the reserved ${l} namespace, which can never be public.`)}function k(e){return!e.trim()||e.startsWith("/")||/^[A-Za-z]:[\\/]/.test(e)?!1:!e.split(/[\\/]+/).some(r=>r==="..")}import g from"node:fs/promises";import p from"node:path";import{pathToFileURL as D}from"node:url";import{createJiti as G}from"jiti";var u=".everyapp",O="wrangler.json",T="src/entry.worker.ts",Y="2026-06-01",F=["nodejs_compat"],L="generated from everyapp.config.ts \u2014 do not edit";async function B(e){let r=p.join(e,"everyapp.config.ts");try{await g.access(r)}catch(s){throw s instanceof Error&&"code"in s&&s.code==="ENOENT"?new a("No everyapp.config.ts found in the current directory \u2014 run this command from an app root."):s}let n=await G(D(r).href).import(r,{default:!0});return V(n)}function V(e){return E(e)}function _(e,r){let i=f(e);return!r||r==="DB"||r==="KV"?i:`${i}-${r.toLowerCase()}`}function q(e,r={}){let i=P(e.main??T),n=K(i)?i:p.posix.join("..",i),s={$schema:"../node_modules/wrangler/config-schema.json",name:f(e.id),main:n,compatibility_date:e.compatibilityDate??Y,compatibility_flags:[...F],workers_dev:!1,preview_urls:!1,observability:{enabled:!0}};e.devPort&&(s.dev={port:e.devPort});let c={...r.vars,EVERYAPP_APP_ID:e.id};if(r.identityPublicKeys&&(c.EVERYAPP_IDENTITY_PUBLIC_KEYS=JSON.stringify(r.identityPublicKeys)),s.vars=c,r.gatewayBinding){let o=r.gatewayBinding.organizationId.trim();if(!o)throw new Error("Cannot generate EVERY_APP_GATEWAY binding without an organization id.");s.services=[{binding:"EVERY_APP_GATEWAY",service:"every-app-gateway",entrypoint:"AppGateway",props:{organizationId:o,appId:e.id,workerName:f(e.id)}}]}let y=e.resources?.d1??[];if(y.length>0){let o=P(e.migrations?.dir??"drizzle");s.d1_databases=y.map(d=>({binding:d,database_name:_(e.id,d),database_id:r.d1DatabaseIds?.[d]??_(e.id,d),migrations_dir:p.posix.join("..",o)}))}let h=e.resources?.kv??[];h.length>0&&(s.kv_namespaces=h.map(o=>({binding:o,...r.kvNamespaceIds?.[o]?{id:r.kvNamespaceIds[o]}:{}})));let m=e.resources?.durableObjects??[];return m.length>0&&(s.durable_objects={bindings:m.map(o=>({name:o.name,class_name:o.className}))},s.migrations=[{tag:"v1",new_sqlite_classes:m.map(o=>o.className)}]),s}function K(e){return!e.startsWith(".")&&!e.startsWith("/")&&!e.startsWith("src/")&&!/\.[cm]?[jt]sx?$/.test(e)}async function se(e,r={}){let i=r.manifest??await B(e),n=q(i,r),s=p.join(e,u,O);return await g.mkdir(p.dirname(s),{recursive:!0}),await g.writeFile(s,Z(n),"utf-8"),await J(e),{manifest:i,config:n,configPath:s}}function Z(e){return`// ${L}
2
+ ${JSON.stringify(e,null,2)}
3
+ `}async function J(e){let r=p.join(e,".gitignore"),i="";try{i=await g.readFile(r,"utf-8")}catch(c){if(!(c instanceof Error&&"code"in c&&c.code==="ENOENT"))throw c}let n=i.split(/\r?\n/).map(c=>c.trim());if(n.includes(u)||n.includes(`${u}/`))return;let s=i.length>0?i.endsWith(`
4
+ `)?"":`
5
+ `:"";await g.writeFile(r,`${i}${s}# every app generated config
6
+ ${u}/
7
+ `,"utf-8")}function P(e){return e.split(p.sep).join(p.posix.sep)}export{l as a,a as b,f as c,B as d,_ as e,se as f};
@@ -0,0 +1 @@
1
+ var d=Object.defineProperty;var e=(b,a,c)=>a in b?d(b,a,{enumerable:!0,configurable:!0,writable:!0,value:c}):b[a]=c;var f=(b,a,c)=>(e(b,typeof a!="symbol"?a+"":a,c),c);export{f as a};
@@ -0,0 +1,22 @@
1
+ import{a as x}from"./chunk-SUM3EFB4.js";import{a as C}from"./chunk-F3HDGVHB.js";import{a as P}from"./chunk-FX3COD5Z.js";import"./chunk-L3RGZX6J.js";import{e as k}from"./chunk-CEOIDQLQ.js";import{a as w,b as h,d as v,e as b,f as c}from"./chunk-H4JYEFV2.js";import"./chunk-BIXKPCDH.js";import"./chunk-VEYSNPDH.js";import"./chunk-UGQQTUTQ.js";import{a as u}from"./chunk-RUQ6WEWY.js";import{c as l}from"./chunk-7EBQPYFG.js";import"./chunk-DHWAR5AE.js";import"./chunk-WO3NE7ZU.js";import"./chunk-YJ2DKIZS.js";import g from"chalk";async function E({url:e,targetDir:o,verbose:t=!1}){try{await c("git",["clone",e,o],{verbose:t,logCommandToConsole:!1})}catch(r){throw new Error(`Failed to clone repository from ${e}: ${r instanceof Error?r.message:"Unknown error"}`)}}async function I({targetDir:e,verbose:o=!1}){try{await c("git",["init"],{verbose:o,logCommandToConsole:!1,cwd:e}),await c("git",["add","."],{verbose:o,logCommandToConsole:!1,cwd:e}),await c("git",["commit","-m","Starter template"],{verbose:o,logCommandToConsole:!1,cwd:e})}catch(t){throw new Error(`Failed to initialize git repository: ${t instanceof Error?t.message:"Unknown error"}`)}}import J from"node:fs/promises";import L from"node:path";import f from"chalk";var _=["everyapp.config.ts"];async function T(){let e=process.cwd();for(let o of _){let t=L.join(e,o);try{await J.access(t),console.log(f.yellow(`
2
+ Already inside an Every App project`)),console.log(f.dim(` Found ${o}
3
+ `)),console.log(`To create a new app, run app create from the directory where you store your projects.
4
+ `),console.log("If you meant to deploy this app, run:"),console.log(f.dim(` npx everyapp app deploy
5
+ `)),await l(1)}catch{}}}import D from"chalk";import{execa as q}from"execa";async function $(){try{await q("pnpm",["--version"],{stdio:"pipe"})}catch{console.error(D.red(`
6
+ Error: pnpm is required but not installed. Please install it first:`)),console.error(D.cyan(` npm i -g pnpm
7
+ `)),await l(1)}}import z from"enquirer";function W(e){return!e||e.trim().length===0?"App ID cannot be empty":e.length>64?"App ID must be 64 characters or less":/^[a-z]([a-z0-9-]*[a-z0-9])?$/.test(e)?!0:"App ID must be in kebab-case format (lowercase letters, numbers, and hyphens only, starting with a letter)"}async function R(e){console.log(`Project Configuration
8
+ `);let o=await z.prompt({type:"input",name:"appId",message:"Enter your app ID (kebab-case format)",initial:e,validate:W});return console.log(),{appId:o.appId}}import A from"node:path";import G from"chalk";var M="https://github.com/every-app/every-app.git",V="templates/simple-todo";async function O({appId:e,verbose:o=!1}){o&&console.log(`Cloning template repository...
9
+ `);let t=await v("every-app-create-");await E({url:M,targetDir:t,verbose:o}),o&&console.log(`Extracting template...
10
+ `);let r=A.join(t,V),n=A.join(process.cwd(),e);if(await h(n))throw new Error(`Directory "${e}" already exists in the current location`);return await w(r,n,{exclude:["node_modules",".git","pnpm-lock.yaml","package-lock.json",".env.local",".env.production",".dev.vars","manual-steps.md"]}),o&&console.log(G.dim(` Template copied to ${n}
11
+ `)),{tempDir:t,targetDir:n}}import m from"node:fs/promises";import N from"node:path";async function U({targetDir:e,appId:o}){let t=N.join(e,"package.json"),r=JSON.parse(await m.readFile(t,"utf-8"));r.name=o;for(let n of["dependencies","devDependencies"]){let d=r[n];if(d){for(let[s,a]of Object.entries(d))if(!(typeof a!="string"||!a.startsWith("workspace:")))throw new Error(`Template dependency "${s}" uses an unresolvable workspace spec ("${a}"). Pin it to a published version in the template.`)}}await m.writeFile(t,JSON.stringify(r,null,2)+`
12
+ `,"utf-8")}async function F({targetDir:e,appId:o}){let t=N.join(e,"everyapp.config.ts");try{let r=await m.readFile(t,"utf-8"),n=r.replace(/(\bid\s*:\s*)["'][^"']+["']/,`$1"${o}"`);if(n===r)throw new Error("Could not find an id field in everyapp.config.ts");await m.writeFile(t,n,"utf-8")}catch(r){throw r instanceof Error&&"code"in r&&r.code==="ENOENT"?new Error("Starter template does not include everyapp.config.ts, which is required for deployments."):r}}import i from"chalk";function j({appId:e,targetDir:o,gatewayUrl:t,liveUrl:r}){console.log(i.green(`Project created and deployed successfully!
13
+ `)),console.log(i.dim(` Location: ${o}`)),console.log(i.dim(` App URL: ${i.cyan(r)}`)),console.log(i.dim(` Gateway: ${i.cyan(t)}`)),console.log(i.dim(" Routed through the gateway service binding.")),console.log(),console.log(`For local development:
14
+ `),console.log(i.dim(` ${i.bold(`cd ${e}`)}`)),console.log(i.dim(` ${i.bold("pnpm run dev")}`)),console.log(i.dim(` ${i.bold(`
15
+ Then, open the local dev URL printed by everyapp dev.`)}`)),console.log(),console.log(`To deploy updates after changes:
16
+ `),console.log(i.dim(` ${i.bold("npx everyapp app deploy")}`)),console.log()}async function Re(e,o){let t=e.verbose||!1,r=e.yes||!1;await T(),await $(),await u(),await k(),console.log(`
17
+ Create a new Every App project
18
+ `);let{appId:n}=await R(o);if(console.log(g.dim(`.
19
+ `)),!await P("this app",r)){console.log(g.yellow(`
20
+ App creation cancelled.
21
+ `));return}let s=null;try{let{tempDir:a,targetDir:p}=await O({appId:n,verbose:t});s=a,await U({targetDir:p,appId:n}),await F({targetDir:p,appId:n});let{liveUrl:S,gatewayUrl:y}=await x({cwd:p,verbose:t});await C({targetDir:p,appId:n,verbose:t,gatewayUrl:y}),await I({targetDir:p,verbose:t}),j({appId:n,targetDir:p,gatewayUrl:y,liveUrl:S})}catch(a){throw console.error(g.red(`
22
+ Failed to create project:`),a instanceof Error?a.message:"Unknown error"),a}finally{s&&await b({tmpDir:s})}}export{Re as default};
@@ -0,0 +1,55 @@
1
+ import{a as J,b as Z,d as h,e as Q}from"./chunk-FX3COD5Z.js";import{a as S,b as A,c as z,e as q}from"./chunk-L3RGZX6J.js";import{a as C,b as v,c as T,d as D,f as H}from"./chunk-CEOIDQLQ.js";import{d as Y,e as F,f as M}from"./chunk-H4JYEFV2.js";import"./chunk-BIXKPCDH.js";import"./chunk-VEYSNPDH.js";import"./chunk-UGQQTUTQ.js";import{a as G,d as L,f as $,h as P,i as N,l as O,p as K,q as j,s as B,t as V}from"./chunk-RUQ6WEWY.js";import{c as R}from"./chunk-7EBQPYFG.js";import"./chunk-DHWAR5AE.js";import"./chunk-WO3NE7ZU.js";import"./chunk-YJ2DKIZS.js";import g from"chalk";import Te from"node:path";import _ from"chalk";var de="every-app-gateway",ge={KV:"every-app-gateway",OAUTH_KV:"every-app-gateway-OAUTH_KV"};async function X({verbose:e=!1}={}){console.log(`
2
+ Setting up your Cloudflare D1 Database and KV Store...
3
+ `);let a=await L(),o=await fe(de,a,e),t={};for(let[n,i]of Object.entries(ge))t[n]=await me(i,a,e);return console.log(),{d1DatabaseId:o,kvNamespaceIds:t,accountId:a}}async function fe(e,a,o){o&&console.log(` Checking D1 database: ${e}`);let t=await P(e,a);return o?t.wasCreated?console.log(_.green(` Created D1 database: ${e} (${t.id})
4
+ `)):console.log(_.dim(` Linking to existing D1 database: ${e} (${t.id})
5
+ `)):t.wasCreated?console.log(_.green(` D1 successfully created.
6
+ `)):console.log(" D1 already set up."),t.id}async function me(e,a,o){o&&console.log(` Checking KV namespace: ${e}`);let t=await N(e,a);return o?t.wasCreated?console.log(_.green(` Created KV namespace: ${e} (${t.id})
7
+ `)):console.log(_.dim(` Linking to existing KV namespace: ${e} (${t.id})
8
+ `)):t.wasCreated?console.log(_.green(" KV successfully created.")):console.log(" KV already set up."),t.id}import be from"node:crypto";import Ee from"node:path";import te from"node:crypto";import k from"chalk";import we from"node:path";import x from"node:fs/promises";import pe from"node:path";import*as d from"jsonc-parser";import ue from"chalk";async function ee(e){e.verbose&&console.log("Updating Wrangler config with resource IDs and configuration...");let a=e.configPath;(await x.stat(a)).isDirectory()&&(a=pe.join(a,"wrangler.jsonc"));let t=await x.readFile(a,"utf-8"),n=d.parse(t),i=[];if(n.d1_databases){if(n.d1_databases.length===0)throw new Error("No D1 databases found in Wrangler config. The gateway must have exactly one D1 database.");if(n.d1_databases.length>1)throw new Error(`Found ${n.d1_databases.length} D1 databases in Wrangler config. The gateway must have exactly one D1 database.`)}if(e.kvNamespaceIds){let l=new Map;for(let c of n.kv_namespaces??[])l.set(c.binding,(l.get(c.binding)??0)+1);for(let[c,p]of l){if(p>1)throw new Error(`Found ${p} KV namespaces bound to "${c}" in Wrangler config. Each KV binding must be declared exactly once.`);if(!Object.hasOwn(e.kvNamespaceIds,c))throw new Error(`Wrangler config declares KV binding "${c}", but the CLI did not provision it. Update gateway resource provisioning to include this binding before deploying.`)}for(let c of Object.keys(e.kvNamespaceIds))if(!l.has(c))throw new Error(`The CLI provisioned KV binding "${c}", but Wrangler config does not declare it. Update the gateway config and resource provisioning so the bindings match.`)}if(n.r2_buckets&&n.r2_buckets.length>1)throw new Error(`Found ${n.r2_buckets.length} R2 buckets in Wrangler config. The gateway must have at most one R2 bucket.`);if(e.name&&i.push(...d.modify(t,["name"],e.name,{})),e.d1DatabaseId&&i.push(...d.modify(t,["d1_databases",0,"database_id"],e.d1DatabaseId,{})),e.d1DatabaseName&&i.push(...d.modify(t,["d1_databases",0,"database_name"],e.d1DatabaseName,{})),e.kvNamespaceIds)for(let[l,c]of Object.entries(e.kvNamespaceIds)){let p=n.kv_namespaces?.findIndex(w=>w.binding===l)??-1;p>=0&&i.push(...d.modify(t,["kv_namespaces",p,"id"],c,{}))}if(e.r2BucketName&&n.r2_buckets?.length&&i.push(...d.modify(t,["r2_buckets",0,"bucket_name"],e.r2BucketName,{})),e.vars)for(let[l,c]of Object.entries(e.vars))i.push(...d.modify(t,["vars",l],c,{}));e.routes&&i.push(...d.modify(t,["routes"],e.routes,{})),typeof e.workersDev=="boolean"&&i.push(...d.modify(t,["workers_dev"],e.workersDev,{})),e.services&&i.push(...d.modify(t,["services"],e.services,{}));let r=d.applyEdits(t,i),f=r.indexOf("CLI_PATCHES_");if(f!==-1){let l=r.slice(f).match(/^CLI_PATCHES_[A-Za-z0-9_]*/)?.[0]??"CLI_PATCHES_";throw new Error(`Wrangler config still contains unresolved placeholder "${l}" after CLI patching.`)}await x.writeFile(a,r),e.verbose&&console.log(ue.dim(` Wrangler config updated successfully
9
+ `))}async function W(e){let a=await x.readFile(e,"utf-8"),o=d.parse(a);if(!o.name||typeof o.name!="string")throw new Error("Worker name not found in Wrangler config");return o.name}function ye(){return te.randomBytes(32).toString("base64")}function he(){let{privateKey:e,publicKey:a}=te.generateKeyPairSync("rsa",{modulusLength:2048,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return{privateKey:e,publicKey:a}}async function ae({gatewayUrl:e,forceGatewayUrl:a=!1,cloudflareAccountId:o,gatewayPath:t,verbose:n=!1}){let i=await W(we.join(t,"wrangler.jsonc"));try{let r=new Set(await Z({cwd:t,workerName:i})),f=r.has("GATEWAY_URL"),l=r.has("CLOUDFLARE_ACCOUNT_ID"),c=r.has("GATEWAY_DEPLOYMENT_MODE"),p=r.has("BETTER_AUTH_SECRET"),w=r.has("JWT_PRIVATE_KEY"),s=r.has("JWT_PUBLIC_KEY"),u=!p||!w||!s;if(u&&(console.log("Configuring secrets for the authentication service (Better Auth)..."),console.log(k.dim(" BETTER_AUTH_SECRET - Session signing and encryption")),console.log(k.dim(" JWT_PRIVATE_KEY - Signs JWTs issued to your apps")),console.log(k.dim(" JWT_PUBLIC_KEY - Apps use this to verify JWTs")),console.log()),(a||!f)&&await h({secretName:"GATEWAY_URL",secretValue:e,cwd:t,workerName:i,verbose:n,description:`Setting GATEWAY_URL to: ${e}`}),l||await h({secretName:"CLOUDFLARE_ACCOUNT_ID",secretValue:o,cwd:t,workerName:i,verbose:n,description:`Setting CLOUDFLARE_ACCOUNT_ID to: ${o}`}),c||await h({secretName:"GATEWAY_DEPLOYMENT_MODE",secretValue:"self_hosted",cwd:t,workerName:i,verbose:n,description:"Setting GATEWAY_DEPLOYMENT_MODE to: self_hosted"}),!p){let E=ye();await h({secretName:"BETTER_AUTH_SECRET",secretValue:E,cwd:t,workerName:i,verbose:n,description:"Generating new Better Auth secret..."})}if(w&&s)n&&console.log(k.dim(` JWT key pair already exists
10
+ `));else if(!w&&!s){n&&console.log(k.dim(` Generating new JWT key pair...
11
+ `));let E=he();await h({secretName:"JWT_PRIVATE_KEY",secretValue:E.privateKey,cwd:t,workerName:i,verbose:n}),await h({secretName:"JWT_PUBLIC_KEY",secretValue:E.publicKey,cwd:t,workerName:i,verbose:n}),n&&console.log(k.green(`Created JWT key pair secrets
12
+ `))}else throw new Error("JWT key pair is incomplete. Both JWT_PRIVATE_KEY and JWT_PUBLIC_KEY must exist together. Please delete the existing key and redeploy.");u&&console.log(n?`Secret setup complete!
13
+ `:` Finished.
14
+ `)}catch(r){throw console.error(`
15
+ Failed to setup secrets`,r instanceof Error?`
16
+ ${r.message}`:""),r}}async function oe({gatewayPath:e,resources:a,workerUrl:o,domain:t,serviceBindings:n=[],verbose:i=!1}){let r=Ee.join(e,"dist","server","wrangler.json");await ee({configPath:r,d1DatabaseId:a.d1DatabaseId,kvNamespaceIds:a.kvNamespaceIds,...t?{routes:[{pattern:t,custom_domain:!0},{pattern:`*.${t}/*`,zone_name:t}],workersDev:!1}:{},services:n,verbose:i});let f=be.randomUUID(),{command:l,argsPrefix:c}=await z(e,"wrangler","wrangler");console.log(),await M(l,[...c,"deploy"],{cwd:e,description:`Deploying your Gateway to Cloudflare workers...
17
+
18
+ This could take up to a minute.`,env:{...process.env,BETTER_AUTH_SECRET:f},verbose:i}),console.log(),await ae({gatewayUrl:t?`https://${t}`:o,forceGatewayUrl:!!t,cloudflareAccountId:a.accountId,gatewayPath:e,verbose:i})}import b from"node:fs";import y from"node:path";import{spawn as Ce}from"node:child_process";import{fileURLToPath as ve}from"node:url";import{execa as re}from"execa";var ne="every-app-gateway-build.tar.gz";function _e(e=import.meta.url){let a=y.dirname(ve(e));return y.resolve(a,"..","gateway",ne)}async function I(e,a){return new Promise((o,t)=>{let n=Ce("tar",["-xzf",e,"-C",a]);n.on("error",t),n.on("close",i=>{i===0?o():t(new Error(`tar extraction failed with code ${i}`))})})}function ke(e){let a=y.resolve(e);for(;;){let o=y.join(a,"apps","every-app-gateway","package.json");if(b.existsSync(o))return y.dirname(o);let t=y.dirname(a);if(t===a)return null;a=t}}async function ie(e,a,o=!1){let t=ke(a);if(!t)throw new Error("Could not find apps/every-app-gateway from the current directory. Run `everyapp gateway deploy` from inside the monorepo, or pass --localGateway <tarball> to deploy a prebuilt gateway.");let n=y.resolve(t,"..","..");console.log("Building gateway from local source...");let i=o?"inherit":"pipe";await re("pnpm",["--filter","@every-app/sdk","build"],{cwd:n,stdio:i}),await re("pnpm",["run","build:release"],{cwd:t,stdio:i});let r=y.join(t,ne);if(!b.existsSync(r))throw new Error(`Gateway build did not produce ${r}`);return b.mkdirSync(e,{recursive:!0}),A(o,`Built tarball: ${r}`,"Extracting archive..."),await I(r,e),S(o,`Extraction complete
19
+ `),e}async function se(e,a=!1){let o=_e();return b.existsSync(o)?(console.log("Using bundled gateway..."),b.mkdirSync(e,{recursive:!0}),A(a,`Tarball: ${o}`,"Extracting archive..."),await I(o,e),S(a,`Extraction complete
20
+ `),e):null}async function ce(e,a,o=!1){if(console.log("Using local gateway tarball..."),!b.existsSync(e))throw new Error(`Local gateway tarball not found: ${e}`);return b.mkdirSync(a,{recursive:!0}),A(o,`Tarball: ${e}`,"Extracting archive..."),await I(e,a),S(o,`Extraction complete
21
+ `),a}import m from"chalk";async function le({workerUrl:e,maxWaitMs:a=12e4,pollIntervalMs:o=3e3}){let t=`${e}/sign-up`;console.log(m.green(`
22
+ Gateway deployment successful!
23
+ `)),console.log(`Your Gateway will be available at: ${m.cyan(t)}
24
+ `),console.log(m.dim("Waiting for SSL certificate to be provisioned..."));let n=Date.now();for(;Date.now()-n<a;){await new Promise(r=>setTimeout(r,o));let i=!1;try{i=await T(e)}catch(r){if(r instanceof C){console.log(m.yellow(`
25
+ Gateway unreachable
26
+ `)),console.log(v(r)),console.log(m.dim(` Confirm the gateway URL is correct and reachable, then run this command again.
27
+ `));return}throw r}if(i){console.log(m.green(`SSL certificate is ready!
28
+ `));let r;try{r=await D(e)}catch(f){if(f instanceof C){console.log(m.yellow(`
29
+ Gateway unreachable
30
+ `)),console.log(v(f)),console.log(m.dim(` Confirm the gateway URL is correct and reachable, then run this command again.
31
+ `));return}throw f}r?console.log(`Your Gateway is now live at: ${m.cyan(e)}
32
+ `):(console.log(`Your Gateway is now live at: ${m.cyan(t)}
33
+ `),console.log(m.dim(` Create an owner account to get started with your Gateway.
34
+ `)));return}}console.log(m.yellow(`
35
+ SSL certificate is still being provisioned. This can take a few minutes.
36
+ `)),console.log(m.dim(` The URL above will be accessible once the SSL certificate is ready.
37
+ `)),console.log(m.dim(` Create an owner account to get started with your Gateway.
38
+ `))}async function bt(e){await G({showNewUserHelp:!0});let a=e.verbose||!1,o=e.localGateway,t=e.domain?.replace(/^https?:\/\//,"").replace(/\/$/,""),n=e.yes||!1;if(console.log(g.bold(`
39
+ Every App Gateway
40
+ `)),!await J("the Gateway",n)){console.log(`
41
+ Deployment cancelled by user
42
+ `);return}t||await K();let r=await X({verbose:a});if(t){console.log(g.dim(`Verifying Cloudflare zone for ${t}...`));let s=await B({accountId:r.accountId,domain:t}),u=await V({zoneId:s.id,domain:t});u==="unauthorized"?console.log(g.yellow(Q({domain:t,accountId:r.accountId,mode:"gateway-warning"}))):a&&console.log(g.dim(u==="created"?` Created proxied wildcard DNS record for *.${t}`:` Proxied wildcard DNS record already exists for *.${t}`))}else console.log(g.yellow("Warning: app subdomains require a custom domain. Redeploy the gateway with --domain <apex-domain> before deployed apps are routable."));let f=await j(r.accountId);a&&console.log(g.dim(`Reconstructed ${f.length} gateway service binding${f.length===1?"":"s"} from the registry.`));let l=await Y("gateway-deploy-");a&&console.log(g.dim(`Working directory: ${l}
43
+ `));let c=null;try{let s;o?s=await ce(o,l,a):(s=await se(l,a),s??=await ie(l,process.cwd(),a)),await H({cwd:s,verbose:a,description:"Installing gateway dependencies..."});let u=Te.join(s,"wrangler.jsonc"),E=await W(u),U=t?`https://${t}`:await $(E);c=t?`https://${t}`:U,await oe({gatewayPath:s,resources:r,workerUrl:U,domain:t,serviceBindings:f,verbose:a}),await q({cwd:s,d1DatabaseId:r.d1DatabaseId,verbose:a})}catch(s){let u=await O(s);throw u&&(console.log(u.formatted),await R(1)),console.error(`
44
+ Deployment failed:`,s instanceof Error?s.message:s),s}finally{await F({tmpDir:l,verbose:a})}if(!c)throw new Error("Worker URL not set properly during deployment");let p;try{p=await T(c)}catch(s){if(s instanceof C){console.log(g.yellow(`
45
+ Gateway unreachable
46
+ `)),console.log(v(s)),console.log(g.dim(` Confirm the gateway URL is correct and reachable, then run this command again.
47
+ `));return}throw s}if(!p){await le({workerUrl:c});return}console.log(g.green(`
48
+ Gateway deployment successful!
49
+ `));let w;try{w=await D(c)}catch(s){if(s instanceof C){console.log(g.yellow(`
50
+ Gateway unreachable
51
+ `)),console.log(v(s)),console.log(g.dim(` Confirm the gateway URL is correct and reachable, then run this command again.
52
+ `));return}throw s}if(w)console.log(`Your Gateway is now live at: ${g.cyan(c)}
53
+ `);else{let s=`${c}/sign-up`;console.log(`Your Gateway is now live at: ${g.cyan(s)}
54
+ `),console.log(g.dim(` Create an owner account to get started with your Gateway.
55
+ `))}}export{bt as deploy};
@@ -0,0 +1,7 @@
1
+ import{a as c}from"./chunk-SUM3EFB4.js";import{a as p}from"./chunk-KZH54DDZ.js";import{a as r}from"./chunk-FX3COD5Z.js";import"./chunk-L3RGZX6J.js";import{e as i}from"./chunk-CEOIDQLQ.js";import"./chunk-H4JYEFV2.js";import"./chunk-BIXKPCDH.js";import"./chunk-VEYSNPDH.js";import"./chunk-UGQQTUTQ.js";import{a}from"./chunk-RUQ6WEWY.js";import"./chunk-7EBQPYFG.js";import"./chunk-DHWAR5AE.js";import{d as s}from"./chunk-WO3NE7ZU.js";import"./chunk-YJ2DKIZS.js";import o from"chalk";async function x(e){if(e.domain!==void 0)throw new Error("apps derive their address from the gateway's domain automatically; configure the domain with `everyapp gateway deploy --domain <apex-domain>`.");await a(),await i();let n=process.cwd(),l=e.verbose||!1,m=e.yes||!1,d=e["skip-dns-check"]||!1;await p();let t=await s(n),y=t.id;if(console.log(o.bold(`
2
+ Project: ${y}
3
+ `)),!await r("this app",m)){console.log(o.red(`
4
+ Deployment cancelled by user
5
+ `));return}let{liveUrl:f,gatewayUrl:w}=await c({cwd:n,manifest:t,verbose:l,skipDnsCheck:d});console.log(o.green(`
6
+ Deployment successful!`)),console.log(` App live at: ${o.cyan(f)}`),console.log(o.dim(" Gateway routes this app through a service binding.")),console.log(` Gateway: ${o.cyan(w)}
7
+ `)}export{x as deploy};
Binary file
@@ -0,0 +1 @@
1
+ import{f as e}from"./chunk-WO3NE7ZU.js";import"./chunk-YJ2DKIZS.js";import a from"chalk";async function f(o){let n=process.cwd(),{manifest:t,configPath:r}=await e(n);o.verbose&&console.log(a.dim(`Generated ${r} from everyapp.config.ts for ${t.id}.`))}export{f as generateConfig};
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{a as i,b as t}from"./chunk-OYJHDLMN.js";import{a as r,b as o}from"./chunk-APTBZ2LQ.js";import"./chunk-VOYWQ73B.js";import{run as e}from"@stricli/core";r();await e(t,process.argv.slice(2),i(process));await o();
2
+ import{a as i,b as t}from"./chunk-MTESAO7S.js";import{a as r,b as o}from"./chunk-7EBQPYFG.js";import"./chunk-DHWAR5AE.js";import"./chunk-YJ2DKIZS.js";import{run as e}from"@stricli/core";r();await e(t,process.argv.slice(2),i(process));await o();
@@ -0,0 +1 @@
1
+ import{d as l}from"./chunk-BIXKPCDH.js";import{a as r,d as n}from"./chunk-VEYSNPDH.js";import{k as i}from"./chunk-RUQ6WEWY.js";import"./chunk-7EBQPYFG.js";import"./chunk-DHWAR5AE.js";import"./chunk-YJ2DKIZS.js";import g from"chalk";import m from"enquirer";async function c(){try{return await i()}catch{return""}}async function k(){let s=await c(),{gatewayUrl:w}=await m.prompt({type:"input",name:"gatewayUrl",message:"Gateway URL",initial:s,validate:e=>{try{return r(e.trim()),!0}catch{return"Enter a valid gateway URL"}}}),t=r(w.trim()),{token:o}=await m.prompt({type:"password",name:"token",message:"Deploy token",validate:e=>e.trim().startsWith("eak_")?!0:"Deploy tokens start with eak_"}),a=await new l({gatewayUrl:t,getAuthToken:async()=>o.trim()}).whoami();await n({gatewayUrl:t,token:o.trim(),organizationId:a.organizationId}),console.log(g.green(`Logged in to ${t} for ${a.organizationName} (${a.organizationId}).`))}export{k as login};
@@ -0,0 +1 @@
1
+ import{a as e,e as r}from"./chunk-VEYSNPDH.js";import{k as a}from"./chunk-RUQ6WEWY.js";import"./chunk-7EBQPYFG.js";import"./chunk-DHWAR5AE.js";import"./chunk-YJ2DKIZS.js";import o from"chalk";import m from"enquirer";async function y(){try{return await a()}catch{return""}}async function f(){let i=await y(),{gatewayUrl:n}=await m.prompt({type:"input",name:"gatewayUrl",message:"Gateway URL",initial:i,validate:c=>{try{return e(c.trim()),!0}catch{return"Enter a valid gateway URL"}}}),t=e(n.trim()),l=await r(t);console.log(l?o.green(`Logged out of ${t}.`):o.yellow(`No stored credential found for ${t}.`))}export{f as logout};
@@ -1,4 +1,4 @@
1
- import{a}from"./chunk-ZWRZQCN2.js";import{b as i}from"./chunk-JWYVVDE3.js";import"./chunk-APTBZ2LQ.js";import"./chunk-VOYWQ73B.js";import r from"chalk";import{execa as l}from"execa";async function g(m,...o){await i();let n=process.cwd();try{if(!o||o.length===0)throw new Error(`No command provided. Usage: npx everyapp app remote-d1-shell -- <command>
1
+ import{a}from"./chunk-UGQQTUTQ.js";import{a as i}from"./chunk-RUQ6WEWY.js";import"./chunk-7EBQPYFG.js";import"./chunk-DHWAR5AE.js";import"./chunk-WO3NE7ZU.js";import"./chunk-YJ2DKIZS.js";import r from"chalk";import{execa as l}from"execa";async function g(m,...o){await i();let n=process.cwd();try{if(!o||o.length===0)throw new Error(`No command provided. Usage: npx everyapp app remote-d1-shell -- <command>
2
2
  Example: npx everyapp app remote-d1-shell -- npx drizzle-kit migrate`);let[e,...t]=o;if(!e)throw new Error("Invalid command");console.log("Retrieving shell info from Cloudflare...");let c=await a(n);console.log(r.bold(`
3
3
  Running: ${r.cyan([e,...t].join(" "))}
4
4
  `)),await l(e,t,{cwd:n,stdio:"inherit",env:{...process.env,...c}}),console.log(`
@@ -0,0 +1,6 @@
1
+ import{a as l}from"./chunk-F3HDGVHB.js";import{a as c}from"./chunk-KZH54DDZ.js";import{e as r}from"./chunk-CEOIDQLQ.js";import"./chunk-H4JYEFV2.js";import"./chunk-BIXKPCDH.js";import"./chunk-VEYSNPDH.js";import{a as n}from"./chunk-RUQ6WEWY.js";import"./chunk-7EBQPYFG.js";import"./chunk-DHWAR5AE.js";import{d as i,f as s}from"./chunk-WO3NE7ZU.js";import"./chunk-YJ2DKIZS.js";import o from"chalk";async function L(p){let e=process.cwd(),m=p.verbose||!1;await c(),await n();let u=await r(),t=await i(e),a=t.id;await s(e,{manifest:t}),console.log(o.bold(`
2
+ Setting up local environment for ${a}
3
+ `)),await l({targetDir:e,appId:a,gatewayUrl:u,verbose:m,installDeps:!0,migrations:t.migrations}),console.log(o.green(`Local setup complete!
4
+ `)),console.log(`Run the app locally:
5
+ `),console.log(o.dim(` ${o.bold("pnpm run dev")}
6
+ `))}export{L as setupLocal};
package/package.json CHANGED
@@ -4,25 +4,19 @@
4
4
  "description": "Every App CLI - Deploy and manage apps.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
- "version": "0.1.8",
7
+ "version": "0.2.0",
8
8
  "files": [
9
- "dist"
9
+ "dist",
10
+ "bin",
11
+ "gateway"
10
12
  ],
11
13
  "bin": {
12
- "everyapp": "./dist/index.js",
13
- "__everyapp_bash_complete": "./dist/bash-complete.js"
14
+ "everyapp": "./bin/everyapp.js",
15
+ "__everyapp_bash_complete": "./bin/__everyapp_bash_complete.js"
14
16
  },
15
17
  "engines": {
16
18
  "node": ">=22"
17
19
  },
18
- "scripts": {
19
- "types:check": "tsc --noEmit",
20
- "prebuild": "tsc",
21
- "build": "tsup --silent",
22
- "build:prepublish": "pnpm install --ignore-scripts && npm run types:check && npm run build",
23
- "prepublishOnly": "npm run build:prepublish",
24
- "knip": "knip"
25
- },
26
20
  "tsup": {
27
21
  "entry": {
28
22
  "index": "src/bin/cli.ts",
@@ -34,7 +28,11 @@
34
28
  "tsconfig": "tsconfig.json",
35
29
  "clean": true,
36
30
  "splitting": true,
37
- "minify": true
31
+ "minify": true,
32
+ "noExternal": [
33
+ "@every-app/perimeter",
34
+ "@every-app/sdk"
35
+ ]
38
36
  },
39
37
  "dependencies": {
40
38
  "@stricli/auto-complete": "^1.2.4",
@@ -42,6 +40,7 @@
42
40
  "chalk": "^5.6.2",
43
41
  "enquirer": "^2.4.1",
44
42
  "execa": "^9.6.0",
43
+ "jiti": "^2.6.1",
45
44
  "jsonc-parser": "^3.3.1",
46
45
  "smol-toml": "^1.4.2",
47
46
  "zod": "^4.1.13"
@@ -50,6 +49,18 @@
50
49
  "@types/node": "^22.18.13",
51
50
  "knip": "^5.66.4",
52
51
  "tsup": "^6.7.0",
53
- "typescript": "5.9.3"
52
+ "typescript": "5.9.3",
53
+ "vitest": "^3.2.4",
54
+ "@every-app/perimeter": "0.1.0"
55
+ },
56
+ "scripts": {
57
+ "types:check": "tsc --noEmit",
58
+ "prebuild": "tsc",
59
+ "build": "tsup --silent",
60
+ "dev": "tsup --watch",
61
+ "install:global": "pnpm run build && npm link --ignore-scripts",
62
+ "build:prepack": "pnpm install --ignore-scripts && npm run types:check && npm run build && node scripts/bundle-gateway.js",
63
+ "knip": "knip",
64
+ "test": "vitest run --silent"
54
65
  }
55
- }
66
+ }
@@ -1,4 +0,0 @@
1
- import{c as e}from"./chunk-APTBZ2LQ.js";import n from"node:fs/promises";import p from"node:path";import o from"chalk";var a=["every-app.jsonc","every-app.json"];async function f(){let r=process.cwd();for(let c of a){let t=p.join(r,c);try{await n.access(t);return}catch{}}console.log(o.yellow(`
2
- Not inside an Every App project`)),console.log(o.dim(` No every-app.jsonc found
3
- `)),console.log("To create a new app, run the below command from the directory where you store your projects:"),console.log(o.dim(` npx everyapp app create
4
- `)),await e(1)}export{f as a};
@@ -1,7 +0,0 @@
1
- import{c as l}from"./chunk-XKKQYCSJ.js";import{a,e as r}from"./chunk-TUDP36IL.js";import i from"chalk";async function c({targetDir:n,verbose:o=!1}){try{o||console.log(`
2
- Setting up Cloudflare for local dev...`),await a("pnpm",["run","cf-typegen"],{cwd:n,verbose:o,logCommandToConsole:!1}),await a("pnpm",["run","build"],{cwd:n,verbose:o,logCommandToConsole:!1}),o||console.log(i.dim(` Finished.
3
- `)),await a("pnpm",["run","db:migrate:local"],{cwd:n,verbose:o}),console.log(`
4
- Local database migrations complete.
5
- `)}catch{console.warn(i.yellow(`
6
- Failed to run local migrations. You can run them manually with:`)),console.warn(i.dim(` pnpm run db:migrate:local
7
- `))}}async function y({targetDir:n,appId:o,gatewayUrl:e,gatewayAppApiToken:s,verbose:t=!1,installDeps:m=!1}){m&&await r({cwd:n,description:"Installing dependencies for local development...",verbose:t}),await l({targetDir:n,appId:o,gatewayUrl:e,gatewayAppApiToken:s}),await c({targetDir:n,verbose:t})}export{y as a};
@@ -1,48 +0,0 @@
1
- import{c as p}from"./chunk-APTBZ2LQ.js";import b from"node:fs/promises";import l from"node:path";import D from"node:os";import*as w from"smol-toml";import i from"chalk";function I(){let e=D.homedir(),t=D.platform(),n;return t==="win32"?n=l.join(process.env.LOCALAPPDATA||l.join(e,"AppData","Local"),".wrangler"):t==="darwin"?n=l.join(e,"Library","Preferences",".wrangler"):n=l.join(e,".wrangler"),l.join(n,"config","default.toml")}async function N(){let e=I();try{let t=await b.readFile(e,"utf-8"),n=w.parse(t);if(!n.oauth_token||!n.refresh_token)throw new Error("OAuth tokens not found in wrangler config");return n}catch(t){throw t.code==="ENOENT"?new Error("Wrangler config not found. Please run 'npx wrangler login' first."):t}}async function T(e){let t=I(),n=l.dirname(t);await b.mkdir(n,{recursive:!0});let r=w.stringify(e);await b.writeFile(t,r,"utf-8")}function L(e){let t=new Date(e).getTime(),n=Date.now(),r=1*60*1e3;return t-n<r}async function $(e){let t=await fetch("https://dash.cloudflare.com/oauth2/token",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"refresh_token",refresh_token:e,client_id:"54d11594-84e4-41aa-b438-e81b8fa78ee7"})});if(!t.ok)throw new Error(`Failed to refresh OAuth token: ${t.status} ${t.statusText}`);let n=await t.json();return{oauth_token:n.access_token,expiration_time:new Date(Date.now()+n.expires_in*1e3).toISOString(),refresh_token:n.refresh_token||e,scopes:n.scope?n.scope.split(" "):[]}}async function F(e={}){let{showNewUserHelp:t=!1}=e,n=!!process.env.CLOUDFLARE_API_TOKEN,r=!!process.env.CLOUDFLARE_ACCOUNT_ID;if(n&&!r&&(console.log(i.yellow(`
2
- Missing CLOUDFLARE_ACCOUNT_ID
3
- `)),console.log(`When using CLOUDFLARE_API_TOKEN, you must also set CLOUDFLARE_ACCOUNT_ID.
4
- `),console.log(i.dim(` export CLOUDFLARE_ACCOUNT_ID=<your_account_id>
5
- `)),await p(1)),!(n&&r))try{await k()}catch{console.log(t?i.yellow(`
6
- Already have a Cloudflare account?
7
- `):i.yellow(`
8
- Please log in to Cloudflare.
9
- `)),console.log(i.dim(" 1. Cloudflare CLI (recommended): npx wrangler login")),console.log(i.dim(` 2. Environment variables: CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID
10
- `)),t&&(console.log(i.yellow(`Don't have a Cloudflare account?
11
- `)),console.log("Every App uses Cloudflare so that you can inexpensively host your applications"),console.log("on a secure and powerful platform without needing to think about the machines"),console.log(`your code runs on.
12
- `),console.log(`Here are the steps to get started:
13
- `),console.log(i.dim(" 1. Create a Cloudflare account (free, no credit card required):")),console.log(i.cyan(` https://dash.cloudflare.com/sign-up
14
- `)),console.log(i.dim(` - Skip any Cloudflare onboarding like configuring a domain, this is unnecessary for Every App.
15
- `)),console.log(i.dim(` 2. Check your email to verify your email address
16
- `)),console.log(i.dim(" 3. Log in to Cloudflare via the CLI:")),console.log(i.cyan(` npx wrangler login
17
- `)),console.log(i.dim(" - Learn more: ")+i.cyan(`https://developers.cloudflare.com/workers/wrangler/commands/#login
18
- `))),await p(1)}}async function k(){let e=process.env.CLOUDFLARE_API_TOKEN;if(e)return e;let t=await N();if(L(t.expiration_time)){let n=await $(t.refresh_token);return await T(n),n.oauth_token}return t.oauth_token}async function a(e,t={}){let n=await k(),r=await fetch(`https://api.cloudflare.com/client/v4${e}`,{...t,headers:{Authorization:`Bearer ${n}`,"Content-Type":"application/json",...t.headers}}),o=await r.json();if(!r.ok){let s=o.errors?o.errors.map(d=>`[${d.code}] ${d.message}`).join(", "):r.statusText;throw new Error(`Cloudflare API request failed: ${r.status} ${s}`)}if(!o.success){let s=o.errors.map(d=>`[${d.code}] ${d.message}`).join(", ");throw new Error(`Cloudflare API error: ${s}`)}return o.result}async function f(){let e=process.env.CLOUDFLARE_ACCOUNT_ID;if(e)return e;let t=await a("/accounts");if(!t||t.length===0)throw new Error("No Cloudflare accounts found");let n=t[0];if(!n)throw new Error("No Cloudflare accounts found");return n.id}async function U(e){let t=await a(`/accounts/${e}`);if(!t||!t.id)throw new Error(`Account ${e} not found`);return t}async function C(e){try{let t=await a(`/accounts/${e}/workers/subdomain`);if(!t||!t.subdomain)throw new Error("No workers.dev subdomain found for this account");return t.subdomain}catch(t){throw new Error(`Failed to get workers.dev subdomain: ${t instanceof Error?t.message:"Unknown error"}`)}}async function j(e,t){let n=t||await f(),r=await C(n);return`https://${e}.${r}.workers.dev`}import y from"chalk";var E={EMAIL_NOT_VERIFIED:10034,R2_NOT_ENABLED:10042},S={[E.EMAIL_NOT_VERIFIED]:{userMessage:"Almost there! Your Cloudflare account email needs to be verified first.",action:`To verify your email address:
19
-
20
- 1. Check your inbox for a verification email from Cloudflare
21
- 2. Click the verification link in the email
22
- 3. Or visit ${y.cyan("https://dash.cloudflare.com/profile")} to resend the verification email
23
-
24
- Then run this command again.`},[E.R2_NOT_ENABLED]:{userMessage:"R2 not enabled",action:`R2 is Cloudflare's file storage service, used for storing images and files.
25
-
26
- ${y.cyan("https://dash.cloudflare.com/{accountId}/r2/plans")}
27
-
28
- ${y.dim(" Visit the URL above to enable R2, then run this command again.")}`}};function M(e){let t=e.match(/\[code:\s*(\d+)\]/);if(t?.[1])return parseInt(t[1],10);let n=e.match(/"code"\s*:\s*(\d+)/);if(n?.[1])return parseInt(n[1],10);let r=e.match(/\[(\d{5})\]/);if(r?.[1])return parseInt(r[1],10)}function W(e){let t=S[e];if(t)return{code:e,...t}}function B(e){let t="";return e instanceof Error?(t=e.message,"stdout"in e&&typeof e.stdout=="string"&&(t+=`
29
- `+e.stdout),"stderr"in e&&typeof e.stderr=="string"&&(t+=`
30
- `+e.stderr),"all"in e&&typeof e.all=="string"&&(t+=`
31
- `+e.all)):typeof e=="string"&&(t=e),t}async function K(e,t){let n=e.action,r=t.accountId;if(!r&&n.includes("{accountId}"))try{r=await f()}catch{}return r&&(n=n.replace(/{accountId}/g,r)),`
32
- ${y.yellow(e.userMessage)}
33
-
34
- ${n}
35
- `}async function V(e,t={}){let n=B(e),r=M(n);if(r===void 0)return;let o=W(r);return o?{formatted:await K(o,t),code:r}:void 0}import u from"chalk";import q from"enquirer";async function z(e,t){try{let n=t?{subdomain:t}:{},r=await a(`/accounts/${e}/workers/subdomain`,{method:"PUT",body:JSON.stringify(n)});if(!r||!r.subdomain)throw new Error("Failed to initialize workers.dev subdomain");return r.subdomain}catch(n){throw new Error(`Failed to initialize workers.dev subdomain: ${n instanceof Error?n.message:"Unknown error"}`)}}async function J(){return(await q.prompt({type:"input",name:"subdomain",message:" Choose a subdomain name:",validate:t=>!t||t.trim()===""?"Subdomain cannot be empty":/^[a-z0-9-]+$/.test(t)?t.startsWith("-")||t.endsWith("-")?"Subdomain cannot start or end with a hyphen":!0:"Subdomain must contain only lowercase letters, numbers, and hyphens"})).subdomain.trim()}async function H(){let e=await f();try{return await C(e)}catch{console.log(),console.log(u.yellow(` Please claim a Cloudflare subdomain.
36
- `)),console.log(u.dim(` All your apps will be deployed to this domain.
37
- `)),console.log(u.dim(" You can make it your name or a something fun.")),console.log(u.dim(` E.g. All apps will be deployed to "janedoe.workers.dev"
38
- `));let t=await J();console.log(u.dim(`
39
- Creating subdomain: ${t}...
40
- `));try{let n=await z(e,t);return console.log(u.green(` Successfully created subdomain: ${u.cyan(n)}
41
- `)),n}catch(n){throw console.error(u.red(`
42
- Failed to create subdomain`),u.dim(`
43
- ${n instanceof Error?n.message:"Unknown error"}`)),n}}}import{z as m}from"zod";var _="every-";function Y(e){return e.startsWith(_)?e:`${_}${e}`}var X=m.object({uuid:m.string(),name:m.string(),created_at:m.string().optional(),version:m.string().optional()}),R=m.array(X);async function O(e){let t=await a(`/accounts/${e}/d1/database?per_page=1000`);return R.parse(t)}async function G(e,t){let n=await a(`/accounts/${t}/d1/database`,{method:"POST",body:JSON.stringify({name:e})});if(!n||!n.uuid)throw new Error("Failed to create D1 database: no UUID returned");return n.uuid}async function Q(e,t){let r=(await O(t)).find(s=>s.name===e);return r?{id:r.uuid,name:e,wasCreated:!1}:{id:await G(e,t),name:e,wasCreated:!0}}async function Z(e){return(await a(`/accounts/${e}/storage/kv/namespaces?per_page=1000`)).map(n=>({id:n.id,title:n.title}))}async function ee(e,t){let n=await a(`/accounts/${t}/storage/kv/namespaces`,{method:"POST",body:JSON.stringify({title:e})});if(!n||!n.id)throw new Error("Failed to create KV namespace: no ID returned");return n.id}async function te(e,t){let r=(await Z(t)).find(s=>s.title===e);return r?{id:r.id,name:e,wasCreated:!1}:{id:await ee(e,t),name:e,wasCreated:!0}}async function ne(e){return(await a(`/accounts/${e}/r2/buckets?per_page=1000`)).buckets.map(n=>({name:n.name,creation_date:n.creation_date}))}async function re(e,t){let n=await a(`/accounts/${t}/r2/buckets`,{method:"POST",body:JSON.stringify({name:e})});if(!n||!n.name)throw new Error("Failed to create R2 bucket: no name returned");return n.name}async function oe(e,t){return(await ne(t)).find(o=>o.name===e)?{name:e,wasCreated:!1}:(await re(e,t),{name:e,wasCreated:!0})}import g from"chalk";async function ae(){return await a("/memberships")}function A(e){return e.status==="pending"?" (pending)":""}function se(e,t){let n=A(e);console.log(g.dim(` ${e.account.name} (${e.account.id})${n}`)),t.length>0&&(console.log(),console.log(g.dim(" Other accounts (set CLOUDFLARE_ACCOUNT_ID to switch):")),t.forEach(r=>{let o=A(r);console.log(g.dim(` - ${r.account.name}: ${r.account.id}${o}`))})),console.log()}async function ie(e){return console.log(g.yellow(`Multiple Cloudflare accounts found.
44
- `)),console.log(`Please set the CLOUDFLARE_ACCOUNT_ID environment variable:
45
- `),e.forEach(t=>{let n=A(t);console.log(g.dim(` ${t.account.name}: ${t.account.id}${n}`))}),console.log(g.dim(`
46
- export CLOUDFLARE_ACCOUNT_ID=<account_id>
47
- `)),p(1)}async function ce(e){if(e.length===0)throw new Error("No Cloudflare accounts found");let t=process.env.CLOUDFLARE_ACCOUNT_ID;!t&&e.length>1&&await ie(e);let n=t?e.find(o=>o.account.id===t):e[0];if(!n)throw new Error(`Account ${t} not found in your Cloudflare memberships`);let r=e.filter(o=>o.account.id!==n.account.id);return{account:n,otherAccounts:r}}import h from"node:fs/promises";import v from"node:path";import*as c from"jsonc-parser";import ue from"chalk";async function Ye(e){e.verbose&&console.log("Updating wrangler.jsonc with resource IDs and configuration...");let t=e.configPath;(await h.stat(t)).isDirectory()&&(t=v.join(t,"wrangler.jsonc"));let r=await h.readFile(t,"utf-8"),o=c.parse(r),s=[];if(o.d1_databases){if(o.d1_databases.length===0)throw new Error("No D1 databases found in wrangler.jsonc. Every app must have exactly one D1 database.");if(o.d1_databases.length>1)throw new Error(`Found ${o.d1_databases.length} D1 databases in wrangler.jsonc. Every app must have exactly one D1 database.`)}if(o.kv_namespaces){if(o.kv_namespaces.length===0)throw new Error("No KV namespaces found in wrangler.jsonc. Every app must have exactly one KV namespace.");if(o.kv_namespaces.length>1)throw new Error(`Found ${o.kv_namespaces.length} KV namespaces in wrangler.jsonc. Every app must have exactly one KV namespace.`)}if(o.r2_buckets&&o.r2_buckets.length>1)throw new Error(`Found ${o.r2_buckets.length} R2 buckets in wrangler.jsonc. Every app must have at most one R2 bucket.`);if(e.name&&s.push(...c.modify(r,["name"],e.name,{})),e.d1DatabaseId&&s.push(...c.modify(r,["d1_databases",0,"database_id"],e.d1DatabaseId,{})),e.d1DatabaseName&&s.push(...c.modify(r,["d1_databases",0,"database_name"],e.d1DatabaseName,{})),e.kvNamespaceId&&s.push(...c.modify(r,["kv_namespaces",0,"id"],e.kvNamespaceId,{})),e.r2BucketName&&o.r2_buckets?.length&&s.push(...c.modify(r,["r2_buckets",0,"bucket_name"],e.r2BucketName,{})),e.vars)for(let[P,x]of Object.entries(e.vars))s.push(...c.modify(r,["vars",P],x,{}));let d=c.applyEdits(r,s);await h.writeFile(t,d),e.verbose&&console.log(ue.dim(` wrangler.jsonc updated successfully
48
- `))}async function Xe(e){let t=await h.readFile(e,"utf-8"),n=c.parse(t);if(!n.name||typeof n.name!="string")throw new Error("Worker name not found in wrangler.jsonc");return n.name}async function Ge(e){let t=v.join(e,"wrangler.jsonc");try{let n=await h.readFile(t,"utf-8");return c.parse(n)}catch(n){throw n instanceof Error&&"code"in n&&n.code==="ENOENT"?new Error("wrangler.jsonc not found in current directory. Make sure you're running this command from your app's root directory."):n}}export{Y as a,F as b,k as c,a as d,f as e,U as f,j as g,O as h,Q as i,te as j,oe as k,V as l,ae as m,se as n,ce as o,H as p,Ye as q,Xe as r,Ge as s};
@@ -1,6 +0,0 @@
1
- import{b as l}from"./chunk-ZWRZQCN2.js";import{f as s,m as c,n as a,o as m}from"./chunk-JWYVVDE3.js";import{c as r}from"./chunk-APTBZ2LQ.js";import A from"enquirer";import t from"chalk";async function D(){if(process.env.CLOUDFLARE_API_TOKEN){let i=process.env.CLOUDFLARE_ACCOUNT_ID;return i?s(i):(console.log(t.yellow(`
2
- CLOUDFLARE_ACCOUNT_ID is required when using CLOUDFLARE_API_TOKEN
3
- `)),r(1))}let n=await c(),{account:o,otherAccounts:e}=await m(n);return a(o,e),{id:o.account.id,name:o.account.name}}async function R(n="this",o=!1){let e=await D();if(process.env.CLOUDFLARE_API_TOKEN&&(console.log(t.dim(` ${e.name} (${e.id})`)),console.log()),o)return console.log(t.dim(`Skipping deployment confirmation due to -y flag.
4
- `)),!0;let{confirm:i}=await A.prompt({type:"confirm",name:"confirm",message:`Do you want to deploy ${n} to ${e.name}?`,initial:!1});return i}import g from"chalk";import f from"chalk";function z(n,o){n&&console.log(f.dim(o))}function u(n,...o){n&&o.forEach(e=>console.log(f.dim(e)))}var p="npx",d=["drizzle-kit","migrate","--config=drizzle-prod.config.ts"];async function N({cwd:n,verbose:o=!1}){console.log(`
5
- Running: ${p} ${d.join(" ")}`),console.log(g.dim(" Running database migrations...")),u(o," Running any pending migrations against your remote D1 Database..."),await l(p,d,{cwd:n,verbose:o}),console.log(g.dim(` Migrations completed.
6
- `))}export{R as a,z as b,u as c,N as d};
@@ -1,6 +0,0 @@
1
- import{a as t,b as a,c as r}from"./chunk-VOYWQ73B.js";import s from"node:fs";import l from"node:os";import p from"node:path";function R(e){return{process:e,os:l,fs:s,path:p}}import{buildApplication as h,buildRouteMap as C}from"@stricli/core";import{buildInstallCommand as v,buildUninstallCommand as w}from"@stricli/auto-complete";import{buildCommand as o,buildRouteMap as d}from"@stricli/core";var m=o({loader:async()=>import("./create-MDOGNG7C.js"),parameters:{positional:{kind:"tuple",parameters:[{brief:"App ID (kebab-case format)",parse:String,optional:!0}]},flags:{verbose:{kind:"boolean",brief:"Show detailed output during creation",optional:!0},yes:{kind:"boolean",brief:"Skip deployment confirmation",optional:!0}},aliases:{y:"yes"}},docs:{brief:"Create a new app from the starter template",fullDescription:["Copies the simple-todo starter template, deploys to Cloudflare, and configures local development.","","Usage: every app create [name]","","The command will:"," 1. Prompt for app ID (or use provided name)"," 2. Deploy to Cloudflare (D1 database, KV namespace, Worker)"," 3. Configure wrangler.jsonc, package.json, and .env files"," 4. Install dependencies and run local migrations","","After creation, run 'pnpm run dev' to start developing."].join(`
2
- `)}}),u=o({loader:async()=>{let{deploy:e}=await import("./deploy-6OHCTGYN.js");return e},parameters:{positional:{kind:"tuple",parameters:[]},flags:{verbose:{kind:"boolean",brief:"Show detailed output during deployment",optional:!0},yes:{kind:"boolean",brief:"Skip deployment confirmation",optional:!0}},aliases:{y:"yes"}},docs:{brief:"Deploy an app to Cloudflare",fullDescription:["Deploys the current app to Cloudflare Workers from the current directory.","The deployment process:"," 1. Reads wrangler.jsonc to determine required resources"," 2. Creates or links D1 databases and KV namespaces"," 3. Updates wrangler.jsonc with resource IDs"," 4. Installs dependencies if needed"," 5. Runs database migrations against production D1"," 6. Builds and deploys using wrangler deploy"].join(`
3
- `)}}),c=o({loader:async()=>{let{setupLocal:e}=await import("./setupLocal-Y7ZUHJBN.js");return e},parameters:{positional:{kind:"tuple",parameters:[]},flags:{verbose:{kind:"boolean",brief:"Show detailed output during local setup",optional:!0}}},docs:{brief:"Set up local development in an existing app",fullDescription:["Configures local development for an existing Every App project in the current directory.","","Usage: every app setup-local","","The command will:"," 1. Verify the current directory is an Every App project"," 2. Verify Cloudflare and gateway setup"," 3. Install dependencies"," 4. Create or refresh .env.local"," 5. Generate Cloudflare types and run local database migrations","","This is useful after cloning an existing Every App repository."].join(`
4
- `)}}),f=o({loader:async()=>{let{remoteD1Shell:e}=await import("./remoteD1Shell-6YR7TPHZ.js");return e},parameters:{flags:{},positional:{kind:"array",parameter:{brief:"Command and arguments to run with environment variables",parse:String}}},docs:{brief:"Run a command with Cloudflare D1 connection environment variables",fullDescription:["Sets environment variables needed to connect to remote Cloudflare D1 and runs any command that requires D1 access.","","The command will:"," 1. Get the Cloudflare account ID"," 2. Look up the database ID from the database name in wrangler.jsonc"," 3. Get a valid OAuth token"," 4. Run the provided command with CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_DATABASE_ID, CLOUDFLARE_API_TOKEN, and MIGRATE_REMOTE set","","Common use cases:"," - Running Drizzle migrations: npx everyapp app remote-d1-shell -- npx drizzle-kit migrate"," - Opening Drizzle Studio: npx everyapp app remote-d1-shell -- npx drizzle-kit studio"," - Pushing schema changes: npx everyapp app remote-d1-shell -- npx drizzle-kit push","","This command is useful for any operation that needs direct access to your production D1 database."].join(`
5
- `)}}),n=d({routes:{create:m,deploy:u,"setup-local":c,"remote-d1-shell":f},docs:{brief:"App management commands"}});import{buildCommand as y,buildRouteMap as b}from"@stricli/core";var g=y({loader:async()=>{let{deploy:e}=await import("./deploy-5JWY65YE.js");return e},parameters:{positional:{kind:"tuple",parameters:[]},flags:{repo:{kind:"parsed",parse:String,brief:"Git repository URL to deploy",optional:!0},verbose:{kind:"boolean",brief:"Show detailed output during deployment",optional:!0},localGateway:{kind:"parsed",parse:String,brief:"Path to local gateway tarball (for testing)",optional:!0},yes:{kind:"boolean",brief:"Skip deployment confirmation",optional:!0}},aliases:{y:"yes"}},docs:{brief:"Deploy the gateway application to Cloudflare",fullDescription:["Clones the gateway repository, installs dependencies, runs migrations, and deploys to Cloudflare Workers.","The deployment process:"," 1. Clones the repository to a temporary directory"," 2. Installs npm dependencies"," 3. Runs database migrations against production D1"," 4. Runs wrangler deploy"," 5. Cleans up temporary files"].join(`
6
- `)}}),i=b({routes:{deploy:g},docs:{brief:"Gateway management commands"}});var D=C({routes:{app:n,gateway:i,install:v("everyapp",{bash:"__everyapp_bash_complete"}),uninstall:w("everyapp",{bash:!0})},docs:{brief:a,hideRoute:{install:!0,uninstall:!0}}}),G=h(D,{name:t,versionInfo:{currentVersion:r},scanner:{allowArgumentEscapeSequence:!0}});export{R as a,G as b};
@@ -1,21 +0,0 @@
1
- import{a as F,e as Q}from"./chunk-ZR6E5CZN.js";import{d as q}from"./chunk-KIA3P5KV.js";import{a as _,e as W}from"./chunk-TUDP36IL.js";import{a as O,c as N,e as I,g as E,h as B,i as G,j as V,k as L,l as R,q as K,s as M}from"./chunk-JWYVVDE3.js";import{c as C}from"./chunk-APTBZ2LQ.js";import l from"chalk";async function j({appId:e,needsR2Bucket:t=!1,verbose:o=!1}){console.log(`
2
- Setting up your Cloudflare ${t?"D1 Database, KV Store, and R2 Bucket":"D1 Database and KV Store"}...
3
- `);let s=await I(),a=O(e),c;t&&(c=await re(a,s,o));let n=await ee(a,s,o),p=await te(a,s,o);return{d1DatabaseId:n,kvNamespaceId:p,r2BucketName:c,resourceName:a}}async function ee(e,t,o){o&&(console.log(l.bold(`Processing D1 database...
4
- `)),console.log(` Checking D1 database: ${e}`));let r=await G(e,t);return o?r.wasCreated?console.log(l.green(` Created D1 database: ${e} (${r.id})
5
- `)):console.log(l.dim(` Linking to existing D1 database: ${e} (${r.id})
6
- `)):r.wasCreated?console.log(l.green(" D1 successfully created.")):console.log(" D1 already set up."),r.id}async function te(e,t,o){o&&(console.log(l.bold(`Processing KV namespace...
7
- `)),console.log(` Checking KV namespace: ${e}`));let r=await V(e,t);return o?r.wasCreated?console.log(l.green(` Created KV namespace: ${e} (${r.id})
8
- `)):console.log(l.dim(` Linking to existing KV namespace: ${e} (${r.id})
9
- `)):r.wasCreated?console.log(l.green(" KV successfully created.")):console.log(" KV already set up."),r.id}async function re(e,t,o){o&&(console.log(l.bold(`Processing R2 bucket...
10
- `)),console.log(` Checking R2 bucket: ${e}`));let r;try{r=await L(e,t)}catch(s){let a=await R(s,{accountId:t});throw a&&(console.log(a.formatted),await C(1)),s}return o?r.wasCreated?console.log(l.green(` Created R2 bucket: ${e}
11
- `)):console.log(l.dim(` Linking to existing R2 bucket: ${e}
12
- `)):r.wasCreated?console.log(l.green(" R2 successfully created.")):console.log(" R2 already set up."),r.name}import oe from"chalk";async function z({cwd:e,gatewayUrl:t,appId:o,verbose:r}){let s={...process.env,VITE_GATEWAY_URL:t,VITE_APP_ID:o};try{await _("npx",["vite","build"],{cwd:e,description:`Building your application...
13
- `,env:s,verbose:r}),await _("npx",["wrangler","deploy"],{cwd:e,description:`Deploying your application to Cloudflare workers...
14
-
15
- This could take up to a minute.`,env:s,verbose:r})}catch(a){let c=await R(a);throw c&&(console.log(c.formatted),await C(1)),console.error(oe.red(`
16
- Failed to build or deploy`)),a}}import f from"chalk";import P from"enquirer";var se="every-app-gateway";async function k(){let e=await I(),o=(await B(e)).find(r=>r.name===se);return o?{accountId:e,databaseId:o.uuid}:null}import A from"chalk";async function m(e,t,o,r){try{let s=await N(),a={sql:o};r&&r.length>0&&(a.params=r);let c=await fetch(`https://api.cloudflare.com/client/v4/accounts/${e}/d1/database/${t}/query`,{method:"POST",headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"},body:JSON.stringify(a)}),n=await c.json();if(!c.ok||!n.success){let d=n.errors?n.errors.map(u=>`[${u.code}] ${u.message}`).join(", "):c.statusText;throw console.error(A.red(`
17
- D1 Query Error:`)),console.error(A.dim(`SQL: ${o}`)),console.error(A.dim(`Error: ${d}`)),new Error(`D1 query failed: ${d}`)}let p=n.result;if(!p||p.length===0)throw new Error("No results returned from D1 query");let g=p[0];if(!g)throw new Error("First result is undefined");return g.results}catch(s){throw s instanceof Error&&!s.message.includes("D1 query failed")&&(console.error(A.red(`
18
- D1 Query Error:`)),console.error(A.dim(`SQL: ${o}`))),s}}async function v(e){return m(e.accountId,e.databaseId,"SELECT id, name, email, role FROM users")}import{randomUUID as H}from"node:crypto";async function h(e,t){return(await m(e.accountId,e.databaseId,"SELECT id, dev_url, is_default FROM apps WHERE app_id = ?",[t]))[0]??null}async function x(e,t){let o=await h(e,t.appId),r=Date.now(),s=t.isDefault??!!(o?.is_default??0);if(o){let c=t.devUrl??o.dev_url??null;return await m(e.accountId,e.databaseId,"UPDATE apps SET name = ?, description = ?, app_url = ?, dev_url = ?, is_default = ?, updated_at = ? WHERE id = ?",[t.name,t.description,t.appUrl,c,s?1:0,r,o.id]),o.id}let a=H();return await m(e.accountId,e.databaseId,"INSERT INTO apps (id, app_id, name, description, app_url, dev_url, is_default, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",[a,t.appId,t.name,t.description,t.appUrl,t.devUrl??null,s?1:0,r,r]),a}async function ae(e,t,o){return(await m(e.accountId,e.databaseId,"SELECT id FROM user_app_access WHERE user_id = ? AND app_id = ?",[t,o])).length>0}async function $(e,t,o){if(await ae(e,t,o))return{created:!1};let s=Date.now(),a=H();return await m(e.accountId,e.databaseId,"INSERT INTO user_app_access (id, user_id, app_id, granted_at, granted_by) VALUES (?, ?, ?, ?, ?)",[a,t,o,s,null]),{created:!0}}async function Y(e){let{appId:t,appUrl:o,verbose:r=!1,appName:s,appDescription:a,devUrl:c}=e;try{console.log(""),r&&console.log("Adding apps to user gateways...");let n=await k();if(!n){console.warn(f.yellow(`every-app-gateway database not found. Skipping UserApp record creation.
19
- `));return}let p=await v(n),g=p.filter(i=>i.role==="owner"),d=p.filter(i=>i.role!=="owner"),u=await h(n,t),y=u===null,U=s||t,J=a||t;!y&&r&&console.log(f.dim("App already configured in gateway. Skipping access prompts."));let T=y?await ie("Add future users by default to this app?"):!!u?.is_default,D=y?d.length===0?"owner-only":await ce():"none",w=g.map(i=>i.id);if(d.length===0&&D==="select")throw new Error("No users found in the database to select from. Please create a user first.");D==="all"?w=g.map(i=>i.id).concat(d.map(i=>i.id)):D==="select"&&(w=w.concat(await le(d))),w=Array.from(new Set(w));let X=await x(n,{appId:t,appUrl:o,name:U,description:J,devUrl:c,isDefault:T}),b=p.filter(i=>w.includes(i.id));r&&b.length>1&&console.log(f.yellow(`Adding app to ${b.length} user(s)...
20
- `));for(let i of b)await ne(n,i,{appRecordId:X,verbose:r});if(r){let i=g.length,S=b.length-i,Z=b.length===0?"no users":D==="all"?"all users":D==="select"?i>0?`${S} selected users + owner`:`${S} selected users`:i>1?"owner users":"owner user";console.log(f.dim(` Default access: ${T?"enabled":"disabled"}`)),console.log(f.dim(` Access granted to ${Z}
21
- `))}}catch(n){throw console.error(f.red("Failed to insert UserApp records:"),n instanceof Error?n.message:n),n}}async function ne(e,t,o){let{verbose:r,appRecordId:s}=o;(await $(e,t.id,s)).created?console.log(` UserApp record created for user ${t.name} (${t.email})`):r&&console.log(f.dim(` UserApp record already exists for user ${t.name} (${t.email})`))}async function ie(e){let{confirm:t}=await P.prompt({type:"confirm",name:"confirm",message:e,initial:!0});return t}async function ce(){let{mode:e}=await P.prompt({type:"select",name:"mode",message:"Add existing users now?",choices:[{name:"all",message:"All users"},{name:"select",message:"Select users"},{name:"none",message:"None"}],initial:0});return e}async function le(e){let{selected:t}=await P.prompt({type:"multiselect",name:"selected",message:"Select users to grant access",choices:e.map(o=>({name:o.id,message:pe(o)}))});return t}function pe(e){return e.name&&e.name.trim()?`${e.name} <${e.email}>`:e.email}async function je(e){let{cwd:t,appId:o,verbose:r,devUrl:s}=e,c=!!(await M(t)).r2_buckets?.length,{d1DatabaseId:n,kvNamespaceId:p,r2BucketName:g,resourceName:d}=await j({appId:o,needsR2Bucket:c,verbose:r});await K({configPath:t,name:d,d1DatabaseId:n,d1DatabaseName:d,kvNamespaceId:p,r2BucketName:g,verbose:r});let u=await E("every-app-gateway");console.log(),await W({cwd:t,description:"Installing dependencies for Cloudflare deployment...",verbose:r}),await q({cwd:t,verbose:r}),await z({cwd:t,gatewayUrl:u,appId:o,verbose:r});let y=await E(d),U=await F(t);return await Y({appId:o,appUrl:y,verbose:r,appName:U.displayName,appDescription:U.description,devUrl:s}),await Q({gatewayUrl:u,appPath:t,appId:o,verbose:r}),{workerUrl:y,gatewayUrl:u}}export{je as a};
@@ -1,16 +0,0 @@
1
- import{d as u,e as m,g as x,r as k}from"./chunk-JWYVVDE3.js";import{c as f}from"./chunk-APTBZ2LQ.js";import p from"chalk";var C="every-app-gateway";async function G(t){try{return await fetch(t,{method:"HEAD",signal:AbortSignal.timeout(5e3)}),!0}catch(e){let o=e instanceof Error?e.message.toLowerCase():"",n=e instanceof Error&&"cause"in e&&e.cause?.code?.toLowerCase()||"";return!["ssl","tls","certificate","cert","cipher","handshake","secure"].some(a=>o.includes(a)||n.includes(a))}}async function E(t){try{let e=await fetch(`${t}/api/admin/has-owner`);return e.ok?(await e.json()).hasOwner:!1}catch{return!1}}async function O(){try{let t=await m();return await u(`/accounts/${t}/workers/scripts/${C}/settings`),!0}catch{return!1}}async function S(){return x(C)}async function $(){if(!await O())return{isDeployed:!1,hasOwner:!1,gatewayUrl:await S()};let e=await S();return{isDeployed:!0,hasOwner:await E(e),gatewayUrl:e}}async function A(){let{isDeployed:t,hasOwner:e,gatewayUrl:o}=await $();if(t||(console.log(p.yellow(`
2
- Gateway not deployed
3
- `)),console.log(`You need to deploy the Every App Gateway before creating or deploying apps.
4
- `),console.log(p.dim(` Run: npx everyapp gateway deploy
5
- `)),await f(1)),!e){let n=`${o}/sign-up`;console.log(p.yellow(`
6
- Owner account required
7
- `)),console.log(`You need to create an owner account on your Gateway before deploying apps.
8
- `),console.log(` ${p.cyan(n)}
9
- `),console.log(p.dim(` Visit the URL above to create your owner account, then run this command again.
10
- `)),await f(1)}return o}import{execa as I}from"execa";import{execa as g}from"execa";import c from"chalk";async function w(t,e,o){let{env:n,cwd:s,verbose:r=!1,description:a,logCommandToConsole:l=!0}=o;return r?P(t,e,o):l?(console.log(`Running: ${t} ${e.join(" ")}`),a&&console.log(c.dim(` ${a}`)),await g(t,e,{cwd:s,env:n,stdio:"pipe"})):await g(t,e,{cwd:s,env:n,stdio:"pipe"})}async function P(t,e,{description:o,cwd:n,env:s}){console.log(c.dim(` \u250C\u2500 Running: ${t} ${e.join(" ")}`)),o&&console.log(c.dim(` \u2502 ${o}`));let r=g(t,e,{cwd:n,env:s,stdio:void 0,all:!0});r.stdout&&r.stdout.on("data",l=>{l.toString().split(`
11
- `).forEach(i=>{i.trim()&&console.log(c.dim(` \u2502 ${i}`))})}),r.stderr&&r.stderr.on("data",l=>{l.toString().split(`
12
- `).forEach(i=>{i.trim()&&console.error(c.dim(` \u2502 ${i}`))})});let a=await r;return console.log(c.dim(` \u2514\u2500 Complete
13
- `)),a}async function U(){try{return await I("pnpm",["--version"],{stdio:"pipe"}),!0}catch{return!1}}async function V({cwd:t,description:e,verbose:o=!1}){let n=await U();try{n?await w("pnpm",["install"],{cwd:t,verbose:o,description:e}):await w("npx",["pnpm","install"],{cwd:t,verbose:o,description:e})}catch(s){throw new Error(`Failed to install dependencies with pnpm: ${s instanceof Error?s.message:"Unknown error"}`)}}import d from"chalk";import W from"node:path";async function y(t){let e=await m(),o=W.join(t,"wrangler.jsonc"),n=await k(o);return{accountId:e,workerName:n}}async function b(t){return await u(`/accounts/${t.accountId}/workers/scripts/${t.workerName}/secrets`)}async function M({cwd:t}){let e=await y(t);return(await b(e)).map(n=>n.name)}async function K({secretName:t,cwd:e,verbose:o=!1}){o&&console.log(d.dim(` Checking secret: ${t}`));let n=await y(e),r=(await b(n)).some(a=>a.name===t);return r&&o&&console.log(d.dim(` Secret already exists
14
- `)),r}async function z({secretName:t,secretValue:e,cwd:o,verbose:n=!1,description:s}){n&&s&&console.log(d.dim(` ${s}
15
- `));let r=await y(o);await u(`/accounts/${r.accountId}/workers/scripts/${r.workerName}/secrets`,{method:"PUT",body:JSON.stringify({name:t,text:e,type:"secret_text"})}),n&&console.log(d.green(`Created secret: ${t}
16
- `))}export{w as a,G as b,E as c,A as d,V as e,M as f,K as g,z as h};
@@ -1 +0,0 @@
1
- var p="everyapp";var i="Every App CLI - Deploy and manage apps.";var n="0.1.8";export{p as a,i as b,n as c};
@@ -1,7 +0,0 @@
1
- import{g as p}from"./chunk-JWYVVDE3.js";import r from"node:fs/promises";import c from"node:path";import f from"node:os";import m from"chalk";async function u(e,t,o={}){let n=o.exclude||[];await r.mkdir(t,{recursive:!0});let a=await r.readdir(e,{withFileTypes:!0});for(let i of a){let s=c.join(e,i.name),l=c.join(t,i.name);n.some(y=>i.name===y)||(i.isDirectory()?await u(s,l,o):await r.copyFile(s,l))}}async function T(e){try{return(await r.stat(e)).isDirectory()}catch{return!1}}async function D({targetDir:e,appId:t,gatewayUrl:o,gatewayAppApiToken:n}){let a=o??await p("every-app-gateway"),i=n?`GATEWAY_APP_API_TOKEN=${n}
2
- `:"",s=`# Vite client-side secrets
3
- VITE_APP_ID=${t}
4
- VITE_GATEWAY_URL=${a}
5
- # Set Cloudflare secrets locally
6
- GATEWAY_URL=${a}
7
- ${i}`;await Promise.all([r.writeFile(c.join(e,".env.local"),s)])}async function E(e){return await r.mkdtemp(c.join(f.tmpdir(),e))}async function x({tmpDir:e,verbose:t=!1}){try{await r.rm(e,{recursive:!0,force:!0}),t&&console.log(m.dim(` Removed: ${e}`))}catch{console.warn(m.yellow("\u26A0\uFE0F Warning: Failed to clean up temporary directory:"),e)}}export{u as a,T as b,D as c,E as d,x as e};
@@ -1,5 +0,0 @@
1
- import{g as p,h as c}from"./chunk-TUDP36IL.js";import{c as f}from"./chunk-JWYVVDE3.js";import u from"node:fs/promises";import y from"node:path";import*as l from"jsonc-parser";import{z as s}from"zod";var d="every-app.jsonc",A=s.object({appId:s.string().min(1,"appId cannot be empty"),displayName:s.string().min(1,"displayName cannot be empty").optional(),description:s.string().optional()});async function h(e){let n=y.join(e,d);try{let o=await u.readFile(n,"utf-8"),t=l.parse(o);return A.parse(t)}catch(o){if(o instanceof Error&&"code"in o&&o.code==="ENOENT")throw new Error("every-app.jsonc not found. Make sure you're running this command from an Every App project directory.");if(o instanceof s.ZodError){let t=o.issues.map(r=>r.message).join(", ");throw new Error(`Invalid every-app.jsonc: ${t}`)}throw o}}function T(e){return e.split("-").map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join(" ")}async function I(e,n){let o=y.join(e,d),t={...n,displayName:n.displayName??T(n.appId)},r=JSON.stringify(t,null,2)+`
2
- `;await u.writeFile(o,r)}async function O(e){return(await h(e)).appId}var w="GATEWAY_URL",E="GATEWAY_APP_API_TOKEN",N="/api/internal/app-token/provision",P=["provider:openai"];function k(e){if(!e.trim())return null;try{return JSON.parse(e)}catch{return null}}function m(e){if(!e||typeof e!="object")return null;let n=e.error;return typeof n!="string"||!n.trim()?null:n}async function v({gatewayUrl:e,appId:n}){let o=await f(),t=await fetch(`${e}${N}`,{method:"POST",headers:{authorization:`Bearer ${o}`,"content-type":"application/json"},body:JSON.stringify({appSlug:n,scopes:P})}),r=await t.text(),a=k(r);if(!t.ok){let g=m(a)||`Gateway token provisioning failed with status ${t.status}`;throw t.status===401||t.status===403?new Error(`${g}. Ensure your Cloudflare credentials target the same account that hosts this gateway.`):t.status===404?new Error("Gateway does not support token provisioning yet. Redeploy the gateway with `npx everyapp gateway deploy` and try again."):t.status===409?new Error(`${m(a)||"Gateway rejected token provisioning with a conflict"}. If this gateway is outdated, run \`npx everyapp gateway deploy\` and try again.`):new Error(g)}let i=a?.token;if(typeof i!="string"||!i.trim())throw new Error("Gateway returned an invalid token provisioning response");return i}async function R({gatewayUrl:e,appPath:n,appId:o,verbose:t=!1}){t&&console.log("Configuring Secrets...");try{if(await p({secretName:w,cwd:n,verbose:t})||await c({secretName:w,secretValue:e,cwd:n,verbose:t,description:`Setting GATEWAY_URL to: ${e}`}),!await p({secretName:E,cwd:n,verbose:t})){t&&console.log("Provisioning gateway app API token...");let i=await v({gatewayUrl:e,appId:o});await c({secretName:E,secretValue:i,cwd:n,verbose:t,description:"Setting GATEWAY_APP_API_TOKEN for gateway requests"})}t&&console.log(`Secret setup complete!
3
- `)}catch(r){throw console.error(`
4
- Failed to setup secrets`,r instanceof Error?`
5
- ${r.message}`:""),r}}export{h as a,I as b,O as c,v as d,R as e};
@@ -1 +0,0 @@
1
- import{c as d,e as c,h as f,s as D}from"./chunk-JWYVVDE3.js";import{execa as g}from"execa";async function m(s){let e=await D(s);if(!e.d1_databases||e.d1_databases.length===0)throw new Error("No D1 databases found in wrangler.jsonc. Please add a D1 database configuration.");let n=e.d1_databases[0];if(!n)throw new Error("No D1 database configuration found in wrangler.jsonc.");let a=n.database_name;if(!a)throw new Error("No database_name found in D1 database configuration in wrangler.jsonc.");let[t,r]=await Promise.all([c(),d()]),o=(await f(t)).find(u=>u.name===a);if(!o)throw new Error(`Database "${a}" not found in your Cloudflare account. Have you run deployment to create the database?`);return{CLOUDFLARE_ACCOUNT_ID:t,CLOUDFLARE_DATABASE_ID:o.uuid,CLOUDFLARE_API_TOKEN:r}}async function w(s,e,n){let{cwd:a,env:t={},verbose:r=!1}=n,i=await m(a),o={cwd:a,stdio:r?"inherit":"pipe",env:{...process.env,...t,...i}};await g(s,e,o)}export{m as a,w as b};
@@ -1,22 +0,0 @@
1
- import{a as b}from"./chunk-RHADZBGF.js";import{a as x}from"./chunk-BFYVBU6B.js";import{b as v,d as P}from"./chunk-ZR6E5CZN.js";import{a as k}from"./chunk-KIA3P5KV.js";import{a as y,b as w,d as u,e as h}from"./chunk-XKKQYCSJ.js";import{a as s,d as C}from"./chunk-TUDP36IL.js";import"./chunk-ZWRZQCN2.js";import{b as g}from"./chunk-JWYVVDE3.js";import{c as l}from"./chunk-APTBZ2LQ.js";import"./chunk-VOYWQ73B.js";import f from"chalk";async function A({url:o,targetDir:e,verbose:t=!1}){try{await s("git",["clone",o,e],{verbose:t,logCommandToConsole:!1})}catch(a){throw new Error(`Failed to clone repository from ${o}: ${a instanceof Error?a.message:"Unknown error"}`)}}async function T({targetDir:o,verbose:e=!1}){try{await s("git",["init"],{verbose:e,logCommandToConsole:!1,cwd:o}),await s("git",["add","."],{verbose:e,logCommandToConsole:!1,cwd:o}),await s("git",["commit","-m","Starter template"],{verbose:e,logCommandToConsole:!1,cwd:o})}catch(t){throw new Error(`Failed to initialize git repository: ${t instanceof Error?t.message:"Unknown error"}`)}}import J from"node:fs/promises";import L from"node:path";import d from"chalk";var G=["every-app.jsonc","every-app.json"];async function D(){let o=process.cwd();for(let e of G){let t=L.join(o,e);try{await J.access(t),console.log(d.yellow(`
2
- Already inside an Every App project`)),console.log(d.dim(` Found ${e}
3
- `)),console.log(`To create a new app, run app create from the directory where you store your projects.
4
- `),console.log("If you meant to deploy this app, run:"),console.log(d.dim(` npx everyapp app deploy
5
- `)),await l(1)}catch{}}}import E from"chalk";import{execa as _}from"execa";async function I(){try{await _("pnpm",["--version"],{stdio:"pipe"})}catch{console.error(E.red(`
6
- Error: pnpm is required but not installed. Please install it first:`)),console.error(E.cyan(` npm i -g pnpm
7
- `)),await l(1)}}import q from"enquirer";function z(o){return!o||o.trim().length===0?"App ID cannot be empty":o.length>64?"App ID must be 64 characters or less":/^[a-z][a-z0-9-]*$/.test(o)?!0:"App ID must be in kebab-case format (lowercase letters, numbers, and hyphens only, starting with a letter)"}async function R(o){console.log(`Project Configuration
8
- `);let e=await q.prompt({type:"input",name:"appId",message:"Enter your app ID (kebab-case format)",initial:o,validate:z});return console.log(),{appId:e.appId}}import U from"node:path";import W from"chalk";var V="https://github.com/every-app/every-app.git",H="templates/simple-todo";async function $({appId:o,verbose:e=!1}){e&&console.log(`Cloning template repository...
9
- `);let t=await u("every-app-create-");await A({url:V,targetDir:t,verbose:e}),e&&console.log(`Extracting template...
10
- `);let a=U.join(t,H),n=U.join(process.cwd(),o);if(await w(n))throw new Error(`Directory "${o}" already exists in the current location`);return await y(a,n,{exclude:["node_modules",".git","pnpm-lock.yaml","package-lock.json",".env.local",".env.production",".dev.vars","manual-steps.md"]}),e&&console.log(W.dim(` Template copied to ${n}
11
- `)),{tempDir:t,targetDir:n}}import j from"node:fs/promises";import M from"node:path";async function O({targetDir:o,appId:e}){let t=M.join(o,"package.json"),a=JSON.parse(await j.readFile(t,"utf-8"));a.name=e,await j.writeFile(t,JSON.stringify(a,null,2)+`
12
- `,"utf-8")}import r from"chalk";function F({appId:o,targetDir:e,gatewayUrl:t,workerUrl:a}){console.log(r.green(`Project created and deployed successfully!
13
- `)),console.log(r.dim(` Location: ${e}`)),console.log(r.dim(` App URL: ${r.cyan(a)}`)),console.log(r.dim(` Gateway: ${r.cyan(t)}`)),console.log(),console.log(`For local development:
14
- `),console.log(r.dim(` ${r.bold(`cd ${o}`)}`)),console.log(r.dim(` ${r.bold("pnpm run dev")}`)),console.log(r.dim(` ${r.bold(`
15
- Then, go to the Gateway and click the "Dev" button on the app to go to the app running locally instead of on cloudflare.`)}`)),console.log(),console.log(`To deploy updates after changes:
16
- `),console.log(r.dim(` ${r.bold("npx everyapp app deploy")}`)),console.log()}async function Fo(o,e){let t=o.verbose||!1,a=o.yes||!1;await D(),await I(),await g(),await C(),console.log(`
17
- Create a new Every App project
18
- `);let{appId:n}=await R(e);if(console.log(f.dim(`.
19
- `)),!await k("this app",a)){console.log(f.yellow(`
20
- App creation cancelled.
21
- `));return}let c=null;try{let{tempDir:p,targetDir:i}=await $({appId:n,verbose:t});c=p,await O({targetDir:i,appId:n}),await v(i,{appId:n});let{workerUrl:N,gatewayUrl:m}=await b({cwd:i,appId:n,verbose:t,devUrl:"http://localhost:3001"}),S=await P({gatewayUrl:m,appId:n});await x({targetDir:i,appId:n,verbose:t,gatewayUrl:m,gatewayAppApiToken:S}),await T({targetDir:i,verbose:t}),F({appId:n,targetDir:i,gatewayUrl:m,workerUrl:N})}catch(p){throw console.error(f.red(`
22
- Failed to create project:`),p instanceof Error?p.message:"Unknown error"),p}finally{c&&await h({tmpDir:c})}}export{Fo as default};
@@ -1,41 +0,0 @@
1
- import{a as W,b as h,c as S,d as P}from"./chunk-KIA3P5KV.js";import{d as U,e as L}from"./chunk-XKKQYCSJ.js";import{a as G,b as y,c as E,e as $,f as I,h as m}from"./chunk-TUDP36IL.js";import"./chunk-ZWRZQCN2.js";import{b as A,e as R,g as _,i as b,j as k,l as D,p as x,q as v,r as K}from"./chunk-JWYVVDE3.js";import{c as T}from"./chunk-APTBZ2LQ.js";import"./chunk-VOYWQ73B.js";import g from"chalk";import de from"node:path";import d from"chalk";var j="every-app-gateway",q="every-app-gateway";async function O({verbose:e=!1}={}){console.log(`
2
- Setting up your Cloudflare D1 Database and KV Store...
3
- `);let o=await R(),a=await Q(j,o,e),t=await X(q,o,e);return console.log(),{d1DatabaseId:a,kvNamespaceId:t,accountId:o}}async function Q(e,o,a){a&&console.log(` Checking D1 database: ${e}`);let t=await b(e,o);return a?t.wasCreated?console.log(d.green(` Created D1 database: ${e} (${t.id})
4
- `)):console.log(d.dim(` Linking to existing D1 database: ${e} (${t.id})
5
- `)):t.wasCreated?console.log(d.green(` D1 successfully created.
6
- `)):console.log(" D1 already set up."),t.id}async function X(e,o,a){a&&console.log(` Checking KV namespace: ${e}`);let t=await k(e,o);return a?t.wasCreated?console.log(d.green(` Created KV namespace: ${e} (${t.id})
7
- `)):console.log(d.dim(` Linking to existing KV namespace: ${e} (${t.id})
8
- `)):t.wasCreated?console.log(d.green(" KV successfully created.")):console.log(" KV already set up."),t.id}import te from"node:crypto";import oe from"node:path";import N from"node:crypto";import f from"chalk";function Z(){return N.randomBytes(32).toString("base64")}function ee(){let{privateKey:e,publicKey:o}=N.generateKeyPairSync("rsa",{modulusLength:2048,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return{privateKey:e,publicKey:o}}async function V({gatewayUrl:e,cloudflareAccountId:o,gatewayPath:a,verbose:t=!1}){try{let r=new Set(await I({cwd:a})),i=r.has("GATEWAY_URL"),p=r.has("CLOUDFLARE_ACCOUNT_ID"),s=r.has("BETTER_AUTH_SECRET"),u=r.has("JWT_PRIVATE_KEY"),w=r.has("JWT_PUBLIC_KEY"),n=!s||!u||!w;if(n&&(console.log("Configuring secrets for the authentication service (Better Auth)..."),console.log(f.dim(" BETTER_AUTH_SECRET - Session signing and encryption")),console.log(f.dim(" JWT_PRIVATE_KEY - Signs JWTs issued to your apps")),console.log(f.dim(" JWT_PUBLIC_KEY - Apps use this to verify JWTs")),console.log()),i||await m({secretName:"GATEWAY_URL",secretValue:e,cwd:a,verbose:t,description:`Setting GATEWAY_URL to: ${e}`}),p||await m({secretName:"CLOUDFLARE_ACCOUNT_ID",secretValue:o,cwd:a,verbose:t,description:`Setting CLOUDFLARE_ACCOUNT_ID to: ${o}`}),!s){let l=Z();await m({secretName:"BETTER_AUTH_SECRET",secretValue:l,cwd:a,verbose:t,description:"Generating new Better Auth secret..."})}if(u&&w)t&&console.log(f.dim(` JWT key pair already exists
9
- `));else if(!u&&!w){t&&console.log(f.dim(` Generating new JWT key pair...
10
- `));let l=ee();await m({secretName:"JWT_PRIVATE_KEY",secretValue:l.privateKey,cwd:a,verbose:t}),await m({secretName:"JWT_PUBLIC_KEY",secretValue:l.publicKey,cwd:a,verbose:t}),t&&console.log(f.green(`Created JWT key pair secrets
11
- `))}else throw new Error("JWT key pair is incomplete. Both JWT_PRIVATE_KEY and JWT_PUBLIC_KEY must exist together. Please delete the existing key and redeploy.");n&&console.log(t?`Secret setup complete!
12
- `:` Finished.
13
- `)}catch(r){throw console.error(`
14
- Failed to setup secrets`,r instanceof Error?`
15
- ${r.message}`:""),r}}async function J({gatewayPath:e,resources:o,workerUrl:a,verbose:t=!1}){let r=oe.join(e,"dist","server","wrangler.json");await v({configPath:r,d1DatabaseId:o.d1DatabaseId,kvNamespaceId:o.kvNamespaceId,verbose:t});let i=te.randomUUID();console.log(),await G("npx",["wrangler","deploy"],{cwd:e,description:`Deploying your Gateway to Cloudflare workers...
16
-
17
- This could take up to a minute.`,env:{...process.env,BETTER_AUTH_SECRET:i},verbose:t}),console.log(),await V({gatewayUrl:a,cloudflareAccountId:o.accountId,gatewayPath:e,verbose:t})}import C from"node:fs";import ae from"node:path";import{Readable as re}from"node:stream";import{pipeline as ne}from"node:stream/promises";import{createWriteStream as ie}from"node:fs";import{spawn as se}from"node:child_process";var ce="every-app",le="every-app",Y="every-app-gateway-build.tar.gz";function pe(){return`https://github.com/${ce}/${le}/releases/download/gateway-latest/${Y}`}async function me(e,o){let a=await fetch(e,{redirect:"follow"});if(!a.ok)throw new Error(`Failed to download file: ${a.status} ${a.statusText}`);if(!a.body)throw new Error("Response body is null");let t=ie(o),r=re.fromWeb(a.body);await ne(r,t)}async function B(e,o){return new Promise((a,t)=>{let r=se("tar",["-xzf",e,"-C",o]);r.on("error",t),r.on("close",i=>{i===0?a():t(new Error(`tar extraction failed with code ${i}`))})})}async function F(e,o=!1){console.log("Getting latest gateway release..."),C.mkdirSync(e,{recursive:!0});let a=pe();h(o,`URL: ${a}`);let t=ae.join(e,Y);try{await me(a,t)}catch(r){throw r instanceof Error&&r.message.includes("404")?new Error("Gateway release not found. Make sure a release has been published."):r}return S(o,`Downloaded to: ${t}`,"Extracting archive..."),await B(t,e),C.unlinkSync(t),h(o,`Extraction complete
18
- `),e}async function M(e,o,a=!1){if(console.log("Using local gateway tarball..."),!C.existsSync(e))throw new Error(`Local gateway tarball not found: ${e}`);return C.mkdirSync(o,{recursive:!0}),S(a,`Tarball: ${e}`,"Extracting archive..."),await B(e,o),h(a,`Extraction complete
19
- `),o}import c from"chalk";async function H({workerUrl:e,maxWaitMs:o=12e4,pollIntervalMs:a=3e3}){let t=`${e}/sign-up`;console.log(c.green(`
20
- Gateway deployment successful!
21
- `)),console.log(`Your Gateway will be available at: ${c.cyan(t)}
22
- `),console.log(c.dim("Waiting for SSL certificate to be provisioned..."));let r=Date.now();for(;Date.now()-r<o;)if(await new Promise(i=>setTimeout(i,a)),await y(e)){console.log(c.green(`SSL certificate is ready!
23
- `)),await E(e)?console.log(`Your Gateway is now live at: ${c.cyan(e)}
24
- `):(console.log(`Your Gateway is now live at: ${c.cyan(t)}
25
- `),console.log(c.dim(` Create an owner account to get started with your Gateway.
26
- `)));return}console.log(c.yellow(`
27
- SSL certificate is still being provisioned. This can take a few minutes.
28
- `)),console.log(c.dim(` The URL above will be accessible once the SSL certificate is ready.
29
- `)),console.log(c.dim(` Create an owner account to get started with your Gateway.
30
- `))}async function Xe(e){await A({showNewUserHelp:!0});let o=e.verbose||!1,a=e.localGateway,t=e.yes||!1;if(console.log(g.bold(`
31
- Every App Gateway
32
- `)),!await W("the Gateway",t)){console.log(`
33
- Deployment cancelled by user
34
- `);return}await x();let i=await O({verbose:o}),p=await U("gateway-deploy-");o&&console.log(g.dim(`Working directory: ${p}
35
- `));let s=null;try{let n=a?await M(a,p,o):await F(p,o),l=de.join(n,"wrangler.jsonc"),z=await K(l);s=await _(z),await J({gatewayPath:n,resources:i,workerUrl:s,verbose:o}),await $({cwd:n,verbose:o,description:"Installing dependencies for migrations..."}),await P({cwd:n,verbose:o})}catch(n){let l=await D(n);throw l&&(console.log(l.formatted),await T(1)),console.error(`
36
- Deployment failed:`,n instanceof Error?n.message:n),n}finally{await L({tmpDir:p,verbose:o})}if(!s)throw new Error("Worker URL not set properly during deployment");if(!await y(s)){await H({workerUrl:s});return}if(console.log(g.green(`
37
- Gateway deployment successful!
38
- `)),await E(s))console.log(`Your Gateway is now live at: ${g.cyan(s)}
39
- `);else{let n=`${s}/sign-up`;console.log(`Your Gateway is now live at: ${g.cyan(n)}
40
- `),console.log(g.dim(` Create an owner account to get started with your Gateway.
41
- `))}}export{Xe as deploy};
@@ -1,7 +0,0 @@
1
- import{a as p}from"./chunk-RHADZBGF.js";import{a as s}from"./chunk-BEO4F5X6.js";import{c}from"./chunk-ZR6E5CZN.js";import{a}from"./chunk-KIA3P5KV.js";import{d as l}from"./chunk-TUDP36IL.js";import"./chunk-ZWRZQCN2.js";import{b as n}from"./chunk-JWYVVDE3.js";import"./chunk-APTBZ2LQ.js";import"./chunk-VOYWQ73B.js";import o from"chalk";async function A(e){await n(),await l();let t=process.cwd(),i=e.verbose||!1,m=e.yes||!1;await s();let r=await c(t);if(console.log(o.bold(`
2
- Project: ${r}
3
- `)),!await a("this app",m)){console.log(o.red(`
4
- Deployment cancelled by user
5
- `));return}let{workerUrl:f,gatewayUrl:y}=await p({cwd:t,appId:r,verbose:i});console.log(o.green(`
6
- Deployment successful!`)),console.log(o.dim(` App URL: ${o.cyan(f)}`)),console.log(` Gateway: ${o.cyan(y)}
7
- `)}export{A as deploy};
@@ -1,6 +0,0 @@
1
- import{a as l}from"./chunk-BFYVBU6B.js";import{a as c}from"./chunk-BEO4F5X6.js";import{c as p,d as i}from"./chunk-ZR6E5CZN.js";import"./chunk-XKKQYCSJ.js";import{d as r}from"./chunk-TUDP36IL.js";import{b as n}from"./chunk-JWYVVDE3.js";import"./chunk-APTBZ2LQ.js";import"./chunk-VOYWQ73B.js";import o from"chalk";async function L(s){let t=process.cwd(),m=s.verbose||!1;await c(),await n();let a=await r(),e=await p(t),u=await i({gatewayUrl:a,appId:e});console.log(o.bold(`
2
- Setting up local environment for ${e}
3
- `)),await l({targetDir:t,appId:e,gatewayUrl:a,gatewayAppApiToken:u,verbose:m,installDeps:!0}),console.log(o.green(`Local setup complete!
4
- `)),console.log(`Run the app locally:
5
- `),console.log(o.dim(` ${o.bold("pnpm run dev")}
6
- `))}export{L as setupLocal};