@stacksjs/ts-cloud 0.16.57 → 0.16.58

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 (93) hide show
  1. package/dist/bin/{chunk-8nfrknq3.js → chunk-0vfw6xy0.js} +1 -1
  2. package/dist/bin/{chunk-1q6wqzh1.js → chunk-1gznb7bh.js} +3 -3
  3. package/dist/bin/chunk-32nkkq9k.js +1 -0
  4. package/dist/bin/chunk-37aphhk9.js +3 -0
  5. package/dist/bin/{chunk-6sfn8fjv.js → chunk-4fkmd2ce.js} +1 -1
  6. package/dist/bin/{chunk-tbp1gf1p.js → chunk-5mnfp9ae.js} +1 -1
  7. package/dist/bin/chunk-5wz1e4ne.js +1 -0
  8. package/dist/bin/chunk-71vhvzhv.js +1 -0
  9. package/dist/bin/{chunk-jxm62h8r.js → chunk-8t01yv89.js} +1 -1
  10. package/dist/bin/{chunk-s59x3psv.js → chunk-9292d4yb.js} +34 -34
  11. package/dist/bin/{chunk-sbate1ky.js → chunk-agakphd1.js} +1 -1
  12. package/dist/bin/{chunk-k1kk78qg.js → chunk-ebhfg18g.js} +4 -4
  13. package/dist/bin/{chunk-1cccv502.js → chunk-enmw6v4x.js} +1 -1
  14. package/dist/bin/{chunk-8fh0gv4q.js → chunk-gvv4hn0h.js} +1 -1
  15. package/dist/bin/{chunk-s98wngxx.js → chunk-nnrta1g9.js} +1 -1
  16. package/dist/bin/{chunk-mn3x457v.js → chunk-p1eqv66t.js} +73 -73
  17. package/dist/bin/{chunk-dg8ceycc.js → chunk-qvrfaeqq.js} +7 -7
  18. package/dist/bin/chunk-sgkyg842.js +1 -0
  19. package/dist/bin/{chunk-rqvrjp8g.js → chunk-t8qzx4ka.js} +21 -21
  20. package/dist/bin/{chunk-v9js2b1d.js → chunk-tdftrmyx.js} +1 -1
  21. package/dist/bin/{chunk-hkx5j0bn.js → chunk-vmrkqtch.js} +1 -1
  22. package/dist/bin/{chunk-bn2sn094.js → chunk-wg9zm31f.js} +1 -1
  23. package/dist/bin/{chunk-jyvr7eh5.js → chunk-wzpsq446.js} +1 -1
  24. package/dist/bin/{chunk-e3zsrpbj.js → chunk-yn3499yh.js} +1 -1
  25. package/dist/bin/{chunk-28124w0n.js → chunk-zp1cxtbh.js} +1 -1
  26. package/dist/bin/{chunk-ek27709c.js → chunk-zpjy26jk.js} +3 -3
  27. package/dist/bin/cli.js +211 -211
  28. package/dist/bin/dashboard-server.js +1 -1
  29. package/dist/{chunk-r3qpx6xp.js → chunk-4f0b21fp.js} +2 -2
  30. package/dist/deploy/index.js +1 -1
  31. package/dist/drivers/shared/compute-ops.d.ts +6 -3
  32. package/dist/index.js +1 -1
  33. package/dist/mail/index.js +2 -2
  34. package/dist/ui/404.html +1 -1
  35. package/dist/ui/accept-invitation.html +1 -1
  36. package/dist/ui/access-denied.html +1 -1
  37. package/dist/ui/account/automation.html +6 -6
  38. package/dist/ui/account/security.html +2 -2
  39. package/dist/ui/applications/compose.html +6 -6
  40. package/dist/ui/applications/new.html +2 -2
  41. package/dist/ui/data/backups.html +6 -6
  42. package/dist/ui/data/services.html +6 -6
  43. package/dist/ui/data/volumes.html +6 -6
  44. package/dist/ui/index.html +6 -6
  45. package/dist/ui/infrastructure/topology.html +6 -6
  46. package/dist/ui/integrations.html +2 -2
  47. package/dist/ui/operations/alerts.html +6 -6
  48. package/dist/ui/operations/configuration.html +6 -6
  49. package/dist/ui/operations/jobs.html +5 -5
  50. package/dist/ui/operations/maintenance.html +5 -5
  51. package/dist/ui/operations/observability.html +6 -6
  52. package/dist/ui/operations/previews.html +6 -6
  53. package/dist/ui/operations/queue.html +5 -5
  54. package/dist/ui/operations/regions.html +5 -5
  55. package/dist/ui/operations/releases.html +6 -6
  56. package/dist/ui/operations/spend.html +6 -6
  57. package/dist/ui/operations/workloads.html +6 -6
  58. package/dist/ui/security.html +2 -2
  59. package/dist/ui/server/actions.html +6 -6
  60. package/dist/ui/server/activity.html +2 -2
  61. package/dist/ui/server/capacity.html +6 -6
  62. package/dist/ui/server/database.html +5 -5
  63. package/dist/ui/server/deployments.html +5 -5
  64. package/dist/ui/server/diagnostics.html +1 -1
  65. package/dist/ui/server/firewall.html +5 -5
  66. package/dist/ui/server/fleet.html +6 -6
  67. package/dist/ui/server/logs.html +5 -5
  68. package/dist/ui/server/metrics.html +5 -5
  69. package/dist/ui/server/security.html +2 -2
  70. package/dist/ui/server/services.html +2 -2
  71. package/dist/ui/server/sites.html +6 -6
  72. package/dist/ui/server/ssh-keys.html +6 -6
  73. package/dist/ui/server/team.html +6 -6
  74. package/dist/ui/server/terminal.html +2 -2
  75. package/dist/ui/serverless/alarms.html +6 -6
  76. package/dist/ui/serverless/assets.html +2 -2
  77. package/dist/ui/serverless/cost.html +2 -2
  78. package/dist/ui/serverless/data.html +6 -6
  79. package/dist/ui/serverless/deployments.html +2 -2
  80. package/dist/ui/serverless/firewall.html +1 -1
  81. package/dist/ui/serverless/functions.html +5 -5
  82. package/dist/ui/serverless/logs.html +6 -6
  83. package/dist/ui/serverless/metrics.html +2 -2
  84. package/dist/ui/serverless/queues.html +5 -5
  85. package/dist/ui/serverless/secrets.html +6 -6
  86. package/dist/ui/serverless/traces.html +6 -6
  87. package/dist/ui/serverless.html +6 -6
  88. package/package.json +3 -3
  89. package/dist/bin/chunk-6tdt3ea9.js +0 -1
  90. package/dist/bin/chunk-cdseg15k.js +0 -3
  91. package/dist/bin/chunk-et6hzqpx.js +0 -1
  92. package/dist/bin/chunk-gx5wqrgh.js +0 -1
  93. package/dist/bin/chunk-pexjxc5g.js +0 -1
