From a18d2b31f5a53a61e3399951c5e2c9c14b34d6f2 Mon Sep 17 00:00:00 2001 From: Nathan Smith Date: Wed, 11 Nov 2015 16:55:49 -0600 Subject: [PATCH 1/5] fix(env): checks if windows platform, then send in APPDATA env var. --- package.json | 2 +- src/index.js | 5 ++++- src/index.test.js | 13 ++++++++----- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 019c570..bf0ee37 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ } }, "dependencies": { - "cross-spawn": "2.0.0", + "cross-spawn-async": "2.0.0", "manage-path": "2.0.0" } } diff --git a/src/index.js b/src/index.js index a314372..46cbef6 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,4 @@ -import {spawn} from 'cross-spawn'; +import {spawn} from 'cross-spawn-async'; import getPathVar from 'manage-path/dist/get-path-var'; export default crossEnv; @@ -24,6 +24,9 @@ function getCommandArgsAndEnvVars(args) { command = shifted; break; } + if (process.platform === 'win32') { + envVars.APPDATA = process.env.APPDATA; + } } return [command, commandArgs, envVars]; } diff --git a/src/index.test.js b/src/index.test.js index da26359..dd986a4 100644 --- a/src/index.test.js +++ b/src/index.test.js @@ -7,7 +7,7 @@ chai.use(sinonChai); const {expect} = chai; const proxied = { - 'cross-spawn': { + 'cross-spawn-async': { spawn: sinon.spy(() => 'spawn-returned') } }; @@ -17,7 +17,7 @@ const crossEnv = proxyquire('./index', proxied); describe(`cross-env`, () => { beforeEach(() => { - proxied['cross-spawn'].spawn.reset(); + proxied['cross-spawn-async'].spawn.reset(); }); it(`should set environment variables and run the remaining command`, () => { @@ -30,20 +30,23 @@ describe(`cross-env`, () => { it(`should do nothing given no command`, () => { crossEnv([]); - expect(proxied['cross-spawn'].spawn).to.have.not.been.called; + expect(proxied['cross-spawn-async'].spawn).to.have.not.been.called; }); function testEnvSetting(...envSettings) { const ret = crossEnv([...envSettings, 'echo', 'hello world']); const env = {[getPathVar()]: process.env[getPathVar()]}; + if (process.platform === 'win32') { + env.APPDATA = process.env.APPDATA; + } envSettings.forEach(setting => { const [prop, val] = setting.split('='); env[prop] = val; }); expect(ret, 'returns what spawn returns').to.equal('spawn-returned'); - expect(proxied['cross-spawn'].spawn).to.have.been.calledOnce; - expect(proxied['cross-spawn'].spawn).to.have.been.calledWith( + expect(proxied['cross-spawn-async'].spawn).to.have.been.calledOnce; + expect(proxied['cross-spawn-async'].spawn).to.have.been.calledWith( 'echo', ['hello world'], {stdio: 'inherit', env} ); } From f0fb1791db6e0c37009628e808f032c8ba75dc5c Mon Sep 17 00:00:00 2001 From: Nathan Smith Date: Wed, 11 Nov 2015 19:10:35 -0600 Subject: [PATCH 2/5] fix(test): rel path to _mocha in npm tst to make it windows compatible --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bf0ee37..5294d9b 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "check-coverage": "istanbul check-coverage --statements 100 --branches 100 --functions 100 --lines 100", "report-coverage": "cat ./coverage/lcov.info | codecov", "test:watch": "mocha src/*.test.js -w --compilers js:babel/register", - "test": "istanbul cover -x *.test.js _mocha -- -R spec src/index.test.js --compilers js:babel/register", + "test": "istanbul cover -x *.test.js node_modules/mocha/bin/_mocha -- -R spec src/index.test.js --compilers js:babel/register", "prepublish": "npm run build", "postpublish": "publish-latest", "semantic-release": "semantic-release pre && npm publish && semantic-release post" From 125055d8aef67d73386dd010f0c8100c967cbf01 Mon Sep 17 00:00:00 2001 From: Nathan Smith Date: Wed, 11 Nov 2015 19:39:34 -0600 Subject: [PATCH 3/5] fix(istanbul): istanbul to ignore if branch, can't mock process.platform for coverage. --- src/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.js b/src/index.js index 46cbef6..5d88d84 100644 --- a/src/index.js +++ b/src/index.js @@ -24,6 +24,7 @@ function getCommandArgsAndEnvVars(args) { command = shifted; break; } + /* istanbul ignore else */ if (process.platform === 'win32') { envVars.APPDATA = process.env.APPDATA; } From 847e80f1ac592ecf1444a70e661fe7427156d2d4 Mon Sep 17 00:00:00 2001 From: Nathan Smith Date: Wed, 11 Nov 2015 22:35:47 -0600 Subject: [PATCH 4/5] fix(env): Removing if clause for windows detection, applying APPDATA to all platforms. --- src/index.js | 5 +---- src/index.test.js | 4 +--- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/index.js b/src/index.js index 5d88d84..44c0cb4 100644 --- a/src/index.js +++ b/src/index.js @@ -24,10 +24,7 @@ function getCommandArgsAndEnvVars(args) { command = shifted; break; } - /* istanbul ignore else */ - if (process.platform === 'win32') { - envVars.APPDATA = process.env.APPDATA; - } + envVars.APPDATA = process.env.APPDATA; } return [command, commandArgs, envVars]; } diff --git a/src/index.test.js b/src/index.test.js index dd986a4..3bea6a2 100644 --- a/src/index.test.js +++ b/src/index.test.js @@ -36,9 +36,7 @@ describe(`cross-env`, () => { function testEnvSetting(...envSettings) { const ret = crossEnv([...envSettings, 'echo', 'hello world']); const env = {[getPathVar()]: process.env[getPathVar()]}; - if (process.platform === 'win32') { - env.APPDATA = process.env.APPDATA; - } + env.APPDATA = process.env.APPDATA; envSettings.forEach(setting => { const [prop, val] = setting.split('='); env[prop] = val; From 489b04de056bab1a306937a0a647b2653bc039c3 Mon Sep 17 00:00:00 2001 From: "Kent C. Dodds" Date: Thu, 12 Nov 2015 04:43:45 +0000 Subject: [PATCH 5/5] v1.0.4 --- dist/index.js | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 4 ++-- 2 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 dist/index.js diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..940a9d7 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,54 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })(); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var _crossSpawnAsync = require('cross-spawn-async'); + +var _managePathDistGetPathVar = require('manage-path/dist/get-path-var'); + +var _managePathDistGetPathVar2 = _interopRequireDefault(_managePathDistGetPathVar); + +exports['default'] = crossEnv; + +var envSetterRegex = /(\w+)=(\w+)/; + +function crossEnv(args) { + var _getCommandArgsAndEnvVars = getCommandArgsAndEnvVars(args); + + var _getCommandArgsAndEnvVars2 = _slicedToArray(_getCommandArgsAndEnvVars, 3); + + var command = _getCommandArgsAndEnvVars2[0]; + var commandArgs = _getCommandArgsAndEnvVars2[1]; + var env = _getCommandArgsAndEnvVars2[2]; + + if (command) { + return (0, _crossSpawnAsync.spawn)(command, commandArgs, { stdio: 'inherit', env: env }); + } +} + +function getCommandArgsAndEnvVars(args) { + var command = undefined; + var envVars = _defineProperty({}, (0, _managePathDistGetPathVar2['default'])(), process.env[(0, _managePathDistGetPathVar2['default'])()]); + var commandArgs = args.slice(); + while (commandArgs.length) { + var shifted = commandArgs.shift(); + var match = envSetterRegex.exec(shifted); + if (match) { + envVars[match[1]] = match[2]; + } else { + command = shifted; + break; + } + envVars.APPDATA = process.env.APPDATA; + } + return [command, commandArgs, envVars]; +} +module.exports = exports['default']; \ No newline at end of file diff --git a/package.json b/package.json index 5294d9b..0145841 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cross-env", - "version": "0.0.0-semanticallly-released.0", + "version": "1.0.4", "description": "Run commands that set environment variables across platforms", "main": "src/index.js", "bin": { @@ -66,4 +66,4 @@ "cross-spawn-async": "2.0.0", "manage-path": "2.0.0" } -} +} \ No newline at end of file