From 71b0c4051bd2d63999db23279424d76fae1ddc11 Mon Sep 17 00:00:00 2001 From: ryamaguchi0220 Date: Wed, 28 Jun 2023 19:24:45 +0900 Subject: [PATCH] fix: avoid overwriting the default values of options with undefined (#1018) * fix(conventional-changelog-core): avoid overwriting the default values of options with undefined * test(conventional-changelog-core): add tests for merge-config * refactor(conventional-changelog-core): optimize omitUndefinedValueProps to one loop --- .../lib/merge-config.js | 17 ++++++ .../test/{test.js => index.spec.js} | 0 .../test/merge-config.spec.js | 61 +++++++++++++++++++ 3 files changed, 78 insertions(+) rename packages/conventional-changelog-core/test/{test.js => index.spec.js} (100%) create mode 100644 packages/conventional-changelog-core/test/merge-config.spec.js diff --git a/packages/conventional-changelog-core/lib/merge-config.js b/packages/conventional-changelog-core/lib/merge-config.js index 4c5c26adc..48bf3cf54 100644 --- a/packages/conventional-changelog-core/lib/merge-config.js +++ b/packages/conventional-changelog-core/lib/merge-config.js @@ -53,10 +53,27 @@ function guessNextTag (previousTag, version) { return version } +function omitUndefinedValueProps (obj) { + if (!obj) { + return {} + } + + const omittedObj = {} + + for (const key in obj) { + if (obj[key] !== undefined) { + omittedObj[key] = obj[key] + } + } + + return omittedObj +} + async function mergeConfig (options, context, gitRawCommitsOpts, parserOpts, writerOpts, gitRawExecOpts) { let configPromise let pkgPromise + options = omitUndefinedValueProps(options) context = context || {} gitRawCommitsOpts = gitRawCommitsOpts || {} gitRawExecOpts = gitRawExecOpts || {} diff --git a/packages/conventional-changelog-core/test/test.js b/packages/conventional-changelog-core/test/index.spec.js similarity index 100% rename from packages/conventional-changelog-core/test/test.js rename to packages/conventional-changelog-core/test/index.spec.js diff --git a/packages/conventional-changelog-core/test/merge-config.spec.js b/packages/conventional-changelog-core/test/merge-config.spec.js new file mode 100644 index 000000000..ca4feb40f --- /dev/null +++ b/packages/conventional-changelog-core/test/merge-config.spec.js @@ -0,0 +1,61 @@ +'use strict' +const mergeConfig = require('../lib/merge-config') +const expect = require('chai').expect +const describe = require('mocha').describe + +const defaultOptions = { + append: false, + releaseCount: 1, + skipUnstable: false, + lernaPackage: null, + outputUnreleased: true +} + +describe('merge-config', function () { + it('should return passed options', async function () { + const options = { + append: true, + releaseCount: 0, + skipUnstable: true, + debug: function () {}, + warn: function () {}, + transform: function () {}, + lernaPackage: 'foo', + tagPrefix: 'bar', + outputUnreleased: true, + pkg: { + path: 'baz', + transform: function () {} + } + } + const config = await mergeConfig(options) + expect(config.options).to.deep.include(options) + }) + + it('should return default options if empty options is passed', async function () { + const { options } = await mergeConfig({}) + expect(options).to.include(defaultOptions) + }) + + it('should return default options when no options is passed', async function () { + const { options } = await mergeConfig() + expect(options).to.include(defaultOptions) + }) + + it('should return default options when null is passed', async function () { + const { options } = await mergeConfig(null) + expect(options).to.include(defaultOptions) + }) + + it('should return default options when undefined value is passed', async function () { + const options = { + append: undefined, + releaseCount: undefined, + skipUnstable: undefined, + lernaPackage: undefined, + outputUnreleased: undefined + } + const config = await mergeConfig(options) + expect(config.options).to.include(defaultOptions) + }) +})