mirror of
https://github.com/ershisan99/go-npm.git
synced 2025-12-16 20:59:28 +00:00
ADD unzip support
This commit is contained in:
@@ -4,6 +4,7 @@ const common = require('../../src/common');
|
|||||||
const install = require('../../src/actions/install');
|
const install = require('../../src/actions/install');
|
||||||
const move = require('../../src/assets/move');
|
const move = require('../../src/assets/move');
|
||||||
const untar = require('../../src/assets/untar');
|
const untar = require('../../src/assets/untar');
|
||||||
|
const unzip = require('../../src/assets/unzip');
|
||||||
const verifyAndPlaceCallback = require('../../src/assets/binary');
|
const verifyAndPlaceCallback = require('../../src/assets/binary');
|
||||||
|
|
||||||
jest.mock('fs');
|
jest.mock('fs');
|
||||||
@@ -12,6 +13,7 @@ jest.mock('request');
|
|||||||
jest.mock('../../src/common');
|
jest.mock('../../src/common');
|
||||||
jest.mock('../../src/assets/move');
|
jest.mock('../../src/assets/move');
|
||||||
jest.mock('../../src/assets/untar');
|
jest.mock('../../src/assets/untar');
|
||||||
|
jest.mock('../../src/assets/unzip');
|
||||||
jest.mock('../../src/assets/binary');
|
jest.mock('../../src/assets/binary');
|
||||||
|
|
||||||
describe('install()', () => {
|
describe('install()', () => {
|
||||||
@@ -77,6 +79,17 @@ describe('install()', () => {
|
|||||||
expect(untar).toHaveBeenCalled();
|
expect(untar).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should pick unzip strategy if url ends with .zip', () => {
|
||||||
|
request.mockReturnValueOnce(requestEvents);
|
||||||
|
common.parsePackageJson.mockReturnValueOnce({ url: 'http://url.zip' });
|
||||||
|
|
||||||
|
install(callback);
|
||||||
|
|
||||||
|
requestEvents.emit('response', { statusCode: 200 });
|
||||||
|
|
||||||
|
expect(unzip).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
it('should call verifyAndPlaceCallback on success', () => {
|
it('should call verifyAndPlaceCallback on success', () => {
|
||||||
request.mockReturnValueOnce(requestEvents);
|
request.mockReturnValueOnce(requestEvents);
|
||||||
common.parsePackageJson.mockReturnValueOnce({ url: 'http://url', binName: 'command', binPath: './bin' });
|
common.parsePackageJson.mockReturnValueOnce({ url: 'http://url', binName: 'command', binPath: './bin' });
|
||||||
|
|||||||
50
__test__/assets/unzip.spec.js
Normal file
50
__test__/assets/unzip.spec.js
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
const { EventEmitter } = require('events');
|
||||||
|
const unzipper = require('unzipper');
|
||||||
|
const unzip = require('../../src/assets/unzip');
|
||||||
|
|
||||||
|
jest.mock('unzipper', () => ({
|
||||||
|
Extract: jest.fn()
|
||||||
|
}));
|
||||||
|
|
||||||
|
describe('unzip()', () => {
|
||||||
|
|
||||||
|
let unzipEvents, pipe, onSuccess, onError;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
unzipEvents = new EventEmitter();
|
||||||
|
|
||||||
|
pipe = jest.fn();
|
||||||
|
onSuccess = jest.fn();
|
||||||
|
onError = jest.fn();
|
||||||
|
|
||||||
|
pipe.mockReturnValueOnce({ pipe });
|
||||||
|
unzipper.Extract.mockReturnValueOnce(unzipEvents);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should download resource and unzip to given binPath', () => {
|
||||||
|
|
||||||
|
unzip({ opts: { binPath: './bin', binName: 'command' }, req: { pipe }, onSuccess, onError });
|
||||||
|
|
||||||
|
expect(unzipper.Extract).toHaveBeenCalledWith({ path: './bin' });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call onSuccess on unzip close', () => {
|
||||||
|
|
||||||
|
unzip({ opts: { binPath: './bin', binName: 'command' }, req: { pipe }, onSuccess, onError });
|
||||||
|
|
||||||
|
unzipEvents.emit('close');
|
||||||
|
|
||||||
|
expect(onSuccess).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call onError with error on unzip error', () => {
|
||||||
|
|
||||||
|
const error = new Error();
|
||||||
|
|
||||||
|
unzip({ opts: { binPath: './bin', binName: 'command' }, req: { pipe }, onSuccess, onError });
|
||||||
|
|
||||||
|
unzipEvents.emit('error', error);
|
||||||
|
|
||||||
|
expect(onError).toHaveBeenCalledWith(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -15,7 +15,8 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"mkdirp": "^0.5.1",
|
"mkdirp": "^0.5.1",
|
||||||
"request": "^2.81.0",
|
"request": "^2.81.0",
|
||||||
"tar": "^2.2.2"
|
"tar": "^2.2.2",
|
||||||
|
"unzipper": "0.10.10"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ function getStrategy({ url }) {
|
|||||||
|
|
||||||
if (url.endsWith('.tar.gz')) {
|
if (url.endsWith('.tar.gz')) {
|
||||||
return require('../assets/untar');
|
return require('../assets/untar');
|
||||||
|
} else if (url.endsWith('.zip')) {
|
||||||
|
return require('../assets/unzip');
|
||||||
} else {
|
} else {
|
||||||
return require('../assets/move');
|
return require('../assets/move');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,9 +14,6 @@ function untar({ opts, req, onSuccess, onError }) {
|
|||||||
|
|
||||||
ungz.on('error', onError);
|
ungz.on('error', onError);
|
||||||
untar.on('error', onError);
|
untar.on('error', onError);
|
||||||
|
|
||||||
// First we will Un-GZip, then we will untar. So once untar is completed,
|
|
||||||
// binary is downloaded into `binPath`. Verify the binary and call it good
|
|
||||||
untar.on('end', onSuccess);
|
untar.on('end', onSuccess);
|
||||||
|
|
||||||
req.pipe(ungz).pipe(untar);
|
req.pipe(ungz).pipe(untar);
|
||||||
|
|||||||
19
src/assets/unzip.js
Normal file
19
src/assets/unzip.js
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
const unzipper = require('unzipper');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unzip strategy for resources using `.zip`.
|
||||||
|
*
|
||||||
|
* Once unzip is completed, binary is downloaded into `binPath`.
|
||||||
|
* Verify the binary and call it good.
|
||||||
|
*/
|
||||||
|
function unzip({ opts, req, onSuccess, onError }) {
|
||||||
|
|
||||||
|
const unzip = unzipper.Extract({ path: opts.binPath });
|
||||||
|
|
||||||
|
unzip.on('error', onError);
|
||||||
|
unzip.on('close', onSuccess);
|
||||||
|
|
||||||
|
req.pipe(unzip);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = unzip;
|
||||||
Reference in New Issue
Block a user