11import type { CLI } from '@stacksjs/clapp'
22import { existsSync , statSync , writeFileSync , copyFileSync , readFileSync } from 'node:fs'
33import * as cli from '../../src/utils/cli'
4+
5+ const isCI = ! ! process . env . CI || ! ! process . env . GITHUB_ACTIONS
6+
7+ /** Create a spinner that falls back to plain logs in CI */
8+ function createSpinner ( message : string ) {
9+ if ( isCI ) {
10+ console . log ( message )
11+ return {
12+ start ( ) { } ,
13+ succeed ( msg : string ) { console . log ( `✓ ${ msg } ` ) } ,
14+ fail ( msg : string ) { console . error ( `✗ ${ msg } ` ) } ,
15+ stop ( ) { } ,
16+ }
17+ }
18+ const s = createSpinner ( message )
19+ return s
20+ }
421import { InfrastructureGenerator } from '../../src/generators/infrastructure'
522import { CloudFormationClient } from '../../src/aws/cloudformation'
623import { S3Client } from '../../src/aws/s3'
@@ -301,7 +318,7 @@ export function registerDeployCommands(app: CLI): void {
301318
302319 if ( stackExists ) {
303320 cli . info ( 'Stack exists, updating...' )
304- const updateSpinner = new cli . Spinner ( 'Updating CloudFormation stack...' )
321+ const updateSpinner = createSpinner ( 'Updating CloudFormation stack...' )
305322 updateSpinner . start ( )
306323
307324 try {
@@ -335,7 +352,7 @@ export function registerDeployCommands(app: CLI): void {
335352 }
336353 else {
337354 cli . info ( 'Creating new stack...' )
338- const createSpinner = new cli . Spinner ( 'Creating CloudFormation stack...' )
355+ const createSpinner = createSpinner ( 'Creating CloudFormation stack...' )
339356 createSpinner . start ( )
340357
341358 await cfn . createStack ( {
@@ -409,7 +426,7 @@ https://console.aws.amazon.com/cloudformation/home?region=${region}#/stacks/stac
409426 cli . step ( 'Generating EC2 server infrastructure...' )
410427
411428 // TODO: Generate server-specific infrastructure
412- const spinner = new cli . Spinner ( 'Deploying server infrastructure...' )
429+ const spinner = createSpinner ( 'Deploying server infrastructure...' )
413430 spinner . start ( )
414431
415432 await new Promise ( resolve => setTimeout ( resolve , 2000 ) )
@@ -449,7 +466,7 @@ https://console.aws.amazon.com/cloudformation/home?region=${region}#/stacks/stac
449466
450467 cli . step ( 'Generating serverless infrastructure...' )
451468
452- const spinner = new cli . Spinner ( 'Deploying serverless infrastructure...' )
469+ const spinner = createSpinner ( 'Deploying serverless infrastructure...' )
453470 spinner . start ( )
454471
455472 await new Promise ( resolve => setTimeout ( resolve , 2000 ) )
@@ -483,7 +500,7 @@ https://console.aws.amazon.com/cloudformation/home?region=${region}#/stacks/stac
483500 cli . info ( `Stack: ${ stackName } ` )
484501 cli . info ( `Region: ${ region } ` )
485502
486- const spinner = new cli . Spinner ( 'Checking deployment status...' )
503+ const spinner = createSpinner ( 'Checking deployment status...' )
487504 spinner . start ( )
488505
489506 const cfn = new CloudFormationClient ( region )
@@ -541,7 +558,7 @@ https://console.aws.amazon.com/cloudformation/home?region=${region}#/stacks/stac
541558 return
542559 }
543560
544- const spinner = new cli . Spinner ( 'Rolling back stack...' )
561+ const spinner = createSpinner ( 'Rolling back stack...' )
545562 spinner . start ( )
546563
547564 const cfn = new CloudFormationClient ( region )
@@ -656,7 +673,7 @@ https://console.aws.amazon.com/cloudformation/home?region=${region}#/stacks/stac
656673
657674 // Step 1: Upload to S3
658675 const s3 = new S3Client ( region )
659- const uploadSpinner = new cli . Spinner ( 'Uploading files to S3...' )
676+ const uploadSpinner = createSpinner ( 'Uploading files to S3...' )
660677 uploadSpinner . start ( )
661678
662679 await s3 . sync ( {
@@ -678,7 +695,7 @@ https://console.aws.amazon.com/cloudformation/home?region=${region}#/stacks/stac
678695 // Step 2: Invalidate CloudFront (if distribution provided)
679696 if ( shouldInvalidate && distributionId ) {
680697 const cloudfront = new CloudFrontClient ( )
681- const invalidateSpinner = new cli . Spinner ( 'Invalidating CloudFront cache...' )
698+ const invalidateSpinner = createSpinner ( 'Invalidating CloudFront cache...' )
682699 invalidateSpinner . start ( )
683700
684701 const invalidation = await cloudfront . invalidateAll ( distributionId )
@@ -687,7 +704,7 @@ https://console.aws.amazon.com/cloudformation/home?region=${region}#/stacks/stac
687704 cli . info ( `Invalidation ID: ${ invalidation . Id } ` )
688705
689706 if ( shouldWait ) {
690- const waitSpinner = new cli . Spinner ( 'Waiting for invalidation to complete...' )
707+ const waitSpinner = createSpinner ( 'Waiting for invalidation to complete...' )
691708 waitSpinner . start ( )
692709 await cloudfront . waitForInvalidation ( distributionId , invalidation . Id )
693710 waitSpinner . succeed ( 'Invalidation completed!' )
@@ -808,7 +825,7 @@ https://${bucket}.s3.${region}.amazonaws.com${prefix ? `/${prefix}` : ''}/index.
808825 const ecs = new ECSClient ( region )
809826
810827 // Step 1: Get ECR login credentials
811- const loginSpinner = new cli . Spinner ( 'Getting ECR credentials...' )
828+ const loginSpinner = createSpinner ( 'Getting ECR credentials...' )
812829 loginSpinner . start ( )
813830
814831 const authResult = await ecr . getAuthorizationToken ( )
@@ -824,7 +841,7 @@ https://${bucket}.s3.${region}.amazonaws.com${prefix ? `/${prefix}` : ''}/index.
824841 loginSpinner . succeed ( 'ECR credentials obtained' )
825842
826843 // Step 2: Docker login to ECR
827- const dockerLoginSpinner = new cli . Spinner ( 'Logging into ECR...' )
844+ const dockerLoginSpinner = createSpinner ( 'Logging into ECR...' )
828845 dockerLoginSpinner . start ( )
829846
830847 const token = auth . authorizationToken || ''
@@ -850,7 +867,7 @@ https://${bucket}.s3.${region}.amazonaws.com${prefix ? `/${prefix}` : ''}/index.
850867 dockerLoginSpinner . succeed ( 'Logged into ECR' )
851868
852869 // Step 3: Build Docker image
853- const buildSpinner = new cli . Spinner ( 'Building Docker image...' )
870+ const buildSpinner = createSpinner ( 'Building Docker image...' )
854871 buildSpinner . start ( )
855872
856873 const imageUri = `${ registryHost } /${ repository } :${ imageTag } `
@@ -871,7 +888,7 @@ https://${bucket}.s3.${region}.amazonaws.com${prefix ? `/${prefix}` : ''}/index.
871888 buildSpinner . succeed ( 'Docker image built' )
872889
873890 // Step 4: Push to ECR
874- const pushSpinner = new cli . Spinner ( 'Pushing image to ECR...' )
891+ const pushSpinner = createSpinner ( 'Pushing image to ECR...' )
875892 pushSpinner . start ( )
876893
877894 const dockerPush = spawn ( 'docker' , [ 'push' , imageUri ] , {
@@ -890,7 +907,7 @@ https://${bucket}.s3.${region}.amazonaws.com${prefix ? `/${prefix}` : ''}/index.
890907 pushSpinner . succeed ( 'Image pushed to ECR' )
891908
892909 // Step 5: Update ECS service
893- const updateSpinner = new cli . Spinner ( 'Updating ECS service...' )
910+ const updateSpinner = createSpinner ( 'Updating ECS service...' )
894911 updateSpinner . start ( )
895912
896913 await ecs . updateService ( {
@@ -903,7 +920,7 @@ https://${bucket}.s3.${region}.amazonaws.com${prefix ? `/${prefix}` : ''}/index.
903920
904921 // Step 6: Wait for deployment (if requested)
905922 if ( shouldWait ) {
906- const waitSpinner = new cli . Spinner ( 'Waiting for deployment to stabilize...' )
923+ const waitSpinner = createSpinner ( 'Waiting for deployment to stabilize...' )
907924 waitSpinner . start ( )
908925
909926 await ecs . waitForServiceStable ( cluster , service )
0 commit comments