From e0a5312dc510fcbb3e185f176f4c23216f31193a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josh=20Goldberg=20=E2=9C=A8?= Date: Mon, 29 May 2023 01:30:15 +0300 Subject: [PATCH] feat: use Prettier to write config file, if possible (#356) --- package.json | 3 ++ src/util/__tests__/__stubs__/.prettierrc.json | 3 ++ src/util/__tests__/formatting.js | 35 +++++++++++++++++++ src/util/config-file.js | 5 +-- src/util/formatting.js | 21 +++++++++++ 5 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 src/util/__tests__/__stubs__/.prettierrc.json create mode 100644 src/util/__tests__/formatting.js create mode 100644 src/util/formatting.js diff --git a/package.json b/package.json index 5ff44f1..8df75ad 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,9 @@ "nock": "^12.0.0", "semantic-release": "^17.0.8" }, + "optionalDependencies": { + "prettier": "^2" + }, "eslintIgnore": [ "node_modules", "coverage", diff --git a/src/util/__tests__/__stubs__/.prettierrc.json b/src/util/__tests__/__stubs__/.prettierrc.json new file mode 100644 index 0000000..c959087 --- /dev/null +++ b/src/util/__tests__/__stubs__/.prettierrc.json @@ -0,0 +1,3 @@ +{ + "useTabs": true +} diff --git a/src/util/__tests__/formatting.js b/src/util/__tests__/formatting.js new file mode 100644 index 0000000..e9e26d5 --- /dev/null +++ b/src/util/__tests__/formatting.js @@ -0,0 +1,35 @@ +import path from 'path' +import formatting from '../formatting' + +const content = {contributors: [{id: 'abc123'}]} + +const absentFile = '/!@#*&^DefinitelyDoesNotExistAllContributorsCLI$!@#' +const absentConfigFileExpected = `{ + "contributors": [ + { + "id": "abc123" + } + ] +}` + +const presentFile = path.join(__dirname, '__stubs__', 'file.json') +const presentConfigFileExpected = `{ + "contributors": [ + { + "id": "abc123" + } + ] +} +` + +test('falls back to JSON.stringify when the configPath cannot resolve to a config', () => { + expect(formatting.formatConfig(absentFile, content)).toBe( + absentConfigFileExpected, + ) +}) + +test('uses Prettier when the configPath can resolve to a config', () => { + expect(formatting.formatConfig(presentFile, content)).toBe( + presentConfigFileExpected, + ) +}) diff --git a/src/util/config-file.js b/src/util/config-file.js index fdcb154..f794db0 100644 --- a/src/util/config-file.js +++ b/src/util/config-file.js @@ -2,6 +2,7 @@ const fs = require('fs') const pify = require('pify') const _ = require('lodash/fp') const jf = require('json-fixer') +const {formatConfig} = require('./formatting') function readConfig(configPath) { try { @@ -14,7 +15,7 @@ function readConfig(configPath) { } if (changed) { //Updates the file with fixes - fs.writeFileSync(configPath, JSON.stringify(config, null, 2)) + fs.writeFileSync(configPath, formatConfig(config)) } return config } catch (error) { @@ -43,7 +44,7 @@ function writeConfig(configPath, content) { `Error! Project files was overridden and is empty in ${configPath}`, ) } - return pify(fs.writeFile)(configPath, `${JSON.stringify(content, null, 2)}\n`) + return pify(fs.writeFile)(configPath, `${formatConfig(content)}\n`) } function writeContributors(configPath, contributors) { diff --git a/src/util/formatting.js b/src/util/formatting.js new file mode 100644 index 0000000..eec2119 --- /dev/null +++ b/src/util/formatting.js @@ -0,0 +1,21 @@ +function formatConfig(configPath, content) { + const stringified = JSON.stringify(content, null, 2) + try { + const prettier = require('prettier') + const prettierConfig = prettier.resolveConfig.sync(configPath, { + useCache: false, + }) + + return prettierConfig + ? prettier.format(stringified, {...prettierConfig, parser: 'json'}) + : stringified + } catch (error) { + // If Prettier can't be required or throws in general, + // assume it's not usable and we should fall back to JSON.stringify + return stringified + } +} + +module.exports = { + formatConfig, +}