From d661a2c2e06d9a454eaed580d6cadc7051770e70 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 16 May 2019 09:13:39 -0400 Subject: [PATCH] Ensure any trailing whitespace in package.json is preserved. When testing the new `--write` functionality I noticed that my `package.json` had changed trailing whitespace as well as the `ember-source` URL. That was annoying. --- bin/ember-source-channel-url | 7 +++++++ tests/index-test.js | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/bin/ember-source-channel-url b/bin/ember-source-channel-url index 7be7bdf..f4d7d57 100755 --- a/bin/ember-source-channel-url +++ b/bin/ember-source-channel-url @@ -7,6 +7,7 @@ const fs = require('fs'); const getChannelURL = require('../src'); const channel = process.argv[2]; const shouldUpdatePackage = process.argv.includes('-w') || process.argv.includes('--write'); +const DETECT_TRAILING_WHITESPACE = /\s+$/; function printUsage() { console.log(` @@ -55,6 +56,7 @@ if (['release', 'beta', 'canary'].indexOf(channel) === -1) { } let contents = fs.readFileSync('package.json', { encoding: 'utf8' }); + let trailingWhitespace = DETECT_TRAILING_WHITESPACE.exec(contents); let pkg = JSON.parse(contents); let dependencyType = ['dependencies', 'devDependencies'].find( @@ -65,6 +67,11 @@ if (['release', 'beta', 'canary'].indexOf(channel) === -1) { pkg[dependencyType]['ember-source'] = url; let updatedContents = JSON.stringify(pkg, null, 2); + + if (trailingWhitespace) { + updatedContents += trailingWhitespace[0]; + } + fs.writeFileSync('package.json', updatedContents, { encoding: 'utf8' }); } else { console.log( diff --git a/tests/index-test.js b/tests/index-test.js index e509f9f..654b4c8 100644 --- a/tests/index-test.js +++ b/tests/index-test.js @@ -120,6 +120,22 @@ QUnit.module('ember-source-channel-url', function(hooks) { }); }); + QUnit.test('preserves line ending when updating package.json', function(assert) { + fs.writeFileSync( + 'package.json', + JSON.stringify({ dependencies: { 'ember-source': '^3.10.0' } }, null, 2) + '\n', + { encoding: 'utf8' } + ); + + return execa(EXECUTABLE_PATH, ['canary', '--write']).then(results => { + assert.ok(results.stdout.includes(this.expectedURL), 'URL is present in stdout'); + + let expected = + JSON.stringify({ dependencies: { 'ember-source': this.expectedURL } }, null, 2) + '\n'; + assert.deepEqual(fs.readFileSync('package.json', { encoding: 'utf8' }), expected); + }); + }); + QUnit.test('fails when package.json is missing', function(assert) { return execa(EXECUTABLE_PATH, ['canary', '--write']).catch(results => { assert.ok(results.stdout.includes(this.expectedURL), 'URL is present in stdout');