diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 459484f..0000000 --- a/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -tmp -jest diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 12247e0..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - "extends": "airbnb-base", - "plugins": ["import"], - "rules": { - "func-names": "off", - - // support for node v4 - "strict": "off", - "prefer-rest-params": "off", - "react/require-extension" : "off", - "import/no-extraneous-dependencies" : "off" - }, - "env": { - "jest": true - } -}; diff --git a/.gitignore b/.gitignore index fd7efd3..1a0d757 100644 --- a/.gitignore +++ b/.gitignore @@ -1,44 +1,6 @@ -# Logs -*.log -npm-debug.log* - -# Runtime data -pids -*.pid -*.seed - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules -jspm_packages - -# Optional npm cache directory -.npm - -# Optional REPL history -.node_repl_history - -# Jest -jest* - -# ESLint -.eslintcache - -package-lock.json +/.eslintcache +/.nyc_output +/coverage +/node_modules +npm-debug.log +/package-lock.json diff --git a/.travis.yml b/.travis.yml index 90571a1..c02b9de 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,26 +1,157 @@ language: node_js -matrix: - include: - - node_js: '4' - - node_js: '6' - - node_js: '8' - - node_js: '10' - - node_js: '10' - env: - - DISABLE_TESTS=true - - LINTING=true +git: + # Minimize git history, but ensure to not break things: + # - Merging multiple PR's around same time may introduce a case where it's not + # the last merge commit that is to be tested + # - Aside of merge commit we need a previous commit to be able to detect a version switch + depth: 30 + +cache: + # Not relying on 'npm' shortcut, as per Travis docs it's the only 'node_modules' that it'll cache + directories: + - $HOME/.npm + - node_modules + +branches: + only: # Do not build PR branches + # Release branches + - master + # Release tags + - /^v\d+\.\d+\.\d+$/ # Ensure to build release tags -sudo: false +stages: + - name: Test + if: tag IS NOT present + - name: Tag on Release + if: branch = master AND type = push + - name: Deploy + if: tag =~ ^v\d+\.\d+\.\d+$ +env: + global: + - FORCE_COLOR=1 # Ensure colored output (color support is not detected in some cases) + +# Ensure to install dependencies at their latest versions install: - - travis_retry npm install + # Note: `npm update` has issues which we need to workaround: + # - There seems no way to update all project dependency groups in one run + # Hence different calls for prod and dev dependencies + # - The bigger depth, the longer update takes (-9999 as proposed in npm docs hangs the process). + # Therefore we keep at 3 which should ensure most of dependencies are at latest versions + # - Depth setting makes optional dependencies not optional (install error crashes process) + # Hence we skip install of optional dependencies completely, with --no-optional + # Note: this patch works only for npm@5+ + # - npm documents --dev option for dev dependencies update, but it's only --save-dev that works + - npm update --depth 3 --no-optional --no-save + - npm update --depth 3 --save-dev --no-save + +before_script: + # Fail build right after first script fails. Travis doesn't ensure that: https://github.com/travis-ci/travis-ci/issues/1066 + # More info on below line: https://www.davidpashley.com/articles/writing-robust-shell-scripts/#idm5413512 + - set -e + - git config --global user.email "platform@serverless.com" + - git config --global user.name "Serverless CI" + +jobs: + include: + # In most cases it's best to configure one job per platform & Node.js version combination + # (job boot & setup takes ca 1 minute, one task run lasts ca few seconds) -script: - - npm test + # PR's from branches + # Ensure commit messages follow CC, and confirm on changelog in case of release PR's + - name: 'Prettier check updated, Lint updated, Commitlint, Changelog confirm (on release), Unit Tests - Node.js v12' + if: type = pull_request AND fork = false + node_js: 12 + script: + - npm run prettier-check:updated + - npm run lint:updated + - npm run commitlint:pull-request + # If release PR, confirm we have a changelog + - | + tagName=`git diff -U0 master package.json | grep '"version": "' | tail -n 1 | grep -oE "[0-9]+\.[0-9]+\.[0-9]+"` || : + if [ -n "$tagName" ]; + then + npx dump-release-notes-from-cc-changelog $tagName + fi + - npm test -script: - - if [[ ! -z "$DISABLE_TESTS" && ! -z "$LINTING" ]]; then npm run lint; fi + # PR's from forks + # Do not validate commit messages, + # (if user didn't ensure CC, PR should be squash merged with a valid CC commit message) + - name: 'Prettier check updated, Lint updated, Unit Tests - Node.js v12' + if: type = pull_request AND fork = true + node_js: 12 + script: + - npm run prettier-check:updated + - npm run lint:updated + - npm test -after_success: - - ./node_modules/jest/bin/jest.js --coverage && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage + # master branch + - name: 'Unit Tests - Node.js v12' + if: type != pull_request + node_js: 12 + + - name: 'Unit Tests, Coverage - Node.js v13' + node_js: 13 + script: + - npm run coverage + - cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js + + - name: 'Unit Tests - Node.js v10' + node_js: 10 + + - name: 'Unit Tests - Node.js v8' + node_js: 8 + + - name: 'Unit Tests - Node.js v6' + node_js: 6 + before_install: + # npm@3 doesn't seem handle `--no-optional` option of `npm update` command. + # Upgrade npm to version which is distributed with Node.js v8 + - npm i -g npm@6.4.1 + + - stage: Tag on Release + name: 'Tag on Release' + node_js: 12 + env: + # GITHUB_TOKEN + - secure: Eu4uYULeMcBVkj3AJxKTGTytCkGBDZAl5z/26Jnv1sH3hK02UQeJdE2L8gTk/TfMS/MMLInSb0YqD4S8qEz6C3zg4Q9z9/N653JaKSbpQPjjc8BsOaZlgo0rrUJWu/BwdYLou1zAhAGd4cUtyAAnIkvJW30XAnH6A73EyGY3GgRRIUGb/PxUB2cHrqalq/V/u6kuNw5Sf26SmVVdJMhj5/es+kQdI2EeykEQMO2FRXKV2GRXs5TFikW/doTENHQAK6QPWJbVX1PHF4Via9vJuLhaOo4QjH3XCpDYX5UYsR7gvOChSsY3VMjHgLkjgTyabiv0mnrhjsLkkvlVsSzmmYmMShyGbJSjnqAa+C69oGFJo9Tim5qQOEJIZ5R7A1ctS8wZSmb2YUc7YU/1/kTjQ8ccU1MgAPp4w9drdwCZXLTQ8fc1MYPo4+sDoAdJVSpS9YQ5qsenZH1lgyJ3iV+RwLjzltdRTs4FjeAOxCaEjpdhXkVZpH58wiDYm4F4OfzfvvSYPSxa2eoZVSI+YV4YEtHQrFgxWwNHgIt8rH8zETKjhlva6PCirZdWfmQg1LU/3Jly1lNw9fkTy9UzAfsLaSQM8hEbjOR6nh7AQCUqp9Fq7jH7lV/t/yGEIH5Ie/qW/uFcZpV1RLicgeGAnI+7RM55vSB9tyO8tiJcWBQZgLw= + script: + - | + tagName=`git diff -U0 HEAD^ package.json | grep '"version": "' | tail -n 1 | grep -oE "[0-9]+\.[0-9]+\.[0-9]+"` || : + if [ -n "$tagName" ]; + then + git tag v$tagName + git push -q https://$GITHUB_TOKEN@github.com/serverless/test --tags + fi + + # version tag + - stage: Deploy + env: + # GITHUB_TOKEN + - secure: Eu4uYULeMcBVkj3AJxKTGTytCkGBDZAl5z/26Jnv1sH3hK02UQeJdE2L8gTk/TfMS/MMLInSb0YqD4S8qEz6C3zg4Q9z9/N653JaKSbpQPjjc8BsOaZlgo0rrUJWu/BwdYLou1zAhAGd4cUtyAAnIkvJW30XAnH6A73EyGY3GgRRIUGb/PxUB2cHrqalq/V/u6kuNw5Sf26SmVVdJMhj5/es+kQdI2EeykEQMO2FRXKV2GRXs5TFikW/doTENHQAK6QPWJbVX1PHF4Via9vJuLhaOo4QjH3XCpDYX5UYsR7gvOChSsY3VMjHgLkjgTyabiv0mnrhjsLkkvlVsSzmmYmMShyGbJSjnqAa+C69oGFJo9Tim5qQOEJIZ5R7A1ctS8wZSmb2YUc7YU/1/kTjQ8ccU1MgAPp4w9drdwCZXLTQ8fc1MYPo4+sDoAdJVSpS9YQ5qsenZH1lgyJ3iV+RwLjzltdRTs4FjeAOxCaEjpdhXkVZpH58wiDYm4F4OfzfvvSYPSxa2eoZVSI+YV4YEtHQrFgxWwNHgIt8rH8zETKjhlva6PCirZdWfmQg1LU/3Jly1lNw9fkTy9UzAfsLaSQM8hEbjOR6nh7AQCUqp9Fq7jH7lV/t/yGEIH5Ie/qW/uFcZpV1RLicgeGAnI+7RM55vSB9tyO8tiJcWBQZgLw= + node_js: 12 + script: skip + # Ensure to fail build if deploy fails, Travis doesn't ensure that: https://github.com/travis-ci/travis-ci/issues/921 + before_deploy: + - set -e + # Remove eventual old npm logs + - rm -rf ~/.npm/_logs + after_deploy: + - | + # npm creates log only on failure + if [ -d ~/.npm/_logs ] + then + # Undocumented way to force Travis build to fail + travis_terminate 1 + fi + - npx github-release-from-cc-changelog $TRAVIS_TAG + deploy: + edge: true # Workaorund Travis regression: https://travis-ci.community/t/missing-api-key-when-deploying-to-github-releases/5761 + provider: npm + email: services@serverless.com + on: + tags: true + api_key: + secure: GxHxrCEjTIwzcHW6EEJm6/6Lwm3H+aTmOSrDHgwMwiwg98fTqQ2pD1L06CppSiaq9T33RPEim4kuBHIpTtmiJwVVQMIdEQheUfE05OwWBWcOEta2h3ahbGPX8iA48aVdRuXD4/Vpiho2a7zPuVBIsgDH1OzLO/WiYx10afzqlOOvwBITOkRy6eKD/I/Omxid6KjvMwfrHYScWvL9JTo7aV0MhFL4MV+9fN3nutF5+wSSIjfkzTmhxKmHEi/nlcuFCVS8yfutX7sMLugxNilqbv815SbjHMrkgZwkzrnalTbF3B2ohV8zYcuCrUEwDPRlrWbmoFMGJdcuXE90HPiHagn2Olv5e28f5ToQGFzwzYWrAO2Rc4l6gyUn8uwonN/xrK6N8ucEti9b/vzQz2/bH3rB+S++ZPiYAUcgZ8eLUp6TXkFoxanRuH/k2I8kfBj3bQrfvJofbaQKcrsGPFmR+AEsxDiZ2fCQfZHuZS4t8JD5VtDXacTSbbZzqwiKHF0sdJIIzE8EXQ7OejK8UQ2nSUZMlVUzvwuAnhPgjOC9QCNpQwprSX2Hn5d8lvcxI+TDj7XWYxqbhIlRHxPLghKTMicIH/luwy3OpCP4769Hjmy4e2M6kjyUKjhrV7BvrBVZSVPSP0vuh3oZCPGZSRXl3JfelQGXrUNufxomZu/gLZM= diff --git a/LICENSE b/LICENSE index 33e8e50..f8a1a3f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2017 Serverless +Copyright (c) 2020 Serverless Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/RELEASE_PROCESS.md b/RELEASE_PROCESS.md new file mode 100644 index 0000000..4aac0c4 --- /dev/null +++ b/RELEASE_PROCESS.md @@ -0,0 +1,44 @@ +# Release process + +## Semi-automation + +This project relies on [semantic commit messages](https://www.conventionalcommits.org/en/v1.0.0-beta.4/#summary) which allows to streamline the release process (versioning and changelog generation is automated) + +See proposed [Commit Message Guidelines](https://docs.google.com/document/d/1hKUs3qt_aVp_PBI1UqvfaIqKma3jAJimEoGCRGGbOqs/edit#) + +In PR's as coming from forks (community contributions) while its welcome, we do not require to follow semantic commit messages. Yet, such PR is expected to be squash merged by project member with single semantic commit message. + +PR's comming from branches have commit messages validated with [commmitlint](https://commitlint.js.org/#/) + +## Release flow + +Releases are triggered manually by preparing a release PR's as follows + +1. Create a `release` branch (should derive from current `master` state) +2. Bump version ranges of _all_ dependencies to latest supported versions (e.g. if latest version of a dependency is `2.3.5` and range in a `package.json` is `^2.2.4` then it should be updated to `^2.3.5`) + _Note: Unfortunately there seems no reliable utility to automate that (there's a [request at `npm-check-updates`](https://github.com/tjunnone/npm-check-updates/issues/581)) + If you handle installation of dependencies through [npm-cross-link](https://github.com/medikoo/npm-cross-link#npm-cross-link) then [`--bump-deps`](https://github.com/medikoo/npm-cross-link#general-options) option will bump version ranges as expected_ +3. Commit eventual dependency version updates with following commit message: + `chore: Bump dependencies` +4. Run `npm run prepare-release` command. + _It'll automatically bump version in `package.json` to expected one (by inspecting changes since previous release) and will generate new changelog entry._ +5. If needed improve generated changelog entry in `CHANGELOG.md` +6. Commit `package.json` and `CHANGELOG.md` changes with following commit message: + `chore: Release` + **Note: For automation purpose it is important that it's the last commit in the PR** +7. Push branch upstream and create a PR. + _Release PR's are automatically detected in CI by fact of `version` in `package.json` file being changed in last commit. In context of that build, existence of new version changelog entry (in `CHANGELOG.md`) is validated._ +8. After PR is accepted by CI and one of the reviewers, merge it via _"Rebase and merge"_ option + +Further actions are automated in CI context: + +8. `master` CI build detects that release PR was merged (by fact that it covers change of `version` field in `package.json` file). Having that (after successufl tests pass) version tag is created and pushed to the repository. +9. _tag_ CI build, publishes new version to npm, also it retrieves release notes from CHANGELOG.md and publishes them to GitHub. + +### Updating release notes for already published versions + +Improvements to release notes can be done at anytime to any already published version: + +1. Update `CHANGELOG.md` with desired changes (ensure they'd also end in `master`) +2. Push updated release notes to GitHub by running: + `npx github-release-from-cc-changelog ` diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..951ffae --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,23 @@ +'use strict'; + +module.exports = { + rules: { + 'body-leading-blank': [2, 'always'], + 'body-max-line-length': [2, 'always', 72], + 'footer-leading-blank': [2, 'always'], + 'footer-max-line-length': [2, 'always', 72], + 'header-max-length': [2, 'always', 72], + 'scope-case': [2, 'always', 'start-case'], + 'scope-enum': [2, 'always', ['']], + 'subject-case': [2, 'always', 'sentence-case'], + 'subject-empty': [2, 'never'], + 'subject-full-stop': [2, 'never', '.'], + 'type-case': [2, 'always', 'lower-case'], + 'type-empty': [2, 'never'], + 'type-enum': [ + 2, + 'always', + ['build', 'chore', 'ci', 'docs', 'feat', 'fix', 'perf', 'refactor', 'style', 'test'], + ], + }, +}; diff --git a/deploy/googleDeploy.js b/deploy/googleDeploy.js index dfe845e..46732a2 100644 --- a/deploy/googleDeploy.js +++ b/deploy/googleDeploy.js @@ -26,21 +26,23 @@ class GoogleDeploy { monitorDeployment, uploadArtifacts, updateDeployment, - cleanupDeploymentBucket); + cleanupDeploymentBucket + ); this.hooks = { - 'before:deploy:deploy': () => BbPromise.bind(this) - .then(this.validate) - .then(this.setDefaults), - - 'deploy:deploy': () => BbPromise.bind(this) - .then(this.createDeployment) - .then(this.setDeploymentBucketName) - .then(this.uploadArtifacts) - .then(this.updateDeployment), - - 'after:deploy:deploy': () => BbPromise.bind(this) - .then(this.cleanupDeploymentBucket), + 'before:deploy:deploy': () => + BbPromise.bind(this) + .then(this.validate) + .then(this.setDefaults), + + 'deploy:deploy': () => + BbPromise.bind(this) + .then(this.createDeployment) + .then(this.setDeploymentBucketName) + .then(this.uploadArtifacts) + .then(this.updateDeployment), + + 'after:deploy:deploy': () => BbPromise.bind(this).then(this.cleanupDeploymentBucket), }; } } diff --git a/deploy/googleDeploy.test.js b/deploy/googleDeploy.test.js index 8403ef4..81acebd 100644 --- a/deploy/googleDeploy.test.js +++ b/deploy/googleDeploy.test.js @@ -45,19 +45,22 @@ describe('GoogleDeploy', () => { let cleanupDeploymentBucketStub; beforeEach(() => { - validateStub = sinon.stub(googleDeploy, 'validate') + validateStub = sinon.stub(googleDeploy, 'validate').returns(BbPromise.resolve()); + setDefaultsStub = sinon.stub(googleDeploy, 'setDefaults').returns(BbPromise.resolve()); + createDeploymentStub = sinon + .stub(googleDeploy, 'createDeployment') .returns(BbPromise.resolve()); - setDefaultsStub = sinon.stub(googleDeploy, 'setDefaults') + setDeploymentBucketNameStub = sinon + .stub(googleDeploy, 'setDeploymentBucketName') .returns(BbPromise.resolve()); - createDeploymentStub = sinon.stub(googleDeploy, 'createDeployment') + uploadArtifactsStub = sinon + .stub(googleDeploy, 'uploadArtifacts') .returns(BbPromise.resolve()); - setDeploymentBucketNameStub = sinon.stub(googleDeploy, 'setDeploymentBucketName') + updateDeploymentStub = sinon + .stub(googleDeploy, 'updateDeployment') .returns(BbPromise.resolve()); - uploadArtifactsStub = sinon.stub(googleDeploy, 'uploadArtifacts') - .returns(BbPromise.resolve()); - updateDeploymentStub = sinon.stub(googleDeploy, 'updateDeployment') - .returns(BbPromise.resolve()); - cleanupDeploymentBucketStub = sinon.stub(googleDeploy, 'cleanupDeploymentBucket') + cleanupDeploymentBucketStub = sinon + .stub(googleDeploy, 'cleanupDeploymentBucket') .returns(BbPromise.resolve()); }); @@ -71,22 +74,22 @@ describe('GoogleDeploy', () => { googleDeploy.cleanupDeploymentBucket.restore(); }); - it('should run "before:deploy:deploy" promise chain', () => googleDeploy - .hooks['before:deploy:deploy']().then(() => { + it('should run "before:deploy:deploy" promise chain', () => + googleDeploy.hooks['before:deploy:deploy']().then(() => { expect(validateStub.calledOnce).toEqual(true); expect(setDefaultsStub.calledAfter(validateStub)).toEqual(true); })); - it('should run "deploy:deploy" promise chain', () => googleDeploy - .hooks['deploy:deploy']().then(() => { + it('should run "deploy:deploy" promise chain', () => + googleDeploy.hooks['deploy:deploy']().then(() => { expect(createDeploymentStub.calledOnce).toEqual(true); expect(setDeploymentBucketNameStub.calledAfter(createDeploymentStub)).toEqual(true); expect(uploadArtifactsStub.calledAfter(createDeploymentStub)).toEqual(true); expect(updateDeploymentStub.calledAfter(uploadArtifactsStub)).toEqual(true); })); - it('should run "after:deploy:deploy" promise chain', () => googleDeploy - .hooks['after:deploy:deploy']().then(() => { + it('should run "after:deploy:deploy" promise chain', () => + googleDeploy.hooks['after:deploy:deploy']().then(() => { expect(cleanupDeploymentBucketStub.calledOnce).toEqual(true); })); }); diff --git a/deploy/lib/cleanupDeploymentBucket.js b/deploy/lib/cleanupDeploymentBucket.js index c5084d4..1115c6c 100644 --- a/deploy/lib/cleanupDeploymentBucket.js +++ b/deploy/lib/cleanupDeploymentBucket.js @@ -15,29 +15,32 @@ module.exports = { bucket: this.serverless.service.provider.deploymentBucketName, }; - return this.provider.request('storage', 'objects', 'list', params) - .then((response) => { - if (!response.items.length) return BbPromise.resolve([]); + return this.provider.request('storage', 'objects', 'list', params).then(response => { + if (!response.items.length) return BbPromise.resolve([]); - const files = response.items; + const files = response.items; - // 4 old ones + the one which will be uploaded after the cleanup = 5 - const objectsToKeepCount = 4; + // 4 old ones + the one which will be uploaded after the cleanup = 5 + const objectsToKeepCount = 4; - const orderedObjects = _.orderBy(files, (file) => { + const orderedObjects = _.orderBy( + files, + file => { const timestamp = file.name.match(/(serverless)\/(.+)\/(.+)\/(\d+)-(.+)\/(.+\.zip)/)[4]; return timestamp; - }, ['asc']); + }, + ['asc'] + ); - const objectsToKeep = _.takeRight(orderedObjects, objectsToKeepCount); - const objectsToRemove = _.pullAllWith(files, objectsToKeep, _.isEqual); + const objectsToKeep = _.takeRight(orderedObjects, objectsToKeepCount); + const objectsToRemove = _.pullAllWith(files, objectsToKeep, _.isEqual); - if (objectsToRemove.length) { - return BbPromise.resolve(objectsToRemove); - } + if (objectsToRemove.length) { + return BbPromise.resolve(objectsToRemove); + } - return BbPromise.resolve([]); - }); + return BbPromise.resolve([]); + }); }, removeObjects(objectsToRemove) { @@ -45,7 +48,7 @@ module.exports = { this.serverless.cli.log('Removing old artifacts...'); - const removePromises = objectsToRemove.map((object) => { + const removePromises = objectsToRemove.map(object => { const params = { bucket: object.bucket, object: object.name, diff --git a/deploy/lib/cleanupDeploymentBucket.test.js b/deploy/lib/cleanupDeploymentBucket.test.js index cf30a0b..52a3369 100644 --- a/deploy/lib/cleanupDeploymentBucket.test.js +++ b/deploy/lib/cleanupDeploymentBucket.test.js @@ -34,10 +34,10 @@ describe('CleanupDeploymentBucket', () => { let removeObjectsStub; beforeEach(() => { - getObjectsToRemoveStub = sinon.stub(googleDeploy, 'getObjectsToRemove') - .returns(BbPromise.resolve()); - removeObjectsStub = sinon.stub(googleDeploy, 'removeObjects') + getObjectsToRemoveStub = sinon + .stub(googleDeploy, 'getObjectsToRemove') .returns(BbPromise.resolve()); + removeObjectsStub = sinon.stub(googleDeploy, 'removeObjects').returns(BbPromise.resolve()); }); afterEach(() => { @@ -45,8 +45,8 @@ describe('CleanupDeploymentBucket', () => { googleDeploy.removeObjects.restore(); }); - it('should run promise chain', () => googleDeploy - .cleanupDeploymentBucket().then(() => { + it('should run promise chain', () => + googleDeploy.cleanupDeploymentBucket().then(() => { expect(getObjectsToRemoveStub.calledOnce).toEqual(true); expect(removeObjectsStub.calledAfter(getObjectsToRemoveStub)); })); @@ -94,7 +94,7 @@ describe('CleanupDeploymentBucket', () => { }; requestStub.returns(BbPromise.resolve(response)); - return googleDeploy.getObjectsToRemove().then((objects) => { + return googleDeploy.getObjectsToRemove().then(objects => { expect(objects.length).toEqual(2); expect(objects).not.toContainEqual({ bucket: 'sls-my-service-dev-12345678', @@ -112,13 +112,11 @@ describe('CleanupDeploymentBucket', () => { bucket: 'sls-my-service-dev-12345678', name: `${key}/903940390431-2016-08-18T23:42:08/artifact.zip`, }); - expect(requestStub.calledWithExactly( - 'storage', - 'objects', - 'list', - { + expect( + requestStub.calledWithExactly('storage', 'objects', 'list', { bucket: 'sls-my-service-dev-12345678', - })).toEqual(true); + }) + ).toEqual(true); }); }); @@ -145,16 +143,14 @@ describe('CleanupDeploymentBucket', () => { }; requestStub.returns(BbPromise.resolve(response)); - return googleDeploy.getObjectsToRemove().then((objects) => { + return googleDeploy.getObjectsToRemove().then(objects => { expect(objects.length).toEqual(0); expect(objects).toEqual([]); - expect(requestStub.calledWithExactly( - 'storage', - 'objects', - 'list', - { + expect( + requestStub.calledWithExactly('storage', 'objects', 'list', { bucket: 'sls-my-service-dev-12345678', - })).toEqual(true); + }) + ).toEqual(true); }); }); @@ -164,16 +160,14 @@ describe('CleanupDeploymentBucket', () => { }; requestStub.returns(BbPromise.resolve(response)); - return googleDeploy.getObjectsToRemove().then((objects) => { + return googleDeploy.getObjectsToRemove().then(objects => { expect(objects.length).toEqual(0); expect(objects).toEqual([]); - expect(requestStub.calledWithExactly( - 'storage', - 'objects', - 'list', - { + expect( + requestStub.calledWithExactly('storage', 'objects', 'list', { bucket: 'sls-my-service-dev-12345678', - })).toEqual(true); + }) + ).toEqual(true); }); }); }); @@ -223,7 +217,7 @@ describe('CleanupDeploymentBucket', () => { requestStub.returns(BbPromise.resolve('removePromise')); - return googleDeploy.removeObjects(objectsToRemove).then((removePromises) => { + return googleDeploy.removeObjects(objectsToRemove).then(removePromises => { expect(requestStub.called).toEqual(true); expect(consoleLogStub.calledOnce).toEqual(true); expect(removePromises).toEqual([ diff --git a/deploy/lib/createDeployment.js b/deploy/lib/createDeployment.js index 9480e71..8b78e7d 100644 --- a/deploy/lib/createDeployment.js +++ b/deploy/lib/createDeployment.js @@ -17,12 +17,13 @@ module.exports = { project: this.serverless.service.provider.project, }; - return this.provider.request('deploymentmanager', 'deployments', 'list', params) - .then((response) => { + return this.provider + .request('deploymentmanager', 'deployments', 'list', params) + .then(response => { let foundDeployment; if (response && response.deployments) { - foundDeployment = response.deployments.find((deployment) => { + foundDeployment = response.deployments.find(deployment => { const name = `sls-${this.serverless.service.service}-${this.options.stage}`; return deployment.name === name; }); @@ -37,8 +38,11 @@ module.exports = { this.serverless.cli.log('Creating deployment...'); - const filePath = path.join(this.serverless.config.servicePath, - '.serverless', 'configuration-template-create.yml'); + const filePath = path.join( + this.serverless.config.servicePath, + '.serverless', + 'configuration-template-create.yml' + ); const deploymentName = `sls-${this.serverless.service.service}-${this.options.stage}`; @@ -54,7 +58,8 @@ module.exports = { }, }; - return this.provider.request('deploymentmanager', 'deployments', 'insert', params) + return this.provider + .request('deploymentmanager', 'deployments', 'insert', params) .then(() => this.monitorDeployment(deploymentName, 'create', 5000)); }, }; diff --git a/deploy/lib/createDeployment.test.js b/deploy/lib/createDeployment.test.js index 0e863b3..d400456 100644 --- a/deploy/lib/createDeployment.test.js +++ b/deploy/lib/createDeployment.test.js @@ -35,7 +35,8 @@ describe('CreateDeployment', () => { configurationTemplateCreateFilePath = path.join( serverless.config.servicePath, '.serverless', - 'configuration-template-create.yml'); + 'configuration-template-create.yml' + ); }); afterEach(() => { @@ -47,9 +48,11 @@ describe('CreateDeployment', () => { let createIfNotExistsStub; beforeEach(() => { - checkForExistingDeploymentStub = sinon.stub(googleDeploy, 'checkForExistingDeployment') + checkForExistingDeploymentStub = sinon + .stub(googleDeploy, 'checkForExistingDeployment') .returns(BbPromise.resolve()); - createIfNotExistsStub = sinon.stub(googleDeploy, 'createIfNotExists') + createIfNotExistsStub = sinon + .stub(googleDeploy, 'createIfNotExists') .returns(BbPromise.resolve()); }); @@ -58,65 +61,56 @@ describe('CreateDeployment', () => { googleDeploy.createIfNotExists.restore(); }); - it('should run promise chain', () => googleDeploy - .createDeployment().then(() => { + it('should run promise chain', () => + googleDeploy.createDeployment().then(() => { expect(checkForExistingDeploymentStub.calledOnce).toEqual(true); expect(createIfNotExistsStub.calledAfter(checkForExistingDeploymentStub)); - }), - ); + })); }); describe('#checkForExistingDeployment()', () => { it('should return "undefined" if no deployments are found', () => { requestStub.returns(BbPromise.resolve([])); - return googleDeploy.checkForExistingDeployment().then((foundDeployment) => { + return googleDeploy.checkForExistingDeployment().then(foundDeployment => { expect(foundDeployment).toEqual(undefined); - expect(requestStub.calledWithExactly( - 'deploymentmanager', - 'deployments', - 'list', - { project: 'my-project' }, - )).toEqual(true); + expect( + requestStub.calledWithExactly('deploymentmanager', 'deployments', 'list', { + project: 'my-project', + }) + ).toEqual(true); }); }); it('should return "undefined" if deployments do not contain deployment', () => { const response = { - deployments: [ - { name: 'some-other-deployment' }, - ], + deployments: [{ name: 'some-other-deployment' }], }; requestStub.returns(BbPromise.resolve(response)); - return googleDeploy.checkForExistingDeployment().then((foundDeployment) => { + return googleDeploy.checkForExistingDeployment().then(foundDeployment => { expect(foundDeployment).toEqual(undefined); - expect(requestStub.calledWithExactly( - 'deploymentmanager', - 'deployments', - 'list', - { project: 'my-project' }, - )).toEqual(true); + expect( + requestStub.calledWithExactly('deploymentmanager', 'deployments', 'list', { + project: 'my-project', + }) + ).toEqual(true); }); }); it('should find the existing deployment', () => { const response = { - deployments: [ - { name: 'sls-my-service-dev' }, - { name: 'some-other-deployment' }, - ], + deployments: [{ name: 'sls-my-service-dev' }, { name: 'some-other-deployment' }], }; requestStub.returns(BbPromise.resolve(response)); - return googleDeploy.checkForExistingDeployment().then((foundDeployment) => { + return googleDeploy.checkForExistingDeployment().then(foundDeployment => { expect(foundDeployment).toEqual(response.deployments[0]); - expect(requestStub.calledWithExactly( - 'deploymentmanager', - 'deployments', - 'list', - { project: 'my-project' }, - )).toEqual(true); + expect( + requestStub.calledWithExactly('deploymentmanager', 'deployments', 'list', { + project: 'my-project', + }) + ).toEqual(true); }); }); }); @@ -129,7 +123,8 @@ describe('CreateDeployment', () => { beforeEach(() => { consoleLogStub = sinon.stub(googleDeploy.serverless.cli, 'log').returns(); readFileSyncStub = sinon.stub(fs, 'readFileSync').returns('some content'); - monitorDeploymentStub = sinon.stub(googleDeploy, 'monitorDeployment') + monitorDeploymentStub = sinon + .stub(googleDeploy, 'monitorDeployment') .returns(BbPromise.resolve()); }); @@ -166,17 +161,12 @@ describe('CreateDeployment', () => { return googleDeploy.createIfNotExists(foundDeployment).then(() => { expect(consoleLogStub.calledOnce).toEqual(true); expect(readFileSyncStub.called).toEqual(true); - expect(requestStub.calledWithExactly( - 'deploymentmanager', - 'deployments', - 'insert', - params, - )).toEqual(true); - expect(monitorDeploymentStub.calledWithExactly( - 'sls-my-service-dev', - 'create', - 5000, - )).toEqual(true); + expect( + requestStub.calledWithExactly('deploymentmanager', 'deployments', 'insert', params) + ).toEqual(true); + expect( + monitorDeploymentStub.calledWithExactly('sls-my-service-dev', 'create', 5000) + ).toEqual(true); }); }); }); diff --git a/deploy/lib/updateDeployment.js b/deploy/lib/updateDeployment.js index d8f0aef..61ec308 100644 --- a/deploy/lib/updateDeployment.js +++ b/deploy/lib/updateDeployment.js @@ -17,9 +17,10 @@ module.exports = { project: this.serverless.service.provider.project, }; - return this.provider.request('deploymentmanager', 'deployments', 'list', params) - .then((response) => { - const deployment = response.deployments.find((dep) => { + return this.provider + .request('deploymentmanager', 'deployments', 'list', params) + .then(response => { + const deployment = response.deployments.find(dep => { const name = `sls-${this.serverless.service.service}-${this.options.stage}`; return dep.name === name; }); @@ -31,8 +32,11 @@ module.exports = { update(deployment) { this.serverless.cli.log('Updating deployment...'); - const filePath = path.join(this.serverless.config.servicePath, - '.serverless', 'configuration-template-update.yml'); + const filePath = path.join( + this.serverless.config.servicePath, + '.serverless', + 'configuration-template-update.yml' + ); const deploymentName = `sls-${this.serverless.service.service}-${this.options.stage}`; @@ -50,7 +54,8 @@ module.exports = { }, }; - return this.provider.request('deploymentmanager', 'deployments', 'update', params) + return this.provider + .request('deploymentmanager', 'deployments', 'update', params) .then(() => this.monitorDeployment(deploymentName, 'update', 5000)); }, }; diff --git a/deploy/lib/updateDeployment.test.js b/deploy/lib/updateDeployment.test.js index 3d61084..2cab4f2 100644 --- a/deploy/lib/updateDeployment.test.js +++ b/deploy/lib/updateDeployment.test.js @@ -35,7 +35,8 @@ describe('UpdateDeployment', () => { configurationTemplateUpdateFilePath = path.join( serverless.config.servicePath, '.serverless', - 'configuration-template-update.yml'); + 'configuration-template-update.yml' + ); }); afterEach(() => { @@ -47,10 +48,8 @@ describe('UpdateDeployment', () => { let updateStub; beforeEach(() => { - getDeploymentStub = sinon.stub(googleDeploy, 'getDeployment') - .returns(BbPromise.resolve()); - updateStub = sinon.stub(googleDeploy, 'update') - .returns(BbPromise.resolve()); + getDeploymentStub = sinon.stub(googleDeploy, 'getDeployment').returns(BbPromise.resolve()); + updateStub = sinon.stub(googleDeploy, 'update').returns(BbPromise.resolve()); }); afterEach(() => { @@ -58,51 +57,43 @@ describe('UpdateDeployment', () => { googleDeploy.update.restore(); }); - it('should run promise chain', () => googleDeploy - .updateDeployment().then(() => { + it('should run promise chain', () => + googleDeploy.updateDeployment().then(() => { expect(getDeploymentStub.calledOnce).toEqual(true); expect(updateStub.calledAfter(getDeploymentStub)); - }), - ); + })); }); describe('#getDeployment()', () => { it('should return undefined if no deployments are found', () => { const response = { - deployments: [ - { name: 'some-other-deployment' }, - ], + deployments: [{ name: 'some-other-deployment' }], }; requestStub.returns(BbPromise.resolve(response)); - return googleDeploy.getDeployment().then((foundDeployment) => { + return googleDeploy.getDeployment().then(foundDeployment => { expect(foundDeployment).toEqual(undefined); - expect(requestStub.calledWithExactly( - 'deploymentmanager', - 'deployments', - 'list', - { project: 'my-project' }, - )).toEqual(true); + expect( + requestStub.calledWithExactly('deploymentmanager', 'deployments', 'list', { + project: 'my-project', + }) + ).toEqual(true); }); }); it('should return the deployment if found', () => { const response = { - deployments: [ - { name: 'sls-my-service-dev' }, - { name: 'some-other-deployment' }, - ], + deployments: [{ name: 'sls-my-service-dev' }, { name: 'some-other-deployment' }], }; requestStub.returns(BbPromise.resolve(response)); - return googleDeploy.getDeployment().then((foundDeployment) => { + return googleDeploy.getDeployment().then(foundDeployment => { expect(foundDeployment).toEqual(response.deployments[0]); - expect(requestStub.calledWithExactly( - 'deploymentmanager', - 'deployments', - 'list', - { project: 'my-project' }, - )).toEqual(true); + expect( + requestStub.calledWithExactly('deploymentmanager', 'deployments', 'list', { + project: 'my-project', + }) + ).toEqual(true); }); }); }); @@ -115,7 +106,8 @@ describe('UpdateDeployment', () => { beforeEach(() => { consoleLogStub = sinon.stub(googleDeploy.serverless.cli, 'log').returns(); readFileSyncStub = sinon.stub(fs, 'readFileSync').returns('some content'); - monitorDeploymentStub = sinon.stub(googleDeploy, 'monitorDeployment') + monitorDeploymentStub = sinon + .stub(googleDeploy, 'monitorDeployment') .returns(BbPromise.resolve()); }); @@ -148,17 +140,12 @@ describe('UpdateDeployment', () => { return googleDeploy.update(deployment).then(() => { expect(consoleLogStub.calledOnce).toEqual(true); expect(readFileSyncStub.called).toEqual(true); - expect(requestStub.calledWithExactly( - 'deploymentmanager', - 'deployments', - 'update', - params, - )).toEqual(true); - expect(monitorDeploymentStub.calledWithExactly( - 'sls-my-service-dev', - 'update', - 5000, - )).toEqual(true); + expect( + requestStub.calledWithExactly('deploymentmanager', 'deployments', 'update', params) + ).toEqual(true); + expect( + monitorDeploymentStub.calledWithExactly('sls-my-service-dev', 'update', 5000) + ).toEqual(true); }); }); }); diff --git a/deploy/lib/uploadArtifacts.js b/deploy/lib/uploadArtifacts.js index 6141242..c9773e4 100644 --- a/deploy/lib/uploadArtifacts.js +++ b/deploy/lib/uploadArtifacts.js @@ -18,9 +18,8 @@ module.exports = { }, }; - return this.provider.request('storage', 'objects', 'insert', params) - .then(() => { - this.serverless.cli.log('Artifacts successfully uploaded...'); - }); + return this.provider.request('storage', 'objects', 'insert', params).then(() => { + this.serverless.cli.log('Artifacts successfully uploaded...'); + }); }, }; diff --git a/deploy/lib/uploadArtifacts.test.js b/deploy/lib/uploadArtifacts.test.js index 4e61607..3c2c5ac 100644 --- a/deploy/lib/uploadArtifacts.test.js +++ b/deploy/lib/uploadArtifacts.test.js @@ -46,13 +46,10 @@ describe('UploadArtifacts', () => { }); describe('#uploadArtifacts()', () => { - it('should upload corresponding objects to deployment bucket', () => googleDeploy - .uploadArtifacts().then(() => { - expect(requestStub.calledWithExactly( - 'storage', - 'objects', - 'insert', - { + it('should upload corresponding objects to deployment bucket', () => + googleDeploy.uploadArtifacts().then(() => { + expect( + requestStub.calledWithExactly('storage', 'objects', 'insert', { bucket: 'sls-my-service-dev-12345678', resource: { name: '/some-file-path', @@ -62,17 +59,15 @@ describe('UploadArtifacts', () => { mimeType: 'application/octet-stream', body: fs.createReadStream('artifact.zip'), }, - })).toEqual(true); + }) + ).toEqual(true); })); - it('should log info messages', () => googleDeploy - .uploadArtifacts().then(() => { + it('should log info messages', () => + googleDeploy.uploadArtifacts().then(() => { expect(consoleLogStub.called).toEqual(true); - expect(requestStub.calledWithExactly( - 'storage', - 'objects', - 'insert', - { + expect( + requestStub.calledWithExactly('storage', 'objects', 'insert', { bucket: 'sls-my-service-dev-12345678', resource: { name: '/some-file-path', @@ -82,17 +77,15 @@ describe('UploadArtifacts', () => { mimeType: 'application/octet-stream', body: fs.createReadStream('artifact.zip'), }, - })).toEqual(true); + }) + ).toEqual(true); })); - it('should read artifact file as read stream', () => googleDeploy - .uploadArtifacts().then(() => { + it('should read artifact file as read stream', () => + googleDeploy.uploadArtifacts().then(() => { expect(createReadStreamStub.calledOnce).toEqual(true); - expect(requestStub.calledWithExactly( - 'storage', - 'objects', - 'insert', - { + expect( + requestStub.calledWithExactly('storage', 'objects', 'insert', { bucket: 'sls-my-service-dev-12345678', resource: { name: '/some-file-path', @@ -102,7 +95,8 @@ describe('UploadArtifacts', () => { mimeType: 'application/octet-stream', body: fs.createReadStream('artifact.zip'), }, - })).toEqual(true); + }) + ).toEqual(true); })); }); }); diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 78942ac..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,7 +0,0 @@ -version: '2' -services: - node: - image: node:latest - working_dir: /app - volumes: - - .:/app diff --git a/info/googleInfo.js b/info/googleInfo.js index 8454426..bee73ab 100644 --- a/info/googleInfo.js +++ b/info/googleInfo.js @@ -12,22 +12,17 @@ class GoogleInfo { this.options = options; this.provider = this.serverless.getProvider('google'); - Object.assign( - this, - validate, - setDefaults, - displayServiceInfo); + Object.assign(this, validate, setDefaults, displayServiceInfo); this.hooks = { - 'before:info:info': () => BbPromise.bind(this) - .then(this.validate) - .then(this.setDefaults), + 'before:info:info': () => + BbPromise.bind(this) + .then(this.validate) + .then(this.setDefaults), - 'deploy:deploy': () => BbPromise.bind(this) - .then(this.displayServiceInfo), + 'deploy:deploy': () => BbPromise.bind(this).then(this.displayServiceInfo), - 'info:info': () => BbPromise.bind(this) - .then(this.displayServiceInfo), + 'info:info': () => BbPromise.bind(this).then(this.displayServiceInfo), }; } } diff --git a/info/googleInfo.test.js b/info/googleInfo.test.js index 8217fc1..4b3c3ed 100644 --- a/info/googleInfo.test.js +++ b/info/googleInfo.test.js @@ -41,11 +41,10 @@ describe('GoogleInfo', () => { let displayServiceInfoStub; beforeEach(() => { - validateStub = sinon.stub(googleInfo, 'validate') - .returns(BbPromise.resolve()); - setDefaultsStub = sinon.stub(googleInfo, 'setDefaults') - .returns(BbPromise.resolve()); - displayServiceInfoStub = sinon.stub(googleInfo, 'displayServiceInfo') + validateStub = sinon.stub(googleInfo, 'validate').returns(BbPromise.resolve()); + setDefaultsStub = sinon.stub(googleInfo, 'setDefaults').returns(BbPromise.resolve()); + displayServiceInfoStub = sinon + .stub(googleInfo, 'displayServiceInfo') .returns(BbPromise.resolve()); }); @@ -55,19 +54,19 @@ describe('GoogleInfo', () => { googleInfo.displayServiceInfo.restore(); }); - it('should run "before:info:info" promise chain', () => googleInfo - .hooks['before:info:info']().then(() => { + it('should run "before:info:info" promise chain', () => + googleInfo.hooks['before:info:info']().then(() => { expect(validateStub.calledOnce).toEqual(true); expect(setDefaultsStub.calledAfter(validateStub)).toEqual(true); })); - it('should run "deploy:deploy" promise chain', () => googleInfo - .hooks['deploy:deploy']().then(() => { + it('should run "deploy:deploy" promise chain', () => + googleInfo.hooks['deploy:deploy']().then(() => { expect(displayServiceInfoStub.calledOnce).toEqual(true); })); - it('should run "info:info" promise chain', () => googleInfo - .hooks['info:info']().then(() => { + it('should run "info:info" promise chain', () => + googleInfo.hooks['info:info']().then(() => { expect(displayServiceInfoStub.calledOnce).toEqual(true); })); }); diff --git a/info/lib/displayServiceInfo.js b/info/lib/displayServiceInfo.js index f1cf35a..b1950cd 100644 --- a/info/lib/displayServiceInfo.js +++ b/info/lib/displayServiceInfo.js @@ -36,10 +36,13 @@ module.exports = { functions: [], }; - _.forEach(resources.resources, (resource) => { + _.forEach(resources.resources, resource => { if (resource.type === 'cloudfunctions.v1beta2.function') { const serviceFuncName = getFunctionNameInService( - resource.name, this.serverless.service.service, this.options.stage); + resource.name, + this.serverless.service.service, + this.options.stage + ); const serviceFunc = this.serverless.service.getFunction(serviceFuncName); const eventType = Object.keys(serviceFunc.events[0])[0]; const funcEventConfig = serviceFunc.events[0][eventType]; @@ -80,7 +83,7 @@ module.exports = { // get all the functions message += `${chalk.yellow.underline('Deployed functions')}\n`; if (data.resources.functions.length) { - data.resources.functions.forEach((func) => { + data.resources.functions.forEach(func => { message += `${chalk.yellow(func.name)}\n`; message += ` ${func.resource}\n`; }); diff --git a/info/lib/displayServiceInfo.test.js b/info/lib/displayServiceInfo.test.js index 984fa05..894eba7 100644 --- a/info/lib/displayServiceInfo.test.js +++ b/info/lib/displayServiceInfo.test.js @@ -18,9 +18,7 @@ describe('DisplayServiceInfo', () => { serverless.service.functions = { func1: { handler: 'handler', - events: [ - { http: 'foo' }, - ], + events: [{ http: 'foo' }], }, func2: { handler: 'handler', @@ -52,12 +50,9 @@ describe('DisplayServiceInfo', () => { let printInfoStub; beforeEach(() => { - getResourcesStub = sinon.stub(googleInfo, 'getResources') - .returns(BbPromise.resolve()); - gatherDataStub = sinon.stub(googleInfo, 'gatherData') - .returns(BbPromise.resolve()); - printInfoStub = sinon.stub(googleInfo, 'printInfo') - .returns(BbPromise.resolve()); + getResourcesStub = sinon.stub(googleInfo, 'getResources').returns(BbPromise.resolve()); + gatherDataStub = sinon.stub(googleInfo, 'gatherData').returns(BbPromise.resolve()); + printInfoStub = sinon.stub(googleInfo, 'printInfo').returns(BbPromise.resolve()); }); afterEach(() => { @@ -66,8 +61,8 @@ describe('DisplayServiceInfo', () => { googleInfo.printInfo.restore(); }); - it('should run promise chain', () => googleInfo - .displayServiceInfo().then(() => { + it('should run promise chain', () => + googleInfo.displayServiceInfo().then(() => { expect(getResourcesStub.calledOnce).toEqual(true); expect(gatherDataStub.calledAfter(getResourcesStub)); expect(printInfoStub.calledAfter(gatherDataStub)); @@ -85,16 +80,14 @@ describe('DisplayServiceInfo', () => { googleInfo.provider.request.restore(); }); - it('should return a list with resources from the deployment', () => googleInfo - .getResources().then(() => { - expect(requestStub.calledWithExactly( - 'deploymentmanager', - 'resources', - 'list', - { + it('should return a list with resources from the deployment', () => + googleInfo.getResources().then(() => { + expect( + requestStub.calledWithExactly('deploymentmanager', 'resources', 'list', { project: 'my-project', deployment: 'sls-my-service-dev', - })).toEqual(true); + }) + ).toEqual(true); })); }); @@ -127,16 +120,14 @@ describe('DisplayServiceInfo', () => { }, }; - return googleInfo.gatherData(resources).then((data) => { + return googleInfo.gatherData(resources).then(data => { expect(data).toEqual(expectedData); }); }); it('should resolve with empty data if resource type is not matching', () => { const resources = { - resources: [ - { type: 'resource.which.should.be.filterered', name: 'someResource' }, - ], + resources: [{ type: 'resource.which.should.be.filterered', name: 'someResource' }], }; const expectedData = { @@ -149,7 +140,7 @@ describe('DisplayServiceInfo', () => { }, }; - return googleInfo.gatherData(resources).then((data) => { + return googleInfo.gatherData(resources).then(data => { expect(data).toEqual(expectedData); }); }); diff --git a/invoke/googleInvoke.js b/invoke/googleInvoke.js index c8ade25..3b4e79a 100644 --- a/invoke/googleInvoke.js +++ b/invoke/googleInvoke.js @@ -12,19 +12,15 @@ class GoogleInvoke { this.options = options; this.provider = this.serverless.getProvider('google'); - Object.assign( - this, - validate, - setDefaults, - invokeFunction); + Object.assign(this, validate, setDefaults, invokeFunction); this.hooks = { - 'before:invoke:invoke': () => BbPromise.bind(this) - .then(this.validate) - .then(this.setDefaults), + 'before:invoke:invoke': () => + BbPromise.bind(this) + .then(this.validate) + .then(this.setDefaults), - 'invoke:invoke': () => BbPromise.bind(this) - .then(this.invokeFunction), + 'invoke:invoke': () => BbPromise.bind(this).then(this.invokeFunction), }; } } diff --git a/invoke/googleInvoke.test.js b/invoke/googleInvoke.test.js index 2faf8c2..2496621 100644 --- a/invoke/googleInvoke.test.js +++ b/invoke/googleInvoke.test.js @@ -41,11 +41,10 @@ describe('GoogleInvoke', () => { let invokeFunctionStub; beforeEach(() => { - validateStub = sinon.stub(googleInvoke, 'validate') - .returns(BbPromise.resolve()); - setDefaultsStub = sinon.stub(googleInvoke, 'setDefaults') - .returns(BbPromise.resolve()); - invokeFunctionStub = sinon.stub(googleInvoke, 'invokeFunction') + validateStub = sinon.stub(googleInvoke, 'validate').returns(BbPromise.resolve()); + setDefaultsStub = sinon.stub(googleInvoke, 'setDefaults').returns(BbPromise.resolve()); + invokeFunctionStub = sinon + .stub(googleInvoke, 'invokeFunction') .returns(BbPromise.resolve()); }); @@ -55,14 +54,14 @@ describe('GoogleInvoke', () => { googleInvoke.invokeFunction.restore(); }); - it('should run "before:invoke:invoke" promise chain', () => googleInvoke - .hooks['before:invoke:invoke']().then(() => { + it('should run "before:invoke:invoke" promise chain', () => + googleInvoke.hooks['before:invoke:invoke']().then(() => { expect(validateStub.calledOnce).toEqual(true); expect(setDefaultsStub.calledAfter(validateStub)).toEqual(true); })); - it('should run "invoke:invoke" promise chain', () => googleInvoke - .hooks['invoke:invoke']().then(() => { + it('should run "invoke:invoke" promise chain', () => + googleInvoke.hooks['invoke:invoke']().then(() => { expect(invokeFunctionStub.calledOnce).toEqual(true); })); }); diff --git a/invoke/lib/invokeFunction.js b/invoke/lib/invokeFunction.js index fcd7eff..fb88c9c 100644 --- a/invoke/lib/invokeFunction.js +++ b/invoke/lib/invokeFunction.js @@ -33,7 +33,8 @@ module.exports = { 'locations', 'functions', 'call', - params); + params + ); }, printResult(result) { diff --git a/invoke/lib/invokeFunction.test.js b/invoke/lib/invokeFunction.test.js index dcbc1ca..f2a7844 100644 --- a/invoke/lib/invokeFunction.test.js +++ b/invoke/lib/invokeFunction.test.js @@ -38,10 +38,8 @@ describe('InvokeFunction', () => { let printResultStub; beforeEach(() => { - invokeStub = sinon.stub(googleInvoke, 'invoke') - .returns(BbPromise.resolve()); - printResultStub = sinon.stub(googleInvoke, 'printResult') - .returns(BbPromise.resolve()); + invokeStub = sinon.stub(googleInvoke, 'invoke').returns(BbPromise.resolve()); + printResultStub = sinon.stub(googleInvoke, 'printResult').returns(BbPromise.resolve()); }); afterEach(() => { @@ -49,8 +47,8 @@ describe('InvokeFunction', () => { googleInvoke.printResult.restore(); }); - it('should run promise chain', () => googleInvoke - .invokeFunction().then(() => { + it('should run promise chain', () => + googleInvoke.invokeFunction().then(() => { expect(invokeStub.calledOnce).toEqual(true); expect(printResultStub.calledAfter(invokeStub)); })); @@ -71,18 +69,21 @@ describe('InvokeFunction', () => { googleInvoke.options.function = 'func1'; return googleInvoke.invoke().then(() => { - expect(requestStub.calledWithExactly( - 'cloudfunctions', - 'projects', - 'locations', - 'functions', - 'call', - { - name: 'projects/my-project/locations/us-central1/functions/foo', - resource: { - data: '', - }, - })).toEqual(true); + expect( + requestStub.calledWithExactly( + 'cloudfunctions', + 'projects', + 'locations', + 'functions', + 'call', + { + name: 'projects/my-project/locations/us-central1/functions/foo', + resource: { + data: '', + }, + } + ) + ).toEqual(true); }); }); @@ -91,18 +92,21 @@ describe('InvokeFunction', () => { googleInvoke.options.data = '{ "some": "json" }'; return googleInvoke.invoke().then(() => { - expect(requestStub.calledWithExactly( - 'cloudfunctions', - 'projects', - 'locations', - 'functions', - 'call', - { - name: 'projects/my-project/locations/us-central1/functions/foo', - resource: { - data: googleInvoke.options.data, - }, - })).toEqual(true); + expect( + requestStub.calledWithExactly( + 'cloudfunctions', + 'projects', + 'locations', + 'functions', + 'call', + { + name: 'projects/my-project/locations/us-central1/functions/foo', + resource: { + data: googleInvoke.options.data, + }, + } + ) + ).toEqual(true); }); }); @@ -130,8 +134,7 @@ describe('InvokeFunction', () => { result: 'Foo bar', }; - const expectedOutput = - `${chalk.grey('wasdqwerty')} Foo bar`; + const expectedOutput = `${chalk.grey('wasdqwerty')} Foo bar`; return googleInvoke.printResult(result).then(() => { expect(consoleLogStub.calledWithExactly(expectedOutput)).toEqual(true); @@ -141,8 +144,9 @@ describe('InvokeFunction', () => { it('should print an error message to the console when no result was received', () => { const result = {}; - const expectedOutput = - `${chalk.grey('error')} An error occurred while executing your function...`; + const expectedOutput = `${chalk.grey( + 'error' + )} An error occurred while executing your function...`; return googleInvoke.printResult(result).then(() => { expect(consoleLogStub.calledWithExactly(expectedOutput)).toEqual(true); diff --git a/logs/googleLogs.js b/logs/googleLogs.js index d7023da..adc1e23 100644 --- a/logs/googleLogs.js +++ b/logs/googleLogs.js @@ -14,9 +14,7 @@ class GoogleLogs { this.commands = { logs: { - lifecycleEvents: [ - 'logs', - ], + lifecycleEvents: ['logs'], options: { count: { usage: 'Amount of requested logs', @@ -26,19 +24,15 @@ class GoogleLogs { }, }; - Object.assign( - this, - validate, - setDefaults, - retrieveLogs); + Object.assign(this, validate, setDefaults, retrieveLogs); this.hooks = { - 'before:logs:logs': () => BbPromise.bind(this) - .then(this.validate) - .then(this.setDefaults), + 'before:logs:logs': () => + BbPromise.bind(this) + .then(this.validate) + .then(this.setDefaults), - 'logs:logs': () => BbPromise.bind(this) - .then(this.retrieveLogs), + 'logs:logs': () => BbPromise.bind(this).then(this.retrieveLogs), }; } } diff --git a/logs/googleLogs.test.js b/logs/googleLogs.test.js index b7bb457..7173505 100644 --- a/logs/googleLogs.test.js +++ b/logs/googleLogs.test.js @@ -40,8 +40,7 @@ describe('GoogleLogs', () => { }); it('should have the lifecycle event "logs" for the "logs" command', () => { - expect(googleLogs.commands.logs.lifecycleEvents) - .toEqual(['logs']); + expect(googleLogs.commands.logs.lifecycleEvents).toEqual(['logs']); }); it('should have the option "count" with the "c" shortcut', () => { @@ -59,12 +58,9 @@ describe('GoogleLogs', () => { let retrieveLogsStub; beforeEach(() => { - validateStub = sinon.stub(googleLogs, 'validate') - .returns(BbPromise.resolve()); - setDefaultsStub = sinon.stub(googleLogs, 'setDefaults') - .returns(BbPromise.resolve()); - retrieveLogsStub = sinon.stub(googleLogs, 'retrieveLogs') - .returns(BbPromise.resolve()); + validateStub = sinon.stub(googleLogs, 'validate').returns(BbPromise.resolve()); + setDefaultsStub = sinon.stub(googleLogs, 'setDefaults').returns(BbPromise.resolve()); + retrieveLogsStub = sinon.stub(googleLogs, 'retrieveLogs').returns(BbPromise.resolve()); }); afterEach(() => { @@ -73,14 +69,14 @@ describe('GoogleLogs', () => { googleLogs.retrieveLogs.restore(); }); - it('should run "before:logs:logs" promise chain', () => googleLogs - .hooks['before:logs:logs']().then(() => { + it('should run "before:logs:logs" promise chain', () => + googleLogs.hooks['before:logs:logs']().then(() => { expect(validateStub.calledOnce).toEqual(true); expect(setDefaultsStub.calledAfter(validateStub)).toEqual(true); })); - it('should run "logs:logs" promise chain', () => googleLogs - .hooks['logs:logs']().then(() => { + it('should run "logs:logs" promise chain', () => + googleLogs.hooks['logs:logs']().then(() => { expect(retrieveLogsStub.calledOnce).toEqual(true); })); }); diff --git a/logs/lib/retrieveLogs.js b/logs/lib/retrieveLogs.js index 52fac0c..e0447d6 100644 --- a/logs/lib/retrieveLogs.js +++ b/logs/lib/retrieveLogs.js @@ -23,16 +23,15 @@ module.exports = { return this.provider.request('logging', 'entries', 'list', { filter: `Function execution ${func} ${region}`, orderBy: 'timestamp desc', - resourceNames: [ - `projects/${project}`, - ], + resourceNames: [`projects/${project}`], pageSize, }); }, printLogs(logs) { if (!logs.entries || !logs.entries.length) { - logs = { //eslint-disable-line + logs = { + //eslint-disable-line entries: [ { timestamp: new Date().toISOString().slice(0, 10), @@ -42,8 +41,10 @@ module.exports = { }; } - let output = logs.entries - .reduce((p, c, i) => p += `${chalk.grey(c.timestamp + ':')} ${c.textPayload}\n`, ''); //eslint-disable-line + let output = logs.entries.reduce( + (p, c) => (p += `${chalk.grey(`${c.timestamp}:`)} ${c.textPayload}\n`), + '' + ); //eslint-disable-line output = `Displaying the ${logs.entries.length} most recent log(s):\n\n${output}`; // prettify output output = output.slice(0, output.length - 1); // remove "\n---\n\n" for the last log entry diff --git a/logs/lib/retrieveLogs.test.js b/logs/lib/retrieveLogs.test.js index 41f293f..610c925 100644 --- a/logs/lib/retrieveLogs.test.js +++ b/logs/lib/retrieveLogs.test.js @@ -38,10 +38,8 @@ describe('RetrieveLogs', () => { let printLogsStub; beforeEach(() => { - getLogsStub = sinon.stub(googleLogs, 'getLogs') - .returns(BbPromise.resolve()); - printLogsStub = sinon.stub(googleLogs, 'printLogs') - .returns(BbPromise.resolve()); + getLogsStub = sinon.stub(googleLogs, 'getLogs').returns(BbPromise.resolve()); + printLogsStub = sinon.stub(googleLogs, 'printLogs').returns(BbPromise.resolve()); }); afterEach(() => { @@ -49,8 +47,8 @@ describe('RetrieveLogs', () => { googleLogs.printLogs.restore(); }); - it('should run promise chain', () => googleLogs - .retrieveLogs().then(() => { + it('should run promise chain', () => + googleLogs.retrieveLogs().then(() => { expect(getLogsStub.calledOnce).toEqual(true); expect(printLogsStub.calledAfter(getLogsStub)); })); @@ -71,18 +69,14 @@ describe('RetrieveLogs', () => { googleLogs.options.function = 'func1'; return googleLogs.getLogs().then(() => { - expect(requestStub.calledWithExactly( - 'logging', - 'entries', - 'list', - { + expect( + requestStub.calledWithExactly('logging', 'entries', 'list', { filter: 'Function execution foo us-central1', orderBy: 'timestamp desc', - resourceNames: [ - 'projects/my-project', - ], + resourceNames: ['projects/my-project'], pageSize: 10, - })).toEqual(true); + }) + ).toEqual(true); }); }); @@ -91,18 +85,14 @@ describe('RetrieveLogs', () => { googleLogs.options.count = 100; return googleLogs.getLogs().then(() => { - expect(requestStub.calledWithExactly( - 'logging', - 'entries', - 'list', - { + expect( + requestStub.calledWithExactly('logging', 'entries', 'list', { filter: 'Function execution foo us-central1', orderBy: 'timestamp desc', - resourceNames: [ - 'projects/my-project', - ], + resourceNames: ['projects/my-project'], pageSize: googleLogs.options.count, - })).toEqual(true); + }) + ).toEqual(true); }); }); @@ -134,8 +124,7 @@ describe('RetrieveLogs', () => { const logEntry1 = `${chalk.grey('1970-01-01 00:00:')} Entry 1`; const logEntry2 = `${chalk.grey('1970-01-01 00:01:')} Entry 2`; - const expectedOutput = - `Displaying the 2 most recent log(s):\n\n${logEntry1}\n${logEntry2}`; + const expectedOutput = `Displaying the 2 most recent log(s):\n\n${logEntry1}\n${logEntry2}`; return googleLogs.printLogs(logs).then(() => { expect(consoleLogStub.calledWithExactly(expectedOutput)).toEqual(true); @@ -145,8 +134,7 @@ describe('RetrieveLogs', () => { it('should print a default message to the console when no logs were received', () => { const date = `${new Date().toISOString().slice(0, 10)}:`; const logEntry = `${chalk.grey(date)} There is no log data to show...`; - const expectedOutput = - `Displaying the 1 most recent log(s):\n\n${logEntry}`; + const expectedOutput = `Displaying the 1 most recent log(s):\n\n${logEntry}`; return googleLogs.printLogs({}).then(() => { expect(consoleLogStub.calledWithExactly(expectedOutput)).toEqual(true); diff --git a/package.json b/package.json index 3d5becf..449877a 100644 --- a/package.json +++ b/package.json @@ -2,17 +2,8 @@ "name": "serverless-google-cloudfunctions", "version": "2.4.0", "description": "Provider plugin for the Serverless Framework v1.x which adds support for Google Cloud Functions.", - "main": "index.js", "author": "serverless.com", - "license": "MIT", - "repository": { - "git": "https://github.com/serverless/serverless-google-cloudfunctions" - }, - "scripts": { - "test": "jest", - "coverage": "jest --coverage", - "lint": "eslint . --cache" - }, + "repository": "serverless/serverless-google-cloudfunctions", "homepage": "https://github.com/serverless/serverless-google-cloudfunctions", "keywords": [ "serverless", @@ -24,20 +15,64 @@ "internet of things", "serverless.com" ], + "eslintConfig": { + "extends": "@serverless/eslint-config/node", + "root": true + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.js": [ + "eslint" + ], + "*.{css,html,js,json,md,yaml,yml}": [ + "prettier -c" + ] + }, + "standard-version": { + "skip": { + "commit": true, + "tag": true + } + }, "dependencies": { "async": "^2.6.3", - "bluebird": "^3.5.5", + "bluebird": "^3.7.2", "chalk": "^2.4.2", "fs-extra": "^8.1.0", - "googleapis": "^41.0.1", + "googleapis": "^39.2.0", "lodash": "^4.17.15" }, "devDependencies": { - "coveralls": "^3.0.5", - "eslint": "^3.19.0", - "eslint-config-airbnb-base": "^11.3.2", - "eslint-plugin-import": "^2.18.1", - "jest": "^24.8.0", - "sinon": "^7.3.2" - } + "@commitlint/cli": "^8.3.5", + "@serverless/eslint-config": "^1.2.1", + "coveralls": "^3.0.9", + "eslint": "^6.8.0", + "eslint-plugin-import": "^2.20.1", + "git-list-updated": "^1.2.1", + "github-release-from-cc-changelog": "^2.2.0", + "husky": "^4.2.3", + "jest": "^24.9.0", + "lint-staged": "^10.0.8", + "prettier": "^1.19.1", + "sinon": "^7.5.0", + "standard-version": "^7.1.0" + }, + "scripts": { + "commitlint": "commitlint -f HEAD@{15}", + "commitlint:pull-request": "commitlint -f HEAD~1", + "coverage": "jest --coverage", + "lint": "eslint . --cache", + "lint:updated": "pipe-git-updated --ext=js -- eslint --cache", + "prepare-release": "standard-version && prettier --write CHANGELOG.md", + "prettier-check": "prettier -c --ignore-path .gitignore \"**/*.{css,html,js,json,md,yaml,yml}\"", + "prettier-check:updated": "pipe-git-updated --ext=css --ext=html --ext=js --ext=json --ext=md --ext=yaml --ext=yml -- prettier -c", + "prettify": "prettier --write --ignore-path .gitignore \"**/*.{css,html,js,json,md,yaml,yml}\"", + "prettify:updated": "pipe-git-updated --ext=css --ext=html --ext=js --ext=json --ext=md --ext=yaml --ext=yml -- prettier --write", + "test": "jest" + }, + "license": "MIT" } diff --git a/package/googlePackage.js b/package/googlePackage.js index d1cc375..e08a4f8 100644 --- a/package/googlePackage.js +++ b/package/googlePackage.js @@ -30,30 +30,32 @@ class GooglePackage { generateArtifactDirectoryName, compileFunctions, mergeServiceResources, - saveUpdateTemplateFile); + saveUpdateTemplateFile + ); this.hooks = { - 'package:cleanup': () => BbPromise.bind(this) - .then(this.cleanupServerlessDir), + 'package:cleanup': () => BbPromise.bind(this).then(this.cleanupServerlessDir), - 'before:package:initialize': () => BbPromise.bind(this) - .then(this.validate) - .then(this.setDefaults), + 'before:package:initialize': () => + BbPromise.bind(this) + .then(this.validate) + .then(this.setDefaults), - 'package:initialize': () => BbPromise.bind(this) - .then(this.setDeploymentBucketName) - .then(this.prepareDeployment) - .then(this.saveCreateTemplateFile), + 'package:initialize': () => + BbPromise.bind(this) + .then(this.setDeploymentBucketName) + .then(this.prepareDeployment) + .then(this.saveCreateTemplateFile), - 'before:package:compileFunctions': () => BbPromise.bind(this) - .then(this.generateArtifactDirectoryName), + 'before:package:compileFunctions': () => + BbPromise.bind(this).then(this.generateArtifactDirectoryName), - 'package:compileFunctions': () => BbPromise.bind(this) - .then(this.compileFunctions), + 'package:compileFunctions': () => BbPromise.bind(this).then(this.compileFunctions), - 'package:finalize': () => BbPromise.bind(this) - .then(this.mergeServiceResources) - .then(this.saveUpdateTemplateFile), + 'package:finalize': () => + BbPromise.bind(this) + .then(this.mergeServiceResources) + .then(this.saveUpdateTemplateFile), }; } } diff --git a/package/googlePackage.test.js b/package/googlePackage.test.js index 084def7..27c77a6 100644 --- a/package/googlePackage.test.js +++ b/package/googlePackage.test.js @@ -48,25 +48,31 @@ describe('GooglePackage', () => { let saveUpdateTemplateFileStub; beforeEach(() => { - cleanupServerlessDirStub = sinon.stub(googlePackage, 'cleanupServerlessDir') + cleanupServerlessDirStub = sinon + .stub(googlePackage, 'cleanupServerlessDir') .returns(BbPromise.resolve()); - validateStub = sinon.stub(googlePackage, 'validate') + validateStub = sinon.stub(googlePackage, 'validate').returns(BbPromise.resolve()); + setDefaultsStub = sinon.stub(googlePackage, 'setDefaults').returns(BbPromise.resolve()); + setDeploymentBucketNameStub = sinon + .stub(googlePackage, 'setDeploymentBucketName') .returns(BbPromise.resolve()); - setDefaultsStub = sinon.stub(googlePackage, 'setDefaults') + prepareDeploymentStub = sinon + .stub(googlePackage, 'prepareDeployment') .returns(BbPromise.resolve()); - setDeploymentBucketNameStub = sinon.stub(googlePackage, 'setDeploymentBucketName') + saveCreateTemplateFileStub = sinon + .stub(googlePackage, 'saveCreateTemplateFile') .returns(BbPromise.resolve()); - prepareDeploymentStub = sinon.stub(googlePackage, 'prepareDeployment') + generateArtifactDirectoryNameStub = sinon + .stub(googlePackage, 'generateArtifactDirectoryName') .returns(BbPromise.resolve()); - saveCreateTemplateFileStub = sinon.stub(googlePackage, 'saveCreateTemplateFile') + compileFunctionsStub = sinon + .stub(googlePackage, 'compileFunctions') .returns(BbPromise.resolve()); - generateArtifactDirectoryNameStub = sinon.stub(googlePackage, 'generateArtifactDirectoryName') + mergeServiceResourcesStub = sinon + .stub(googlePackage, 'mergeServiceResources') .returns(BbPromise.resolve()); - compileFunctionsStub = sinon.stub(googlePackage, 'compileFunctions') - .returns(BbPromise.resolve()); - mergeServiceResourcesStub = sinon.stub(googlePackage, 'mergeServiceResources') - .returns(BbPromise.resolve()); - saveUpdateTemplateFileStub = sinon.stub(googlePackage, 'saveUpdateTemplateFile') + saveUpdateTemplateFileStub = sinon + .stub(googlePackage, 'saveUpdateTemplateFile') .returns(BbPromise.resolve()); }); @@ -83,36 +89,36 @@ describe('GooglePackage', () => { googlePackage.saveUpdateTemplateFile.restore(); }); - it('should run "package:cleanup" promise chain', () => googlePackage - .hooks['package:cleanup']().then(() => { + it('should run "package:cleanup" promise chain', () => + googlePackage.hooks['package:cleanup']().then(() => { expect(cleanupServerlessDirStub.calledOnce).toEqual(true); })); - it('should run "before:package:initialize" promise chain', () => googlePackage - .hooks['before:package:initialize']().then(() => { + it('should run "before:package:initialize" promise chain', () => + googlePackage.hooks['before:package:initialize']().then(() => { expect(validateStub.calledOnce).toEqual(true); expect(setDefaultsStub.calledAfter(validateStub)).toEqual(true); })); - it('should run "package:initialize" promise chain', () => googlePackage - .hooks['package:initialize']().then(() => { + it('should run "package:initialize" promise chain', () => + googlePackage.hooks['package:initialize']().then(() => { expect(setDeploymentBucketNameStub.calledOnce).toEqual(true); expect(prepareDeploymentStub.calledAfter(setDeploymentBucketNameStub)).toEqual(true); expect(saveCreateTemplateFileStub.calledAfter(prepareDeploymentStub)).toEqual(true); })); - it('should run "before:package:compileFunctions" promise chain', () => googlePackage - .hooks['before:package:compileFunctions']().then(() => { + it('should run "before:package:compileFunctions" promise chain', () => + googlePackage.hooks['before:package:compileFunctions']().then(() => { expect(generateArtifactDirectoryNameStub.calledOnce).toEqual(true); })); - it('should run "package:compileFunctions" promise chain', () => googlePackage - .hooks['package:compileFunctions']().then(() => { + it('should run "package:compileFunctions" promise chain', () => + googlePackage.hooks['package:compileFunctions']().then(() => { expect(compileFunctionsStub.calledOnce).toEqual(true); })); - it('should run "package:finalize" promise chain', () => googlePackage - .hooks['package:finalize']().then(() => { + it('should run "package:finalize" promise chain', () => + googlePackage.hooks['package:finalize']().then(() => { expect(mergeServiceResourcesStub.calledOnce).toEqual(true); expect(saveUpdateTemplateFileStub.calledAfter(mergeServiceResourcesStub)).toEqual(true); })); diff --git a/package/lib/compileFunctions.js b/package/lib/compileFunctions.js index 55114de..436f0ca 100644 --- a/package/lib/compileFunctions.js +++ b/package/lib/compileFunctions.js @@ -12,14 +12,12 @@ module.exports = { const artifactFilePath = this.serverless.service.package.artifact; const fileName = artifactFilePath.split(path.sep).pop(); - this.serverless.service.package - .artifactFilePath = `${this.serverless.service.package.artifactDirectoryName}/${fileName}`; + this.serverless.service.package.artifactFilePath = `${this.serverless.service.package.artifactDirectoryName}/${fileName}`; - this.serverless.service.getAllFunctions().forEach((functionName) => { + this.serverless.service.getAllFunctions().forEach(functionName => { const funcObject = this.serverless.service.getFunction(functionName); - this.serverless.cli - .log(`Compiling function "${functionName}"...`); + this.serverless.cli.log(`Compiling function "${functionName}"...`); validateHandlerProperty(funcObject, functionName); validateEventsProperty(funcObject, functionName); @@ -28,22 +26,23 @@ module.exports = { const funcTemplate = getFunctionTemplate( funcObject, this.serverless.service.provider.region, - `gs://${ - this.serverless.service.provider.deploymentBucketName - }/${this.serverless.service.package.artifactFilePath}`); - - funcTemplate.properties.availableMemoryMb = _.get(funcObject, 'memorySize') - || _.get(this, 'serverless.service.provider.memorySize') - || 256; - funcTemplate.properties.location = _.get(funcObject, 'location') - || _.get(this, 'serverless.service.provider.region') - || 'us-central1'; - funcTemplate.properties.runtime = _.get(funcObject, 'runtime') - || _.get(this, 'serverless.service.provider.runtime') - || 'nodejs8'; - funcTemplate.properties.timeout = _.get(funcObject, 'timeout') - || _.get(this, 'serverless.service.provider.timeout') - || '60s'; + `gs://${this.serverless.service.provider.deploymentBucketName}/${this.serverless.service.package.artifactFilePath}` + ); + + funcTemplate.properties.availableMemoryMb = + _.get(funcObject, 'memorySize') || + _.get(this, 'serverless.service.provider.memorySize') || + 256; + funcTemplate.properties.location = + _.get(funcObject, 'location') || + _.get(this, 'serverless.service.provider.region') || + 'us-central1'; + funcTemplate.properties.runtime = + _.get(funcObject, 'runtime') || + _.get(this, 'serverless.service.provider.runtime') || + 'nodejs8'; + funcTemplate.properties.timeout = + _.get(funcObject, 'timeout') || _.get(this, 'serverless.service.provider.timeout') || '60s'; funcTemplate.properties.environmentVariables = _.merge( {}, _.get(this, 'serverless.service.provider.environment'), @@ -51,8 +50,9 @@ module.exports = { ); if (funcObject.vpc) { - _.assign(funcTemplate.properties, { vpcConnector: _.get(funcObject, 'vpc') - || _.get(this, 'serverless.service.provider.vpc') }); + _.assign(funcTemplate.properties, { + vpcConnector: _.get(funcObject, 'vpc') || _.get(this, 'serverless.service.provider.vpc'), + }); } funcTemplate.properties.maxInstances = funcObject.maxInstances; @@ -61,7 +61,8 @@ module.exports = { delete funcTemplate.properties.environmentVariables; } - funcTemplate.properties.labels = _.assign({}, + funcTemplate.properties.labels = _.assign( + {}, _.get(this, 'serverless.service.provider.labels') || {}, _.get(funcObject, 'labels') || {} // eslint-disable-line comma-dangle ); @@ -147,7 +148,8 @@ const validateVpcConnectorProperty = (funcObject, functionName) => { } }; -const getFunctionTemplate = (funcObject, region, sourceArchiveUrl) => { //eslint-disable-line +const getFunctionTemplate = (funcObject, region, sourceArchiveUrl) => { + //eslint-disable-line return { type: 'cloudfunctions.v1beta2.function', name: funcObject.name, diff --git a/package/lib/compileFunctions.test.js b/package/lib/compileFunctions.test.js index 2ad10fe..77b9d7b 100644 --- a/package/lib/compileFunctions.test.js +++ b/package/lib/compileFunctions.test.js @@ -74,10 +74,7 @@ describe('CompileFunctions', () => { googlePackage.serverless.service.functions = { func1: { handler: 'func1', - events: [ - { http: 'event1' }, - { http: 'event2' }, - ], + events: [{ http: 'event1' }, { http: 'event2' }], }, }; @@ -88,9 +85,7 @@ describe('CompileFunctions', () => { googlePackage.serverless.service.functions = { func1: { handler: 'func1', - events: [ - { invalidEvent: 'event1' }, - ], + events: [{ invalidEvent: 'event1' }], }, }; @@ -103,33 +98,34 @@ describe('CompileFunctions', () => { handler: 'func1', memorySize: 1024, runtime: 'nodejs8', - events: [ - { http: 'foo' }, - ], + events: [{ http: 'foo' }], }, }; - const compiledResources = [{ - type: 'cloudfunctions.v1beta2.function', - name: 'my-service-dev-func1', - properties: { - location: 'us-central1', - runtime: 'nodejs8', - function: 'func1', - availableMemoryMb: 1024, - timeout: '60s', - sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', - httpsTrigger: { - url: 'foo', + const compiledResources = [ + { + type: 'cloudfunctions.v1beta2.function', + name: 'my-service-dev-func1', + properties: { + location: 'us-central1', + runtime: 'nodejs8', + function: 'func1', + availableMemoryMb: 1024, + timeout: '60s', + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', + httpsTrigger: { + url: 'foo', + }, + labels: {}, }, - labels: {}, }, - }]; + ]; return googlePackage.compileFunctions().then(() => { expect(consoleLogStub.calledOnce).toEqual(true); - expect(googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources) - .toEqual(compiledResources); + expect( + googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources + ).toEqual(compiledResources); }); }); @@ -137,34 +133,35 @@ describe('CompileFunctions', () => { googlePackage.serverless.service.functions = { func1: { handler: 'func1', - events: [ - { http: 'foo' }, - ], + events: [{ http: 'foo' }], }, }; googlePackage.serverless.service.provider.memorySize = 1024; - const compiledResources = [{ - type: 'cloudfunctions.v1beta2.function', - name: 'my-service-dev-func1', - properties: { - location: 'us-central1', - runtime: 'nodejs8', - function: 'func1', - availableMemoryMb: 1024, - timeout: '60s', - sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', - httpsTrigger: { - url: 'foo', + const compiledResources = [ + { + type: 'cloudfunctions.v1beta2.function', + name: 'my-service-dev-func1', + properties: { + location: 'us-central1', + runtime: 'nodejs8', + function: 'func1', + availableMemoryMb: 1024, + timeout: '60s', + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', + httpsTrigger: { + url: 'foo', + }, + labels: {}, }, - labels: {}, }, - }]; + ]; return googlePackage.compileFunctions().then(() => { expect(consoleLogStub.calledOnce).toEqual(true); - expect(googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources) - .toEqual(compiledResources); + expect( + googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources + ).toEqual(compiledResources); }); }); @@ -173,33 +170,34 @@ describe('CompileFunctions', () => { func1: { handler: 'func1', timeout: '120s', - events: [ - { http: 'foo' }, - ], + events: [{ http: 'foo' }], }, }; - const compiledResources = [{ - type: 'cloudfunctions.v1beta2.function', - name: 'my-service-dev-func1', - properties: { - location: 'us-central1', - runtime: 'nodejs8', - function: 'func1', - availableMemoryMb: 256, - timeout: '120s', - sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', - httpsTrigger: { - url: 'foo', + const compiledResources = [ + { + type: 'cloudfunctions.v1beta2.function', + name: 'my-service-dev-func1', + properties: { + location: 'us-central1', + runtime: 'nodejs8', + function: 'func1', + availableMemoryMb: 256, + timeout: '120s', + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', + httpsTrigger: { + url: 'foo', + }, + labels: {}, }, - labels: {}, }, - }]; + ]; return googlePackage.compileFunctions().then(() => { expect(consoleLogStub.calledOnce).toEqual(true); - expect(googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources) - .toEqual(compiledResources); + expect( + googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources + ).toEqual(compiledResources); }); }); @@ -207,34 +205,35 @@ describe('CompileFunctions', () => { googlePackage.serverless.service.functions = { func1: { handler: 'func1', - events: [ - { http: 'foo' }, - ], + events: [{ http: 'foo' }], }, }; googlePackage.serverless.service.provider.timeout = '120s'; - const compiledResources = [{ - type: 'cloudfunctions.v1beta2.function', - name: 'my-service-dev-func1', - properties: { - location: 'us-central1', - runtime: 'nodejs8', - function: 'func1', - availableMemoryMb: 256, - timeout: '120s', - sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', - httpsTrigger: { - url: 'foo', + const compiledResources = [ + { + type: 'cloudfunctions.v1beta2.function', + name: 'my-service-dev-func1', + properties: { + location: 'us-central1', + runtime: 'nodejs8', + function: 'func1', + availableMemoryMb: 256, + timeout: '120s', + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', + httpsTrigger: { + url: 'foo', + }, + labels: {}, }, - labels: {}, }, - }]; + ]; return googlePackage.compileFunctions().then(() => { expect(consoleLogStub.calledOnce).toEqual(true); - expect(googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources) - .toEqual(compiledResources); + expect( + googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources + ).toEqual(compiledResources); }); }); @@ -245,35 +244,36 @@ describe('CompileFunctions', () => { labels: { test: 'label', }, - events: [ - { http: 'foo' }, - ], + events: [{ http: 'foo' }], }, }; - const compiledResources = [{ - type: 'cloudfunctions.v1beta2.function', - name: 'my-service-dev-func1', - properties: { - location: 'us-central1', - runtime: 'nodejs8', - function: 'func1', - availableMemoryMb: 256, - timeout: '60s', - sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', - httpsTrigger: { - url: 'foo', - }, - labels: { - test: 'label', + const compiledResources = [ + { + type: 'cloudfunctions.v1beta2.function', + name: 'my-service-dev-func1', + properties: { + location: 'us-central1', + runtime: 'nodejs8', + function: 'func1', + availableMemoryMb: 256, + timeout: '60s', + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', + httpsTrigger: { + url: 'foo', + }, + labels: { + test: 'label', + }, }, }, - }]; + ]; return googlePackage.compileFunctions().then(() => { expect(consoleLogStub.calledOnce).toEqual(true); - expect(googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources) - .toEqual(compiledResources); + expect( + googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources + ).toEqual(compiledResources); }); }); @@ -281,38 +281,39 @@ describe('CompileFunctions', () => { googlePackage.serverless.service.functions = { func1: { handler: 'func1', - events: [ - { http: 'foo' }, - ], + events: [{ http: 'foo' }], }, }; googlePackage.serverless.service.provider.labels = { test: 'label', }; - const compiledResources = [{ - type: 'cloudfunctions.v1beta2.function', - name: 'my-service-dev-func1', - properties: { - location: 'us-central1', - runtime: 'nodejs8', - function: 'func1', - availableMemoryMb: 256, - timeout: '60s', - sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', - httpsTrigger: { - url: 'foo', - }, - labels: { - test: 'label', + const compiledResources = [ + { + type: 'cloudfunctions.v1beta2.function', + name: 'my-service-dev-func1', + properties: { + location: 'us-central1', + runtime: 'nodejs8', + function: 'func1', + availableMemoryMb: 256, + timeout: '60s', + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', + httpsTrigger: { + url: 'foo', + }, + labels: { + test: 'label', + }, }, }, - }]; + ]; return googlePackage.compileFunctions().then(() => { expect(consoleLogStub.calledOnce).toEqual(true); - expect(googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources) - .toEqual(compiledResources); + expect( + googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources + ).toEqual(compiledResources); }); }); @@ -320,9 +321,7 @@ describe('CompileFunctions', () => { googlePackage.serverless.service.functions = { func1: { handler: 'func1', - events: [ - { http: 'foo' }, - ], + events: [{ http: 'foo' }], labels: { test: 'functionLabel', }, @@ -333,30 +332,33 @@ describe('CompileFunctions', () => { secondTest: 'tested', }; - const compiledResources = [{ - type: 'cloudfunctions.v1beta2.function', - name: 'my-service-dev-func1', - properties: { - location: 'us-central1', - runtime: 'nodejs8', - function: 'func1', - availableMemoryMb: 256, - timeout: '60s', - sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', - httpsTrigger: { - url: 'foo', - }, - labels: { - test: 'functionLabel', - secondTest: 'tested', + const compiledResources = [ + { + type: 'cloudfunctions.v1beta2.function', + name: 'my-service-dev-func1', + properties: { + location: 'us-central1', + runtime: 'nodejs8', + function: 'func1', + availableMemoryMb: 256, + timeout: '60s', + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', + httpsTrigger: { + url: 'foo', + }, + labels: { + test: 'functionLabel', + secondTest: 'tested', + }, }, }, - }]; + ]; return googlePackage.compileFunctions().then(() => { expect(consoleLogStub.calledOnce).toEqual(true); - expect(googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources) - .toEqual(compiledResources); + expect( + googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources + ).toEqual(compiledResources); }); }); @@ -367,36 +369,37 @@ describe('CompileFunctions', () => { environment: { TEST_VAR: 'test', }, - events: [ - { http: 'foo' }, - ], + events: [{ http: 'foo' }], }, }; - const compiledResources = [{ - type: 'cloudfunctions.v1beta2.function', - name: 'my-service-dev-func1', - properties: { - location: 'us-central1', - runtime: 'nodejs8', - function: 'func1', - availableMemoryMb: 256, - environmentVariables: { - TEST_VAR: 'test', - }, - timeout: '60s', - sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', - httpsTrigger: { - url: 'foo', + const compiledResources = [ + { + type: 'cloudfunctions.v1beta2.function', + name: 'my-service-dev-func1', + properties: { + location: 'us-central1', + runtime: 'nodejs8', + function: 'func1', + availableMemoryMb: 256, + environmentVariables: { + TEST_VAR: 'test', + }, + timeout: '60s', + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', + httpsTrigger: { + url: 'foo', + }, + labels: {}, }, - labels: {}, }, - }]; + ]; return googlePackage.compileFunctions().then(() => { expect(consoleLogStub.calledOnce).toEqual(true); - expect(googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources) - .toEqual(compiledResources); + expect( + googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources + ).toEqual(compiledResources); }); }); @@ -404,39 +407,40 @@ describe('CompileFunctions', () => { googlePackage.serverless.service.functions = { func1: { handler: 'func1', - events: [ - { http: 'foo' }, - ], + events: [{ http: 'foo' }], }, }; googlePackage.serverless.service.provider.environment = { TEST_VAR: 'test', }; - const compiledResources = [{ - type: 'cloudfunctions.v1beta2.function', - name: 'my-service-dev-func1', - properties: { - location: 'us-central1', - runtime: 'nodejs8', - function: 'func1', - availableMemoryMb: 256, - environmentVariables: { - TEST_VAR: 'test', - }, - timeout: '60s', - sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', - httpsTrigger: { - url: 'foo', + const compiledResources = [ + { + type: 'cloudfunctions.v1beta2.function', + name: 'my-service-dev-func1', + properties: { + location: 'us-central1', + runtime: 'nodejs8', + function: 'func1', + availableMemoryMb: 256, + environmentVariables: { + TEST_VAR: 'test', + }, + timeout: '60s', + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', + httpsTrigger: { + url: 'foo', + }, + labels: {}, }, - labels: {}, }, - }]; + ]; return googlePackage.compileFunctions().then(() => { expect(consoleLogStub.calledOnce).toEqual(true); - expect(googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources) - .toEqual(compiledResources); + expect( + googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources + ).toEqual(compiledResources); }); }); @@ -448,9 +452,7 @@ describe('CompileFunctions', () => { TEST_VAR: 'test_var', TEST_VALUE: 'foobar', }, - events: [ - { http: 'foo' }, - ], + events: [{ http: 'foo' }], }, }; googlePackage.serverless.service.provider.environment = { @@ -458,37 +460,39 @@ describe('CompileFunctions', () => { TEST_FOO: 'foo', }; - const compiledResources = [{ - type: 'cloudfunctions.v1beta2.function', - name: 'my-service-dev-func1', - properties: { - location: 'us-central1', - runtime: 'nodejs8', - function: 'func1', - availableMemoryMb: 256, - environmentVariables: { - TEST_VAR: 'test_var', - TEST_VALUE: 'foobar', - TEST_FOO: 'foo', - }, - timeout: '60s', - sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', - httpsTrigger: { - url: 'foo', + const compiledResources = [ + { + type: 'cloudfunctions.v1beta2.function', + name: 'my-service-dev-func1', + properties: { + location: 'us-central1', + runtime: 'nodejs8', + function: 'func1', + availableMemoryMb: 256, + environmentVariables: { + TEST_VAR: 'test_var', + TEST_VALUE: 'foobar', + TEST_FOO: 'foo', + }, + timeout: '60s', + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', + httpsTrigger: { + url: 'foo', + }, + labels: {}, }, - labels: {}, }, - }]; + ]; return googlePackage.compileFunctions().then(() => { expect(consoleLogStub.calledOnce).toEqual(true); - expect(googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources) - .toEqual(compiledResources); - expect(googlePackage.serverless.service.provider.environment) - .toEqual({ - TEST_VAR: 'test', - TEST_FOO: 'foo', - }); + expect( + googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources + ).toEqual(compiledResources); + expect(googlePackage.serverless.service.provider.environment).toEqual({ + TEST_VAR: 'test', + TEST_FOO: 'foo', + }); }); }); @@ -496,33 +500,34 @@ describe('CompileFunctions', () => { googlePackage.serverless.service.functions = { func1: { handler: 'func1', - events: [ - { http: 'foo' }, - ], + events: [{ http: 'foo' }], }, }; - const compiledResources = [{ - type: 'cloudfunctions.v1beta2.function', - name: 'my-service-dev-func1', - properties: { - location: 'us-central1', - runtime: 'nodejs8', - function: 'func1', - availableMemoryMb: 256, - timeout: '60s', - sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', - httpsTrigger: { - url: 'foo', + const compiledResources = [ + { + type: 'cloudfunctions.v1beta2.function', + name: 'my-service-dev-func1', + properties: { + location: 'us-central1', + runtime: 'nodejs8', + function: 'func1', + availableMemoryMb: 256, + timeout: '60s', + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', + httpsTrigger: { + url: 'foo', + }, + labels: {}, }, - labels: {}, }, - }]; + ]; return googlePackage.compileFunctions().then(() => { expect(consoleLogStub.calledOnce).toEqual(true); - expect(googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources) - .toEqual(compiledResources); + expect( + googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources + ).toEqual(compiledResources); }); }); @@ -593,8 +598,9 @@ describe('CompileFunctions', () => { return googlePackage.compileFunctions().then(() => { expect(consoleLogStub.called).toEqual(true); - expect(googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources) - .toEqual(compiledResources); + expect( + googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources + ).toEqual(compiledResources); }); }); @@ -605,34 +611,35 @@ describe('CompileFunctions', () => { memorySize: 128, runtime: 'nodejs8', vpc: 'projects/pg-us-n-app-123456/locations/us-central1/connectors/my-vpc', - events: [ - { http: 'foo' }, - ], + events: [{ http: 'foo' }], }, }; - const compiledResources = [{ - type: 'cloudfunctions.v1beta2.function', - name: 'my-service-dev-func1', - properties: { - location: 'us-central1', - runtime: 'nodejs8', - function: 'func1', - availableMemoryMb: 128, - timeout: '60s', - sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', - httpsTrigger: { - url: 'foo', + const compiledResources = [ + { + type: 'cloudfunctions.v1beta2.function', + name: 'my-service-dev-func1', + properties: { + location: 'us-central1', + runtime: 'nodejs8', + function: 'func1', + availableMemoryMb: 128, + timeout: '60s', + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', + httpsTrigger: { + url: 'foo', + }, + labels: {}, + vpcConnector: 'projects/pg-us-n-app-123456/locations/us-central1/connectors/my-vpc', }, - labels: {}, - vpcConnector: 'projects/pg-us-n-app-123456/locations/us-central1/connectors/my-vpc', }, - }]; + ]; return googlePackage.compileFunctions().then(() => { expect(consoleLogStub.called).toEqual(true); - expect(googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources) - .toEqual(compiledResources); + expect( + googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources + ).toEqual(compiledResources); }); }); @@ -644,35 +651,36 @@ describe('CompileFunctions', () => { runtime: 'nodejs8', maxInstances: 10, vpc: 'projects/pg-us-n-app-123456/locations/us-central1/connectors/my-vpc', - events: [ - { http: 'foo' }, - ], + events: [{ http: 'foo' }], }, }; - const compiledResources = [{ - type: 'cloudfunctions.v1beta2.function', - name: 'my-service-dev-func1', - properties: { - location: 'us-central1', - runtime: 'nodejs8', - function: 'func1', - availableMemoryMb: 128, - timeout: '60s', - maxInstances: 10, - sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', - httpsTrigger: { - url: 'foo', + const compiledResources = [ + { + type: 'cloudfunctions.v1beta2.function', + name: 'my-service-dev-func1', + properties: { + location: 'us-central1', + runtime: 'nodejs8', + function: 'func1', + availableMemoryMb: 128, + timeout: '60s', + maxInstances: 10, + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', + httpsTrigger: { + url: 'foo', + }, + labels: {}, + vpcConnector: 'projects/pg-us-n-app-123456/locations/us-central1/connectors/my-vpc', }, - labels: {}, - vpcConnector: 'projects/pg-us-n-app-123456/locations/us-central1/connectors/my-vpc', }, - }]; + ]; return googlePackage.compileFunctions().then(() => { expect(consoleLogStub.called).toEqual(true); - expect(googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources) - .toEqual(compiledResources); + expect( + googlePackage.serverless.service.provider.compiledConfigurationTemplate.resources + ).toEqual(compiledResources); }); }); }); diff --git a/package/lib/generateArtifactDirectoryName.js b/package/lib/generateArtifactDirectoryName.js index f99075c..054b267 100644 --- a/package/lib/generateArtifactDirectoryName.js +++ b/package/lib/generateArtifactDirectoryName.js @@ -8,8 +8,7 @@ module.exports = { const serviceWithStage = `${this.serverless.service.service}/${this.options.stage}`; const dateString = `${date.getTime().toString()}-${date.toISOString()}`; - this.serverless.service.package - .artifactDirectoryName = `serverless/${serviceWithStage}/${dateString}`; + this.serverless.service.package.artifactDirectoryName = `serverless/${serviceWithStage}/${dateString}`; return BbPromise.resolve(); }, diff --git a/package/lib/generateArtifactDirectoryName.test.js b/package/lib/generateArtifactDirectoryName.test.js index 17c2217..514dbc5 100644 --- a/package/lib/generateArtifactDirectoryName.test.js +++ b/package/lib/generateArtifactDirectoryName.test.js @@ -26,8 +26,7 @@ describe('GenerateArtifactDirectoryName', () => { const expectedRegex = new RegExp('serverless/my-service/dev/.*'); return googlePackage.generateArtifactDirectoryName().then(() => { - expect(serverless.service.package.artifactDirectoryName) - .toMatch(expectedRegex); + expect(serverless.service.package.artifactDirectoryName).toMatch(expectedRegex); }); }); }); diff --git a/package/lib/mergeServiceResources.js b/package/lib/mergeServiceResources.js index 7b73940..4ffa1fd 100644 --- a/package/lib/mergeServiceResources.js +++ b/package/lib/mergeServiceResources.js @@ -9,12 +9,13 @@ module.exports = { mergeServiceResources() { const resources = this.serverless.service.resources; - if ((typeof resources === 'undefined') || _.isEmpty(resources)) return BbPromise.resolve(); + if (typeof resources === 'undefined' || _.isEmpty(resources)) return BbPromise.resolve(); _.mergeWith( this.serverless.service.provider.compiledConfigurationTemplate, resources, - mergeCustomizer); + mergeCustomizer + ); return BbPromise.resolve(); }, diff --git a/package/lib/mergeServiceResources.test.js b/package/lib/mergeServiceResources.test.js index 057ca92..f3d6870 100644 --- a/package/lib/mergeServiceResources.test.js +++ b/package/lib/mergeServiceResources.test.js @@ -1,4 +1,4 @@ -'use stict'; +'use strict'; const GoogleProvider = require('../../provider/googleProvider'); const GooglePackage = require('../googlePackage'); @@ -22,18 +22,16 @@ describe('MergeServiceResources', () => { googlePackage = new GooglePackage(serverless, options); }); - it('should resolve if service resources are not defined', () => googlePackage - .mergeServiceResources().then(() => { - expect(serverless.service.provider - .compiledConfigurationTemplate).toEqual({}); + it('should resolve if service resources are not defined', () => + googlePackage.mergeServiceResources().then(() => { + expect(serverless.service.provider.compiledConfigurationTemplate).toEqual({}); })); it('should resolve if service resources is empty', () => { serverless.service.resources = {}; return googlePackage.mergeServiceResources().then(() => { - expect(serverless.service.provider - .compiledConfigurationTemplate).toEqual({}); + expect(serverless.service.provider.compiledConfigurationTemplate).toEqual({}); }); }); @@ -94,8 +92,7 @@ describe('MergeServiceResources', () => { }; return googlePackage.mergeServiceResources().then(() => { - expect(serverless.service.provider.compiledConfigurationTemplate) - .toEqual(expectedResult); + expect(serverless.service.provider.compiledConfigurationTemplate).toEqual(expectedResult); }); }); }); diff --git a/package/lib/prepareDeployment.js b/package/lib/prepareDeployment.js index 6ab1259..da28508 100644 --- a/package/lib/prepareDeployment.js +++ b/package/lib/prepareDeployment.js @@ -12,11 +12,8 @@ module.exports = { let deploymentTemplate = this.serverless.service.provider.compiledConfigurationTemplate; deploymentTemplate = this.serverless.utils.readFileSync( - path.join( - __dirname, - '..', - 'templates', - 'core-configuration-template.yml')); + path.join(__dirname, '..', 'templates', 'core-configuration-template.yml') + ); const bucket = deploymentTemplate.resources.find(findDeploymentBucket); @@ -39,7 +36,7 @@ const updateBucketName = (bucket, name) => { return newBucket; }; -const findDeploymentBucket = (resource) => { +const findDeploymentBucket = resource => { const type = 'storage.v1.bucket'; const name = 'will-be-replaced-by-serverless'; diff --git a/package/lib/prepareDeployment.test.js b/package/lib/prepareDeployment.test.js index b42fb07..64e955b 100644 --- a/package/lib/prepareDeployment.test.js +++ b/package/lib/prepareDeployment.test.js @@ -57,8 +57,9 @@ describe('PrepareDeployment', () => { return googlePackage.prepareDeployment().then(() => { expect(readFileSyncStub.calledOnce).toEqual(true); - expect(serverless.service.provider - .compiledConfigurationTemplate).toEqual(expectedCompiledConfiguration); + expect(serverless.service.provider.compiledConfigurationTemplate).toEqual( + expectedCompiledConfiguration + ); }); }); }); diff --git a/package/lib/writeFilesToDisk.js b/package/lib/writeFilesToDisk.js index fc4da9f..b233369 100644 --- a/package/lib/writeFilesToDisk.js +++ b/package/lib/writeFilesToDisk.js @@ -8,21 +8,31 @@ const BbPromise = require('bluebird'); module.exports = { saveCreateTemplateFile() { - const filePath = path.join(this.serverless.config.servicePath, - '.serverless', 'configuration-template-create.yml'); + const filePath = path.join( + this.serverless.config.servicePath, + '.serverless', + 'configuration-template-create.yml' + ); - this.serverless.utils.writeFileSync(filePath, - this.serverless.service.provider.compiledConfigurationTemplate); + this.serverless.utils.writeFileSync( + filePath, + this.serverless.service.provider.compiledConfigurationTemplate + ); return BbPromise.resolve(); }, saveUpdateTemplateFile() { - const filePath = path.join(this.serverless.config.servicePath, - '.serverless', 'configuration-template-update.yml'); - - this.serverless.utils.writeFileSync(filePath, - this.serverless.service.provider.compiledConfigurationTemplate); + const filePath = path.join( + this.serverless.config.servicePath, + '.serverless', + 'configuration-template-update.yml' + ); + + this.serverless.utils.writeFileSync( + filePath, + this.serverless.service.provider.compiledConfigurationTemplate + ); return BbPromise.resolve(); }, diff --git a/package/lib/writeFilesToDisk.test.js b/package/lib/writeFilesToDisk.test.js index 6c54c87..987d203 100644 --- a/package/lib/writeFilesToDisk.test.js +++ b/package/lib/writeFilesToDisk.test.js @@ -42,14 +42,16 @@ describe('WriteFilesToDisk', () => { const createFilePath = path.join( googlePackage.serverless.config.servicePath, '.serverless', - 'configuration-template-create.yml', + 'configuration-template-create.yml' ); return googlePackage.saveCreateTemplateFile().then(() => { - expect(writeFileSyncStub.calledWithExactly( - createFilePath, - googlePackage.serverless.service.provider.compiledConfigurationTemplate, - )).toEqual(true); + expect( + writeFileSyncStub.calledWithExactly( + createFilePath, + googlePackage.serverless.service.provider.compiledConfigurationTemplate + ) + ).toEqual(true); }); }); }); @@ -59,14 +61,16 @@ describe('WriteFilesToDisk', () => { const updateFilePath = path.join( googlePackage.serverless.config.servicePath, '.serverless', - 'configuration-template-update.yml', + 'configuration-template-update.yml' ); return googlePackage.saveUpdateTemplateFile().then(() => { - expect(writeFileSyncStub.calledWithExactly( - updateFilePath, - googlePackage.serverless.service.provider.compiledConfigurationTemplate, - )).toEqual(true); + expect( + writeFileSyncStub.calledWithExactly( + updateFilePath, + googlePackage.serverless.service.provider.compiledConfigurationTemplate + ) + ).toEqual(true); }); }); }); diff --git a/package/templates/core-configuration-template.yml b/package/templates/core-configuration-template.yml index 12f779b..225d6d2 100644 --- a/package/templates/core-configuration-template.yml +++ b/package/templates/core-configuration-template.yml @@ -1,3 +1,3 @@ resources: -- type: storage.v1.bucket - name: will-be-replaced-by-serverless + - type: storage.v1.bucket + name: will-be-replaced-by-serverless diff --git a/prettier.config.js b/prettier.config.js new file mode 100644 index 0000000..5f45afa --- /dev/null +++ b/prettier.config.js @@ -0,0 +1,3 @@ +'use strict'; + +module.exports = require('@serverless/eslint-config/prettier.config'); diff --git a/provider/googleProvider.js b/provider/googleProvider.js index 98d52f8..ebb4d04 100644 --- a/provider/googleProvider.js +++ b/provider/googleProvider.js @@ -46,7 +46,7 @@ class GoogleProvider { request() { // grab necessary stuff from arguments array const lastArg = arguments[Object.keys(arguments).pop()]; //eslint-disable-line - const hasParams = (typeof lastArg === 'object'); + const hasParams = typeof lastArg === 'object'; const filArgs = _.filter(arguments, v => typeof v === 'string'); //eslint-disable-line const params = hasParams ? lastArg : {}; @@ -62,11 +62,20 @@ class GoogleProvider { // merge the params from the request call into the base functionParams _.merge(requestParams, params); - return filArgs.reduce(((p, c) => p[c]), this.sdk).bind(serviceInstance)(requestParams) + return filArgs + .reduce((p, c) => p[c], this.sdk) + .bind(serviceInstance)(requestParams) .then(result => result.data) - .catch((error) => { - if (error && error.errors && error.errors[0].message && _.includes(error.errors[0].message, 'project 1043443644444')) { - throw new Error("Incorrect configuration. Please change the 'project' key in the 'provider' block in your Serverless config file."); + .catch(error => { + if ( + error && + error.errors && + error.errors[0].message && + _.includes(error.errors[0].message, 'project 1043443644444') + ) { + throw new Error( + "Incorrect configuration. Please change the 'project' key in the 'provider' block in your Serverless config file." + ); } else if (error) { throw error; } @@ -75,8 +84,8 @@ class GoogleProvider { } getAuthClient() { - let credentials = this.serverless.service.provider.credentials - || process.env.GOOGLE_APPLICATION_CREDENTIALS; + let credentials = + this.serverless.service.provider.credentials || process.env.GOOGLE_APPLICATION_CREDENTIALS; const credParts = credentials.split(path.sep); if (credParts[0] === '~') { @@ -87,8 +96,9 @@ class GoogleProvider { const keyFileContent = fs.readFileSync(credentials).toString(); const key = JSON.parse(keyFileContent); - return new google.auth - .JWT(key.client_email, null, key.private_key, ['https://www.googleapis.com/auth/cloud-platform']); + return new google.auth.JWT(key.client_email, null, key.private_key, [ + 'https://www.googleapis.com/auth/cloud-platform', + ]); } isServiceSupported(service) { diff --git a/provider/googleProvider.test.js b/provider/googleProvider.test.js index 68b8fe0..08b501f 100644 --- a/provider/googleProvider.test.js +++ b/provider/googleProvider.test.js @@ -26,10 +26,10 @@ describe('GoogleProvider', () => { }, }; setProviderStub = sinon.stub(serverless, 'setProvider').returns(); - readFileSyncStub = sinon.stub(fs, 'readFileSync') + readFileSyncStub = sinon + .stub(fs, 'readFileSync') .returns('{"client_email": "foo@bar.de","private_key": "wasdqwerty"}'); - homedirStub = sinon.stub(os, 'homedir') - .returns('/root'); + homedirStub = sinon.stub(os, 'homedir').returns('/root'); googleProvider = new GoogleProvider(serverless); }); @@ -61,17 +61,13 @@ describe('GoogleProvider', () => { it('should set the used SDKs', () => { expect(googleProvider.sdk.google).toBeDefined(); - expect(googleProvider.sdk.deploymentmanager) - .toBeDefined(); + expect(googleProvider.sdk.deploymentmanager).toBeDefined(); - expect(googleProvider.sdk.storage) - .toBeDefined(); + expect(googleProvider.sdk.storage).toBeDefined(); - expect(googleProvider.sdk.logging) - .toBeDefined(); + expect(googleProvider.sdk.logging).toBeDefined(); - expect(googleProvider.sdk.cloudfunctions) - .toBeDefined(); + expect(googleProvider.sdk.cloudfunctions).toBeDefined(); }); it('should set the google options', () => { @@ -113,7 +109,7 @@ describe('GoogleProvider', () => { googleProvider.sdk.service.resource.method.bind = () => sinon.stub().resolves({ data: 'result' }); - return googleProvider.request('service', 'resource', 'method', {}).then((result) => { + return googleProvider.request('service', 'resource', 'method', {}).then(result => { expect(result).toEqual('result'); }); }); @@ -122,16 +118,18 @@ describe('GoogleProvider', () => { googleProvider.sdk.service.resource.method.bind = () => sinon.stub().rejects({ errors: [{ message: 'project 1043443644444' }] }); - return expect(googleProvider.request('service', 'resource', 'method', {})) - .rejects.toThrow(/Incorrect configuration/); + return expect(googleProvider.request('service', 'resource', 'method', {})).rejects.toThrow( + /Incorrect configuration/ + ); }); it('should re-throw other errors', () => { googleProvider.sdk.service.resource.method.bind = () => sinon.stub().rejects(new Error('some error message')); - return expect(googleProvider.request('service', 'resource', 'method', {})) - .rejects.toThrow('some error message'); + return expect(googleProvider.request('service', 'resource', 'method', {})).rejects.toThrow( + 'some error message' + ); }); }); @@ -139,8 +137,7 @@ describe('GoogleProvider', () => { it('should return a new authClient', () => { const authClient = googleProvider.getAuthClient(); - expect(readFileSyncStub.calledWithExactly('/root/.gcloud/project-1234.json')) - .toEqual(true); + expect(readFileSyncStub.calledWithExactly('/root/.gcloud/project-1234.json')).toEqual(true); expect(authClient).toBeInstanceOf(google.auth.JWT); }); @@ -150,8 +147,7 @@ describe('GoogleProvider', () => { const authClient = googleProvider.getAuthClient(); expect(homedirStub.calledOnce).toEqual(true); - expect(readFileSyncStub.calledWithExactly('/root/.gcloud/project-1234.json')) - .toEqual(true); + expect(readFileSyncStub.calledWithExactly('/root/.gcloud/project-1234.json')).toEqual(true); expect(authClient).toBeInstanceOf(google.auth.JWT); }); }); diff --git a/remove/googleRemove.js b/remove/googleRemove.js index ecbc066..89c6aaa 100644 --- a/remove/googleRemove.js +++ b/remove/googleRemove.js @@ -22,17 +22,20 @@ class GoogleRemove { setDeploymentBucketName, emptyDeploymentBucket, removeDeployment, - monitorDeployment); + monitorDeployment + ); this.hooks = { - 'before:remove:remove': () => BbPromise.bind(this) - .then(this.validate) - .then(this.setDefaults) - .then(this.setDeploymentBucketName), + 'before:remove:remove': () => + BbPromise.bind(this) + .then(this.validate) + .then(this.setDefaults) + .then(this.setDeploymentBucketName), - 'remove:remove': () => BbPromise.bind(this) - .then(this.emptyDeploymentBucket) - .then(this.removeDeployment), + 'remove:remove': () => + BbPromise.bind(this) + .then(this.emptyDeploymentBucket) + .then(this.removeDeployment), }; } } diff --git a/remove/googleRemove.test.js b/remove/googleRemove.test.js index 2411ac1..03ffa3e 100644 --- a/remove/googleRemove.test.js +++ b/remove/googleRemove.test.js @@ -43,15 +43,16 @@ describe('GoogleRemove', () => { let removeDeploymentStub; beforeEach(() => { - validateStub = sinon.stub(googleRemove, 'validate') + validateStub = sinon.stub(googleRemove, 'validate').returns(BbPromise.resolve()); + setDefaultsStub = sinon.stub(googleRemove, 'setDefaults').returns(BbPromise.resolve()); + setDeploymentBucketNameStub = sinon + .stub(googleRemove, 'setDeploymentBucketName') .returns(BbPromise.resolve()); - setDefaultsStub = sinon.stub(googleRemove, 'setDefaults') + emptyDeploymentBucketStub = sinon + .stub(googleRemove, 'emptyDeploymentBucket') .returns(BbPromise.resolve()); - setDeploymentBucketNameStub = sinon.stub(googleRemove, 'setDeploymentBucketName') - .returns(BbPromise.resolve()); - emptyDeploymentBucketStub = sinon.stub(googleRemove, 'emptyDeploymentBucket') - .returns(BbPromise.resolve()); - removeDeploymentStub = sinon.stub(googleRemove, 'removeDeployment') + removeDeploymentStub = sinon + .stub(googleRemove, 'removeDeployment') .returns(BbPromise.resolve()); }); @@ -63,15 +64,15 @@ describe('GoogleRemove', () => { googleRemove.removeDeployment.restore(); }); - it('should run "before:remove:remove" promise chain', () => googleRemove - .hooks['before:remove:remove']().then(() => { + it('should run "before:remove:remove" promise chain', () => + googleRemove.hooks['before:remove:remove']().then(() => { expect(validateStub.calledOnce).toEqual(true); expect(setDefaultsStub.calledAfter(validateStub)).toEqual(true); expect(setDeploymentBucketNameStub.calledAfter(setDefaultsStub)).toEqual(true); })); - it('should run "remove:remove" promise chain', () => googleRemove - .hooks['remove:remove']().then(() => { + it('should run "remove:remove" promise chain', () => + googleRemove.hooks['remove:remove']().then(() => { expect(emptyDeploymentBucketStub.calledOnce).toEqual(true); expect(removeDeploymentStub.calledAfter(emptyDeploymentBucketStub)).toEqual(true); })); diff --git a/remove/lib/emptyDeploymentBucket.js b/remove/lib/emptyDeploymentBucket.js index e38e2a8..90b4e72 100644 --- a/remove/lib/emptyDeploymentBucket.js +++ b/remove/lib/emptyDeploymentBucket.js @@ -14,12 +14,11 @@ module.exports = { bucket: this.serverless.service.provider.deploymentBucketName, }; - return this.provider.request('storage', 'objects', 'list', params) - .then((response) => { - if (!response.items || !response.items.length) return BbPromise.resolve([]); + return this.provider.request('storage', 'objects', 'list', params).then(response => { + if (!response.items || !response.items.length) return BbPromise.resolve([]); - return BbPromise.resolve(response.items); - }); + return BbPromise.resolve(response.items); + }); }, removeObjects(objectsToRemove) { @@ -27,7 +26,7 @@ module.exports = { this.serverless.cli.log('Removing artifacts in deployment bucket...'); - const removePromises = objectsToRemove.map((object) => { + const removePromises = objectsToRemove.map(object => { const params = { bucket: object.bucket, object: object.name, diff --git a/remove/lib/emptyDeploymentBucket.test.js b/remove/lib/emptyDeploymentBucket.test.js index e4d5ec1..04050b9 100644 --- a/remove/lib/emptyDeploymentBucket.test.js +++ b/remove/lib/emptyDeploymentBucket.test.js @@ -34,10 +34,10 @@ describe('EmptyDeploymentBucket', () => { let removeObjectsStub; beforeEach(() => { - getObjectsToRemoveStub = sinon.stub(googleRemove, 'getObjectsToRemove') - .returns(BbPromise.resolve()); - removeObjectsStub = sinon.stub(googleRemove, 'removeObjects') + getObjectsToRemoveStub = sinon + .stub(googleRemove, 'getObjectsToRemove') .returns(BbPromise.resolve()); + removeObjectsStub = sinon.stub(googleRemove, 'removeObjects').returns(BbPromise.resolve()); }); afterEach(() => { @@ -45,8 +45,8 @@ describe('EmptyDeploymentBucket', () => { googleRemove.removeObjects.restore(); }); - it('should run promise chain', () => googleRemove - .emptyDeploymentBucket().then(() => { + it('should run promise chain', () => + googleRemove.emptyDeploymentBucket().then(() => { expect(getObjectsToRemoveStub.calledOnce).toEqual(true); expect(removeObjectsStub.calledAfter(getObjectsToRemoveStub)); })); @@ -69,16 +69,14 @@ describe('EmptyDeploymentBucket', () => { }; requestStub.returns(BbPromise.resolve(response)); - return googleRemove.getObjectsToRemove().then((objects) => { + return googleRemove.getObjectsToRemove().then(objects => { expect(objects.length).toEqual(0); expect(objects).toEqual([]); - expect(requestStub.calledWithExactly( - 'storage', - 'objects', - 'list', - { + expect( + requestStub.calledWithExactly('storage', 'objects', 'list', { bucket: 'sls-my-service-dev-12345678', - })).toEqual(true); + }) + ).toEqual(true); }); }); @@ -97,7 +95,7 @@ describe('EmptyDeploymentBucket', () => { }; requestStub.returns(BbPromise.resolve(response)); - return googleRemove.getObjectsToRemove().then((objects) => { + return googleRemove.getObjectsToRemove().then(objects => { expect(objects.length).toEqual(2); expect(objects).toContainEqual({ bucket: 'sls-my-service-dev-12345678', @@ -107,13 +105,11 @@ describe('EmptyDeploymentBucket', () => { bucket: 'sls-my-service-dev-12345678', name: `${key}/141264711231-2016-08-18T15:43:00/artifact.zip`, }); - expect(requestStub.calledWithExactly( - 'storage', - 'objects', - 'list', - { + expect( + requestStub.calledWithExactly('storage', 'objects', 'list', { bucket: 'sls-my-service-dev-12345678', - })).toEqual(true); + }) + ).toEqual(true); }); }); }); @@ -155,13 +151,10 @@ describe('EmptyDeploymentBucket', () => { requestStub.returns(BbPromise.resolve('removePromise')); - return googleRemove.removeObjects(objectsToRemove).then((removePromises) => { + return googleRemove.removeObjects(objectsToRemove).then(removePromises => { expect(requestStub.called).toEqual(true); expect(consoleLogStub.calledOnce).toEqual(true); - expect(removePromises).toEqual([ - 'removePromise', - 'removePromise', - ]); + expect(removePromises).toEqual(['removePromise', 'removePromise']); }); }); }); diff --git a/remove/lib/removeDeployment.js b/remove/lib/removeDeployment.js index d7beaf9..eb23413 100644 --- a/remove/lib/removeDeployment.js +++ b/remove/lib/removeDeployment.js @@ -11,7 +11,8 @@ module.exports = { deployment: deploymentName, }; - return this.provider.request('deploymentmanager', 'deployments', 'delete', params) + return this.provider + .request('deploymentmanager', 'deployments', 'delete', params) .then(() => this.monitorDeployment(deploymentName, 'remove', 5000)); }, }; diff --git a/remove/lib/removeDeployment.test.js b/remove/lib/removeDeployment.test.js index 5aeba87..810b298 100644 --- a/remove/lib/removeDeployment.test.js +++ b/remove/lib/removeDeployment.test.js @@ -37,7 +37,8 @@ describe('RemoveDeployment', () => { beforeEach(() => { consoleLogStub = sinon.stub(googleRemove.serverless.cli, 'log').returns(); - monitorDeploymentStub = sinon.stub(googleRemove, 'monitorDeployment') + monitorDeploymentStub = sinon + .stub(googleRemove, 'monitorDeployment') .returns(BbPromise.resolve()); }); @@ -55,15 +56,12 @@ describe('RemoveDeployment', () => { return googleRemove.removeDeployment().then(() => { expect(consoleLogStub.calledOnce).toEqual(true); - expect(requestStub.calledWithExactly( - 'deploymentmanager', - 'deployments', - 'delete', - params)).toEqual(true); - expect(monitorDeploymentStub.calledWithExactly( - 'sls-my-service-dev', - 'remove', - 5000)).toEqual(true); + expect( + requestStub.calledWithExactly('deploymentmanager', 'deployments', 'delete', params) + ).toEqual(true); + expect( + monitorDeploymentStub.calledWithExactly('sls-my-service-dev', 'remove', 5000) + ).toEqual(true); }); }); }); diff --git a/shared/monitorDeployment.js b/shared/monitorDeployment.js index 661bd8b..3d53243 100644 --- a/shared/monitorDeployment.js +++ b/shared/monitorDeployment.js @@ -7,9 +7,7 @@ const async = require('async'); module.exports = { monitorDeployment(deploymentName, action, frequency) { - const validStatuses = [ - 'DONE', - ]; + const validStatuses = ['DONE']; let deploymentStatus = null; @@ -17,15 +15,16 @@ module.exports = { return new BbPromise((resolve, reject) => { async.whilst( - () => (validStatuses.indexOf(deploymentStatus) === -1), + () => validStatuses.indexOf(deploymentStatus) === -1, - (callback) => { + callback => { setTimeout(() => { const params = { project: this.serverless.service.provider.project, }; - return this.provider.request('deploymentmanager', 'deployments', 'list', params) - .then((response) => { + return this.provider + .request('deploymentmanager', 'deployments', 'list', params) + .then(response => { // if actions is "remove" and no deployments are left set to "DONE" if (!response.deployments && action === 'remove') { deploymentStatus = 'DONE'; @@ -47,7 +46,7 @@ module.exports = { this.serverless.cli.printDot(); return callback(); }) - .catch((error) => { + .catch(error => { reject(error); }); }, frequency); @@ -58,19 +57,17 @@ module.exports = { this.serverless.cli.consoleLog(''); this.serverless.cli.log('Done...'); resolve(deploymentStatus); - }); + } + ); }); }, }; -const throwErrorIfDeploymentFails = (deployment) => { +const throwErrorIfDeploymentFails = deployment => { if (deployment.operation.error && deployment.operation.error.errors.length) { const errorCode = deployment.operation.error.errors[0].code; const parsedDetails = deployment.operation.error.errors[0].message; - const errorMessage = [ - `Deployment failed: ${errorCode}\n\n`, - ` ${parsedDetails}`, - ].join(''); + const errorMessage = [`Deployment failed: ${errorCode}\n\n`, ` ${parsedDetails}`].join(''); throw new Error(errorMessage); } }; diff --git a/shared/monitorDeployment.test.js b/shared/monitorDeployment.test.js index 33c103a..cfd3065 100644 --- a/shared/monitorDeployment.test.js +++ b/shared/monitorDeployment.test.js @@ -65,14 +65,15 @@ describe('MonitorDeployment', () => { requestStub.onCall(0).returns(BbPromise.resolve(response1)); requestStub.onCall(1).returns(BbPromise.resolve(response2)); - return googleCommand.monitorDeployment(deploymentName, 'create', 10) - .then((deploymentStatus) => { + return googleCommand + .monitorDeployment(deploymentName, 'create', 10) + .then(deploymentStatus => { expect(consoleLogStub.called).toEqual(true); - expect(requestStub.calledWithExactly( - 'deploymentmanager', - 'deployments', - 'list', - { project: 'my-project' })).toEqual(true); + expect( + requestStub.calledWithExactly('deploymentmanager', 'deployments', 'list', { + project: 'my-project', + }) + ).toEqual(true); expect(deploymentStatus).toEqual('DONE'); }); }); @@ -99,13 +100,13 @@ describe('MonitorDeployment', () => { requestStub.returns(BbPromise.resolve(response)); - return googleCommand.monitorDeployment(deploymentName, 'update', 10).catch((error) => { + return googleCommand.monitorDeployment(deploymentName, 'update', 10).catch(error => { expect(consoleLogStub.called).toEqual(true); - expect(requestStub.calledWithExactly( - 'deploymentmanager', - 'deployments', - 'list', - { project: 'my-project' })).toEqual(true); + expect( + requestStub.calledWithExactly('deploymentmanager', 'deployments', 'list', { + project: 'my-project', + }) + ).toEqual(true); expect(error.toString()).toMatch(/Error detail/); }); }); @@ -118,14 +119,15 @@ describe('MonitorDeployment', () => { requestStub.returns(BbPromise.resolve(response)); - return googleCommand.monitorDeployment(deploymentName, 'remove', 10) - .then((deploymentStatus) => { + return googleCommand + .monitorDeployment(deploymentName, 'remove', 10) + .then(deploymentStatus => { expect(consoleLogStub.called).toEqual(true); - expect(requestStub.calledWithExactly( - 'deploymentmanager', - 'deployments', - 'list', - { project: 'my-project' })).toEqual(true); + expect( + requestStub.calledWithExactly('deploymentmanager', 'deployments', 'list', { + project: 'my-project', + }) + ).toEqual(true); expect(deploymentStatus).toEqual('DONE'); }); }); @@ -133,21 +135,20 @@ describe('MonitorDeployment', () => { it('should stop if the deployment is unavailable and the action is "remove"', () => { const deploymentName = 'sls-my-service-dev'; const response = { - deployments: [ - { name: 'a-different-deployment' }, - ], + deployments: [{ name: 'a-different-deployment' }], }; requestStub.returns(BbPromise.resolve(response)); - return googleCommand.monitorDeployment(deploymentName, 'remove', 10) - .then((deploymentStatus) => { + return googleCommand + .monitorDeployment(deploymentName, 'remove', 10) + .then(deploymentStatus => { expect(consoleLogStub.called).toEqual(true); - expect(requestStub.calledWithExactly( - 'deploymentmanager', - 'deployments', - 'list', - { project: 'my-project' })).toEqual(true); + expect( + requestStub.calledWithExactly('deploymentmanager', 'deployments', 'list', { + project: 'my-project', + }) + ).toEqual(true); expect(deploymentStatus).toEqual('DONE'); }); }); diff --git a/shared/setDeploymentBucketName.js b/shared/setDeploymentBucketName.js index c428e9b..6273105 100644 --- a/shared/setDeploymentBucketName.js +++ b/shared/setDeploymentBucketName.js @@ -8,7 +8,7 @@ module.exports = { // set a default name for the deployment bucket const service = this.serverless.service.service; const stage = this.options.stage; - const timestamp = (+new Date()); + const timestamp = +new Date(); const name = `sls-${service}-${stage}-${timestamp}`; this.serverless.service.provider.deploymentBucketName = name; @@ -19,14 +19,15 @@ module.exports = { deployment: `sls-${this.serverless.service.service}-${this.options.stage}`, }; - return this.provider.request('deploymentmanager', 'resources', 'list', params) - .then((response) => { + return this.provider + .request('deploymentmanager', 'resources', 'list', params) + .then(response => { if (!_.isEmpty(response) && response.resources) { const regex = new RegExp(`sls-${service}-${stage}-.+`); - const deploymentBucket = response.resources - .find(resource => (resource.type === 'storage.v1.bucket' - && resource.name.match(regex))); + const deploymentBucket = response.resources.find( + resource => resource.type === 'storage.v1.bucket' && resource.name.match(regex) + ); this.serverless.service.provider.deploymentBucketName = deploymentBucket.name; } diff --git a/shared/setDeploymentBucketName.test.js b/shared/setDeploymentBucketName.test.js index 84b936a..ae6cbc5 100644 --- a/shared/setDeploymentBucketName.test.js +++ b/shared/setDeploymentBucketName.test.js @@ -39,14 +39,13 @@ describe('SetDeploymentBucketName', () => { requestStub.returns(BbPromise.reject()); return googleCommand.setDeploymentBucketName().then(() => { - expect(serverless.service.provider.deploymentBucketName) - .toMatch(/sls-my-service-dev-.+/); - expect(requestStub.calledWithExactly( - 'deploymentmanager', - 'resources', - 'list', - { project: 'my-project', deployment: 'sls-my-service-dev' }, - )).toEqual(true); + expect(serverless.service.provider.deploymentBucketName).toMatch(/sls-my-service-dev-.+/); + expect( + requestStub.calledWithExactly('deploymentmanager', 'resources', 'list', { + project: 'my-project', + deployment: 'sls-my-service-dev', + }) + ).toEqual(true); }); }); @@ -55,14 +54,13 @@ describe('SetDeploymentBucketName', () => { requestStub.returns(BbPromise.resolve(response)); return googleCommand.setDeploymentBucketName().then(() => { - expect(serverless.service.provider.deploymentBucketName) - .toMatch(/sls-my-service-dev-.+/); - expect(requestStub.calledWithExactly( - 'deploymentmanager', - 'resources', - 'list', - { project: 'my-project', deployment: 'sls-my-service-dev' }, - )).toEqual(true); + expect(serverless.service.provider.deploymentBucketName).toMatch(/sls-my-service-dev-.+/); + expect( + requestStub.calledWithExactly('deploymentmanager', 'resources', 'list', { + project: 'my-project', + deployment: 'sls-my-service-dev', + }) + ).toEqual(true); }); }); @@ -77,14 +75,15 @@ describe('SetDeploymentBucketName', () => { requestStub.returns(BbPromise.resolve(response)); return googleCommand.setDeploymentBucketName().then(() => { - expect(serverless.service.provider.deploymentBucketName) - .toEqual('sls-my-service-dev-12345678'); - expect(requestStub.calledWithExactly( - 'deploymentmanager', - 'resources', - 'list', - { project: 'my-project', deployment: 'sls-my-service-dev' }, - )).toEqual(true); + expect(serverless.service.provider.deploymentBucketName).toEqual( + 'sls-my-service-dev-12345678' + ); + expect( + requestStub.calledWithExactly('deploymentmanager', 'resources', 'list', { + project: 'my-project', + deployment: 'sls-my-service-dev', + }) + ).toEqual(true); }); }); }); diff --git a/shared/utils.js b/shared/utils.js index 2ad8657..9558d42 100644 --- a/shared/utils.js +++ b/shared/utils.js @@ -5,7 +5,8 @@ const BbPromise = require('bluebird'); module.exports = { setDefaults() { - this.options.stage = _.get(this, 'options.stage') || _.get(this, 'serverless.service.provider.stage') || 'dev'; + this.options.stage = + _.get(this, 'options.stage') || _.get(this, 'serverless.service.provider.stage') || 'dev'; this.options.runtime = _.get(this, 'options.runtime') || 'nodejs8'; // serverless framework is hard-coding us-east-1 region from aws diff --git a/shared/utils.test.js b/shared/utils.test.js index 494d180..6c6cb6a 100644 --- a/shared/utils.test.js +++ b/shared/utils.test.js @@ -20,8 +20,8 @@ describe('Utils', () => { }); describe('#setDefaults()', () => { - it('should set default values for options if not provided', () => googleCommand - .setDefaults().then(() => { + it('should set default values for options if not provided', () => + googleCommand.setDefaults().then(() => { expect(googleCommand.options.stage).toEqual('dev'); expect(googleCommand.options.region).toEqual('us-central1'); expect(googleCommand.options.runtime).toEqual('nodejs8'); @@ -39,7 +39,6 @@ describe('Utils', () => { }); }); - it('should set the provider values for stage and region if provided', () => { googleCommand.serverless.service.provider = { region: 'my-region', @@ -52,8 +51,8 @@ describe('Utils', () => { }); }); - it('shoud default to the us-central1 region when no region is provided', () => googleCommand - .setDefaults().then(() => { + it('shoud default to the us-central1 region when no region is provided', () => + googleCommand.setDefaults().then(() => { expect(googleCommand.options.region).toEqual('us-central1'); })); }); diff --git a/shared/validate.test.js b/shared/validate.test.js index 8e6d08f..186cc5b 100644 --- a/shared/validate.test.js +++ b/shared/validate.test.js @@ -30,11 +30,14 @@ describe('Validate', () => { let validateHandlersStub; beforeEach(() => { - validateServicePathStub = sinon.stub(googleCommand, 'validateServicePath') + validateServicePathStub = sinon + .stub(googleCommand, 'validateServicePath') .returns(BbPromise.resolve()); - validateServiceNameStub = sinon.stub(googleCommand, 'validateServiceName') + validateServiceNameStub = sinon + .stub(googleCommand, 'validateServiceName') .returns(BbPromise.resolve()); - validateHandlersStub = sinon.stub(googleCommand, 'validateHandlers') + validateHandlersStub = sinon + .stub(googleCommand, 'validateHandlers') .returns(BbPromise.resolve()); }); @@ -44,8 +47,8 @@ describe('Validate', () => { googleCommand.validateHandlers.restore(); }); - it('should run promise chain', () => googleCommand - .validate().then(() => { + it('should run promise chain', () => + googleCommand.validate().then(() => { expect(validateServicePathStub.calledOnce).toEqual(true); expect(validateServiceNameStub.calledAfter(validateServicePathStub)); expect(validateHandlersStub.calledAfter(validateServiceNameStub)); diff --git a/shell.nix b/shell.nix deleted file mode 100644 index 70dbd54..0000000 --- a/shell.nix +++ /dev/null @@ -1,11 +0,0 @@ -with import {}; -stdenv.mkDerivation rec { - name = "dev"; - env = buildEnv { - name = name; - paths = buildInputs; - }; - buildInputs = [ - nodejs-11_x - ]; -} diff --git a/test/googleCommand.js b/test/googleCommand.js index c9e6a34..46af58f 100644 --- a/test/googleCommand.js +++ b/test/googleCommand.js @@ -8,9 +8,7 @@ class GoogleCommand { this.serverless = serverless; this.provider = this.serverless.getProvider('google'); - Object.assign( - this, - testSubject); + Object.assign(this, testSubject); } } diff --git a/test/serverless.js b/test/serverless.js index 662ae87..1c31d4e 100644 --- a/test/serverless.js +++ b/test/serverless.js @@ -6,13 +6,14 @@ class Serverless { this.providers = {}; this.service = {}; - this.service.getAllFunctions = function () { //eslint-disable-line + this.service.getAllFunctions = function() { + //eslint-disable-line return Object.keys(this.functions); }; - this.service.getFunction = function (functionName) { //eslint-disable-line + this.service.getFunction = function(functionName) { + //eslint-disable-line // NOTE the stage is always 'dev'! - this.functions[functionName] - .name = `${this.service}-dev-${functionName}`; + this.functions[functionName].name = `${this.service}-dev-${functionName}`; return this.functions[functionName]; }; this.utils = {