diff --git a/lib/json/__tests__/output-json-sync.test.js b/lib/json/__tests__/output-json-sync.test.js index 671fe792..935a824f 100644 --- a/lib/json/__tests__/output-json-sync.test.js +++ b/lib/json/__tests__/output-json-sync.test.js @@ -5,7 +5,6 @@ const os = require('os') const fse = require(process.cwd()) const path = require('path') const assert = require('assert') -const outputJsonSync = require('../output-json-sync') /* global beforeEach, describe, it */ @@ -23,7 +22,7 @@ describe('json', () => { assert(!fs.existsSync(file)) const data = { name: 'JP' } - outputJsonSync(file, data) + fse.outputJsonSync(file, data) assert(fs.existsSync(file)) const newData = JSON.parse(fs.readFileSync(file, 'utf8')) @@ -39,7 +38,7 @@ describe('json', () => { const replacer = (k, v) => v === 'JP' ? 'Jon Paul' : v const data = { name: 'JP' } - outputJsonSync(file, data, { replacer }) + fse.outputJsonSync(file, data, { replacer }) const newData = JSON.parse(fs.readFileSync(file, 'utf8')) assert.strictEqual(newData.name, 'Jon Paul') diff --git a/lib/json/__tests__/output-json.test.js b/lib/json/__tests__/output-json.test.js index c98370be..6a5de69f 100644 --- a/lib/json/__tests__/output-json.test.js +++ b/lib/json/__tests__/output-json.test.js @@ -5,7 +5,6 @@ const os = require('os') const fse = require(process.cwd()) const path = require('path') const assert = require('assert') -const outputJson = require('../output-json') /* global beforeEach, describe, it */ @@ -23,7 +22,7 @@ describe('json', () => { assert(!fs.existsSync(file)) const data = { name: 'JP' } - outputJson(file, data, err => { + fse.outputJson(file, data, err => { if (err) return done(err) assert(fs.existsSync(file)) @@ -34,12 +33,32 @@ describe('json', () => { }) }) + it('should be mutation-proof', async () => { + const dir = path.join(TEST_DIR, 'this-dir', 'certanly-does-not', 'exist') + const file = path.join(dir, 'file.json') + assert(!fs.existsSync(dir), 'directory cannot exist') + + const name = 'JP' + const data = { name } + const promise = fse.outputJson(file, data) + // Mutate data right after call + data.name = 'Ryan' + // now await for the call to finish + await promise + + assert(fs.existsSync(file)) + const newData = JSON.parse(fs.readFileSync(file, 'utf8')) + + // mutation did not change data + assert.strictEqual(newData.name, name) + }) + it('should support Promises', () => { const file = path.join(TEST_DIR, 'this-dir', 'prob-does-not', 'exist', 'file.json') assert(!fs.existsSync(file)) const data = { name: 'JP' } - return outputJson(file, data) + return fse.outputJson(file, data) }) describe('> when an option is passed, like JSON replacer', () => { @@ -50,7 +69,7 @@ describe('json', () => { const replacer = (k, v) => v === 'JP' ? 'Jon Paul' : v const data = { name: 'JP' } - outputJson(file, data, { replacer }, err => { + fse.outputJson(file, data, { replacer }, err => { assert.ifError(err) const newData = JSON.parse(fs.readFileSync(file, 'utf8')) assert.strictEqual(newData.name, 'Jon Paul') diff --git a/lib/json/index.js b/lib/json/index.js index bae68d45..900126ad 100644 --- a/lib/json/index.js +++ b/lib/json/index.js @@ -1,6 +1,6 @@ 'use strict' -const u = require('universalify').fromCallback +const u = require('universalify').fromPromise const jsonFile = require('./jsonfile') jsonFile.outputJson = u(require('./output-json')) diff --git a/lib/json/jsonfile.js b/lib/json/jsonfile.js index 59cdb3e4..f11d34d6 100644 --- a/lib/json/jsonfile.js +++ b/lib/json/jsonfile.js @@ -1,12 +1,11 @@ 'use strict' -const u = require('universalify').fromCallback const jsonFile = require('jsonfile') module.exports = { // jsonfile exports - readJson: u(jsonFile.readFile), + readJson: jsonFile.readFile, readJsonSync: jsonFile.readFileSync, - writeJson: u(jsonFile.writeFile), + writeJson: jsonFile.writeFile, writeJsonSync: jsonFile.writeFileSync } diff --git a/lib/json/output-json-sync.js b/lib/json/output-json-sync.js index 6f76710e..f76b4744 100644 --- a/lib/json/output-json-sync.js +++ b/lib/json/output-json-sync.js @@ -1,18 +1,12 @@ 'use strict' -const fs = require('graceful-fs') -const path = require('path') -const mkdir = require('../mkdirs') -const jsonFile = require('./jsonfile') +const { stringify } = require('jsonfile/utils') +const { outputFileSync } = require('../output') function outputJsonSync (file, data, options) { - const dir = path.dirname(file) + const str = stringify(data, options) - if (!fs.existsSync(dir)) { - mkdir.mkdirsSync(dir) - } - - jsonFile.writeJsonSync(file, data, options) + outputFileSync(file, str, options) } module.exports = outputJsonSync diff --git a/lib/json/output-json.js b/lib/json/output-json.js index d45edb89..0fc66897 100644 --- a/lib/json/output-json.js +++ b/lib/json/output-json.js @@ -1,27 +1,12 @@ 'use strict' -const path = require('path') -const mkdir = require('../mkdirs') -const pathExists = require('../path-exists').pathExists -const jsonFile = require('./jsonfile') +const { stringify } = require('jsonfile/utils') +const { outputFile } = require('../output') -function outputJson (file, data, options, callback) { - if (typeof options === 'function') { - callback = options - options = {} - } +async function outputJson (file, data, options = {}) { + const str = stringify(data, options) - const dir = path.dirname(file) - - pathExists(dir, (err, itDoes) => { - if (err) return callback(err) - if (itDoes) return jsonFile.writeJson(file, data, options, callback) - - mkdir.mkdirs(dir, err => { - if (err) return callback(err) - jsonFile.writeJson(file, data, options, callback) - }) - }) + await outputFile(file, str, options) } module.exports = outputJson diff --git a/package.json b/package.json index 26ff4590..97e3a9e9 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", + "jsonfile": "^6.0.1", "universalify": "^1.0.0" }, "devDependencies": {