everyapp 0.2.2 → 0.3.0-rc.2

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 (128) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +6 -77
  3. package/bin/everyapp.js +235 -0
  4. package/dist/access-LGEN3ABJ.js +1 -0
  5. package/dist/activity-RSD4D66F.js +12 -0
  6. package/dist/apps-4RCFXT74.js +13 -0
  7. package/dist/chunk-23HJ5I2A.js +2 -0
  8. package/dist/chunk-2Y5Q6A5K.js +6 -0
  9. package/dist/chunk-4JRIS6S6.js +1 -0
  10. package/dist/chunk-5PTNYZK6.js +4 -0
  11. package/dist/chunk-6OGVO7QK.js +6 -0
  12. package/dist/chunk-6PGUCTJ6.js +11 -0
  13. package/dist/chunk-AGTCKFRB.js +22 -0
  14. package/dist/chunk-BHMRY53V.js +2 -0
  15. package/dist/chunk-CB4U7H2G.js +4 -0
  16. package/dist/chunk-CCWBPAKH.js +4 -0
  17. package/dist/chunk-CZTEDWZ2.js +22 -0
  18. package/dist/chunk-CZXHKPRZ.js +2 -0
  19. package/dist/chunk-E3EPK27P.js +10 -0
  20. package/dist/chunk-EGEWRFVY.js +1 -0
  21. package/dist/chunk-ELK7QZ2M.js +1 -0
  22. package/dist/chunk-FJJSSVET.js +33 -0
  23. package/dist/chunk-GKBPYVP3.js +25 -0
  24. package/dist/chunk-H6QQMY7B.js +18 -0
  25. package/dist/chunk-H7PDL3X5.js +1 -0
  26. package/dist/chunk-HOUHG236.js +20 -0
  27. package/dist/chunk-IFCPALVC.js +46 -0
  28. package/dist/chunk-IUOBIB5M.js +30 -0
  29. package/dist/chunk-J35DDCNU.js +1 -0
  30. package/dist/chunk-J455FAEN.js +7 -0
  31. package/dist/chunk-JYKRUS5C.js +1 -0
  32. package/dist/chunk-LXYMDZER.js +1 -0
  33. package/dist/chunk-LYNBZ7RV.js +57 -0
  34. package/dist/chunk-M2QQ2UD7.js +132 -0
  35. package/dist/chunk-N4E5YE4X.js +5 -0
  36. package/dist/chunk-N5GQLGEC.js +2 -0
  37. package/dist/chunk-NFU4YFXB.js +1 -0
  38. package/dist/chunk-OM2HDWVP.js +1 -0
  39. package/dist/chunk-ONLNJXVQ.js +32 -0
  40. package/dist/chunk-OP4DYXYI.js +2 -0
  41. package/dist/chunk-PNLU5U3P.js +1 -0
  42. package/dist/chunk-PS7S74DG.js +6 -0
  43. package/dist/chunk-RMF4YGD6.js +98 -0
  44. package/dist/chunk-T2GD7RHS.js +10 -0
  45. package/dist/chunk-TLRM3P7V.js +15 -0
  46. package/dist/chunk-W3JCQHHU.js +1 -0
  47. package/dist/chunk-WOVS3GV5.js +10 -0
  48. package/dist/chunk-YHJZMJYZ.js +1 -0
  49. package/dist/chunk-ZECBN24L.js +15 -0
  50. package/dist/chunk-ZEXVHB22.js +2 -0
  51. package/dist/chunk-ZFCUH5PK.js +7 -0
  52. package/dist/configure-F7UZCJUG.js +8 -0
  53. package/dist/create-2E5HVWYK.js +22 -0
  54. package/dist/db-HEQVTDTM.js +9 -0
  55. package/dist/delete-XCSIQIRS.js +3 -0
  56. package/dist/deploy-3QOZEZHC.js +1 -0
  57. package/dist/dev-JL3ZP5BT.js +86 -0
  58. package/dist/email-RLZFUFUN.js +10 -0
  59. package/dist/events-2V5VRBWP.js +15 -0
  60. package/dist/groups-HDG5DVFY.js +8 -0
  61. package/dist/index.js +97 -1
  62. package/dist/install-Z5FYXUYM.js +1 -0
  63. package/dist/login-KHJBC64Z.js +1 -0
  64. package/dist/mcp-EFDUKJ5V.js +1 -0
  65. package/dist/provider-EOI5PTFH.js +13 -0
  66. package/dist/release-74J5ZIL3.js +1 -0
  67. package/dist/restore-FFGYV7NO.js +3 -0
  68. package/dist/secret-7FKKTLHB.js +1 -0
  69. package/dist/setup-PAKRCAFO.js +1 -0
  70. package/dist/signin-AP3D4XM4.js +12 -0
  71. package/dist/status-RMWNHOEK.js +4 -0
  72. package/dist/teardown-E4JNKAZJ.js +22 -0
  73. package/dist/update-DWVZFNPS.js +1 -0
  74. package/dist/workspace-CJC5I66L.js +21 -0
  75. package/package.json +19 -16
  76. package/skills/build-every-app/SKILL.md +199 -0
  77. package/skills/build-every-app/patterns.md +140 -0
  78. package/skills/everyapp/SKILL.md +292 -0
  79. package/skills/everyapp/mcp.md +350 -0
  80. package/skills/everyapp/security-review.md +61 -0
  81. package/skills/everyapp/setup/README.md +274 -0
  82. package/skills/everyapp/setup/access.md +178 -0
  83. package/skills/everyapp/setup/context.md +117 -0
  84. package/skills/everyapp/setup/dataforseo.md +287 -0
  85. package/skills/everyapp/setup/email.md +366 -0
  86. package/skills/everyapp/setup/gateway.md +243 -0
  87. package/skills/everyapp/setup/google.md +360 -0
  88. package/skills/everyapp/setup/microsoft-365.md +281 -0
  89. package/skills/everyapp/setup/openai.md +318 -0
  90. package/skills/everyapp/setup/openrouter.md +309 -0
  91. package/skills/everyapp/setup/providers.md +1253 -0
  92. package/skills/everyapp/setup/remote-mcp.md +199 -0
  93. package/skills/everyapp/setup/signin-apple.md +178 -0
  94. package/skills/everyapp/setup/signin-cloudflare.md +148 -0
  95. package/skills/everyapp/setup/signin-github.md +139 -0
  96. package/skills/everyapp/setup/signin-google.md +178 -0
  97. package/skills/everyapp/setup/signin-microsoft.md +183 -0
  98. package/skills/everyapp/setup/signin-oidc.md +163 -0
  99. package/skills/everyapp/setup/slack.md +344 -0
  100. package/skills/everyapp/setup/workers-ai.md +138 -0
  101. package/bin/__everyapp_bash_complete.js +0 -12
  102. package/dist/bash-complete.js +0 -3
  103. package/dist/chunk-7BOQJFI5.js +0 -8
  104. package/dist/chunk-7YVJFS4A.js +0 -1
  105. package/dist/chunk-BIXKPCDH.js +0 -2
  106. package/dist/chunk-DLGPLHBH.js +0 -47
  107. package/dist/chunk-FD6K2YA7.js +0 -9
  108. package/dist/chunk-GAJEQYJH.js +0 -39
  109. package/dist/chunk-O2KDOP5R.js +0 -13
  110. package/dist/chunk-OI2MBGBG.js +0 -4
  111. package/dist/chunk-POSDLD3G.js +0 -8
  112. package/dist/chunk-RB5D2R45.js +0 -1
  113. package/dist/chunk-U4LIQ5VR.js +0 -1
  114. package/dist/chunk-VEYSNPDH.js +0 -3
  115. package/dist/chunk-VP6SKW44.js +0 -7
  116. package/dist/chunk-WO3NE7ZU.js +0 -7
  117. package/dist/chunk-XTO2VTPY.js +0 -6
  118. package/dist/chunk-YJ2DKIZS.js +0 -1
  119. package/dist/create-DYQ3NBWJ.js +0 -22
  120. package/dist/deploy-PYTCMDGV.js +0 -7
  121. package/dist/deploy-RMAHOA4Z.js +0 -55
  122. package/dist/dev-SAE237FS.js +0 -0
  123. package/dist/generateConfig-46Z3ERF3.js +0 -1
  124. package/dist/login-B6EF3SMX.js +0 -1
  125. package/dist/logout-XMKZBLNV.js +0 -1
  126. package/dist/remoteD1Shell-A67JMO3H.js +0 -6
  127. package/dist/setupLocal-TZJUW5ES.js +0 -6
  128. package/gateway/every-app-gateway-build.tar.gz +0 -0
