diff --git a/.all-contributorsrc b/.all-contributorsrc index 84ea2088..41fab63e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -143,6 +143,15 @@ "contributions": [ "fundingFinding" ] + }, + { + "login": "schaab", + "name": "Jared Schaab", + "avatar_url": "https://avatars0.githubusercontent.com/u/1103255?v=4", + "profile": "https://github.com/schaab", + "contributions": [ + "code" + ] } ], "repoType": "github", diff --git a/package.json b/package.json index 6dae795b..c439cdcb 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "babel-plugin-transform-react-remove-prop-types": "^0.4.21", "browserslist": "^4.6.6", "concurrently": "^4.1.1", + "cosmiconfig": "^5.2.1", "cross-env": "^5.1.4", "cross-spawn": "^6.0.5", "doctoc": "^1.4.0", diff --git a/src/__tests__/utils.js b/src/__tests__/utils.js index e812bffe..b086735f 100644 --- a/src/__tests__/utils.js +++ b/src/__tests__/utils.js @@ -2,6 +2,15 @@ jest.mock('read-pkg-up', () => ({ sync: jest.fn(() => ({package: {}, path: '/blah/package.json'})), })) jest.mock('which', () => ({sync: jest.fn(() => {})})) +jest.mock('cosmiconfig', () => { + const actual = jest.requireActual('cosmiconfig') + + function cosmiconfig(name, options) { + return actual(name, options) + } + + return jest.fn(cosmiconfig) +}) let whichSyncMock, readPkgUpSyncMock @@ -137,6 +146,30 @@ test('ifFile returns the true argument if true and the false argument if false', expect(require('../utils').ifFile('does-not-exist.blah', t, f)).toBe(f) }) +test('hasLocalConfiguration returns false if no local configuration found', () => { + mockCosmiconfig() + + expect(require('../utils').hasLocalConfig('module')).toBe(false) +}) + +test('hasLocalConfig returns true if a local configuration found', () => { + mockCosmiconfig({config: {}, filepath: 'path/to/config'}) + + expect(require('../utils').hasLocalConfig('module')).toBe(true) +}) + +test('hasLocalConfiguration returns true if a local config found and it is empty', () => { + mockCosmiconfig({isEmpty: true}) + + expect(require('../utils').hasLocalConfig('module')).toBe(true) +}) + function mockPkg({package: pkg = {}, path = '/blah/package.json'}) { readPkgUpSyncMock.mockImplementationOnce(() => ({package: pkg, path})) } + +function mockCosmiconfig(result = null) { + const cosmiconfig = require('cosmiconfig') + + cosmiconfig.mockImplementationOnce(() => ({searchSync: () => result})) +} diff --git a/src/scripts/format.js b/src/scripts/format.js index 94b804ad..2142084d 100644 --- a/src/scripts/format.js +++ b/src/scripts/format.js @@ -1,7 +1,7 @@ const path = require('path') const spawn = require('cross-spawn') const yargsParser = require('yargs-parser') -const {hasPkgProp, resolveBin, hasFile} = require('../utils') +const {resolveBin, hasFile, hasLocalConfig} = require('../utils') const args = process.argv.slice(2) const parsedArgs = yargsParser(args) @@ -10,10 +10,7 @@ const here = p => path.join(__dirname, p) const hereRelative = p => here(p).replace(process.cwd(), '.') const useBuiltinConfig = - !args.includes('--config') && - !hasFile('.prettierrc') && - !hasFile('prettier.config.js') && - !hasPkgProp('prettierrc') + !args.includes('--config') && !hasLocalConfig('prettier') const config = useBuiltinConfig ? ['--config', hereRelative('../config/prettierrc.js')] : [] diff --git a/src/utils.js b/src/utils.js index 7847f776..c14fdbb3 100644 --- a/src/utils.js +++ b/src/utils.js @@ -6,6 +6,7 @@ const arrify = require('arrify') const has = require('lodash.has') const readPkgUp = require('read-pkg-up') const which = require('which') +const cosmiconfig = require('cosmiconfig') const {package: pkg, path: pkgPath} = readPkgUp.sync({ cwd: fs.realpathSync(process.cwd()), @@ -168,12 +169,20 @@ function writeExtraEntry(name, {cjs, esm}, clean = true) { ) } +function hasLocalConfig(moduleName, searchOptions = {}) { + const explorer = cosmiconfig(moduleName, searchOptions) + const result = explorer.searchSync(pkgPath) + + return result !== null +} + module.exports = { appDirectory, envIsSet, fromRoot, getConcurrentlyArgs, hasFile, + hasLocalConfig, hasPkgProp, hasScript, ifAnyDep,