@stacksjs/ts-cloud 0.7.13 → 0.7.15

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 (35) hide show
  1. package/dist/bin/cli.js +282 -282
  2. package/dist/{chunk-9ra8b9b4.js → chunk-296n8hvt.js} +2 -2
  3. package/dist/{chunk-vsgkcpqw.js → chunk-49nmy775.js} +6 -8
  4. package/dist/{chunk-jg4f2ybx.js → chunk-6agm101w.js} +24 -5
  5. package/dist/{chunk-fy85hcfy.js → chunk-mbpxadga.js} +4 -4
  6. package/dist/{chunk-m03vddvr.js → chunk-qgnyzfmx.js} +1 -1
  7. package/dist/deploy/index.js +4 -4
  8. package/dist/deploy/management-dashboard.d.ts +9 -1
  9. package/dist/drivers/index.js +2 -2
  10. package/dist/drivers/shared/releases.d.ts +12 -0
  11. package/dist/index.js +6 -4
  12. package/dist/ui/index.html +3 -3
  13. package/dist/ui/server/actions.html +3 -3
  14. package/dist/ui/server/backups.html +3 -3
  15. package/dist/ui/server/database.html +3 -3
  16. package/dist/ui/server/deployments.html +3 -3
  17. package/dist/ui/server/firewall.html +3 -3
  18. package/dist/ui/server/logs.html +3 -3
  19. package/dist/ui/server/services.html +3 -3
  20. package/dist/ui/server/sites.html +3 -3
  21. package/dist/ui/server/ssh-keys.html +3 -3
  22. package/dist/ui/server/terminal.html +3 -3
  23. package/dist/ui/server/workers.html +3 -3
  24. package/dist/ui/serverless/alarms.html +3 -3
  25. package/dist/ui/serverless/assets.html +3 -3
  26. package/dist/ui/serverless/data.html +3 -3
  27. package/dist/ui/serverless/deployments.html +3 -3
  28. package/dist/ui/serverless/functions.html +3 -3
  29. package/dist/ui/serverless/logs.html +3 -3
  30. package/dist/ui/serverless/queues.html +3 -3
  31. package/dist/ui/serverless/scheduler.html +3 -3
  32. package/dist/ui/serverless/secrets.html +3 -3
  33. package/dist/ui/serverless/traces.html +3 -3
  34. package/dist/ui/serverless.html +3 -3
  35. package/package.json +10 -10
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  buildAndPushServerlessImage
3
- } from "./chunk-m03vddvr.js";
3
+ } from "./chunk-qgnyzfmx.js";
4
4
  import"./chunk-hsk6fe6x.js";
5
- import"./chunk-vsgkcpqw.js";
5
+ import"./chunk-49nmy775.js";
6
6
  import"./chunk-arsh1g5h.js";
7
7
  import"./chunk-v0bahtg2.js";
8
8
  export {
@@ -21948,13 +21948,11 @@ function hasManagementDashboardSite(config) {
21948
21948
  if (!site)
21949
21949
  return false;
21950
21950
  const root = site.root ?? "";
21951
- return name === "dashboard" || root === "ui/dist" || root.endsWith("/ui/dist") || root.endsWith("/dist/ui");
21951
+ return isManagementDashboardSiteName(name) || root === "ui/dist" || root.endsWith("/ui/dist") || root.endsWith("/dist/ui");
21952
21952
  });
21953
21953
  }
21954
21954
  var MANAGEMENT_DASHBOARD_SITE_PREFIX = "dashboard-";