@@ -0,0 +1,15 @@
1
+ import{c as M,e as H}from"./chunk-HOUHG236.js";import{Bb as A,Fb as O,Gb as z,Hb as g,bc as d,c as L,cc as _,ec as j,f as N,gc as B,k as m}from"./chunk-LYNBZ7RV.js";import{z as o}from"zod";var C={perPage:100,maxPages:20};async function p(t){try{return await t}catch(e){throw b(e)}}var x=o.looseObject({name:o.string().nullish(),auth_domain:o.string(),session_duration:o.string().nullish(),allow_authenticate_via_warp:o.boolean().nullish(),deny_unmatched_requests:o.boolean().nullish(),deny_unmatched_requests_exempted_zone_names:o.array(o.string()).nullish(),warp_auth_non_browser_401:o.boolean().nullish(),mfa_config:o.unknown().nullish()});async function ne(t){try{return await d(t,{plane:"account",args:["zero-trust","organization","get"]},x)}catch(e){if(g(e,"not_found")||e instanceof z&&/not[_ ]found/i.test(e.message))return null;throw b(e)}}async function Ee(t){try{return await ne(t)}catch(e){if(g(e,"access_not_enabled"))return null;throw e}}function Ie(t,e){return p(d(t,{plane:"account",files:{"body.json":e},args:n=>["zero-trust","organization","create","--body",`@${n["body.json"]}`]},x))}function De(t,e,n){let s={name:e.name??e.auth_domain,auth_domain:e.auth_domain,allow_authenticate_via_warp:e.allow_authenticate_via_warp??!1,deny_unmatched_requests:e.deny_unmatched_requests??!1,deny_unmatched_requests_exempted_zone_names:e.deny_unmatched_requests_exempted_zone_names??[],warp_auth_non_browser_401:e.warp_auth_non_browser_401??!1,...e.mfa_config?{mfa_config:e.mfa_config}:{},session_duration:n};return p(d(t,{plane:"account",files:{"body.json":s},args:r=>["zero-trust","organization","update","--body",`@${r["body.json"]}`]},x))}var E=o.looseObject({id:o.string(),type:o.string(),name:o.string().nullish(),config:o.looseObject({restrict_to_account_members:o.boolean().nullish()}).nullish()});function $e(t){return p(_(t,["zero-trust","identity-providers","list"],o.array(E),C))}function ve(t){return p(d(t,{plane:"account",files:{"body.json":{name:"One-time PIN",type:"onetimepin",config:{}}},args:e=>["zero-trust","identity-providers","create","--body",`@${e["body.json"]}`]},E))}function Te(t){return p(d(t,{plane:"account",files:{"body.json":{name:"Cloudflare",type:"cloudflare",config:{restrict_to_account_members:!0}}},args:e=>["zero-trust","identity-providers","create","--body",`@${e["body.json"]}`]},E))}var I=o.looseObject({id:o.string(),name:o.string(),decision:o.string(),include:o.array(o.record(o.string(),o.unknown())).nullish(),exclude:o.array(o.record(o.string(),o.unknown())).nullish(),require:o.array(o.record(o.string(),o.unknown())).nullish(),reusable:o.boolean().nullish()});function ke(t){return p(_(t,["zero-trust","access","policies","list"],o.array(I),C))}function Le(t,e){return p(d(t,{plane:"account",files:{"body.json":{...e,exclude:[],require:[]}},args:n=>["zero-trust","access","policies","create","--body",`@${n["body.json"]}`]},I))}async function Ne(t,e){try{return await t.run({plane:"account",mode:"json",args:["zero-trust","access","policies","delete",e,"--force"]}),!0}catch(n){if(g(n,"not_found"))return!1;throw b(n)}}var se=new Set(["id","uid","created_at","updated_at","app_count","reusable"]);function ze(t,e,n){let s={};for(let[r,i]of Object.entries(e))se.has(r)||(s[r]=i);return s.include=n,s.exclude=e.exclude??[],s.require=e.require??[],p(d(t,{plane:"account",files:{"body.json":s},args:r=>["zero-trust","access","policies","update",e.id,"--body",`@${r["body.json"]}`]},I))}var oe=o.looseObject({path_pattern:o.string(),behavior:o.string()}),ie=o.looseObject({type:o.string().nullish(),uri:o.string().nullish(),overrides:o.array(oe).nullish()}),re=o.looseObject({id:o.string(),name:o.string().nullish(),precedence:o.number().nullish(),reusable:o.boolean().nullish()}),D=o.looseObject({id:o.string(),aud:o.string(),name:o.string().nullish(),type:o.string(),created_at:o.string().nullish(),destinations:o.array(ie).nullish(),policies:o.array(re).nullish(),session_duration:o.string().nullish(),http_only_cookie_attribute:o.boolean().nullish(),enable_binding_cookie:o.boolean().nullish(),allowed_idps:o.array(o.string()).nullish(),auto_redirect_to_identity:o.boolean().nullish(),app_launcher_visible:o.boolean().nullish(),oauth_configuration:o.looseObject({enabled:o.boolean().nullish()}).nullish()});function $(t){return p(_(t,["zero-trust","access","applications","list"],o.array(D),C))}function je(t,e){return p(d(t,{plane:"account",files:{"body.json":e},args:n=>["zero-trust","access","applications","create","--body",`@${n["body.json"]}`]},D))}var ae=new Set(["id","uid","aud","created_at","updated_at","domain","self_hosted_domains","policies","scim_config"]);function U(t,e){let n={};for(let[s,r]of Object.entries(t))ae.has(s)||(n[s]=r);return n.policies=[...t.policies??[]].sort((s,r)=>(s.precedence??0)-(r.precedence??0)).map(s=>s.id),{...n,...e}}function q(t,e,n){return p(d(t,{plane:"account",files:{"body.json":n},args:s=>["zero-trust","access","applications","update",e,"--body",`@${s["body.json"]}`]},D))}async function Be(t,e){try{return await t.run({plane:"account",mode:"json",args:["zero-trust","access","applications","delete",e,"--force"]}),!0}catch(n){if(g(n,"not_found"))return!1;throw b(n)}}var ce="https://dash.cloudflare.com/profile/api-tokens";function b(t){return g(t,"auth")?new A("ACCESS_PERMISSION_MISSING",`This Cloudflare login can't manage Access
2
+ ${t.message.split(`
3
+ `)[0]}`,{fix:"use a login or token with Access: Apps and Policies (edit) and Access: Organizations, Identity Providers, and Groups (edit)",data:{url:ce}}):t}var W=["/mcp","/mcp/*"],K="/health",J="/api/auth/callback/apple",le=[...W,"/oauth/token","/oauth/register","/.well-known/*",K,J],ue=512;function pe(t){if(!t.startsWith("/"))return null;let e=t.split("/").map((s,r)=>{if(r===0)return s;let i=s.replace(/\*{2,}/g,"*");return/^:[A-Za-z_][A-Za-z0-9_]*$/.test(i)?"*":i});if(e.some(s=>(s.match(/\*/g)??[]).length>1))return null;let n=e.join("/");return n.length>ue?null:n}var V=t=>t.map(e=>({path_pattern:e,behavior:"public"})),de=t=>t.publicPaths.length>0||t.mcp;function fe(t,{managedOAuth:e}){let n=t.mcp&&!e?[...W]:[],s=[];for(let r of t.publicPaths){let i=pe(r);if(i===null){s.push({appId:t.appId,path:r,reason:"not_expressible"});continue}if(!n.includes(i)){if(n.length>=25){s.push({appId:t.appId,path:r,reason:"too_many"});continue}n.push(i)}}return{destination:{type:"public",uri:t.hostname.toLowerCase(),overrides:V(n)},dropped:s}}function He(t,e){return{type:"public",uri:t.toLowerCase(),overrides:V(e?[K,J]:le)}}var v=t=>`*.${t.toLowerCase()}`;function X(t,e){let n=t.toLowerCase(),s=`.${e.toLowerCase()}`;return n.endsWith(s)&&!n.slice(0,-s.length).includes(".")&&n.length>s.length}function Z(t,e,{managedOAuth:n=!1}={}){let s=[{type:"public",uri:v(t),overrides:[]}],r=[],i=[];for(let a of[...e].sort((l,u)=>l.hostname.localeCompare(u.hostname))){if(!de(a))continue;if(!X(a.hostname,t)){i.push(a.appId);continue}let l=fe(a,{managedOAuth:n});r.push(...l.dropped),l.destination.overrides.length!==0&&s.push(l.destination)}return{destinations:s,dropped:r,outsideBase:i}}function ge(t,e){let n=P(t);return!n||n.includes("/")?!1:n===e.gatewayHost.toLowerCase()||n===v(e.appBaseDomain)||X(n,e.appBaseDomain)}function Q(t,e){let n=[],s=[];for(let r of t)(ge(r.uri,e)?n:s).push(r);return{owned:n,foreign:s}}var P=t=>(t??"").toLowerCase().replace(/\/+$/,"");function F(t){return t.map(e=>({type:e.type??"public",uri:P(e.uri),overrides:[...e.overrides??[]].map(n=>`${n.behavior}:${n.path_pattern}`).sort()})).sort((e,n)=>e.uri.localeCompare(n.uri))}function ee(t,e){return JSON.stringify(F(t))===JSON.stringify(F(e))}function Y(t,e){return t.type==="self_hosted"&&(t.destinations??[]).some(n=>(n.type??"public")==="public"&&P(n.uri)===P(e))}function T(t,{gatewayHost:e,appBaseDomain:n}){return{gateway:t.find(s=>Y(s,e))??null,apps:t.find(s=>Y(s,v(n)))??null}}var te=t=>t?.oauth_configuration?.enabled===!0,Ue=t=>({email:{email:t.toLowerCase()}}),qe=t=>({email_domain:{domain:t.toLowerCase()}});function G(t){return JSON.stringify(t,(e,n)=>typeof n=="string"?n.toLowerCase():n)}function Fe(t,e){let n=new Set(t.map(G)),s=[];for(let r of e){let i=G(r);n.has(i)||(n.add(i),s.push(r))}return{include:[...t,...s],added:s}}function Ye(t){return t.flatMap(e=>{let n=e.email?.email;return typeof n=="string"?[n]:[]})}function Ge(t){return t.flatMap(e=>{let n=e.email_domain?.domain;return typeof n=="string"?[n]:[]})}var y="cloudflare",w="onetimepin",We=["oidc","saml"];function Ke(t){return{cloudflare:!t.some(e=>e.type===y),pin:!t.some(e=>e.type===w)}}function Je(t){return t.filter(e=>e.type===y&&e.config?.restrict_to_account_members!==!0)}function Ve(t){let e=[...t.some(n=>n.type===y)?["a Cloudflare account"]:[],...t.filter(n=>n.type!==y&&n.type!==w).map(n=>n.name??n.type),...t.some(n=>n.type===w)?["a one-time PIN"]:[]];return e.length<=1?e[0]??"no sign-in method":`${e.slice(0,-1).join(", ")} or ${e.at(-1)}`}function Xe(t){return t.filter(e=>e.type===w||e.type===y&&e.config?.restrict_to_account_members===!0)}function me(t,e){let n=[...t??[]];for(let s of e)n.includes(s)||n.push(s);return n}function ye(t,e){let n=me(t?.allowed_idps,e);return{allowedIdps:n,autoRedirect:n.length===1}}function Ze(t,e){let n=ye(t,e),s=t.allowed_idps??[];return s.length===n.allowedIdps.length&&n.allowedIdps.every(r=>s.includes(r))&&(t.auto_redirect_to_identity??!1)===n.autoRedirect}function Qe(t){let e=t.trim();if(!/^(\d+(?:\.\d+)?(?:ns|us|µs|ms|s|m|h))+$/.test(e))return null;let n={ns:1e-9,us:1e-6,\u00B5s:1e-6,ms:.001,s:1,m:60,h:3600},s=0;for(let[,r,i]of e.matchAll(/(\d+(?:\.\d+)?)(ns|us|µs|ms|s|m|h)/g))s+=Number(r)*n[i];return s}var he=["binding","active","disabled"],Ae=6e4;async function _e(t){let[e=[]]=await t.run([{sql:`SELECT app_slug, hostname, manifest FROM apps
4
+ WHERE status IN (${he.map(n=>`'${n}'`).join(", ")}) AND hostname IS NOT NULL
5
+ ORDER BY hostname`}]);return e.map(n=>({appId:String(n.app_slug),hostname:String(n.hostname),publicPaths:j(n.manifest).map(s=>s.path),mcp:B(n.manifest)!==null}))}function be({publicRoutes:t,mcp:e}){return t&&e?"public routes and /mcp":e?"/mcp":"public routes"}var k=t=>({gatewayHost:t.gatewayHost.toLowerCase(),appBaseDomain:t.appBaseDomain.toLowerCase()});async function Pe({cf:t,db:e,install:n,out:s}){let r=k(n),i=await M({db:e,id:H,purpose:"access.sync",out:s,step:"gateway.lease",waitMs:Ae});try{let a=T(await $(t),r);return a.apps?(await i.check(),await we({cf:t,db:e,install:n,application:a.apps,gateway:a.gateway})):null}finally{await i.release()}}async function we({cf:t,db:e,install:n,application:s,gateway:r}){let i=k(n),a=Z(i.appBaseDomain,await _e(e),{managedOAuth:te(r)}),l=s.destinations??[],{foreign:u}=Q(l,i),h=r?.id===s.id?l.filter(R=>(R.uri??"").toLowerCase().replace(/\/+$/,"")===i.gatewayHost):[],c=[...u,...h,...a.destinations],f={dropped:a.dropped,outsideBase:a.outsideBase,foreign:u.length>0?[{application:s.name??s.id,uris:u.map(R=>R.uri??"(private)")}]:[]};return ee(l,c)?{application:s,changed:!1,...f}:{application:await q(t,s.id,U(s,{destinations:c})),changed:!0,...f}}function Se(t,e){let n=e.dropped.filter(i=>i.reason==="not_expressible"),s=e.dropped.filter(i=>i.reason==="too_many"),r=i=>i===1?"A public route stays":`${i} public routes stay`;n.length>0&&t.emit({type:"warning",code:"ACCESS_ROUTE_NOT_EXPRESSIBLE",step:"access.routes",message:`${r(n.length)} behind Access: ${m(n.map(i=>`${i.appId} ${i.path}`))}
6
+ Access path patterns take one * per segment, so these have no equivalent. People signed in to Access still reach them.`,data:{routes:n}}),s.length>0&&t.emit({type:"warning",code:"ACCESS_TOO_MANY_PUBLIC_ROUTES",step:"access.routes",message:`${r(s.length)} behind Access: ${m(s.map(i=>`${i.appId} ${i.path}`))}
7
+ Access lets through at most 25 paths per host (two of them for /mcp where the manifest sets mcp). Merge routes under one prefix, or keep these behind the login.`,data:{routes:s}}),e.outsideBase.length>0&&t.emit({type:"warning",code:"ACCESS_APP_OUTSIDE_BASE",step:"access.routes",message:`${m(e.outsideBase)} ${e.outsideBase.length===1?"isn't":"aren't"} under the apps' domain, so Access isn't set up for ${e.outsideBase.length===1?"it":"them"}.`,data:{apps:e.outsideBase}});for(let{application:i,uris:a}of e.foreign)t.emit({type:"warning",code:"ACCESS_FOREIGN_DESTINATION",step:"access.routes",message:`The Access application "${i}" also covers ${m(a)}
8
+ ${N(a.length,"That destination").replace(/^1 That destination/,"That destination").replace(/^(\d+) That destinations?/,"Those $1 destinations")} ${a.length===1?"isn't":"aren't"} Every App's and ${a.length===1?"stays":"stay"} as ${a.length===1?"it is":"they are"}. access off won't delete this application.`,data:{application:i,uris:a}})}async function lt(t,{appId:e,surface:n,removing:s=!1}){let{cf:r,install:i,out:a}=t,l=`${L} access on`,u=be(n),h;try{h=await $(r)}catch(c){let f=c instanceof A&&c.code==="ACCESS_PERMISSION_MISSING";if(f&&!n.publicRoutes&&!n.mcp)return;let S=s?`If the Gateway is behind Access, ${e}'s host stays listed there until it is updated.`:`If the Gateway is behind Access, ${e}'s ${u} need a login there until it is updated.`;a.emit({type:"warning",code:"ACCESS_NOT_CHECKED",step:"app.access",message:f?`This Cloudflare login can't read Cloudflare Access, so ${e} wasn't checked against it
9
+ ${S}`:`Couldn't check Cloudflare Access for ${e}
10
+ ${O(c).split(`
11
+ `)[0]}
12
+ ${S}`,data:{appId:e,rerun:l,rerunNote:f?"with a login that can manage Access, if the Gateway is behind it":"if the Gateway is behind Access"}});return}if(T(h,k(i)).apps)try{let c=await Pe(t);if(!c)return;Se(a,c);let f=s?c.changed?`Cloudflare Access no longer lets ${e}'s ${u} through.`:`Cloudflare Access had nothing of ${e}'s to take back.`:c.changed?`Cloudflare Access lets ${e}'s ${u} through.`:`Cloudflare Access already matched ${e}'s ${u}.`;a.emit({type:"step",step:"app.access",status:c.changed?"ok":"skip",message:f,data:{appId:e,applicationId:c.application.id,changed:c.changed,removed:s}})}catch(c){a.emit({type:"warning",code:"ACCESS_SYNC_FAILED",step:"app.access",message:`Couldn't update Cloudflare Access for ${e}'s ${u}
13
+ ${O(c).split(`
14
+ `)[0]}
15
+ ${s?`${e}'s host stays listed there until it is updated.`:"Until it is updated, they need an Access login."}`,data:{appId:e,rerun:l}})}}export{ne as a,Ee as b,Ie as c,De as d,$e as e,ve as f,Te as g,ke as h,Le as i,Ne as j,ze as k,$ as l,je as m,U as n,q as o,Be as p,W as q,He as r,Z as s,Q as t,ee as u,T as v,te as w,Ue as x,qe as y,Fe as z,Ye as A,Ge as B,y as C,w as D,We as E,Ke as F,Je as G,Ve as H,Xe as I,ye as J,Ze as K,Qe as L,_e as M,k as N,Se as O,lt as P};
@@ -0,0 +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};
@@ -0,0 +1,10 @@
1
+ import{$ as C,B as U,Z as D,na as P,y as L}from"./chunk-RMF4YGD6.js";import{Bb as i,D as h,E as _,Za as E,_a as N,ab as T,bb as O,c as w,cb as $,d as R,db as A,k as m,za as S}from"./chunk-LYNBZ7RV.js";var V=new WeakMap;function b(t){let e=V.get(t);return e||(e=t.run([{sql:"SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'providers'"}]).then(([a=[]])=>a.length>0),V.set(t,e)),e}async function f(t){if(!await b(t))return[];let[e=[]]=await t.run([{sql:"SELECT id, spec, added_by, added_at, bound_to FROM providers ORDER BY added_at, id"}]);return e.map(a=>({id:String(a.id),spec:String(a.spec),addedBy:D(a.added_by),addedAt:a.added_at==null?null:Number(a.added_at),boundTo:D(a.bound_to)}))}function x(t){return e=>O(e,{gatewayHost:t.gatewayHost,appBaseDomain:t.appBaseDomain})}function I(t,e){return A(t,{refuseHost:x(e)})}async function Q(t,e){return I(await f(t),e)}function F(t,e){return t.rows().filter(a=>h(a.capability).some(r=>e.includes(r)))}function G(){return new i("GATEWAY_OUTDATED",`This Gateway predates the provider registry
2
+ Its database has no providers table until the Gateway is updated. Nothing was changed.`,{rerun:`${w} update`,rerunNote:"then run this again"})}function M(t){return t==="everyapp"||_.includes(t)}async function Z(t,e){let a=E(e.spec);if(!a.ok)throw new i("PROVIDER_SPEC_INVALID",`The spec isn't one this Gateway takes
3
+ ${N(a.problems)}`,{fix:"fix each field named above, then add it again"});let{id:r,capability:n}=a;if(!await b(t))throw G();let c=await f(t),s=I(c.filter(p=>p.id!==r),e.install),o=$(r,n,{rowSettings:new Set(s.rows().flatMap(p=>h(p.capability))),refuseHost:x(e.install)});if(o)switch(o.code){case"PROVIDER_BUILTIN":throw new i("PROVIDER_BUILTIN",`${r} is built in
4
+ A registered provider can't take a built-in provider's id.`,{fix:`give the provider another id in its spec; ${w} provider show ${r} prints the built-in one`});case"PROVIDER_SECRET_TAKEN":throw new i("PROVIDER_SECRET_TAKEN",`${r} can't use that setting: ${o.message}`,{fix:`name the provider's settings after its id, ${r.toUpperCase().replace(/-/g,"_")}_\u2026, and none another provider or the Gateway reads`});case"PROVIDER_HOST_REFUSED":throw new i("PROVIDER_HOST_REFUSED",`${r}'s key can't be sent there: ${o.message}`,{fix:"list only the provider's own public API hosts under hosts"});default:throw new i("PROVIDER_SPEC_INVALID",`The spec isn't one this Gateway takes
5
+ ${o.message}`,{fix:"fix the spec, then add it again"})}let l=h(n);for(let p of await P(t)){if(!p.manifest)continue;let q=S(p.manifest).map(v=>v.toUpperCase()),g=l.filter(v=>q.includes(v));if(g.length>0)throw new i("PROVIDER_SECRET_TAKEN",`${m(g)} ${g.length===1?"is":"are"} ${p.appSlug}'s own secret
6
+ ${p.appSlug}'s deployed manifest lists ${g.length===1?"it":"them"} under secrets, so a provider can't read ${g.length===1?"it":"them"} from the Gateway.`,{fix:`name the provider's settings otherwise, or drop ${m(g)} from ${p.appSlug}'s secrets and deploy it again`})}let u=c.find(p=>p.id===r);if(u&&!e.replace)throw new i("PROVIDER_EXISTS",`${r} is registered on this Gateway already
7
+ Replacing it writes the new spec; its key must then be set again before the Gateway sends it.`,{rerun:R(["--replace"]),rerunNote:"replaces it",authorize:!0});let d=e.now??Date.now(),y=JSON.stringify(e.spec),k=await H(t,"provider.added",{id:r,name:n.label},e.deployer,d,{sql:"EXISTS (SELECT 1 FROM providers WHERE id = ? AND spec = ? AND updated_at = ?)",params:[r,y,d]}),[B=[]]=await t.run([u?{sql:"UPDATE providers SET spec = ?, updated_at = ?, bound_to = NULL, bound_at = NULL WHERE id = ? RETURNING id",params:[y,d,r]}:{sql:`INSERT INTO providers (id, spec, added_by, added_at, updated_at, bound_to, bound_at)
8
+ VALUES (?1, ?2, ?3, ?4, ?4, NULL, NULL) ON CONFLICT(id) DO NOTHING RETURNING id`,params:[r,y,e.deployer.actor,d]},...k]);if(B.length===0)throw new i("PROVIDER_EXISTS",`${r} changed on this Gateway while this ran`,{rerun:`${w} provider list`,rerunNote:"shows it as it is now"});return{id:r,capability:n,replaced:!!u}}async function ee(t,e,a,{force:r=!1,now:n=Date.now()}={}){if(M(e))throw new i("PROVIDER_BUILTIN",`${e} is built in
9
+ Only a provider registered with ${w} provider add can be removed.`,{rerun:`${w} provider list`,rerunNote:"shows which are registered"});if(!await b(t))throw G();let c=(await f(t)).find(d=>d.id===e);if(!c)throw new i("PROVIDER_NOT_FOUND",`No provider ${e} is registered on this Gateway`,{rerun:`${w} provider list`,rerunNote:"shows which are"});let s=E(W(c.spec)),o=(await P(t)).filter(d=>d.manifest?.capabilities&&Object.hasOwn(d.manifest.capabilities,e)).map(d=>d.appSlug);if(o.length>0&&!r)throw new i("PROVIDER_IN_USE",`${m(o)} ${o.length===1?"lists":"list"} ${e} under capabilities
10
+ Removing it stops ${o.length===1?"its":"their"} calls to it at once: the Gateway answers that it doesn't offer ${e}.`,{rerun:R(["--force"]),rerunNote:"removes it anyway",authorize:!0});let l=s.ok?s.capability.label:e,u=await H(t,"provider.removed",{id:e,name:l},a,n,{sql:"EXISTS (SELECT 1 FROM providers WHERE id = ?)",params:[e]});return await t.run([...u,{sql:"DELETE FROM providers WHERE id = ?",params:[e]}]),{id:e,name:l,settings:s.ok?[...h(s.capability)]:[],apps:o}}async function H(t,e,a,r,n,c){let s=await C(t);return s?U(t,{organizationId:s.organization.id,type:e,actor:L(r),data:{provider:{id:a.id,name:a.name}},onlyIf:c,now:n}):[]}function W(t){try{return JSON.parse(t)}catch{return null}}async function te(t,e,a,r=Date.now()){let n=await f(t);if(n.length===0)return[];let c=I(n,e),s=F(c,a);return s.length===0?[]:(await t.run(s.map(l=>({sql:"UPDATE providers SET bound_to = ?, bound_at = ? WHERE id = ? AND spec = ? RETURNING id",params:[T(l.capability),r,l.id,n.find(u=>u.id===l.id).spec]})))).flatMap(l=>l.map(u=>String(u.id)))}export{Q as a,F as b,Z as c,ee as d,te as e};
@@ -0,0 +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};
@@ -0,0 +1,15 @@
1
+ import{Bb as o}from"./chunk-LYNBZ7RV.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",r2:"R2 bucket","email-route":"Email Routing route for"};async function u(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,u as b,_ as c,E as d,m as e,R as f,g,d as h};
@@ -0,0 +1,2 @@
1
+ import{a as E,b as v}from"./chunk-CZTEDWZ2.js";import{a as A}from"./chunk-H6QQMY7B.js";import{a as y}from"./chunk-CCWBPAKH.js";import{c as a,kc as f,oc as w,wc as g}from"./chunk-LYNBZ7RV.js";import I from"chalk";async function N(t){await S(t,(e,o)=>v(t,e,o))}async function S(t,e){let o=Date.now();await g(t,async n=>{let r=A({out:n,verbose:t.verbose}),i=await e(n,E({gateway:{openRelease:r.open,source:r.describe},interactive:y(t.json??!1)}));_(n,i,o)})}function _(t,e,o){let{gatewayUrl:n,organizationName:r,release:i,releaseName:p,owner:c,mode:d}=e,l=`${n}/admin`,s={gatewayUrl:n,adminUrl:l,organizationName:r,owner:c,release:i,mode:d,gateway:e.gateway,accessOn:e.accessOn},m={label:"Gateway",value:n},u=e.accessOn?[{label:"Access",value:"on",note:"everyone signs in through Cloudflare Access first"}]:[];if(e.gateway==="upgraded"&&!e.ownerCreated){t.emit({type:"done",message:`Upgraded to ${p}`,data:s,display:[...w([{label:"Gateway",value:I.cyan(n)}]),I.dim(`Upgraded to ${p} in ${f(Date.now()-o)}`)].join(`
2
+ `)});return}if(!c){t.emit({type:"done",data:{...s,facts:[m]}});return}if(e.gateway==="installed"||e.ownerCreated){t.emit({type:"done",data:{...s,facts:[m,{label:"Admin",value:l,note:"invite people, choose who opens which app"},...u],next:O(d,e.accessOn===!0)}});return}t.emit({type:"done",data:{...s,facts:[m,...u],...e.gateway==="up-to-date"?{next:[{command:`${a} status`,note:"see apps, domains and certificates"}]}:{}}})}function O(t,e){return t==="hosted"?[{command:`${a} create my-app`,note:"start your first app"},{command:`${a} secret set OPENAI_API_KEY`,note:"turn on AI for apps"},{command:`${a} secret set EMAIL_FROM EMAIL_FROM_NAME`,note:"email invites; needs Cloudflare Email Sending"}]:[{command:`${a} create my-app`,note:"start your first app"},...e?[]:[{command:`${a} access on`,note:"put Cloudflare Access in front of your Gateway (recommended)"}],{command:`${a} secret set OPENAI_API_KEY`,note:"AI for apps (or OPENROUTER_API_KEY, WORKERS_AI_API_TOKEN)"},{command:`${a} secret set EMAIL_FROM EMAIL_FROM_NAME`,note:"email invites and password resets; needs Cloudflare Email Sending"}]}export{N as a,S as b,_ as c};
@@ -0,0 +1,7 @@
1
+ import{b as I,d as R}from"./chunk-CCWBPAKH.js";import{k as C,l as b}from"./chunk-JYKRUS5C.js";import{Bb as g,Cb as d,Fb as p,Gb as y,Hb as m,Nb as w,Pb as v,bc as h,cc as k,d as f}from"./chunk-LYNBZ7RV.js";var P={perPage:100,maxPages:50};function O(e){return k(e,["workers","list"],b,P)}async function $(e,r){return((await O(e)).find(t=>t.name===r)?.references?.domains??[]).map(t=>t.hostname.toLowerCase())}async function l(e,r){let n;try{n=await h(e,{plane:"account",args:["workers","deployments","list","--worker",r,"--per-page","10"]},C)}catch(o){if(m(o,"not_found"))return null;throw o}let t=[...n].sort((o,i)=>(i.created_on??"").localeCompare(o.created_on??""))[0];return{versionId:[...t?.versions??[]].sort((o,i)=>i.percentage-o.percentage)[0]?.version_id??null,deployedAt:t?.created_on?Date.parse(t.created_on):null}}async function L(e,r,{withReferences:n=!1}={}){await e.run({plane:"account",mode:"json",args:["workers","delete",r,"--force",...n?["--delete-with-references"]:[]]})}var W=9e5;async function B(e){let r=e.secrets&&Object.keys(e.secrets).length>0?e.secrets:void 0,n=e.dryRun?null:await l(e.cf,e.workerName),t=!1,s=e.onUploaded&&!e.dryRun?v({async:()=>D(e,n,t)}):void 0;try{return await A(e,r,n,()=>{t=!0})}catch(o){throw s&&!w()&&await D(e,n,t).catch(i=>{e.out?.emit({type:"warning",code:"UPLOAD_UNRECORDED",step:e.step,message:`The version cf uploaded of ${e.workerName} couldn't be recorded
2
+ ${p(i)}`,data:{workerName:e.workerName,error:p(i)}})}),o}finally{w()||s?.()}}async function D(e,r,n){let t=await l(e.cf,e.workerName);t?.versionId&&t.versionId!==r?.versionId&&await e.onUploaded?.(t.versionId,n)}async function A(e,r,n,t){let s=e.interactive&&e.attach&&!e.dryRun,o=u=>e.cf.run({plane:"project",cwd:e.cwd,cliCf:e.cliCf,mode:u,timeoutMs:W,...r?{files:{"secrets.json":r}}:{},args:c=>["deploy","--prebuilt","--mode","production","--message",e.message,...e.buildOutputWorker?["--worker",e.buildOutputWorker]:[],...r?["--secrets-file",c["secrets.json"]]:[],...e.dryRun?["--dry-run"]:[]]}),i;try{i=(await o(s?"interactive":"text").catch(c=>{if(e.interactive&&m(c,"strict_conflict"))return o("interactive");throw c})).stdout}catch(u){throw N(u,e)}if(t(),e.dryRun)return{versionId:null,output:i};let a=await l(e.cf,e.workerName);if(!a?.versionId||a.versionId===n?.versionId)throw new g("DEPLOY_NOT_UPLOADED",`cf finished without uploading a new version of ${e.workerName}
3
+ Was one of its questions answered no? The version that was serving still is.`,{rerun:f(),rerunNote:"to deploy again"});return await e.onUploaded?.(a.versionId,!0),{versionId:a.versionId,output:i}}async function G({cf:e,workerName:r,shownAs:n,recordedVersionIds:t,interactive:s,confirm:o=I,change:i}){let a=await l(e,r);if(a&&!(a.versionId&&t.includes(a.versionId))){if(!s)throw new d("rerun_interactive",`${_(n)} was changed outside everyapp; confirm in a terminal
4
+ Its live version wasn't deployed by everyapp, and Cloudflare won't replace it unattended. Nothing changed.`,void 0,{rerun:f([],{terminal:!0}),rerunNote:"in a terminal",data:{workerName:r,versionId:a.versionId,needsTerminal:!0}});await R(o,i.question,{context:[`${_(n)}'s live version wasn't deployed by everyapp (dashboard, API, or an interrupted deploy).`,[i.effect,"Cloudflare may ask to confirm again."].filter(Boolean).join(" ")]})}}function E(e){return`https://dash.cloudflare.com/${e}/workers/plans`}var _=e=>e.replace(/^the /,"The ");function N(e,{workerName:r,accountId:n}){return e instanceof y?e.kind==="strict_conflict"?new d("rerun_interactive",`${r} was changed outside everyapp; confirm in a terminal
5
+ It was last changed in the Cloudflare dashboard or through the API, so cf won't overwrite it unattended.`,void 0,{rerun:f([],{terminal:!0}),rerunNote:"in a terminal, and confirm cf's prompt",data:{needsTerminal:!0}}):e.kind==="subdomain_missing"?new d("register_workers_subdomain",`Choose a workers.dev subdomain for this Cloudflare account
6
+ Cloudflare needs one before an account's first Worker. Apps never use it.`,e.message.match(/https:\/\/dash\.cloudflare\.com\/\S+/)?.[0]??`https://dash.cloudflare.com/${n}/workers/onboarding`):e.kind==="free_plan"?new d("upgrade_workers_paid",`Subscribe this account to Workers Paid
7
+ Cloudflare refused the upload on the Free plan. Every App needs Workers Paid ($5 a month, then usage).`,E(n),{data:{workerName:r,cloudflare:e.message}}):e:e}export{O as a,$ as b,l as c,L as d,B as e,G as f,E as g};
@@ -0,0 +1,8 @@
1
+ import{C as z,G as Q,H as B,a as j,b as V,s as P,t as Z,u as Y}from"./chunk-IFCPALVC.js";import{a as v}from"./chunk-WOVS3GV5.js";import{a as O,b as _,c as M,d as D,i as G,j as q,l as L,m as E,o as F,q as U}from"./chunk-OM2HDWVP.js";import"./chunk-ZFCUH5PK.js";import"./chunk-4JRIS6S6.js";import"./chunk-ZECBN24L.js";import"./chunk-HOUHG236.js";import{ia as b,qa as k,sa as x}from"./chunk-RMF4YGD6.js";import"./chunk-NFU4YFXB.js";import"./chunk-T2GD7RHS.js";import{b as W}from"./chunk-H7PDL3X5.js";import{a as S,b as A,e as I,f as N,g as R,h as T}from"./chunk-CCWBPAKH.js";import"./chunk-JYKRUS5C.js";import{Bb as g,Z as $,c as m,k as y,wc as C}from"./chunk-LYNBZ7RV.js";import{text as ee}from"node:stream/consumers";import w from"chalk";var te={secret:(e,{context:i,optional:n})=>R(e,{context:i,optional:n}),text:(e,{context:i,optional:n,validate:o})=>N(e,{context:i,validate:s=>n&&!s.trim()?null:o(s)}),confirm:A,choose:(e,i,n)=>I(e,i,{context:n})};async function Oe(e,i){await C(e,n=>ne({flags:e,out:n,appId:i}))}async function ne(e){let{out:i,flags:n}=e,o=e.interactive??S(n.json??!1),s=e.prompter??te;ie(e.appId);let t=await re(e),r=await J(t),a=se(r,t);if(o){let h=e.tell??T;for(let X of ae(t,r))h(X)}let c=await ce(t,r,a,e),p=o?await ue(t,r,a,c,s):{},l=de({...c,...p},r),d=Object.keys(l);if(d.length===0&&!r.setup.ready&&!o)throw me(t,r,a);let f=d.length>0?await oe(t,l,e):null,u=f?await J({...t,registry:f.gateway?.bound?.length?await v(t.connection.db,t.connection.install):t.registry}):r;t.deployed&&t.source==="registry"?await V(t.connection.db,{appRowId:t.deployed.rowId,setup:u.setup,deployer:t.connection.deployer},i):t.deployed&&await j(t.connection,{gateway:[],appRowId:t.deployed.rowId},i),ge(t,u,a,d,f,i)}async function oe(e,i,n){try{return await z(e.connection,{manifest:e.manifest,source:e.source,app:e.deployed},i,{...n,...e.deployed&&e.source==="registry"?{setupRecordedBy:e.deployed.rowId}:{}})}catch(o){throw!(o instanceof g)||o.code!=="SECRETS_PARTIALLY_APPLIED"?o:new g(o.code,o.message,{...K(e,"to set what is left"),retryable:!0,data:o.data})}}function K(e,i,n=""){return e.deployed?{rerun:`${m} configure ${e.appId}${n}`,rerunNote:i}:{rerun:`${m} configure${n}`,rerunNote:`in the app's directory, ${i}`}}function ie(e){if(!e?.includes("="))return;let i=e.split("=")[0];throw new g("VALUE_ON_COMMAND_LINE",`${i}=\u2026 looks like a value on the command line, which configure never takes
2
+ It lands in the shell's history and the process list: rotate it if it was real. Nothing was set.`,{fix:`pipe NAME=value lines in (one per line), or export ${i} and add --from-env`})}async function re(e){let i=()=>x({gateway:k(e.flags.gateway),accountId:e.flags["account-id"],interactive:S(e.flags.json??!1),login:{json:e.flags.json,out:e.out,step:"login"},createCf:e.createCf});if(e.appId){let t=await i(),r=await b(t.db,e.appId);if(!r||r.status==="pending")throw new g("APP_NOT_FOUND",`${e.appId} isn't deployed to this Gateway
3
+ An app is configured by name after its first deploy; in its directory, configure works before that too (for the Gateway's settings). Nothing was changed.`,{rerun:`${m} status`,rerunNote:"lists its apps"});let a=Q(r);return{appId:a.id,manifest:a,source:"registry",deployed:{workerName:r.workerName,rowId:r.id},connection:t,registry:await v(t.db,t.install)}}let n=await W(e.cwd??process.cwd());if(!n)throw new g("MANIFEST_NOT_FOUND","No everyapp.config.ts in this directory, and no app named",{fix:`name the app: ${m} configure <app> (${m} status lists them), or run this from its directory`});let o=await i(),s=await b(o.db,n.id);return{appId:n.id,manifest:n,source:"directory",deployed:s&&s.status!=="pending"?{workerName:s.workerName,rowId:s.id}:null,connection:o,registry:await v(o.db,o.install)}}async function J(e){let{cf:i}=e.connection,n=M(await O(i),e.registry),o=e.deployed?await _(i,e.deployed.workerName):null,{report:s,setup:t}=D({manifest:e.manifest,appId:e.appId,gatewayNames:n,secretNames:o,lookup:e.registry}),r=new Set;for(let a of s.settings){let c=a.holder==="gateway"?n:o??[];for(let p of[...a.names,...a.alsoReads])c.includes(p)&&r.add(p)}return{report:s,setup:t,held:r}}function se({report:e},i){let n=t=>t.names.length>0&&(t.holder==="gateway"||i.deployed!==null),o=t=>t.set===!1&&n(t),s=new Set(e.groups.filter(t=>t.met).map(t=>t.group));return{required:e.settings.filter(t=>t.need.kind==="required"&&o(t)),groups:e.groups.filter(t=>!t.met&&t.members.some(r=>r.blocking)).map(t=>({group:t.group,members:t.members.filter(o)})).filter(t=>t.members.length>0),optional:e.settings.filter(t=>o(t)&&!t.blocking&&(t.need.kind==="optional"||t.need.kind==="anyOf"&&s.has(t.need.group))),afterDeploy:e.settings.filter(t=>t.holder==="app"&&t.names.length>0&&i.deployed===null)}}function ae(e,{report:i}){let n=q(e.appId,i.settings).map(o=>!e.deployed&&o.where===e.appId?{...o,status:w.dim("after first deploy")}:o);return[w.dim(`${e.appId}'s settings are held as the Gateway's secrets: an AI key or a capability's client on the Gateway Worker, once for every app; ${e.appId}'s own secrets on its Worker. Changes are live at once, no deploy needed.`),"",...n.length>0?L(n,{app:!1}):[w.dim(`${e.appId} declares no secrets and needs no Gateway settings.`)],""]}function le({report:e},i){return e.settings.find(n=>n.names.includes(i))??e.settings.find(n=>n.alsoReads.includes(i))}function de(e,{report:i}){let n={};for(let o of i.settings)for(let s of[...o.names,...o.alsoReads])e[s]!==void 0&&n[s]===void 0&&(n[s]=e[s]);return n}async function ce(e,i,n,o){let s={},t=(a,c)=>$(a)?Y(a,c):c,r=o.flags["from-env"]?null:await(o.readStdin??pe)();if(r!==null)for(let{name:a,value:c,line:p}of fe(r)){let l=le(i,a);if(!l){let d=/^[A-Z][A-Z0-9_]*$/.test(a)?a:`line ${p} (not shown: it may be a value)`;throw new g("SECRET_NOT_DECLARED",`${e.appId} doesn't declare ${d}
4
+ The piped lines set what its ${e.source==="registry"?"deployed manifest":"everyapp.config.ts"} lists (a provider, a capability or one of its secrets). Nothing was set.`,{fix:`leave it out, or declare it in everyapp.config.ts${e.source==="registry"?" and deploy again":""}; a bare value goes to ${m} secret set NAME`})}if(l.holder==="app"&&!e.deployed)throw new g("APP_NOT_FOUND",`${e.appId} isn't deployed yet
5
+ Its own ${a} can be set after its first deploy. Nothing was set.`,{rerun:`${m} deploy`});if(!c.trim())throw new g("SECRET_EMPTY",`${a} is empty in the piped lines`,{fix:`give ${a} a value, or leave the line out`});s[a]=t(a,c)}if(o.flags["from-env"]){let a=o.env??process.env,c=[...n.required,...n.groups.flatMap(p=>p.members),...n.optional];for(let p of c)for(let l of p.names){if(s[l]!==void 0||i.held.has(l))continue;let d=a[l];d===void 0||!d.trim()||(s[l]=t(l,d),o.out.emit({type:"progress",step:"configure.env",message:`${l} from $${l}`}))}}return s}async function pe(){if(process.stdin.isTTY)return null;let e=await ee(process.stdin);return e.trim()?e:null}function fe(e){let i=[];return e.split(/\r?\n/).forEach((n,o)=>{let s=n.trim();if(!s||s.startsWith("#"))return;let t=/^(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=(.*)$/.exec(s);if(!t)throw new g("PIPED_LINE_INVALID",`Line ${o+1} of the piped input isn't NAME=value
6
+ Nothing was set.`,{fix:`pipe NAME=value lines, one per line; a bare value goes to ${m} secret set NAME`});let r=t[2].trim(),a=r.length>=2&&(r.startsWith('"')||r.startsWith("'"))?r[0]:null;a&&r.endsWith(a)&&(r=r.slice(1,-1)),i.push({name:t[1],value:r,line:o+1})}),i}async function ue(e,i,n,o,s){let t={},r=l=>o[l]!==void 0||t[l]!==void 0||i.held.has(l),a=l=>l.names.every(r),c=async(l,d)=>{let f=!0;for(let u of l.names){if(r(u))continue;let h=await H(u,l,s,{optional:d,context:f});f=!1,h&&(t[u]=h)}};if(n.required.length>0||n.groups.length>0){for(let d of n.required)await c(d,!1);for(let d of n.groups){if(d.members.some(a))continue;let f=d.members.length===1?d.members[0]:await s.choose(`Which ${d.group}? One is enough.`,d.members.map(u=>({label:u.label,hint:u.names.join(" + "),value:u})));await c(f,!1)}let l=n.optional.filter(d=>!a(d));if(l.length>0&&await s.confirm(`Set the ${l.length===1?"optional setting":`${l.length} optional settings`} too?`,l.map(f=>E(f)[0])))for(let f of l)await c(f,!0);return t}let p=i.report.settings.filter(l=>l.names.length>0&&(l.holder==="gateway"||e.deployed!==null));if(p.length===0)return t;for(;;){let l=await s.choose(`Everything ${e.appId} needs is set. Change one?`,[...p.map(d=>({label:d.names.join(" + "),hint:`${d.label!==d.names.join("+")?`${d.label} \xB7 `:""}${G(d)}`,value:d})),{label:"No, done",value:null}]);if(!l)return t;for(let d of l.names){let f=await H(d,l,s,{optional:!0,context:d===l.names[0]});f&&(t[d]=f)}}}async function H(e,i,n,{optional:o,context:s}){let t=F(i),r=s?[...E(i),...t?[t]:[],...P(e)]:P(e),a=o?`${e} (Enter to skip)`:e;return($(e)?await n.text(a,{context:r,optional:o,validate:p=>Z(e,p)}):await n.secret(a,{context:r,optional:o})).trim()}function me(e,i,n){let o=[...n.required,...n.groups.map(s=>s.members[0])].flatMap(s=>s.names).filter(s=>!i.held.has(s));return new g("SECRET_VALUE_REQUIRED",`Can't ask for ${e.appId}'s settings without a terminal
7
+ ${e.appId} needs ${y(o)}. Run this at a terminal, pipe NAME=value lines in (one per line), or export them under those names and add --from-env (which also takes the variable of any unset optional setting).`,{...K(e,"with the variables exported"," --from-env"),data:{names:o}})}function ge(e,i,n,o,s,t){let{appId:r}=e,{setup:a}=i,c=n.afterDeploy.flatMap(h=>h.names),p=a.ready?[]:U(a).filter(h=>!i.held.has(h)),l=o.length>0?`Set ${y(o)}. `:"",d=[],f,u;a.ready?e.deployed?(f=`${l}${r} is ready`,u=w.green(`${r} is ready.`)):(c.length>0?d.push({command:`${m} deploy`,note:`then ${m} configure ${r} for ${y(c)}`}):d.push({command:`${m} deploy`,note:"in the app's directory"}),f=`${l}${r}'s Gateway settings are set${c.length>0?`; its own ${y(c)} come after its first deploy`:""}`,u=`${r}'s Gateway settings are set.${c.length>0?` Its own ${y(c)} come after its first deploy.`:""}`):(t.emit({type:"warning",code:"APP_NEEDS_SETUP",step:"app.secrets",message:`${r} won't open until ${y(p)} ${p.length===1?"is":"are"} set`,data:{setup:a}}),d.push(e.deployed?{command:`${m} configure ${r}`,note:"at a terminal, with NAME=value lines on stdin, or with --from-env"}:{command:`${m} configure`,note:"in the app's directory: at a terminal, with NAME=value lines on stdin, or with --from-env"}),f=`${l}${r} still needs ${y(p)}`,u=w.yellow(`${r} still needs ${y(p)}.`)),o.length>0&&(u=`${u}
8
+ ${w.dim("Live now. No deploy needed.")}`),t.emit({type:"done",message:f,display:u,data:{app:{id:r,deployed:e.deployed!==null,setup:a},set:[...o],...s?{changed:B(s)}:{},...d.length>0?{next:d}:{}}})}export{Oe as configure,ne as configureApp,fe as parsePipedLines};
@@ -0,0 +1,22 @@
1
+ import{a as X}from"./chunk-J35DDCNU.js";import{b as H}from"./chunk-CZXHKPRZ.js";import{b as Q,c as j,d as h}from"./chunk-23HJ5I2A.js";import"./chunk-ONLNJXVQ.js";import{a as q}from"./chunk-H7PDL3X5.js";import{a as B,f as Y}from"./chunk-CCWBPAKH.js";import"./chunk-JYKRUS5C.js";import{$b as G,Bb as m,Fb as M,Vb as W,Wb as J,Xb as K,_b as U,ac as z,c as x,h as I,kb as O,l as C,pb as R,qb as _,wc as V}from"./chunk-LYNBZ7RV.js";import $ from"node:path";import w from"node:fs/promises";import E from"node:path";var ue=[".claude/skills",".agents/skills"],D={everyapp:"- Before running everyapp, read the everyapp skill: `.agents/skills/everyapp/SKILL.md` (also in `.claude/skills/`).","build-every-app":"- To build or change this app, read the build-every-app skill: `.agents/skills/build-every-app/SKILL.md` (patterns in patterns.md beside it)."};function N(e){return E.join(e,"packages","cli","skills")}async function he(e){let t=[];for(let r of await w.readdir(N(e),{withFileTypes:!0}))if(r.isDirectory())try{await w.access(E.join(N(e),r.name,"SKILL.md")),t.push(r.name)}catch{}let i=Object.keys(D).filter(r=>t.includes(r)),n=t.filter(r=>!(r in D)).sort();return[...i,...n]}function Z(e){return D[e]??`- Read the ${e} skill: \`.agents/skills/${e}/SKILL.md\` (also in \`.claude/skills/\`).`}async function ee({root:e,appDir:t}){let i=await he(e),n=[];for(let r of i)for(let a of ue){let o=`${a}/${r}`,l=E.join(t,o);await w.rm(l,{recursive:!0,force:!0}),await w.cp(E.join(N(e),r),l,{recursive:!0}),n.push(o)}return{skills:i,paths:n,agentsMd:await ye(t,i)}}async function ye(e,t){let i=E.join(e,"AGENTS.md"),n;try{n=await w.readFile(i,"utf8")}catch{return await w.writeFile(i,`# Agent instructions
2
+
3
+ ${t.map(Z).join(`
4
+ `)}
5
+ `),"created"}let r=t.filter(a=>!n.includes(`skills/${a}`));return r.length===0?"mentions":(await w.writeFile(i,`${n.replace(/\s*$/,"")}
6
+ ${r.map(Z).join(`
7
+ `)}
8
+ `),"added")}import ke from"node:fs/promises";import A from"node:path";import g from"node:fs/promises";import u from"node:path";async function te({targetDir:e,appId:t,root:i}){let n=u.join(e,"package.json"),r=JSON.parse(await g.readFile(n,"utf-8"));if(r.name=t,!h(e,i)){let a=await we(await g.realpath(i)),o=await g.realpath(e);for(let l of["dependencies","devDependencies"]){let p=r[l];if(p)for(let[k,d]of Object.entries(p)){if(typeof d!="string"||!d.startsWith("workspace:"))continue;let f=a.get(k);if(!f)throw new Error(`Template dependency "${k}" is a workspace package ("${d}") that isn't in ${u.join(i,"packages")}.`);p[k]=`link:${u.relative(o,f).split(u.sep).join("/")}`}}}await g.writeFile(n,JSON.stringify(r,null,2)+`
9
+ `,"utf-8")}async function we(e){let t=new Map,i=u.join(e,"packages");for(let n of await g.readdir(i,{withFileTypes:!0})){if(!n.isDirectory())continue;let r=u.join(i,n.name);try{let{name:a}=JSON.parse(await g.readFile(u.join(r,"package.json"),"utf-8"));typeof a=="string"&&t.set(a,r)}catch{}}return t}function ie(e){return e.split("-").filter(t=>t.length>0).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}async function ne({targetDir:e,appId:t}){let i=u.join(e,"everyapp.config.ts");try{let n=await g.readFile(i,"utf-8"),r=n.replace(/(\bid\s*:\s*)["'][^"']+["']/,`$1"${t}"`);if(r===n)throw new Error("Could not find an id field in everyapp.config.ts");let a=r.replace(/(\bname\s*:\s*)["'][^"']+["']/,`$1"${ie(t)}"`);if(a===r)throw new Error("Could not find a name field in everyapp.config.ts");await g.writeFile(i,a,"utf-8")}catch(n){throw n instanceof Error&&"code"in n&&n.code==="ENOENT"?new Error("Starter template does not include everyapp.config.ts, which is required for deployments."):n}}async function re({targetDir:e,appId:t}){let i=u.join(e,"README.md"),n;try{n=await g.readFile(i,"utf-8")}catch(a){if(a instanceof Error&&"code"in a&&a.code==="ENOENT")return;throw a}let r=n.replace(/^# .*$/m,`# ${ie(t)}`);r!==n&&await g.writeFile(i,r,"utf-8")}var Ae=["node_modules",".git","pnpm-lock.yaml","package-lock.json",".env",".env.local",".env.production",".dev.vars",".cloudflare",".everyapp",".wrangler",".output",".tanstack","dist","manual-steps.md"];function $e(e){return A.join(e,"starter")}function ae({appId:e,cwd:t,root:i}){return h(t,i)?A.join(i,"apps",e):A.join(t,e)}function se(e,t){return h(e,t)?j(A.dirname(e))===j(A.join(t,"apps"))?"apps":"inside":"outside"}var ve=`allowBuilds:
10
+ esbuild: true
11
+ sharp: true
12
+ workerd: true
13
+ `;async function oe({root:e,targetDir:t,appId:i}){await W($e(e),t,{exclude:Ae}),h(t,e)||await ke.writeFile(A.join(t,"pnpm-workspace.yaml"),ve),await te({targetDir:t,appId:i,root:e}),await ne({targetDir:t,appId:i}),await re({targetDir:t,appId:i})}async function pe({targetDir:e,verbose:t=!1}){let i=n=>U("git",n,{cwd:e,echo:t,what:"Initializing the app's git repository",code:"GIT_FAILED"});await i(["init"]),await i(["add","."]),await i(["commit","-m","Starter template"])}import Ie from"node:os";import b from"node:path";var ce=/^[a-z]([a-z0-9-]*[a-z0-9])?$/,Ee="my-app";function L(e){let t=`"${e}" isn't a valid app name`;if(e.length>64)return{headline:t,fix:"use 64 characters or fewer"};if(e.includes("--"))return{headline:t,fix:`don't put two dashes in a row, e.g. ${e.replace(/-{2,}/g,"-")}`};if(!ce.test(e)){let i=le(e);return{headline:t,fix:`use lowercase letters, digits and dashes${i?`, e.g. ${i}`:", starting with a letter"}`}}return O(e)||R(e)===_?{headline:`"${e}" is reserved for the platform`,fix:"pick another name",reserved:!0}:null}function le(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^[^a-z]+|-+$/g,"");return t&&t.length<=64&&ce.test(t)?t:null}function be(e){return e.includes("/")||e.startsWith(".")||e.startsWith("~")||b.isAbsolute(e)}function Pe(e,{cwd:t,home:i}){return e==="~"||e.startsWith("~/")?b.resolve(i,e.slice(2)):b.resolve(t,e)}async function de(e,{interactive:t,yes:i,cwd:n,home:r=Ie.homedir()}){if(e!==void 0&&be(e)){let o=Pe(e,{cwd:n,home:r}),l=b.basename(o),p=L(l);if(p)throw new m("INVALID_APP_ID",`${p.headline}
14
+ An app is named after the last part of its path, ${e}.`,{fix:p.fix});return{appId:l,dir:o,absolute:b.isAbsolute(e)||e.startsWith("~")}}if(e!==void 0){let o=L(e);if(o)throw new m("INVALID_APP_ID",o.headline,{fix:o.fix});return{appId:e,dir:null,absolute:!1}}if(!t)throw new m("APP_ID_REQUIRED",`No app name given
15
+ ${i?"--yes means nothing is asked.":"There's no terminal to ask for one."}`,{rerun:`${x} create <name>${i?" --yes":""}`});return{appId:await Y("App name",{context:["Lowercase letters, digits and dashes. It becomes part of the app's URL."],initial:Ee,validate:o=>{let l=L(o);if(!l)return null;if(l.reserved)return`${o} is reserved for the platform. Pick another name.`;let p=le(o);return`Use lowercase letters, digits and dashes.${p&&!L(p)?` Try ${p}`:""}`}}),dir:null,absolute:!1}}async function xe(e,t){await V(e,i=>Le({flags:e,appIdArg:t,out:i}))}async function Le({flags:e,appIdArg:t,out:i,cwd:n=process.cwd(),root:r=Q(),cf:a=z(),install:o=G,git:l=pe,home:p}){let k=e.verbose??!1;if(await K($.join(n,"everyapp.config.ts")))throw new m("NESTED_APP",`This directory is already an app
16
+ It has an everyapp.config.ts. New apps go next to it, not inside it.`,{fix:"run create from the directory that holds your apps"});let d=await de(t,{interactive:!e.yes&&B(e.json??!1),yes:e.yes??!1,cwd:n,...p===void 0?{}:{home:p}}),{appId:f}=d,c=d.dir??ae({appId:f,cwd:n,root:r}),P=$.relative(n,c),S=d.absolute?c:P,y=d.absolute||P.startsWith("..")?S:`./${P}`;if(d.dir!==null&&se(d.dir,r)==="inside"){let s=v=>d.absolute?v:$.relative(n,v);throw new m("APP_DIR_IN_CHECKOUT",`${y} is inside your Every App checkout but not in its apps/ folder
17
+ An app inside the checkout goes in apps/<name>; one anywhere else is its own git repository.`,{fix:`use ${s($.join(r,"apps",f))} (inside the checkout) or ${s($.join($.dirname(r),f))} (beside it)`})}if(await J(c))throw new m("APP_DIR_EXISTS",`${y} already exists`,{fix:`pick another name, or move ${y} away`});i.emit({type:"step",step:"create.copy",status:"start",message:"Copying the starter template",data:{appId:f,shown:y,elsewhere:d.dir===null&&P.startsWith("..")}}),await oe({root:r,targetDir:c,appId:f}),i.emit({type:"step",step:"create.copy",status:"ok",message:"Copied the starter template",data:{appId:f,dir:c}});let T=await ee({root:r,appDir:c});i.emit({type:"step",step:"create.skill",status:"ok",message:`Added the ${T.skills.join(" and ")} ${T.skills.length===1?"skill":"skills"} for coding agents`,data:T}),await F(i,"create.install",["Installing dependencies","Installed dependencies"],async()=>{try{await o({cwd:c,description:"Installing dependencies",verbose:k})}catch(s){throw Te(s,{shown:y,cdTo:S})}});let fe=await q(c);try{await F(i,"create.types",["Generating types","Generated types"],()=>X(a,c))}catch(s){i.emit({type:"warning",code:"WORKER_TYPES_FAILED",step:"create.types",message:`Couldn't generate types
18
+ ${me(s)}. pnpm dev tries again.`})}try{i.emit({type:"step",step:"migrations.local",status:"start",message:"Setting up the local database"});let s=await H({cwd:c,manifest:fe,cf:a});i.emit({type:"step",step:"migrations.local",status:s.status==="applied"?"ok":"skip",message:"Set up the local database",data:s.status==="applied"?{database:s.database,applied:s.applied}:{reason:s.reason}})}catch(s){i.emit({type:"step",step:"migrations.local",status:"fail"}),i.emit({type:"warning",code:"MIGRATIONS_FAILED",step:"migrations.local",message:`Couldn't set up the local database
19
+ ${me(s)}. pnpm dev tries again.`,data:{rerun:`${x} db migrate`}})}if(!h(c,r))try{await F(i,"create.git",["Starting a git repository","Started a git repository"],()=>l({targetDir:c,verbose:k}))}catch(s){if(!(s instanceof m)||s.code!=="GIT_FAILED")throw s;let v=I(s.data?.command)?.startsWith("git commit")??!1;i.emit({type:"warning",code:"GIT_FAILED",step:"create.git",message:`${v?"Couldn't make the first git commit":"Couldn't start a git repository"}
20
+ git: ${C(s.data?.tail).at(-1)??"failed"}. Full log: ${I(s.data?.log)}`,data:{fix:v?`set git's user.name and user.email, then commit in ${y}`:`start one yourself in ${y}: git init, then commit`}})}let ge=[{command:`cd ${S}`},{command:"pnpm dev",note:"run it locally"},{command:"pnpm run deploy",note:"put it live"}];i.emit({type:"done",data:{appId:f,dir:c,next:ge}})}async function F(e,t,[i,n],r){let a=Date.now();e.emit({type:"step",step:t,status:"start",message:i});try{await r()}catch(o){throw e.emit({type:"step",step:t,status:"fail"}),o}e.emit({type:"step",step:t,status:"ok",message:n,data:{ms:Date.now()-a}})}function me(e){return(M(e).split(`
21
+ `)[0]??"").replace(/\.$/,"")}var Se=5;function Te(e,{shown:t,cdTo:i}){if(!(e instanceof m)||e.code!=="INSTALL_FAILED")return e;let n=e.data??{},r=C(n.tail).slice(-Se);return new m("INSTALL_FAILED",["Couldn't install dependencies",`${I(n.command)} exited ${String(n.exitCode)}.${r.length>0?" Its last lines:":""}`,...r.map(a=>` ${a}`),`Full log: ${I(n.log)}`,`${t} is created; only the install is left.`].join(`
22
+ `),{rerun:`cd ${i} && pnpm install`,data:n})}export{Le as createApp,xe as default};
@@ -0,0 +1,9 @@
1
+ import{a as Y,b as K}from"./chunk-LXYMDZER.js";import{b as B,d as W,e as J}from"./chunk-CZXHKPRZ.js";import{b as _}from"./chunk-ZECBN24L.js";import{i as G}from"./chunk-ONLNJXVQ.js";import{b as C,c as F,ha as P,qa as q,sa as T}from"./chunk-RMF4YGD6.js";import"./chunk-NFU4YFXB.js";import"./chunk-T2GD7RHS.js";import{a as E,e as U,f as A}from"./chunk-H7PDL3X5.js";import{a as Q,i as x}from"./chunk-CCWBPAKH.js";import{t as k}from"./chunk-JYKRUS5C.js";import{Bb as s,Fb as N,Gb as v,Yb as O,ac as $,bc as S,c as D,d as L,f as w,pb as M,pc as j,wc as R}from"./chunk-LYNBZ7RV.js";import ot from"node:fs/promises";import it from"node:path";import{text as at}from"node:stream/consumers";import u from"chalk";function V(t,e){let n=nt(t.reduce((r,o)=>r+o.duration,0));if(t.length===1){let[r]=t;if(z(r))return`${w(r.changes,"row")} changed ${u.green("\u2713")} ${u.dim(`${e} \xB7 ${n}`)}`;let o=u.dim(`${w(r.rows.length,"row")} \xB7 ${e} \xB7 ${n}`);return r.rows.length===0?o:[...H(r),"",o].join(`
2
+ `)}return[...t.flatMap(r=>[...z(r)?[`${w(r.changes,"row")} changed`]:H(r),""]),u.dim(`${w(t.length,"statement")} \xB7 ${e} \xB7 ${n}`)].join(`
3
+ `)}var z=t=>t.rows.length===0&&t.changes>0;function H({rows:t}){let e=Object.keys(t[0]??{});return e.length===0?[u.dim("0 rows")]:j(e,t.map(n=>e.map(r=>et(n[r]))))}function et(t){return t==null?u.dim("NULL"):typeof t=="string"?t.replaceAll(`
4
+ `,"\\n"):typeof t=="object"?JSON.stringify(t):String(t)}var nt=t=>t<1?"<1ms":`${Math.round(t)}ms`,rt=[/^(select|explain|values)\b/i,/^with\b(?![\s\S]*\b(insert|update|delete|replace)\b)/i,/^pragma\b[^=]*$/i];function X(t){let e=t.split(";").map(n=>n.trim()).filter(Boolean);return e.length>0&&e.every(n=>rt.some(r=>r.test(n)))}var I="db.migrate";async function jt(t){await R(t,async e=>{await st({cwd:process.cwd(),out:e}),e.emit({type:"done"})})}async function st({cwd:t,out:e,cf:n=$()}){let r=await E(t);await Y(t,e);let o;try{o=await B({cwd:t,manifest:r,cf:n,onApply:()=>e.emit({type:"step",step:I,status:"start",message:"Applying migrations to the local database..."})})}catch(a){throw await ct({cwd:t,manifest:r,cf:n,error:a})}if(o.status==="skipped"){e.emit({type:"step",step:I,status:"skip",message:o.reason==="no_d1"?`${r.id} declares no D1 database, so there's nothing to migrate.`:`No migrations in ${A(r)}/ yet, so there's nothing to migrate.`,data:{reason:o.reason}});return}K(e,I,o)}async function ct({cwd:t,manifest:e,cf:n,error:r}){let{problem:o,sqliteCode:a}=C(N(r)),[i]=await W({cwd:t,manifest:e,cf:n}).catch(()=>[]);return new s("MIGRATIONS_FAILED",[i?`Migration ${i} failed`:"A local migration failed",a?`${o} (${a})`:o].join(`
5
+ `),{data:{...i?{migration:i}:{},fix:`correct ${i?it.posix.join(A(e),i):"the migration"}`}})}async function _t(t,e){await R(t,async n=>{let r=t.local?"local":"production",o=await pt({cwd:process.cwd(),sql:await dt(e,t.file),local:t.local??!1,binding:t.binding,gateway:t.local?void 0:q(t.gateway),accountId:t["account-id"],yes:t.yes,json:t.json,out:n});n.emit({type:"done",data:{database:r,results:o.map(a=>a.rows),meta:o.map(({duration:a,changes:i})=>({duration:a,changes:i}))},display:V(o,r)})})}async function dt(t,e){if(t!==void 0&&e!==void 0)throw new s("SQL_TWICE","Pass the SQL or --file, not both",{data:{fix:"drop one of them"}});if(e===void 0){if(t===void 0)throw new s("SQL_REQUIRED","No SQL to run",{data:{fix:"pass it as an argument, or with --file <path> (- for stdin)"}});return t}if(e==="-")return at(process.stdin);try{return await ot.readFile(e,"utf8")}catch(n){throw O(n)?new s("SQL_FILE_NOT_FOUND",`No file at ${e}`):n}}async function pt({cwd:t,sql:e,local:n,binding:r,gateway:o,accountId:a,yes:i,json:c,out:d,cf:l=$(),createCf:g,interactive:h=Q(c??!1),confirm:b}){let p=await E(t),f=p.resources?.d1??[];if(f.length===0)throw new s("NO_D1",`${p.id} declares no D1 database`,{rerun:`${D} deploy`,data:{fix:"add a binding to resources.d1 in everyapp.config.ts"}});let m=r??U(f,p.migrations);if(!f.includes(m))throw new s("UNKNOWN_D1_BINDING",`No D1 binding ${m} in everyapp.config.ts
6
+ It declares ${f.join(", ")}.`,{rerun:L([],{argv:mt(process.argv.slice(2),f[0])})});let y=n?"local":"production";d.emit({type:"step",step:"db.query",status:"start",data:{database:y}});let tt=n?await lt({cwd:t,manifest:p,binding:m,sql:e,cf:l}):await ft({manifest:p,binding:m,sql:e,gateway:o,accountId:a,yes:i,json:c,out:d,createCf:g,interactive:h,confirm:b});return d.emit({type:"step",step:"db.query",status:"ok",data:{database:y}}),tt}function mt(t,e){return t.map((n,r)=>t[r-1]==="--binding"?e:n.startsWith("--binding=")?`--binding=${e}`:n)}async function lt({cwd:t,manifest:e,binding:n,sql:r,cf:o}){return(await Z("local",()=>S(o,{plane:"project",cwd:t,local:!0,env:J(t),args:["d1","raw",G(M(e.id),n),"--local","--persist-to",".cloudflare/state","--sql",r]},k))).map(({results:i,meta:c})=>({rows:(i?.rows??[]).map(d=>Object.fromEntries((i?.columns??[]).map((l,g)=>[l,d[g]]))),duration:c?.duration??0,changes:c?.changes??0}))}async function ft({manifest:t,binding:e,sql:n,gateway:r,accountId:o,yes:a,json:i,out:c,createCf:d,interactive:l,confirm:g}){let{cf:h,db:b}=await T({gateway:r,accountId:o,interactive:l,login:{json:i,out:c,step:"db.login"},createCf:d}),p=await P(b,t.id),m=(await _(b,p.workerName)).find(y=>y.kind==="d1"&&y.binding===e)?.resourceId;if(!m)throw new s("D1_NOT_FOUND",`${t.id} has no ${e} database yet
7
+ It's created on the app's first deploy.`,{rerun:`${D} deploy`});return X(n)||await x({yes:a,interactive:l,confirm:g,question:`Change data in ${t.id}'s production database?`,unattended:`This SQL can change ${t.id}'s production database
8
+ A person at a terminal confirms it first, or --yes does.`}),Z("production",()=>F(h,m,[{sql:n}]))}async function Z(t,e){try{return await e()}catch(n){if(!(n instanceof v))throw n;let{problem:r,sqliteCode:o}=C(n.message);throw o?new s("QUERY_FAILED",`Query failed: ${r}
9
+ ${o} from the ${t} database.`):n}}export{jt as migrate,st as migrateLocal,_t as query,pt as queryAppD1};
@@ -0,0 +1,3 @@
1
+ import{f as ee}from"./chunk-OP4DYXYI.js";import{a as Y}from"./chunk-J455FAEN.js";import{e as Q,i as X,j as Z}from"./chunk-EGEWRFVY.js";import{a as q}from"./chunk-2Y5Q6A5K.js";import{m as V}from"./chunk-H6QQMY7B.js";import"./chunk-6OGVO7QK.js";import{e as J}from"./chunk-PS7S74DG.js";import"./chunk-YHJZMJYZ.js";import"./chunk-N5GQLGEC.js";import{b as H}from"./chunk-W3JCQHHU.js";import{M as E,P as I}from"./chunk-TLRM3P7V.js";import{c as b,d as z}from"./chunk-ZFCUH5PK.js";import"./chunk-4JRIS6S6.js";import"./chunk-23HJ5I2A.js";import{a as $,b as M,g as U,h as v}from"./chunk-ZECBN24L.js";import"./chunk-ONLNJXVQ.js";import"./chunk-6PGUCTJ6.js";import"./chunk-HOUHG236.js";import{k as P,m as j,o as x,pa as G,q as T,qa as O,r as F,sa as L}from"./chunk-RMF4YGD6.js";import"./chunk-NFU4YFXB.js";import"./chunk-T2GD7RHS.js";import{c as B}from"./chunk-H7PDL3X5.js";import{a as A,f as N,i as K}from"./chunk-CCWBPAKH.js";import"./chunk-JYKRUS5C.js";import{Db as C,Hb as S,b as D,c as y,f as R,k as W,wc as _}from"./chunk-LYNBZ7RV.js";import ae from"node:path";import te from"chalk";async function Fe(t,n){await _(t,async l=>{let o=n??(await B(ae.join(process.cwd(),"everyapp.config.ts"),{message:"Which app? There's no everyapp.config.ts here",fix:`run this from the app's directory, or name it: ${y} delete <id>`})).id,a=A(t.json??!1);await ce({appId:o,flags:t,interactive:a});let m=await se({appId:o,gateway:O(t.gateway),accountId:t["account-id"],out:l,json:t.json,interactive:a,purge:t.purge??!1});l.emit({type:"done",...ie(o,m)})})}async function se({appId:t,gateway:n,accountId:l,out:o,json:a,interactive:m,purge:r,createCf:c,reconcile:g}){let i=await L({gateway:n,accountId:l,interactive:m,login:{json:a,out:o,step:"app.login"},createCf:c}),{cf:p,db:f}=i,k=Y(g,o);await V(i.install,k.source),o.emit({type:"step",step:"app.delete",status:"start",message:`Removing ${t} from the Gateway...`,data:{appId:t}});let h=(await E(f)).find(ne=>ne.appId===t),u={publicRoutes:(h?.publicPaths.length??0)>0,mcp:h?.mcp??!1},d=await G(f,t,i.deployer,Date.now(),{purge:r}),e=i.install,s=e.liveAppWorkers.includes(d.workerName)||e.liveDomains.includes(d.hostname);(!d.alreadyDeleted||s)&&await q({cf:p,out:o,accountId:i.accountId,databaseId:i.databaseId,interactive:m,cliVersion:D,...g,openRelease:k.openRelease}),await I({cf:p,db:f,install:i.install,out:o},{appId:t,surface:u,removing:!0}),o.emit({type:"step",step:"app.delete",status:"ok",message:`${t} is deleted on the gateway; ${d.hostname} stops serving it.`,data:{appId:t,hostname:d.hostname,workerName:d.workerName,alreadyDeleted:d.alreadyDeleted&&!s}});let w=await P(f);if(w&&H(d.hostname,w.appBaseDomain)&&!w.liveDomains.includes(d.hostname)&&await ee({cf:p,out:o,zoneId:w.zoneId,hostname:d.hostname}),!r)return d;let re=await le(p,f,i.accountId,o,t,d);return{...d,purged:re}}function ie(t,{workerName:n,alreadyDeleted:l,purged:o}){let a=`${y} delete ${t} --purge`,m=o?o.kept.length>0?`Deleted ${t}${o.removed.length>0?` and ${o.removed.join(", ")}`:""}; kept ${o.kept.join(", ")}.`:o.removed.length>0?`Deleted ${t} and ${o.removed.join(", ")}.`:`Deleted ${t}; nothing of it was left in Cloudflare.`:`${l?`${t} was already deleted`:`Deleted ${t}`}; its Worker and data are kept, and any cron triggers, Workflows and mail routes keep running.`,r=o?"":l?te.dim(`Its Worker and data are kept. To delete them: ${a}`):["Its Worker and data are kept, and any cron triggers, Workflows and mail routes keep running.",`To delete those too: ${a}`].map(c=>te.dim(c)).join(`
2
+ `);return{message:m,display:r,data:{appId:t,workerName:n,alreadyDeleted:l,purged:o?o.kept.length===0:!1,removed:o?.removed??[],kept:o?.kept??[]}}}var me=["Worker","Workflow","D1 database","KV namespace","Hyperdrive config","mail route"],oe={worker:"Compute (Workers) \u2192 Workers & Pages",d1:"Storage & Databases \u2192 D1",kv:"Storage & Databases \u2192 KV",workflow:"Compute (Workers) \u2192 Workflows"};async function le(t,n,l,o,a,m){o.emit({type:"step",step:"app.purge",status:"start",message:`Deleting ${a}'s Worker and data...`,data:{appId:a}});let r=new Map,c=e=>r.set(e,(r.get(e)??0)+1),g=await M(n,m.workerName),i=await J({cf:t,gatewayDb:n,accountId:l,workerName:m.workerName,routes:g.filter(e=>e.kind==="email-route")});i.length>0&&r.set("mail route",i.length);let p=g.filter(e=>e.kind!=="email-route"),f=[],k=new Set(p.flatMap(e=>e.kind==="worker"&&e.resourceId?[e.resourceId]:[]));if(k.size>0)for(let e of await X(t,m.workerName)){if(!k.has(e.script_name??"")){if(e.name.startsWith(`${m.workerName}--`)){let s=e.script_name??"unknown";f.push({described:`Workflow "${e.name}" (Worker ${s}'s)`,shown:`the Workflow ${e.name}, which Worker ${s} runs`,place:oe.workflow})}continue}await Z(t,e.name)&&(i.push(`Workflow "${e.name}"`),c("Workflow"))}let h=e=>e.kind!=="worker"?2:e.binding===""?0:1;for(let e of p.sort((s,w)=>h(s)-h(w)))if(e.resourceId)try{if(e.kind==="worker"){if(!await b(t,e.resourceId))continue;await z(t,e.resourceId)}else e.kind==="d1"?await T(t,e.resourceId):e.kind==="hyperdrive"?await Q(t,e.resourceId):await F(t,e.resourceId);i.push(v(e)),c($[e.kind])}catch(s){if(!S(s,"not_found"))throw s}await U(n,m.workerName);let u=[...await de(t,m,p),...f],d=me.flatMap(e=>{let s=r.get(e)??0;return s===0?[]:[s===1?e:R(s,e)]});if(o.emit({type:"step",step:"app.purge",status:"ok",message:i.length?`Deleted ${i.join(", ")}.`:"Nothing deleted in Cloudflare.",data:{appId:a,removed:i,kinds:d}}),u.length>0){let e=u.length===1;o.emit({type:"warning",code:"RESOURCES_KEPT",step:"app.purge",message:[`Kept ${W(u.map(s=>s.shown))}`,e?`It has ${a}'s name, but no deploy recorded creating it, so it may belong to something else.`:`They have ${a}'s names, but no deploy recorded creating them, so they may belong to something else.`].join(`
3
+ `),data:{kept:u.map(s=>s.described),fix:e?`if it is ${a}'s, delete it in the Cloudflare dashboard (${u[0].place})`:`if they are ${a}'s, delete them in the Cloudflare dashboard`}})}return{removed:i,kept:u.map(e=>e.described)}}async function de(t,n,l){let o=new Set(l.filter(r=>r.resourceId).map(r=>`${r.kind}:${r.name}`)),a=[],m=(r,c)=>a.push({described:v({kind:r,name:c}),shown:`the ${$[r]} ${c}`,place:oe[r]});!o.has(`worker:${n.workerName}`)&&await b(t,n.workerName)&&m("worker",n.workerName);for(let r of["d1","kv"])for(let c of new Set(Object.values(n.resources[r])))o.has(`${r}:${c}`)||await(r==="d1"?j:x)(t,c)&&m(r,c);return a}async function ce({appId:t,flags:n,interactive:l}){if(n.purge&&l&&!n.yes){let o=(await N(`Type ${t} to confirm`,{context:[`This deletes ${t}'s Worker and all its data for good.`]})).trim();if(o!==t)throw new C(o?`"${o}" doesn't match ${t}. Nothing deleted.`:"Cancelled. Nothing deleted.");return}await K({yes:n.yes,interactive:l,question:`Delete ${t} from the Gateway?`,unattended:"Deleting an app needs confirmation at a terminal, or --yes",context:["Its Worker and data stay; --purge deletes them too."],cancelled:"Cancelled. Nothing deleted."})}export{Fe as deleteApp,ie as deletionSummary,se as removeApp};
@@ -0,0 +1 @@
1
+ import{b as a,c as b}from"./chunk-FJJSSVET.js";import"./chunk-GKBPYVP3.js";import"./chunk-PNLU5U3P.js";import"./chunk-CZTEDWZ2.js";import"./chunk-N4E5YE4X.js";import"./chunk-BHMRY53V.js";import"./chunk-AGTCKFRB.js";import"./chunk-E3EPK27P.js";import"./chunk-IFCPALVC.js";import"./chunk-WOVS3GV5.js";import"./chunk-OM2HDWVP.js";import"./chunk-J455FAEN.js";import"./chunk-EGEWRFVY.js";import"./chunk-2Y5Q6A5K.js";import"./chunk-H6QQMY7B.js";import"./chunk-6OGVO7QK.js";import"./chunk-PS7S74DG.js";import"./chunk-YHJZMJYZ.js";import"./chunk-N5GQLGEC.js";import"./chunk-W3JCQHHU.js";import"./chunk-TLRM3P7V.js";import"./chunk-ZFCUH5PK.js";import"./chunk-4JRIS6S6.js";import"./chunk-23HJ5I2A.js";import"./chunk-ZECBN24L.js";import"./chunk-ONLNJXVQ.js";import"./chunk-6PGUCTJ6.js";import"./chunk-HOUHG236.js";import"./chunk-RMF4YGD6.js";import"./chunk-NFU4YFXB.js";import"./chunk-T2GD7RHS.js";import"./chunk-H7PDL3X5.js";import"./chunk-CCWBPAKH.js";import"./chunk-JYKRUS5C.js";import"./chunk-LYNBZ7RV.js";export{a as deploy,b as deployDone};