diff --git a/.travis.yml b/.travis.yml index dd338dd..ceafed9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: node_js node_js: - - "4" - "6" - "8" + - "10" diff --git a/package.json b/package.json index 5692d14..7b19594 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "loopback-component-storage", "description": "Loopback Storage Service", "engines": { - "node": ">=4" + "node": ">=6" }, "version": "3.3.1", "main": "index.js", @@ -12,22 +12,22 @@ "posttest": "npm run lint" }, "dependencies": { - "async": "^2.1.5", + "async": "^2.6.1", "debug": "^3.1.0", - "formidable": "^1.0.16", - "pkgcloud": "^1.1.0", - "strong-globalize": "^2.6.2", - "uuid": "^3.0.1" + "formidable": "^1.2.1", + "pkgcloud": "^1.5.0", + "strong-globalize": "^4.1.1", + "uuid": "^3.2.1" }, "devDependencies": { - "eslint": "^3.17.1", - "eslint-config-loopback": "^8.0.0", - "express": "^4.11.0", - "loopback": "^3.0.0", - "mkdirp": "^0.5.0", - "mocha": "^3.2.0", - "supertest": "^3.0.0", - "semver": "^5.3.0" + "eslint": "^4.19.1", + "eslint-config-loopback": "^10.0.0", + "express": "^4.16.3", + "loopback": "^3.20.0", + "mkdirp": "^0.5.1", + "mocha": "^5.2.0", + "supertest": "^3.1.0", + "semver": "^5.5.0" }, "repository": { "type": "git", diff --git a/test/fs.test.js b/test/fs.test.js index 5a2329e..01c010e 100644 --- a/test/fs.test.js +++ b/test/fs.test.js @@ -24,13 +24,17 @@ describe('FileSystem based storage provider', function() { describe('container apis', function() { var client = null; it('should require an existing directory as the root', function(done) { - client = new FileSystemProvider({root: path.join(__dirname, 'storage')}); + client = new FileSystemProvider({ + root: path.join(__dirname, 'storage'), + }); process.nextTick(done); }); it('should complain if the root directory doesn\'t exist', function(done) { try { - client = new FileSystemProvider({root: path.join(__dirname, '_storage')}); + client = new FileSystemProvider({ + root: path.join(__dirname, '_storage'), + }); process.nextTick(done.bind(null, 'Error')); } catch (err) { // Should be here @@ -94,7 +98,9 @@ describe('FileSystem based storage provider', function() { describe('file apis', function() { var fs = require('fs'); - var client = new FileSystemProvider({root: path.join(__dirname, 'storage')}); + var client = new FileSystemProvider({ + root: path.join(__dirname, 'storage'), + }); it('should create a new container', function(done) { client.createContainer({name: 'c1'}, function(err, container) { @@ -110,6 +116,7 @@ describe('FileSystem based storage provider', function() { writer.on('error', done); }); + /* eslint-disable mocha/handle-done-callback */ it('should fail to upload a file with invalid characters', function(done) { var writer = client.upload({container: 'c1', remote: 'a/f1.txt'}); fs.createReadStream(path.join(__dirname, 'files/f1.txt')).pipe(writer); @@ -124,20 +131,26 @@ describe('FileSystem based storage provider', function() { cb = clearCb; }); }); + /* eslint-enable mocha/handle-done-callback */ it('should download a file', function(done) { var reader = client.download({ container: 'c1', remote: 'f1.txt', }); - reader.pipe(fs.createWriteStream(path.join(__dirname, 'files/f1_downloaded.txt'))); + reader.pipe( + fs.createWriteStream(path.join(__dirname, 'files/f1_downloaded.txt')) + ); reader.on('end', done); reader.on('error', done); }); + /* eslint-disable mocha/handle-done-callback */ it('should fail to download a file with invalid characters', function(done) { var reader = client.download({container: 'c1', remote: 'a/f1.txt'}); - reader.pipe(fs.createWriteStream(path.join(__dirname, 'files/a-f1_downloaded.txt'))); + reader.pipe( + fs.createWriteStream(path.join(__dirname, 'files/a-f1_downloaded.txt')) + ); var cb = done; var clearCb = function() {}; reader.on('error', function() { @@ -149,6 +162,7 @@ describe('FileSystem based storage provider', function() { cb = clearCb; }); }); + /* eslint-enable mocha/handle-done-callback */ it('should get files for a container', function(done) { client.getFiles('c1', function(err, files) { diff --git a/test/upload-download.test.js b/test/upload-download.test.js index 7fb6025..a7a1063 100644 --- a/test/upload-download.test.js +++ b/test/upload-download.test.js @@ -199,14 +199,27 @@ describe('storage service', function() { .set('Accept', 'application/json') .expect('Content-Type', /json/) .expect(200, function(err, res) { - assert.deepEqual(res.body, {'result': {'files': {'image': [ - {'container': 'album1', 'name': 'test.jpg', 'type': 'image/jpeg', 'field': 'image', 'size': 60475}, - ]}, 'fields': {}}}); + assert.deepEqual(res.body, { + result: { + files: { + image: [ + { + container: 'album1', + name: 'test.jpg', + type: 'image/jpeg', + field: 'image', + size: 60475, + }, + ], + }, + fields: {}, + }, + }); done(); }); }); - it('fails to upload using dotdot file path', function(done) { + it('fails to upload using dotdot file path (1)', function(done) { request('http://localhost:' + app.get('port')) .post('/containers/%2e%2e/upload') .expect(200, function(err, res) { @@ -215,7 +228,7 @@ describe('storage service', function() { }); }); - it('fails to upload using dotdot file path', function(done) { + it('fails to upload using dotdot file path (2)', function(done) { request('http://localhost:' + app.get('port')) .post('%2e%2e/containers/upload') .expect(200, function(err, res) { @@ -224,7 +237,7 @@ describe('storage service', function() { }); }); - it('fails to upload using dotdot file path', function(done) { + it('fails to upload using dotdot file path (3)', function(done) { request('http://localhost:' + app.get('port')) .post('%2e%2e') .expect(200, function(err, res) { @@ -233,7 +246,7 @@ describe('storage service', function() { }); }); - it('fails to upload using dotdot file path', function(done) { + it('fails to upload using dotdot file path (4)', function(done) { request('http://localhost:' + app.get('port')) .post('/containers/upload/%2e%2e') .expect(200, function(err, res) { @@ -249,9 +262,24 @@ describe('storage service', function() { .set('Accept', 'application/json') .expect('Content-Type', /json/) .expect(200, function(err, res) { - assert.deepEqual(res.body, {'result': {'files': {'image': [ - {'container': 'album1', 'name': 'image-test.jpg', 'originalFilename': 'test.jpg', 'type': 'image/jpeg', 'field': 'image', 'acl': 'public-read', 'size': 60475}, - ]}, 'fields': {}}}); + assert.deepEqual(res.body, { + result: { + files: { + image: [ + { + container: 'album1', + name: 'image-test.jpg', + originalFilename: 'test.jpg', + type: 'image/jpeg', + field: 'image', + acl: 'public-read', + size: 60475, + }, + ], + }, + fields: {}, + }, + }); done(); }); }); @@ -291,10 +319,14 @@ describe('storage service', function() { .set('Connection', 'keep-alive') .expect('Content-Type', /json/) .expect(400, function(err, res) { - var indexOfMsg = - res.body.error.message.toLowerCase().indexOf('no file'); - assert.notEqual(indexOfMsg, -1, - 'Error message does not contain \"no file\"'); + var indexOfMsg = res.body.error.message + .toLowerCase() + .indexOf('no file'); + assert.notEqual( + indexOfMsg, + -1, + 'Error message does not contain "no file"' + ); done(err); }); } else { @@ -304,8 +336,10 @@ describe('storage service', function() { .set('Connection', 'keep-alive') .expect('Content-Type', /json/) .expect(500, function(err, res) { - assert.equal(res.body.error.message, - 'bad content-type header, no content-type'); + assert.equal( + res.body.error.message, + 'bad content-type header, no content-type' + ); done(err); }); } @@ -421,22 +455,37 @@ describe('storage service', function() { }); }); - it('should upload a file with custom route accessing directly to the ' + - 'storage connector with renamer', function(done) { - request('http://localhost:' + app.get('port')) - .post('/custom/upload') - .attach('customimagefield', path.join(__dirname, './fixtures/test.jpg')) - .set('Accept', 'application/json') - .expect('Content-Type', /json/) - .expect(200, function(err, res) { - assert.deepEqual(res.body, {'result': {'files': {'customimagefield': [ - {'container': 'album1', 'name': 'customimagefield_test.jpg', - 'originalFilename': 'test.jpg', 'type': 'image/jpeg', - 'field': 'customimagefield', 'size': 60475}, - ]}, 'fields': {}}}); - done(); - }); - }); + it( + 'should upload a file with custom route accessing directly to the ' + + 'storage connector with renamer', + function(done) { + request('http://localhost:' + app.get('port')) + .post('/custom/upload') + .attach('customimagefield', path.join(__dirname, './fixtures/test.jpg')) + .set('Accept', 'application/json') + .expect('Content-Type', /json/) + .expect(200, function(err, res) { + assert.deepEqual(res.body, { + result: { + files: { + customimagefield: [ + { + container: 'album1', + name: 'customimagefield_test.jpg', + originalFilename: 'test.jpg', + type: 'image/jpeg', + field: 'customimagefield', + size: 60475, + }, + ], + }, + fields: {}, + }, + }); + done(); + }); + } + ); it('should upload a file with container param', function(done) { request('http://localhost:' + app.get('port')) @@ -445,11 +494,23 @@ describe('storage service', function() { .set('Accept', 'application/json') .expect('Content-Type', /json/) .expect(200, function(err, res) { - assert.deepEqual(res.body, {'result': {'files': {'customimagefield1': [ - {'container': 'album1', 'name': 'customimagefield1_test.jpg', - 'originalFilename': 'test.jpg', 'type': 'image/jpeg', - 'field': 'customimagefield1', 'size': 60475}, - ]}, 'fields': {}}}); + assert.deepEqual(res.body, { + result: { + files: { + customimagefield1: [ + { + container: 'album1', + name: 'customimagefield1_test.jpg', + originalFilename: 'test.jpg', + type: 'image/jpeg', + field: 'customimagefield1', + size: 60475, + }, + ], + }, + fields: {}, + }, + }); done(); }); });