Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions lib/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ var fs = require('fs-extra');
var os = require('os');
var packageJson = require('./../package.json');
var path = require('path');
var minimatch = require('minimatch');
var async = require('async');
var zip = new require('node-zip')();
var dotenv = require('dotenv');
Expand Down Expand Up @@ -178,6 +179,49 @@ Lambda.prototype._zipfileTmpPath = function (program) {
return zipfile;
};

Lambda.prototype._fileCopy = function (program, src, dest, excludeNodeModules, callback) {
const srcAbsolutePath = path.resolve(src);
const excludes = (function () {
return [
'.git*',
'*.swp',
'.editorconfig',
'deploy.env',
'*.log',
'/build/'
]
.concat(program.excludeGlobs ? program.excludeGlobs.split(' ') : [])
.concat(excludeNodeModules ? ['/node_modules'] : []);
})();

const pattern = '{' + excludes.map(function (str) {
return path.join(srcAbsolutePath, str);
}).join(',') + '}'

fs.mkdirs(dest, function (err) {
if (err) {
return callback(err);
}
const options = {
dereference: true, // same meaning as `-L` of `rsync` command
filter: function (src, dest) {
if (!program.prebuiltDirectory && path.basename(src) == 'package.json') {
// include package.json unless prebuiltDirectory is set
return true;
}
return !minimatch(src, pattern);
}
};
fs.copy(src, dest, options, function (err) {
if (err) {
return callback(err);
}

return callback(null, true);
});
});
};

Lambda.prototype._rsync = function (program, src, dest, excludeNodeModules, callback) {
var excludes = ['.git*', '*.swp', '.editorconfig', 'deploy.env', '*.log', '/build/'],
excludeGlobs = [];
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
"commander": "^2.5.0",
"dotenv": "^0.4.0",
"fs-extra": "^0.30.0",
"minimatch": "^3.0.3",
"node-zip": "^1.1.0",
"rimraf": "^2.2.8"
}
Expand Down
45 changes: 24 additions & 21 deletions test/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -161,66 +161,66 @@ describe('node-lambda', function () {
});
});

describe('_rsync', function () {
function rsyncTests(funcName) {
beforeEach(function (done) {
lambda._cleanDirectory(codeDirectory, done);
});

it('rsync an index.js as well as other files', function (done) {
lambda._rsync(program, '.', codeDirectory, true, function (err, result) {
it(funcName + ' an index.js as well as other files', function (done) {
lambda[funcName](program, '.', codeDirectory, true, function (err, result) {
var contents = fs.readdirSync(codeDirectory);

result = _.includes(contents, 'index.js') &&
_.includes(contents, 'package.json') &&
!_.includes(contents, 'node_modules');
assert.equal(result, true);
assert.isTrue(result);

done();
});
});

describe("when there are excluded files", function () {
describe('when there are excluded files', function () {
beforeEach(function (done) {
program.excludeGlobs="*.png test";
program.excludeGlobs = '*.png test';
done();
});

it('rsync an index.js as well as other files', function (done) {
lambda._rsync(program, '.', codeDirectory, true, function (err, result) {
it(funcName + ' an index.js as well as other files', function (done) {
lambda[funcName](program, '.', codeDirectory, true, function (err, result) {
var contents = fs.readdirSync(codeDirectory);

result = _.includes(contents, 'index.js') &&
_.includes(contents, 'package.json');
assert.equal(result, true);
assert.isTrue(result);

done();
});
});

it('rsync excludes files matching excludeGlobs', function (done) {
lambda._rsync(program, '.', codeDirectory, true, function (err, result) {
it(funcName + ' excludes files matching excludeGlobs', function (done) {
lambda[funcName](program, '.', codeDirectory, true, function (err, result) {
var contents = fs.readdirSync(codeDirectory);

result = _.includes(contents, 'node-lambda.png') &&
_.includes(contents, 'test');
assert.equal(result, false);
assert.isFalse(result);

done();
});
});

it('rsync should not exclude package.json, even when excluded by excludeGlobs', function (done) {
program.excludeGlobs="*.json"
lambda._rsync(program, '.', codeDirectory, true, function(err, result) {
it(funcName + ' should not exclude package.json, even when excluded by excludeGlobs', function (done) {
program.excludeGlobs = '*.json';
lambda[funcName](program, '.', codeDirectory, true, function(err, result) {
var contents = fs.readdirSync(codeDirectory);
result = _.includes(contents, 'package.json');
assert.equal(result, true);
assert.isTrue(result);

done();
});
});

it('rsync should not include package.json when --prebuiltDirectory is set', function (done) {
it(funcName + ' should not include package.json when --prebuiltDirectory is set', function (done) {
var path = '.build_' + Date.now();
after(function() {
rimraf.sync(path, fs);
Expand All @@ -230,19 +230,22 @@ describe('node-lambda', function () {
fs.writeFileSync(path + '/testa');
fs.writeFileSync(path + '/package.json');

program.excludeGlobs = "*.json"
program.excludeGlobs = '*.json';
program.prebuiltDirectory = path;
lambda._rsync(program, path, codeDirectory, true, function(err, result) {
lambda[funcName](program, path, codeDirectory, true, function(err, result) {
var contents = fs.readdirSync(codeDirectory);
result = !_.includes(contents, 'package.json') &&
_.includes(contents, 'testa');
assert.equal(result, true);
assert.isTrue(result);

done();
});
});
});
});
}

describe('_rsync', function() { rsyncTests('_rsync'); });
describe('_fileCopy', function() { rsyncTests('_fileCopy'); });

describe('_npmInstall', function () {
beforeEach(function (done) {
Expand Down