2024-05-29 11:51:04 -04:00

91 lines
2.8 KiB
JavaScript

import validate from '../lib/validate.js'
import checkIfBucketExists from '../lib/check-if-bucket-exists.js'
import emptyS3Bucket from './lib/bucket.js'
import removeStack from './lib/stack.js'
import removeEcrRepository from './lib/ecr.js'
import monitorStack from '../lib/monitor-stack.js'
import checkIfEcrRepositoryExists from '../lib/check-if-ecr-repository-exists.js'
import utils from '@serverlessinc/sf-core/src/utils.js'
const { log, style, progress } = utils
const mainProgress = progress.get('main')
class AwsRemove {
constructor(serverless, options) {
this.serverless = serverless
this.options = options || {}
this.provider = this.serverless.getProvider('aws')
Object.assign(
this,
validate,
emptyS3Bucket,
removeStack,
monitorStack,
removeEcrRepository,
checkIfEcrRepositoryExists,
checkIfBucketExists,
)
this.hooks = {
initialize: async () => {
if (this.serverless.processedInput.commands.join(' ') === 'remove') {
log.notice(
`Removing "${
this.serverless.service.service
}" from stage "${this.serverless
.getProvider('aws')
.getStage()}" ${style.aside(
`(${this.serverless.getProvider('aws').getRegion()})`,
)}`,
)
// This is used to ensure that for `remove` command, the `accountId` will be resolved and available
// for `generatePayload` telemetry logic
this.provider.getAccountId().then(
(accountId) => (this.provider.accountId = accountId),
() => {
/* pass on all errors */
},
)
}
},
'remove:remove': async () => {
const doesEcrRepositoryExistPromise = this.checkIfEcrRepositoryExists()
await this.validate()
mainProgress.notice('Removing objects from S3 bucket', {
isMainEvent: true,
})
await this.emptyS3Bucket()
mainProgress.notice('Removing AWS CloudFormation stack', {
isMainEvent: true,
})
const cfData = await this.removeStack()
await this.monitorStack('delete', cfData)
if (await doesEcrRepositoryExistPromise) {
mainProgress.notice('Removing ECR repository', { isMainEvent: true })
await this.removeEcrRepository()
}
},
finalize: async () => {
if (this.serverless.processedInput.commands.join(' ') !== 'remove')
return
log.success(
`Service ${
this.serverless.service.service
} has been successfully removed ${style.aside(
`(${Math.floor(
(Date.now() - this.serverless.pluginManager.commandRunStartTime) /
1000,
)}s)`,
)}`,
)
},
}
}
}
export default AwsRemove