Skip to content

Commit 27fd242

Browse files
abetomoDeviaVir
authored andcommitted
Modify from exec to execFile with _npmInstall (#303)
* Modify to arrow function * Modify `var` to `const` * Add test when codeDirectory contained characters to be escaped * Modify from exec to execFile - Arguments are escaped - Modify to Arrow function * Support Windows with execFile * Fix command * Remove unusable characters in Windows test * Remove unusable characters in Windows test
1 parent 14ae64a commit 27fd242

File tree

2 files changed

+92
-16
lines changed

2 files changed

+92
-16
lines changed

lib/main.js

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
var path = require('path')
44
var aws = require('aws-sdk')
55
var exec = require('child_process').exec
6+
var execFile = require('child_process').execFile
67
var fs = require('fs-extra')
78
var packageJson = require(path.join(__dirname, '..', 'package.json'))
89
var minimatch = require('minimatch')
@@ -285,18 +286,55 @@ Lambda.prototype._rsync = function (program, src, dest, excludeNodeModules, call
285286
})
286287
}
287288

288-
Lambda.prototype._npmInstall = function (program, codeDirectory, callback) {
289-
const installOptions = [
290-
`--prefix ${codeDirectory}`,
291-
process.platform === 'win32' ? `--cwd ${codeDirectory}` : null
292-
].join(' ')
293-
var command = program.dockerImage
294-
? 'docker run --rm -v ' + codeDirectory + ':/var/task ' + program.dockerImage + ' npm -s install --production'
295-
: `npm -s install --production ${installOptions}`
296-
exec(command, {
289+
Lambda.prototype._npmInstall = (program, codeDirectory, callback) => {
290+
const dockerBaseOptions = [
291+
'run', '--rm', '-v', `${codeDirectory}:/var/task`,
292+
program.dockerImage,
293+
'npm', '-s', 'install', '--production'
294+
]
295+
const npmInstallBaseOptions = [
296+
'-s',
297+
'install',
298+
'--production',
299+
'--prefix', codeDirectory
300+
]
301+
302+
const params = (() => {
303+
// reference: https://nodejs.org/api/child_process.html#child_process_spawning_bat_and_cmd_files_on_windows
304+
305+
// with docker
306+
if (program.dockerImage) {
307+
if (process.platform === 'win32') {
308+
return {
309+
command: 'cmd.exe',
310+
options: ['/c', 'docker'].concat(dockerBaseOptions)
311+
}
312+
}
313+
return {
314+
command: 'docker',
315+
options: dockerBaseOptions
316+
}
317+
}
318+
319+
// simple npm install
320+
if (process.platform === 'win32') {
321+
return {
322+
command: 'cmd.exe',
323+
options: ['/c', 'npm']
324+
.concat(npmInstallBaseOptions)
325+
.concat(['--cwd', codeDirectory])
326+
}
327+
}
328+
return {
329+
command: 'npm',
330+
options: npmInstallBaseOptions
331+
}
332+
})()
333+
334+
execFile(params.command, params.options, {
297335
maxBuffer: maxBufferSize,
298336
env: process.env
299-
}, function (err) {
337+
}, (err) => {
300338
if (err) {
301339
return callback(err)
302340
}

test/main.js

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -321,14 +321,14 @@ describe('lib/main', function () {
321321
describe('_rsync', function () { rsyncTests('_rsync') })
322322
}
323323

324-
describe('_npmInstall', function () {
325-
beforeEach(function (done) {
326-
lambda._cleanDirectory(codeDirectory, function (err) {
324+
describe('_npmInstall', () => {
325+
beforeEach((done) => {
326+
lambda._cleanDirectory(codeDirectory, (err) => {
327327
if (err) {
328328
return done(err)
329329
}
330330

331-
lambda._fileCopy(program, '.', codeDirectory, true, function (err) {
331+
lambda._fileCopy(program, '.', codeDirectory, true, (err) => {
332332
if (err) {
333333
return done(err)
334334
}
@@ -340,9 +340,47 @@ describe('lib/main', function () {
340340
it('_npm adds node_modules', function (done) {
341341
_timeout({ this: this, sec: 30 }) // give it time to build the node modules
342342

343-
lambda._npmInstall(program, codeDirectory, function (err, result) {
343+
lambda._npmInstall(program, codeDirectory, (err, result) => {
344344
assert.isNull(err)
345-
var contents = fs.readdirSync(codeDirectory)
345+
const contents = fs.readdirSync(codeDirectory)
346+
assert.include(contents, 'node_modules')
347+
done()
348+
})
349+
})
350+
})
351+
352+
describe('_npmInstall (When codeDirectory contains characters to be escaped)', () => {
353+
beforeEach((done) => {
354+
// Since '\' can not be included in the file or directory name in Windows
355+
const directoryName = process.platform === 'win32'
356+
? 'hoge fuga\' piyo'
357+
: 'hoge "fuga\' \\piyo'
358+
codeDirectory = path.join(os.tmpdir(), directoryName)
359+
lambda._cleanDirectory(codeDirectory, (err) => {
360+
if (err) {
361+
return done(err)
362+
}
363+
364+
lambda._fileCopy(program, '.', codeDirectory, true, (err) => {
365+
if (err) {
366+
return done(err)
367+
}
368+
done()
369+
})
370+
})
371+
})
372+
373+
afterEach(() => {
374+
fs.removeSync(codeDirectory)
375+
codeDirectory = lambda._codeDirectory()
376+
})
377+
378+
it('_npm adds node_modules', function (done) {
379+
_timeout({ this: this, sec: 30 }) // give it time to build the node modules
380+
381+
lambda._npmInstall(program, codeDirectory, (err, result) => {
382+
assert.isNull(err)
383+
const contents = fs.readdirSync(codeDirectory)
346384
assert.include(contents, 'node_modules')
347385
done()
348386
})

0 commit comments

Comments
 (0)