diff -Nru node-jsonfile-4.0.0/appveyor.yml node-jsonfile-5.0.0/appveyor.yml --- node-jsonfile-4.0.0/appveyor.yml 2017-09-12 19:16:39.000000000 +0000 +++ node-jsonfile-5.0.0/appveyor.yml 2018-09-08 16:53:08.000000000 +0000 @@ -2,9 +2,10 @@ environment: matrix: # node.js - - nodejs_version: "4" - nodejs_version: "6" - nodejs_version: "8" + - nodejs_version: "10" + # Install scripts. (runs after repo cloning) install: diff -Nru node-jsonfile-4.0.0/CHANGELOG.md node-jsonfile-5.0.0/CHANGELOG.md --- node-jsonfile-4.0.0/CHANGELOG.md 2017-09-12 19:16:39.000000000 +0000 +++ node-jsonfile-5.0.0/CHANGELOG.md 2018-09-08 16:53:08.000000000 +0000 @@ -1,3 +1,10 @@ +5.0.0 / 2018-09-08 +------------------ + +- **BREAKING:** Drop Node 4 support +- **BREAKING:** If no callback is passed to an asynchronous method, a promise is now returned ([#109](https://github.com/jprichardson/node-jsonfile/pull/109)) +- Cleanup docs + 4.0.0 / 2017-07-12 ------------------ diff -Nru node-jsonfile-4.0.0/debian/changelog node-jsonfile-5.0.0/debian/changelog --- node-jsonfile-4.0.0/debian/changelog 2017-09-15 05:12:50.000000000 +0000 +++ node-jsonfile-5.0.0/debian/changelog 2018-09-13 05:25:37.000000000 +0000 @@ -1,3 +1,16 @@ +node-jsonfile (5.0.0-1) unstable; urgency=medium + + * New upstream release. + * Refresh packaging: + - Move to section javascript and priority optional. + - Point Vcs-* fields to salsa. + - Bump dh compat to 11. + - Bump std-ver to 4.2.1. + - Use my debian.org mail address. + - Update d/copyright. + + -- Julien Puydt Thu, 13 Sep 2018 07:25:37 +0200 + node-jsonfile (4.0.0-1) unstable; urgency=medium * New upstream release. diff -Nru node-jsonfile-4.0.0/debian/compat node-jsonfile-5.0.0/debian/compat --- node-jsonfile-4.0.0/debian/compat 2017-09-15 05:12:50.000000000 +0000 +++ node-jsonfile-5.0.0/debian/compat 2018-09-13 05:25:37.000000000 +0000 @@ -1 +1 @@ -10 +11 diff -Nru node-jsonfile-4.0.0/debian/control node-jsonfile-5.0.0/debian/control --- node-jsonfile-4.0.0/debian/control 2017-09-15 05:12:50.000000000 +0000 +++ node-jsonfile-5.0.0/debian/control 2018-09-13 05:25:37.000000000 +0000 @@ -1,17 +1,17 @@ Source: node-jsonfile Maintainer: Debian Javascript Maintainers -Uploaders: Julien Puydt -Section: web -Priority: extra -Build-Depends: debhelper (>= 10), nodejs (>= 6), mocha -Standards-Version: 4.1.0 -Vcs-Browser: https://anonscm.debian.org/cgit/pkg-javascript/node-jsonfile.git -Vcs-Git: https://anonscm.debian.org/git/pkg-javascript/node-jsonfile.git +Uploaders: Julien Puydt +Section: javascript +Priority: optional +Build-Depends: debhelper (>= 11), nodejs (>= 6), mocha +Standards-Version: 4.2.1 +Vcs-Browser: https://salsa.debian.org/js-team/node-jsonfile +Vcs-Git: https://salsa.debian.org/js-team/node-jsonfile.git Homepage: https://github.com/jprichardson/node-jsonfile Package: node-jsonfile Architecture: all -Depends: ${misc:Depends}, nodejs (>= 6), node-graceful-fs (>= 4.1.6) +Depends: ${misc:Depends}, nodejs (>= 6), node-graceful-fs (>= 4.1.6), node-universalify Description: Easily read/write JSON files in Node.js jsonfile is a Node.js module to easily read/write JSON files in JavaScript. . diff -Nru node-jsonfile-4.0.0/debian/copyright node-jsonfile-5.0.0/debian/copyright --- node-jsonfile-4.0.0/debian/copyright 2017-09-15 05:12:50.000000000 +0000 +++ node-jsonfile-5.0.0/debian/copyright 2018-09-13 05:25:37.000000000 +0000 @@ -4,7 +4,7 @@ Source: https://github.com/jprichardson/node-jsonfile Files: * -Copyright: 2012-2014 JP Richardson +Copyright: 2012-2018 JP Richardson Comment: Contributors: * JP Richardson * Sean O'Dell @@ -16,7 +16,7 @@ Files: debian/* Copyright: 2015 Bas Couwenberg - 2016 Julien Puydt + 2016-2018 Julien Puydt License: Expat License: Expat diff -Nru node-jsonfile-4.0.0/debian/tests/control node-jsonfile-5.0.0/debian/tests/control --- node-jsonfile-4.0.0/debian/tests/control 2017-09-15 05:12:50.000000000 +0000 +++ node-jsonfile-5.0.0/debian/tests/control 2018-09-13 05:25:37.000000000 +0000 @@ -1,5 +1,5 @@ Tests: require -Depends: node-jsonfile +Depends: @ Tests: testsuite -Depends: node-jsonfile, mocha, node-rimraf +Depends: @, mocha, node-rimraf diff -Nru node-jsonfile-4.0.0/index.js node-jsonfile-5.0.0/index.js --- node-jsonfile-4.0.0/index.js 2017-09-12 19:16:39.000000000 +0000 +++ node-jsonfile-5.0.0/index.js 2018-09-08 16:53:08.000000000 +0000 @@ -1,39 +1,40 @@ -var _fs +let _fs try { _fs = require('graceful-fs') } catch (_) { _fs = require('fs') } +const universalify = require('universalify') -function readFile (file, options, callback) { +function readFileWithCallback (file, options, callback) { if (callback == null) { callback = options options = {} } if (typeof options === 'string') { - options = {encoding: options} + options = { encoding: options } } options = options || {} - var fs = options.fs || _fs + const fs = options.fs || _fs - var shouldThrow = true + let shouldThrow = true if ('throws' in options) { shouldThrow = options.throws } - fs.readFile(file, options, function (err, data) { + fs.readFile(file, options, (err, data) => { if (err) return callback(err) data = stripBom(data) - var obj + let obj try { obj = JSON.parse(data, options ? options.reviver : null) } catch (err2) { if (shouldThrow) { - err2.message = file + ': ' + err2.message + err2.message = `${file}: ${err2.message}` return callback(err2) } else { return callback(null, null) @@ -44,26 +45,28 @@ }) } +const readFile = universalify.fromCallback(readFileWithCallback) + function readFileSync (file, options) { options = options || {} if (typeof options === 'string') { - options = {encoding: options} + options = { encoding: options } } - var fs = options.fs || _fs + const fs = options.fs || _fs - var shouldThrow = true + let shouldThrow = true if ('throws' in options) { shouldThrow = options.throws } try { - var content = fs.readFileSync(file, options) + let content = fs.readFileSync(file, options) content = stripBom(content) return JSON.parse(content, options.reviver) } catch (err) { if (shouldThrow) { - err.message = file + ': ' + err.message + err.message = `${file}: ${err.message}` throw err } else { return null @@ -72,8 +75,8 @@ } function stringify (obj, options) { - var spaces - var EOL = '\n' + let spaces + let EOL = '\n' if (typeof options === 'object' && options !== null) { if (options.spaces) { spaces = options.spaces @@ -83,36 +86,36 @@ } } - var str = JSON.stringify(obj, options ? options.replacer : null, spaces) + const str = JSON.stringify(obj, options ? options.replacer : null, spaces) return str.replace(/\n/g, EOL) + EOL } -function writeFile (file, obj, options, callback) { +function writeFileWithCallback (file, obj, options, callback) { if (callback == null) { callback = options options = {} } options = options || {} - var fs = options.fs || _fs + const fs = options.fs || _fs - var str = '' + let str = '' try { str = stringify(obj, options) } catch (err) { - // Need to return whether a callback was passed or not - if (callback) callback(err, null) - return + return callback(err, null) } fs.writeFile(file, str, options, callback) } +const writeFile = universalify.fromCallback(writeFileWithCallback) + function writeFileSync (file, obj, options) { options = options || {} - var fs = options.fs || _fs + const fs = options.fs || _fs - var str = stringify(obj, options) + const str = stringify(obj, options) // not sure if fs.writeFileSync returns anything, but just in case return fs.writeFileSync(file, str, options) } @@ -124,11 +127,11 @@ return content } -var jsonfile = { - readFile: readFile, - readFileSync: readFileSync, - writeFile: writeFile, - writeFileSync: writeFileSync +const jsonfile = { + readFile, + readFileSync, + writeFile, + writeFileSync } module.exports = jsonfile diff -Nru node-jsonfile-4.0.0/.npmignore node-jsonfile-5.0.0/.npmignore --- node-jsonfile-4.0.0/.npmignore 2017-09-12 19:16:39.000000000 +0000 +++ node-jsonfile-5.0.0/.npmignore 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -test/ -.travis.yml -appveyor.yml diff -Nru node-jsonfile-4.0.0/package.json node-jsonfile-5.0.0/package.json --- node-jsonfile-4.0.0/package.json 2017-09-12 19:16:39.000000000 +0000 +++ node-jsonfile-5.0.0/package.json 2018-09-08 16:53:08.000000000 +0000 @@ -1,6 +1,6 @@ { "name": "jsonfile", - "version": "4.0.0", + "version": "5.0.0", "description": "Easily read/write JSON files.", "repository": { "type": "git", @@ -16,14 +16,16 @@ ], "author": "JP Richardson ", "license": "MIT", - "dependencies": {}, + "dependencies": { + "universalify": "^0.1.2" + }, "optionalDependencies": { "graceful-fs": "^4.1.6" }, "devDependencies": { - "mocha": "2.x", + "mocha": "^5.2.0", "rimraf": "^2.4.0", - "standard": "^10.0.3" + "standard": "^12.0.1" }, "main": "index.js", "files": [ diff -Nru node-jsonfile-4.0.0/README.md node-jsonfile-5.0.0/README.md --- node-jsonfile-4.0.0/README.md 2017-09-12 19:16:39.000000000 +0000 +++ node-jsonfile-5.0.0/README.md 2018-09-08 16:53:08.000000000 +0000 @@ -1,7 +1,7 @@ Node.js - jsonfile ================ -Easily read/write JSON files. +Easily read/write JSON files in Node.js. _Note: this module cannot be used in the browser._ [![npm Package](https://img.shields.io/npm/v/jsonfile.svg?style=flat-square)](https://www.npmjs.org/package/jsonfile) [![build status](https://secure.travis-ci.org/jprichardson/node-jsonfile.svg)](http://travis-ci.org/jprichardson/node-jsonfile) @@ -34,13 +34,23 @@ ```js -var jsonfile = require('jsonfile') -var file = '/tmp/data.json' -jsonfile.readFile(file, function(err, obj) { +const jsonfile = require('jsonfile') +const file = '/tmp/data.json' +jsonfile.readFile(file, function (err, obj) { + if (err) console.error(err) console.dir(obj) }) ``` +You can also use this method with promises. The `readFile` method will return a promise if you do not pass a callback function. + +```js +const jsonfile = require('jsonfile') +const file = '/tmp/data.json' +jsonfile.readFile(file) + .then(obj => console.dir(obj)) + .catch(error => console.error(error)) +``` ### readFileSync(filename, [options]) @@ -48,8 +58,8 @@ - `throws` (`boolean`, default: `true`). If an error is encountered reading or parsing the file, throw the error. If `false`, returns `null` for the object. ```js -var jsonfile = require('jsonfile') -var file = '/tmp/data.json' +const jsonfile = require('jsonfile') +const file = '/tmp/data.json' console.dir(jsonfile.readFileSync(file)) ``` @@ -61,54 +71,69 @@ ```js -var jsonfile = require('jsonfile') +const jsonfile = require('jsonfile') -var file = '/tmp/data.json' -var obj = {name: 'JP'} +const file = '/tmp/data.json' +const obj = { name: 'JP' } jsonfile.writeFile(file, obj, function (err) { - console.error(err) + if (err) console.error(err) }) ``` +Or use with promises as follows: + +```js +const jsonfile = require('jsonfile') + +const file = '/tmp/data.json' +const obj = { name: 'JP' } + +jsonfile.writeFile(file, obj) + .then(res => { + console.log('Write complete') + }) + .catch(error => console.error(error)) +``` + **formatting with spaces:** ```js -var jsonfile = require('jsonfile') +const jsonfile = require('jsonfile') -var file = '/tmp/data.json' -var obj = {name: 'JP'} +const file = '/tmp/data.json' +const obj = { name: 'JP' } -jsonfile.writeFile(file, obj, {spaces: 2}, function(err) { - console.error(err) +jsonfile.writeFile(file, obj, { spaces: 2 }, function (err) { + if (err) console.error(err) }) ``` **overriding EOL:** ```js -var jsonfile = require('jsonfile') +const jsonfile = require('jsonfile') -var file = '/tmp/data.json' -var obj = {name: 'JP'} +const file = '/tmp/data.json' +const obj = { name: 'JP' } -jsonfile.writeFile(file, obj, {spaces: 2, EOL: '\r\n'}, function(err) { - console.error(err) +jsonfile.writeFile(file, obj, { spaces: 2, EOL: '\r\n' }, function (err) { + if (err) console.error(err) }) ``` **appending to an existing JSON file:** -You can use `fs.writeFile` option `{flag: 'a'}` to achieve this. +You can use `fs.writeFile` option `{ flag: 'a' }` to achieve this. ```js -var jsonfile = require('jsonfile') +const jsonfile = require('jsonfile') -var file = '/tmp/mayAlreadyExistedData.json' -var obj = {name: 'JP'} +const file = '/tmp/mayAlreadyExistedData.json' +const obj = { name: 'JP' } -jsonfile.writeFile(file, obj, {flag: 'a'}, function (err) { - console.error(err) +jsonfile.writeFile(file, obj, { flag: 'a' }, function (err) { + if (err) console.error(err) }) ``` @@ -117,10 +142,10 @@ `options`: Pass in any `fs.writeFileSync` options or set `replacer` for a [JSON replacer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify). Can also pass in `spaces` and override `EOL` string. ```js -var jsonfile = require('jsonfile') +const jsonfile = require('jsonfile') -var file = '/tmp/data.json' -var obj = {name: 'JP'} +const file = '/tmp/data.json' +const obj = { name: 'JP' } jsonfile.writeFileSync(file, obj) ``` @@ -128,36 +153,36 @@ **formatting with spaces:** ```js -var jsonfile = require('jsonfile') +const jsonfile = require('jsonfile') -var file = '/tmp/data.json' -var obj = {name: 'JP'} +const file = '/tmp/data.json' +const obj = { name: 'JP' } -jsonfile.writeFileSync(file, obj, {spaces: 2}) +jsonfile.writeFileSync(file, obj, { spaces: 2 }) ``` **overriding EOL:** ```js -var jsonfile = require('jsonfile') +const jsonfile = require('jsonfile') -var file = '/tmp/data.json' -var obj = {name: 'JP'} +const file = '/tmp/data.json' +const obj = { name: 'JP' } -jsonfile.writeFileSync(file, obj, {spaces: 2, EOL: '\r\n'}) +jsonfile.writeFileSync(file, obj, { spaces: 2, EOL: '\r\n' }) ``` **appending to an existing JSON file:** -You can use `fs.writeFileSync` option `{flag: 'a'}` to achieve this. +You can use `fs.writeFileSync` option `{ flag: 'a' }` to achieve this. ```js -var jsonfile = require('jsonfile') +const jsonfile = require('jsonfile') -var file = '/tmp/mayAlreadyExistedData.json' -var obj = {name: 'JP'} +const file = '/tmp/mayAlreadyExistedData.json' +const obj = { name: 'JP' } -jsonfile.writeFileSync(file, obj, {flag: 'a'}) +jsonfile.writeFileSync(file, obj, { flag: 'a' }) ``` License diff -Nru node-jsonfile-4.0.0/test/read-file-sync.test.js node-jsonfile-5.0.0/test/read-file-sync.test.js --- node-jsonfile-4.0.0/test/read-file-sync.test.js 2017-09-12 19:16:39.000000000 +0000 +++ node-jsonfile-5.0.0/test/read-file-sync.test.js 2018-09-08 16:53:08.000000000 +0000 @@ -1,48 +1,48 @@ -var assert = require('assert') -var fs = require('fs') -var os = require('os') -var path = require('path') -var rimraf = require('rimraf') -var jf = require('../') +const assert = require('assert') +const fs = require('fs') +const os = require('os') +const path = require('path') +const rimraf = require('rimraf') +const jf = require('../') /* global describe it beforeEach afterEach */ -describe('+ readFileSync()', function () { - var TEST_DIR +describe('+ readFileSync()', () => { + let TEST_DIR - beforeEach(function (done) { + beforeEach((done) => { TEST_DIR = path.join(os.tmpdir(), 'jsonfile-tests-readfile-sync') rimraf.sync(TEST_DIR) fs.mkdir(TEST_DIR, done) }) - afterEach(function (done) { + afterEach((done) => { rimraf.sync(TEST_DIR) done() }) - it('should read and parse JSON', function () { - var file = path.join(TEST_DIR, 'somefile3.json') - var obj = {name: 'JP'} + it('should read and parse JSON', () => { + const file = path.join(TEST_DIR, 'somefile3.json') + const obj = { name: 'JP' } fs.writeFileSync(file, JSON.stringify(obj)) try { - var obj2 = jf.readFileSync(file) - assert.equal(obj2.name, obj.name) + const obj2 = jf.readFileSync(file) + assert.strictEqual(obj2.name, obj.name) } catch (err) { assert(err) } }) - describe('> when invalid JSON', function () { - it('should include the filename in the error', function () { - var fn = 'somefile.json' - var file = path.join(TEST_DIR, fn) + describe('> when invalid JSON', () => { + it('should include the filename in the error', () => { + const fn = 'somefile.json' + const file = path.join(TEST_DIR, fn) fs.writeFileSync(file, '{') - assert.throws(function () { + assert.throws(() => { jf.readFileSync(file) - }, function (err) { + }, (err) => { assert(err instanceof Error) assert(err.message.match(fn)) return true @@ -50,85 +50,86 @@ }) }) - describe('> when invalid JSON and throws set to false', function () { - it('should return null', function () { - var file = path.join(TEST_DIR, 'somefile4-invalid.json') - var data = '{not valid JSON' + describe('> when invalid JSON and throws set to false', () => { + it('should return null', () => { + const file = path.join(TEST_DIR, 'somefile4-invalid.json') + const data = '{not valid JSON' fs.writeFileSync(file, data) - assert.throws(function () { + assert.throws(() => { jf.readFileSync(file) }) - var obj = jf.readFileSync(file, {throws: false}) + const obj = jf.readFileSync(file, { throws: false }) assert.strictEqual(obj, null) }) }) - describe('> when invalid JSON and throws set to true', function () { - it('should throw an exception', function () { - var file = path.join(TEST_DIR, 'somefile4-invalid.json') - var data = '{not valid JSON' + describe('> when invalid JSON and throws set to true', () => { + it('should throw an exception', () => { + const file = path.join(TEST_DIR, 'somefile4-invalid.json') + const data = '{not valid JSON' fs.writeFileSync(file, data) - assert.throws(function () { - jf.readFileSync(file, {throws: true}) + assert.throws(() => { + jf.readFileSync(file, { throws: true }) }) }) }) - describe('> when json file is missing and throws set to false', function () { - it('should return null', function () { - var file = path.join(TEST_DIR, 'somefile4-invalid.json') + describe('> when json file is missing and throws set to false', () => { + it('should return null', () => { + const file = path.join(TEST_DIR, 'somefile4-invalid.json') - var obj = jf.readFileSync(file, {throws: false}) + const obj = jf.readFileSync(file, { throws: false }) assert.strictEqual(obj, null) }) }) - describe('> when json file is missing and throws set to true', function () { - it('should throw an exception', function () { - var file = path.join(TEST_DIR, 'somefile4-invalid.json') + describe('> when json file is missing and throws set to true', () => { + it('should throw an exception', () => { + const file = path.join(TEST_DIR, 'somefile4-invalid.json') - assert.throws(function () { - jf.readFileSync(file, {throws: true}) + assert.throws(() => { + jf.readFileSync(file, { throws: true }) }) }) }) - describe('> when JSON reviver is set', function () { - it('should transform the JSON', function () { - var file = path.join(TEST_DIR, 'somefile.json') - var sillyReviver = function (k, v) { + describe('> when JSON reviver is set', () => { + it('should transform the JSON', () => { + const file = path.join(TEST_DIR, 'somefile.json') + const sillyReviver = function (k, v) { if (typeof v !== 'string') return v if (v.indexOf('date:') < 0) return v return new Date(v.split('date:')[1]) } - var obj = { + const obj = { name: 'jp', day: 'date:2015-06-19T11:41:26.815Z' } fs.writeFileSync(file, JSON.stringify(obj)) - var data = jf.readFileSync(file, {reviver: sillyReviver}) + const data = jf.readFileSync(file, { reviver: sillyReviver }) assert.strictEqual(data.name, 'jp') assert(data.day instanceof Date) assert.strictEqual(data.day.toISOString(), '2015-06-19T11:41:26.815Z') }) }) - describe('> when passing encoding string as option', function () { - it('should not throw an error', function () { - var file = path.join(TEST_DIR, 'somefile.json') + describe('> when passing encoding string as option', () => { + it('should not throw an error', () => { + const file = path.join(TEST_DIR, 'somefile.json') - var obj = { + const obj = { name: 'jp' } fs.writeFileSync(file, JSON.stringify(obj)) + let data try { - var data = jf.readFileSync(file, 'utf8') + data = jf.readFileSync(file, 'utf8') } catch (err) { assert.ifError(err) } @@ -136,13 +137,13 @@ }) }) - describe('> w/ BOM', function () { - it('should properly parse', function () { - var file = path.join(TEST_DIR, 'file-bom.json') - var obj = { name: 'JP' } - fs.writeFileSync(file, '\uFEFF' + JSON.stringify(obj)) - var data = jf.readFileSync(file) - assert.deepEqual(obj, data) + describe('> w/ BOM', () => { + it('should properly parse', () => { + const file = path.join(TEST_DIR, 'file-bom.json') + const obj = { name: 'JP' } + fs.writeFileSync(file, `\uFEFF${JSON.stringify(obj)}`) + const data = jf.readFileSync(file) + assert.deepStrictEqual(obj, data) }) }) }) diff -Nru node-jsonfile-4.0.0/test/read-file.test.js node-jsonfile-5.0.0/test/read-file.test.js --- node-jsonfile-4.0.0/test/read-file.test.js 2017-09-12 19:16:39.000000000 +0000 +++ node-jsonfile-5.0.0/test/read-file.test.js 2018-09-08 16:53:08.000000000 +0000 @@ -1,61 +1,97 @@ -var assert = require('assert') -var fs = require('fs') -var os = require('os') -var path = require('path') -var rimraf = require('rimraf') -var jf = require('../') +const assert = require('assert') +const fs = require('fs') +const os = require('os') +const path = require('path') +const rimraf = require('rimraf') +const jf = require('../') /* global describe it beforeEach afterEach */ -describe('+ readFile()', function () { - var TEST_DIR +describe('+ readFile()', () => { + let TEST_DIR - beforeEach(function (done) { + beforeEach((done) => { TEST_DIR = path.join(os.tmpdir(), 'jsonfile-tests-readfile') rimraf.sync(TEST_DIR) fs.mkdir(TEST_DIR, done) }) - afterEach(function (done) { + afterEach((done) => { rimraf.sync(TEST_DIR) done() }) - it('should read and parse JSON', function (done) { - var file = path.join(TEST_DIR, 'somefile.json') - var obj = {name: 'JP'} + it('should read and parse JSON', (done) => { + const file = path.join(TEST_DIR, 'somefile.json') + const obj = { name: 'JP' } fs.writeFileSync(file, JSON.stringify(obj)) - jf.readFile(file, function (err, obj2) { + jf.readFile(file, (err, obj2) => { assert.ifError(err) - assert.equal(obj2.name, obj.name) + assert.strictEqual(obj2.name, obj.name) done() }) }) - describe('> when invalid JSON', function () { - it('should include the filename in the error', function (done) { - var fn = 'somefile.json' - var file = path.join(TEST_DIR, fn) + it('should resolve a promise with parsed JSON', (done) => { + const file = path.join(TEST_DIR, 'somefile.json') + const obj = { name: 'JP' } + fs.writeFileSync(file, JSON.stringify(obj)) + + jf.readFile(file) + .then((data) => { + assert.strictEqual(data.name, obj.name) + done() + }) + .catch(err => { + assert.ifError(err) + done() + }) + }) + + describe('> when invalid JSON', () => { + let fn, file + + beforeEach((done) => { + fn = 'somefile.json' + file = path.join(TEST_DIR, fn) fs.writeFileSync(file, '{') + done() + }) - jf.readFile(file, function (err, obj2) { + it('should include the filename in the error', (done) => { + jf.readFile(file, (err, obj2) => { assert(err instanceof Error) assert(err.message.match(fn)) done() }) }) + + it('should reject the promise with filename in error', (done) => { + jf.readFile(file) + .catch(err => { + assert(err instanceof Error) + assert(err.message.match(fn)) + done() + }) + }) }) - describe('> when invalid JSON and throws set to false', function () { - it('should return null and no error', function (done) { - var fn = 'somefile4-invalid.json' - var file = path.join(TEST_DIR, fn) - var data = '{not valid JSON' - var bothDone = false + describe('> when invalid JSON and throws set to false', () => { + let fn, file + + beforeEach((done) => { + fn = 'somefile4-invalid.json' + file = path.join(TEST_DIR, fn) + const data = '{not valid JSON' fs.writeFileSync(file, data) + done() + }) - jf.readFile(file, function (err, obj2) { + it('should return null and no error', (done) => { + let bothDone = false + + jf.readFile(file, (err, obj2) => { assert(err instanceof Error) assert(err.message.match(fn)) if (bothDone) { @@ -64,7 +100,7 @@ bothDone = true }) - jf.readFile(file, {throws: false}, function (err, obj2) { + jf.readFile(file, { throws: false }, (err, obj2) => { assert.ifError(err) assert.strictEqual(obj2, null) if (bothDone) { @@ -73,17 +109,34 @@ bothDone = true }) }) + + it('should resolve the promise with null as data', (done) => { + jf.readFile(file, { throws: false }) + .then(data => { + assert.strictEqual(data, null) + done() + }) + .catch(err => { + assert.ifError(err) + done() + }) + }) }) - describe('> when invalid JSON and throws set to true', function () { - it('should return an error', function (done) { - var fn = 'somefile4-invalid.json' - var file = path.join(TEST_DIR, fn) - var data = '{not valid JSON' - var bothDone = false + describe('> when invalid JSON and throws set to true', () => { + let fn, file + + beforeEach((done) => { + fn = 'somefile4-invalid.json' + file = path.join(TEST_DIR, fn) + const data = '{not valid JSON' fs.writeFileSync(file, data) + done() + }) - jf.readFile(file, function (err, obj2) { + it('should return an error', (done) => { + let bothDone = false + jf.readFile(file, (err, obj2) => { assert(err instanceof Error) assert(err.message.match(fn)) if (bothDone) { @@ -92,7 +145,7 @@ bothDone = true }) - jf.readFile(file, {throws: true}, function (err, obj2) { + jf.readFile(file, { throws: true }, (err, obj2) => { assert(err instanceof Error) assert(err.message.match(fn)) if (bothDone) { @@ -101,24 +154,36 @@ bothDone = true }) }) + + it('should reject the promise', (done) => { + jf.readFile(file, { throws: true }) + .catch(err => { + assert(err instanceof Error) + assert(err.message.match(fn)) + done() + }) + }) }) - describe('> when JSON reviver is set', function () { - it('should transform the JSON', function (done) { - var file = path.join(TEST_DIR, 'somefile.json') - var sillyReviver = function (k, v) { + describe('> when JSON reviver is set', () => { + let file, sillyReviver + + beforeEach((done) => { + file = path.join(TEST_DIR, 'somefile.json') + sillyReviver = function (k, v) { if (typeof v !== 'string') return v if (v.indexOf('date:') < 0) return v return new Date(v.split('date:')[1]) } - var obj = { - name: 'jp', - day: 'date:2015-06-19T11:41:26.815Z' - } + const obj = { name: 'jp', day: 'date:2015-06-19T11:41:26.815Z' } fs.writeFileSync(file, JSON.stringify(obj)) - jf.readFile(file, {reviver: sillyReviver}, function (err, data) { + done() + }) + + it('should transform the JSON', (done) => { + jf.readFile(file, { reviver: sillyReviver }, (err, data) => { assert.ifError(err) assert.strictEqual(data.name, 'jp') assert(data.day instanceof Date) @@ -126,18 +191,31 @@ done() }) }) + + it('should resolve the promise with transformed JSON', (done) => { + jf.readFile(file, { reviver: sillyReviver }) + .then(data => { + assert.strictEqual(data.name, 'jp') + assert(data.day instanceof Date) + assert.strictEqual(data.day.toISOString(), '2015-06-19T11:41:26.815Z') + done() + }).catch(err => { + assert.ifError(err) + done() + }) + }) }) - describe('> when passing null and callback', function () { - it('should not throw an error', function (done) { - var file = path.join(TEST_DIR, 'somefile.json') + describe('> when passing null as options and callback', () => { + it('should not throw an error', (done) => { + const file = path.join(TEST_DIR, 'somefile.json') - var obj = { + const obj = { name: 'jp' } fs.writeFileSync(file, JSON.stringify(obj)) - jf.readFile(file, null, function (err) { + jf.readFile(file, null, (err) => { assert.ifError(err) assert.strictEqual(obj.name, 'jp') done() @@ -145,33 +223,89 @@ }) }) - describe('> when passing encoding string as option', function () { - it('should not throw an error', function (done) { - var file = path.join(TEST_DIR, 'somefile.json') + describe('> when passing null as options and expecting a promise', () => { + it('should resolve the promise', (done) => { + const file = path.join(TEST_DIR, 'somefile.json') - var obj = { + const obj = { name: 'jp' } fs.writeFileSync(file, JSON.stringify(obj)) - jf.readFile(file, 'utf8', function (err) { + jf.readFile(file, null) + .then(data => { + assert.strictEqual(data.name, obj.name) + done() + }) + .catch(err => { + assert.ifError(err) + done() + }) + }) + }) + + describe('> when passing encoding string as option', () => { + let file, obj + + beforeEach((done) => { + file = path.join(TEST_DIR, 'somefile.json') + + obj = { + name: 'jp' + } + fs.writeFileSync(file, JSON.stringify(obj)) + done() + }) + + it('should not throw an error', (done) => { + jf.readFile(file, 'utf8', (err) => { assert.ifError(err) assert.strictEqual(obj.name, 'jp') done() }) }) + + it('should resolve the promise', (done) => { + jf.readFile(file, 'utf8') + .then(data => { + assert.strictEqual(data.name, obj.name) + done() + }) + .catch(err => { + assert.ifError(err) + done() + }) + }) }) - describe('> w/ BOM', function () { - it('should properly parse', function (done) { - var file = path.join(TEST_DIR, 'file-bom.json') - var obj = { name: 'JP' } - fs.writeFileSync(file, '\uFEFF' + JSON.stringify(obj)) - jf.readFile(file, function (err, data) { + describe('> w/ BOM', () => { + let file, obj + + beforeEach((done) => { + file = path.join(TEST_DIR, 'file-bom.json') + obj = { name: 'JP' } + fs.writeFileSync(file, `\uFEFF${JSON.stringify(obj)}`) + done() + }) + + it('should properly parse', (done) => { + jf.readFile(file, (err, data) => { assert.ifError(err) - assert.deepEqual(obj, data) + assert.deepStrictEqual(obj, data) done() }) }) + + it('should resolve the promise with parsed JSON', (done) => { + jf.readFile(file) + .then(data => { + assert.deepStrictEqual(data, obj) + done() + }) + .catch(err => { + assert.ifError(err) + done() + }) + }) }) }) diff -Nru node-jsonfile-4.0.0/test/write-file-sync.test.js node-jsonfile-5.0.0/test/write-file-sync.test.js --- node-jsonfile-4.0.0/test/write-file-sync.test.js 2017-09-12 19:16:39.000000000 +0000 +++ node-jsonfile-5.0.0/test/write-file-sync.test.js 2018-09-08 16:53:08.000000000 +0000 @@ -1,85 +1,85 @@ -var assert = require('assert') -var fs = require('fs') -var os = require('os') -var path = require('path') -var rimraf = require('rimraf') -var jf = require('../') +const assert = require('assert') +const fs = require('fs') +const os = require('os') +const path = require('path') +const rimraf = require('rimraf') +const jf = require('../') /* global describe it beforeEach afterEach */ -describe('+ writeFileSync()', function () { - var TEST_DIR +describe('+ writeFileSync()', () => { + let TEST_DIR - beforeEach(function (done) { + beforeEach((done) => { TEST_DIR = path.join(os.tmpdir(), 'jsonfile-tests-writefile-sync') rimraf.sync(TEST_DIR) fs.mkdir(TEST_DIR, done) }) - afterEach(function (done) { + afterEach((done) => { rimraf.sync(TEST_DIR) done() }) - it('should serialize the JSON and write it to file', function () { - var file = path.join(TEST_DIR, 'somefile4.json') - var obj = {name: 'JP'} + it('should serialize the JSON and write it to file', () => { + const file = path.join(TEST_DIR, 'somefile4.json') + const obj = { name: 'JP' } jf.writeFileSync(file, obj) - var data = fs.readFileSync(file, 'utf8') - var obj2 = JSON.parse(data) - assert.equal(obj2.name, obj.name) - assert.equal(data[data.length - 1], '\n') - assert.equal(data, '{"name":"JP"}\n') + const data = fs.readFileSync(file, 'utf8') + const obj2 = JSON.parse(data) + assert.strictEqual(obj2.name, obj.name) + assert.strictEqual(data[data.length - 1], '\n') + assert.strictEqual(data, '{"name":"JP"}\n') }) - describe('> when JSON replacer is set', function () { - it('should replace JSON', function () { - var file = path.join(TEST_DIR, 'somefile.json') - var sillyReplacer = function (k, v) { + describe('> when JSON replacer is set', () => { + it('should replace JSON', () => { + const file = path.join(TEST_DIR, 'somefile.json') + const sillyReplacer = function (k, v) { if (!(v instanceof RegExp)) return v - return 'regex:' + v.toString() + return `regex:${v.toString()}` } - var obj = { + const obj = { name: 'jp', reg: new RegExp(/hello/g) } - jf.writeFileSync(file, obj, {replacer: sillyReplacer}) - var data = JSON.parse(fs.readFileSync(file)) + jf.writeFileSync(file, obj, { replacer: sillyReplacer }) + const data = JSON.parse(fs.readFileSync(file)) assert.strictEqual(data.name, 'jp') assert.strictEqual(typeof data.reg, 'string') assert.strictEqual(data.reg, 'regex:/hello/g') }) }) - describe('> when spaces passed as an option', function () { - it('should write file with spaces', function () { - var file = path.join(TEST_DIR, 'somefile.json') - var obj = { name: 'JP' } - jf.writeFileSync(file, obj, {spaces: 8}) - var data = fs.readFileSync(file, 'utf8') - assert.strictEqual(data, JSON.stringify(obj, null, 8) + '\n') + describe('> when spaces passed as an option', () => { + it('should write file with spaces', () => { + const file = path.join(TEST_DIR, 'somefile.json') + const obj = { name: 'JP' } + jf.writeFileSync(file, obj, { spaces: 8 }) + const data = fs.readFileSync(file, 'utf8') + assert.strictEqual(data, `${JSON.stringify(obj, null, 8)}\n`) }) - it('should use EOL override', function () { - var file = path.join(TEST_DIR, 'somefile.json') - var obj = { name: 'JP' } - jf.writeFileSync(file, obj, {spaces: 2, EOL: '***'}) - var data = fs.readFileSync(file, 'utf8') + it('should use EOL override', () => { + const file = path.join(TEST_DIR, 'somefile.json') + const obj = { name: 'JP' } + jf.writeFileSync(file, obj, { spaces: 2, EOL: '***' }) + const data = fs.readFileSync(file, 'utf8') assert.strictEqual(data, '{*** "name": "JP"***}***') }) }) - describe('> when passing encoding string as options', function () { - it('should not error', function () { - var file = path.join(TEST_DIR, 'somefile6.json') - var obj = { name: 'jp' } + describe('> when passing encoding string as options', () => { + it('should not error', () => { + const file = path.join(TEST_DIR, 'somefile6.json') + const obj = { name: 'jp' } jf.writeFileSync(file, obj, 'utf8') - var data = fs.readFileSync(file, 'utf8') - assert.strictEqual(data, JSON.stringify(obj) + '\n') + const data = fs.readFileSync(file, 'utf8') + assert.strictEqual(data, `${JSON.stringify(obj)}\n`) }) }) }) diff -Nru node-jsonfile-4.0.0/test/write-file.test.js node-jsonfile-5.0.0/test/write-file.test.js --- node-jsonfile-4.0.0/test/write-file.test.js 2017-09-12 19:16:39.000000000 +0000 +++ node-jsonfile-5.0.0/test/write-file.test.js 2018-09-08 16:53:08.000000000 +0000 @@ -1,132 +1,245 @@ -var assert = require('assert') -var fs = require('fs') -var os = require('os') -var path = require('path') -var rimraf = require('rimraf') -var jf = require('../') +const assert = require('assert') +const fs = require('fs') +const os = require('os') +const path = require('path') +const rimraf = require('rimraf') +const jf = require('../') /* global describe it beforeEach afterEach */ -describe('+ writeFile()', function () { - var TEST_DIR +describe('+ writeFile()', () => { + let TEST_DIR - beforeEach(function (done) { + beforeEach((done) => { TEST_DIR = path.join(os.tmpdir(), 'jsonfile-tests-writefile') rimraf.sync(TEST_DIR) fs.mkdir(TEST_DIR, done) }) - afterEach(function (done) { + afterEach((done) => { rimraf.sync(TEST_DIR) done() }) - it('should serialize and write JSON', function (done) { - var file = path.join(TEST_DIR, 'somefile2.json') - var obj = {name: 'JP'} + it('should serialize and write JSON', (done) => { + const file = path.join(TEST_DIR, 'somefile2.json') + const obj = { name: 'JP' } - jf.writeFile(file, obj, function (err) { + jf.writeFile(file, obj, (err) => { assert.ifError(err) - fs.readFile(file, 'utf8', function (err, data) { + fs.readFile(file, 'utf8', (err, data) => { assert.ifError(err) - var obj2 = JSON.parse(data) - assert.equal(obj2.name, obj.name) + const obj2 = JSON.parse(data) + assert.strictEqual(obj2.name, obj.name) // verify EOL - assert.equal(data[data.length - 1], '\n') + assert.strictEqual(data[data.length - 1], '\n') done() }) }) }) - describe('> when JSON replacer is set', function () { - it('should replace JSON', function (done) { - var file = path.join(TEST_DIR, 'somefile.json') - var sillyReplacer = function (k, v) { + it('should write JSON, resolve promise', (done) => { + const file = path.join(TEST_DIR, 'somefile2.json') + const obj = { name: 'JP' } + + jf.writeFile(file, obj) + .then(res => { + fs.readFile(file, 'utf8', (err, data) => { + assert.ifError(err) + const obj2 = JSON.parse(data) + assert.strictEqual(obj2.name, obj.name) + + // verify EOL + assert.strictEqual(data[data.length - 1], '\n') + done() + }) + }) + .catch(err => { + assert.ifError(err) + done() + }) + }) + + describe('> when JSON replacer is set', () => { + let file, sillyReplacer, obj + + beforeEach((done) => { + file = path.join(TEST_DIR, 'somefile.json') + sillyReplacer = function (k, v) { if (!(v instanceof RegExp)) return v - return 'regex:' + v.toString() + return `regex:${v.toString()}` } - var obj = { + obj = { name: 'jp', reg: new RegExp(/hello/g) } - jf.writeFile(file, obj, {replacer: sillyReplacer}, function (err) { + done() + }) + + it('should replace JSON', (done) => { + jf.writeFile(file, obj, { replacer: sillyReplacer }, (err) => { assert.ifError(err) - var data = JSON.parse(fs.readFileSync(file)) + const data = JSON.parse(fs.readFileSync(file)) assert.strictEqual(data.name, 'jp') assert.strictEqual(typeof data.reg, 'string') assert.strictEqual(data.reg, 'regex:/hello/g') done() }) }) + + it('should replace JSON, resolve promise', (done) => { + jf.writeFile(file, obj, { replacer: sillyReplacer }) + .then(res => { + const data = JSON.parse(fs.readFileSync(file)) + assert.strictEqual(data.name, 'jp') + assert.strictEqual(typeof data.reg, 'string') + assert.strictEqual(data.reg, 'regex:/hello/g') + done() + }) + .catch(err => { + assert.ifError(err) + done() + }) + }) }) - describe('> when passing null and callback', function () { - it('should not throw an error', function (done) { - var file = path.join(TEST_DIR, 'somefile.json') - var obj = { name: 'jp' } - jf.writeFile(file, obj, null, function (err) { + describe('> when passing null as options and callback', () => { + it('should not throw an error', (done) => { + const file = path.join(TEST_DIR, 'somefile.json') + const obj = { name: 'jp' } + jf.writeFile(file, obj, null, (err) => { assert.ifError(err) done() }) }) }) - describe('> when spaces passed as an option', function () { - it('should write file with spaces', function (done) { - var file = path.join(TEST_DIR, 'somefile.json') - var obj = { name: 'jp' } - jf.writeFile(file, obj, {spaces: 8}, function (err) { + describe('> when passing null as options and No callback', () => { + it('should not throw an error', (done) => { + const file = path.join(TEST_DIR, 'somefile.json') + const obj = { name: 'jp' } + jf.writeFile(file, obj, null) + .then(res => { + done() + }) + .catch(err => { + assert.ifError(err) + done() + }) + }) + }) + + describe('> when spaces passed as an option', () => { + let file, obj + beforeEach((done) => { + file = path.join(TEST_DIR, 'somefile.json') + obj = { name: 'jp' } + done() + }) + + it('should write file with spaces', (done) => { + jf.writeFile(file, obj, { spaces: 8 }, (err) => { assert.ifError(err) - var data = fs.readFileSync(file, 'utf8') - assert.strictEqual(data, JSON.stringify(obj, null, 8) + '\n') + const data = fs.readFileSync(file, 'utf8') + assert.strictEqual(data, `${JSON.stringify(obj, null, 8)}\n`) done() }) }) - it('should use EOL override', function (done) { - var file = path.join(TEST_DIR, 'somefile.json') - var obj = { name: 'jp' } - jf.writeFile(file, obj, {spaces: 2, EOL: '***'}, function (err) { + it('should write file with spaces, resolve the promise', (done) => { + jf.writeFile(file, obj, { spaces: 8 }) + .then(res => { + const data = fs.readFileSync(file, 'utf8') + assert.strictEqual(data, `${JSON.stringify(obj, null, 8)}\n`) + done() + }) + .catch(err => { + assert.ifError(err) + done() + }) + }) + }) + + describe('> when spaces, EOL are passed as options', () => { + let file, obj + beforeEach((done) => { + file = path.join(TEST_DIR, 'somefile.json') + obj = { name: 'jp' } + done() + }) + + it('should use EOL override', (done) => { + jf.writeFile(file, obj, { spaces: 2, EOL: '***' }, (err) => { assert.ifError(err) - var data = fs.readFileSync(file, 'utf8') + const data = fs.readFileSync(file, 'utf8') assert.strictEqual(data, '{*** "name": "jp"***}***') done() }) }) - }) - describe('> when passing encoding string as options', function () { - it('should not error', function (done) { - var file = path.join(TEST_DIR, 'somefile.json') - var obj = { name: 'jp' } - jf.writeFile(file, obj, 'utf8', function (err) { - assert.ifError(err) - var data = fs.readFileSync(file, 'utf8') - assert.strictEqual(data, JSON.stringify(obj) + '\n') + it('should use EOL override, resolve the promise', (done) => { + jf.writeFile(file, obj, { spaces: 2, EOL: '***' }) + .then(res => { + const data = fs.readFileSync(file, 'utf8') + assert.strictEqual(data, '{*** "name": "jp"***}***') + done() + }) + .catch(err => { + assert.ifError(err) + done() + }) + }) + }) + describe('> when passing encoding string as options', () => { + let file, obj + beforeEach((done) => { + file = path.join(TEST_DIR, 'somefile.json') + obj = { name: 'jp' } + done() + }) + + it('should not error', (done) => { + jf.writeFile(file, obj, 'utf8', (err) => { + assert.ifError(err) + const data = fs.readFileSync(file, 'utf8') + assert.strictEqual(data, `${JSON.stringify(obj)}\n`) done() }) }) + + it('should not error, resolve the promise', (done) => { + jf.writeFile(file, obj, 'utf8') + .then(res => { + const data = fs.readFileSync(file, 'utf8') + assert.strictEqual(data, `${JSON.stringify(obj)}\n`) + done() + }) + .catch(err => { + assert.ifError(err) + done() + }) + }) }) // Prevent https://github.com/jprichardson/node-jsonfile/issues/81 from happening - describe("> when callback isn't passed & can't serialize", function () { - it('should not write an empty file', function (done) { + describe("> when callback isn't passed & can't serialize", () => { + it('should not write an empty file, should reject the promise', function (done) { this.slow(1100) - var file = path.join(TEST_DIR, 'somefile.json') - var obj1 = { name: 'JP' } - var obj2 = { person: obj1 } + const file = path.join(TEST_DIR, 'somefile.json') + const obj1 = { name: 'JP' } + const obj2 = { person: obj1 } obj1.circular = obj2 jf.writeFile(file, obj1) - - setTimeout(function () { - assert(!fs.existsSync(file)) - done() - }, 1000) + .catch(err => { + assert(err) + assert(!fs.existsSync(file)) + done() + }) }) }) }) diff -Nru node-jsonfile-4.0.0/.travis.yml node-jsonfile-5.0.0/.travis.yml --- node-jsonfile-4.0.0/.travis.yml 2017-09-12 19:16:39.000000000 +0000 +++ node-jsonfile-5.0.0/.travis.yml 2018-09-08 16:53:08.000000000 +0000 @@ -1,12 +1,12 @@ sudo: false language: node_js node_js: - - "4" - "6" - "8" + - "10" matrix: include: - - node_js: "8" + - node_js: "10" env: TEST_SUITE=lint env: - TEST_SUITE=unit