everyapp 0.3.0-rc.2 → 0.3.0-rc.4

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 (138) hide show
  1. package/README.md +1 -1
  2. package/dist/access-YWM4BSBD.js +1 -0
  3. package/dist/activity-RTCAUMQS.js +14 -0
  4. package/dist/ai-UOYQFTAX.js +5 -0
  5. package/dist/apps-PEOBCDNU.js +14 -0
  6. package/dist/chunk-26KS6TD6.js +1 -0
  7. package/dist/chunk-3EADVHFN.js +15 -0
  8. package/dist/chunk-4LKLQOM7.js +7 -0
  9. package/dist/{chunk-PNLU5U3P.js → chunk-5IC3ZN52.js} +1 -1
  10. package/dist/{chunk-H7PDL3X5.js → chunk-AMCNAKYU.js} +1 -1
  11. package/dist/{chunk-23HJ5I2A.js → chunk-ASCNE7GS.js} +1 -1
  12. package/dist/{chunk-6OGVO7QK.js → chunk-BCTEWNN4.js} +1 -1
  13. package/dist/{chunk-W3JCQHHU.js → chunk-BK4NK34C.js} +1 -1
  14. package/dist/chunk-BWNZ6F4F.js +2 -0
  15. package/dist/chunk-DCFHBCCW.js +9 -0
  16. package/dist/{chunk-2Y5Q6A5K.js → chunk-DWTJ4OLZ.js} +1 -1
  17. package/dist/chunk-EP3IQ354.js +20 -0
  18. package/dist/{chunk-OP4DYXYI.js → chunk-EP4HRYXP.js} +1 -1
  19. package/dist/{chunk-HOUHG236.js → chunk-EQLY5I46.js} +1 -1
  20. package/dist/{chunk-YHJZMJYZ.js → chunk-F5XK23HV.js} +1 -1
  21. package/dist/{chunk-5PTNYZK6.js → chunk-FB2OC32C.js} +3 -3
  22. package/dist/chunk-FQ2A7YAP.js +57 -0
  23. package/dist/{chunk-OM2HDWVP.js → chunk-GAPQSINH.js} +1 -1
  24. package/dist/chunk-GJK6GAWO.js +1 -0
  25. package/dist/chunk-H4EZTXIK.js +1 -0
  26. package/dist/chunk-HJGZGZFE.js +32 -0
  27. package/dist/{chunk-CCWBPAKH.js → chunk-I7FNTTUY.js} +3 -3
  28. package/dist/chunk-KOBKGQ27.js +91 -0
  29. package/dist/{chunk-PS7S74DG.js → chunk-KQM6ZUX5.js} +1 -1
  30. package/dist/chunk-KVCL64LI.js +1 -0
  31. package/dist/{chunk-4JRIS6S6.js → chunk-LEEUODYR.js} +1 -1
  32. package/dist/{chunk-6PGUCTJ6.js → chunk-LI3YLKLC.js} +1 -1
  33. package/dist/chunk-MEIWV7FJ.js +20 -0
  34. package/dist/{configure-F7UZCJUG.js → chunk-MLTNW3AM.js} +2 -2
  35. package/dist/chunk-NDOEON54.js +4 -0
  36. package/dist/chunk-NW7SJPSP.js +37 -0
  37. package/dist/chunk-O64FPLGX.js +1 -0
  38. package/dist/chunk-ORGV2NNT.js +8 -0
  39. package/dist/chunk-PDPUGYJW.js +47 -0
  40. package/dist/chunk-QFTBDXLF.js +146 -0
  41. package/dist/{chunk-E3EPK27P.js → chunk-QJRZFIYC.js} +2 -2
  42. package/dist/chunk-QKHLRLK3.js +15 -0
  43. package/dist/{chunk-CZXHKPRZ.js → chunk-R2DF3ENZ.js} +1 -1
  44. package/dist/{chunk-IUOBIB5M.js → chunk-R7JOHK7Y.js} +2 -2
  45. package/dist/chunk-RL72BUT4.js +1 -0
  46. package/dist/chunk-RQBSTNL7.js +1 -0
  47. package/dist/{chunk-H6QQMY7B.js → chunk-S2G4G73L.js} +1 -1
  48. package/dist/{chunk-LXYMDZER.js → chunk-SGRGD7L4.js} +1 -1
  49. package/dist/{chunk-T2GD7RHS.js → chunk-TIYSZWP5.js} +1 -1
  50. package/dist/chunk-TUXKBLLJ.js +10 -0
  51. package/dist/chunk-U4ATZJEU.js +6 -0
  52. package/dist/chunk-V7BWZOSZ.js +26 -0
  53. package/dist/{chunk-J35DDCNU.js → chunk-VVKQJSF3.js} +1 -1
  54. package/dist/chunk-WVHJIYQ3.js +14 -0
  55. package/dist/{chunk-ZEXVHB22.js → chunk-XBD7PQN5.js} +1 -1
  56. package/dist/{chunk-N5GQLGEC.js → chunk-YAZHTVUV.js} +1 -1
  57. package/dist/configure-CAWCTPYY.js +1 -0
  58. package/dist/{create-2E5HVWYK.js → create-3ZWJQXPK.js} +2 -2
  59. package/dist/{db-HEQVTDTM.js → db-B7KO37SV.js} +1 -1
  60. package/dist/delete-CB3EPOU4.js +3 -0
  61. package/dist/deploy-5O7LV5OX.js +1 -0
  62. package/dist/dev-4JYCVVOZ.js +86 -0
  63. package/dist/{email-RLZFUFUN.js → email-SWJQXEUR.js} +1 -1
  64. package/dist/{events-2V5VRBWP.js → events-GJV2KVIU.js} +13 -13
  65. package/dist/{groups-HDG5DVFY.js → groups-NNTLSXMK.js} +1 -1
  66. package/dist/index.js +104 -95
  67. package/dist/install-UAG3CNYW.js +1 -0
  68. package/dist/{login-KHJBC64Z.js → login-QEKMLMUB.js} +1 -1
  69. package/dist/mcp-AFGVOM5D.js +1 -0
  70. package/dist/provider-622VM7UZ.js +29 -0
  71. package/dist/release-CXEX6O7F.js +1 -0
  72. package/dist/{restore-FFGYV7NO.js → restore-PGIVEA5P.js} +1 -1
  73. package/dist/secret-3LUDEDUW.js +1 -0
  74. package/dist/setup-PUD375AM.js +1 -0
  75. package/dist/{signin-AP3D4XM4.js → signin-EP5JLAT5.js} +2 -2
  76. package/dist/status-LK6DNLCI.js +5 -0
  77. package/dist/teardown-6RURRSME.js +22 -0
  78. package/dist/update-YJFTOZEV.js +1 -0
  79. package/dist/{workspace-CJC5I66L.js → workspace-VW7ZZRFP.js} +3 -3
  80. package/package.json +5 -5
  81. package/skills/build-every-app/SKILL.md +22 -13
  82. package/skills/build-every-app/patterns.md +16 -3
  83. package/skills/everyapp/SKILL.md +33 -18
  84. package/skills/everyapp/mcp.md +22 -8
  85. package/skills/everyapp/security-review.md +1 -1
  86. package/skills/everyapp/setup/README.md +18 -1
  87. package/skills/everyapp/setup/access.md +11 -7
  88. package/skills/everyapp/setup/ai-gateway.md +117 -0
  89. package/skills/everyapp/setup/ai.md +139 -0
  90. package/skills/everyapp/setup/context.md +2 -2
  91. package/skills/everyapp/setup/dataforseo.md +3 -3
  92. package/skills/everyapp/setup/email.md +1 -1
  93. package/skills/everyapp/setup/gateway.md +3 -3
  94. package/skills/everyapp/setup/google.md +8 -6
  95. package/skills/everyapp/setup/microsoft-365.md +4 -2
  96. package/skills/everyapp/setup/providers.md +27 -9
  97. package/skills/everyapp/setup/remote-mcp.md +1 -1
  98. package/skills/everyapp/setup/signin-apple.md +3 -3
  99. package/skills/everyapp/setup/signin-cloudflare.md +1 -1
  100. package/skills/everyapp/setup/signin-github.md +1 -1
  101. package/skills/everyapp/setup/signin-google.md +2 -2
  102. package/skills/everyapp/setup/signin-microsoft.md +1 -1
  103. package/skills/everyapp/setup/slack.md +2 -0
  104. package/dist/access-LGEN3ABJ.js +0 -1
  105. package/dist/activity-RSD4D66F.js +0 -12
  106. package/dist/apps-4RCFXT74.js +0 -13
  107. package/dist/chunk-AGTCKFRB.js +0 -22
  108. package/dist/chunk-BHMRY53V.js +0 -2
  109. package/dist/chunk-CB4U7H2G.js +0 -4
  110. package/dist/chunk-CZTEDWZ2.js +0 -22
  111. package/dist/chunk-EGEWRFVY.js +0 -1
  112. package/dist/chunk-ELK7QZ2M.js +0 -1
  113. package/dist/chunk-FJJSSVET.js +0 -33
  114. package/dist/chunk-GKBPYVP3.js +0 -25
  115. package/dist/chunk-IFCPALVC.js +0 -46
  116. package/dist/chunk-J455FAEN.js +0 -7
  117. package/dist/chunk-JYKRUS5C.js +0 -1
  118. package/dist/chunk-LYNBZ7RV.js +0 -57
  119. package/dist/chunk-M2QQ2UD7.js +0 -132
  120. package/dist/chunk-NFU4YFXB.js +0 -1
  121. package/dist/chunk-ONLNJXVQ.js +0 -32
  122. package/dist/chunk-RMF4YGD6.js +0 -98
  123. package/dist/chunk-TLRM3P7V.js +0 -15
  124. package/dist/chunk-WOVS3GV5.js +0 -10
  125. package/dist/chunk-ZECBN24L.js +0 -15
  126. package/dist/chunk-ZFCUH5PK.js +0 -7
  127. package/dist/delete-XCSIQIRS.js +0 -3
  128. package/dist/deploy-3QOZEZHC.js +0 -1
  129. package/dist/dev-JL3ZP5BT.js +0 -86
  130. package/dist/install-Z5FYXUYM.js +0 -1
  131. package/dist/mcp-EFDUKJ5V.js +0 -1
  132. package/dist/provider-EOI5PTFH.js +0 -13
  133. package/dist/release-74J5ZIL3.js +0 -1
  134. package/dist/secret-7FKKTLHB.js +0 -1
  135. package/dist/setup-PAKRCAFO.js +0 -1
  136. package/dist/status-RMWNHOEK.js +0 -4
  137. package/dist/teardown-E4JNKAZJ.js +0 -22
  138. package/dist/update-DWVZFNPS.js +0 -1
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # everyapp
2
2
 
