UNPKG

@architect/deploy

Version:
89 lines (80 loc) 3.12 kB
let aws = require('aws-sdk') let { toLogicalID } = require('@architect/utils') let series = require('run-series') /** * Check current infra for compatibility */ module.exports = function compat (params, callback) { let { inv, stackname } = params let result = {} series([ function getApiType (callback) { if (inv.http && (!inv.aws.apigateway || inv.aws.apigateway === 'rest')) { let deployPlugins = inv.plugins?._methods?.deploy?.start let hasRestPlugin = deployPlugins?.find(({ plugin }) => plugin === 'architect/plugin-rest-api') // Look for a legacy REST API in the stack; HTTP API resource IDs are simply 'HTTP' let resource = toLogicalID(inv.app) getResources(resource, stackname, callback, resources => { let api = resources[0] && resources[0].ResourceType if (api === 'AWS::ApiGateway::RestApi' && !hasRestPlugin) { let msg = 'Architect REST APIs are now supported via `@architect/plugin-rest-api`; please install that plugin and add `apigateway rest` to your @aws pragma' callback(Error(msg)) } else callback() }) } else callback() }, // There exists a fun bug in API Gateway V2 WebSockets that prevents renaming resources function getWSFormat (callback) { if (inv.ws) { // Look for older (pre Arc 8.3) WebSocket resources in the stack let resource = 'WebsocketDefaultRoute' getResources(resource, stackname, callback, resources => { result.foundEarlierWS = resources.length ? true : false callback() }) } else callback() }, function getEventsParam (callback) { if (inv.events) { // Look for older (pre Arc 8.3) WebSocket resources in the stack let resource = `${toLogicalID(inv.events[0].name)}TopicParam` getResources(resource, stackname, callback, resources => { result.foundEarlierEvents = resources.length ? true : false callback() }) } else callback() }, function getBucket (callback) { if (inv.static) { let resource = 'StaticBucket' getResources(resource, stackname, callback, resources => { result.hasStaticBucket = resources.length ? true : false callback() }) } else callback() }, ], function done (err) { if (err) callback(err) else callback(null, result) }) } // Reusable CloudFormation resource getter: feed it a resource ID and stand back function getResources (LogicalResourceId, StackName, callback, next) { let cfn = new aws.CloudFormation() // Prefer describeStackResources against multiple specific known LogicalResourceIds // (as opposed to paginating & searching) cfn.describeStackResources({ StackName, LogicalResourceId }, function done (err, stack) { // First run (until they change the error message, anyway) if (err && err.message === `Stack with id ${StackName} does not exist`) callback() else if (err) callback(err) else next(stack.StackResources) }) }