21955
- function dashboardSiteName(domain, primary) {
21956
- if (primary)
21957
- return "dashboard";
21955
+ function managementDashboardSiteName(domain) {
21958
21956
  return MANAGEMENT_DASHBOARD_SITE_PREFIX + domain.replace(/^dashboard\./, "").replace(/\./g, "-");
21959
21957
  }
21960
21958
  function isManagementDashboardSiteName(name) {
@@ -21980,11 +21978,11 @@ function resolveManagementDashboardSites(config, environment, opts) {
21980
21978
  ...build,
21981
21979
  ...auth2
21982
21980
  };
21983
- return [{ name: "dashboard", site }];
21981
+ return [{ name: managementDashboardSiteName(domain), site }];
21984
21982
  }
21985
21983
  const domains = resolveDashboardDomains(config, environment, opts.domain);
21986
- return domains.map((domain, i) => ({
21987
- name: dashboardSiteName(domain, i === 0),
21984
+ return domains.map((domain) => ({
21985
+ name: managementDashboardSiteName(domain),
21988
21986
  site: {
21989
21987
  root: opts.uiRoot,
21990
21988
  deploy: "server",
@@ -46154,4 +46152,4 @@ class ResourceManagementManager {
46154
46152
  }
46155
46153
  var resourceManagementManager = new ResourceManagementManager;
46156
46154
 
46157
- export { detectServiceRegion, signRequest, signRequestAsync, createPresignedUrl, createPresignedUrlAsync, makeAWSRequest, makeAWSRequestOnce, makeAWSRequestAsync, parseXMLResponse, parseJSONResponse, clearSigningKeyCache, getSigningKeyCacheSize, isNodeCryptoAvailable, isWebCryptoAvailable, QueuePresets, RealtimePresets, detectDeploymentTargets, resolveDeploymentMode, deploymentCoexistenceError, resolveCloudProvider, TemplateBuilder, Pseudo, generateResourceName, generateLogicalId, getTimestamp, sanitizeName, resolveProjectStackName, resolveSiteStackName, resolveSiteResourceName, resolveSiteBucketName, resolveStorageBucketName, resolveDeployBucketName, resolveServerlessAppStackName, resolveServerlessArtifactBucketName, resolveServerlessAssetBucketName, DependencyGraph, analyzeStackDiff, formatDiff, Storage, Registry, CDN, DNS, Security, Compute, Network, FileSystem, Email, exports_incoming_call, Phone, Queue, JobLoader, StacksIntegration, exports_send, SMS, AI, Database, Cache, Permissions, ApiGateway, Messaging, Workflow, Monitoring, Auth, Deployment, AssetHasher, Secrets, ParameterStore, Search, Redirects, Communication, Fn2, Arn, AWS_PSEUDO_PARAMETERS, CloudFormationBuilder, buildCloudFormationTemplate, createStaticSitePreset, createNodeJsServerPreset, createNodeJsServerlessPreset, createServerlessNodePreset, createFullStackAppPreset, createApiBackendPreset, createWordPressPreset, createJamstackPreset, createMicroservicesPreset, createRealtimeAppPreset, createDataPipelinePreset, createMLApiPreset, createTraditionalWebAppPreset, createLaravelPreset, createServerlessLaravelPreset, createDashboardSite, resolveDashboardDomain, resolveDashboardDomains, hasManagementDashboardSite, MANAGEMENT_DASHBOARD_SITE_PREFIX, isManagementDashboardSiteName, resolveManagementDashboardSites, resolveManagementDashboardSite, extendPreset, composePresets, createPreset, mergeInfrastructure, withMonitoring, withSecurity, withDatabase, withCache, withCDN, withQueue, fromEnvironment, fromSharedCredentials, fromEC2Metadata, fromECSMetadata, fromWebIdentity, getCredentials, createCredentialProvider, resolveCredentials, resolveRegion, getAccountId, S3Error, createS3Client, CloudError, ConfigurationError, CredentialError, DeploymentError, ValidationError, AWSAPIError, ErrorCodes, getErrorDetails, createError, DebugLogger, validateConfiguration, detectMisconfigurations, validateCredentials, checkIAMPermissions, getRequiredPermissions, suggestIAMPolicy, DEFAULT_SERVICE_LIMITS, checkServiceQuotas, getQuotaUsageSummary, suggestQuotaIncrease, FileCache, TemplateCache, templateCache, hashFile, hashString, hashBuffer, hashDirectory, hashManifest, quickHash, findChangedFiles, HashCache, parallel, batch, parallelMap, parallelWithRetry, sequence, withTimeout, RateLimiter, chunk, processInChunks, diffTemplates, getDiffSummary, requiresReplacement, categorizeChanges, getDeploymentStrategy, getDiffStats, cloud_config_schema_default, validateAgainstSchema, defaultLocalConfig, getLocalConfig, isLocalDevelopment, getLocalEndpoint, getLocalCredentials, getLocalEnvVars, MockCloudFormation, MockS3, MockDynamoDB, createMockAWS, PreviewEnvironmentManager, previewManager, generatePreviewWorkflow, generateCleanupWorkflow, generateCostReportWorkflow, PreviewNotificationService, previewNotifications, formatTable, formatTree, formatProgressBar, formatBytes, formatDuration, formatList, formatKeyValue, ProgressBar, MultiStepProgress, Spinner, TaskList, suggestCommand, formatSuggestion, isLikelyTypo, getContextualHelp, searchCommands, autocomplete, suggestFlags, formatFlagSuggestions, getCommandUsage, validateCommand, REPL, REPLContext, REPLCommandBuilder, CommandHistory, formatHistory, formatHistoryStats, MultiRegionManager, multiRegionManager, CrossRegionReferenceManager, GlobalResourceManager, RegionPairManager, StackDependencyManager, crossRegionReferenceManager, globalResourceManager, regionPairManager, stackDependencyManager, AWS_REGIONS, getRegion, getAllRegions, getRegionsByLocation, getRegionsByCompliance, getRegionsByPricingTier, isValidRegion, getClosestRegion, suggestRegions, suggestRegionPairs, formatRegion, formatRegionList, getRegionStats, MultiAccountManager, OrganizationManager, multiAccountManager, organizationManager, RECOMMENDED_ACCOUNT_STRUCTURES, RECOMMENDED_SCPS, COMMON_CROSS_ACCOUNT_ROLES, getRecommendedStructure, generateCrossAccountRoleCF, validateAccountStructure, formatAccountStructure, generateDeploymentWorkflow, generateMultiEnvWorkflow, generatePRPreviewWorkflow, generateScheduledWorkflow, generateMatrixWorkflow, generateDeploymentPipeline, generateMultiEnvPipeline, generatePreviewPipeline, generateScheduledPipeline, generateManualPipeline, generateDeploymentConfig, generateMultiEnvConfig, generateScheduledConfig, generateApprovalConfig, generateParallelConfig, BackupManager, backupManager, DisasterRecoveryManager, drManager, AWSConfigManager, awsConfigManager, CloudTrailManager, cloudTrailManager, GuardDutyManager, guardDutyManager, SecurityHubManager, securityHubManager, BlueGreenManager, blueGreenManager, CanaryManager, canaryManager, ABTestManager, abTestManager, ProgressiveDeploymentManager, progressiveDeploymentManager, XRayManager, xrayManager, MetricsManager, metricsManager, LogsManager, logsManager, SyntheticsManager, syntheticsManager, MigrationManager, migrationManager, ReplicaManager, replicaManager, PerformanceManager, performanceManager, DatabaseUserManager, databaseUserManager, SecretsRotationManager, secretsRotationManager, SecretsManager, secretsManager, CertificateManager, certificateManager, SecurityScanningManager, securityScanningManager, ImageScanningManager, imageScanningManager, BuildOptimizationManager, buildOptimizationManager, ContainerRegistryManager, containerRegistryManager, ServiceMeshManager, serviceMeshManager, LambdaLayersManager, lambdaLayersManager, LambdaVersionsManager, lambdaVersionsManager, LambdaConcurrencyManager, lambdaConcurrencyManager, LambdaDestinationsManager, lambdaDestinationsManager, LambdaVPCManager, lambdaVPCManager, LambdaDLQManager, lambdaDLQManager, Route53RoutingManager, route53RoutingManager, DNSSECManager, dnssecManager, Route53ResolverManager, route53ResolverManager, BounceComplaintHandler, bounceComplaintHandler, EmailAnalyticsManager, emailAnalyticsManager, SenderReputationManager, senderReputationManager, EmailTemplateManager, emailTemplateManager, exports_advanced, exports_inbound, exports_advanced2, exports_advanced3, FIFOQueueManager, fifoQueueManager, DLQMonitoringManager, dlqMonitoringManager, BatchProcessingManager, batchProcessingManager, QueueManagementManager, queueManagementManager, createZip, generateBootstrap, runBuildHooks, sha256, artifactKey, packageServerlessApp, MANAGED_NODE_VERSIONS, resolveServerlessRuntime, resolveQueues, resolveQueueNames, composeServerlessAppTemplate, PHP_LAYER_EXTENSIONS, phpLayerPackages, phpLayerBuildStage, generatePhpLayerDockerfile, generateAppImageDockerfile, sharedRuntimeLoop, buildNodeRuntimeLayerZip, buildBunRuntimeLayerZip, resolveApp, eventToRequest, responseToResult, createHttpHandler, createQueueHandler, createCliHandler, createHandlers, generatePhpFpmConfig, phpRuntimeLayerAssets, laravelServerlessEnvDefaults, LARAVEL_SERVERLESS_BUILD_STEPS, buildPhpRuntimeLayerZip, PHP_DEFAULT_EXCLUDES, runPhpBuildHooks, collectPhpAppEntries, packagePhpApp, StaticSiteManager, staticSiteManager, StorageAdvancedManager, storageAdvancedManager, HealthCheckManager, healthCheckManager, NetworkSecurityManager, networkSecurityManager, ResourceManagementManager, resourceManagementManager };
46155
+ export { detectServiceRegion, signRequest, signRequestAsync, createPresignedUrl, createPresignedUrlAsync, makeAWSRequest, makeAWSRequestOnce, makeAWSRequestAsync, parseXMLResponse, parseJSONResponse, clearSigningKeyCache, getSigningKeyCacheSize, isNodeCryptoAvailable, isWebCryptoAvailable, QueuePresets, RealtimePresets, detectDeploymentTargets, resolveDeploymentMode, deploymentCoexistenceError, resolveCloudProvider, TemplateBuilder, Pseudo, generateResourceName, generateLogicalId, getTimestamp, sanitizeName, resolveProjectStackName, resolveSiteStackName, resolveSiteResourceName, resolveSiteBucketName, resolveStorageBucketName, resolveDeployBucketName, resolveServerlessAppStackName, resolveServerlessArtifactBucketName, resolveServerlessAssetBucketName, DependencyGraph, analyzeStackDiff, formatDiff, Storage, Registry, CDN, DNS, Security, Compute, Network, FileSystem, Email, exports_incoming_call, Phone, Queue, JobLoader, StacksIntegration, exports_send, SMS, AI, Database, Cache, Permissions, ApiGateway, Messaging, Workflow, Monitoring, Auth, Deployment, AssetHasher, Secrets, ParameterStore, Search, Redirects, Communication, Fn2, Arn, AWS_PSEUDO_PARAMETERS, CloudFormationBuilder, buildCloudFormationTemplate, createStaticSitePreset, createNodeJsServerPreset, createNodeJsServerlessPreset, createServerlessNodePreset, createFullStackAppPreset, createApiBackendPreset, createWordPressPreset, createJamstackPreset, createMicroservicesPreset, createRealtimeAppPreset, createDataPipelinePreset, createMLApiPreset, createTraditionalWebAppPreset, createLaravelPreset, createServerlessLaravelPreset, createDashboardSite, resolveDashboardDomain, resolveDashboardDomains, hasManagementDashboardSite, MANAGEMENT_DASHBOARD_SITE_PREFIX, managementDashboardSiteName, isManagementDashboardSiteName, resolveManagementDashboardSites, resolveManagementDashboardSite, extendPreset, composePresets, createPreset, mergeInfrastructure, withMonitoring, withSecurity, withDatabase, withCache, withCDN, withQueue, fromEnvironment, fromSharedCredentials, fromEC2Metadata, fromECSMetadata, fromWebIdentity, getCredentials, createCredentialProvider, resolveCredentials, resolveRegion, getAccountId, S3Error, createS3Client, CloudError, ConfigurationError, CredentialError, DeploymentError, ValidationError, AWSAPIError, ErrorCodes, getErrorDetails, createError, DebugLogger, validateConfiguration, detectMisconfigurations, validateCredentials, checkIAMPermissions, getRequiredPermissions, suggestIAMPolicy, DEFAULT_SERVICE_LIMITS, checkServiceQuotas, getQuotaUsageSummary, suggestQuotaIncrease, FileCache, TemplateCache, templateCache, hashFile, hashString, hashBuffer, hashDirectory, hashManifest, quickHash, findChangedFiles, HashCache, parallel, batch, parallelMap, parallelWithRetry, sequence, withTimeout, RateLimiter, chunk, processInChunks, diffTemplates, getDiffSummary, requiresReplacement, categorizeChanges, getDeploymentStrategy, getDiffStats, cloud_config_schema_default, validateAgainstSchema, defaultLocalConfig, getLocalConfig, isLocalDevelopment, getLocalEndpoint, getLocalCredentials, getLocalEnvVars, MockCloudFormation, MockS3, MockDynamoDB, createMockAWS, PreviewEnvironmentManager, previewManager, generatePreviewWorkflow, generateCleanupWorkflow, generateCostReportWorkflow, PreviewNotificationService, previewNotifications, formatTable, formatTree, formatProgressBar, formatBytes, formatDuration, formatList, formatKeyValue, ProgressBar, MultiStepProgress, Spinner, TaskList, suggestCommand, formatSuggestion, isLikelyTypo, getContextualHelp, searchCommands, autocomplete, suggestFlags, formatFlagSuggestions, getCommandUsage, validateCommand, REPL, REPLContext, REPLCommandBuilder, CommandHistory, formatHistory, formatHistoryStats, MultiRegionManager, multiRegionManager, CrossRegionReferenceManager, GlobalResourceManager, RegionPairManager, StackDependencyManager, crossRegionReferenceManager, globalResourceManager, regionPairManager, stackDependencyManager, AWS_REGIONS, getRegion, getAllRegions, getRegionsByLocation, getRegionsByCompliance, getRegionsByPricingTier, isValidRegion, getClosestRegion, suggestRegions, suggestRegionPairs, formatRegion, formatRegionList, getRegionStats, MultiAccountManager, OrganizationManager, multiAccountManager, organizationManager, RECOMMENDED_ACCOUNT_STRUCTURES, RECOMMENDED_SCPS, COMMON_CROSS_ACCOUNT_ROLES, getRecommendedStructure, generateCrossAccountRoleCF, validateAccountStructure, formatAccountStructure, generateDeploymentWorkflow, generateMultiEnvWorkflow, generatePRPreviewWorkflow, generateScheduledWorkflow, generateMatrixWorkflow, generateDeploymentPipeline, generateMultiEnvPipeline, generatePreviewPipeline, generateScheduledPipeline, generateManualPipeline, generateDeploymentConfig, generateMultiEnvConfig, generateScheduledConfig, generateApprovalConfig, generateParallelConfig, BackupManager, backupManager, DisasterRecoveryManager, drManager, AWSConfigManager, awsConfigManager, CloudTrailManager, cloudTrailManager, GuardDutyManager, guardDutyManager, SecurityHubManager, securityHubManager, BlueGreenManager, blueGreenManager, CanaryManager, canaryManager, ABTestManager, abTestManager, ProgressiveDeploymentManager, progressiveDeploymentManager, XRayManager, xrayManager, MetricsManager, metricsManager, LogsManager, logsManager, SyntheticsManager, syntheticsManager, MigrationManager, migrationManager, ReplicaManager, replicaManager, PerformanceManager, performanceManager, DatabaseUserManager, databaseUserManager, SecretsRotationManager, secretsRotationManager, SecretsManager, secretsManager, CertificateManager, certificateManager, SecurityScanningManager, securityScanningManager, ImageScanningManager, imageScanningManager, BuildOptimizationManager, buildOptimizationManager, ContainerRegistryManager, containerRegistryManager, ServiceMeshManager, serviceMeshManager, LambdaLayersManager, lambdaLayersManager, LambdaVersionsManager, lambdaVersionsManager, LambdaConcurrencyManager, lambdaConcurrencyManager, LambdaDestinationsManager, lambdaDestinationsManager, LambdaVPCManager, lambdaVPCManager, LambdaDLQManager, lambdaDLQManager, Route53RoutingManager, route53RoutingManager, DNSSECManager, dnssecManager, Route53ResolverManager, route53ResolverManager, BounceComplaintHandler, bounceComplaintHandler, EmailAnalyticsManager, emailAnalyticsManager, SenderReputationManager, senderReputationManager, EmailTemplateManager, emailTemplateManager, exports_advanced, exports_inbound, exports_advanced2, exports_advanced3, FIFOQueueManager, fifoQueueManager, DLQMonitoringManager, dlqMonitoringManager, BatchProcessingManager, batchProcessingManager, QueueManagementManager, queueManagementManager, createZip, generateBootstrap, runBuildHooks, sha256, artifactKey, packageServerlessApp, MANAGED_NODE_VERSIONS, resolveServerlessRuntime, resolveQueues, resolveQueueNames, composeServerlessAppTemplate, PHP_LAYER_EXTENSIONS, phpLayerPackages, phpLayerBuildStage, generatePhpLayerDockerfile, generateAppImageDockerfile, sharedRuntimeLoop, buildNodeRuntimeLayerZip, buildBunRuntimeLayerZip, resolveApp, eventToRequest, responseToResult, createHttpHandler, createQueueHandler, createCliHandler, createHandlers, generatePhpFpmConfig, phpRuntimeLayerAssets, laravelServerlessEnvDefaults, LARAVEL_SERVERLESS_BUILD_STEPS, buildPhpRuntimeLayerZip, PHP_DEFAULT_EXCLUDES, runPhpBuildHooks, collectPhpAppEntries, packagePhpApp, StaticSiteManager, staticSiteManager, StorageAdvancedManager, storageAdvancedManager, HealthCheckManager, healthCheckManager, NetworkSecurityManager, networkSecurityManager, ResourceManagementManager, resourceManagementManager };
@@ -5,7 +5,7 @@ import {
5
5
  resolveCloudProvider,
6
6
  resolveManagementDashboardSites,
7
7
  resolveProjectStackName
8
- } from "./chunk-vsgkcpqw.js";
8
+ } from "./chunk-49nmy775.js";
9
9
  import {
10
10
  EC2Client,
11
11
  SSMClient
@@ -3548,6 +3548,24 @@ function buildPruneReleases(paths, keep = DEFAULT_KEEP_RELEASES) {
3548
3548
  "done"
3549
3549
  ];
3550
3550
  }
3551
+ function siteOwnerPath(base) {
3552
+ return `${deployMetaDir(base)}/owner`;
3553
+ }
3554
+ function buildSiteOwnerGuard(base, slug) {
3555
+ const owner = siteOwnerPath(base);
3556
+ return [
3557
+ `if [ -f "${owner}" ]; then`,
3558
+ ` TS_CLOUD_OWNER=$(cat "${owner}")`,
3559
+ ` if [ "$TS_CLOUD_OWNER" != "${slug}" ]; then`,
3560
+ ` echo "[ts-cloud] REFUSING deploy: ${base} belongs to project '$TS_CLOUD_OWNER', not '${slug}'. Another project on this box derives the same site key — give one of them a distinct site name/domain, or remove ${owner} to transfer ownership." >&2`,
3561
+ " exit 1",
3562
+ " fi",
3563
+ "else",
3564
+ ` mkdir -p "$(dirname "${owner}")"`,
3565
+ ` printf '%s\\n' "${slug}" > "${owner}"`,
3566
+ "fi"
3567
+ ];
3568
+ }
3551
3569
  function buildDeployHistoryHeader(base, options) {
3552
3570
  const meta = deployMetaDir(base);
3553
3571
  const log = deployLogPath(base, options.releaseId);
@@ -3827,7 +3845,7 @@ function buildManagementDashboardArtifact(site, options) {
3827
3845
  logger.warn(`Management dashboard: build output not found at ${root} — skipping dashboard artifact.`);
3828
3846
  return null;
3829
3847
  }
3830
- const tarball = join4(tmpdir(), `${options.slug}-${MANAGEMENT_DASHBOARD_SITE}-${options.sha}.tar.gz`);
3848
+ const tarball = join4(tmpdir(), `${options.slug}-${options.siteName ?? MANAGEMENT_DASHBOARD_SITE}-${options.sha}.tar.gz`);
3831
3849
  execSync2(`tar czf "${tarball}" -C "${root}" .`, { stdio: "inherit" });
3832
3850
  return tarball;
3833
3851
  } catch (error) {
@@ -4404,7 +4422,7 @@ async function deploySiteRelease(driver, options, logger = noopLogger2) {
4404
4422
  logger.step(`Deploying PHP site '${siteName}' to ${targets.length} target(s)...`);
4405
4423
  const phpResult = await driver.runRemoteDeploy({
4406
4424
  targets,
4407
- commands: [...deployScript, ...poolScript, ...vhostScript, ...sslScript, ...servicesScript2, ...healthCheckScript],
4425
+ commands: [...buildSiteOwnerGuard(appBase, slug), ...deployScript, ...poolScript, ...vhostScript, ...sslScript, ...servicesScript2, ...healthCheckScript],
4408
4426
  comment: `ts-cloud deploy ${slug}/${siteName}@${sha}`,
4409
4427
  tags: { Project: slug, Environment: environment, Role: "app" }
4410
4428
  });
@@ -4479,6 +4497,7 @@ async function deploySiteRelease(driver, options, logger = noopLogger2) {
4479
4497
  commit: sha,
4480
4498
  branch: site.branch ?? "main"
4481
4499
  }),
4500
+ ...buildSiteOwnerGuard(`/var/www/${siteName}`, slug),
4482
4501
  ...baseScript,
4483
4502
  ...staticVhost,
4484
4503
  ...staticSsl,
@@ -4521,7 +4540,7 @@ async function deployAllComputeSites(options) {
4521
4540
  let dashboardTarball = null;
4522
4541
  const dashboardTarballBySite = new Map;
4523
4542
  if (injectedDashboardSites.length > 0) {
4524
- dashboardTarball = buildManagementDashboardArtifact(config.sites?.[injectedDashboardSites[0]], { cwd, slug, sha, logger: { info: logger.info, warn: logger.warn } });
4543
+ dashboardTarball = buildManagementDashboardArtifact(config.sites?.[injectedDashboardSites[0]], { cwd, slug, sha, siteName: injectedDashboardSites[0], logger: { info: logger.info, warn: logger.warn } });
4525
4544
  if (!dashboardTarball) {
4526
4545
  logger.warn("Management dashboard: no artifact available — skipping dashboard site(s) for this deploy.");
4527
4546
  for (const name of injectedDashboardSites) {
@@ -4530,7 +4549,7 @@ async function deployAllComputeSites(options) {
4530
4549
  }
4531
4550
  } else {
4532
4551
  for (const name of injectedDashboardSites) {
4533
- if (name === MANAGEMENT_DASHBOARD_SITE) {
4552
+ if (name === injectedDashboardSites[0]) {
4534
4553
  dashboardTarballBySite.set(name, dashboardTarball);
4535
4554
  continue;
4536
4555
  }
@@ -6,7 +6,7 @@ import {
6
6
  step,
7
7
  success,
8
8
  warn
9
- } from "./chunk-m03vddvr.js";
9
+ } from "./chunk-qgnyzfmx.js";
10
10
  import {
11
11
  CloudWatchLogsClient,
12
12
  CostExplorerClient,
@@ -26,7 +26,7 @@ import {
26
26
  resolveSiteFramework,
27
27
  resolveSiteKind,
28
28
  resolveUiSource
29
- } from "./chunk-jg4f2ybx.js";
29
+ } from "./chunk-6agm101w.js";
30
30
  import {
31
31
  artifactKey,
32
32
  composeServerlessAppTemplate,
@@ -40,7 +40,7 @@ import {
40
40
  resolveServerlessArtifactBucketName,
41
41
  resolveServerlessAssetBucketName,
42
42
  resolveServerlessRuntime
43
- } from "./chunk-vsgkcpqw.js";
43
+ } from "./chunk-49nmy775.js";
44
44
  import {
45
45
  deployStaticSiteWithExternalDnsFull
46
46
  } from "./chunk-d7p84vz5.js";
@@ -345,7 +345,7 @@ async function deployServerlessApp(config, environment, opts = {}) {
345
345
  }
346
346
  if (imageMode) {
347
347
  step("Building + pushing container image");
348
- const { buildAndPushServerlessImage } = await import("./chunk-9ra8b9b4.js");
348
+ const { buildAndPushServerlessImage } = await import("./chunk-296n8hvt.js");
349
349
  const built = await buildAndPushServerlessImage({
350
350
  app,
351
351
  projectRoot,
@@ -8,7 +8,7 @@ import {
8
8
  phpRuntimeLayerAssets,
9
9
  runPhpBuildHooks,
10
10
  sha256
11
- } from "./chunk-vsgkcpqw.js";
11
+ } from "./chunk-49nmy775.js";
12
12
 
13
13
  // src/deploy/serverless-image.ts
14
14
  import { execFileSync } from "node:child_process";
@@ -12,10 +12,10 @@ import {
12
12
  sanitizeCloudConfig,
13
13
  setMaintenance,
14
14
  startLocalDashboardServer
15
- } from "../chunk-fy85hcfy.js";
15
+ } from "../chunk-mbpxadga.js";
16
16
  import {
17
17
  buildAndPushServerlessImage
18
- } from "../chunk-m03vddvr.js";
18
+ } from "../chunk-qgnyzfmx.js";
19
19
  import"../chunk-b82pbxyp.js";
20
20
  import"../chunk-hsk6fe6x.js";
21
21
  import {
@@ -29,8 +29,8 @@ import {
29
29
  resolveSiteKind,
30
30
  resolveUiSource,
31
31
  validateDeploymentConfig
32
- } from "../chunk-jg4f2ybx.js";
33
- import"../chunk-vsgkcpqw.js";
32
+ } from "../chunk-6agm101w.js";
33
+ import"../chunk-49nmy775.js";
34
34
  import"../chunk-93hjhs78.js";
35
35
  import {
36
36
  deleteStaticSite,
@@ -20,7 +20,13 @@
20
20
  * - `TS_CLOUD_UI_DISABLE` set truthy to skip auto-deploy
21
21
  */
22
22
  import type { CloudConfig } from '@ts-cloud/core';
23
- /** Site key under which the management dashboard is auto-injected. */
23
+ /**
24
+ * Legacy site key for the management dashboard. Auto-injected dashboards are
25
+ * now keyed per domain (`dashboard-<apex-dashed>`, see
26
+ * `managementDashboardSiteName` in `@ts-cloud/core`) so tenants sharing a box
27
+ * via `attachTo` never collide on `/var/www/dashboard`. This bare key remains
28
+ * only for hand-configured dashboards and pre-0.8 deploys.
29
+ */
24
30
  export declare const MANAGEMENT_DASHBOARD_SITE = "dashboard";
25
31
  /** Where an auto-generated dashboard password is persisted (per project checkout). */
26
32
  export declare const DASHBOARD_CREDENTIALS_FILE: string;
@@ -68,6 +74,8 @@ export interface BuildDashboardArtifactOptions {
68
74
  cwd?: string;
69
75
  slug: string;
70
76
  sha: string;
77
+ /** Site key the tarball is staged under. @default MANAGEMENT_DASHBOARD_SITE */
78
+ siteName?: string;
71
79
  logger?: EnsureDashboardLogger;
72
80
  }
73
81
  /**
@@ -48,8 +48,8 @@ import {
48
48
  waitForCloudInit,
49
49
  waitForSsh,
50
50
  wrapCloudInitUserData
51
- } from "../chunk-jg4f2ybx.js";
52
- import"../chunk-vsgkcpqw.js";
51
+ } from "../chunk-6agm101w.js";
52
+ import"../chunk-49nmy775.js";
53
53
  import"../chunk-93hjhs78.js";
54
54
  import"../chunk-qpj3edwz.js";
55
55
  import"../chunk-vd87cpvn.js";
@@ -77,6 +77,18 @@ export declare function buildRollbackScript(paths: ReleasePaths, options?: {
77
77
  * at the newest, so it is never pruned.
78
78
  */
79
79
  export declare function buildPruneReleases(paths: ReleasePaths, keep?: number): string[];
80
+ /** Owner marker recording which project a site's base dir belongs to. */
81
+ export declare function siteOwnerPath(base: string): string;
82
+ /**
83
+ * Guard a site's base dir against cross-project deploys on a shared box
84
+ * (`attachTo`): the first deploy stamps `<base>/.ts-cloud/owner` with the
85
+ * project slug; a later deploy whose slug differs fails loudly instead of
86
+ * silently overwriting another tenant's releases. Two projects can only trip
87
+ * this by deriving the same site key (e.g. both claiming the same domain),
88
+ * which is a config conflict the operator must resolve — not one deploys
89
+ * should paper over. Emitted before anything mutates the dir.
90
+ */
91
+ export declare function buildSiteOwnerGuard(base: string, slug: string): string[];
80
92
  export interface DeployHistoryOptions {
81
93
  /** This deploy's release id. */
82
94
  releaseId: string;
package/dist/index.js CHANGED
@@ -55,10 +55,10 @@ import {
55
55
  sanitizeCloudConfig,
56
56
  setMaintenance,
57
57
  startLocalDashboardServer
58
- } from "./chunk-fy85hcfy.js";
58
+ } from "./chunk-mbpxadga.js";
59
59
  import {
60
60
  buildAndPushServerlessImage
61
- } from "./chunk-m03vddvr.js";
61
+ } from "./chunk-qgnyzfmx.js";
62
62
  import {
63
63
  CloudWatchLogsClient,
64
64
  EFSClient,
@@ -105,7 +105,7 @@ import {
105
105
  waitForCloudInit,
106
106
  waitForSsh,
107
107
  wrapCloudInitUserData
108
- } from "./chunk-jg4f2ybx.js";
108
+ } from "./chunk-6agm101w.js";
109
109
  import {
110
110
  ABTestManager,
111
111
  AI,
@@ -412,6 +412,7 @@ import {
412
412
  makeAWSRequest,
413
413
  makeAWSRequestAsync,
414
414
  makeAWSRequestOnce,
415
+ managementDashboardSiteName,
415
416
  mergeInfrastructure,
416
417
  metricsManager,
417
418
  migrationManager,
@@ -503,7 +504,7 @@ import {
503
504
  withSecurity,
504
505
  withTimeout,
505
506
  xrayManager
506
- } from "./chunk-vsgkcpqw.js";
507
+ } from "./chunk-49nmy775.js";
507
508
  import {
508
509
  EC2Client,
509
510
  SSMClient
@@ -4757,6 +4758,7 @@ export {
4757
4758
  migrateObjectStorage,
4758
4759
  metricsManager,
4759
4760
  mergeInfrastructure,
4761
+ managementDashboardSiteName,
4760
4762
  makeAWSRequestOnce,
4761
4763
  makeAWSRequestAsync,
4762
4764
  makeAWSRequest,