@@ -1 +1 @@
1
- import{hm,ym,sa,Zc,aa,ca,Cn,je,A,la,el,H,Ur,w,eu,ne,Fr,da,qo,le,B,Go,tu,ru,nu,iu,l,o,bm,Sm,T,ua,pa,ma,vm,Cm,Oe,ga,Li,ou,Tm,Em,Ve,At,fa,tl,rl,wm,nl,il,ol,Wo,ha,it,Ko,Tn,Mi,En,ze,su,Jo,Xo,ya,ba,Sa,va,Ca,Ta,Ae,j,au,cu,sl,b,L,ot,k,al,Rt,ye,Gt,Am,cl,Re,Qo,He,Wt,Ui,Ie,Yo,$e,lu,Fi,Pe,De,ie,Bi,X,Kt,It,ke,t,wn,Rm,ll,Ea,Im,Pm,Dm,km,wa,Nm,xm,_m,Om,$m,Lm,Mm,Um,Fm,Bm,jm,Vm,du,uu,pu,mu,gu,fu,hu,Jt,dl,ul,Br,ji,zm,pl,Hm,qm,An,Gm,Wm,Km,Jm,Xm,Qm,yu,bu,Su,vu,Cu,Vi,Ym,Rn,Tu,ml,Eu,Aa,be,wu,Au,Pt,Zo,Xt,Ru,gl,Iu,Pu,Du,fl,Se,Zm,eg,tg,rg,ku,ng,Ne,ig,og,sg,Ra,Ia,Nu,hl,yl,ag,cg,lg,dg,ug,xu,Pa,pg,mg,gg,fg,hg,_u,Ou,yg,bg,Sg,vg,Cg,Tg,Eg,$u,wg,bl,Da,Ag,Rg,Ig,Pg,Sl,vl,Cl,Dg,ka,Lu,Mu,Uu,Fu,Na,Bu,kg,Ng,xg,_g,Og,$g,Lg,ju,Vu,zu,Hu,Tl,Mg,Ug,Fg,Bg,jg,Vg,zg,Hg,qg,qu,Gu,Wu,Ku,Gg,Wg,El,Kg,wl,Al,Rl,Il,Jg,Xg,Qg,Yg,st,zi,Zg,ef,tf,rf,nf,of,sf,af,Ju,cf,lf,Pl,Dl,df,uf,Xu,pf,mf,gf,ff,hf,yf,bf,Sf,vf,Cf,Tf,Ef,wf,Af,Rf,If,Pf,Df,kf,Nf,xf,xa,Qu,_a,Yu,Oa,Zu,$a,ep,La,tp,jr,rp,Ma,np,Hi,ip,Ua,op,Fa,sp,kl,_f,Nl,Of,Ba,ap,Vr,cp,xl,$f,ja,lp,_l,Lf,Ol,Mf,$l,Uf,Va,dp,Ll,Ff,Ml,Bf,Ul,jf,Fl,Vf,za,up,Ha,pp,Bl,zf,jl,Hf,Vl,qf,zl,Gf,Hl,Wf,ql,Kf,qa,mp,Gl,Jf,Wl,Xf,Kl,Qf,Jl,Yf,Xl,Zf,Ql,eh,Yl,Zl,ed,td,rd,th,nd,rh,id,nh,od,ih,Dt,sd,gp,es,Ga,In,fp,qi,Qt,Wa,Ka,hp,yp,Ja,ad,Xa,cd,oh,sh,Qa,Ya,Za,ld,Gi,dd,ud,ts,ec,tc,pd,bp,Sp,vp,ah,md,gd,ch,Cp,fd,Tp,Ep,wp,lh,hd,Pn,rc,yd,dh,Ap,rs,ns,nc,bd,uh,ic,Rp,Sd,ph,vd,mh,Cd,gh}from"./chunk-rqvrjp8g.js";import{oc,Y,sc,is,Ip,kt,Pp,Dp,Dn,kp,Np,xp,_p,Op}from"./chunk-z6xnegpe.js";export{Ua as ABTestManager,He as AI,Iu as AWSAPIError,Oa as AWSConfigManager,Rm as AWS_PSEUDO_PARAMETERS,st as AWS_REGIONS,Yo as ApiGateway,wn as Arn,ie as AssetHasher,Pe as Auth,xa as BackupManager,id as BatchProcessingManager,Ma as BlueGreenManager,Kl as BounceComplaintHandler,Fl as BuildOptimizationManager,ze as CDN,Ya as CHAIN_HEADER,fa as CLOUDFRONT_FAILOVER_STATUS_CODES,mf as COMMON_CROSS_ACCOUNT_ROLES,Ui as Cache,Hi as CanaryManager,Ll as CertificateManager,Pt as CloudError,ll as CloudFormationBuilder,Eu as CloudFormationClient,Au as CloudFrontClient,$a as CloudTrailManager,Ku as CommandHistory,ke as Communication,b as Compute,Zo as ConfigurationError,za as ContainerRegistryManager,Xt as CredentialError,wl as CrossRegionReferenceManager,uu as DASHBOARD_ENTRY,pu as DASHBOARD_PORT_BASE,mu as DASHBOARD_PORT_SPAN,du as DASHBOARD_STATE_DIR,tl as DEFAULT_FAILOVER_STATUS_CODES,Gi as DEFAULT_RECURSION_LIMITS,Ne as DEFAULT_SERVICE_LIMITS,sa as DEFAULT_STATE_DIR,su as DEFAULT_STORAGE_FAILOVER_STATUS_CODES,Qa as DEPTH_HEADER,nd as DLQMonitoringManager,Ae as DNS,Gl as DNSSECManager,Wt as Database,Ol as DatabaseUserManager,Se as DebugLogger,ou as DependencyGraph,De as Deployment,Ru as DeploymentError,_a as DisasterRecoveryManager,k as Email,Yl as EmailAdvanced,Jl as EmailAnalyticsManager,Zl as EmailHandlers,Ql as EmailTemplateManager,Pu as ErrorCodes,Xo as FAILOVER_REPLICA_POLICY_SID,rd as FIFOQueueManager,Ra as FileCache,ot as FileSystem,t as Fn,Al as GlobalResourceManager,La as GuardDutyManager,xu as HashCache,Sd as HealthCheckManager,Ul as ImageScanningManager,Gt as JobLoader,yd as LARAVEL_SERVERLESS_BUILD_STEPS,Vl as LambdaConcurrencyManager,ql as LambdaDLQManager,zl as LambdaDestinationsManager,Bl as LambdaLayersManager,Hl as LambdaVPCManager,jl as LambdaVersionsManager,Ba as LogsManager,fp as MANAGED_NODE_VERSIONS,dl as MANAGEMENT_DASHBOARD_SITE_PREFIX,$e as Messaging,Nl as MetricsManager,xl as MigrationManager,Sl as MockCloudFormation,Cl as MockDynamoDB,vl as MockS3,Fi as Monitoring,Pl as MultiAccountManager,El as MultiRegionManager,Vu as MultiStepProgress,L as Network,vd as NetworkSecurityManager,il as ORIGIN_CONNECTION_ATTEMPTS,ol as ORIGIN_CONNECTION_TIMEOUT,rl as ORIGIN_GROUP_ALLOWED_METHODS,wm as ORIGIN_GROUP_ID_SUFFIX,nl as ORIGIN_GROUP_SELECTION_CRITERIA,Dl as OrganizationManager,Ap as PHP_DEFAULT_EXCLUDES,hp as PHP_LAYER_EXTENSIONS,X as ParameterStore,_l as PerformanceManager,Ie as Permissions,Rt as Phone,ed as PhoneAdvanced,al as PhoneHandlers,ka as PreviewEnvironmentManager,Na as PreviewNotificationService,ju as ProgressBar,Fa as ProgressiveDeploymentManager,iu as Pseudo,ye as Queue,od as QueueManagementManager,hm as QueuePresets,Xu as RECOMMENDED_ACCOUNT_STRUCTURES,pf as RECOMMENDED_SCPS,qu as REPL,Wu as REPLCommandBuilder,Gu as REPLContext,_u as RateLimiter,ym as RealtimePresets,ts as RecursionGuard,It as Redirects,Rl as RegionPairManager,At as Registry,ja as ReplicaManager,Cd as ResourceManagementManager,Wl as Route53ResolverManager,qa as Route53RoutingManager,Aa as S3Client,be as S3Error,Re as SMS,Zc as STATE_DIR_ENV_VAR,Jo as STORAGE_FAILOVER_METADATA_KEY,Kt as Search,Bi as Secrets,Va as SecretsManager,$l as SecretsRotationManager,j as Security,jr as SecurityHubManager,Ml as SecurityScanningManager,Xl as SenderReputationManager,Ha as ServiceMeshManager,Qo as Sftp,td as SmsAdvanced,cl as SmsHandlers,zu as Spinner,Il as StackDependencyManager,Am as StacksIntegration,bd as StaticSiteManager,Ve as Storage,ic as StorageAdvancedManager,Vr as SyntheticsManager,Za as TRACE_HEADER,Hu as TaskList,Go as TemplateBuilder,Ia as TemplateCache,gl as ValidationError,lu as Workflow,kl as XRayManager,op as abTestManager,sl as amazonLinuxImageId,cu as amazonLinuxImageParameter,Tm as analyzeStackDiff,Ga as artifactKey,Tn as assertOriginGroupMethods,jg as autocomplete,Zu as awsConfigManager,Qu as backupManager,pg as batch,nh as batchProcessingManager,np as blueGreenManager,Qf as bounceComplaintHandler,sh as buildBunRuntimeLayerZip,Ea as buildCloudFormationTemplate,Ca as buildFailoverReplicaPolicyStatement,da as buildMailEnv,oh as buildNodeRuntimeLayerZip,Vf as buildOptimizationManager,ha as buildOriginGroup,Ko as buildOriginGroups,dh as buildPhpRuntimeLayerZip,va as buildReplicationConfiguration,Sa as buildReplicationRole,ip as canaryManager,Cg as categorizeChanges,Ff as certificateManager,rg as checkIAMPermissions,md as checkInvocation,ig as checkServiceQuotas,Ou as chunk,Np as clearSigningKeyCache,$u as cloudConfigSchema,ep as cloudTrailManager,ns as collectPhpAppEntries,Hm as composePresets,Ka as composeServerlessAppTemplate,up as containerRegistryManager,xm as createApiBackendPreset,wp as createCliHandler,Ym as createCredentialProvider,Vm as createDashboardSite,Mm as createDataPipelinePreset,fl as createError,wa as createExistingStaticFullStackPreset,Nm as createFullStackAppPreset,lh as createHandlers,Tp as createHttpHandler,Om as createJamstackPreset,Bm as createLaravelPreset,Um as createMLApiPreset,$m as createMicroservicesPreset,Dg as createMockAWS,Pm as createNodeJsServerPreset,Dm as createNodeJsServerlessPreset,qm as createPreset,is as createPresignedUrl,Ip as createPresignedUrlAsync,Ep as createQueueHandler,Lm as createRealtimeAppPreset,wu as createS3Client,jm as createServerlessLaravelPreset,km as createServerlessNodePreset,Im as createStaticSitePreset,Fm as createTraditionalWebAppPreset,_m as createWordPressPreset,Dt as createZip,Jg as crossRegionReferenceManager,Mf as databaseUserManager,bl as defaultLocalConfig,Ur as deploymentCoexistenceError,gu as deriveManagementDashboardPort,el as detectDeploymentTargets,eg as detectMisconfigurations,oc as detectServiceRegion,bg as diffTemplates,rh as dlqMonitoringManager,Jf as dnssecManager,Yu as drManager,Yf as emailAnalyticsManager,eh as emailTemplateManager,Cp as eventToRequest,pl as extendPreset,th as fifoQueueManager,ug as findChangedFiles,yf as formatAccountStructure,_g as formatBytes,Em as formatDiff,Og as formatDuration,zg as formatFlagSuggestions,Gg as formatHistory,Wg as formatHistoryStats,Lg as formatKeyValue,$g as formatList,xg as formatProgressBar,Ju as formatRegion,cf as formatRegionList,Mg as formatSuggestion,kg as formatTable,Ng as formatTree,Su as fromEC2Metadata,vu as fromECSMetadata,yu as fromEnvironment,bu as fromSharedCredentials,Cu as fromWebIdentity,ld as functionFingerprint,Xa as generateAppImageDockerfile,Nf as generateApprovalConfig,sd as generateBootstrap,Uu as generateCleanupWorkflow,Fu as generateCostReportWorkflow,ff as generateCrossAccountRoleCF,Pf as generateDeploymentConfig,Ef as generateDeploymentPipeline,bf as generateDeploymentWorkflow,o as generateLogicalId,If as generateManualPipeline,Tf as generateMatrixWorkflow,Df as generateMultiEnvConfig,wf as generateMultiEnvPipeline,Sf as generateMultiEnvWorkflow,vf as generatePRPreviewWorkflow,xf as generateParallelConfig,hd as generatePhpFpmConfig,ad as generatePhpLayerDockerfile,Af as generatePreviewPipeline,Mu as generatePreviewWorkflow,l as generateResourceName,kf as generateScheduledConfig,Rf as generateScheduledPipeline,Cf as generateScheduledWorkflow,ml as getAccountId,Zg as getAllRegions,of as getClosestRegion,Hg as getCommandUsage,Fg as getContextualHelp,Vi as getCredentials,Tg as getDeploymentStrategy,Eg as getDiffStats,Sg as getDiffSummary,Du as getErrorDetails,Da as getLocalConfig,Ig as getLocalCredentials,Rg as getLocalEndpoint,Pg as getLocalEnvVars,og as getQuotaUsageSummary,gf as getRecommendedStructure,zi as getRegion,lf as getRegionStats,tf as getRegionsByCompliance,ef as getRegionsByLocation,rf as getRegionsByPricingTier,ku as getRequiredPermissions,xp as getSigningKeyCacheSize,bm as getTimestamp,Xg as globalResourceManager,tp as guardDutyManager,Jt as hasManagementDashboardSite,ag as hashBuffer,cg as hashDirectory,hl as hashFile,lg as hashManifest,yl as hashString,ph as healthCheckManager,jf as imageScanningManager,ud as inspectInvocation,Sp as installRecursionFetch,pd as invocationContext,au as isArmInstanceType,Ug as isLikelyTypo,Ag as isLocalDevelopment,Br as isManagementDashboardSiteName,_p as isNodeCryptoAvailable,Mi as isS3RestEndpoint,ca as isStateDirConfigured,la as isStatePath,nf as isValidRegion,Op as isWebCryptoAvailable,qf as lambdaConcurrencyManager,Kf as lambdaDLQManager,Gf as lambdaDestinationsManager,zf as lambdaLayersManager,Wf as lambdaVPCManager,Hf as lambdaVersionsManager,rc as laravelServerlessEnvDefaults,ap as logsManager,eu as mailEnabled,Fr as mailFirewallPorts,qo as mailWebmailSites,kt as makeAWSRequest,Dp as makeAWSRequestAsync,Pp as makeAWSRequestOnce,ul as managementDashboardSiteName,An as mergeInfrastructure,Of as metricsManager,$f as migrationManager,df as multiAccountManager,Kg as multiRegionManager,mh as networkSecurityManager,uf as organizationManager,nc as packagePhpApp,In as packageServerlessApp,Pa as parallel,mg as parallelMap,gg as parallelWithRetry,dd as parseChain,kp as parseJSONResponse,Dn as parseXMLResponse,Lf as performanceManager,Ja as phpLayerBuildStage,yp as phpLayerPackages,Pn as phpRuntimeLayerAssets,Lu as previewManager,Bu as previewNotifications,yg as processInChunks,sp as progressiveDeploymentManager,ec as propagationHeaders,ih as queueManagementManager,dg as quickHash,tc as recursionBlockedResponse,Qg as regionPairManager,lp as replicaManager,vg as requiresReplacement,ah as resetRecursionRuntime,ch as resolveApp,w as resolveAppDatabase,B as resolveCloudProvider,Rn as resolveCredentials,fu as resolveDashboardDomain,hu as resolveDashboardDomains,Cm as resolveDeployBucketName,H as resolveDeploymentMode,Wo as resolveFailoverStatusCodes,le as resolveMailProxy,ne as resolveMailService,zm as resolveManagementDashboardSite,ji as resolveManagementDashboardSites,it as resolveOriginConnection,T as resolveProjectStackName,Wa as resolveQueueNames,Qt as resolveQueues,bp as resolveRecursionConfig,Tu as resolveRegion,Oe as resolveServerlessAppStackName,ga as resolveServerlessArtifactBucketName,Li as resolveServerlessAssetBucketName,qi as resolveServerlessRuntime,ma as resolveSiteBucketName,pa as resolveSiteResourceName,ua as resolveSiteStackName,A as resolveStatePath,vm as resolveStorageBucketName,ya as resolveStorageFailover,gh as resourceManagementManager,fd as responseToResult,Xf as route53ResolverManager,mp as route53RoutingManager,gp as runBuildHooks,rs as runPhpBuildHooks,ba as s3RegionalDomain,Sm as sanitizeName,Bg as searchCommands,dp as secretsManager,Uf as secretsRotationManager,rp as securityHubManager,Bf as securityScanningManager,Zf as senderReputationManager,fg as sequence,pp as serviceMeshManager,aa as setStateDir,es as sha256,vp as sharedRecursionGuard,cd as sharedRuntimeLoop,Y as signRequest,sc as signRequestAsync,Yg as stackDependencyManager,Cn as stateDir,je as statePath,uh as staticSiteManager,Rp as storageAdvancedManager,Ta as storageFailoverReplicasFromTemplate,Tl as suggestCommand,Vg as suggestFlags,ng as suggestIAMPolicy,sg as suggestQuotaIncrease,af as suggestRegionPairs,sf as suggestRegions,cp as syntheticsManager,Nu as templateCache,hf as validateAccountStructure,wg as validateAgainstSchema,qg as validateCommand,Zm as validateConfiguration,tg as validateCredentials,En as validateOriginGroups,nu as validateResourceLimits,tu as validateTemplate,ru as validateTemplateSize,Xm as withCDN,Jm as withCache,Km as withDatabase,gd as withInvocation,Gm as withMonitoring,Qm as withQueue,Wm as withSecurity,hg as withTimeout,_f as xrayManager};
1
+ import{hm,ym,sa,Zc,aa,ca,Cn,je,R,la,el,H,Ur,A,eu,ne,Fr,da,qo,le,B,Go,tu,ru,nu,iu,l,o,bm,Sm,T,ua,pa,ma,vm,Cm,Oe,ga,Li,ou,Tm,Em,Ve,At,fa,tl,rl,wm,nl,il,ol,Wo,ha,it,Ko,Tn,Mi,En,ze,su,Jo,Xo,ya,ba,Sa,va,Ca,Ta,Ae,j,au,cu,sl,b,L,ot,k,al,Rt,ye,Gt,Am,cl,Re,Qo,He,Wt,Ui,Ie,Yo,$e,lu,Fi,Pe,De,ie,Bi,X,Kt,It,ke,t,wn,Rm,ll,Ea,Im,Pm,Dm,km,wa,Nm,xm,_m,Om,$m,Lm,Mm,Um,Fm,Bm,jm,Vm,du,uu,pu,mu,gu,fu,hu,Jt,dl,ul,Br,ji,zm,pl,Hm,qm,An,Gm,Wm,Km,Jm,Xm,Qm,yu,bu,Su,vu,Cu,Vi,Ym,Rn,Tu,ml,Eu,Aa,be,wu,Au,Pt,Zo,Xt,Ru,gl,Iu,Pu,Du,fl,Se,Zm,eg,tg,rg,ku,ng,Ne,ig,og,sg,Ra,Ia,Nu,hl,yl,ag,cg,lg,dg,ug,xu,Pa,pg,mg,gg,fg,hg,_u,Ou,yg,bg,Sg,vg,Cg,Tg,Eg,$u,wg,bl,Da,Ag,Rg,Ig,Pg,Sl,vl,Cl,Dg,ka,Lu,Mu,Uu,Fu,Na,Bu,kg,Ng,xg,_g,Og,$g,Lg,ju,Vu,zu,Hu,Tl,Mg,Ug,Fg,Bg,jg,Vg,zg,Hg,qg,qu,Gu,Wu,Ku,Gg,Wg,El,Kg,wl,Al,Rl,Il,Jg,Xg,Qg,Yg,st,zi,Zg,ef,tf,rf,nf,of,sf,af,Ju,cf,lf,Pl,Dl,df,uf,Xu,pf,mf,gf,ff,hf,yf,bf,Sf,vf,Cf,Tf,Ef,wf,Af,Rf,If,Pf,Df,kf,Nf,xf,xa,Qu,_a,Yu,Oa,Zu,$a,ep,La,tp,jr,rp,Ma,np,Hi,ip,Ua,op,Fa,sp,kl,_f,Nl,Of,Ba,ap,Vr,cp,xl,$f,ja,lp,_l,Lf,Ol,Mf,$l,Uf,Va,dp,Ll,Ff,Ml,Bf,Ul,jf,Fl,Vf,za,up,Ha,pp,Bl,zf,jl,Hf,Vl,qf,zl,Gf,Hl,Wf,ql,Kf,qa,mp,Gl,Jf,Wl,Xf,Kl,Qf,Jl,Yf,Xl,Zf,Ql,eh,Yl,Zl,ed,td,rd,th,nd,rh,id,nh,od,ih,Dt,sd,gp,es,Ga,In,fp,qi,Qt,Wa,Ka,hp,yp,Ja,ad,Xa,cd,oh,sh,Qa,Ya,Za,ld,Gi,dd,ud,ts,ec,tc,pd,bp,Sp,vp,ah,md,gd,ch,Cp,fd,Tp,Ep,wp,lh,hd,Pn,rc,yd,dh,Ap,rs,ns,nc,bd,uh,ic,Rp,Sd,ph,vd,mh,Cd,gh}from"./chunk-t8qzx4ka.js";import{oc,Y,sc,is,Ip,kt,Pp,Dp,Dn,kp,Np,xp,_p,Op}from"./chunk-z6xnegpe.js";export{Ua as ABTestManager,He as AI,Iu as AWSAPIError,Oa as AWSConfigManager,Rm as AWS_PSEUDO_PARAMETERS,st as AWS_REGIONS,Yo as ApiGateway,wn as Arn,ie as AssetHasher,Pe as Auth,xa as BackupManager,id as BatchProcessingManager,Ma as BlueGreenManager,Kl as BounceComplaintHandler,Fl as BuildOptimizationManager,ze as CDN,Ya as CHAIN_HEADER,fa as CLOUDFRONT_FAILOVER_STATUS_CODES,mf as COMMON_CROSS_ACCOUNT_ROLES,Ui as Cache,Hi as CanaryManager,Ll as CertificateManager,Pt as CloudError,ll as CloudFormationBuilder,Eu as CloudFormationClient,Au as CloudFrontClient,$a as CloudTrailManager,Ku as CommandHistory,ke as Communication,b as Compute,Zo as ConfigurationError,za as ContainerRegistryManager,Xt as CredentialError,wl as CrossRegionReferenceManager,uu as DASHBOARD_ENTRY,pu as DASHBOARD_PORT_BASE,mu as DASHBOARD_PORT_SPAN,du as DASHBOARD_STATE_DIR,tl as DEFAULT_FAILOVER_STATUS_CODES,Gi as DEFAULT_RECURSION_LIMITS,Ne as DEFAULT_SERVICE_LIMITS,sa as DEFAULT_STATE_DIR,su as DEFAULT_STORAGE_FAILOVER_STATUS_CODES,Qa as DEPTH_HEADER,nd as DLQMonitoringManager,Ae as DNS,Gl as DNSSECManager,Wt as Database,Ol as DatabaseUserManager,Se as DebugLogger,ou as DependencyGraph,De as Deployment,Ru as DeploymentError,_a as DisasterRecoveryManager,k as Email,Yl as EmailAdvanced,Jl as EmailAnalyticsManager,Zl as EmailHandlers,Ql as EmailTemplateManager,Pu as ErrorCodes,Xo as FAILOVER_REPLICA_POLICY_SID,rd as FIFOQueueManager,Ra as FileCache,ot as FileSystem,t as Fn,Al as GlobalResourceManager,La as GuardDutyManager,xu as HashCache,Sd as HealthCheckManager,Ul as ImageScanningManager,Gt as JobLoader,yd as LARAVEL_SERVERLESS_BUILD_STEPS,Vl as LambdaConcurrencyManager,ql as LambdaDLQManager,zl as LambdaDestinationsManager,Bl as LambdaLayersManager,Hl as LambdaVPCManager,jl as LambdaVersionsManager,Ba as LogsManager,fp as MANAGED_NODE_VERSIONS,dl as MANAGEMENT_DASHBOARD_SITE_PREFIX,$e as Messaging,Nl as MetricsManager,xl as MigrationManager,Sl as MockCloudFormation,Cl as MockDynamoDB,vl as MockS3,Fi as Monitoring,Pl as MultiAccountManager,El as MultiRegionManager,Vu as MultiStepProgress,L as Network,vd as NetworkSecurityManager,il as ORIGIN_CONNECTION_ATTEMPTS,ol as ORIGIN_CONNECTION_TIMEOUT,rl as ORIGIN_GROUP_ALLOWED_METHODS,wm as ORIGIN_GROUP_ID_SUFFIX,nl as ORIGIN_GROUP_SELECTION_CRITERIA,Dl as OrganizationManager,Ap as PHP_DEFAULT_EXCLUDES,hp as PHP_LAYER_EXTENSIONS,X as ParameterStore,_l as PerformanceManager,Ie as Permissions,Rt as Phone,ed as PhoneAdvanced,al as PhoneHandlers,ka as PreviewEnvironmentManager,Na as PreviewNotificationService,ju as ProgressBar,Fa as ProgressiveDeploymentManager,iu as Pseudo,ye as Queue,od as QueueManagementManager,hm as QueuePresets,Xu as RECOMMENDED_ACCOUNT_STRUCTURES,pf as RECOMMENDED_SCPS,qu as REPL,Wu as REPLCommandBuilder,Gu as REPLContext,_u as RateLimiter,ym as RealtimePresets,ts as RecursionGuard,It as Redirects,Rl as RegionPairManager,At as Registry,ja as ReplicaManager,Cd as ResourceManagementManager,Wl as Route53ResolverManager,qa as Route53RoutingManager,Aa as S3Client,be as S3Error,Re as SMS,Zc as STATE_DIR_ENV_VAR,Jo as STORAGE_FAILOVER_METADATA_KEY,Kt as Search,Bi as Secrets,Va as SecretsManager,$l as SecretsRotationManager,j as Security,jr as SecurityHubManager,Ml as SecurityScanningManager,Xl as SenderReputationManager,Ha as ServiceMeshManager,Qo as Sftp,td as SmsAdvanced,cl as SmsHandlers,zu as Spinner,Il as StackDependencyManager,Am as StacksIntegration,bd as StaticSiteManager,Ve as Storage,ic as StorageAdvancedManager,Vr as SyntheticsManager,Za as TRACE_HEADER,Hu as TaskList,Go as TemplateBuilder,Ia as TemplateCache,gl as ValidationError,lu as Workflow,kl as XRayManager,op as abTestManager,sl as amazonLinuxImageId,cu as amazonLinuxImageParameter,Tm as analyzeStackDiff,Ga as artifactKey,Tn as assertOriginGroupMethods,jg as autocomplete,Zu as awsConfigManager,Qu as backupManager,pg as batch,nh as batchProcessingManager,np as blueGreenManager,Qf as bounceComplaintHandler,sh as buildBunRuntimeLayerZip,Ea as buildCloudFormationTemplate,Ca as buildFailoverReplicaPolicyStatement,da as buildMailEnv,oh as buildNodeRuntimeLayerZip,Vf as buildOptimizationManager,ha as buildOriginGroup,Ko as buildOriginGroups,dh as buildPhpRuntimeLayerZip,va as buildReplicationConfiguration,Sa as buildReplicationRole,ip as canaryManager,Cg as categorizeChanges,Ff as certificateManager,rg as checkIAMPermissions,md as checkInvocation,ig as checkServiceQuotas,Ou as chunk,Np as clearSigningKeyCache,$u as cloudConfigSchema,ep as cloudTrailManager,ns as collectPhpAppEntries,Hm as composePresets,Ka as composeServerlessAppTemplate,up as containerRegistryManager,xm as createApiBackendPreset,wp as createCliHandler,Ym as createCredentialProvider,Vm as createDashboardSite,Mm as createDataPipelinePreset,fl as createError,wa as createExistingStaticFullStackPreset,Nm as createFullStackAppPreset,lh as createHandlers,Tp as createHttpHandler,Om as createJamstackPreset,Bm as createLaravelPreset,Um as createMLApiPreset,$m as createMicroservicesPreset,Dg as createMockAWS,Pm as createNodeJsServerPreset,Dm as createNodeJsServerlessPreset,qm as createPreset,is as createPresignedUrl,Ip as createPresignedUrlAsync,Ep as createQueueHandler,Lm as createRealtimeAppPreset,wu as createS3Client,jm as createServerlessLaravelPreset,km as createServerlessNodePreset,Im as createStaticSitePreset,Fm as createTraditionalWebAppPreset,_m as createWordPressPreset,Dt as createZip,Jg as crossRegionReferenceManager,Mf as databaseUserManager,bl as defaultLocalConfig,Ur as deploymentCoexistenceError,gu as deriveManagementDashboardPort,el as detectDeploymentTargets,eg as detectMisconfigurations,oc as detectServiceRegion,bg as diffTemplates,rh as dlqMonitoringManager,Jf as dnssecManager,Yu as drManager,Yf as emailAnalyticsManager,eh as emailTemplateManager,Cp as eventToRequest,pl as extendPreset,th as fifoQueueManager,ug as findChangedFiles,yf as formatAccountStructure,_g as formatBytes,Em as formatDiff,Og as formatDuration,zg as formatFlagSuggestions,Gg as formatHistory,Wg as formatHistoryStats,Lg as formatKeyValue,$g as formatList,xg as formatProgressBar,Ju as formatRegion,cf as formatRegionList,Mg as formatSuggestion,kg as formatTable,Ng as formatTree,Su as fromEC2Metadata,vu as fromECSMetadata,yu as fromEnvironment,bu as fromSharedCredentials,Cu as fromWebIdentity,ld as functionFingerprint,Xa as generateAppImageDockerfile,Nf as generateApprovalConfig,sd as generateBootstrap,Uu as generateCleanupWorkflow,Fu as generateCostReportWorkflow,ff as generateCrossAccountRoleCF,Pf as generateDeploymentConfig,Ef as generateDeploymentPipeline,bf as generateDeploymentWorkflow,o as generateLogicalId,If as generateManualPipeline,Tf as generateMatrixWorkflow,Df as generateMultiEnvConfig,wf as generateMultiEnvPipeline,Sf as generateMultiEnvWorkflow,vf as generatePRPreviewWorkflow,xf as generateParallelConfig,hd as generatePhpFpmConfig,ad as generatePhpLayerDockerfile,Af as generatePreviewPipeline,Mu as generatePreviewWorkflow,l as generateResourceName,kf as generateScheduledConfig,Rf as generateScheduledPipeline,Cf as generateScheduledWorkflow,ml as getAccountId,Zg as getAllRegions,of as getClosestRegion,Hg as getCommandUsage,Fg as getContextualHelp,Vi as getCredentials,Tg as getDeploymentStrategy,Eg as getDiffStats,Sg as getDiffSummary,Du as getErrorDetails,Da as getLocalConfig,Ig as getLocalCredentials,Rg as getLocalEndpoint,Pg as getLocalEnvVars,og as getQuotaUsageSummary,gf as getRecommendedStructure,zi as getRegion,lf as getRegionStats,tf as getRegionsByCompliance,ef as getRegionsByLocation,rf as getRegionsByPricingTier,ku as getRequiredPermissions,xp as getSigningKeyCacheSize,bm as getTimestamp,Xg as globalResourceManager,tp as guardDutyManager,Jt as hasManagementDashboardSite,ag as hashBuffer,cg as hashDirectory,hl as hashFile,lg as hashManifest,yl as hashString,ph as healthCheckManager,jf as imageScanningManager,ud as inspectInvocation,Sp as installRecursionFetch,pd as invocationContext,au as isArmInstanceType,Ug as isLikelyTypo,Ag as isLocalDevelopment,Br as isManagementDashboardSiteName,_p as isNodeCryptoAvailable,Mi as isS3RestEndpoint,ca as isStateDirConfigured,la as isStatePath,nf as isValidRegion,Op as isWebCryptoAvailable,qf as lambdaConcurrencyManager,Kf as lambdaDLQManager,Gf as lambdaDestinationsManager,zf as lambdaLayersManager,Wf as lambdaVPCManager,Hf as lambdaVersionsManager,rc as laravelServerlessEnvDefaults,ap as logsManager,eu as mailEnabled,Fr as mailFirewallPorts,qo as mailWebmailSites,kt as makeAWSRequest,Dp as makeAWSRequestAsync,Pp as makeAWSRequestOnce,ul as managementDashboardSiteName,An as mergeInfrastructure,Of as metricsManager,$f as migrationManager,df as multiAccountManager,Kg as multiRegionManager,mh as networkSecurityManager,uf as organizationManager,nc as packagePhpApp,In as packageServerlessApp,Pa as parallel,mg as parallelMap,gg as parallelWithRetry,dd as parseChain,kp as parseJSONResponse,Dn as parseXMLResponse,Lf as performanceManager,Ja as phpLayerBuildStage,yp as phpLayerPackages,Pn as phpRuntimeLayerAssets,Lu as previewManager,Bu as previewNotifications,yg as processInChunks,sp as progressiveDeploymentManager,ec as propagationHeaders,ih as queueManagementManager,dg as quickHash,tc as recursionBlockedResponse,Qg as regionPairManager,lp as replicaManager,vg as requiresReplacement,ah as resetRecursionRuntime,ch as resolveApp,A as resolveAppDatabase,B as resolveCloudProvider,Rn as resolveCredentials,fu as resolveDashboardDomain,hu as resolveDashboardDomains,Cm as resolveDeployBucketName,H as resolveDeploymentMode,Wo as resolveFailoverStatusCodes,le as resolveMailProxy,ne as resolveMailService,zm as resolveManagementDashboardSite,ji as resolveManagementDashboardSites,it as resolveOriginConnection,T as resolveProjectStackName,Wa as resolveQueueNames,Qt as resolveQueues,bp as resolveRecursionConfig,Tu as resolveRegion,Oe as resolveServerlessAppStackName,ga as resolveServerlessArtifactBucketName,Li as resolveServerlessAssetBucketName,qi as resolveServerlessRuntime,ma as resolveSiteBucketName,pa as resolveSiteResourceName,ua as resolveSiteStackName,R as resolveStatePath,vm as resolveStorageBucketName,ya as resolveStorageFailover,gh as resourceManagementManager,fd as responseToResult,Xf as route53ResolverManager,mp as route53RoutingManager,gp as runBuildHooks,rs as runPhpBuildHooks,ba as s3RegionalDomain,Sm as sanitizeName,Bg as searchCommands,dp as secretsManager,Uf as secretsRotationManager,rp as securityHubManager,Bf as securityScanningManager,Zf as senderReputationManager,fg as sequence,pp as serviceMeshManager,aa as setStateDir,es as sha256,vp as sharedRecursionGuard,cd as sharedRuntimeLoop,Y as signRequest,sc as signRequestAsync,Yg as stackDependencyManager,Cn as stateDir,je as statePath,uh as staticSiteManager,Rp as storageAdvancedManager,Ta as storageFailoverReplicasFromTemplate,Tl as suggestCommand,Vg as suggestFlags,ng as suggestIAMPolicy,sg as suggestQuotaIncrease,af as suggestRegionPairs,sf as suggestRegions,cp as syntheticsManager,Nu as templateCache,hf as validateAccountStructure,wg as validateAgainstSchema,qg as validateCommand,Zm as validateConfiguration,tg as validateCredentials,En as validateOriginGroups,nu as validateResourceLimits,tu as validateTemplate,ru as validateTemplateSize,Xm as withCDN,Jm as withCache,Km as withDatabase,gd as withInvocation,Gm as withMonitoring,Qm as withQueue,Wm as withSecurity,hg as withTimeout,_f as xrayManager};
@@ -1,9 +1,9 @@
1
- import{H,Ur}from"./chunk-rqvrjp8g.js";function J(e,t){return`/var/www/${e}-${t}`}var me=new Set(["laravel","php","statamic","wordpress"]);function Di(e){return e.type!=null&&me.has(e.type)}function Gs(e){let t=e.proxyTo;if(t==null)return[];return(Array.isArray(t)?t:[t]).map((n)=>String(n).trim()).filter((n)=>n.length>0)}function fe(e){return Gs(e).length>0}function te(e){if(e.deploy)return e.deploy;if(Di(e))return"server";if(e.start)return"server";return"bucket"}function I(e){if(e.redirect)return"redirect";if(fe(e))return"proxy";if(Di(e))return"server-php";if(te(e)==="bucket")return"bucket";return e.start?"server-app":"server-static"}function $o(e){return e.infrastructure?.compute!=null||Boolean(e.cloud?.attachTo?.trim())}function Ws(e,t={}){let r=[],n=[],o=e.sites||{},s=$o(e),c=Ur(e);if(c)r.push(c);let p=new Map;for(let[l,i]of Object.entries(o)){if(!i)continue;let f=te(i),R=I(i);if(R==="redirect"){if(!i.domain)r.push(`Site '${l}' is a redirect site but has no \`domain\` to redirect from.`);if(!(typeof i.redirect==="string"?i.redirect:i.redirect?.to))r.push(`Site '${l}' is a redirect site but has no redirect target (\`redirect\` / \`redirect.to\`).`);if(!s)r.push(`Site '${l}' is a redirect site but no \`infrastructure.compute\` is configured to host the gateway that serves the redirect.`);let a=[];if(i.start)a.push("start");if(i.root)a.push("root");if(i.proxyTo)a.push("proxyTo");if(a.length>0)n.push(`Site '${l}' is a redirect site but also sets ${a.join(", ")}. These are ignored.`);continue}if(R==="proxy"){if(!i.domain)r.push(`Site '${l}' is a proxy site but has no \`domain\` to route from.`);if(!s)r.push(`Site '${l}' is a proxy site but no \`infrastructure.compute\` is configured to host the gateway that forwards it.`);let u=[];if(i.start)u.push("start");if(i.root)u.push("root");if(typeof i.port==="number")u.push("port");if(i.build)u.push("build");if(i.preStart&&i.preStart.length>0)u.push("preStart");if(u.length>0)n.push(`Site '${l}' sets \`proxyTo\`, so ts-cloud ships and supervises nothing for it. ${u.join(", ")} ${u.length===1?"is":"are"} ignored — remove ${u.length===1?"it":"them"}, or drop \`proxyTo\` to let ts-cloud own the service.`);continue}if(f==="server"&&!i.start&&!i.root){r.push(`Site '${l}' sets deploy:'server' but declares neither \`start\` (dynamic app) nor \`root\` (static site to serve). Add one.`);continue}if(R==="server-php"){if(!s)r.push(`Site '${l}' is a PHP site (type:'${i.type}') but no \`infrastructure.compute\` is configured. Add a server (infrastructure.compute) with PHP provisioning.`);if(!i.repository?.url)r.push(`Site '${l}' is a PHP site (type:'${i.type}') but has no \`repository.url\` to clone. PHP sites deploy via git.`)}else if(R==="server-app"){if(!s)r.push(`Site '${l}' deploys to a server (deploy:'server'${i.deploy?"":" inferred from `start`"}) but no \`infrastructure.compute\` is configured. Set deploy:'bucket' or add a server (infrastructure.compute).`);if(typeof i.port==="number"){let u=t.occupiedPorts?.get(i.port);if(u)r.push(`Site '${l}' wants port ${i.port}, which project '${u}' already serves on this box. Attached projects share one port namespace. Give '${l}' a free port, or let the attach allocate one.`);let a=p.get(i.port);if(a)r.push(`Sites '${a}' and '${l}' both use port ${i.port}. Server apps sharing a box must use distinct ports.`);else p.set(i.port,l)}}else if(R==="server-static"){if(!i.root)r.push(`Site '${l}' is a server static site (deploy:'server', no \`start\`) but has no \`root\` directory to serve.`);if(!s)r.push(`Site '${l}' deploys to a server (deploy:'server') but no \`infrastructure.compute\` is configured. Set deploy:'bucket' or add a server (infrastructure.compute).`)}else{if(!i.root)r.push(`Site '${l}' deploys to a bucket but has no \`root\` directory to upload.`);let u=[];if(i.start)u.push("start");if(typeof i.port==="number")u.push("port");if(i.preStart&&i.preStart.length>0)u.push("preStart");if(u.length>0)n.push(`Site '${l}' deploys to a bucket but sets server-only field(s): ${u.join(", ")}. These are ignored. Set deploy:'server' to use them.`)}}return{errors:r,warnings:n}}function Ks(e){let t=I(e);return t!=="bucket"&&t!=="redirect"&&t!=="proxy"}function Hc(e){return I(e)==="bucket"}function qc(e,t){if(H(e)==="serverless")return!0;let r=Object.entries(e.sites??{}).filter(([,o])=>o!=null),n=t?r.filter(([o])=>o===t):r;if(n.length===0)return!0;return!n.every(([,o])=>{let s=I(o);return s==="redirect"||s==="proxy"})}var L={php:"php.net",nginx:"nginx.org",composer:"getcomposer.org",mysql:"mysql.com",mariadb:"mariadb.com/server",postgres:"postgresql.org",vitess:"vitess.io",etcd:"etcd.io",redis:"redis.io",memcached:"memcached.org",meilisearch:"meilisearch.com",mail:"github.com/mail-os/mail",git:"git-scm.com",certbot:"certbot.eff.org",bun:"bun.sh",node:"nodejs.org",deno:"deno.land"};var U="/opt/pantry";function N(e){return`'${e.split("'").join("'\\''")}'`}function kr(e={}){return["export DEBIAN_FRONTEND=noninteractive","export PANTRY_SERVICE_SCOPE=system","export PANTRY_INSTALL_DIR=/usr/local/bin",e.version?`export PANTRY_VERSION=${N(e.version)}`:'export PANTRY_VERSION="${PANTRY_VERSION:-latest}"',"command -v curl >/dev/null 2>&1 || (apt-get update -y && apt-get install -y curl ca-certificates)","command -v unzip >/dev/null 2>&1 || (apt-get update -y && apt-get install -y unzip)",'OS=$(uname -s | tr \'[:upper:]\' \'[:lower:]\'); ARCH=$(uname -m); case "$ARCH" in x86_64|amd64) ARCH=x64 ;; arm64|aarch64) ARCH=arm64 ;; esac; ZIP="pantry-${OS}-${ARCH}.zip"; if [ "${PANTRY_VERSION:-latest}" = latest ]; then REL=\'latest/download\'; else REL="download/v${PANTRY_VERSION}"; fi; TMP=$(mktemp -d); curl -fsSL -o "${TMP}/${ZIP}" "https://github.com/pantry-pm/pantry/releases/${REL}/${ZIP}"; unzip -o "${TMP}/${ZIP}" -d /usr/local/bin; chmod +x /usr/local/bin/pantry; rm -rf "${TMP}"','export PATH="/usr/local/bin:$PATH"',"mkdir -p /opt/pantry"]}function Ct(){return'eval "$(cd /opt/pantry && pantry env 2>/dev/null)" || true'}function nt(e){if(e.length===0)return[];return[`(cd /opt/pantry && pantry install ${[...new Set(e)].map(N).join(" ")})`]}function Lo(e){return[...new Set(e)].flatMap((t)=>[`(cd /opt/pantry && pantry start ${N(t)})`,`(cd /opt/pantry && pantry enable ${N(t)})`])}var m="/etc/mail",T="mail-server",q="mail",F=`${U}/pantry/.bin`;function h(e){return`'${String(e).split("'").join("'\\''")}'`}function C(e){return`"${e.replace(/\\/g,"\\\\").replace(/"/g,"\\\"")}"`}function ge(e){return[e.version?`${L.mail}@${e.version}`:L.mail]}function Y(e,t){return`${m}/dkim/${t}.${e.dkim.selector}.pem`}function re(e){return`${e.storagePath}/smtp.db`}function Te(e){let t=["# Generated by ts-cloud. Edits are overwritten on the next deploy —","# change `services.mail` in the cloud config instead.","","[server]",`host = ${C(e.bindAddress)}`,`port = ${e.ports.smtp}`,`hostname = ${C(e.hostname)}`];if(e.domains.length>0)t.push(`local_domains = ${C(e.domains.join(", "))}`);if(e.mode==="catcher")t.push("catch_all = true");if(t.push(`max_message_size = ${e.maxMessageSize}`,"","[tls]",`enabled = ${e.tls.enabled}`),e.tls.certPath)t.push(`cert_path = ${C(e.tls.certPath)}`);if(e.tls.keyPath)t.push(`key_path = ${C(e.tls.keyPath)}`);if(t.push("","[auth]",`enabled = ${e.mode==="server"}`,"","[antispam]",`dnsbl = ${e.spam.dnsbl}`,`greylist = ${e.spam.greylist}`,`spam_filter = ${e.spam.enabled}`,`junk_score = ${e.spam.junkScore}`,`reject_score = ${e.spam.rejectScore}`,"","[dkim]",`rotation_enabled = ${e.dkim.enabled&&e.dkim.rotate}`,`rotation_interval_days = ${e.dkim.rotateIntervalDays}`,"","[acme]",`enabled = ${e.tls.acme}`),e.tls.acmeEmail)t.push(`email = ${C(e.tls.acmeEmail)}`);if(t.push("","[webhook]",`enabled = ${!!e.webhookUrl}`),e.webhookUrl)t.push(`url = ${C(e.webhookUrl)}`);return t.push(""),t.join(`
1
+ import{H,Ur}from"./chunk-t8qzx4ka.js";function J(e,t){return`/var/www/${e}-${t}`}var me=new Set(["laravel","php","statamic","wordpress"]);function Di(e){return e.type!=null&&me.has(e.type)}function Gs(e){let t=e.proxyTo;if(t==null)return[];return(Array.isArray(t)?t:[t]).map((n)=>String(n).trim()).filter((n)=>n.length>0)}function fe(e){return Gs(e).length>0}function te(e){if(e.deploy)return e.deploy;if(Di(e))return"server";if(e.start)return"server";return"bucket"}function w(e){if(e.redirect)return"redirect";if(fe(e))return"proxy";if(Di(e))return"server-php";if(te(e)==="bucket")return"bucket";return e.start?"server-app":"server-static"}function $o(e){return e.infrastructure?.compute!=null||Boolean(e.cloud?.attachTo?.trim())}function Ws(e,t={}){let r=[],n=[],o=e.sites||{},s=$o(e),c=Ur(e);if(c)r.push(c);let p=new Map;for(let[l,i]of Object.entries(o)){if(!i)continue;let f=te(i),R=w(i);if(R==="redirect"){if(!i.domain)r.push(`Site '${l}' is a redirect site but has no \`domain\` to redirect from.`);if(!(typeof i.redirect==="string"?i.redirect:i.redirect?.to))r.push(`Site '${l}' is a redirect site but has no redirect target (\`redirect\` / \`redirect.to\`).`);if(!s)r.push(`Site '${l}' is a redirect site but no \`infrastructure.compute\` is configured to host the gateway that serves the redirect.`);let a=[];if(i.start)a.push("start");if(i.root)a.push("root");if(i.proxyTo)a.push("proxyTo");if(a.length>0)n.push(`Site '${l}' is a redirect site but also sets ${a.join(", ")}. These are ignored.`);continue}if(R==="proxy"){if(!i.domain)r.push(`Site '${l}' is a proxy site but has no \`domain\` to route from.`);if(!s)r.push(`Site '${l}' is a proxy site but no \`infrastructure.compute\` is configured to host the gateway that forwards it.`);let u=[];if(i.start)u.push("start");if(i.root)u.push("root");if(typeof i.port==="number")u.push("port");if(i.build)u.push("build");if(i.preStart&&i.preStart.length>0)u.push("preStart");if(u.length>0)n.push(`Site '${l}' sets \`proxyTo\`, so ts-cloud ships and supervises nothing for it. ${u.join(", ")} ${u.length===1?"is":"are"} ignored — remove ${u.length===1?"it":"them"}, or drop \`proxyTo\` to let ts-cloud own the service.`);continue}if(f==="server"&&!i.start&&!i.root){r.push(`Site '${l}' sets deploy:'server' but declares neither \`start\` (dynamic app) nor \`root\` (static site to serve). Add one.`);continue}if(R==="server-php"){if(!s)r.push(`Site '${l}' is a PHP site (type:'${i.type}') but no \`infrastructure.compute\` is configured. Add a server (infrastructure.compute) with PHP provisioning.`);if(!i.repository?.url)r.push(`Site '${l}' is a PHP site (type:'${i.type}') but has no \`repository.url\` to clone. PHP sites deploy via git.`)}else if(R==="server-app"){if(!s)r.push(`Site '${l}' deploys to a server (deploy:'server'${i.deploy?"":" inferred from `start`"}) but no \`infrastructure.compute\` is configured. Set deploy:'bucket' or add a server (infrastructure.compute).`);if(typeof i.port==="number"){let u=t.occupiedPorts?.get(i.port);if(u)r.push(`Site '${l}' wants port ${i.port}, which project '${u}' already serves on this box. Attached projects share one port namespace. Give '${l}' a free port, or let the attach allocate one.`);let a=p.get(i.port);if(a)r.push(`Sites '${a}' and '${l}' both use port ${i.port}. Server apps sharing a box must use distinct ports.`);else p.set(i.port,l)}}else if(R==="server-static"){if(!i.root)r.push(`Site '${l}' is a server static site (deploy:'server', no \`start\`) but has no \`root\` directory to serve.`);if(!s)r.push(`Site '${l}' deploys to a server (deploy:'server') but no \`infrastructure.compute\` is configured. Set deploy:'bucket' or add a server (infrastructure.compute).`)}else{if(!i.root)r.push(`Site '${l}' deploys to a bucket but has no \`root\` directory to upload.`);let u=[];if(i.start)u.push("start");if(typeof i.port==="number")u.push("port");if(i.preStart&&i.preStart.length>0)u.push("preStart");if(u.length>0)n.push(`Site '${l}' deploys to a bucket but sets server-only field(s): ${u.join(", ")}. These are ignored. Set deploy:'server' to use them.`)}}return{errors:r,warnings:n}}function Ks(e){let t=w(e);return t!=="bucket"&&t!=="redirect"&&t!=="proxy"}function Hc(e){return w(e)==="bucket"}function qc(e,t){if(H(e)==="serverless")return!0;let r=Object.entries(e.sites??{}).filter(([,o])=>o!=null),n=t?r.filter(([o])=>o===t):r;if(n.length===0)return!0;return!n.every(([,o])=>{let s=w(o);return s==="redirect"||s==="proxy"})}var L={php:"php.net",nginx:"nginx.org",composer:"getcomposer.org",mysql:"mysql.com",mariadb:"mariadb.com/server",postgres:"postgresql.org",vitess:"vitess.io",etcd:"etcd.io",redis:"redis.io",memcached:"memcached.org",meilisearch:"meilisearch.com",mail:"github.com/mail-os/mail",git:"git-scm.com",certbot:"certbot.eff.org",bun:"bun.sh",node:"nodejs.org",deno:"deno.land"};var U="/opt/pantry";function M(e){return`'${e.split("'").join("'\\''")}'`}function kr(e={}){return["export DEBIAN_FRONTEND=noninteractive","export PANTRY_SERVICE_SCOPE=system","export PANTRY_INSTALL_DIR=/usr/local/bin",e.version?`export PANTRY_VERSION=${M(e.version)}`:'export PANTRY_VERSION="${PANTRY_VERSION:-latest}"',"command -v curl >/dev/null 2>&1 || (apt-get update -y && apt-get install -y curl ca-certificates)","command -v unzip >/dev/null 2>&1 || (apt-get update -y && apt-get install -y unzip)",'OS=$(uname -s | tr \'[:upper:]\' \'[:lower:]\'); ARCH=$(uname -m); case "$ARCH" in x86_64|amd64) ARCH=x64 ;; arm64|aarch64) ARCH=arm64 ;; esac; ZIP="pantry-${OS}-${ARCH}.zip"; if [ "${PANTRY_VERSION:-latest}" = latest ]; then REL=\'latest/download\'; else REL="download/v${PANTRY_VERSION}"; fi; TMP=$(mktemp -d); curl -fsSL -o "${TMP}/${ZIP}" "https://github.com/pantry-pm/pantry/releases/${REL}/${ZIP}"; unzip -o "${TMP}/${ZIP}" -d /usr/local/bin; chmod +x /usr/local/bin/pantry; rm -rf "${TMP}"','export PATH="/usr/local/bin:$PATH"',"mkdir -p /opt/pantry"]}function Ct(){return'eval "$(cd /opt/pantry && pantry env 2>/dev/null)" || true'}function nt(e){if(e.length===0)return[];return[`(cd /opt/pantry && pantry install ${[...new Set(e)].map(M).join(" ")})`]}function Lo(e){return[...new Set(e)].flatMap((t)=>[`(cd /opt/pantry && pantry start ${M(t)})`,`(cd /opt/pantry && pantry enable ${M(t)})`])}var m="/etc/mail",T="mail-server",q="mail",F=`${U}/pantry/.bin`;function h(e){return`'${String(e).split("'").join("'\\''")}'`}function C(e){return`"${e.replace(/\\/g,"\\\\").replace(/"/g,"\\\"")}"`}function ge(e){return[e.version?`${L.mail}@${e.version}`:L.mail]}function Y(e,t){return`${m}/dkim/${t}.${e.dkim.selector}.pem`}function re(e){return`${e.storagePath}/smtp.db`}function Te(e){let t=["# Generated by ts-cloud. Edits are overwritten on the next deploy —","# change `services.mail` in the cloud config instead.","","[server]",`host = ${C(e.bindAddress)}`,`port = ${e.ports.smtp}`,`hostname = ${C(e.hostname)}`];if(e.domains.length>0)t.push(`local_domains = ${C(e.domains.join(", "))}`);if(e.mode==="catcher")t.push("catch_all = true");if(t.push(`max_message_size = ${e.maxMessageSize}`,"","[tls]",`enabled = ${e.tls.enabled}`),e.tls.certPath)t.push(`cert_path = ${C(e.tls.certPath)}`);if(e.tls.keyPath)t.push(`key_path = ${C(e.tls.keyPath)}`);if(t.push("","[auth]",`enabled = ${e.mode==="server"}`,"","[antispam]",`dnsbl = ${e.spam.dnsbl}`,`greylist = ${e.spam.greylist}`,`spam_filter = ${e.spam.enabled}`,`junk_score = ${e.spam.junkScore}`,`reject_score = ${e.spam.rejectScore}`,"","[dkim]",`rotation_enabled = ${e.dkim.enabled&&e.dkim.rotate}`,`rotation_interval_days = ${e.dkim.rotateIntervalDays}`,"","[acme]",`enabled = ${e.tls.acme}`),e.tls.acmeEmail)t.push(`email = ${C(e.tls.acmeEmail)}`);if(t.push("","[webhook]",`enabled = ${!!e.webhookUrl}`),e.webhookUrl)t.push(`url = ${C(e.webhookUrl)}`);return t.push(""),t.join(`
2
2
  `)}function he(e){let t=["# Generated by ts-cloud. See /etc/mail/config.toml for the rest.",`SMTP_DB_PATH=${re(e)}`,`SMTP_DELIVERY_METHOD=${e.delivery==="ses"?"ses":"direct"}`];if(e.delivery==="ses")t.push(`SMTP_SES_REGION=${e.sesRegion}`);if(e.ports.submission)t.push(`SUBMISSION_PORT=${e.ports.submission}`);if(e.ports.submissions)t.push(`SMTPS_PORT=${e.ports.submissions}`);if(e.ports.imap)t.push("IMAP_ENABLED=1",`IMAP_PORT=${e.ports.imap}`);if(e.webmail.enabled)t.push("SMTP_ENABLE_WEBMAIL=true",`SMTP_WEBMAIL_PORT=${e.webmail.port}`,`SMTP_WEBMAIL_TLS=${e.webmail.tls}`,`SMTP_WEBMAIL_SECURE_COOKIES=${e.webmail.secureCookies}`,`SMTP_WEBMAIL_ATTACHMENT_MAX_FILE=${e.webmail.attachmentMaxFileBytes}`,`SMTP_WEBMAIL_ATTACHMENT_MAX_TOTAL=${e.webmail.attachmentMaxTotalBytes}`,`SMTP_WEBMAIL_ATTACHMENT_MAX_COUNT=${e.webmail.attachmentMaxCount}`,`SMTP_WEBMAIL_UNDO_SEND_SECONDS=${e.webmail.undoSendSeconds}`);if(e.tls.requireForAuth)t.push("SMTP_REQUIRE_TLS_FOR_AUTH=true");if(e.dkim.enabled&&e.domains.length>0){let[r,...n]=e.domains;if(t.push(`DKIM_DOMAIN=${r}`,`DKIM_SELECTOR=${e.dkim.selector}`,`DKIM_PRIVATE_KEY_PATH=${Y(e,r)}`),n.length>0){let o=n.map((s)=>`${s}:${e.dkim.selector}:${Y(e,s)}`);t.push(`DKIM_EXTRA_KEYS=${o.join(",")}`)}}return t.push(""),t.join(`
3
3
  `)}function Ee(e){let t=[e.ports.smtp,e.ports.submission,e.ports.submissions,e.ports.imap,e.ports.imaps].some((r)=>typeof r==="number"&&r<1024);return["[Unit]","Description=Mail server (SMTP/IMAP + webmail)","After=network-online.target","Wants=network-online.target","","[Service]","Type=simple",`User=${T}`,`Group=${T}`,`WorkingDirectory=${e.storagePath}`,`EnvironmentFile=${m}/mail.env`,`Environment="PATH=${F}:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"`,`ExecStart=${F}/mail serve --config ${m}/config.toml`,"Restart=always","RestartSec=5","LimitNOFILE=65536",...t?["AmbientCapabilities=CAP_NET_BIND_SERVICE","CapabilityBoundingSet=CAP_NET_BIND_SERVICE"]:[],"NoNewPrivileges=true","PrivateTmp=true","ProtectSystem=strict","ProtectHome=true","ProtectKernelTunables=true","ProtectKernelModules=true","ProtectControlGroups=true",`ReadWritePaths=${e.storagePath} ${m}`,"","[Install]","WantedBy=multi-user.target",""].join(`
4
- `)}function ye(e){if(!e.dkim.enabled||e.domains.length===0)return[];let t=[`mkdir -p ${m}/dkim`];for(let r of e.domains){let n=Y(e,r);t.push(`if [ ! -f ${h(n)} ]; then openssl genrsa -out ${h(n)} 2048; fi`,`chmod 0600 ${h(n)}`,`echo "DKIM ${e.dkim.selector}._domainkey.${r} IN TXT v=DKIM1; k=rsa; p=$(openssl rsa -in ${h(n)} -pubout -outform PEM 2>/dev/null | grep -v '^-----' | tr -d '\\n')"`)}return t.push(`chown -R ${T}:${T} ${m}/dkim`),t}function ve(e){if(e.accounts.length===0)return[];let t=(r)=>`runuser -u ${T} -- env SMTP_DB_PATH="$TS_CLOUD_MAIL_DB" ${F}/mail user:local ${r}`;return e.accounts.flatMap((r)=>[t(`create ${h(r.address)} ${h(r.password)} ${h(r.address)}`),...r.passwordPolicy==="managed"?[t(`change-password ${h(r.address)} ${h(r.password)}`)]:[]])}function ne(e){if(!e.enabled)return[];return[...nt(ge(e)),`id -u ${T} >/dev/null 2>&1 || useradd --system --no-create-home --shell /usr/sbin/nologin ${T}`,`mkdir -p ${e.storagePath} ${m}`,`chown -R ${T}:${T} ${e.storagePath}`,`TS_CLOUD_MAIL_DB="$(grep -sE '^SMTP_DB_PATH=' ${m}/mail.env | head -1 | cut -d= -f2- || true)"`,`[ -n "$TS_CLOUD_MAIL_DB" ] || TS_CLOUD_MAIL_DB=${h(re(e))}`,`cat > ${m}/config.toml <<'TS_CLOUD_MAIL_CONF_EOF'`,Te(e),"TS_CLOUD_MAIL_CONF_EOF",`cat > ${m}/mail.env <<'TS_CLOUD_MAIL_ENV_EOF'`,he(e),"TS_CLOUD_MAIL_ENV_EOF",`sed -i "s|^SMTP_DB_PATH=.*|SMTP_DB_PATH=$TS_CLOUD_MAIL_DB|" ${m}/mail.env`,`chmod 0640 ${m}/mail.env`,`chown root:${T} ${m}/mail.env`,...ye(e),`cat > /etc/systemd/system/${q}.service <<'TS_CLOUD_MAIL_UNIT_EOF'`,Ee(e),"TS_CLOUD_MAIL_UNIT_EOF","systemctl daemon-reload",`systemctl enable ${q}`,`systemctl restart ${q}`,...ve(e)]}var g=`${U}/pantry/.bin`,W=15306,K=15991,B=15999,se=16101,w=2379,E="/var/lib/vitess",X=100;function ki(e){return e===!0||typeof e==="object"&&e!==null}function Re(e){return typeof e==="object"&&e!==null?e:{}}function _(e){return`'${String(e).split("'").join("'\\''")}'`}function Ce(e){let r=[e.version?`vitess.io@${e.version}`:"vitess.io"];if(e.mode!=="combo"&&!e.etcdEndpoint)r.push("etcd.io");return r.push("mysql.com@8.0.43"),r}var S="vitess",Pe=`${g}:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin`,ce="/usr/local/lib/vitess",z=new Map;function j(e){return`${ce}/${e}.sh`}function b(e,t){return z.set(e,be(t)),`/bin/sh ${j(e)}`}function oe(){let e=[`mkdir -p ${ce}`];for(let[t,r]of z)e.push(`cat > ${j(t)} <<'TS_CLOUD_VITESS_LAUNCHER_EOF'`,r,"TS_CLOUD_VITESS_LAUNCHER_EOF",`chmod 0755 ${j(t)}`);return e}function be(e){return["#!/bin/sh","set -e",`cd ${U}`,`PANTRY_ENV="$(pantry env 2>/dev/null | grep -E '^(export [A-Za-z_]|[A-Za-z_][A-Za-z0-9_]*=)' || true)"`,'if [ -n "$PANTRY_ENV" ]; then eval "$PANTRY_ENV"; fi',`VT_MYSQL_ROOT="$(dirname "$(dirname "$(readlink -f ${g}/mysqld 2>/dev/null)")")"`,`VTROOT="$(dirname "$(dirname "$(readlink -f ${g}/mysqlctld 2>/dev/null)")")"`,"export VT_MYSQL_ROOT VTROOT",'LD_LIBRARY_PATH="$VT_MYSQL_ROOT/lib:$VTROOT/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"',"export LD_LIBRARY_PATH",`exec ${e.join(" ")}`].join(`
4
+ `)}function ye(e){if(!e.dkim.enabled||e.domains.length===0)return[];let t=[`mkdir -p ${m}/dkim`];for(let r of e.domains){let n=Y(e,r);t.push(`if [ ! -f ${h(n)} ]; then openssl genrsa -out ${h(n)} 2048; fi`,`chmod 0600 ${h(n)}`,`echo "DKIM ${e.dkim.selector}._domainkey.${r} IN TXT v=DKIM1; k=rsa; p=$(openssl rsa -in ${h(n)} -pubout -outform PEM 2>/dev/null | grep -v '^-----' | tr -d '\\n')"`)}return t.push(`chown -R ${T}:${T} ${m}/dkim`),t}function ve(e){if(e.accounts.length===0)return[];let t=(r)=>`runuser -u ${T} -- env SMTP_DB_PATH="$TS_CLOUD_MAIL_DB" ${F}/mail user:local ${r}`;return e.accounts.flatMap((r)=>[t(`create ${h(r.address)} ${h(r.password)} ${h(r.address)}`),...r.passwordPolicy==="managed"?[t(`change-password ${h(r.address)} ${h(r.password)}`)]:[]])}function ne(e){if(!e.enabled)return[];return[...nt(ge(e)),`id -u ${T} >/dev/null 2>&1 || useradd --system --no-create-home --shell /usr/sbin/nologin ${T}`,`mkdir -p ${e.storagePath} ${m}`,`chown -R ${T}:${T} ${e.storagePath}`,`TS_CLOUD_MAIL_DB="$(grep -sE '^SMTP_DB_PATH=' ${m}/mail.env | head -1 | cut -d= -f2- || true)"`,`[ -n "$TS_CLOUD_MAIL_DB" ] || TS_CLOUD_MAIL_DB=${h(re(e))}`,`cat > ${m}/config.toml <<'TS_CLOUD_MAIL_CONF_EOF'`,Te(e),"TS_CLOUD_MAIL_CONF_EOF",`cat > ${m}/mail.env <<'TS_CLOUD_MAIL_ENV_EOF'`,he(e),"TS_CLOUD_MAIL_ENV_EOF",`sed -i "s|^SMTP_DB_PATH=.*|SMTP_DB_PATH=$TS_CLOUD_MAIL_DB|" ${m}/mail.env`,`chmod 0640 ${m}/mail.env`,`chown root:${T} ${m}/mail.env`,...ye(e),`cat > /etc/systemd/system/${q}.service <<'TS_CLOUD_MAIL_UNIT_EOF'`,Ee(e),"TS_CLOUD_MAIL_UNIT_EOF","systemctl daemon-reload",`systemctl enable ${q}`,`systemctl restart ${q}`,...ve(e)]}var g=`${U}/pantry/.bin`,W=15306,K=15991,N=15999,se=16101,B=2379,E="/var/lib/vitess",X=100;function ki(e){return e===!0||typeof e==="object"&&e!==null}function Re(e){return typeof e==="object"&&e!==null?e:{}}function _(e){return`'${String(e).split("'").join("'\\''")}'`}function Ce(e){let r=[e.version?`vitess.io@${e.version}`:"vitess.io"];if(e.mode!=="combo"&&!e.etcdEndpoint)r.push("etcd.io");return r.push("mysql.com@8.0.43"),r}var S="vitess",Pe=`${g}:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin`,ce="/usr/local/lib/vitess",z=new Map;function j(e){return`${ce}/${e}.sh`}function b(e,t){return z.set(e,be(t)),`/bin/sh ${j(e)}`}function oe(){let e=[`mkdir -p ${ce}`];for(let[t,r]of z)e.push(`cat > ${j(t)} <<'TS_CLOUD_VITESS_LAUNCHER_EOF'`,r,"TS_CLOUD_VITESS_LAUNCHER_EOF",`chmod 0755 ${j(t)}`);return e}function be(e){return["#!/bin/sh","set -e",`cd ${U}`,`PANTRY_ENV="$(pantry env 2>/dev/null | grep -E '^(export [A-Za-z_]|[A-Za-z_][A-Za-z0-9_]*=)' || true)"`,'if [ -n "$PANTRY_ENV" ]; then eval "$PANTRY_ENV"; fi',`VT_MYSQL_ROOT="$(dirname "$(dirname "$(readlink -f ${g}/mysqld 2>/dev/null)")")"`,`VTROOT="$(dirname "$(dirname "$(readlink -f ${g}/mysqlctld 2>/dev/null)")")"`,"export VT_MYSQL_ROOT VTROOT",'LD_LIBRARY_PATH="$VT_MYSQL_ROOT/lib:$VTROOT/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"',"export LD_LIBRARY_PATH",`exec ${e.join(" ")}`].join(`
5
5
  `)}function D(e){let t=["[Unit]",`Description=${e.description}`,`After=network.target${e.after?.length?` ${e.after.join(" ")}`:""}`];if(e.requires?.length)t.push(`Requires=${e.requires.join(" ")}`);return t.push("","[Service]","Type=simple",`User=${S}`,`Group=${S}`,`Environment="PATH=${Pe}"`,`Environment="VTDATAROOT=${E}"`,...Object.entries(e.environment??{}).map(([r,n])=>`Environment="${r}=${n}"`),...(e.execStartPre??[]).map((r)=>`ExecStartPre=${r}`),`ExecStart=${e.execStart}`,"Restart=always","RestartSec=5","LimitNOFILE=65535","","[Install]","WantedBy=multi-user.target"),t.join(`
6
- `)}function ie(e,t){return[`cat > /etc/systemd/system/${e}.service <<'TS_CLOUD_VITESS_UNIT_EOF'`,t,"TS_CLOUD_VITESS_UNIT_EOF"]}function De(e){let t=e.cell??"zone1",r=e.vtgatePort??W,o=`${((e.keyspaces?.length)?e.keyspaces:[{name:"app"}]).map((s)=>{let c=(s.sharded?["-80","80-"]:["0"]).map((p)=>`shards:{name:"${p}"}`).join(" ");return`keyspaces:{name:"${s.name}" ${c}}`}).join(" ")} cells:"${t}"`;return D({description:"Vitess (vtcombo, single-process development stack)",execStart:b("vtcombo",[`${g}/vtcombo`,`--cell ${t}`,`--proto-topo ${_(o)}`,`--mysql-server-port ${r}`,"--mysql-server-bind-address 127.0.0.1","--mysql-auth-server-impl none","--start-mysql",`--port ${K}`,`--grpc-port ${B}`])})}function Ae(){return D({description:"etcd (Vitess topology store)",execStart:b("etcd",[`${g}/etcd`,`--data-dir ${E}/etcd`,`--listen-client-urls http://127.0.0.1:${w}`,`--advertise-client-urls http://127.0.0.1:${w}`]),execStartPre:[`+/bin/mkdir -p ${E}/etcd`,`+/bin/chown ${S}:${S} ${E}/etcd`]})}function Q(e){return["--topo-implementation etcd2",`--topo-global-server-address ${e.etcdEndpoint??`http://127.0.0.1:${w}`}`,"--topo-global-root /vitess/global"]}function Le(e){let t=!e.etcdEndpoint;return D({description:"Vitess vtctld (control plane)",after:t?["vitess-etcd.service"]:[],requires:t?["vitess-etcd.service"]:[],execStart:b("vtctld",[`${g}/vtctld`,...Q(e),`--cell ${e.cell??"zone1"}`,"--service-map grpc-vtctl,grpc-vtctld",`--grpc-port ${B}`,`--port ${B+1}`])})}function Oe(e,t,r){let n=e.cell??"zone1";return D({description:`Vitess vttablet (${t}/${r})`,after:["vitess-vtctld.service","vitess-mysqlctld.service"],requires:["vitess-mysqlctld.service"],execStart:b("vttablet",[`${g}/vttablet`,...Q(e),`--tablet-path ${n}-${String(X).padStart(10,"0")}`,`--init-keyspace ${t}`,`--init-shard ${r}`,"--init-tablet-type replica",`--service-map ${_("grpc-queryservice,grpc-tabletmanager,grpc-updatestream")}`,`--port ${se}`,`--grpc-port ${se+1}`,`--db-port ${e.mysqlPort??3306}`,`--mycnf-mysql-port ${e.mysqlPort??3306}`])})}function Ue(e){return D({description:"Vitess mysqlctld (managed mysqld)",execStart:b("mysqlctld",[`${g}/mysqlctld`,`--tablet-uid ${X}`,`--mysql-port ${e.mysqlPort??3306}`,'--init-db-sql-file "$VTROOT/config/init_db.sql"',"--wait-time 2m"]),execStartPre:[`+/bin/mkdir -p ${E}`,`+/bin/chown ${S}:${S} ${E}`]})}var le="/etc/vitess/auth.json",O="/var/lib/vitess/vtgate-auth.sha256";function xe(e){let t=e.username??"vitess",r=e.password??"";return["mkdir -p /etc/vitess",'VTESS_AUTH_TMP="$(mktemp)"',`cat > "$VTESS_AUTH_TMP" <<'TS_CLOUD_VITESS_AUTH_EOF'`,JSON.stringify({[t]:[{Password:r,UserData:t}]}),"TS_CLOUD_VITESS_AUTH_EOF",`VTESS_VTGATE_AUTH_SHA="$(sha256sum "$VTESS_AUTH_TMP" | awk '{print $1}')"`,"VTESS_VTGATE_AUTH_CHANGED=1",`if [ -f ${O} ] && [ "$(cat ${O})" = "$VTESS_VTGATE_AUTH_SHA" ]; then VTESS_VTGATE_AUTH_CHANGED=0; fi`,`install -o ${S} -g ${S} -m 0600 "$VTESS_AUTH_TMP" ${le}`,'rm -f "$VTESS_AUTH_TMP"']}function Ie(e){let t=e.cell??"zone1";return D({description:"Vitess vtgate (query router)",after:["vitess-vtctld.service"],execStart:b("vtgate",[`${g}/vtgate`,...Q(e),`--cell ${t}`,`--cells-to-watch ${t}`,"--tablet-types-to-wait PRIMARY,REPLICA",`--service-map ${_("grpc-vtgateservice")}`,`--mysql-server-port ${e.vtgatePort??W}`,`--mysql-server-bind-address ${e.bindAddress??"127.0.0.1"}`,"--mysql-auth-server-impl static",`--mysql-auth-server-static-file ${le}`,`--port ${K}`,`--grpc-port ${K+1}`])})}function ke(e){let t=e.cell??"zone1",r=e.etcdEndpoint??`http://127.0.0.1:${w}`,n=`${g}/vtctldclient --server 127.0.0.1:${B}`,o=[`for i in $(seq 1 30); do ${n} GetCellInfoNames >/dev/null 2>&1 && break; sleep 2; done`,`if ! ${n} GetCellInfoNames 2>/dev/null | grep -qx ${_(t)}; then`,` ${n} AddCellInfo --root ${_(`/vitess/${t}`)} --server-address ${_(r)} ${_(t)}`,"fi"];for(let s of e.keyspaces??[]){let c=s.sharded?" --sharded":"";o.push(`if ! ${n} GetKeyspace ${_(s.name)} >/dev/null 2>&1; then`,` ${n} CreateKeyspace${c} ${_(s.name)}`,"fi");let p=`${t}-${String(X).padStart(10,"0")}`;for(let l of s.sharded?["-80","80-"]:["0"]){let i=`${s.name}/${l}`;o.push("for i in $(seq 1 90); do",` if ${n} GetShard ${_(i)} 2>/dev/null | grep -q '"is_primary_serving": *true'; then break; fi`,` ${n} PlannedReparentShard ${_(i)} --new-primary ${_(p)} >/dev/null 2>&1 && break`,` ${n} InitShardPrimary --force ${_(i)} ${_(p)} >/dev/null 2>&1 && break`," sleep 2","done",`if ! ${n} GetShard ${_(i)} 2>/dev/null | grep -q '"is_primary_serving": *true'; then`,` echo "no primary could be elected for ${i}" >&2; exit 1`,"fi")}o.push(`${n} RebuildKeyspaceGraph ${_(s.name)} >/dev/null`)}return o}function ae(e){let t=e.vtgatePort??W;return["for i in $(seq 1 60); do",` if (cd ${U} && eval "$(pantry env 2>/dev/null)"; MYSQL_PWD=${_(e.password??"")} ${g}/mysql -h 127.0.0.1 -P ${t} -u ${_(e.username??"vitess")} --connect-timeout=2 -e 'SHOW KEYSPACES') >/dev/null 2>&1; then`,` echo "vtgate is serving on ${t}"; exit 0`," fi"," sleep 2","done",`echo "vtgate did not become ready on port ${t}" >&2`,"exit 1"]}function Mo(e){if(!ki(e))return[];let t=Re(e),r=t.mode==="combo";z.clear();let n=['if [ "$(uname -m)" != "x86_64" ]; then',' echo "vitess: Vitess publishes only x86_64 release tarballs; this box is $(uname -m). Drop managedServices.vitess or use an x86_64 host." >&2'," exit 1","fi",...nt(Ce(t)),`VT_MYSQL_LIB="$(dirname "$(dirname "$(readlink -f ${g}/mysqld)")")/lib"`,'if [ -d "$VT_MYSQL_LIB" ]; then',` printf '%s\\n' "$VT_MYSQL_LIB" > /etc/ld.so.conf.d/vitess-mysql.conf`," ldconfig","else",' echo "mysqld library directory not found under $VT_MYSQL_LIB" >&2; exit 1',"fi",`id -u ${S} >/dev/null 2>&1 || useradd --system --home-dir ${E} --shell /usr/sbin/nologin ${S}`,`mkdir -p ${E}`,`chown -R ${S}:${S} ${E}`];if(r)return n.push(...ie("vitess-vtcombo",De(t)),...oe(),"systemctl daemon-reload","systemctl enable --now vitess-vtcombo.service",...ae(t)),n;n.push(...xe(t));let o=[];if(!t.etcdEndpoint)o.push(["vitess-etcd",Ae()]);o.push(["vitess-vtctld",Le(t)],["vitess-mysqlctld",Ue(t)],["vitess-vtgate",Ie(t)]);for(let s of t.keyspaces??[])for(let c of s.sharded?["-80","80-"]:["0"])o.push([`vitess-vttablet-${s.name}-${c.replace(/-/g,"x")}`,Oe(t,s.name,c)]);for(let[s,c]of o)n.push(...ie(s,c));n.push(...oe()),n.push("systemctl daemon-reload");for(let[s]of o)n.push(`systemctl enable --now ${s}.service`);return n.push(`if [ "$VTESS_VTGATE_AUTH_CHANGED" = 1 ]; then systemctl restart vitess-vtgate.service; printf '%s\\n' "$VTESS_VTGATE_AUTH_SHA" > ${O}; chown ${S}:${S} ${O}; chmod 0600 ${O}; fi`,...ke(t),...ae(t)),n}var Me=new Set(["singlestore","vitess"]);function Ni(e){if(e?.engine&&Me.has(e.engine))return!1;return!e?.host||e.host==="127.0.0.1"||e.host==="localhost"}function Nr(e,t="psql"){let r=e?.port??5432;if(Ni(e))return`${t} -p ${r} -U postgres`;let n=e?.username||"postgres";return`${e?.password?`PGPASSWORD='${e.password.replace(/'/g,"'\\''")}' `:""}${t} -h ${e.host} -p ${r} -U ${n} -w`}function y(e){return e===!0||typeof e==="object"&&e!=null}function Ne(e){let t=[],r=[];if(y(e.mysql))t.push(typeof e.mysql==="object"&&e.mysql.version?`mysql.com@${e.mysql.version}`:"mysql.com@8.0.43"),r.push("mysql");else if(y(e.mariadb))t.push(L.mariadb),r.push("mariadb");if(y(e.postgres))t.push("postgresql.org"),r.push("postgres");if(y(e.redis))t.push("redis.io"),r.push("redis");if(y(e.memcached))t.push("memcached.org"),r.push("memcached");if(y(e.meilisearch))t.push("meilisearch.com"),r.push("meilisearch");return{packages:t,services:r}}function Uo(e={},t={}){let r=Ne(e),n=Mo(e.vitess),o=t.mail?ne(t.mail):[];if(r.packages.length===0)return[...n,...o];return[...nt(r.packages),...Lo(r.services),...n,...o]}function Tt(e,t={}){if(!e?.name)return[];if(!Ni(e))return[];let r=e.name,n=e.username||r,o=e.password||"",s=y(t.postgres)||e.engine==="postgres",c=y(t.mariadb)||e.engine==="mariadb",p=y(t.mysql)||e.engine==="mysql";if(s&&!p&&!c){let a=(d)=>`"${d.replace(/"/g,'""')}"`,P=(d)=>`'${d.replace(/'/g,"''")}'`,A=(d,M)=>["DO $$ BEGIN",` IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = ${P(d)}) THEN`,` CREATE ROLE ${a(d)} LOGIN PASSWORD ${P(M)};`," ELSE",` ALTER ROLE ${a(d)} LOGIN PASSWORD ${P(M)};`," END IF;","END $$;"],x=(d)=>{let M=d.databases&&d.databases.length>0?d.databases:[r],V=[];for(let G of M)if(d.access==="readonly")V.push(`GRANT CONNECT ON DATABASE ${a(G)} TO ${a(d.username)};`,`\\connect ${a(G)}`,`GRANT USAGE ON SCHEMA public TO ${a(d.username)};`,`GRANT SELECT ON ALL TABLES IN SCHEMA public TO ${a(d.username)};`,`ALTER DEFAULT PRIVILEGES FOR ROLE ${a(n)} IN SCHEMA public GRANT SELECT ON TABLES TO ${a(d.username)};`,"\\connect postgres");else V.push(`GRANT ALL PRIVILEGES ON DATABASE ${a(G)} TO ${a(d.username)};`);return V},k=e.users||[],Se=e.port??5432;return[Ct(),`for i in $(seq 1 30); do pg_isready -p ${Se} -q && break; sleep 2; done`,`${Nr(e)} <<'TS_CLOUD_PG_EOF'`,...A(n,o),`SELECT 'CREATE DATABASE ${a(r)} OWNER ${a(n)}' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = ${P(r)})\\gexec`,...k.flatMap((d)=>[...A(d.username,d.password),...x(d)]),"TS_CLOUD_PG_EOF",...Be(e)]}let l=c?"/var/lib/pantry/mariadb/mariadbd.sock":"/var/lib/pantry/mysql/mysqld.sock",i=(a)=>a.replace(/`/g,"``"),f=(a)=>a.replace(/\\/g,"\\\\").replace(/'/g,"\\'"),R=(a)=>{let P=a.databases&&a.databases.length>0?a.databases:[r],A=a.access==="readonly"?"SELECT":"ALL PRIVILEGES",x=[`CREATE USER IF NOT EXISTS '${f(a.username)}'@'%' IDENTIFIED BY '${f(a.password)}';`,`CREATE USER IF NOT EXISTS '${f(a.username)}'@'localhost' IDENTIFIED BY '${f(a.password)}';`,`ALTER USER '${f(a.username)}'@'%' IDENTIFIED BY '${f(a.password)}';`,`ALTER USER '${f(a.username)}'@'localhost' IDENTIFIED BY '${f(a.password)}';`];for(let k of P)x.push(`GRANT ${A} ON \`${i(k)}\`.* TO '${f(a.username)}'@'%';`,`GRANT ${A} ON \`${i(k)}\`.* TO '${f(a.username)}'@'localhost';`);return x},u=e.users||[];return[Ct(),`for i in $(seq 1 30); do mysqladmin --socket=${l} -u root ping 2>/dev/null | grep -q alive && break; sleep 2; done`,`mysql --socket=${l} -u root <<'TS_CLOUD_SQL_EOF'`,`CREATE DATABASE IF NOT EXISTS \`${i(r)}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;`,...R({username:n,password:o}),...u.flatMap(R),"FLUSH PRIVILEGES;","TS_CLOUD_SQL_EOF"]}function Be(e){return[`${Nr(e)} -tA <<'TS_CLOUD_PG_CAP_EOF' || true`,"\\set QUIET on","SELECT CASE WHEN used::float / NULLIF(cap, 0) >= 0.8"," THEN '[ts-cloud] postgres is at ' || used || '/' || cap || ' connections on this server.'"," || ' Raise max_connections (ALTER SYSTEM SET max_connections = ...; then restart) or'"," || ' set idle_session_timeout so abandoned pools are reclaimed.'"," ELSE NULL END","FROM (SELECT (SELECT count(*) FROM pg_stat_activity) AS used,"," (SELECT setting::int FROM pg_settings WHERE name = 'max_connections') AS cap) c","WHERE CASE WHEN used::float / NULLIF(cap, 0) >= 0.8 THEN true ELSE false END;","SELECT '[ts-cloud] ' || coalesce(datname, '(background)') || ': ' || count(*) || ' connection(s), oldest idle ' ||"," coalesce(round(extract(epoch from max(now() - state_change)) / 60)::text || 'm', 'n/a')","FROM pg_stat_activity","WHERE (SELECT count(*)::float / NULLIF((SELECT setting::int FROM pg_settings WHERE name = 'max_connections'), 0) FROM pg_stat_activity) >= 0.8","GROUP BY datname ORDER BY count(*) DESC;","TS_CLOUD_PG_CAP_EOF"]}function Gc(e){if(!e?.name)return{};let t=e.engine==="singlestore",r=e.engine==="vitess",n=e.engine==="postgres"?"pgsql":t?"singlestore":r?"vitess":"mysql",o=e.port??(e.engine==="postgres"?5432:r?15306:3306),s={DB_CONNECTION:n,DB_HOST:e.host||"127.0.0.1",DB_PORT:String(o),DB_DATABASE:e.name};if(e.username)s.DB_USERNAME=e.username;if(e.password)s.DB_PASSWORD=e.password;if((t||r)&&e.ssl!==!1)s.DB_SSL="true";return s}var Z="/var/backups/ts-cloud",we="/etc/ts-cloud/backups.config.ts",pe="/etc/cron.d/ts-cloud-backups",fn="/usr/local/bin/ts-cloud-backup.sh";function Ve(e){if(!e.name)return null;let t=e.host||"127.0.0.1",r=e.engine==="postgres",n=r?"postgresql":"mysql",o=e.port??(r?5432:3306),s=(c)=>c.replace(/\\/g,"\\\\").replace(/'/g,"\\'");return[" {",` type: '${n}',`,` name: '${s(e.name)}',`," connection: {",` hostname: '${s(t)}',`,` port: ${o},`,` database: '${s(e.name)}',`,` username: '${s(e.username||e.name)}',`,` password: '${s(e.password||"")}',`," ssl: false,"," },"," includeSchema: true,"," includeData: true,"," },"].join(`
6
+ `)}function ie(e,t){return[`cat > /etc/systemd/system/${e}.service <<'TS_CLOUD_VITESS_UNIT_EOF'`,t,"TS_CLOUD_VITESS_UNIT_EOF"]}function De(e){let t=e.cell??"zone1",r=e.vtgatePort??W,o=`${((e.keyspaces?.length)?e.keyspaces:[{name:"app"}]).map((s)=>{let c=(s.sharded?["-80","80-"]:["0"]).map((p)=>`shards:{name:"${p}"}`).join(" ");return`keyspaces:{name:"${s.name}" ${c}}`}).join(" ")} cells:"${t}"`;return D({description:"Vitess (vtcombo, single-process development stack)",execStart:b("vtcombo",[`${g}/vtcombo`,`--cell ${t}`,`--proto-topo ${_(o)}`,`--mysql-server-port ${r}`,"--mysql-server-bind-address 127.0.0.1","--mysql-auth-server-impl none","--start-mysql",`--port ${K}`,`--grpc-port ${N}`])})}function Ae(){return D({description:"etcd (Vitess topology store)",execStart:b("etcd",[`${g}/etcd`,`--data-dir ${E}/etcd`,`--listen-client-urls http://127.0.0.1:${B}`,`--advertise-client-urls http://127.0.0.1:${B}`]),execStartPre:[`+/bin/mkdir -p ${E}/etcd`,`+/bin/chown ${S}:${S} ${E}/etcd`]})}function Q(e){return["--topo-implementation etcd2",`--topo-global-server-address ${e.etcdEndpoint??`http://127.0.0.1:${B}`}`,"--topo-global-root /vitess/global"]}function Le(e){let t=!e.etcdEndpoint;return D({description:"Vitess vtctld (control plane)",after:t?["vitess-etcd.service"]:[],requires:t?["vitess-etcd.service"]:[],execStart:b("vtctld",[`${g}/vtctld`,...Q(e),`--cell ${e.cell??"zone1"}`,"--service-map grpc-vtctl,grpc-vtctld",`--grpc-port ${N}`,`--port ${N+1}`])})}function Oe(e,t,r){let n=e.cell??"zone1";return D({description:`Vitess vttablet (${t}/${r})`,after:["vitess-vtctld.service","vitess-mysqlctld.service"],requires:["vitess-mysqlctld.service"],execStart:b("vttablet",[`${g}/vttablet`,...Q(e),`--tablet-path ${n}-${String(X).padStart(10,"0")}`,`--init-keyspace ${t}`,`--init-shard ${r}`,"--init-tablet-type replica",`--service-map ${_("grpc-queryservice,grpc-tabletmanager,grpc-updatestream")}`,`--port ${se}`,`--grpc-port ${se+1}`,`--db-port ${e.mysqlPort??3306}`,`--mycnf-mysql-port ${e.mysqlPort??3306}`])})}function Ue(e){return D({description:"Vitess mysqlctld (managed mysqld)",execStart:b("mysqlctld",[`${g}/mysqlctld`,`--tablet-uid ${X}`,`--mysql-port ${e.mysqlPort??3306}`,'--init-db-sql-file "$VTROOT/config/init_db.sql"',"--wait-time 2m"]),execStartPre:[`+/bin/mkdir -p ${E}`,`+/bin/chown ${S}:${S} ${E}`]})}var le="/etc/vitess/auth.json",O="/var/lib/vitess/vtgate-auth.sha256";function xe(e){let t=e.username??"vitess",r=e.password??"";return["mkdir -p /etc/vitess",'VTESS_AUTH_TMP="$(mktemp)"',`cat > "$VTESS_AUTH_TMP" <<'TS_CLOUD_VITESS_AUTH_EOF'`,JSON.stringify({[t]:[{Password:r,UserData:t}]}),"TS_CLOUD_VITESS_AUTH_EOF",`VTESS_VTGATE_AUTH_SHA="$(sha256sum "$VTESS_AUTH_TMP" | awk '{print $1}')"`,"VTESS_VTGATE_AUTH_CHANGED=1",`if [ -f ${O} ] && [ "$(cat ${O})" = "$VTESS_VTGATE_AUTH_SHA" ]; then VTESS_VTGATE_AUTH_CHANGED=0; fi`,`install -o ${S} -g ${S} -m 0600 "$VTESS_AUTH_TMP" ${le}`,'rm -f "$VTESS_AUTH_TMP"']}function Ie(e){let t=e.cell??"zone1";return D({description:"Vitess vtgate (query router)",after:["vitess-vtctld.service"],execStart:b("vtgate",[`${g}/vtgate`,...Q(e),`--cell ${t}`,`--cells-to-watch ${t}`,"--tablet-types-to-wait PRIMARY,REPLICA",`--service-map ${_("grpc-vtgateservice")}`,`--mysql-server-port ${e.vtgatePort??W}`,`--mysql-server-bind-address ${e.bindAddress??"127.0.0.1"}`,"--mysql-auth-server-impl static",`--mysql-auth-server-static-file ${le}`,`--port ${K}`,`--grpc-port ${K+1}`])})}function ke(e){let t=e.cell??"zone1",r=e.etcdEndpoint??`http://127.0.0.1:${B}`,n=`${g}/vtctldclient --server 127.0.0.1:${N}`,o=[`for i in $(seq 1 30); do ${n} GetCellInfoNames >/dev/null 2>&1 && break; sleep 2; done`,`if ! ${n} GetCellInfoNames 2>/dev/null | grep -qx ${_(t)}; then`,` ${n} AddCellInfo --root ${_(`/vitess/${t}`)} --server-address ${_(r)} ${_(t)}`,"fi"];for(let s of e.keyspaces??[]){let c=s.sharded?" --sharded":"";o.push(`if ! ${n} GetKeyspace ${_(s.name)} >/dev/null 2>&1; then`,` ${n} CreateKeyspace${c} ${_(s.name)}`,"fi");let p=`${t}-${String(X).padStart(10,"0")}`;for(let l of s.sharded?["-80","80-"]:["0"]){let i=`${s.name}/${l}`;o.push("for i in $(seq 1 90); do",` if ${n} GetShard ${_(i)} 2>/dev/null | grep -q '"is_primary_serving": *true'; then break; fi`,` ${n} PlannedReparentShard ${_(i)} --new-primary ${_(p)} >/dev/null 2>&1 && break`,` ${n} InitShardPrimary --force ${_(i)} ${_(p)} >/dev/null 2>&1 && break`," sleep 2","done",`if ! ${n} GetShard ${_(i)} 2>/dev/null | grep -q '"is_primary_serving": *true'; then`,` echo "no primary could be elected for ${i}" >&2; exit 1`,"fi")}o.push(`${n} RebuildKeyspaceGraph ${_(s.name)} >/dev/null`)}return o}function ae(e){let t=e.vtgatePort??W;return["for i in $(seq 1 60); do",` if (cd ${U} && eval "$(pantry env 2>/dev/null)"; MYSQL_PWD=${_(e.password??"")} ${g}/mysql -h 127.0.0.1 -P ${t} -u ${_(e.username??"vitess")} --connect-timeout=2 -e 'SHOW KEYSPACES') >/dev/null 2>&1; then`,` echo "vtgate is serving on ${t}"; exit 0`," fi"," sleep 2","done",`echo "vtgate did not become ready on port ${t}" >&2`,"exit 1"]}function Mo(e){if(!ki(e))return[];let t=Re(e),r=t.mode==="combo";z.clear();let n=['if [ "$(uname -m)" != "x86_64" ]; then',' echo "vitess: Vitess publishes only x86_64 release tarballs; this box is $(uname -m). Drop managedServices.vitess or use an x86_64 host." >&2'," exit 1","fi",...nt(Ce(t)),`VT_MYSQL_LIB="$(dirname "$(dirname "$(readlink -f ${g}/mysqld)")")/lib"`,'if [ -d "$VT_MYSQL_LIB" ]; then',` printf '%s\\n' "$VT_MYSQL_LIB" > /etc/ld.so.conf.d/vitess-mysql.conf`," ldconfig","else",' echo "mysqld library directory not found under $VT_MYSQL_LIB" >&2; exit 1',"fi",`id -u ${S} >/dev/null 2>&1 || useradd --system --home-dir ${E} --shell /usr/sbin/nologin ${S}`,`mkdir -p ${E}`,`chown -R ${S}:${S} ${E}`];if(r)return n.push(...ie("vitess-vtcombo",De(t)),...oe(),"systemctl daemon-reload","systemctl enable --now vitess-vtcombo.service",...ae(t)),n;n.push(...xe(t));let o=[];if(!t.etcdEndpoint)o.push(["vitess-etcd",Ae()]);o.push(["vitess-vtctld",Le(t)],["vitess-mysqlctld",Ue(t)],["vitess-vtgate",Ie(t)]);for(let s of t.keyspaces??[])for(let c of s.sharded?["-80","80-"]:["0"])o.push([`vitess-vttablet-${s.name}-${c.replace(/-/g,"x")}`,Oe(t,s.name,c)]);for(let[s,c]of o)n.push(...ie(s,c));n.push(...oe()),n.push("systemctl daemon-reload");for(let[s]of o)n.push(`systemctl enable --now ${s}.service`);return n.push(`if [ "$VTESS_VTGATE_AUTH_CHANGED" = 1 ]; then systemctl restart vitess-vtgate.service; printf '%s\\n' "$VTESS_VTGATE_AUTH_SHA" > ${O}; chown ${S}:${S} ${O}; chmod 0600 ${O}; fi`,...ke(t),...ae(t)),n}var Me=new Set(["singlestore","vitess"]);function Ni(e){if(e?.engine&&Me.has(e.engine))return!1;return!e?.host||e.host==="127.0.0.1"||e.host==="localhost"}function Nr(e,t="psql"){let r=e?.port??5432;if(Ni(e))return`${t} -p ${r} -U postgres`;let n=e?.username||"postgres";return`${e?.password?`PGPASSWORD='${e.password.replace(/'/g,"'\\''")}' `:""}${t} -h ${e.host} -p ${r} -U ${n} -w`}function y(e){return e===!0||typeof e==="object"&&e!=null}function Ne(e){let t=[],r=[];if(y(e.mysql))t.push(typeof e.mysql==="object"&&e.mysql.version?`mysql.com@${e.mysql.version}`:"mysql.com@8.0.43"),r.push("mysql");else if(y(e.mariadb))t.push(L.mariadb),r.push("mariadb");if(y(e.postgres))t.push("postgresql.org"),r.push("postgres");if(y(e.redis))t.push("redis.io"),r.push("redis");if(y(e.memcached))t.push("memcached.org"),r.push("memcached");if(y(e.meilisearch))t.push("meilisearch.com"),r.push("meilisearch");return{packages:t,services:r}}function Uo(e={},t={}){let r=Ne(e),n=Mo(e.vitess),o=t.mail?ne(t.mail):[];if(r.packages.length===0)return[...n,...o];return[...nt(r.packages),...Lo(r.services),...n,...o]}function Tt(e,t={}){if(!e?.name)return[];if(!Ni(e))return[];let r=e.name,n=e.username||r,o=e.password||"",s=y(t.postgres)||e.engine==="postgres",c=y(t.mariadb)||e.engine==="mariadb",p=y(t.mysql)||e.engine==="mysql";if(s&&!p&&!c){let a=(d)=>`"${d.replace(/"/g,'""')}"`,P=(d)=>`'${d.replace(/'/g,"''")}'`,A=(d,k)=>["DO $$ BEGIN",` IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = ${P(d)}) THEN`,` CREATE ROLE ${a(d)} LOGIN PASSWORD ${P(k)};`," ELSE",` ALTER ROLE ${a(d)} LOGIN PASSWORD ${P(k)};`," END IF;","END $$;"],x=(d)=>{let k=d.databases&&d.databases.length>0?d.databases:[r],V=[];for(let G of k)if(d.access==="readonly")V.push(`GRANT CONNECT ON DATABASE ${a(G)} TO ${a(d.username)};`,`\\connect ${a(G)}`,`GRANT USAGE ON SCHEMA public TO ${a(d.username)};`,`GRANT SELECT ON ALL TABLES IN SCHEMA public TO ${a(d.username)};`,`ALTER DEFAULT PRIVILEGES FOR ROLE ${a(n)} IN SCHEMA public GRANT SELECT ON TABLES TO ${a(d.username)};`,"\\connect postgres");else V.push(`GRANT ALL PRIVILEGES ON DATABASE ${a(G)} TO ${a(d.username)};`);return V},I=e.users||[],Se=e.port??5432;return[Ct(),`for i in $(seq 1 30); do pg_isready -p ${Se} -q && break; sleep 2; done`,`${Nr(e)} <<'TS_CLOUD_PG_EOF'`,...A(n,o),`SELECT 'CREATE DATABASE ${a(r)} OWNER ${a(n)}' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = ${P(r)})\\gexec`,...I.flatMap((d)=>[...A(d.username,d.password),...x(d)]),"TS_CLOUD_PG_EOF",...Be(e)]}let l=c?"/var/lib/pantry/mariadb/mariadbd.sock":"/var/lib/pantry/mysql/mysqld.sock",i=(a)=>a.replace(/`/g,"``"),f=(a)=>a.replace(/\\/g,"\\\\").replace(/'/g,"\\'"),R=(a)=>{let P=a.databases&&a.databases.length>0?a.databases:[r],A=a.access==="readonly"?"SELECT":"ALL PRIVILEGES",x=[`CREATE USER IF NOT EXISTS '${f(a.username)}'@'%' IDENTIFIED BY '${f(a.password)}';`,`CREATE USER IF NOT EXISTS '${f(a.username)}'@'localhost' IDENTIFIED BY '${f(a.password)}';`,`ALTER USER '${f(a.username)}'@'%' IDENTIFIED BY '${f(a.password)}';`,`ALTER USER '${f(a.username)}'@'localhost' IDENTIFIED BY '${f(a.password)}';`];for(let I of P)x.push(`GRANT ${A} ON \`${i(I)}\`.* TO '${f(a.username)}'@'%';`,`GRANT ${A} ON \`${i(I)}\`.* TO '${f(a.username)}'@'localhost';`);return x},u=e.users||[];return[Ct(),`for i in $(seq 1 30); do mysqladmin --socket=${l} -u root ping 2>/dev/null | grep -q alive && break; sleep 2; done`,`mysql --socket=${l} -u root <<'TS_CLOUD_SQL_EOF'`,`CREATE DATABASE IF NOT EXISTS \`${i(r)}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;`,...R({username:n,password:o}),...u.flatMap(R),"FLUSH PRIVILEGES;","TS_CLOUD_SQL_EOF"]}function Be(e){return[`${Nr(e)} -tA <<'TS_CLOUD_PG_CAP_EOF' || true`,"\\set QUIET on","SELECT CASE WHEN used::float / NULLIF(cap, 0) >= 0.8"," THEN '[ts-cloud] postgres is at ' || used || '/' || cap || ' connections on this server.'"," || ' Raise max_connections (ALTER SYSTEM SET max_connections = ...; then restart) or'"," || ' set idle_session_timeout so abandoned pools are reclaimed.'"," ELSE NULL END","FROM (SELECT (SELECT count(*) FROM pg_stat_activity) AS used,"," (SELECT setting::int FROM pg_settings WHERE name = 'max_connections') AS cap) c","WHERE CASE WHEN used::float / NULLIF(cap, 0) >= 0.8 THEN true ELSE false END;","SELECT '[ts-cloud] ' || coalesce(datname, '(background)') || ': ' || count(*) || ' connection(s), oldest idle ' ||"," coalesce(round(extract(epoch from max(now() - state_change)) / 60)::text || 'm', 'n/a')","FROM pg_stat_activity","WHERE (SELECT count(*)::float / NULLIF((SELECT setting::int FROM pg_settings WHERE name = 'max_connections'), 0) FROM pg_stat_activity) >= 0.8","GROUP BY datname ORDER BY count(*) DESC;","TS_CLOUD_PG_CAP_EOF"]}function Gc(e){if(!e?.name)return{};let t=e.engine==="singlestore",r=e.engine==="vitess",n=e.engine==="postgres"?"pgsql":t?"singlestore":r?"vitess":"mysql",o=e.port??(e.engine==="postgres"?5432:r?15306:3306),s={DB_CONNECTION:n,DB_HOST:e.host||"127.0.0.1",DB_PORT:String(o),DB_DATABASE:e.name};if(e.username)s.DB_USERNAME=e.username;if(e.password)s.DB_PASSWORD=e.password;if((t||r)&&e.ssl!==!1)s.DB_SSL="true";return s}var Z="/var/backups/ts-cloud",we="/etc/ts-cloud/backups.config.ts",pe="/etc/cron.d/ts-cloud-backups",fn="/usr/local/bin/ts-cloud-backup.sh";function Ve(e){if(!e.name)return null;let t=e.host||"127.0.0.1",r=e.engine==="postgres",n=r?"postgresql":"mysql",o=e.port??(r?5432:3306),s=(c)=>c.replace(/\\/g,"\\\\").replace(/'/g,"\\'");return[" {",` type: '${n}',`,` name: '${s(e.name)}',`," connection: {",` hostname: '${s(t)}',`,` port: ${o},`,` database: '${s(e.name)}',`,` username: '${s(e.username||e.name)}',`,` password: '${s(e.password||"")}',`," ssl: false,"," },"," includeSchema: true,"," includeData: true,"," },"].join(`
7
7
  `)}function He(e,t){let r=e?Ve(e):null,n=t.bucket?[" destinations: ["," {"," type: 's3',",` bucket: '${t.bucket}',`," prefix: 'db-backups',",...t.endpoint?[` endpoint: '${t.endpoint}',`]:[]," optional: false,"," },"," ],"]:[];return["import type { BackupConfig } from 'ts-backups'","","const config: BackupConfig = {"," verbose: true,",` outputPath: '${Z}',`," retention: {",` count: ${t.retentionCount??5},`,` maxAge: ${t.retentionDays??30},`," },"," databases: [",...r?[r]:[]," ],",...n,"}","","export default config",""].join(`
8
8
  `)}function Fo(e){let{database:t,backups:r}=e;if(!r.enabled)return[];let n=r.schedule||"0 2 * * *",o=He(t,r);return["export DEBIAN_FRONTEND=noninteractive",`mkdir -p /etc/ts-cloud ${Z}`,"command -v bun >/dev/null 2>&1 || (curl -fsSL https://bun.sh/install | bash && ln -sf /root/.bun/bin/bun /usr/local/bin/bun)","bun add -g ts-backups || true",`cat > ${we} <<'TS_CLOUD_BACKUP_CFG_EOF'`,o.replace(/\n$/,""),"TS_CLOUD_BACKUP_CFG_EOF",`cat > ${fn} <<'TS_CLOUD_BACKUP_RUN_EOF'`,"#!/bin/bash","set -uo pipefail",'export PATH="/root/.bun/bin:/usr/local/bin:$PATH"','notify() { [ -x /usr/local/bin/ts-cloud-notify ] && /usr/local/bin/ts-cloud-notify "$1" || true; }',"cd /etc/ts-cloud",'if ! ts-backups start --config /etc/ts-cloud/backups.config.ts; then notify "❌ ts-cloud backup failed"; exit 1; fi',"TS_CLOUD_BACKUP_RUN_EOF",`chmod +x ${fn}`,`cat > ${pe} <<'TS_CLOUD_BACKUP_CRON_EOF'`,`${n} root ${fn} >> /var/log/ts-cloud-backup.log 2>&1`,"TS_CLOUD_BACKUP_CRON_EOF",`chmod 644 ${pe}`]}function Ge(e){return e==="mariadb"?"/var/lib/pantry/mariadb/mariadbd.sock":"/var/lib/pantry/mysql/mysqld.sock"}function xi(e,t={}){if(!e?.name)return[];let r=e.name,n=e.engine==="postgres",o=t.from?`TS_CLOUD_DUMP="${t.from}"`:`TS_CLOUD_DUMP="$(find ${Z} -type f -name '*${r}*.sql' -o -type f -name '*${r}*.sql.gz' 2>/dev/null | xargs -r ls -1t 2>/dev/null | head -1)"`,s=n?`${Nr(e)} -d "${r}"`:`mysql --socket=${Ge(e.engine)} -u root "${r}"`;return["set -uo pipefail",'eval "$(cd /opt/pantry && pantry env 2>/dev/null)" || true',o,'[ -n "$TS_CLOUD_DUMP" ] && [ -f "$TS_CLOUD_DUMP" ] || { echo "no backup dump found to restore" >&2; exit 1; }','echo "[ts-cloud] restoring '+r+' from $TS_CLOUD_DUMP"',`case "$TS_CLOUD_DUMP" in *.gz) gunzip -c "$TS_CLOUD_DUMP" ;; *) cat "$TS_CLOUD_DUMP" ;; esac | ${s}`,'echo "restore complete"']}var Bo=["storage",".env"],_i=4;function v(e){return`${e.replace(/\/+$/,"")}/.ts-cloud`}function Js(e){return`${v(e)}/deploy-history.log`}function qe(e,t){return`${v(e)}/deploys/${t}.log`}function ue(e){return`${v(e)}/shared-paths`}function jo(e){return`${e.shared}/stx-images`}function Ht(e,t){let r=e.replace(/\/+$/,"");return{base:r,releases:`${r}/releases`,shared:`${r}/shared`,current:`${r}/current`,release:`${r}/releases/${t}`}}function de(e){let t=e.split("/").pop()||e;if(t===".env"||t.startsWith(".env."))return!0;return/\.[a-z0-9]+$/i.test(t)}function Xs(e){return typeof e==="string"?e:e.path}function Wc(e){let t=new Map;for(let r of e)t.set(Xs(r),r);return[...t.values()]}function $e(e,t){if(typeof t==="string")return{path:t,target:`${e.shared}/${t}`,seed:!0};return{path:t.path,target:t.target??`${e.shared}/${t.path}`,seed:t.seed!==!1}}function Fe(e){return["ts_cloud_adopt_shared() {",' TS_CLOUD_SP="$1"',' TS_CLOUD_DST="$2"',` TS_CLOUD_SRC="${e.current}/$TS_CLOUD_SP"`,' if [ -e "$TS_CLOUD_DST" ]; then return 0; fi',' if [ -L "$TS_CLOUD_SRC" ] || [ ! -e "$TS_CLOUD_SRC" ]; then return 0; fi',' mkdir -p "$(dirname "$TS_CLOUD_DST")"',' cp -a "$TS_CLOUD_SRC" "$TS_CLOUD_DST"'," for TS_CLOUD_SIDECAR in -wal -shm; do",' if [ -f "$TS_CLOUD_SRC$TS_CLOUD_SIDECAR" ]; then cp -a "$TS_CLOUD_SRC$TS_CLOUD_SIDECAR" "$TS_CLOUD_DST$TS_CLOUD_SIDECAR"; fi'," done",' echo "[ts-cloud] adopted $TS_CLOUD_SP from the live release into shared/ — it now survives deploys"'," return 0","}"]}function Oi(e,t=Bo){let r=[`mkdir -p ${e.releases} ${e.shared} ${jo(e)}`,...Fe(e)],n=t.map((s)=>$e(e,s));for(let{path:s,target:c,seed:p}of n){if(!p)continue;if(r.push(`ts_cloud_adopt_shared '${s}' '${c}'`),de(s))r.push(`mkdir -p "$(dirname ${c})"`,`touch ${c}`);else if(s==="storage")r.push(`mkdir -p ${c}/app/public`,`mkdir -p ${c}/framework/cache/data`,`mkdir -p ${c}/framework/sessions`,`mkdir -p ${c}/framework/testing`,`mkdir -p ${c}/framework/views`,`mkdir -p ${c}/logs`);else r.push(`mkdir -p ${c}`)}let o=ue(e.base);return r.push(`mkdir -p ${v(e.base)}`,`cat > ${o} <<'TS_CLOUD_SHARED_PATHS_EOF'`,...n.map((s)=>`${s.path} ${s.target}`),"TS_CLOUD_SHARED_PATHS_EOF"),r}function Qs(e,t=900){let r=`${v(e.base)}/deploy.lock`;return[`mkdir -p "$(dirname ${r})"`,`exec 9>${r}`,`flock -w ${t} 9 || { echo "[ts-cloud] another deploy of this site has held the lock for ${t}s — refusing to race it" >&2; exit 1; }`]}function Ys(e){let t=`${e.release}.incoming`;return[`rm -rf ${t}`,`mkdir -p ${t}`,...Ye(e),'if [ "$TS_CLOUD_IS_LIVE" = "yes" ]; then',` TS_CLOUD_STAGED=${t}`,"else",` rm -rf ${e.release}`,` mkdir -p ${e.release}`,` rmdir ${t}`,` TS_CLOUD_STAGED=${e.release}`,"fi"]}function Zs(e){let t=`TS_CLOUD_TRAP_LIVE="$(readlink -f ${e.current} 2>/dev/null || true)"`,r=`TS_CLOUD_TRAP_TARGET="$(readlink -f ${e.release} 2>/dev/null || echo ${e.release})"`;return`trap '${`if [ $? -ne 0 ]; then ${t}; ${r}; [ "$TS_CLOUD_TRAP_LIVE" = "$TS_CLOUD_TRAP_TARGET" ] || rm -rf ${e.release}; fi`}' EXIT`}function Ye(e){return[`TS_CLOUD_LIVE_PATH="$(readlink -f ${e.current} 2>/dev/null || true)"`,`TS_CLOUD_RELEASE_PATH="$(readlink -f ${e.release} 2>/dev/null || echo ${e.release})"`,'if [ -n "$TS_CLOUD_LIVE_PATH" ] && [ "$TS_CLOUD_LIVE_PATH" = "$TS_CLOUD_RELEASE_PATH" ]; then TS_CLOUD_IS_LIVE=yes; else TS_CLOUD_IS_LIVE=no; fi']}function ea(e){let t=`${e.release}.incoming`;return[`if [ "$TS_CLOUD_STAGED" = "${t}" ]; then`,` rm -rf ${e.release}.previous`,` mv ${e.release} ${e.release}.previous`,` mv ${t} ${e.release}`,` rm -rf ${e.release}.previous`,"fi"]}function Ke(e,t){return[`if [ -f ${e} ] && [ ! -L ${e} ] && [ -s ${e} ] && [ ! -s ${t} ]; then`,` cp -a ${e} ${t}`,` echo "[ts-cloud] seeded shared/ from the release's own copy of the file"`,"fi"]}function Vo(e,t=Bo){let r=[];for(let n of t){let{path:o,target:s,seed:c}=$e(e,n),p=`${e.release}/${o}`,l=[`rm -rf ${p}`,`mkdir -p "$(dirname ${p})"`,`ln -sfn ${s} ${p}`];if(c){if(o!==".env"&&de(o))r.push(...Ke(p,s));r.push(...l);continue}r.push(`if [ -e ${s} ]; then`,...l.map((i)=>` ${i}`),"fi")}return r}function je(e,t){let r=ue(e.base);return[`if [ -f ${r} ]; then`,' while IFS="\t" read -r TS_CLOUD_SP TS_CLOUD_TGT; do',' [ -n "$TS_CLOUD_SP" ] || continue',` [ -n "$TS_CLOUD_TGT" ] || TS_CLOUD_TGT="${e.shared}/$TS_CLOUD_SP"`,' [ -e "$TS_CLOUD_TGT" ] || continue',` rm -rf ${t}/"$TS_CLOUD_SP"`,` mkdir -p "$(dirname ${t}/"$TS_CLOUD_SP")"`,` ln -sfn "$TS_CLOUD_TGT" ${t}/"$TS_CLOUD_SP"`,` done < ${r}`,"fi"]}function hn(e){return[`ln -sfn ${e.release} ${e.current}.tmp`,`mv -Tf ${e.current}.tmp ${e.current}`]}function ee(e){return`${v(e)}/previous-release`}function ta(e,t="TS_CLOUD_PREV_CURRENT"){let r=ee(e.base);return[`if [ -n "\${${t}:-}" ] && [ -d "$${t}" ] && [ "$(readlink -f "$${t}")" != "$(readlink -f ${e.release})" ]; then mkdir -p ${v(e.base)}; basename "$${t}" > ${r}; fi`]}function _e(e,t){let r=ee(e.base);return[`TS_CLOUD_CURRENT=$(readlink -f ${e.current} 2>/dev/null || true)`,...t?[`TS_CLOUD_RB_TARGET=${e.releases}/${t}`]:["TS_CLOUD_RB_TARGET=",`if [ -f ${r} ]; then TS_CLOUD_REC="${e.releases}/$(cat ${r})"; if [ -d "$TS_CLOUD_REC" ] && [ "$(readlink -f "$TS_CLOUD_REC")" != "$TS_CLOUD_CURRENT" ]; then TS_CLOUD_RB_TARGET="$TS_CLOUD_REC"; fi; fi`,`[ -n "$TS_CLOUD_RB_TARGET" ] || TS_CLOUD_RB_TARGET=$(ls -1dt ${e.releases}/*/ 2>/dev/null | sed 's#/$##' | while read -r r; do [ "$(readlink -f "$r")" != "$TS_CLOUD_CURRENT" ] && { echo "$r"; break; }; done)`],'[ -n "$TS_CLOUD_RB_TARGET" ] && [ -d "$TS_CLOUD_RB_TARGET" ] || { echo "no release to roll back to (looked for ${TS_CLOUD_RB_TARGET:-a previous release})" >&2; exit 1; }','[ "$(readlink -f "$TS_CLOUD_RB_TARGET")" != "$TS_CLOUD_CURRENT" ] || { echo "$(basename "$TS_CLOUD_RB_TARGET") is already the live release" >&2; exit 1; }','TS_CLOUD_RB_ID=$(basename "$TS_CLOUD_RB_TARGET")']}function Kc(e,t={}){return[..._e(e,t.to),'echo "would roll back from $(basename "${TS_CLOUD_CURRENT:-none}") to $TS_CLOUD_RB_ID (dry run: nothing changed)"']}function Jc(e,t={}){let r=Math.max(1,t.gateSeconds??5),n=t.systemdDir??"/etc/systemd/system",o=[`ln -sfn "$TS_CLOUD_RB_TARGET" ${e.current}.tmp`,`mv -Tf ${e.current}.tmp ${e.current}`,`rm -f ${ee(e.base)}`,'echo "rolled back to $TS_CLOUD_RB_ID"'],s=[..._e(e,t.to),...je(e,'"$TS_CLOUD_RB_TARGET"')];if(!t.unitBase)return[...s,...o];let c=t.unitBase,p=`${c}@\${TS_CLOUD_RB_ID}.service`;return[...s,`if [ -f ${n}/${c}@.service ]; then`,` systemctl start "${p}"`,` for TS_CLOUD_I in $(seq 1 ${r}); do sleep 1; systemctl is-active --quiet "${p}" || { echo "the release rolled back to, $TS_CLOUD_RB_ID, did not stay up; the current release keeps serving" >&2; journalctl -u "${p}" -n 30 --no-pager >&2 || true; systemctl stop "${p}" 2>/dev/null || true; exit 1; }; done`,...o.map((l)=>` ${l}`),` systemctl enable "${p}" 2>/dev/null || true`,` systemctl list-units --plain --no-legend --type=service "${c}@*.service" 2>/dev/null | awk '{print $1}' | { grep -v "^${c}@\${TS_CLOUD_RB_ID}.service$" || true; } | while read -r TS_CLOUD_U; do systemctl stop "$TS_CLOUD_U" 2>/dev/null || true; systemctl disable "$TS_CLOUD_U" 2>/dev/null || true; done`,`elif [ -f ${n}/${c}.service ]; then`,...o.map((l)=>` ${l}`),` systemctl restart ${c}.service`,"else",...o.map((l)=>` ${l}`),"fi"]}function yn(e,t=4){let r=Math.max(1,t);return[`TS_CLOUD_CURRENT=$(readlink -f ${e.current} 2>/dev/null || true)`,`ls -1dt ${e.releases}/*/ 2>/dev/null | sed 's#/$##' | tail -n +${r+1} | while read -r TS_CLOUD_OLD; do`,' [ "$(readlink -f "$TS_CLOUD_OLD")" = "$TS_CLOUD_CURRENT" ] || rm -rf "$TS_CLOUD_OLD"',"done"]}function We(e){return`${v(e)}/owner`}function ra(e,t){let r=We(e);return[`if [ -f "${r}" ]; then`,` TS_CLOUD_OWNER=$(cat "${r}")`,` if [ "$TS_CLOUD_OWNER" != "${t}" ]; then`,` echo "[ts-cloud] REFUSING deploy: ${e} belongs to project '$TS_CLOUD_OWNER', not '${t}'. Another project on this box derives the same site key — give one of them a distinct site name/domain, or remove ${r} to transfer ownership." >&2`," exit 1"," fi","else",` mkdir -p "$(dirname "${r}")"`,` printf '%s\\n' "${t}" > "${r}"`,"fi"]}function zo(e,t){let r=v(e),n=qe(e,t.releaseId),o=Js(e),s=Math.max(1,t.keepLogs??20),c=t.commit||"",p=t.branch||"";return[`mkdir -p ${r}/deploys`,`exec > >(tee -a ${n}) 2>&1`,`echo "[ts-cloud] deploy ${t.releaseId} commit=${c} branch=${p} starting $(date -u +%Y-%m-%dT%H:%M:%SZ)"`,"ts_cloud_record_deploy() {"," TS_CLOUD_RC=$?",' if [ "$TS_CLOUD_RC" -eq 0 ]; then TS_CLOUD_ST=success; else TS_CLOUD_ST=failed; fi',` printf '%s\\t%s\\t%s\\t%s\\trc=%s\\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "${t.releaseId}" "${c}" "$TS_CLOUD_ST" "$TS_CLOUD_RC" >> ${o}`,"}","trap ts_cloud_record_deploy EXIT",`ls -1t ${r}/deploys/*.log 2>/dev/null | tail -n +${s+1} | while read -r TS_CLOUD_OLDLOG; do rm -f "$TS_CLOUD_OLDLOG"; done`]}
9
- export{J,Di,Gs,I,$o,Ws,Ks,Hc,qc,U,kr,Ct,nt,Lo,ki,Mo,Ni,Nr,Uo,Tt,Gc,fn,Fo,xi,Bo,_i,Js,jo,Ht,Xs,Wc,Oi,Qs,Ys,Zs,ea,Vo,hn,ta,Kc,Jc,yn,ra,zo};
9
+ export{J,Di,Gs,w,$o,Ws,Ks,Hc,qc,U,kr,Ct,nt,Lo,ki,Mo,Ni,Nr,Uo,Tt,Gc,fn,Fo,xi,Bo,_i,Js,jo,Ht,Xs,Wc,Oi,Qs,Ys,Zs,ea,Vo,hn,ta,Kc,Jc,yn,ra,zo};
@@ -1 +1 @@
1
- import{vt,Xd,Ls,xo,cm,Ms,Us,_o,Vt,lm,Qd,dm,um,z,Fs,pm}from"./chunk-jyvr7eh5.js";import"./chunk-sy4zws71.js";import"./chunk-ek27709c.js";import"./chunk-rbyrd9we.js";import"./chunk-7cactd6c.js";import"./chunk-0xfy78nc.js";import"./chunk-rqvrjp8g.js";import"./chunk-z6xnegpe.js";export{xo as assertEnvWithinLimit,Ls as buildFunctionEnv,cm as deployServerlessApp,dm as getCommandRecord,Xd as infraEnvFromOutputs,Qd as listCommandHistory,Ms as redeployServerlessApp,vt as resolveServerlessFunctions,pm as restoreServerlessDatabase,Us as rollbackServerlessApp,lm as runAndRecordCommand,um as runDbQuery,Vt as runRemoteCommand,Fs as scaleServerlessDatabase,z as serverlessInfo,_o as setMaintenance};
1
+ import{vt,Xd,Ls,xo,cm,Ms,Us,_o,Vt,lm,Qd,dm,um,z,Fs,pm}from"./chunk-wzpsq446.js";import"./chunk-sy4zws71.js";import"./chunk-zpjy26jk.js";import"./chunk-rbyrd9we.js";import"./chunk-7cactd6c.js";import"./chunk-0xfy78nc.js";import"./chunk-t8qzx4ka.js";import"./chunk-z6xnegpe.js";export{xo as assertEnvWithinLimit,Ls as buildFunctionEnv,cm as deployServerlessApp,dm as getCommandRecord,Xd as infraEnvFromOutputs,Qd as listCommandHistory,Ms as redeployServerlessApp,vt as resolveServerlessFunctions,pm as restoreServerlessDatabase,Us as rollbackServerlessApp,lm as runAndRecordCommand,um as runDbQuery,Vt as runRemoteCommand,Fs as scaleServerlessDatabase,z as serverlessInfo,_o as setMaintenance};
@@ -1,2 +1,2 @@
1
- import{Xo,Ca}from"./chunk-rqvrjp8g.js";import{g}from"./chunk-7cactd6c.js";var l=()=>{};async function Vp(a,c=l){for(let e of a){let t=new g(e.replicaRegion),i;try{i=await t.headBucket(e.replicaBucket)}catch(r){if(r?.statusCode===301)throw Error(`Failover replica bucket ${e.replicaBucket} already exists outside ${e.replicaRegion}. Pick another failover.bucket or region for infrastructure.storage.${e.name}.`);if(r?.statusCode===403)throw Error(`Failover replica bucket ${e.replicaBucket} exists but this account cannot reach it (S3 names are global, so another account may own it). Set infrastructure.storage.${e.name}.failover.bucket to a name you own.`);throw r}if(i.exists&&i.region&&i.region!==e.replicaRegion)throw Error(`Failover replica bucket ${e.replicaBucket} is in ${i.region}, not ${e.replicaRegion}.`);if(!i.exists)c(`Creating failover replica bucket ${e.replicaBucket} in ${e.replicaRegion}`),await t.createBucket(e.replicaBucket);if(await t.putPublicAccessBlock(e.replicaBucket,{BlockPublicAcls:!0,IgnorePublicAcls:!0,BlockPublicPolicy:!0,RestrictPublicBuckets:!0}),await t.putBucketEncryption(e.replicaBucket,"AES256"),e.replicate){if((await t.getBucketVersioning(e.replicaBucket)).Status!=="Enabled")c(`Enabling versioning on ${e.replicaBucket} (S3 replication requires it)`),await t.putBucketVersioning(e.replicaBucket,"Enabled")}}}async function zp(a,c,e=l){for(let t of a){let i=c[t.distributionArnOutput];if(!i)throw Error(`Stack output ${t.distributionArnOutput} is missing, so the failover replica ${t.replicaBucket} cannot be scoped to its distribution.`);let r=new g(t.replicaRegion),s={Version:"2012-10-17",Statement:[...((await r.getBucketPolicy(t.replicaBucket))?.Statement??[]).filter((n)=>n?.Sid!==Xo),Ca({replicaBucket:t.replicaBucket,distributionArn:i})]};e(`Granting ${i} read access to ${t.replicaBucket}`),await r.putBucketPolicy(t.replicaBucket,s)}}async function Hp(a,c=l){let e={};for(let t of a){let i=new g(t.primaryRegion),r=new g(t.replicaRegion),[u,p]=await Promise.all([i.listAllObjects({bucket:t.primaryBucket}),r.listAllObjects({bucket:t.replicaBucket})]),s=new Map(p.map((o)=>[o.Key,o.Size])),n=u.filter((o)=>s.get(o.Key)!==o.Size);for(let o of n)await r.copyObject({sourceBucket:t.primaryBucket,sourceKey:o.Key,destinationBucket:t.replicaBucket,destinationKey:o.Key});if(n.length>0)c(`Copied ${n.length} object(s) from ${t.primaryBucket} to ${t.replicaBucket}`);e[t.replicaBucket]=n.length}return e}async function qp(a,c=l){for(let e of a){let t=new g(e.replicaRegion);if(!(await t.headBucket(e.replicaBucket)).exists)continue;await t.emptyBucket(e.replicaBucket),await t.deleteBucket(e.replicaBucket),c(`Deleted failover replica bucket ${e.replicaBucket}`)}}
1
+ import{Xo,Ca}from"./chunk-t8qzx4ka.js";import{g}from"./chunk-7cactd6c.js";var l=()=>{};async function Vp(a,c=l){for(let e of a){let t=new g(e.replicaRegion),i;try{i=await t.headBucket(e.replicaBucket)}catch(r){if(r?.statusCode===301)throw Error(`Failover replica bucket ${e.replicaBucket} already exists outside ${e.replicaRegion}. Pick another failover.bucket or region for infrastructure.storage.${e.name}.`);if(r?.statusCode===403)throw Error(`Failover replica bucket ${e.replicaBucket} exists but this account cannot reach it (S3 names are global, so another account may own it). Set infrastructure.storage.${e.name}.failover.bucket to a name you own.`);throw r}if(i.exists&&i.region&&i.region!==e.replicaRegion)throw Error(`Failover replica bucket ${e.replicaBucket} is in ${i.region}, not ${e.replicaRegion}.`);if(!i.exists)c(`Creating failover replica bucket ${e.replicaBucket} in ${e.replicaRegion}`),await t.createBucket(e.replicaBucket);if(await t.putPublicAccessBlock(e.replicaBucket,{BlockPublicAcls:!0,IgnorePublicAcls:!0,BlockPublicPolicy:!0,RestrictPublicBuckets:!0}),await t.putBucketEncryption(e.replicaBucket,"AES256"),e.replicate){if((await t.getBucketVersioning(e.replicaBucket)).Status!=="Enabled")c(`Enabling versioning on ${e.replicaBucket} (S3 replication requires it)`),await t.putBucketVersioning(e.replicaBucket,"Enabled")}}}async function zp(a,c,e=l){for(let t of a){let i=c[t.distributionArnOutput];if(!i)throw Error(`Stack output ${t.distributionArnOutput} is missing, so the failover replica ${t.replicaBucket} cannot be scoped to its distribution.`);let r=new g(t.replicaRegion),s={Version:"2012-10-17",Statement:[...((await r.getBucketPolicy(t.replicaBucket))?.Statement??[]).filter((n)=>n?.Sid!==Xo),Ca({replicaBucket:t.replicaBucket,distributionArn:i})]};e(`Granting ${i} read access to ${t.replicaBucket}`),await r.putBucketPolicy(t.replicaBucket,s)}}async function Hp(a,c=l){let e={};for(let t of a){let i=new g(t.primaryRegion),r=new g(t.replicaRegion),[u,p]=await Promise.all([i.listAllObjects({bucket:t.primaryBucket}),r.listAllObjects({bucket:t.replicaBucket})]),s=new Map(p.map((o)=>[o.Key,o.Size])),n=u.filter((o)=>s.get(o.Key)!==o.Size);for(let o of n)await r.copyObject({sourceBucket:t.primaryBucket,sourceKey:o.Key,destinationBucket:t.replicaBucket,destinationKey:o.Key});if(n.length>0)c(`Copied ${n.length} object(s) from ${t.primaryBucket} to ${t.replicaBucket}`);e[t.replicaBucket]=n.length}return e}async function qp(a,c=l){for(let e of a){let t=new g(e.replicaRegion);if(!(await t.headBucket(e.replicaBucket)).exists)continue;await t.emptyBucket(e.replicaBucket),await t.deleteBucket(e.replicaBucket),c(`Deleted failover replica bucket ${e.replicaBucket}`)}}
2
2
  export{Vp,zp,Hp,qp};
@@ -1 +1 @@
1
- import{$p,Td,ac,cc,Ed,Lp,Mp,Zt,kn,er,Wi,Up,Nn,os}from"./chunk-v0g82agx.js";import{Qe,gs,yc,yi,fs,Gp}from"./chunk-q0takzyx.js";import{zd,vo,Hd,qd,Gd,wr,am,Co}from"./chunk-bzzwbkrx.js";import{Qa,Ya,Za,ld,Gi,dd,ud,ts,ec,tc}from"./chunk-rqvrjp8g.js";import"./chunk-z6xnegpe.js";export{Ya as CHAIN_HEADER,kn as DEFAULT_ATTACK_MODE_HOURS,zd as DEFAULT_DDOS_THRESHOLDS,Gi as DEFAULT_RECURSION_LIMITS,Qa as DEPTH_HEADER,Zt as MAX_CONTROL_HOURS,er as ProtectionControlStore,$p as RATE_LIMIT_KEY_SEPARATOR,Ed as RateLimiter,ts as RecursionGuard,Za as TRACE_HEADER,Nn as applyControlsToDdos,Up as applyControlsToRateLimits,Co as applyMitigationFactor,Mp as defaultRateLimitRules,Wi as describePosture,Qe as escapeSecLang,ld as functionFingerprint,Td as globMatches,yc as globToRegex,ud as inspectInvocation,gs as isSafePattern,vo as isValidCidr,os as mergeControlsIntoConfig,dd as parseChain,am as planMitigation,ec as propagationHeaders,Lp as rateLimitHeaders,cc as rateLimitKey,tc as recursionBlockedResponse,wr as renderDdosInstallScript,Gd as renderNftablesRuleset,qd as renderSysctlFile,yi as renderWafConfig,fs as renderWafInstallScript,ac as ruleMatches,Hd as sysctlHardening,Gp as wafEventTelemetry};
1
+ import{$p,Td,ac,cc,Ed,Lp,Mp,Zt,kn,er,Wi,Up,Nn,os}from"./chunk-v0g82agx.js";import{Qe,gs,yc,yi,fs,Gp}from"./chunk-q0takzyx.js";import{zd,vo,Hd,qd,Gd,wr,am,Co}from"./chunk-bzzwbkrx.js";import{Qa,Ya,Za,ld,Gi,dd,ud,ts,ec,tc}from"./chunk-t8qzx4ka.js";import"./chunk-z6xnegpe.js";export{Ya as CHAIN_HEADER,kn as DEFAULT_ATTACK_MODE_HOURS,zd as DEFAULT_DDOS_THRESHOLDS,Gi as DEFAULT_RECURSION_LIMITS,Qa as DEPTH_HEADER,Zt as MAX_CONTROL_HOURS,er as ProtectionControlStore,$p as RATE_LIMIT_KEY_SEPARATOR,Ed as RateLimiter,ts as RecursionGuard,Za as TRACE_HEADER,Nn as applyControlsToDdos,Up as applyControlsToRateLimits,Co as applyMitigationFactor,Mp as defaultRateLimitRules,Wi as describePosture,Qe as escapeSecLang,ld as functionFingerprint,Td as globMatches,yc as globToRegex,ud as inspectInvocation,gs as isSafePattern,vo as isValidCidr,os as mergeControlsIntoConfig,dd as parseChain,am as planMitigation,ec as propagationHeaders,Lp as rateLimitHeaders,cc as rateLimitKey,tc as recursionBlockedResponse,wr as renderDdosInstallScript,Gd as renderNftablesRuleset,qd as renderSysctlFile,yi as renderWafConfig,fs as renderWafInstallScript,ac as ruleMatches,Hd as sysctlHardening,Gp as wafEventTelemetry};