diff --git a/lib/config.js b/lib/config.js index 2a4fd56b..ad0a0033 100644 --- a/lib/config.js +++ b/lib/config.js @@ -1,7 +1,5 @@ import { cosmiconfigSync } from 'cosmiconfig'; -import parseJson from 'parse-json'; import parseToml from '@iarna/toml/parse-string.js'; -import yaml from 'yaml'; import _ from 'lodash'; import isCI from 'is-ci'; import _debug from 'debug'; @@ -21,19 +19,17 @@ const searchPlaces = [ ]; const loaders = { - '.json': (_, content) => parseJson(content), - '.toml': (_, content) => parseToml(content), - '.yaml': (_, content) => yaml.parse(content) + '.toml': (_, content) => parseToml(content) }; -const getLocalConfig = localConfigFile => { +const getLocalConfig = ({ file, dir = process.cwd() }) => { let localConfig = {}; - if (localConfigFile === false) return localConfig; + if (file === false) return localConfig; const explorer = cosmiconfigSync('release-it', { searchPlaces, loaders }); - const result = localConfigFile ? explorer.load(localConfigFile) : explorer.search(); + const result = file ? explorer.load(file) : explorer.search(dir); if (result && typeof result.config === 'string') { throw new Error(`Invalid configuration file at ${result.filepath}`); } @@ -44,7 +40,7 @@ const getLocalConfig = localConfigFile => { class Config { constructor(config = {}) { this.constructorConfig = config; - this.localConfig = getLocalConfig(config.config); + this.localConfig = getLocalConfig({ file: config.config, dir: config.configDir }); this.options = this.mergeOptions(); this.options = this.expandPreReleaseShorthand(this.options); this.contextOptions = {}; diff --git a/package.json b/package.json index 7a1dee81..404a40aa 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,6 @@ "open": "8.4.0", "ora": "6.1.0", "os-name": "5.0.1", - "parse-json": "5.2.0", "promise.allsettled": "1.0.5", "proxy-agent": "5.0.0", "semver": "7.3.7", @@ -87,7 +86,6 @@ "url-join": "5.0.0", "uuid": "8.3.2", "wildcard-match": "5.1.2", - "yaml": "1.10.2", "yargs-parser": "21.0.1" }, "devDependencies": { diff --git a/test/config.js b/test/config.js index 30a935f0..0268a3a4 100644 --- a/test/config.js +++ b/test/config.js @@ -1,30 +1,30 @@ import test from 'ava'; -import mock from 'mock-fs'; import isCI from 'is-ci'; import Config from '../lib/config.js'; import { readJSON } from '../lib/util.js'; const defaultConfig = readJSON(new URL('../config/release-it.json', import.meta.url)); +const projectConfig = readJSON(new URL('../.release-it.json', import.meta.url)); const localConfig = { github: { release: true } }; -test.afterEach(() => mock.restore()); // eslint-disable-line ava/no-inline-assertions - -test('should contain default values', t => { - mock({ '../.release-it.json': JSON.stringify(localConfig) }); +test("should read this project's own configuration", t => { const config = new Config(); t.deepEqual(config.constructorConfig, {}); + t.deepEqual(config.localConfig, projectConfig); + t.deepEqual(config.defaultConfig, defaultConfig); +}); + +test('should contain default values', t => { + const config = new Config({ configDir: './test/stub/config/default' }); + t.deepEqual(config.constructorConfig, { configDir: './test/stub/config/default' }); t.deepEqual(config.localConfig, localConfig); t.deepEqual(config.defaultConfig, defaultConfig); - mock.restore(); }); test('should merge provided options', t => { - mock({ - 'package.json': JSON.stringify({ 'release-it': { git: { push: false } } }), - '../.release-it.json': JSON.stringify(localConfig) - }); const config = new Config({ + configDir: './test/stub/config/merge', increment: '1.0.0', verbose: true, github: { @@ -37,7 +37,6 @@ test('should merge provided options', t => { t.is(options.increment, '1.0.0'); t.is(options.git.push, false); t.is(options.github.release, true); - mock.restore(); }); test('should set CI mode', t => { @@ -57,24 +56,18 @@ test('should override --no-npm.publish', t => { }); test('should read YAML config', t => { - mock({ '.release-it.yaml': 'foo:\n bar: 1' }); - const config = new Config({ config: '.release-it.yaml' }); + const config = new Config({ configDir: './test/stub/config/yaml' }); t.deepEqual(config.options.foo, { bar: 1 }); - mock.restore(); }); test('should read YML config', t => { - mock({ '.release-it.yml': 'foo:\n bar: 1' }); - const config = new Config({ config: '.release-it.yml' }); + const config = new Config({ configDir: './test/stub/config/yml' }); t.deepEqual(config.options.foo, { bar: 1 }); - mock.restore(); }); test('should read TOML config', t => { - mock({ '.release-it.toml': '[foo]\nbar=1' }); - const config = new Config({ config: '.release-it.toml' }); + const config = new Config({ configDir: './test/stub/config/toml' }); t.deepEqual(config.options.foo, { bar: 1 }); - mock.restore(); }); test('should throw if provided config file is not found', t => { @@ -82,15 +75,15 @@ test('should throw if provided config file is not found', t => { }); test('should throw if provided config file is invalid (cosmiconfig exception)', t => { - mock({ 'invalid-config-txt': 'foo\nbar\baz' }); - t.throws(() => new Config({ config: 'invalid-config-txt' }), { message: /Invalid configuration file at/ }); - mock.restore(); + t.throws(() => new Config({ config: './test/stub/config/invalid-config-txt' }), { + message: /Invalid configuration file at/ + }); }); test('should throw if provided config file is invalid (no object)', t => { - mock({ 'invalid-config-rc': 'foo=bar' }); - t.throws(() => new Config({ config: 'invalid-config-rc' }), { message: /Invalid configuration file at/ }); - mock.restore(); + t.throws(() => new Config({ config: './test/stub/config/invalid-config-rc' }), { + message: /Invalid configuration file at/ + }); }); test('should not set default increment (for CI mode)', t => { diff --git a/test/stub/config/default/.release-it.json b/test/stub/config/default/.release-it.json new file mode 100644 index 00000000..d280b4de --- /dev/null +++ b/test/stub/config/default/.release-it.json @@ -0,0 +1,5 @@ +{ + "github": { + "release": true + } +} diff --git a/test/stub/config/invalid-config-rc b/test/stub/config/invalid-config-rc new file mode 100644 index 00000000..74d0a43f --- /dev/null +++ b/test/stub/config/invalid-config-rc @@ -0,0 +1 @@ +foo=bar diff --git a/test/stub/config/invalid-config-txt b/test/stub/config/invalid-config-txt new file mode 100644 index 00000000..c42f1d4c --- /dev/null +++ b/test/stub/config/invalid-config-txt @@ -0,0 +1,2 @@ +foo +bar\baz diff --git a/test/stub/config/merge/.release-it.json b/test/stub/config/merge/.release-it.json new file mode 100644 index 00000000..d280b4de --- /dev/null +++ b/test/stub/config/merge/.release-it.json @@ -0,0 +1,5 @@ +{ + "github": { + "release": true + } +} diff --git a/test/stub/config/merge/package.json b/test/stub/config/merge/package.json new file mode 100644 index 00000000..534092bc --- /dev/null +++ b/test/stub/config/merge/package.json @@ -0,0 +1,7 @@ +{ + "release-it": { + "git": { + "push": false + } + } +} diff --git a/test/stub/config/toml/.release-it.toml b/test/stub/config/toml/.release-it.toml new file mode 100644 index 00000000..fb278833 --- /dev/null +++ b/test/stub/config/toml/.release-it.toml @@ -0,0 +1,2 @@ +[foo] +bar=1 diff --git a/test/stub/config/yaml/.release-it.yaml b/test/stub/config/yaml/.release-it.yaml new file mode 100644 index 00000000..6fdc1c6f --- /dev/null +++ b/test/stub/config/yaml/.release-it.yaml @@ -0,0 +1,2 @@ +foo: + bar: 1 diff --git a/test/stub/config/yml/.release-it.yml b/test/stub/config/yml/.release-it.yml new file mode 100644 index 00000000..6fdc1c6f --- /dev/null +++ b/test/stub/config/yml/.release-it.yml @@ -0,0 +1,2 @@ +foo: + bar: 1