diff --git a/README.md b/README.md index 1504415..83fbe7d 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,18 @@ -# serverless-package-common +# serverless-package-copy-common > 📦 Deploy microservice Python Serverless services with common code -Before deploying, this plugin symlinks folders containing shared code into the root directory of your Serverless microservice. +Before deploying, this plugin copies contents of folders containing shared code into a directory of your choice in the Serverless microservice. ### Installation ``` -npm i serverless-package-common --save-dev +npm i serverless-package-copy-common --save-dev +``` +Or + +``` +npm install https://github.com/akkapur/serverless-package-common.git ``` ### Usage @@ -16,15 +21,16 @@ npm i serverless-package-common --save-dev service: your-service plugins: - - serverless-package-common + - serverless-package-copy-common functions: # Your functions here custom: - packageCommon: - common: + packageCopyCommon: + sources: - '../common' + destination: 'my-service' ``` #### Example Directory Structure diff --git a/index.js b/index.js index c54a898..2caedc8 100644 --- a/index.js +++ b/index.js @@ -2,49 +2,29 @@ const symlink = require('./src/symlink'); -class PackageCommon { +class PackageCopyCommon { constructor(serverless, options) { this.serverless = serverless; this.options = Object.assign({ - common: [] - }, this.serverless.service.custom && this.serverless.service.custom.packageCommon || {}); - - this.symlinked = false; + sources: [], + destination: '' + }, this.serverless.service.custom && this.serverless.service.custom.packageCopyCommon || {}); this.hooks = { - 'before:package:createDeploymentArtifacts': this.beforeDeploy.bind(this), - 'after:deploy:deploy': this.afterDeploy.bind(this) + 'before:package:createDeploymentArtifacts': this.copyCommon.bind(this), + 'before:deploy:function:packageFunction': this.copyCommon.bind(this) }; - - this.handleExit(); } - beforeDeploy() { - // Symlink common folders - return Promise.all(this.options.common.map(commonFolder => { - this.symlinked = true; - return symlink.createFolder(commonFolder, this.serverless); + copyCommon() { + const destination = this.options.destination; + return Promise.all(this.options.sources.map(commonFolder => { + return symlink.copyFolder(this.serverless, commonFolder, destination); })) .then(() => { - this.serverless.cli.log(`[serverless-package-common] Package Common is complete`); + this.serverless.cli.log(`[serverless-package-copy-common] Package Copy Common is complete`); }); } - - afterDeploy() { - if(this.symlinked) { - this.options.common.forEach(commonFolder => { - const target = commonFolder.replace(/..\//g, ''); - symlink.removeFolder(target); - }); - } - } - - handleExit(func) { - ['SIGINT', 'SIGTERM', 'SIGQUIT'] - .forEach(signal => process.on(signal, () => { - this.afterDeploy(); - })); - } } -module.exports = PackageCommon; +module.exports = PackageCopyCommon; diff --git a/package-lock.json b/package-lock.json index e2728c1..69e882e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,98 +1,41 @@ { - "name": "serverless-package-common", - "version": "1.0.1", + "name": "serverless-package-copy-common", + "version": "1.0.4", "lockfileVersion": 1, "requires": true, "dependencies": { - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "1.1.8" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "requires": { - "wrappy": "1.0.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { - "glob": "7.1.2" + "graceful-fs": "^4.1.6" } }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "lodash.values": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz", + "integrity": "sha1-o6bCsOvsxcLLocF+bmIP6BtT00c=" }, - "yesno": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/yesno/-/yesno-0.0.1.tgz", - "integrity": "sha1-/7wE/z1vmdrST3RjE06bkq5BvvY=" + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" } } } diff --git a/package.json b/package.json index 7eb2ace..f60fe87 100644 --- a/package.json +++ b/package.json @@ -1,23 +1,23 @@ { - "name": "serverless-package-common", - "version": "1.0.3", - "description": "📦 Deploy microservice Python Serverless services with common code", + "name": "serverless-package-copy-common", + "version": "1.0.7", + "description": "📦 Deploy microservice with common code", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { "type": "git", - "url": "git+https://github.com/onlicar/serverless-package-common.git" + "url": "git+https://github.com/akkapur/serverless-package-common.git" }, "author": "Dan Bovey ", "license": "MIT", "bugs": { - "url": "https://github.com/onlicar/serverless-package-common/issues" + "url": "https://github.com/akkapur/serverless-package-common/issues" }, - "homepage": "https://github.com/onlicar/serverless-package-common#readme", + "homepage": "https://github.com/akkapur/serverless-package-common#readme", "dependencies": { - "rimraf": "^2.6.2", - "yesno": "0.0.1" + "fs-extra": "^7.0.1", + "lodash.values": "^4.3.0" } } diff --git a/src/symlink.js b/src/symlink.js index 4a183ba..d97cb78 100644 --- a/src/symlink.js +++ b/src/symlink.js @@ -1,54 +1,35 @@ const fs = require('fs'); const path = require('path'); -const rimraf = require('rimraf'); -const yesno = require('yesno'); +const fse = require('fs-extra'); +const values = require('lodash.values'); -const exists = path => { - try { - const stats = fs.lstatSync(path); - console.log(path); - if(!stats.isSymbolicLink()) { - return true; - } - } catch(e) {} - - return false; -}; +const copyFolder = (serverless, commonFolder, destinationFolder) => { + return targetFuncs(serverless) + .map(f => { + const destDir = path.join(serverless.config.servicePath, f.module, destinationFolder); + const folderToCopy = path.join(serverless.config.servicePath, commonFolder); -const askToOverwrite = (targetExists, folder) => { - let ask = Promise.resolve(); - if(targetExists.length > 0) { - ask = new Promise((resolve, reject) => { - let targets = 'Folders'; - console.log(targetExists); - if(targetExists.length < 5) { - targets = targetExists.join(', '); - } - yesno.ask(`${targets} from ${folder} already exist${targetExists.length == 1 ? 's' : ''} in the service folder, do you want to overwrite files?`, false, ok => - ok ? resolve() : reject() - ); - }); - } + try { + serverless.cli.log(`[serverless-package-copy-common] Copying from ${folderToCopy} to ${destDir}`); + + fse.mkdirsSync(destDir); - return ask; -}; - -// Symlink a folder -const createFolder = (folder, serverless) => { - const target = path.join(process.cwd(), folder.replace(/..\//g, '')); + fse.copySync(folderToCopy, destDir) - // Check if folder/file with symlink name already exists in top level - return askToOverwrite(exists(target) ? [target] : [], folder) - .then(() => { - // There is either no conflict or the user has accepted overwriting - serverless.cli.log(`[serverless-package-common] Symlinking ${folder}`); - rimraf.sync(target); - fs.symlinkSync(folder, target); - }); + serverless.cli.log(`[serverless-package-copy-common] Copy finished`); + return true; + } catch (err) { + serverless.cli.log(`[serverless-package-copy-common] Error Copying. ${err}`); + return false; + } + }); }; -const removeFolder = folder => { - rimraf.sync(path.join(process.cwd(), folder)); +const targetFuncs = (serverless) => { + let inputOpt = serverless.processedInput.options; + return inputOpt.function + ? [inputOpt.functionObj] + : values(serverless.service.functions); }; -module.exports = { createFolder, removeFolder }; +module.exports = { copyFolder };