3
- The CLI for [Every App](https://everyapp.com): deploy and run private web apps on your own Cloudflare account.
3
+ The CLI for [EveryApp](https://everyapp.com): deploy and run private web apps on your own Cloudflare account.
4
4
 
5
5
  Nothing is published while we work from the repository (`.github/RELEASE.md`), so the CLI runs from a checkout of it: `pnpm install` once at the root, then `pnpm everyapp <command>` anywhere in the repository (never `npx everyapp`, which is npm's old 0.2 CLI). It builds itself the first time and again whenever its source, or the SDK, perimeter or toolbus it bundles, changed (`bin/everyapp.js`). Requires Node.js 22.18 or newer.
6
6
 
@@ -0,0 +1 @@
1
+ import{a as d,b as e,c as f,d as g,e as h,f as i}from"./chunk-MEIWV7FJ.js";import"./chunk-QJRZFIYC.js";import{a,b,c}from"./chunk-TUXKBLLJ.js";import"./chunk-PDPUGYJW.js";import"./chunk-WVHJIYQ3.js";import"./chunk-GAPQSINH.js";import"./chunk-QKHLRLK3.js";import"./chunk-ORGV2NNT.js";import"./chunk-KVCL64LI.js";import"./chunk-LEEUODYR.js";import"./chunk-3EADVHFN.js";import"./chunk-EQLY5I46.js";import"./chunk-DCFHBCCW.js";import"./chunk-KOBKGQ27.js";import"./chunk-RL72BUT4.js";import"./chunk-TIYSZWP5.js";import"./chunk-AMCNAKYU.js";import"./chunk-I7FNTTUY.js";import"./chunk-RQBSTNL7.js";import"./chunk-FQ2A7YAP.js";export{c as APPS_APPLICATION_NAME,b as GATEWAY_APPLICATION_NAME,a as POLICY_NAME,e as off,d as on,f as show,i as showAccess,h as turnAccessOff,g as turnAccessOn};
@@ -0,0 +1,14 @@
1
+ import{a as v,c as w,d as x,e as A,f as g}from"./chunk-H4EZTXIK.js";import{O as L,P as R,R as U,U as z,V as D,W as j,X as B,Y as H,k as F,l as N}from"./chunk-QFTBDXLF.js";import"./chunk-GAPQSINH.js";import"./chunk-LEEUODYR.js";import"./chunk-DCFHBCCW.js";import"./chunk-KOBKGQ27.js";import"./chunk-RL72BUT4.js";import"./chunk-TIYSZWP5.js";import"./chunk-I7FNTTUY.js";import"./chunk-RQBSTNL7.js";import{Rc as y,Yc as $,bc as W,c as f,f as k,mb as I,pb as M}from"./chunk-FQ2A7YAP.js";import t from"chalk";var C="workspace.update";async function ue(e){await $(e,n=>J({flags:e,out:n}))}async function ge(e){await $(e,n=>V({flags:e,out:n}))}async function fe(e){await $(e,n=>Q({flags:e,out:n}))}async function ke(e){await $(e,n=>Z({flags:e,out:n}))}async function ye(e,n){await $(e,o=>ee({flags:e,out:o},n))}async function $e(e){await $(e,n=>te({flags:e,out:n}))}async function ve(e,n){await $(e,o=>ae({flags:e,out:o},n))}var u=e=>e.toLocaleString("en-US"),T=e=>e===0?t.dim("\u2013"):`$${(e/1e6).toFixed(4)}`,K=e=>`$${(e/1e6).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`;async function J(e){let{out:n,flags:o}=e,{ws:r}=await v(e),i=o.month??L(new Date(r.now)),s=await R(r,i),l=a=>{if(!a.callable)return t.dim("removed");if(a.capUnlimited)return t.dim("none (unlimited)");let h=[a.effectiveMonthlyCallCap===null?null:{kind:"calls",cap:u(a.effectiveMonthlyCallCap),source:a.capSource},a.effectiveMonthlyCostCapMicros===null?null:{kind:"cost",cap:K(a.effectiveMonthlyCostCapMicros),source:a.costCapSource}].filter(b=>b!==null);return h.length===0?t.dim("none"):h.map(b=>{let P=b.source==="default"?`${b.cap} ${t.dim("(default)")}`:b.cap;return a.pausedBy===b.kind?`${P} ${t.yellow("paused")}`:P}).join(" / ")},m=y(["APP","CALLS","FAILED","TOOL CALLS","TOKENS IN/OUT","COST","CAP"],s.byApp.map(a=>[a.appSlug??a.appRowId,u(a.calls),a.failures>0?t.yellow(u(a.failures)):t.dim("0"),u(a.toolCalls),`${u(a.inputTokens)}/${u(a.outputTokens)}`,T(a.costMicros),l(a)])),p=y(["MEMBER","CALLS","FAILED","TOOL CALLS","TOKENS IN/OUT","COST"],s.byMember.map(a=>[a.userId===""?t.dim("the apps themselves"):a.email??t.dim(`${a.userId} (no longer a member)`),u(a.calls),a.failures>0?t.yellow(u(a.failures)):t.dim("0"),u(a.toolCalls),`${u(a.inputTokens)}/${u(a.outputTokens)}`,T(a.costMicros)])),c=y(["PROVIDER","KIND","CALLS","FAILED","TOKENS IN/OUT","COST"],s.byTarget.map(a=>[a.target,a.kind,u(a.calls),a.failures>0?t.yellow(u(a.failures)):t.dim("0"),`${u(a.inputTokens)}/${u(a.outputTokens)}`,T(a.costMicros)])),d=s.byApp.reduce((a,h)=>a+h.calls,0),X=s.byApp.reduce((a,h)=>a+h.toolCalls,0),S=s.byApp.filter(a=>a.paused).length,E=`${r.organization.name}, ${i}: ${k(d,"provider call")} and ${k(X,"tool call")} across ${k(s.byApp.length,"app")}${S>0?`, ${S} paused`:""}`,O=[s.defaultMonthlyCallCap===null?null:`${u(s.defaultMonthlyCallCap)} calls a month`,s.defaultMonthlyCostCapMicros===null?null:`${K(s.defaultMonthlyCostCapMicros)} a month`].filter(a=>a!==null),G=O.length===0?"No workspace default cap.":`Workspace default cap: ${O.join(" or ")} for every app without its own.`;n.emit({type:"done",message:E,display:[E,t.dim(G),"",t.bold("By app"),...s.byApp.length>0?m:[t.dim("no apps")],"",t.bold("By member"),...s.byMember.length>0?p:[t.dim("no calls")],"",t.bold("By provider"),...s.byTarget.length>0?c:[t.dim("no calls")],"",t.dim(`Cap an app: ${f} workspace app cap <app> [<n|off>] [--usd <dollars|off>] [--unlimited]; the default: ${f} workspace cap default [<n|off>] [--usd <dollars|off>]`)].join(`
2
+ `),data:{organization:r.organization,...s}})}async function V(e){let{out:n,flags:o}=e,{ws:r}=await v(e),i=o.app===void 0?void 0:await N(r,o.app,{callable:!0}),s=o.user===void 0?void 0:await w(r,o.user),l=await U(r,{limit:o.limit,before:o.before,appRowId:i?.id,userId:s?.id,decision:o.decision,risk:o.risk,since:o.since}),m=y(["WHEN (UTC)","WHO","APP","TOOL","RISK","DECISION","OUTCOME","MS","CLIENT"],l.calls.map(d=>[A(d.createdAt),d.user.email??t.dim(d.user.id),d.app.slug?`${d.app.slug}${d.app.removed?t.dim(" (removed)"):""}`:t.dim("gateway"),d.tool.via?`${d.tool.name} ${t.dim(`via ${d.tool.via}`)}`:d.tool.name,d.tool.risk??t.dim("\u2013"),d.decision==="allowed"?t.green("allowed"):t.red(`blocked${d.reason?t.dim(` (${d.reason})`):""}`),d.outcome,d.durationMs===null?t.dim("\u2013"):String(d.durationMs),d.credential.clientName??d.credential.clientInfo??t.dim(d.credential.kind)])),p=l.nextBefore?`${l.nextBefore.createdAt}:${l.nextBefore.id}`:null,c=`${k(l.calls.length,"tool call")} in ${r.organization.name}${l.nextBefore?" (more before this page)":""}`;n.emit({type:"done",message:c,display:[l.calls.length>0?m.join(`
3
+ `):t.dim("No tool calls match."),...p?[t.dim(`Next page: ${f} workspace activity --before ${p}`)]:[]].join(`
4
+ `),data:{organization:r.organization,calls:l.calls.map(d=>({...d,createdAt:g(d.createdAt)})),nextBefore:p,...p?{next:[{command:`${f} workspace activity --before ${p}`,note:"the next page"}]}:{}}})}async function Y(e,n){try{return(await F(e,n)).id}catch(o){if(!(o instanceof W)||o.code!=="USER_NOT_FOUND")throw o;return n.trim()}}async function Q(e){let{out:n,flags:o}=e,{ws:r}=await v(e),i=o.actor===void 0?void 0:await Y(r,o.actor),s=await z(r,{limit:o.limit,before:o.before,actorId:i,type:o.type,since:o.since}),l=y(["WHEN (UTC)","WHO","WHAT","SUBJECT","TYPE"],s.events.map(c=>[A(c.time),I(c.actor),c.label,M(c.subject)||t.dim("\u2013"),t.dim(c.type)])),m=s.nextBefore?`${s.nextBefore.time}:${s.nextBefore.id}`:null,p=`${k(s.events.length,"audit event")} in ${r.organization.name}${s.nextBefore?" (more before this page)":""}`;n.emit({type:"done",message:p,display:[s.events.length>0?l.join(`
5
+ `):t.dim("No audit events match."),t.dim("Kept 90 days. Test pings and tool calls are left out unless --type names them (tool.*, *): workspace activity lists the calls."),...m?[t.dim(`Next page: ${f} workspace audit --before ${m}`)]:[]].join(`
6
+ `),data:{organization:r.organization,events:s.events.map(c=>({...c,time:g(c.time)})),nextBefore:m,...m?{next:[{command:`${f} workspace audit --before ${m}`,note:"the next page"}]}:{}}})}var _=e=>({id:e.id,user:e.user,name:e.name,prefix:e.prefix,app:e.app.slug,scopes:e.scopes,active:e.active,createdAt:g(e.createdAt),expiresAt:g(e.expiresAt),lastUsedAt:g(e.lastUsedAt),revokedAt:g(e.revokedAt)});async function Z(e){let{out:n,flags:o}=e,{ws:r}=await v(e),i=o.user===void 0?void 0:await w(r,o.user),s=await D(r,i?.id),l=o.all?s:s.filter(c=>c.active),m=y(["ID","MEMBER","NAME","PREFIX","APP","SCOPES","STATE","LAST USED","EXPIRES"],l.map(c=>[c.id,c.user.email,c.name,`${c.prefix}\u2026`,c.app.slug??t.dim("all apps"),c.scopes.join(","),c.revokedAt!==null?t.dim("revoked"):c.active?t.green("active"):t.yellow("expired"),A(c.lastUsedAt),A(c.expiresAt)])),p=`${k(l.length,o.all?"personal access token":"active personal access token")}${i?` of ${x(i)}`:""} in ${r.organization.name}${!o.all&&s.length>l.length?` (${s.length-l.length} revoked or expired: --all)`:""}`;n.emit({type:"done",message:p,display:[l.length>0?m.join(`
7
+ `):t.dim(p),t.dim(`Revoke one: ${f} workspace token revoke <id>. Tokens are made in Admin \u2192 Tokens; a value is never shown again.`)].join(`
8
+ `),data:{organization:r.organization,tokens:l.map(_)}})}async function ee(e,n){let{out:o}=e,{ws:r}=await v(e);o.emit({type:"step",step:C,status:"start",message:`Revoking the token ${n}...`});let{token:i,already:s}=await j(r,n);o.emit({type:"step",step:C,status:"ok",message:`Revoked ${i.name}`,data:{tokenId:i.id,already:s}});let l=s?[`${i.user.email}'s token ${i.name} (${i.prefix}\u2026) was revoked already, on ${A(i.revokedAt)} UTC.`]:[`Revoked ${i.user.email}'s token ${i.name} (${i.prefix}\u2026).`,"It stops working on its next request."];o.emit({type:"done",message:l.join(`
9
+ `),display:[l[0],...l.slice(1).map(m=>t.dim(m))].join(`
10
+ `),data:{organization:r.organization,token:_(i),already:s}})}var q=e=>({id:e.id,user:e.user,clientName:e.clientName,clientDomain:e.clientDomain,redirectHost:e.redirectHost,apps:e.apps,access:e.access,createdAt:g(e.createdAt),lastUsedAt:g(e.lastUsedAt),revokedAt:g(e.revokedAt),revokedReason:e.revokedReason});async function te(e){let{out:n,flags:o}=e,{ws:r}=await v(e),i=o.user===void 0?void 0:await w(r,o.user),s=await B(r,i?.id),l=y(["ID","MEMBER","AI APP","APPS","ACCESS","LAST USED","SINCE"],s.map(p=>[p.id,p.user.email,`${p.clientName}${p.clientDomain?t.dim(` (${p.clientDomain})`):""}`,p.apps==="all"?"all":p.apps.join(", ")||t.dim("none"),p.access==="write"?"read & write":"read",A(p.lastUsedAt),A(p.createdAt)])),m=`${k(s.length,"AI connection")}${i?` of ${x(i)}`:""} in ${r.organization.name}`;n.emit({type:"done",message:m,display:[s.length>0?l.join(`
11
+ `):t.dim(m),t.dim(`Revoke one: ${f} workspace connection revoke <id>`)].join(`
12
+ `),data:{organization:r.organization,connections:s.map(q)}})}async function ae(e,n){let{out:o}=e,{ws:r}=await v(e);o.emit({type:"step",step:C,status:"start",message:`Revoking the connection ${n}...`});let{connection:i,already:s}=await H(r,n);o.emit({type:"step",step:C,status:"ok",message:`Revoked ${i.clientName}`,data:{connectionId:i.id,already:s}});let l=s?[`${i.user.email}'s connection from ${i.clientName} was revoked already${i.revokedReason?` (${i.revokedReason})`:""}.`]:[`Revoked ${i.user.email}'s connection from ${i.clientName}.`,"The client is out on its next request; its grant in the Gateway's authorization server lapses on its own."];o.emit({type:"done",message:l.join(`
13
+ `),display:[l[0],...l.slice(1).map(m=>t.dim(m))].join(`
14
+ `),data:{organization:r.organization,connection:q(i),already:s}})}export{ge as activity,fe as audit,ve as connectionRevoke,$e as connections,V as listActivity,Q as listAudit,te as listConnections,Z as listTokens,J as reportUsage,ae as revokeConnection,ee as revokeToken,ye as tokenRevoke,ke as tokens,ue as usage};
@@ -0,0 +1,5 @@
1
+ import{c as P,d as u,e as T,j as k}from"./chunk-QFTBDXLF.js";import{B as h}from"./chunk-PDPUGYJW.js";import"./chunk-WVHJIYQ3.js";import"./chunk-GAPQSINH.js";import{a as E,f as D}from"./chunk-26KS6TD6.js";import"./chunk-ORGV2NNT.js";import"./chunk-KVCL64LI.js";import"./chunk-LEEUODYR.js";import"./chunk-3EADVHFN.js";import"./chunk-HJGZGZFE.js";import"./chunk-EQLY5I46.js";import{c as _,e as b}from"./chunk-DCFHBCCW.js";import"./chunk-KOBKGQ27.js";import"./chunk-RL72BUT4.js";import"./chunk-TIYSZWP5.js";import"./chunk-AMCNAKYU.js";import{a as I}from"./chunk-I7FNTTUY.js";import"./chunk-RQBSTNL7.js";import{P as g,Qc as C,Rc as f,Yc as c,bc as $,c as r,k as w}from"./chunk-FQ2A7YAP.js";import d from"chalk";var j="everyapp",x="ai.update";async function te(t){await c(t,e=>F({flags:t,out:e}))}async function ae(t){await c(t,e=>O({flags:t,out:e}))}async function oe(t,e){await c(t,a=>S({flags:t,out:a},e))}async function ne(t){await c(t,e=>N({flags:t,out:e},t.id))}async function ie(t){await c(t,e=>K({flags:t,out:e}))}async function m(t){let{flags:e,out:a,createCf:n}=t,s=await b({gateway:_(e.gateway),accountId:e["account-id"],interactive:I(e.json??!1),login:{json:e.json,out:a,step:"login"},createCf:n}),o=await k(s.db,s.deployer,{now:t.now?.()});return{gateway:s,ws:o}}function Y(t){let{resolution:e,aiGateway:a}=t;return{provider:e.provider,label:e.label,model:e.model,source:e.source,configured:e.configured,settings:e.settings,via:e.via,chat:e.chat,...e.embeddings?{embeddings:e.embeddings}:{},candidates:e.candidates,...e.problem?{problem:e.problem}:{},aiGateway:a}}var A=t=>`${t.label} (${t.model})`;function W(t,e){return t.map(a=>[a.id===e?d.bold(a.id):a.id,a.label,a.configured?d.green("set"):d.dim("not set"),a.settings.join(" "),a.model,a.id===e?d.green("\u2190 the default"):""])}function R(t){let{resolution:e}=t;switch(e.source){case"setting":return e.configured?`Chosen with ${r} ai default; ${e.settings.join(" and ")} ${e.settings.length===1?"is":"are"} set.`:`Chosen with ${r} ai default, but ${w(e.settings)} ${e.settings.length===1?"isn't":"aren't"} set: apps get ai_default_not_configured until ${r} secret set ${e.settings.join(" ")}.`;case"order":return`Nothing chosen: the first provider of the order whose key is set. ${r} ai default <provider> picks another.`;case"none":return`Nothing is set yet: apps that need a chat model show "Needs setup" until one key is set (${r} secret set ${e.settings.join(" ")}, or any provider's below).`}}async function F(t){let{out:e}=t,{gateway:a,ws:n}=await m(t),s=await u(a.cf,n),{resolution:o,aiGateway:i}=s,p=[...C([{label:"Default",value:o.configured?A(o):`${A(o)} ${d.yellow("not configured")}`},{label:"Route",value:`/api/ai/default/v1/chat/completions \u2192 ${o.chat.path}${o.embeddings?`; /v1/embeddings \u2192 ${o.embeddings.path}`:""}`},{label:"Through",value:i.on?"Cloudflare AI Gateway":`direct (${r} ai gateway on puts AI Gateway in front)`}]),"",R(s),...o.problem?[d.yellow(`The stored choice can't serve: ${o.problem}.`)]:[],"",...f(["Provider","Name","Key","Setting","Model",""],W(o.candidates,o.provider))];e.emit({type:"done",message:p.join(`
2
+ `),data:Y(s)})}async function O(t){let{out:e}=t,{gateway:a,ws:n}=await m(t),s=await u(a.cf,n),{resolution:o}=s;e.emit({type:"done",message:[...f(["Provider","Name","Key","Setting","Model",""],W(o.candidates,o.provider)),"",`An app that pins a provider lists it under providers; one that takes the default says ai: { chat: true }. ${r} ai default <provider>[/<model>] chooses.`].join(`
3
+ `),data:{candidates:o.candidates,provider:o.provider,aiGateway:s.aiGateway}})}async function S(t,e){let{out:a}=t,n=T(e),{gateway:s,ws:o}=await m(t);a.emit({type:"step",step:x,status:"start",message:"Setting the default model provider..."});let i=await P(o,n),p=await u(s.cf,o),{resolution:l}=p,y=v=>v===null?"the shipped order":g(v);a.emit({type:"step",step:x,status:"ok",message:`${o.organization.name}: the default model provider is ${y(n)}`,data:{choice:n===null?null:g(n),was:i.was===null?null:g(i.was)}});let G=[i.changed?`${o.organization.name}: the default is ${y(n)} (was ${y(i.was)}).`:`${o.organization.name} had ${y(n)} already. Nothing changed.`,`Apps that ask for the default get ${A(l)} on the Gateway within 30 seconds.`];l.configured||G.push(d.yellow(`${w(l.settings)} ${l.settings.length===1?"isn't":"aren't"} set: until then those apps get ai_default_not_configured. Set it: ${r} secret set ${l.settings.join(" ")}`)),a.emit({type:"done",message:G.join(`
4
+ `),data:Y(p)})}async function N(t,e=j){let{out:a}=t,n=e.trim().toLowerCase();if(!E(n))throw new $("AI_GATEWAY_ID_INVALID",`${e} isn't a valid AI Gateway id: lowercase letters, digits and single hyphens, 64 characters at most`,{fix:`${r} ai gateway on --id <name>`});let s=await m(t),o=t.ensureAiGateway??D;a.emit({type:"step",step:"ai.gateway",status:"start",message:`Finding AI Gateway ${n}...`});let i=await o(s.gateway.cf,{id:n,accountId:s.gateway.accountId});a.emit({type:"step",step:"ai.gateway",status:"ok",message:i.created?`Made AI Gateway ${i.id}`:`AI Gateway ${i.id} exists`,data:{id:i.id,url:i.url,created:i.created}}),await h(s.gateway,{AI_GATEWAY_ID:i.id},{flags:t.flags,out:a}),a.emit({type:"done",message:[`Every model call to a provider AI Gateway fronts goes through ${i.url} from the Gateway's next request, the provider's own key still on it.`,`Logs: Cloudflare dashboard \u2192 AI \u2192 AI Gateway \u2192 ${i.id}. For an authenticated gateway: ${r} secret set AI_GATEWAY_API_KEY.`].join(`
5
+ `),data:{id:i.id,url:i.url,created:i.created}})}async function K(t){let{out:e}=t,a=await m(t),n=await u(a.gateway.cf,a.ws);if(!n.names.includes("AI_GATEWAY_ID")){e.emit({type:"done",message:"AI Gateway isn't in front: AI_GATEWAY_ID isn't set. Nothing changed.",data:{on:!1,changed:!1}});return}await h(a.gateway,{AI_GATEWAY_ID:null},{flags:t.flags,out:e}),e.emit({type:"done",message:`Model calls go direct from the Gateway's next request. The AI Gateway and its logs stay in the account${n.names.includes("AI_GATEWAY_API_KEY")?`; AI_GATEWAY_API_KEY stays until ${r} secret unset AI_GATEWAY_API_KEY`:""}.`,data:{on:!1,changed:!0}})}export{S as chooseDefault,ie as gatewayOff,ne as gatewayOn,ae as list,O as listCandidates,oe as setDefault,te as show,F as showDefault,K as turnGatewayOff,N as turnGatewayOn};
@@ -0,0 +1,14 @@
1
+ import{a as v,g as X,h as O,j as Y}from"./chunk-H4EZTXIK.js";import{G as H,I as J,J as K,K as q,L as B,M as Q,l as V}from"./chunk-QFTBDXLF.js";import{a as D,d as _,e as L}from"./chunk-GAPQSINH.js";import"./chunk-LEEUODYR.js";import"./chunk-DCFHBCCW.js";import"./chunk-KOBKGQ27.js";import{a as R}from"./chunk-RL72BUT4.js";import"./chunk-TIYSZWP5.js";import"./chunk-I7FNTTUY.js";import"./chunk-RQBSTNL7.js";import{Rc as E,Yc as $,bc as N,c as C,f as w,fc as F}from"./chunk-FQ2A7YAP.js";import m from"chalk";var h="workspace.update";async function ke(e){await $(e,n=>re({flags:e,out:n}))}async function Ce(e,n){await $(e,a=>pe({flags:e,out:a},n))}async function Se(e,n){await $(e,a=>ce({flags:e,out:a},n))}var ee=e=>e==="off"?null:e;async function Ae(e,n,a){await $(e,r=>le({flags:e,out:r},n,a===void 0?void 0:ee(a),e.unlimited??!1,e.usd))}async function Me(e,n){await $(e,a=>ue({flags:e,out:a},n===void 0?void 0:ee(n),e.usd))}function se(e){if(!e)return null;try{let n=JSON.parse(e);return n&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}function ie(e,n){let a=se(e.manifest);if(!a||e.tier==="dispatch"||e.status==="pending")return null;try{return L(a)?_({manifest:a,appId:e.appSlug,gatewayNames:n,secretNames:R(e.secretNames)}).setup:null}catch{return null}}var P=(e,n)=>({id:e.id,appId:e.appSlug,name:e.name,description:e.description,status:e.status,scope:e.scope,tier:e.tier,hostname:e.hostname,everyone:e.everyone,accessCount:e.accessCount,...n===void 0?{}:{setup:n}});async function re(e){let{out:n}=e,{gateway:a,ws:r}=await v(e),u=await H(r),s=null;try{s=await D(a.cf)}catch(t){n.emit({type:"warning",code:"SETTINGS_UNKNOWN",message:`Couldn't list the Gateway's settings, so what each app needs set is unknown
2
+ ${F(t)}`})}let p=u.map(t=>({app:t,setup:ie(t,s)})),l=E(["APP","NAME","STATUS","WHO CAN OPEN","SETUP"],p.map(({app:t,setup:o})=>[t.appSlug,t.name,t.status==="active"?m.green(t.status):m.yellow(t.status),t.scope==="shared"?"everyone, every organization":t.everyone?`everyone ${m.dim(`(${t.accessCount})`)}`:w(t.accessCount,"member"),o===null?m.dim("\u2013"):o.ready?m.green("ready"):m.yellow(`needs ${o.unmet.map(g=>g.names.join(" or ")).join(", ")}`)])),c=p.filter(({setup:t})=>t&&!t.ready);n.emit({type:"done",message:`${w(u.length,"app")} in ${r.organization.name}${c.length>0?`, ${c.length} needing setup`:""}`,display:u.length>0?l.join(`
3
+ `):m.dim(`No apps in ${r.organization.name} yet.`),data:{organization:r.organization,apps:p.map(({app:t,setup:o})=>P(t,o)),...c.length>0?{next:c.flatMap(({app:t,setup:o})=>o?.command?[{command:o.command.command,note:t.appSlug}]:[])}:{}}})}async function pe(e,n){let{out:a,flags:r}=e,{ws:u}=await v(e);a.emit({type:"step",step:h,status:"start",message:`Updating ${n}...`});let{app:s,granted:p}=await J(u,n,{name:r.name,description:r.description,everyone:r.everyone===void 0?void 0:r.everyone==="on"});a.emit({type:"step",step:h,status:"ok",message:`Updated ${s.appSlug}`,data:{appRowId:s.id,granted:p}});let l=[`${s.appSlug} is "${s.name}"${s.description?`: ${s.description}`:""}.`,s.scope==="shared"?"A shared app: every member of every organization can open it.":s.everyone?`Available to everyone in ${u.organization.name}${p>0?` (${w(p,"member")} granted now)`:""}; new members get it on joining.`:`Private: ${w(s.accessCount,"member")} can open it (workspace app access ${s.appSlug}).`];a.emit({type:"done",message:l.join(`
4
+ `),display:[l[0],m.dim(l[1])].join(`
5
+ `),data:{organization:u.organization,app:P(s),granted:p}})}async function ce(e,n){let{out:a,flags:r}=e,{change:u}=Y(r),{ws:s}=await v(e),p=await V(s,n),l=[],c=[],t;u?(a.emit({type:"step",step:h,status:"start",message:`Changing who can open ${p.appSlug}...`}),{granted:l,revoked:c,users:t}=await q(s,p,u),a.emit({type:"step",step:h,status:"ok",message:`${p.appSlug}: ${w(l.length,"grant")} added, ${c.length} revoked`,data:{appRowId:p.id,granted:l.length,revoked:c.length}})):t=await K(s,p);let o=t.filter(i=>i.direct||i.viaGroups.length>0),g=E(["EMAIL","ROLE","STATUS","DIRECT","VIA GROUPS"],t.map(i=>[i.email,i.primaryRole??i.role,X(i),i.direct?m.green("yes"):m.dim("no"),i.viaGroups.length>0?i.viaGroups.join(", "):m.dim("\u2013")])),f=u?`${p.appSlug}: granted ${l.length>0?l.map(i=>i.email).join(", "):"nobody"}, revoked ${c.length>0?c.map(i=>i.email).join(", "):"nobody"}; ${w(o.length,"member")} can open it now.`:`${w(o.length,"member")} of ${t.length} can open ${p.appSlug}${p.everyone?" (available to everyone)":""}.`;a.emit({type:"done",message:f,display:[f,g.join(`
6
+ `)].join(`
7
+ `),data:{organization:s.organization,app:P({...p,accessCount:o.length}),users:t.map(i=>({...O(i),direct:i.direct,viaGroups:i.viaGroups})),...u?{granted:l.map(O),revoked:c.map(O)}:{}}})}var U=e=>`${e.toLocaleString("en-US")} calls a month`,T=e=>`$${(e/1e6).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})} a month`;function ne(e,n){let a=[e===null?null:U(e),n===null?null:T(n)].filter(r=>r!==null);return a.length?a.join(" or "):null}function Z(e,n,a=null){return n?"no cap at all":ne(e,a)??"no cap of its own"}function te(e){return e===null?null:{subscriptionId:e,message:`Owners and admins are emailed at 80% and at the cap (the built-in Cap alerts subscription; ${C} events list shows it).`}}var I="a provider tool answers a tool error naming the cap, and an app's brokered call gets 429 app_monthly_cap_exceeded until the next UTC month.",ae="A dollar cap counts only the cost a provider reports (OpenRouter, DataForSEO); other calls count toward the call cap alone.",oe=e=>e===void 0?void 0:e==="off"?null:e;async function le(e,n,a,r=!1,u){let{out:s}=e,p=oe(u);if(r&&(a!==void 0||p!==void 0))throw new N("INVALID_VALUE",`--unlimited takes no number, no off and no --usd
8
+ An app has caps of its own (a number of calls, --usd, or both), no cap whatever the workspace defaults (--unlimited), or neither (off).`,{fix:`give --unlimited alone: ${C} workspace app cap ${n} --unlimited`});if(!r&&a===void 0&&p===void 0)throw new N("MISSING_ARGUMENT",`Missing the cap
9
+ Give a number of calls per month, --usd with dollars per month, off for no cap of its own, or --unlimited.`,{data:{usage:`${C} workspace app cap <app> [<n|off>] [--usd <dollars|off>] [--unlimited] [flags]`}});let{ws:l}=await v(e);s.emit({type:"step",step:h,status:"start",message:`Setting ${n}'s cap...`});let c=await B(l,n,a,{unlimited:r,costUsd:p}),{app:t,was:o,wasUnlimited:g,wasCostCapMicros:f,effective:i,before:S,effectiveCost:d,beforeCost:b,capAlertsId:k}=c,W=c.cap===o&&c.costCapMicros===f&&r===g,y=Z(c.cap,r,c.costCapMicros),G={cap:c.cap,costCapMicros:c.costCapMicros,unlimited:r,was:o,wasCostCapMicros:f,wasUnlimited:g,effectiveCap:i.cap,capSource:i.source,effectiveCostCapMicros:d.cap,costCapSource:d.source};s.emit({type:"step",step:h,status:"ok",message:`${t.appSlug}: ${y}`,data:{appRowId:t.id,...G}});let A=[i.cap===null?null:i.source==="default"?`The workspace default of ${U(i.cap)}`:U(i.cap),d.cap===null?null:d.source==="default"?`the workspace default of ${T(d.cap)}`:T(d.cap)].filter(j=>j!==null),x=A.length===0?S.cap===null&&b.cap===null?"Its provider calls are not capped.":"Its provider calls are no longer capped.":d.cap===null?i.source==="default"?`The workspace default of ${U(i.cap)} binds it; past it, ${I}`:`Past it, ${I}`:`${A.join(" and ")} ${A.length>1?"bind":"binds"} it; past ${A.length>1?"either":"it"}, ${I}`,M=[W?`${t.appSlug} had ${y} already. Nothing changed.`:`${t.appSlug}: ${y} for ${l.organization.name} (was ${Z(o,g,f)}).`,x.charAt(0).toUpperCase()+x.slice(1),...d.cap===null?[]:[ae]],z=te(k);z&&M.push(z.message),s.emit({type:"done",message:M.join(`
10
+ `),display:[M[0],...M.slice(1).map(j=>m.dim(j))].join(`
11
+ `),data:{organization:l.organization,app:P(t),...G,capAlerts:z}})}async function ue(e,n,a){let{out:r}=e,u=oe(a);if(n===void 0&&u===void 0)throw new N("MISSING_ARGUMENT",`Missing the default
12
+ Give a number of calls per month, --usd with dollars per month, or off.`,{data:{usage:`${C} workspace cap default [<n|off>] [--usd <dollars|off>] [flags]`}});let{ws:s}=await v(e);r.emit({type:"step",step:h,status:"start",message:"Setting the workspace default cap..."});let p=await Q(s,n,u),{was:l,wasCostCapMicros:c,capAlertsId:t}=p,o={cap:p.cap,costCapMicros:p.costCapMicros},g=(k,W)=>{let y=ne(k,W);return y===null?"no default cap":`a default cap of ${y}`},f={cap:o.cap,was:l,costCapMicros:o.costCapMicros,wasCostCapMicros:c};r.emit({type:"step",step:h,status:"ok",message:`${s.organization.name}: ${g(o.cap,o.costCapMicros)}`,data:f});let i=o.cap===null&&o.costCapMicros===null,S=o.cap!==null&&o.costCapMicros!==null,d=[o.cap===l&&o.costCapMicros===c?`${s.organization.name} had ${g(o.cap,o.costCapMicros)} already. Nothing changed.`:`${s.organization.name}: ${g(o.cap,o.costCapMicros)} (was ${g(l,c)}).`,i?"Every app without a cap of its own is uncapped on the Gateway within 30 seconds; an app's own cap or --unlimited stays.":`Every app without a cap or --unlimited of its own is held to ${S?"them":"it"} on the Gateway within 30 seconds; past ${S?"either":"it"}, ${I}`,...o.costCapMicros===null?[]:[ae]],b=te(t);b&&d.push(b.message),r.emit({type:"done",message:d.join(`
13
+ `),display:[d[0],...d.slice(1).map(k=>m.dim(k))].join(`
14
+ `),data:{organization:s.organization,...f,capAlerts:b}})}export{Se as appAccess,ce as appAccessCommand,Ae as appCap,Ce as appSet,ke as apps,Me as capDefault,re as listApps,le as setCap,ue as setDefaultCap,pe as updateApp};
@@ -0,0 +1 @@
1
+ import{e as w}from"./chunk-HJGZGZFE.js";import{A as c,B as y}from"./chunk-RQBSTNL7.js";import{Dc as s,Xb as u,hc as l}from"./chunk-FQ2A7YAP.js";function p(t){return u(t)}function g(t){return{collectLogs:t.collectLogs??!0,cacheTtl:t.cacheTtl??0}}function C(t,a){let e=g(a);return(t.collect_logs??!1)===e.collectLogs&&(t.cache_ttl??0)===e.cacheTtl}var m=["authentication","byok_only","cache_invalidate_on_update","log_classification","log_management","log_management_strategy","logpush","logpush_public_key","rate_limiting_interval","rate_limiting_limit","rate_limiting_technique","retry_backoff","retry_delay","retry_max_attempts","store_id","workers_ai_billing_mode","zdr"];function f(t){if(!p(t))throw new Error(`"${t}" isn't an AI Gateway id Cloudflare takes: lowercase letters and digits joined by single hyphens, at most 64 characters.`)}async function _(t,a){try{return await s(t,{plane:"account",args:["ai-gateway","gateways","get",a]},c)}catch(e){if(l(e,"not_found"))return null;throw e}}async function A(t,a,e={}){f(a);let{collectLogs:n,cacheTtl:r}=g(e);return s(t,{plane:"account",files:{"ai-gateway.json":{id:a,collect_logs:n,cache_ttl:r,cache_invalidate_on_update:!1,rate_limiting_interval:0,rate_limiting_limit:0,authentication:!1}},args:i=>["ai-gateway","gateways","create","--body",`@${i["ai-gateway.json"]}`]},c)}async function P(t,a){let{id:e,accountId:n,...r}=a;f(e);let i=o=>({id:e,url:w(n,e),created:o});if(await _(t,e))return i(!1);try{return await A(t,e,r),i(!0)}catch(o){if(l(o,"already_exists")&&await _(t,e))return i(!1);throw o}}async function v(t,a,e){let n=Object.fromEntries(m.flatMap(i=>a[i]===void 0||a[i]===null?[]:[[i,a[i]]])),r=g(e);return s(t,{plane:"account",files:{"ai-gateway.json":{cache_invalidate_on_update:!1,rate_limiting_interval:0,rate_limiting_limit:0,...n,collect_logs:r.collectLogs,cache_ttl:r.cacheTtl}},args:i=>["ai-gateway","gateways","update",a.id,"--body",`@${i["ai-gateway.json"]}`]},c)}async function E(t,a){await t.run({plane:"account",mode:"json",args:["ai-gateway","gateways","delete",a,"--force"]})}var d=20,G=50;async function T(t,a){let e=new Map;for(let n=1;n<=G;n+=1){let r=await s(t,{plane:"account",args:["ai-gateway","gateways","list","--search",a,"--per-page",String(d),"--page",String(n)]},y),i=e.size;for(let o of r)e.set(o.id,o);if(r.length<d||e.size===i)break}return[...e.values()]}export{p as a,g as b,C as c,_ as d,A as e,P as f,v as g,E as h,T as i};
@@ -0,0 +1,15 @@
1
+ import{bc as o}from"./chunk-FQ2A7YAP.js";var a=[{sql:`CREATE TABLE IF NOT EXISTS _everyapp_app_resources (
2
+ worker_name TEXT NOT NULL,
3
+ kind TEXT NOT NULL,
4
+ binding TEXT NOT NULL,
5
+ name TEXT NOT NULL,
6
+ resource_id TEXT,
7
+ created_at INTEGER NOT NULL,
8
+ -- The Worker's row: the last version a deploy uploaded.
9
+ version_id TEXT,
10
+ PRIMARY KEY (worker_name, kind, binding)
11
+ )`},{sql:"CREATE UNIQUE INDEX IF NOT EXISTS _everyapp_app_resources_id ON _everyapp_app_resources (kind, resource_id)"},{sql:"CREATE UNIQUE INDEX IF NOT EXISTS _everyapp_app_resources_name ON _everyapp_app_resources (kind, name)"}],t={worker:"Worker",d1:"D1 database",kv:"KV namespace",hyperdrive:"Hyperdrive config",queue:"Queue",vectorize:"Vectorize index","ai-gateway":"AI Gateway","secrets-store-secret":"Secrets Store secret",r2:"R2 bucket","email-route":"Email Routing route for"};async function p(e,r){return((await e.run([...a,{sql:"SELECT kind, binding, name, resource_id, version_id FROM _everyapp_app_resources WHERE worker_name = ? ORDER BY kind, binding",params:[r]}])).at(-1)??[]).map(i=>({...s(i),versionId:i.version_id==null?null:String(i.version_id)}))}function s(e){return{kind:String(e.kind),binding:String(e.binding),name:String(e.name),resourceId:e.resource_id===null?null:String(e.resource_id)}}async function _(e,r){return((await e.run([...a,{sql:"SELECT worker_name, binding, name, resource_id FROM _everyapp_app_resources WHERE kind = ? ORDER BY worker_name, binding",params:[r]}])).at(-1)??[]).map(i=>({workerName:String(i.worker_name),...s({...i,kind:r})}))}async function E(e){let[r=[]]=await e.run([{sql:"SELECT name FROM sqlite_master WHERE type = 'table' AND name = '_everyapp_app_resources'"}]);if(r.length===0)return[];let[n=[]]=await e.run([{sql:"SELECT worker_name, kind, binding, name, resource_id FROM _everyapp_app_resources ORDER BY worker_name, kind, binding"}]);return n.map(i=>({workerName:String(i.worker_name),...s(i)}))}async function m(e,r,n,i=""){await e.run([...a,{sql:"UPDATE _everyapp_app_resources SET version_id = ? WHERE worker_name = ? AND kind = 'worker' AND binding = ?",params:[n,r,i]}])}async function R(e,r,n){try{await e.run([...a,{sql:`INSERT INTO _everyapp_app_resources (worker_name, kind, binding, name, resource_id, created_at)
12
+ VALUES (?1, ?2, ?3, ?4, ?5, ?6)
13
+ ON CONFLICT (worker_name, kind, binding) DO UPDATE SET name = excluded.name,
14
+ resource_id = excluded.resource_id`,params:[r,n.kind,n.binding,n.name,n.resourceId,Date.now()]}])}catch(i){throw c(i)?new o("RESOURCE_OWNED",`${d(n)} is recorded as another app's
15
+ ${r} can't use it.`,{fix:"rename the binding in everyapp.config.ts"}):i}}async function g(e,r,n){await e.run([...a,n?{sql:"DELETE FROM _everyapp_app_resources WHERE worker_name = ? AND kind = ? AND binding = ?",params:[r,n.kind,n.binding]}:{sql:"DELETE FROM _everyapp_app_resources WHERE worker_name = ?",params:[r]}])}function d({kind:e,name:r}){return`${t[e]} "${r}"`}function c(e){let r=e instanceof Error?e.message:"";return/UNIQUE constraint failed/i.test(r)}export{t as a,p as b,_ as c,E as d,m as e,R as f,g,d as h};
@@ -0,0 +1,7 @@
1
+ import{a as G,c as I,d as C,e as V}from"./chunk-DWTJ4OLZ.js";import{a as T}from"./chunk-S2G4G73L.js";import{aa as W,ea as N,k as P}from"./chunk-KOBKGQ27.js";import{e as _}from"./chunk-RL72BUT4.js";import{Hc as h,ac as E,b as k,bc as f,c as D}from"./chunk-FQ2A7YAP.js";var g="app.live",M=6e5,B=3e3,O=15e3;var $={["deploy"]:"uploaded and bound"};async function F({db:i,appRowId:a,appId:t,hostname:e,out:s,verb:n,fetch:p,localDns:d=p?void 0:C,sleep:y=o=>new Promise(l=>setTimeout(l,o)),maxWaitMs:v=M,intervalMs:m=B,now:u=Date.now}){let o=`https://${e}/`,l=u(),c=!1,r=!1,b=null,S,L=async()=>(c&&d&&await V({host:e,lead:`${t} is live at https://${e}`,out:s,step:g,localDns:d}),{outcome:"live",waited:S});for(;;){let R=await x(i,a,t);if(R==="active")return L();if(R==="disabled")return s.emit({type:"warning",code:"APP_DISABLED",step:g,message:`${t} is switched off in Admin \u2192 Apps
2
+ It's ${$[n]}; the Gateway serves it once an admin turns it on.`}),{outcome:"disabled"};if(!r){let A=await I(o,p);if(A.answered){if(c=!0,A.access)r=!0,b=null;else if(await x(i,a,t)==="active")return L()}}let w=u()-l;if(w>=v){if(!c)return s.emit({type:"warning",code:"CERT_PENDING",step:g,message:`No certificate for ${e} after ${h(w)}
3
+ It usually comes within 5 minutes; ${t} goes live on its first visit once it has one.`,data:{hostname:e,fix:"if it never comes, check the zone's CAA records allow Cloudflare's certificate authorities"}}),{outcome:"first_visit"};if(r)return s.emit({type:"warning",code:"ACCESS_IN_FRONT",step:g,message:`Cloudflare Access answers before the Gateway, and the Gateway hasn't made ${t} live after ${h(w)}
4
+ The deploy stalled: the Gateway should have reached ${t}'s Worker within a minute of the upload. ${t} stays ${$[n]}; opening https://${e} signed in through Access finishes it when the Gateway can reach it.`,data:{hostname:e,rerun:`${D} status`,rerunNote:`then ${n} again`}}),{outcome:"first_visit"};throw new f("APP_NOT_LIVE",`${t} isn't live after ${h(w)}: the Gateway can't reach its Worker yet
5
+ ${t} stays ${$[n]}.`,{retryable:!0,rerun:`${D} status`,rerunNote:`then ${n} again`})}(b===null||u()-b>=O)&&(S=c?"live":"certificate",s.emit({type:"progress",step:g,message:r?`Cloudflare Access answers before the Gateway; waiting for the Gateway to make ${t} live (it looks every minute)`:c?`Waiting for ${t} to go live`:`Waiting for the certificate for ${e} (usually under 5m)`,data:{hostname:e,waitedMs:w,answered:c,...r?{access:!0}:{}}}),b=u()),await y(m)}}async function x(i,a,t){let e=await N(i,a);if(!e||e.status===_)throw new f("APP_NOT_FOUND",`${t} was deleted during this run
6
+ Someone removed it from the Gateway while this run waited for it to go live.`,{retryable:!0,rerunNote:"to put it back"});return e.status}function oe(i,a,t){let e=T({out:a,verbose:t});return{openRelease:i?.openRelease??e.open,source:i?.source??e.describe}}function le(i,{manifest:a,install:t,deployer:e,accountName:s}){return W(i,{appSlug:a.id,name:a.name??a.id,description:a.description??a.id,manifest:a,appBaseDomain:t.appBaseDomain,deployer:e,organizationName:s??""})}var U={["deploy"]:"This app's upload is kept; deploying again binds it and makes it live."};async function ce({cf:i,db:a,databaseId:t,out:e,accountId:s,appId:n,workerName:p,publishHost:d,interactive:y,forceDns:v,seams:m,verb:u}){let o=await P(a);if(o?.liveAppWorkers.includes(p)&&!d)return;e.emit({type:"step",step:"app.bind",status:"start",message:`Binding ${E(p)} on the gateway${d?" and publishing its hostname":""}...`,data:{appId:n}});let l=(await m.source?.())?.version,c=l!==void 0&&o!==null&&l!==o.releaseVersion;c&&e.emit({type:"step",step:"gateway.upgrade",status:"start",message:`Upgrading the Gateway ${o.releaseVersion} \u2192 ${l}...`,data:{from:o.releaseVersion,to:l}});try{let r=await G({cf:i,out:e,accountId:s,databaseId:t,interactive:y,cliVersion:k,force:!0,forceDns:v,...m});c&&e.emit({type:"step",step:"gateway.upgrade",status:"ok",data:{to:l}}),e.emit({type:"step",step:"app.bind",status:"ok",message:`The gateway binds ${E(p)} (gateway version ${r.versionId??"unknown"}).`,data:{versionId:r.versionId,newHosts:r.newHosts}})}catch(r){throw r instanceof f&&r.code==="LEASE_HELD"?new f("LEASE_HELD",`${r.message}
7
+ ${U[u]}`,{retryable:!0,rerunNote:"once the other deploy finishes",data:r.data}):r}}async function pe({wait:i,db:a,appRowId:t,appId:e,hostname:s,out:n,seams:p,message:d,verb:y}){if(!i)return!1;let{outcome:v,waited:m}=await F({db:a,appRowId:t,appId:e,hostname:s,out:n,verb:y,...p});return v!=="live"?!1:(n.emit({type:"step",step:"app.live",status:"ok",message:d,data:{hostname:s,url:`https://${s}`,...m?{waited:m}:{}}}),!0)}function de(i){return{url:i.liveUrl,workerName:i.workerName,versionId:i.versionId,live:i.live}}export{oe as a,le as b,ce as c,pe as d,de as e};
@@ -1 +1 @@
1
- import{m as r}from"./chunk-JYKRUS5C.js";import{bc as t}from"./chunk-LYNBZ7RV.js";var u=100;function c(e,n){return t(e,{plane:"account",args:["r2","buckets","list","--name-contains",n,"--per-page",String(u)]},r).then(o=>o.map(s=>s.name))}async function f(e,n){return(await c(e,n)).includes(n)}async function p(e,n){await e.run({plane:"account",mode:"json",args:["r2","buckets","create","--name",n]})}async function m(e,n){await e.run({plane:"account",mode:"json",args:["r2","buckets","delete",n,"--force"]})}export{c as a,f as b,p as c,m as d};
1
+ import{m as r}from"./chunk-RQBSTNL7.js";import{Dc as t}from"./chunk-FQ2A7YAP.js";var u=100;function c(e,n){return t(e,{plane:"account",args:["r2","buckets","list","--name-contains",n,"--per-page",String(u)]},r).then(o=>o.map(s=>s.name))}async function f(e,n){return(await c(e,n)).includes(n)}async function p(e,n){await e.run({plane:"account",mode:"json",args:["r2","buckets","create","--name",n]})}async function m(e,n){await e.run({plane:"account",mode:"json",args:["r2","buckets","delete",n,"--force"]})}export{c as a,f as b,p as c,m as d};
@@ -1 +1 @@
1
- import{Bb as s,Yb as e,nb as o}from"./chunk-LYNBZ7RV.js";import p from"node:fs/promises";import a from"node:path";import{pathToFileURL as c}from"node:url";import{createJiti as m}from"jiti";async function y(r){return g(a.join(r,"everyapp.config.ts"),{message:"No everyapp.config.ts in this directory",fix:"run this from the app's directory"})}async function w(r){try{await p.access(a.join(r,"everyapp.config.ts"))}catch(i){if(e(i))return null;throw i}return y(r)}async function g(r,i={message:`No manifest at ${r}`}){try{await p.access(r)}catch(n){throw e(n)?new s("MANIFEST_NOT_FOUND",i.message,{fix:i.fix}):n}let f=await m(c(r).href).import(r,{default:!0});return o(f,l)}var l={unknownCapabilities:"accept"};function h(r,i){let t=i?.binding??r[0];if(!r.includes(t))throw new Error(`Manifest migrations binding "${t}" is not declared in resources.d1.`);return t}function N(r){return r.migrations?.dir??"drizzle"}export{y as a,w as b,g as c,l as d,h as e,N as f};
1
+ import{Eb as o,bc as s,yc as e}from"./chunk-FQ2A7YAP.js";import p from"node:fs/promises";import a from"node:path";import{pathToFileURL as c}from"node:url";import{createJiti as m}from"jiti";async function y(r){return g(a.join(r,"everyapp.config.ts"),{message:"No everyapp.config.ts in this directory",fix:"run this from the app's directory"})}async function w(r){try{await p.access(a.join(r,"everyapp.config.ts"))}catch(i){if(e(i))return null;throw i}return y(r)}async function g(r,i={message:`No manifest at ${r}`}){try{await p.access(r)}catch(n){throw e(n)?new s("MANIFEST_NOT_FOUND",i.message,{fix:i.fix}):n}let f=await m(c(r).href).import(r,{default:!0});return o(f,l)}var l={unknownCapabilities:"accept"};function h(r,i){let t=i?.binding??r[0];if(!r.includes(t))throw new Error(`Manifest migrations binding "${t}" is not declared in resources.d1.`);return t}function N(r){return r.migrations?.dir??"drizzle"}export{y as a,w as b,g as c,l as d,h as e,N as f};
@@ -1,2 +1,2 @@
1
- import{Bb as o}from"./chunk-LYNBZ7RV.js";import i from"node:fs";import t from"node:path";import{fileURLToPath as a}from"node:url";function p(e=import.meta.url){let r=t.dirname(a(e));for(let n=r;;n=t.dirname(n)){if(i.existsSync(t.join(n,"apps","every-app-gateway","scripts","build-release.ts"))&&i.existsSync(t.join(n,"packages","cli","package.json")))return n;if(t.dirname(n)===n)return null}}function c(e=import.meta.url){let r=p(e);if(r)return r;throw new o("CHECKOUT_MISSING",`everyapp has to run from a checkout of the Every App repository
1
+ import{bc as o}from"./chunk-FQ2A7YAP.js";import i from"node:fs";import t from"node:path";import{fileURLToPath as a}from"node:url";function p(e=import.meta.url){let r=t.dirname(a(e));for(let n=r;;n=t.dirname(n)){if(i.existsSync(t.join(n,"apps","every-app-gateway","scripts","build-release.ts"))&&i.existsSync(t.join(n,"packages","cli","package.json")))return n;if(t.dirname(n)===n)return null}}function c(e=import.meta.url){let r=p(e);if(r)return r;throw new o("CHECKOUT_MISSING",`everyapp has to run from a checkout of the EveryApp repository
2
2
  This copy is installed in ${u(t.dirname(a(e)))}, outside any checkout.`,{fix:`in your checkout, run pnpm everyapp ${process.argv.slice(2).join(" ")}`.trimEnd()})}function u(e){for(let r=e;t.dirname(r)!==r;r=t.dirname(r))if(i.existsSync(t.join(r,"package.json")))return r;return e}function s(e){try{return i.realpathSync(e)}catch{return t.resolve(e)}}function h(e,r=c()){let n=t.relative(s(r),s(e));return n===""||n!==".."&&!n.startsWith(`..${t.sep}`)&&!t.isAbsolute(n)}export{p as a,c as b,s as c,h as d};
@@ -1,4 +1,4 @@
1
- import{b as v}from"./chunk-W3JCQHHU.js";import{f as _}from"./chunk-ONLNJXVQ.js";import{Ab as O,Bb as c,Yb as h,Zb as S,zb as k}from"./chunk-LYNBZ7RV.js";import E from"node:fs/promises";import d from"node:path";import{OutputWorkerSchema as b}from"@cloudflare/config";import R from"node:fs/promises";import g from"node:path";var L=g.join(".cloudflare","output","v0"),A=g.join(L,"workers"),D="default";async function*ie(e){let t=g.join(e,A);for(let n of await R.readdir(t,{withFileTypes:!0})){if(!n.isDirectory())continue;let r=g.join(t,n.name),i=g.join(r,"worker.config.json"),o=JSON.parse(await R.readFile(i,"utf8"));yield{name:n.name,directory:r,file:i,config:o}}}async function oe(e){let t=JSON.parse(await R.readFile(g.join(e,"config.json"),"utf8"));return t.buildContext?.mode==="production"&&!t.buildContext.isPreview}var I=d.join(A,D),j=d.join(I,"worker.config.json"),C=d.join(I,"bundle"),N="__EVERYAPP_PATCH__",B="every-app-gateway";function U(e){return[e.gatewayHost,...[...new Set(e.appHosts)].filter(t=>t!==e.gatewayHost).sort()]}async function ge(e,t){let n=d.join(e,j),r=JSON.parse(await E.readFile(n,"utf8")),i={...r.env??{}};for(let a of Object.keys(i))a.startsWith(k)&&delete i[a];delete i.KV,i.DB={type:"d1",name:B,id:t.d1Id},i.OAUTH_KV={type:"kv",id:t.oauthKvId},i.EVERYAPP_RELEASE={type:"json",value:t.release},i.CF_VERSION_METADATA={type:"version-metadata"};for(let a of[...new Set(t.appWorkers)].sort())i[O(a)]={type:"worker",worker:a};if(r.env=i,t.gatewayHost!==t.appBaseDomain)throw new c("INVALID_APP_BASE_DOMAIN",`Apps live one label below the gateway host ${t.gatewayHost}, so APP_BASE_DOMAIN must be ${t.gatewayHost}, not ${t.appBaseDomain}.`);let o=t.appHosts.filter(a=>!v(a,t.appBaseDomain));if(o.length>0)throw new c("INVALID_APP_HOST",`Refusing to publish ${o.join(", ")} on the gateway: app hosts are one label below ${t.appBaseDomain}.`);i.APP_BASE_DOMAIN={type:"text",value:t.appBaseDomain},r.domains=U(t);let s=(r.triggers??[]).filter(a=>a.type!=="fetch");if(s.length>0?r.triggers=s:delete r.triggers,r.workersDev=!1,r.previewUrls=!1,r.observability??=structuredClone(_),r.manifest){let a={...r.manifest.modules??{}};for(let w of await F(d.join(e,C)))a[w]={type:"sourcemap"};r.manifest={...r.manifest,modules:a}}return V(r,{requireDomain:!0}),await E.writeFile(n,`${JSON.stringify(r,null,2)}
1
+ import{b as v}from"./chunk-BK4NK34C.js";import{g as _}from"./chunk-HJGZGZFE.js";import{$b as k,ac as O,bc as c,yc as h,zc as S}from"./chunk-FQ2A7YAP.js";import E from"node:fs/promises";import d from"node:path";import{OutputWorkerSchema as b}from"@cloudflare/config";import R from"node:fs/promises";import g from"node:path";var L=g.join(".cloudflare","output","v0"),A=g.join(L,"workers"),D="default";async function*ie(e){let t=g.join(e,A);for(let n of await R.readdir(t,{withFileTypes:!0})){if(!n.isDirectory())continue;let r=g.join(t,n.name),i=g.join(r,"worker.config.json"),o=JSON.parse(await R.readFile(i,"utf8"));yield{name:n.name,directory:r,file:i,config:o}}}async function oe(e){let t=JSON.parse(await R.readFile(g.join(e,"config.json"),"utf8"));return t.buildContext?.mode==="production"&&!t.buildContext.isPreview}var I=d.join(A,D),j=d.join(I,"worker.config.json"),C=d.join(I,"bundle"),N="__EVERYAPP_PATCH__",B="every-app-gateway";function U(e){return[e.gatewayHost,...[...new Set(e.appHosts)].filter(t=>t!==e.gatewayHost).sort()]}async function ge(e,t){let n=d.join(e,j),r=JSON.parse(await E.readFile(n,"utf8")),i={...r.env??{}};for(let a of Object.keys(i))a.startsWith(k)&&delete i[a];delete i.KV,i.DB={type:"d1",name:B,id:t.d1Id},i.OAUTH_KV={type:"kv",id:t.oauthKvId},i.EVERYAPP_RELEASE={type:"json",value:t.release},i.CF_VERSION_METADATA={type:"version-metadata"};for(let a of[...new Set(t.appWorkers)].sort())i[O(a)]={type:"worker",worker:a};if(r.env=i,t.gatewayHost!==t.appBaseDomain)throw new c("INVALID_APP_BASE_DOMAIN",`Apps live one label below the gateway host ${t.gatewayHost}, so APP_BASE_DOMAIN must be ${t.gatewayHost}, not ${t.appBaseDomain}.`);let o=t.appHosts.filter(a=>!v(a,t.appBaseDomain));if(o.length>0)throw new c("INVALID_APP_HOST",`Refusing to publish ${o.join(", ")} on the gateway: app hosts are one label below ${t.appBaseDomain}.`);i.APP_BASE_DOMAIN={type:"text",value:t.appBaseDomain},r.domains=U(t);let s=(r.triggers??[]).filter(a=>a.type!=="fetch");if(s.length>0?r.triggers=s:delete r.triggers,r.workersDev=!1,r.previewUrls=!1,r.observability??=structuredClone(_),r.manifest){let a={...r.manifest.modules??{}};for(let w of await F(d.join(e,C)))a[w]={type:"sourcemap"};r.manifest={...r.manifest,modules:a}}return V(r,{requireDomain:!0}),await E.writeFile(n,`${JSON.stringify(r,null,2)}
2
2
  `),r}function V(e,{requireDomain:t=!1}={}){let n=b.safeParse(e);if(!n.success)throw new c("INVALID_BUILD_OUTPUT",`The patched Worker config isn't valid Build Output: ${n.error.issues.map(r=>`${r.path.join(".")||"(root)"}: ${r.message}`).join("; ")}`);if(JSON.stringify(e).includes(N))throw new c("INVALID_BUILD_OUTPUT","The Worker config still has a deploy-time placeholder.");if(t&&!n.data.domains?.length)throw new c("INVALID_BUILD_OUTPUT","The gateway has no domain to deploy to.")}async function F(e){let t;try{t=await E.readdir(e,{recursive:!0,withFileTypes:!0})}catch{return[]}return t.filter(n=>n.isFile()&&n.name.endsWith(".map")).map(n=>d.relative(e,d.join(n.parentPath,n.name)).split(d.sep).join("/")).sort()}import{spawn as W}from"node:child_process";import{createHash as $}from"node:crypto";import m from"node:fs/promises";import p from"node:path";import{z as l}from"zod";var Se="every-app-gateway-release.tar.gz",x="v0",M={gateway:new Set([".cloudflare","drizzle","release.json"]),app:new Set([".cloudflare","migrations","release.json"])},H=l.looseObject({schema:l.literal(1),kind:l.string().optional(),version:l.string(),gitSha:l.string(),builtAt:l.string(),cfVersion:l.string(),buildOutputVersion:l.string(),sha256:l.string().regex(/^[0-9a-f]{64}$/),migrations:l.array(l.object({tag:l.string(),when:l.number()})),minCli:l.string(),minSdk:l.string()}),G=H.extend({committedAt:l.string().optional(),pluginVersion:l.string(),configVersion:l.string()});function _e({version:e,commit:t}){return t?`commit ${t.hash}${t.uncommittedChanges?" with uncommitted changes":""}`:e}function ve(e){switch(e.kind){case"checkout":return"this checkout";case"github":return`${e.repo} release ${e.tag}`;case"url":return e.url;case"file":return e.path}}async function K(e){let t=(await m.readdir(e,{recursive:!0,withFileTypes:!0})).filter(n=>n.isFile()).map(n=>p.relative(e,p.join(n.parentPath,n.name)).split(p.sep).join("/")).filter(n=>n!=="release.json");return z(e,t)}async function z(e,t){let n=$("sha256");for(let r of[...t].sort()){let i;try{i=await m.readFile(p.join(e,r))}catch(o){if(!h(o))throw o;n.update(`${r}\0-
3
3
  `);continue}n.update(`${r}\0${$("sha256").update(i).digest("hex")}
4
4
  `)}return n.digest("hex")}function J(e,t){return new Promise((n,r)=>{let i=W("tar",["-xzf",e,"-C",t],{stdio:"ignore"});i.once("error",r),i.once("close",o=>o===0?n():r(new Error(`tar couldn't extract ${e} (exit ${o})`)))})}async function Y(e,t,n){let r=await m.readdir(e,{recursive:!0,withFileTypes:!0});for(let i of r){let o=p.join(i.parentPath,i.name),s=p.relative(e,o).split(p.sep).join("/");if(i.isSymbolicLink()||!(i.isFile()||i.isDirectory()))throw new c("RELEASE_INVALID",`${t} isn't ${n}: ${s} is a link or a special file, not a regular file.`);if(i.isFile()&&(await m.lstat(o)).nlink>1)throw new c("RELEASE_INVALID",`${t} isn't ${n}: ${s} is a hard link, not a regular file.`)}}function q(e){return typeof e=="string"&&e.length>0&&!p.isAbsolute(e)&&!/[\\\0-\x1f]/.test(e)&&e.split("/").every(t=>t!==""&&t!=="."&&t!=="..")}async function X(e,t,n){let r=p.join(e,".cloudflare","output","v0","workers"),i;try{i=await m.readdir(r)}catch(o){if(h(o))return;throw o}for(let o of i){let s;try{s=JSON.parse(await m.readFile(p.join(r,o,"worker.config.json"),"utf8"))}catch(u){if(h(u))continue;throw u}let a=s?.manifest,f=[a?.mainModule,...Object.keys(a?.modules&&typeof a.modules=="object"?a.modules:{})].filter(u=>u!==void 0).find(u=>!q(u));if(f!==void 0)throw new c("RELEASE_INVALID",`${t} isn't ${n}: its ${o} Worker lists a module outside its bundle: ${String(f)}.`)}}var T={gateway:{a:"a gateway release",the:"Gateway release"},app:{a:"an app release",the:"App release"}};async function Z(e,t,n){let r=T[t],{dir:i,cleanup:o}=await S(`${t}-release-`);try{await J(e,i),await Y(i,e,r.a),await X(i,e,r.a);let s=JSON.parse(await m.readFile(p.join(i,"release.json"),"utf8")),a=s?.kind??"gateway";if(a!==t){let y=a==="app"||a==="gateway"?T[a].a:`a ${String(a)} release`;throw new c("RELEASE_INVALID",`${e} is ${y}, not ${t==="gateway"?"a Gateway release":r.a}.`)}let w=(await m.readdir(i)).filter(y=>!M[t].has(y));if(w.length>0)throw new c("RELEASE_INVALID",`${e} holds more than ${r.a}: ${w.join(", ")}.`);let f=n.safeParse(s);if(!f.success)throw new c("RELEASE_INVALID",`${e} isn't a valid ${r.the.toLowerCase()}
@@ -1 +1 @@
1
- import{Bb as r}from"./chunk-LYNBZ7RV.js";var s="[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?",a=new RegExp(`^(?=.{1,253}$)(?:${s}\\.)+${s}$`);function o(n){return a.test(n)}function f(n){if(n===void 0)return;let e=n.trim().toLowerCase().replace(/^https?:\/\//,"").replace(/[/?#].*$/,"").replace(/\.$/,"");if(!o(e))throw new r("INVALID_DOMAIN",`${n} isn't a full hostname`,{fix:"use a name like apps.example.com"});return e}function l(n,e){if(!n.endsWith(`.${e}`))return!1;let t=n.slice(0,-(e.length+1));return t.length>0&&!t.includes(".")&&o(n)}function c(n,e){return n.filter(t=>l(t,e))}function d(n){let e=n.split("."),t=[];for(let i=0;i<=e.length-2;i+=1)t.push(e.slice(i).join("."));return t}export{f as a,l as b,c,d};
1
+ import{bc as r}from"./chunk-FQ2A7YAP.js";var s="[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?",a=new RegExp(`^(?=.{1,253}$)(?:${s}\\.)+${s}$`);function o(n){return a.test(n)}function f(n){if(n===void 0)return;let e=n.trim().toLowerCase().replace(/^https?:\/\//,"").replace(/[/?#].*$/,"").replace(/\.$/,"");if(!o(e))throw new r("INVALID_DOMAIN",`${n} isn't a full hostname`,{fix:"use a name like apps.example.com"});return e}function l(n,e){if(!n.endsWith(`.${e}`))return!1;let t=n.slice(0,-(e.length+1));return t.length>0&&!t.includes(".")&&o(n)}function c(n,e){return n.filter(t=>l(t,e))}function d(n){let e=n.split("."),t=[];for(let i=0;i<=e.length-2;i+=1)t.push(e.slice(i).join("."));return t}export{f as a,l as b,c,d};
@@ -0,0 +1,2 @@
1
+ import o from"node:fs/promises";import t from"node:path";var i=["No cloudflare.config.ts in this app","EveryApp apps build their Worker in a cloudflare.config.ts at the app root:","",' import { defineConfig } from "cf/config";',' import { everyAppWorker } from "@every-app/sdk/cloudflare";',' import * as entrypoint from "./src/entry.worker.ts" with { type: "cf-worker" };',' import manifest from "./everyapp.config.ts";',""," export default defineConfig((ctx) => ({"," worker: everyAppWorker({ manifest, entrypoint, ctx }),"," }));","","starter/ has the full setup (package.json, vite.config.ts)."].join(`
2
+ `);async function s(e){try{let r=await o.readFile(t.join(e,"cloudflare.config.ts"),"utf8");return{usesEveryAppWorker:r.includes("everyAppWorker"),hasCrons:/\bcrons\s*:/.test(r)}}catch{return null}}export{i as a,s as b};
@@ -0,0 +1,9 @@
1
+ import{U as F,a as R,j as v,k as _,t as T}from"./chunk-KOBKGQ27.js";import{c as C,d as L}from"./chunk-TIYSZWP5.js";import{a as I,e as E}from"./chunk-I7FNTTUY.js";import{Cc as $,bc as f,c as m,cc as h,d as D,e as y,hc as g}from"./chunk-FQ2A7YAP.js";async function U({whoami:t,createCf:n,accountId:e,host:o,hostFlag:a,interactive:i,pick:c=H}){let s=e||process.env.CLOUDFLARE_ACCOUNT_ID||void 0,l=(t.accounts??[]).map(r=>({id:r.id,name:r.name??null})),u=s&&!l.some(r=>r.id===s)?[...l,{id:s,name:null}]:l,d=(await Promise.all(u.map(r=>x(r,n)))).filter(r=>r!==null),w={probed:u,found:d,...s?{requestedAccountId:s}:{}};if(s)return{...w,gateway:d.find(r=>r.account.id===s)??null};if(d.length<=1)return{...w,gateway:d[0]??null};let A=o?d.filter(r=>r.install?.gatewayHost.toLowerCase()===o.toLowerCase()):[];if(A.length===1)return{...w,gateway:A[0]};if(i)return{...w,gateway:await c(d,t)};throw new h("choose_account",`Choose which Gateway to use
2
+ ${t.email??"This login"} sees a Gateway in ${d.length} Cloudflare accounts. Run one of:`,void 0,{rerun:null,data:{choices:d.map(r=>{let p=r.install?.gatewayHost,b=a&&p;return{accountId:r.account.id,accountName:r.account.name,gatewayUrl:p?`https://${p}`:null,label:b?r.account.name??r.account.id:[r.account.name,p].filter(Boolean).join(" \xB7 "),rerun:b?`${y(a)} ${a} ${p}`:D(["--account-id",r.account.id])}})}})}async function x(t,n){let e=n(t.id);try{let o=await T(e);if(!o)return null;let a=R(e,o);return{account:t,cf:e,databaseId:o,db:a,install:await _(a)}}catch(o){if(g(o,"auth")||g(o,"not_found"))return null;throw o}}function G(t,n){if(t.gateway)return t.gateway;let e=n.email?[`Logged in to Cloudflare as ${n.email}.`]:[],o={accounts:t.probed};if(t.requestedAccountId&&t.found.length>0)throw new f("GATEWAY_NOT_FOUND",[`Cloudflare account ${t.requestedAccountId} has no Gateway`,`This login's Gateway${t.found.length===1?" is":"s are"} in ${t.found.map(Y).join("; ")}.`].join(`
3
+ `),{fix:"pass that account's id to --account-id (or CLOUDFLARE_ACCOUNT_ID), or drop it",data:o});if(t.probed.length===0)throw new f("GATEWAY_NOT_FOUND",["This Cloudflare login lists no accounts",...e].join(`
4
+ `),{fix:"pass the Gateway's account with --account-id, or set CLOUDFLARE_ACCOUNT_ID",data:o});let a=t.probed.map(i=>i.name??i.id);throw new f("GATEWAY_NOT_FOUND",[a.length===1?`No Gateway in ${a[0]}, the only account this login sees`:`No Gateway in the ${a.length} accounts this login sees`,...a.length===1?[]:[`${a.join(", ")}.`],...e,`Or log in to the Gateway's account: ${m} login`].join(`
5
+ `),{rerun:`${m} setup --domain <hostname>`,rerunNote:"to install one",data:o})}function W(t,n,e=process.argv.slice(2)){if(!n)return;let o=new URL(n).host.toLowerCase(),a=t.install.gatewayHost.toLowerCase();if(o===a)return;let i=e.some(s=>s==="--gateway"||s.startsWith("--gateway=")),c=t.account.name??t.account.id;throw new f("GATEWAY_URL_MISMATCH",`The Gateway here is ${a}, not ${o}
6
+ Found in ${c}. For ${o}, pass its account with --account-id.`,i?{rerun:y("--gateway",e),rerunNote:`to use ${a}`}:{fix:`unset EVERYAPP_GATEWAY_URL to use ${a}`})}function Y(t){return`${t.account.name??t.account.id}${t.install?` at https://${t.install.gatewayHost}`:""}`}function H(t,n){return E("Which Gateway?",t.map(e=>{let o=e.account.name??e.account.id;return e.install?{label:e.install.gatewayHost,hint:o,value:e}:{label:o,value:e}}),{context:[`${n.email??"This login"} sees a Gateway in ${t.length} Cloudflare accounts`]})}var P=t=>$({accountId:t});function N(t,n){let e;try{e=new URL(t)}catch{throw new f("INVALID_GATEWAY_URL",n==="--gateway"?`--gateway must be a full URL, not "${t}"
7
+ For example https://apps.example.com.`:`EVERYAPP_GATEWAY_URL must be a full URL, not "${t}"`,n==="--gateway"?{}:{fix:`set it to https://${t.replace(/^\w+:\/\//,"")}, or unset it`})}return e.pathname=e.pathname.replace(/\/+$/,""),e.search="",e.hash="",e.toString().replace(/\/+$/,"")}function at(t){if(t)return N(t,"--gateway");let n=process.env.EVERYAPP_GATEWAY_URL;return n?N(n,"EVERYAPP_GATEWAY_URL"):void 0}async function O({createCf:t=P,accountId:n,host:e,interactive:o,onDeviceLogin:a}){let i=await L({cf:t(),interactive:o,onDeviceLogin:a}),c=await U({whoami:i,createCf:t,accountId:n,host:e,interactive:o});return{whoami:i,discovery:c}}function q(t){let{install:n}=t;if(!n)throw v();if(n.liveVersionId===null)throw new f("GATEWAY_NOT_INSTALLED",`The Gateway at https://${n.gatewayHost} isn't finished installing
8
+ Setup stopped before its first upload.`,{rerun:`${m} setup`});return{...t,install:n}}async function it({json:t,out:n,accountId:e,createCf:o}){let{whoami:a,discovery:i}=await O({createCf:o,accountId:e,interactive:I(t??!1),onDeviceLogin:t?C(n,"gateway.login"):void 0});if(i.found.length===0&&i.probed.length>0&&!i.requestedAccountId){let c=i.probed.map(s=>s.name??s.id);throw new h("install_gateway",[`No Gateway in ${c.length===1?`${c[0]}'s Cloudflare account`:`the ${c.length} Cloudflare accounts this login sees`}${a.email?` (logged in as ${a.email})`:""}`,`Gateway in another account? Log in to it: ${m} login`].join(`
9
+ `),void 0,{rerun:`${m} setup`,rerunNote:"installs one",data:{accounts:i.probed}})}return G(i,a)}async function rt({gateway:t,accountId:n,interactive:e,createCf:o=P,onNoGateway:a,login:i}){let c=await O({createCf:o,accountId:n,host:t?new URL(t).host.toLowerCase():void 0,interactive:e,onDeviceLogin:i?.json?C(i.out,i.step):void 0}),{whoami:s}=c,{discovery:l}=c;a&&l.gateway===null&&l.found.length===0&&l.probed.length>0&&(l=await a({whoami:s,discovery:l}));let u=q(G(l,s));return W(u,t),{cf:u.cf,accountId:u.account.id,accountName:u.account.name,databaseId:u.databaseId,db:u.db,install:u.install,gatewayUrl:`https://${u.install.gatewayHost}`,deployer:F(s.email,u.account.id)}}export{U as a,G as b,at as c,it as d,rt as e};
@@ -1,4 +1,4 @@
1
- import{h as M,i as G,o as z}from"./chunk-H6QQMY7B.js";import{i as _}from"./chunk-6OGVO7QK.js";import{c as x,d as W}from"./chunk-W3JCQHHU.js";import{c as S}from"./chunk-ZFCUH5PK.js";import{b as I}from"./chunk-4JRIS6S6.js";import{h as O}from"./chunk-HOUHG236.js";import{a as L,j as P,k,l as C}from"./chunk-RMF4YGD6.js";import{Fb as v,qb as y}from"./chunk-LYNBZ7RV.js";async function Oe(e){let{cf:n,out:r,databaseId:a}=e,s=L(n,a),d=await k(s);if(!d)throw P();if(!e.force&&!e.stagedSecrets&&!e.unsetSecrets){let{inSync:g,desired:f}=await Z(n,s,d);if(g)return r.emit({type:"step",step:"gateway.reconcile",status:"skip",message:`The gateway already binds ${f.appWorkers.length===1?"the 1 app":`all ${f.appWorkers.length} apps`} its registry lists.`}),{versionId:d.liveVersionId,firstDeploy:!1,appWorkers:f.appWorkers,domains:d.liveDomains,newHosts:[],changed:!1}}let w=await e.openRelease();try{_(w.manifest,e.cliVersion);let g=await O({db:s,out:r,leaseWaitMs:e.leaseWaitMs,sleep:e.sleep},"gateway.reconcile");try{let f=await k(s)??d;return e.unsetSecrets?.length&&(await g.check(),f=await ee(n,s,f,e.unsetSecrets)),{...await z({cf:n,out:r,reason:"reconcile",release:w,accountId:e.accountId,gatewayHost:f.gatewayHost,zone:{id:f.zoneId,name:f.zoneName},appBaseDomain:f.appBaseDomain,forceDns:e.forceDns,resources:{d1Id:a,oauthKvId:f.oauthKvId,created:[]},db:s,interactive:e.interactive,confirm:e.confirm,cliVersion:e.cliVersion,stagedSecrets:e.stagedSecrets,heldLease:g,sleep:e.sleep}),changed:!0}}finally{await g.release()}}finally{await w.cleanup()}}async function Z(e,n,r){let a=await G(n,M(e));if(!([...r.liveAppWorkers].sort().join(`
1
+ import{h as M,i as G,o as z}from"./chunk-S2G4G73L.js";import{i as _}from"./chunk-BCTEWNN4.js";import{c as x,d as W}from"./chunk-BK4NK34C.js";import{c as S}from"./chunk-KVCL64LI.js";import{b as I}from"./chunk-LEEUODYR.js";import{h as O}from"./chunk-EQLY5I46.js";import{a as L,j as P,k,l as C}from"./chunk-KOBKGQ27.js";import{Hb as y,fc as v}from"./chunk-FQ2A7YAP.js";async function Oe(e){let{cf:n,out:r,databaseId:a}=e,s=L(n,a),d=await k(s);if(!d)throw P();if(!e.force&&!e.stagedSecrets&&!e.unsetSecrets){let{inSync:g,desired:f}=await Z(n,s,d);if(g)return r.emit({type:"step",step:"gateway.reconcile",status:"skip",message:`The gateway already binds ${f.appWorkers.length===1?"the 1 app":`all ${f.appWorkers.length} apps`} its registry lists.`}),{versionId:d.liveVersionId,firstDeploy:!1,appWorkers:f.appWorkers,domains:d.liveDomains,newHosts:[],changed:!1}}let w=await e.openRelease();try{_(w.manifest,e.cliVersion);let g=await O({db:s,out:r,leaseWaitMs:e.leaseWaitMs,sleep:e.sleep},"gateway.reconcile");try{let f=await k(s)??d;return e.unsetSecrets?.length&&(await g.check(),f=await ee(n,s,f,e.unsetSecrets)),{...await z({cf:n,out:r,reason:"reconcile",release:w,accountId:e.accountId,gatewayHost:f.gatewayHost,zone:{id:f.zoneId,name:f.zoneName},appBaseDomain:f.appBaseDomain,forceDns:e.forceDns,resources:{d1Id:a,oauthKvId:f.oauthKvId,created:[]},db:s,interactive:e.interactive,confirm:e.confirm,cliVersion:e.cliVersion,stagedSecrets:e.stagedSecrets,heldLease:g,sleep:e.sleep}),changed:!0}}finally{await g.release()}}finally{await w.cleanup()}}async function Z(e,n,r){let a=await G(n,M(e));if(!([...r.liveAppWorkers].sort().join(`
2
2
  `)===a.appWorkers.join(`
3
3
  `))||!X(r,a.appHosts))return{inSync:!1,desired:a};let d=await S(e,y);return{inSync:!!d?.versionId&&d?.versionId===r.liveVersionId,desired:a}}function X(e,n){if(!e.liveDomains.includes(e.gatewayHost))return!1;let r=e.liveDomains.filter(s=>s!==e.gatewayHost),a=x(n,e.appBaseDomain);return[...r].sort().join(`
4
4
  `)===[...a].sort().join(`
@@ -0,0 +1,20 @@
1
+ import{a as me}from"./chunk-U4ATZJEU.js";import{b as ae,e as ce,g as pe,i as le,l as ue,m as j,n as de,o as T,r as ge,s as fe}from"./chunk-BCTEWNN4.js";import{d as se,e as oe,f as z}from"./chunk-AMCNAKYU.js";import{Ac as ie,Cb as K,Eb as J,Hb as Q,Kb as I,_b as X,b as B,bc as l,c as U,gc as Z,j as H,pc as ee,qc as te,sc as re,yc as ne,zc as P}from"./chunk-FQ2A7YAP.js";import{spawn as Ve,spawnSync as Ge}from"node:child_process";import q from"node:fs";import S from"node:fs/promises";import{createRequire as Ye}from"node:module";import w from"node:path";import{z as R}from"zod";import Me from"node:fs";import qe from"node:path";import We from"node:fs/promises";import he from"node:path";var Ce=200*1024*1024,Be=5*6e4,Ue=5,ze=new Set([301,302,303,307,308]);function N(e){let t=/^([\w.-]+)\/([\w.-]+)$/.exec(e.trim());if(t)return`${t[1]}/${t[2].replace(/\.git$/,"")}`;let r;try{r=new URL(e.trim())}catch{return null}if(r.protocol!=="https:"||r.hostname!=="github.com")return null;let[s,i]=r.pathname.split("/").filter(Boolean);return!s||!i?null:`${s}/${i.replace(/\.git$/,"")}`}async function ke({repo:e,asset:t,tag:r,...s}){let i=N(e);if(!i)throw new l("RELEASE_NOT_FOUND",`${e} isn't a GitHub repository (https://github.com/<owner>/<repo>).`);let o=r?`https://github.com/${i}/releases/download/${encodeURIComponent(r)}/${encodeURIComponent(t)}`:`https://github.com/${i}/releases/latest/download/${encodeURIComponent(t)}`,n=await F(o,{...s,notFound:`${i} has no ${r?`release ${r}`:"published release"} with ${t} that can be downloaded without signing in (https://github.com/${i}/releases).`});if(!n.tag)throw await n.cleanup(),new l("RELEASE_DOWNLOAD_FAILED",`GitHub didn't say which release of ${i} ${o} is.`);return{...n,tag:n.tag,repo:i}}async function F(e,{fetch:t=fetch,timeoutMs:r=Be,maxBytes:s=Ce,notFound:i}={}){let o=AbortSignal.timeout(r),{response:n,current:a,tag:p}=await Fe(e,t,o).catch(f=>{throw Ee(f,e)});if(n.status===404)throw await n.body?.cancel(),new l("RELEASE_NOT_FOUND",i??`${e} doesn't exist (404).`);if(!n.ok||!n.body)throw await n.body?.cancel(),new l("RELEASE_DOWNLOAD_FAILED",`Couldn't download ${e}: HTTP ${n.status}.`,{retryable:n.status>=500});if(Number(n.headers.get("content-length"))>s)throw await n.body.cancel(),be(e,s);let{dir:u,cleanup:y}=await P("release-download-"),m=he.join(u,he.posix.basename(a.pathname)||"release.tar.gz");try{let f=await We.open(m,"wx",384);try{let k=0;for await(let b of n.body){if(k+=b.byteLength,k>s)throw be(e,s);await f.write(b)}}finally{await f.close()}}catch(f){throw await n.body.cancel().catch(()=>{}),await y(),Ee(f,e)}return{tarball:m,tag:p,url:e,cleanup:y}}async function Fe(e,t,r){let s=we(e,e),i=ye(s);for(let o=0;;o+=1){let n=await t(s.href,{redirect:"manual",credentials:"omit",signal:r,headers:{accept:"application/octet-stream"}});if(!ze.has(n.status))return{response:n,current:s,tag:i};let a=n.headers.get("location");if(await n.body?.cancel(),!a||o>=Ue)throw new l("RELEASE_DOWNLOAD_FAILED",`${e} redirects ${a?"too many times":"nowhere"}.`);s=we(new URL(a,s).href,e),i??=ye(s)}}function we(e,t){let r;try{r=new URL(e)}catch{throw new l("RELEASE_DOWNLOAD_FAILED",`${e} isn't a URL.`)}if(r.protocol!=="https:")throw new l("RELEASE_DOWNLOAD_FAILED",`${t} ${e===t?"isn't":`redirects to ${e}, which isn't`} an HTTPS URL.`);return r}function ye(e){if(e.hostname!=="github.com")return null;let t=/^\/[^/]+\/[^/]+\/releases\/download\/([^/]+)\/[^/]+$/.exec(e.pathname);return t?decodeURIComponent(t[1]):null}function be(e,t){return new l("RELEASE_TOO_LARGE",`${e} is over ${Math.round(t/1024/1024)} MB, too big for a release
2
+ A release is a few MB. Check the URL.`)}function Ee(e,t){if(e instanceof l)return e;let r=e.name;return new l("RELEASE_DOWNLOAD_FAILED",r==="TimeoutError"||r==="AbortError"?`Downloading ${t} timed out.`:`Couldn't download ${t}: ${e.message}`,{retryable:!0})}function x(e){return/^[a-z][a-z0-9+.-]*:\/\//i.test(e)}async function $e(e,{asset:t,what:r,step:s,missing:i,out:o,fetch:n}){if(!x(e)){let u=qe.resolve(e);if(!Me.existsSync(u))throw new l("RELEASE_NOT_FOUND",i);return{tarball:u,origin:{kind:"file",path:u},cleanup:async()=>{}}}let a=M(e);o.emit({type:"progress",step:s,message:`Downloading ${r} from ${a?`${a.repo}${a.tag?` release ${a.tag}`:"'s latest release"}`:e}...`,data:{url:e}});let p,g;if(a){let u=await ke({repo:a.repo,asset:t,tag:a.tag,fetch:n});p=u,g={kind:"github",repo:u.repo,tag:u.tag}}else{p=await F(e,{fetch:n});let u=p.tag?N(e):null;g=u&&p.tag?{kind:"github",repo:u,tag:p.tag}:{kind:"url",url:e}}return{tarball:p.tarball,origin:g,cleanup:p.cleanup}}function M(e){let t=N(e);if(!t||!x(e))return null;let r=new URL(e).pathname.split("/").filter(Boolean).slice(2);return r.length===0||r.length===1&&r[0]==="releases"?{repo:t}:r.length===3&&r[0]==="releases"&&r[1]==="tag"?{repo:t,tag:decodeURIComponent(r[2])}:r.length===2&&r[0]==="releases"&&r[1]==="latest"?{repo:t}:null}var V="everyapp-release.tar.gz",L="migrations",ve=w.join(".cloudflare","output"),_="v0",He="0.3.0",Ke="0.3.0",Ae=/^(\.DS_Store|\._.*)$/;function Je(e){try{return Ye(w.join(e,"package.json"))("@every-app/sdk/package.json").version??null}catch{return null}}var Qe=ae.extend({kind:R.literal("app"),appId:R.string().min(1),cliVersion:R.string(),sdkVersion:R.string().nullable(),manifest:R.record(R.string(),R.unknown())});function Mt(e){switch(e.kind){case"github":return`github.com/${e.repo} (release ${e.tag})`;case"url":return e.url;case"file":return e.path;case"checkout":return"this checkout"}}function Xe(e){if(e.migrations?.engine==="prisma")throw new l("RELEASE_MIGRATIONS_UNSUPPORTED",`${e.id} migrates with Prisma, which a release can't carry
3
+ Prisma migrations (migrations.engine "prisma") need the app's source and its Prisma CLI.`,{rerun:`${U} deploy`,rerunNote:"from the app's checkout"});if(e.migrations?.dialect==="postgresql")return z(e);let t=e.resources?.d1??[];return t.length===0?null:(oe(t,e.migrations),z(e))}async function Ze(e){return(await S.readdir(e,{recursive:!0,withFileTypes:!0})).filter(t=>!t.isDirectory()).map(t=>w.relative(e,w.join(t.parentPath,t.name)).split(w.sep).join("/")).sort()}async function et(e){let t=(await Ze(e)).filter(r=>{let s=w.posix.basename(r);return s.startsWith(".dev.vars")||s.startsWith(".env")||s.endsWith(".pem")||/(^|\/)\.cloudflare\/(state|types)(\/|$)/.test(r)||/(^|\/)\.(wrangler|everyapp)(\/|$)/.test(r)});if(t.length>0)throw new l("RELEASE_LOCAL_STATE",`Refusing to pack local state or secrets into the release:
4
+ ${t.join(`
5
+ `)}`)}async function tt(e){let t;try{t=await S.readFile(w.join(e,"meta","_journal.json"),"utf8")}catch(s){if(ne(s))return[];throw s}return(JSON.parse(t).entries??[]).map(({tag:s,when:i})=>({tag:s,when:i}))}function Se(e,t){let r=Ge("git",t,{cwd:e,encoding:"utf8"});return r.status===0?r.stdout.trim():null}function rt(e){return new Promise((t,r)=>{let s=Ve("tar",e,{stdio:["ignore","ignore","pipe"],env:{...process.env,COPYFILE_DISABLE:"1"}}),i="";s.stderr.on("data",o=>i+=o.toString()),s.once("error",r),s.once("close",o=>o===0?t():r(new l("RELEASE_PACK_FAILED",`tar couldn't pack the release (exit ${o}): ${i.trim()}`)))})}async function qt({cwd:e,manifest:t,outFile:r,cfVersion:s,builtAt:i=new Date}){let o=w.join(e,ve),n=q.existsSync(o)?(await S.readdir(o)).filter(y=>!Ae.test(y)):[];if(n.length!==1||n[0]!==_)throw new l("RELEASE_PACK_FAILED",`Expected the Build Output ${_} alone in ${o}, found ${n.length?n.join(", "):"none"}.`);let a=w.join(o,_);if(!await T(a))throw new l("RELEASE_PACK_FAILED",`The app's Build Output isn't a production build
6
+ A release ships only one.`,{fix:"build with `cf build` (production by default)"});let p=Xe(t),{dir:g,cleanup:u}=await P("app-release-stage-");try{let y=(E,c)=>S.cp(E,w.join(g,c),{recursive:!0,dereference:!0,filter:d=>!Ae.test(w.basename(d))});await y(a,w.join(ve,_));let m=p?w.resolve(e,p):null,f=m!==null&&q.existsSync(m)&&q.statSync(m).isDirectory();f&&await y(m,L),await et(g);let k=JSON.parse(await S.readFile(w.join(e,"package.json"),"utf8").catch(()=>"{}")),b=Se(e,["rev-parse","HEAD"]),v=b!==null&&!!Se(e,["status","--porcelain","--","."]),O={schema:1,kind:"app",appId:t.id,version:k.version??"0.0.0",gitSha:b?`${b}${v?"-dirty":""}`:"unknown",builtAt:i.toISOString(),cfVersion:s,cliVersion:B,sdkVersion:Je(e),buildOutputVersion:_,sha256:await ce(g),migrations:f?await tt(w.join(g,L)):[],minCli:He,minSdk:Ke,manifest:t.migrations||f?{...t,migrations:{engine:"drizzle",...t.migrations,dir:L}}:t};return await S.writeFile(w.join(g,"release.json"),`${JSON.stringify(O,null,2)}
7
+ `),await S.mkdir(w.dirname(r),{recursive:!0}),await S.rm(r,{force:!0}),await rt(["-czf",r,"-C",g,"."]),O}finally{await u()}}async function nt(e,{origin:t={kind:"file",path:e},version:r=B}={}){let{dir:s,manifest:i,cleanup:o}=await pe(e,"app",Qe);try{le(i,r,`${i.appId} ${i.version}`);let n;try{n=J(i.manifest,se)}catch(p){throw p instanceof K?new l("RELEASE_INVALID",`${e} carries a manifest this everyapp refuses: ${p.message}`):p}if(n.id!==i.appId)throw new l("RELEASE_INVALID",`${e} says it is ${i.appId}, but its manifest is ${n.id}'s.`);let a=n.migrations?.dir;if(a!==void 0&&a!==L)throw new l("RELEASE_INVALID",`${e}'s manifest keeps its migrations in ${a}; a release keeps them in ${L}/.`);return{dir:s,release:i,manifest:n,origin:t,cleanup:o}}catch(n){throw await o(),n}}async function Vt(e,{out:t,fetch:r,version:s}){let i=x(e)?M(e):null,o;try{o=await $e(e,{asset:V,what:"the app",step:"app.release",missing:`${e} is neither a URL nor a file
8
+ Pass a GitHub repository URL (https://github.com/<owner>/<repo>), a release tarball's URL, or a downloaded ${V}.`,out:t,fetch:r})}catch(n){throw i&&n instanceof l&&n.code==="RELEASE_NOT_FOUND"?new l("NO_RELEASE",`${i.repo} publishes no everyapp release${i.tag?` ${i.tag}`:""}
9
+ Its GitHub releases have no ${V}.`,{fix:`clone it, then run pnpm install in it and this checkout's ${U} deploy from its directory`}):n}try{let n=await nt(o.tarball,{origin:o.origin,version:s});return{...n,cleanup:async()=>{await n.cleanup(),await o.cleanup()}}}catch(n){throw await o.cleanup(),n}}import{rmSync as it}from"node:fs";import A from"node:fs/promises";import $ from"node:path";import{execa as st}from"execa";var ot=["drizzle.config.ts","drizzle.config.js"],Re=12e4;async function tr({cwd:e,manifest:t,out:r}){let s=t.migrations?.engine??"drizzle",i=t.migrations?.dialect==="postgresql",o=(m,f={})=>r.emit({type:"warning",code:"SCHEMA_CHECK_SKIPPED",step:"app.schema",message:`Can't check the schema against the migrations: ${m}${f.detail?`
10
+ ${f.detail}`:""}`,...f.fix?{data:{fix:f.fix}}:{}});if(s==="prisma"){r.emit({type:"progress",step:"app.schema",message:"To check a Prisma schema against its migrations: prisma migrate diff --from-migrations <dir> --to-schema <schema> --exit-code, with datasource.shadowDatabaseUrl set in prisma.config.ts."}),r.emit({type:"step",step:"app.schema",status:"skip",message:"Schema not checked against migrations (Prisma needs a shadow database; --verbose shows how)",data:{engine:s}});return}if(!i&&!t.resources?.d1?.length||s!=="drizzle")return;let n;try{n=(await re(e,"drizzle-kit","drizzle-kit")).binPath}catch{o("drizzle-kit isn't installed",{fix:"add drizzle-kit to devDependencies"});return}let a=t.migrations?.config,p=await at(e,a?[a]:ot);if(!p){o(a?`no ${a} (migrations.config)`:"no drizzle.config.ts",a?{}:{detail:'An app whose drizzle config lives elsewhere sets migrations.config to its path; an app that writes its SQL by hand sets migrations.engine to "d1-sql".'});return}r.emit({type:"step",step:"app.schema",status:"start",message:"Checking the schema..."});let g=$.resolve(e,t.migrations?.dir??"drizzle");me(e,".everyapp/"),await A.mkdir($.join(e,".everyapp"),{recursive:!0});let u=await A.mkdtemp($.join(e,".everyapp","schema-check-")),y=ee({sync:()=>it(u,{recursive:!0,force:!0})});try{let m=$.join(u,"migrations");await A.cp(g,m,{recursive:!0}).catch(async E=>{if(E.code!=="ENOENT")throw E;await A.mkdir(m)});let f=new Set(await Oe(m)),k=$.join(u,"drizzle.config.ts");await A.writeFile(k,[`import config from ${JSON.stringify(p)};`,`export default { ...config, out: ${JSON.stringify($.relative(e,m).split($.sep).join("/"))} };`,""].join(`
11
+ `));let b=$.join(u,"report-failure.cjs");await A.writeFile(b,["const report = console.error;","console.error = (...args) => {"," if (args.some((arg) => arg instanceof Error)) process.exitCode = 1;"," report(...args);","};",""].join(`
12
+ `));let v=await st(process.execPath,["--require",b,n,"generate","--config",k],{cwd:e,stdin:"ignore",reject:!1,timeout:Re,env:{NODE_NO_WARNINGS:"1"}});if((await Oe(m)).filter(E=>!f.has(E)).length>0)throw new l("SCHEMA_DRIFT",`The schema has changes no migration covers
13
+ drizzle-kit would write a new migration for them. Nothing was migrated or uploaded.`,{rerun:"pnpm db:generate",rerunNote:"then run this again"});if(v.failed){let E=v.stderr.split(`
14
+ `).map(d=>d.trim()).filter(Boolean),c=E.find(d=>/^\w*Error\b/.test(d))??E.at(-1)??(v.timedOut?`no answer in ${Re/1e3} s`:`exit ${v.exitCode}`);throw new l("SCHEMA_CHECK_FAILED",`drizzle-kit couldn't compare the schema with the migrations
15
+ ${c}. Nothing was migrated or uploaded.`,{rerun:"pnpm db:generate",rerunNote:"in a terminal; it asks about renamed columns and tables"})}r.emit({type:"step",step:"app.schema",status:"ok",message:"The schema matches the migrations."})}finally{await A.rm(u,{recursive:!0,force:!0}),y()}}async function at(e,t){for(let r of t){let s=$.join(e,r);try{if((await A.stat(s)).isFile())return s}catch{}}return null}async function Oe(e){return(await A.readdir(e,{recursive:!0,withFileTypes:!0})).filter(r=>r.isFile()&&r.name.endsWith(".sql")).map(r=>$.relative(e,$.join(r.parentPath,r.name)))}var ct=6e5,Ie={EVERYAPP_BUILD:"1"};async function cr({cwd:e,cf:t,buildCommand:r,verbose:s}){if(r){await ie(r,[],{cwd:e,env:{...process.env,...Ie,NODE_OPTIONS:te(process.env.NODE_OPTIONS)},shell:!0,echo:s,what:"Build",code:"BUILD_FAILED"});return}await t.run({args:["build"],plane:"project",cwd:e,mode:"text",env:Ie,timeoutMs:ct,...s?{onOutput:i=>void process.stderr.write(i)}:{}}).catch(i=>{throw i instanceof Z?new l("BUILD_FAILED",["Build failed","cf build's last lines:",...H(i.stdout,i.stderr).map(o=>` ${o}`)].join(`
16
+ `)):i})}import pt from"node:fs/promises";import G from"node:path";var lt=new Set(["text","json","secret","version-metadata","assets","d1","kv","r2","durable-object","workflow","worker","hyperdrive","queue","vectorize","ai","browser","images","send-email","secrets-store-secret","analytics-engine-dataset"]);function Pe(e,t){return e==="EVERY_APP_GATEWAY"&&t.worker===Q&&t.exportName==="AppGateway"}function W(e,t){return e===t||e.startsWith(`${t}${I}`)}var ut=["allowedSenderAddresses","destinationAddress","allowedDestinationAddresses"];function De(e){return e===void 0?"none":Array.isArray(e)?`[${[...new Set(e.map(String))].sort().join(", ")}]`:String(e)}function _e(e){return Array.isArray(e)?`list:${[...new Set(e.map(r=>JSON.stringify(r)))].sort().join(",")}`:`one:${JSON.stringify(e??null)}`}function dt(e,t,r){let s=r?.sendEmail??[],i=s.find(n=>n.name===e);if(!i){let n=s.map(a=>a.name);return`${e} is a send-email binding that everyapp.config.ts doesn't declare in resources.sendEmail${n.length?` (it declares ${n.join(", ")})`:""}`}let o=ut.filter(n=>_e(t[n])!==_e(i[n])).map(n=>`${n} is ${De(t[n])}, not ${De(i[n])}`);return o.length?`${e} isn't the send-email binding resources.sendEmail declares: ${o.join("; ")}`:null}function gt(e,t){let{workerName:r,helperWorkers:s=[]}=t,i=[];e.name!==r&&i.push(`its name is "${e.name}", not "${r}"`),i.push(...je(e),...Te(e,t));let o=e.env??{};for(let a of["EVERYAPP_IDENTITY_PUBLIC_KEYS","EVERYAPP_IDENTITY_ISSUER"])o[a]?.type!=="text"&&i.push(`${a} isn't built in`);let n=o.EVERYAPP_AUDIENCE;return(n?.type!=="text"||n.value!==r)&&i.push(`EVERYAPP_AUDIENCE isn't the Worker's name ("${r}")`),i.push(...Ne(o,t,(a,p)=>Pe(a,p)||s.includes(String(p.worker))),...xe(e.exports??{},t.deletedDurableObjects??[],r)),i}function ft(e,t,r){let s=[];return e.name!==t&&s.push(`its name is "${e.name}", not "${t}"`),s.push(...je(e),...Te(e,r),...Ne(e.env??{},r,Pe),...xe(e.exports??{},[],r.workerName)),s}function je(e){let t=[];e.workersDev!==!1&&t.push("workersDev isn't false"),e.previewUrls!==!1&&t.push("previewUrls isn't false"),e.domains?.length&&t.push("it declares domains (apps are served through the gateway)");for(let r of e.triggers??[])r.type==="scheduled"||r.type==="queue"||t.push(r.type==="fetch"?"it declares routes (apps are served through the gateway)":`it declares a trigger of type "${String(r.type)}" (apps may only declare cron schedules and consumers of their own queues)`);return e.env?.EVERYAPP_DEV&&t.push("EVERYAPP_DEV is set, which only `everyapp dev` may do"),t}function Te(e,{resources:t}){let r=Object.values(t.queues??{}).map(o=>o.name),s=r.length?`which isn't one of the app's queues in resources.queues (${r.join(", ")})`:"but an app consumes only its own queues, declared in resources.queues",i=[];for(let o of e.triggers??[]){if(o.type!=="queue")continue;let n=String(o.name??"");r.includes(n)||i.push(`it consumes queue "${n}", ${s}`);let a=o.deadLetterQueue;a!==void 0&&!r.includes(String(a))&&i.push(`its consumer of queue "${n}" sends failed messages to "${String(a)}", ${s}`)}return i}function Ne(e,{workerName:t,resources:r,helperWorkers:s=[],declared:i},o){let n=[],a=new Set([t,...s]),p=new Set(Object.values(r.d1??{}).map(c=>c.id)),g=new Set(Object.values(r.kv??{}).map(c=>c.id)),u=new Set(Object.values(r.hyperdrive??{}).map(c=>c.id)),y=new Set(Object.values(r.queues??{}).map(c=>c.name)),m=new Set(Object.values(r.vectorize??{}).map(c=>c.name)),f=Object.values(r.r2??{}).map(c=>c.name),k=i?.ai??[],b=i?.browser??[],v=i?.images??[],O=r.secretsStore??{},E=i?.analyticsEngine??[];for(let[c,d]of Object.entries(e)){if(!lt.has(String(d.type))){n.push(`${c} is a ${String(d.type)} binding, which EveryApp apps can't use`);continue}switch(d.type){case"worker":o(c,d)||n.push(`${c} binds Worker "${String(d.worker)}"; apps may only bind the gateway's AppGateway and, from the app's own Worker, its helper Workers`);break;case"durable-object":a.has(String(d.worker))||n.push(`${c} binds another Worker's Durable Object ("${String(d.worker)}")`);break;case"d1":p.has(String(d.id))||n.push(`${c} isn't a D1 database the deploy provisioned`);break;case"kv":g.has(String(d.id))||n.push(`${c} isn't a KV namespace the deploy provisioned`);break;case"hyperdrive":u.has(String(d.id))||n.push(`${c} isn't a Hyperdrive config the deploy provisioned`);break;case"queue":y.has(String(d.name))||n.push(`${c} is queue "${String(d.name)}", which isn't a queue the deploy provisioned (declare it in resources.queues)`);break;case"vectorize":m.has(String(d.name))||n.push(`${c} is Vectorize index "${String(d.name)}", which isn't one the deploy provisioned`);break;case"ai":k.includes(c)||n.push(k.length>0?`${c} is a Workers AI binding, which isn't one of the app's in resources.ai (${k.join(", ")})`:`${c} is a Workers AI binding, which everyapp.config.ts doesn't declare; list it in resources.ai`);break;case"browser":b.includes(c)||n.push(b.length>0?`${c} is a Browser Rendering binding, which isn't one of the app's in resources.browser (${b.join(", ")})`:`${c} is a Browser Rendering binding, which everyapp.config.ts doesn't declare; list it in resources.browser`);break;case"images":v.includes(c)||n.push(v.length>0?`${c} is an Images binding, which isn't one of the app's in resources.images (${v.join(", ")})`:`${c} is an Images binding, which everyapp.config.ts doesn't declare; list it in resources.images`);break;case"secrets-store-secret":{let h=Object.hasOwn(O,c)?O[c]:void 0;(!h||d.storeId!==h.storeId||d.secretName!==h.secretName)&&n.push(`${c} is Secrets Store secret "${String(d.secretName)}" in store "${String(d.storeId)}", which isn't the one the deploy provisioned for a binding in resources.secretsStore`);break}case"analytics-engine-dataset":{let h=E.find(C=>C.name===c);if(!h){n.push(E.length>0?`${c} is an Analytics Engine binding, which isn't one of the app's in resources.analyticsEngine (${E.map(C=>C.name).join(", ")})`:`${c} is an Analytics Engine binding, which everyapp.config.ts doesn't declare; list it in resources.analyticsEngine`);break}let Y=h.dataset??X(t,c),D=String(d.name??"");D!==Y?n.push(`${c} writes to dataset "${D}", not "${Y}", which resources.analyticsEngine declares`):D.startsWith("every-")&&!W(D,t)&&n.push(`${c} writes to dataset "${D}", which is named like another app's; a dataset resources.analyticsEngine names starts with "every-" only as ${t}${I}<name>`);break}case"r2":{let h=String(d.name??"");f.length>0?f.includes(h)||n.push(`${c} is bucket "${h}", which isn't one of the app's buckets in resources.r2 (${f.join(", ")})`):W(h,t)||n.push(`${c} is bucket "${h}"; an app's buckets are named after its Worker (${t} or ${t}${I}<name>)`);break}case"send-email":{let h=dt(c,d,i);h&&n.push(h);break}case"workflow":{let h=String(d.name??"");(!a.has(String(d.worker))||!W(h,t))&&n.push(`${c} binds Workflow "${h}" of Worker "${String(d.worker)}"; an app binds only its own Workflows, named after its Worker (${t}${I}<name>)`);break}}}return n}function xe(e,t,r){let s=[];for(let[i,o]of Object.entries(e))if(o.type!=="worker"){if(o.type==="workflow"){let n=String(o.name??"");W(n,r)||s.push(`Workflow ${i} is named "${n}"; an app's Workflows are named after its Worker (${r}${I}<name>)`);continue}if(o.type!=="durable-object"){s.push(`export ${i} is a ${String(o.type)}, which EveryApp apps can't declare`);continue}switch(o.container!==void 0&&s.push(`Durable Object class ${i} is backed by a container, which EveryApp apps can't run`),o.state??"created"){case"created":case"renamed":break;case"deleted":t.includes(i)||s.push(`Durable Object class ${i} is marked deleted, which deletes its data; remove it from everyapp.config.ts and deploy with --allow-delete-durable-object-data instead`);break;case"transferred":s.push(`Durable Object class ${i} would move its data to Worker "${String(o.transferredTo)}"`);break;case"expecting-transfer":s.push(`Durable Object class ${i} would take the data of Worker "${String(o.transferFrom)}"'s class`);break;default:s.push(`Durable Object class ${i} has state "${o.state}", which everyapp doesn't deploy`)}}return s}async function hr({cwd:e,inputs:t}){if(!await T(G.join(e,ue)))throw new l("APP_POLICY","The app's Build Output isn't a production build. The manifest's build command must run `cf build` (production by default).");let r=await ht(e),s=t.helperWorkers??[],i=[],o=r.get(j);if(!o)throw new l("APP_POLICY","The app's Build Output has no default Worker. Build it from everyAppWorker() in cloudflare.config.ts.");i.push(...gt(o.config,t));for(let[a,{config:p}]of r){if(a===j)continue;let g=String(p.name);if(!s.includes(g)){i.push(`the build has a Worker "${g}" that everyapp.config.ts doesn't declare in workers`);continue}i.push(...ft(p,g,t).map(u=>`${g}: ${u}`))}for(let a of s)[...r.values()].some(({config:p})=>p.name===a)||i.push(`the build has no Worker ${a}, which everyapp.config.ts declares; add it to the Vite plugin's auxiliaryWorkers with everyAppAuxiliaryWorker()`);if(i.length>0)throw new l("APP_POLICY",`The built Worker can't be deployed as an EveryApp app:
17
+ - ${i.join(`
18
+ - `)}
19
+ Build it from everyAppWorker() in cloudflare.config.ts.`);let n={};for(let[a,{config:p,directory:g}]of r){if(a!==j){let u=String(p.name);n[u]=Le(p,u)}if(p.manifest){let u={...p.manifest.modules??{}};for(let y of await fe(G.join(g,"bundle")))u[y]={type:"sourcemap"};p.manifest={...p.manifest,modules:u}}ge(p),await pt.writeFile(G.join(g,"worker.config.json"),`${JSON.stringify(p,null,2)}
20
+ `)}return{workflows:Le(o.config,t.workerName),helperWorkflows:n,r2Buckets:[...new Set([...r.values()].flatMap(({config:a})=>mt(a)))].sort()}}function mt(e){let t=e.env??{};return Object.values(t).filter(r=>r?.type==="r2"&&typeof r.name=="string").map(r=>r.name)}function Le(e,t){let r=[...Object.values(e.exports??{}).filter(s=>s.type==="workflow").map(s=>String(s.name)),...Object.values(e.env??{}).filter(s=>s.type==="workflow"&&s.worker===t).map(s=>String(s.name))];return[...new Set(r)]}async function ht(e){let t=new Map;for await(let{name:r,config:s,directory:i}of de(e))t.set(r,{config:s,directory:i});return t}export{tr as a,cr as b,hr as c,V as d,Mt as e,qt as f,Vt as g};
@@ -1,2 +1,2 @@
1
- import{q as d}from"./chunk-JYKRUS5C.js";import{Fb as u,Hb as l,cc as p}from"./chunk-LYNBZ7RV.js";var P=50,y=20;function g(t,r,e={}){return p(t,["ssl","certificate-packs","list","-z",r,...e.allStatuses?["--status","all"]:[]],d,{perPage:P,maxPages:y})}function m(t){return!t.status||t.status==="active"}function C(t){return(t.hosts??[]).map(r=>r.toLowerCase())}function w(t,r){let e=t.toLowerCase();if(e===r)return!0;if(!e.startsWith("*."))return!1;let[,...i]=r.split(".");return i.join(".")===e.slice(2)}async function b(t,r,e){let i=(await g(t,r)).filter(m);return e.map(o=>({host:o,ready:i.some(s=>(s.hosts??[]).some(n=>w(n,o.toLowerCase())))}))}function v(t,r){let e=r.toLowerCase(),i=new Set([e,`*.${e}`]),o=[...t],s=[];for(let n of t){if(n.type==="universal")continue;let a=C(n);if(!a.includes(e))continue;let f=o.filter(c=>c!==n&&m(c));a.every(c=>i.has(c)||f.some(k=>C(k).includes(c)))&&(o.splice(o.indexOf(n),1),s.push(n))}return s}var S=new Set(["pending_deletion","deleted","pending_cleanup"]);function R(t,r){let e=t.find(i=>i.id===r);return!e||S.has((e.status??"").toLowerCase())}async function h(t,r,e){await t.run({plane:"account",mode:"json",args:["ssl","certificate-packs","delete",e,"-z",r,"--force"]})}async function T({cf:t,out:r,zoneId:e,hostname:i}){let o="app.certificate",s=[];try{let n=v(await g(t,e),i);for(let a of n)try{await h(t,e,a.id),s.push(a.id)}catch(f){if(!l(f,"not_found"))throw f}}catch(n){return r.emit({type:"warning",code:"CERT_CLEANUP_FAILED",step:o,message:[`Couldn't remove ${i}'s certificate`,`It serves nothing now. Cloudflare said: ${u(n)}.`,"Optional: delete it in the Cloudflare dashboard (SSL/TLS \u2192 Edge Certificates)."].join(`
1
+ import{q as d}from"./chunk-RQBSTNL7.js";import{Ec as p,fc as u,hc as l}from"./chunk-FQ2A7YAP.js";var P=50,y=20;function g(t,r,e={}){return p(t,["ssl","certificate-packs","list","-z",r,...e.allStatuses?["--status","all"]:[]],d,{perPage:P,maxPages:y})}function m(t){return!t.status||t.status==="active"}function C(t){return(t.hosts??[]).map(r=>r.toLowerCase())}function w(t,r){let e=t.toLowerCase();if(e===r)return!0;if(!e.startsWith("*."))return!1;let[,...i]=r.split(".");return i.join(".")===e.slice(2)}async function b(t,r,e){let i=(await g(t,r)).filter(m);return e.map(o=>({host:o,ready:i.some(s=>(s.hosts??[]).some(n=>w(n,o.toLowerCase())))}))}function v(t,r){let e=r.toLowerCase(),i=new Set([e,`*.${e}`]),o=[...t],s=[];for(let n of t){if(n.type==="universal")continue;let a=C(n);if(!a.includes(e))continue;let f=o.filter(c=>c!==n&&m(c));a.every(c=>i.has(c)||f.some(k=>C(k).includes(c)))&&(o.splice(o.indexOf(n),1),s.push(n))}return s}var S=new Set(["pending_deletion","deleted","pending_cleanup"]);function R(t,r){let e=t.find(i=>i.id===r);return!e||S.has((e.status??"").toLowerCase())}async function h(t,r,e){await t.run({plane:"account",mode:"json",args:["ssl","certificate-packs","delete",e,"-z",r,"--force"]})}async function T({cf:t,out:r,zoneId:e,hostname:i}){let o="app.certificate",s=[];try{let n=v(await g(t,e),i);for(let a of n)try{await h(t,e,a.id),s.push(a.id)}catch(f){if(!l(f,"not_found"))throw f}}catch(n){return r.emit({type:"warning",code:"CERT_CLEANUP_FAILED",step:o,message:[`Couldn't remove ${i}'s certificate`,`It serves nothing now. Cloudflare said: ${u(n)}.`,"Optional: delete it in the Cloudflare dashboard (SSL/TLS \u2192 Edge Certificates)."].join(`
2
2
  `)}),s}return s.length>0&&r.emit({type:"step",step:o,status:"ok",message:`Removed ${i}'s certificate.`,data:{hostname:i,certificatePacks:s}}),s}export{g as a,b,v as c,R as d,h as e,T as f};
@@ -1,4 +1,4 @@
1
- import{b as k}from"./chunk-T2GD7RHS.js";import{Bb as S,Fb as C,Jb as M,Pb as U,c as q,g as H,i as h,jc as p}from"./chunk-LYNBZ7RV.js";import{randomBytes as J}from"node:crypto";import R from"node:os";var Z={["app.deploy"]:{noun:"deploy",of:e=>`a deploy${e?` of ${e}`:""}`},["app.register"]:{noun:"registration",of:e=>`a registration${e?` of ${e}`:""}`},["app.secrets"]:{noun:"secret change",of:e=>`a secret change${e?` on ${e}`:""}`},["app.email"]:{noun:"email change",of:e=>`an email change${e?` on ${e}`:""}`},["gateway.deploy"]:{noun:"Gateway install",of:()=>"a Gateway install"},["gateway.upgrade"]:{noun:"Gateway upgrade",of:()=>"a Gateway upgrade"},["gateway.reconcile"]:{noun:"Gateway update",of:()=>"an update of the Gateway's apps"},["gateway.secrets"]:{noun:"Gateway settings change",of:()=>"a change to the Gateway's settings"},["access.sync"]:{noun:"Cloudflare Access update",of:()=>"an update of Cloudflare Access"},["db.restore"]:{noun:"database restore",of:e=>`a restore of ${e?`${e}'s database`:"the Gateway's database"}`}},ee=`CREATE TABLE IF NOT EXISTS _everyapp_deploy_lease (
1
+ import{b as k}from"./chunk-TIYSZWP5.js";import{Fc as p,bc as S,c as q,fc as C,g as H,i as h,jc as M,pc as U}from"./chunk-FQ2A7YAP.js";import{randomBytes as J}from"node:crypto";import R from"node:os";var Z={["app.deploy"]:{noun:"deploy",of:e=>`a deploy${e?` of ${e}`:""}`},["app.register"]:{noun:"registration",of:e=>`a registration${e?` of ${e}`:""}`},["app.secrets"]:{noun:"secret change",of:e=>`a secret change${e?` on ${e}`:""}`},["app.email"]:{noun:"email change",of:e=>`an email change${e?` on ${e}`:""}`},["gateway.deploy"]:{noun:"Gateway install",of:()=>"a Gateway install"},["gateway.upgrade"]:{noun:"Gateway upgrade",of:()=>"a Gateway upgrade"},["gateway.reconcile"]:{noun:"Gateway update",of:()=>"an update of the Gateway's apps"},["gateway.secrets"]:{noun:"Gateway settings change",of:()=>"a change to the Gateway's settings"},["access.sync"]:{noun:"Cloudflare Access update",of:()=>"an update of Cloudflare Access"},["db.restore"]:{noun:"database restore",of:e=>`a restore of ${e?`${e}'s database`:"the Gateway's database"}`}},ee=`CREATE TABLE IF NOT EXISTS _everyapp_deploy_lease (
2
2
  id TEXT PRIMARY KEY,
3
3
  holder TEXT NOT NULL,
4
4
  purpose TEXT NOT NULL,
@@ -1 +1 @@
1
- import{Gb as c,Hb as u,bc as a}from"./chunk-LYNBZ7RV.js";import{z as i}from"zod";var f=i.looseObject({enabled:i.boolean(),name:i.string().nullish(),status:i.string().nullish()}),p=i.looseObject({type:i.string(),field:i.string().nullish(),value:i.string().nullish()}),d=i.looseObject({type:i.string(),value:i.array(i.string()).nullish()}),l=i.looseObject({id:i.string().nullish(),tag:i.string().nullish(),name:i.string().nullish(),enabled:i.boolean().nullish(),matchers:i.array(p).nullish(),actions:i.array(d).nullish()}).transform(n=>({id:n.id??n.tag??null,name:n.name??null,enabled:n.enabled??!0,matchers:n.matchers??[],actions:n.actions??[]})),y=i.array(l),g=50,h=10;function C(n,t){return a(n,{plane:"account",args:["email-routing","settings","get","-z",t]},f)}async function x(n,t,e){await n.run({plane:"account",mode:"json",args:["email-routing","enable","-z",t,"--name",e]})}async function j(n,t){await n.run({plane:"account",mode:"json",args:["email-routing","disable","-z",t,"--force"]})}async function z(n,t){let e=new Map;for(let r=1;r<=h;r+=1){let o=await a(n,{plane:"account",args:["email-routing","rules","list-account","-z",t,"--per-page",String(g),"--page",String(r)]},y),m=e.size;for(let[R,s]of o.entries())e.set(s.id??`${r}:${R}`,s);if(o.length<g||e.size===m)break}return[...e.values()]}async function P(n,t,e){try{return await a(n,{plane:"account",args:["email-routing","rules","get",e,"-z",t]},l)}catch(r){if(u(r,"not_found"))return null;throw r}}async function v(n,t,e){let r=await a(n,{plane:"account",files:{"rule.json":e},args:o=>["email-routing","rules","create","-z",t,"--body",`@${o["rule.json"]}`]},l);if(!r.id)throw new c({message:"cf email-routing rules create answered without the new rule's id.",apiCodes:[],kind:"unknown"},{exitCode:0,stderr:""});return r.id}async function A(n,t,e,r){await n.run({plane:"account",mode:"json",files:{"rule.json":r},args:o=>["email-routing","rules","update",e,"-z",t,"--body",`@${o["rule.json"]}`]})}async function O(n,t,e){try{return await n.run({plane:"account",mode:"json",args:["email-routing","rules","delete",e,"-z",t,"--force"]}),!0}catch(r){if(u(r,"not_found"))return!1;throw r}}function S(n,t){return a(n,{plane:"account",args:["email-routing","rules","catch-all","get","-z",t]},l)}async function k(n,t,e){await n.run({plane:"account",mode:"json",files:{"catch-all.json":e},args:r=>["email-routing","rules","catch-all","update","-z",t,"--body",`@${r["catch-all.json"]}`]})}function $(n){return n.actions.find(e=>e.type==="worker")?.value?.[0]??null}function B(n){let t=n.matchers.find(e=>e.type==="literal"&&(e.field??"to")==="to");return t?.value?t.value.toLowerCase():null}export{C as a,x as b,j as c,z as d,P as e,v as f,A as g,O as h,S as i,k as j,$ as k,B as l};
1
+ import{Dc as a,gc as c,hc as u}from"./chunk-FQ2A7YAP.js";import{z as i}from"zod";var f=i.looseObject({enabled:i.boolean(),name:i.string().nullish(),status:i.string().nullish()}),p=i.looseObject({type:i.string(),field:i.string().nullish(),value:i.string().nullish()}),d=i.looseObject({type:i.string(),value:i.array(i.string()).nullish()}),l=i.looseObject({id:i.string().nullish(),tag:i.string().nullish(),name:i.string().nullish(),enabled:i.boolean().nullish(),matchers:i.array(p).nullish(),actions:i.array(d).nullish()}).transform(n=>({id:n.id??n.tag??null,name:n.name??null,enabled:n.enabled??!0,matchers:n.matchers??[],actions:n.actions??[]})),y=i.array(l),g=50,h=10;function C(n,t){return a(n,{plane:"account",args:["email-routing","settings","get","-z",t]},f)}async function x(n,t,e){await n.run({plane:"account",mode:"json",args:["email-routing","enable","-z",t,"--name",e]})}async function j(n,t){await n.run({plane:"account",mode:"json",args:["email-routing","disable","-z",t,"--force"]})}async function z(n,t){let e=new Map;for(let r=1;r<=h;r+=1){let o=await a(n,{plane:"account",args:["email-routing","rules","list-account","-z",t,"--per-page",String(g),"--page",String(r)]},y),m=e.size;for(let[R,s]of o.entries())e.set(s.id??`${r}:${R}`,s);if(o.length<g||e.size===m)break}return[...e.values()]}async function P(n,t,e){try{return await a(n,{plane:"account",args:["email-routing","rules","get",e,"-z",t]},l)}catch(r){if(u(r,"not_found"))return null;throw r}}async function v(n,t,e){let r=await a(n,{plane:"account",files:{"rule.json":e},args:o=>["email-routing","rules","create","-z",t,"--body",`@${o["rule.json"]}`]},l);if(!r.id)throw new c({message:"cf email-routing rules create answered without the new rule's id.",apiCodes:[],kind:"unknown"},{exitCode:0,stderr:""});return r.id}async function A(n,t,e,r){await n.run({plane:"account",mode:"json",files:{"rule.json":r},args:o=>["email-routing","rules","update",e,"-z",t,"--body",`@${o["rule.json"]}`]})}async function O(n,t,e){try{return await n.run({plane:"account",mode:"json",args:["email-routing","rules","delete",e,"-z",t,"--force"]}),!0}catch(r){if(u(r,"not_found"))return!1;throw r}}function S(n,t){return a(n,{plane:"account",args:["email-routing","rules","catch-all","get","-z",t]},l)}async function k(n,t,e){await n.run({plane:"account",mode:"json",files:{"catch-all.json":e},args:r=>["email-routing","rules","catch-all","update","-z",t,"--body",`@${r["catch-all.json"]}`]})}function $(n){return n.actions.find(e=>e.type==="worker")?.value?.[0]??null}function B(n){let t=n.matchers.find(e=>e.type==="literal"&&(e.field??"to")==="to");return t?.value?t.value.toLowerCase():null}export{C as a,x as b,j as c,z as d,P as e,v as f,A as g,O as h,S as i,k as j,$ as k,B as l};
@@ -1,4 +1,4 @@
1
- import{c as e}from"./chunk-LYNBZ7RV.js";import{buildCommand as n,buildRouteMap as c}from"@stricli/core";var r={kind:"parsed",parse:String,brief:"The Gateway's URL, checked against the Gateway in your Cloudflare account (default: EVERYAPP_GATEWAY_URL)",optional:!0},i={kind:"parsed",parse:String,brief:"The Cloudflare account of the Gateway, when your login sees several (default: CLOUDFLARE_ACCOUNT_ID)",optional:!0},g={kind:"parsed",parse:String,brief:"The organization to act on, by slug, id or name (default: the install organization; a name two organizations share is refused, ORG_AMBIGUOUS: give the slug)",placeholder:"slug",optional:!0},l={kind:"boolean",brief:"Print NDJSON events on stdout and never prompt (exit 0 done, 1 error, 2 action required, 251/252 bad command or arguments)",optional:!0},f={kind:"boolean",brief:"Print the result as an NDJSON event",optional:!0},d={kind:"boolean",brief:"Show every step and progress line, the output of what everyapp runs, and an unexpected error's stack trace",optional:!0},w={kind:"boolean",brief:"Skip everyapp's own confirmations (never cf's questions, or the one before replacing a Worker changed outside everyapp)",optional:!0},u={kind:"boolean",brief:"Publish new hostnames even where a DNS record answers them (one at a hostname is replaced)",optional:!0},y={"allow-delete-durable-object-data":{kind:"boolean",brief:"Deploy even though Durable Object classes were removed, deleting their data",optional:!0},"allow-delete-workflows":{kind:"boolean",brief:"Deploy even though Workflows were removed, deleting them and their instances",optional:!0},"force-dns":{...u,brief:"Publish the app's new hostname even where a DNS record answers it (one at the hostname is replaced)"},"enable-email-routing":{kind:"boolean",brief:"Turn on Email Routing for the domains the app's inbound addresses (everyapp email set --inbound) name that don't route mail yet (locks their MX and SPF records to Cloudflare)",optional:!0}};var p=(o=>(o.Senders="senders",o.Inbound="inbound",o))(p||{}),t={manifest:{kind:"parsed",parse:String,brief:"Path to everyapp.config.ts, if it isn't in this directory",placeholder:"path",optional:!0},gateway:r,"account-id":i,json:l,verbose:d},m=n({loader:async()=>{let{set:a}=await import("./email-RLZFUFUN.js");return a},parameters:{positional:{kind:"tuple",parameters:[]},flags:{sender:{kind:"parsed",parse:String,variadic:!0,optional:!0,placeholder:"pattern",brief:"Address the app may send as: '*@<domain>' or one address (repeat, up to 20)"},inbound:{kind:"parsed",parse:String,variadic:!0,optional:!0,placeholder:"address",brief:"Address whose mail goes to the app: '*@<apex>' or one address (repeat, up to 50)"},"enable-email-routing":{kind:"boolean",optional:!0,brief:"Turn on Email Routing for inbound domains without asking"},...t}},docs:{brief:"Set senders or inbound addresses, without a deploy",fullDescription:["Each flag replaces its whole list; a list you don't name is kept. The Gateway","picks up a change within 30 seconds, without a deploy. Addresses set before","the app's first upload are routed by its next deploy.","","Requirements:"," --sender everyapp.config.ts lists capabilities.email; each domain is set up for Email Sending"," --inbound everyapp.config.ts declares email: { inbound: true }; the domain is on Cloudflare DNS","","Examples:",` ${e} email set --sender '*@mail.example.com'`,` ${e} email set --inbound reports@mail.example.com`,` ${e} email set --inbound '*@example.com' --enable-email-routing`].join(`
2
- `)}}),b=n({loader:async()=>{let{unset:a}=await import("./email-RLZFUFUN.js");return a},parameters:{positional:{kind:"array",minimum:1,parameter:{brief:"List to clear: senders or inbound",placeholder:"senders|inbound",parse:a=>{let s=Object.values(p).find(o=>o===a);if(!s)throw new Error("Use senders, inbound, or both.");return s}}},flags:t},docs:{brief:"Clear senders or inbound addresses, without a deploy",fullDescription:["Clearing inbound addresses removes their Email Routing rules; a catch-all goes","back to dropping mail. Nothing is built or deployed.","","Examples:",` ${e} email unset inbound`,` ${e} email unset senders inbound`].join(`
3
- `)}}),h=n({loader:async()=>{let{show:a}=await import("./email-RLZFUFUN.js");return a},parameters:{positional:{kind:"tuple",parameters:[]},flags:t},docs:{brief:"Show the app's senders and inbound addresses",fullDescription:["Lists the app's senders and inbound addresses on the Gateway, and whether each","inbound address is routed.","","Examples:",` ${e} email show`,` ${e} email show --manifest ../analytics/everyapp.config.ts`].join(`
1
+ import{c as e}from"./chunk-FQ2A7YAP.js";import{buildCommand as n,buildRouteMap as c}from"@stricli/core";var r={kind:"parsed",parse:String,brief:"The Gateway's URL, checked against the Gateway in your Cloudflare account (default: EVERYAPP_GATEWAY_URL)",optional:!0},i={kind:"parsed",parse:String,brief:"The Cloudflare account of the Gateway, when your login sees several (default: CLOUDFLARE_ACCOUNT_ID)",optional:!0},g={kind:"parsed",parse:String,brief:"The organization to act on, by slug, id or name (default: the install organization; a name two organizations share is refused, ORG_AMBIGUOUS: give the slug)",placeholder:"slug",optional:!0},l={kind:"boolean",brief:"Print NDJSON events on stdout and never prompt (exit 0 done, 1 error, 2 action required, 251/252 bad command or arguments)",optional:!0},f={kind:"boolean",brief:"Print the result as an NDJSON event",optional:!0},d={kind:"boolean",brief:"Show every step and progress line, the output of what everyapp runs, and an unexpected error's stack trace",optional:!0},w={kind:"boolean",brief:"Skip everyapp's own confirmations (never cf's questions, or the one before replacing a Worker changed outside everyapp)",optional:!0},u={kind:"boolean",brief:"Publish new hostnames even where a DNS record answers them (one at a hostname is replaced)",optional:!0},y={"allow-delete-durable-object-data":{kind:"boolean",brief:"Deploy even though Durable Object classes were removed, deleting their data",optional:!0},"allow-delete-workflows":{kind:"boolean",brief:"Deploy even though Workflows were removed, deleting them and their instances",optional:!0},"force-dns":{...u,brief:"Publish the app's new hostname even where a DNS record answers it (one at the hostname is replaced)"},"enable-email-routing":{kind:"boolean",brief:"Turn on Email Routing for the domains the app's inbound addresses (everyapp email set --inbound) name that don't route mail yet (locks their MX and SPF records to Cloudflare)",optional:!0}};var p=(o=>(o.Senders="senders",o.Inbound="inbound",o))(p||{}),t={manifest:{kind:"parsed",parse:String,brief:"Path to everyapp.config.ts, if it isn't in this directory",placeholder:"path",optional:!0},gateway:r,"account-id":i,json:l,verbose:d},m=n({loader:async()=>{let{set:a}=await import("./email-SWJQXEUR.js");return a},parameters:{positional:{kind:"tuple",parameters:[]},flags:{sender:{kind:"parsed",parse:String,variadic:!0,optional:!0,placeholder:"pattern",brief:"Address the app may send as: '*@<domain>' or one address (repeat, up to 20)"},inbound:{kind:"parsed",parse:String,variadic:!0,optional:!0,placeholder:"address",brief:"Address whose mail goes to the app: '*@<apex>' or one address (repeat, up to 50)"},"enable-email-routing":{kind:"boolean",optional:!0,brief:"Turn on Email Routing for inbound domains without asking"},...t}},docs:{brief:"Set senders or inbound addresses, without a deploy",fullDescription:["Each flag replaces its whole list; a list you don't name is kept. The Gateway","picks up a change within 30 seconds, without a deploy. Addresses set before","the app's first upload are routed by its next deploy.","","Requirements:"," --sender everyapp.config.ts lists capabilities.email; each domain is set up for Email Sending"," --inbound everyapp.config.ts declares email: { inbound: true }; the domain is on Cloudflare DNS","","Examples:",` ${e} email set --sender '*@mail.example.com'`,` ${e} email set --inbound reports@mail.example.com`,` ${e} email set --inbound '*@example.com' --enable-email-routing`].join(`
2
+ `)}}),b=n({loader:async()=>{let{unset:a}=await import("./email-SWJQXEUR.js");return a},parameters:{positional:{kind:"array",minimum:1,parameter:{brief:"List to clear: senders or inbound",placeholder:"senders|inbound",parse:a=>{let s=Object.values(p).find(o=>o===a);if(!s)throw new Error("Use senders, inbound, or both.");return s}}},flags:t},docs:{brief:"Clear senders or inbound addresses, without a deploy",fullDescription:["Clearing inbound addresses removes their Email Routing rules; a catch-all goes","back to dropping mail. Nothing is built or deployed.","","Examples:",` ${e} email unset inbound`,` ${e} email unset senders inbound`].join(`
3
+ `)}}),h=n({loader:async()=>{let{show:a}=await import("./email-SWJQXEUR.js");return a},parameters:{positional:{kind:"tuple",parameters:[]},flags:t},docs:{brief:"Show the app's senders and inbound addresses",fullDescription:["Lists the app's senders and inbound addresses on the Gateway, and whether each","inbound address is routed.","","Examples:",` ${e} email show`,` ${e} email show --manifest ../analytics/everyapp.config.ts`].join(`
4
4
  `)}}),S=c({routes:{show:h,set:m,unset:b},docs:{brief:"Manage the addresses an app sends as and receives at"}});export{r as a,i as b,g as c,l as d,f as e,d as f,w as g,u as h,y as i,S as j};