diff --git a/package-lock.json b/package-lock.json index 1249bc1..c5c6489 100644 --- a/package-lock.json +++ b/package-lock.json @@ -471,6 +471,14 @@ "strip-json-comments": "~2.0.1", "table": "4.0.2", "text-table": "~0.2.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "eslint-config-airbnb": { @@ -1147,6 +1155,14 @@ "is-builtin-module": "^1.0.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "object-assign": { @@ -1499,10 +1515,27 @@ "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } }, "shebang-command": { "version": "1.2.0", diff --git a/package.json b/package.json index 8c90744..7e9f37e 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "eslint-plugin-react": "^7.5.1" }, "dependencies": { - "aws-sdk": "^2.385.0" + "aws-sdk": "^2.385.0", + "semver": "^7.3.2" } } diff --git a/src/index.js b/src/index.js index 4d2ebdf..5a67e6c 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,5 @@ const AWS = require('aws-sdk') +const semver = require('semver') const getApiName = async function getApiName(serviceName, stage, region, creds) { const cfn = new AWS.CloudFormation({ @@ -21,11 +22,31 @@ const getApiName = async function getApiName(serviceName, stage, region, creds) return apiName } -const getSwagger = async function getSwagger(apiName, stage, region, creds) { +const getSwagger = async function getSwagger(apiName, stage, region, creds, serverless) { const ag = new AWS.APIGateway({ credentials: creds, region, }) + // Get version of currently published documentation. + const apiStage = await ag.getStage({ + restApiId: apiName, + stageName: stage, + }).promise() + // Pump up version. + let documentationVersion = '1.0.0' + if (apiStage.documentationVersion) { + documentationVersion = semver.clean(apiStage.documentationVersion) + } + serverless.cli.consoleLog(`ExportSwagger: Current API Version: ${documentationVersion}.`) + const bumpedVersion = semver.inc(documentationVersion, 'patch') + serverless.cli.consoleLog(`ExportSwagger: Next API Version: ${bumpedVersion}.`) + // Publish new version. + await ag.createDocumentationVersion({ + documentationVersion: bumpedVersion, + restApiId: apiName, + stageName: stage, + }).promise() + // Get swagger export of newly published documentation version. const swagger = await ag.getExport({ exportType: 'swagger', restApiId: apiName, @@ -67,7 +88,7 @@ const exportApi = async function exportApi(serverless) { const serviceName = serverless.service.getServiceName() const { bucket, key } = getBucketAndKey(serverless) const apiName = await getApiName(serviceName, stage, region, awsCredentials) - const swagger = await getSwagger(apiName, stage, region, awsCredentials) + const swagger = await getSwagger(apiName, stage, region, awsCredentials, serverless) await uploadSwaggerToS3(swagger, bucket, key, region, awsCredentials) serverless.cli.consoleLog('ExportSwagger: File uploaded to s3.') } @@ -88,3 +109,4 @@ class ExportSwagger { } module.exports = ExportSwagger +