From 80ad8a4c8ff84e2cb589f9f1dbd66c4c274b93ff Mon Sep 17 00:00:00 2001 From: Adam Wathan Date: Thu, 6 Aug 2020 16:26:15 -0400 Subject: [PATCH] Support 'all' keyword for feature flags --- src/featureFlags.js | 56 +++++++++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/src/featureFlags.js b/src/featureFlags.js index ee45ad939..56abf5463 100644 --- a/src/featureFlags.js +++ b/src/featureFlags.js @@ -8,34 +8,62 @@ const featureFlags = { export function flagEnabled(config, flag) { if (featureFlags.future.includes(flag)) { - return _.get(config, ['future', flag], false) + return config.future === 'all' || _.get(config, ['future', flag], false) } if (featureFlags.experimental.includes(flag)) { - return _.get(config, ['experimental', flag], false) + return config.experimental === 'all' || _.get(config, ['experimental', flag], false) } return false } +function futureFlagsEnabled(config) { + if (config.future === 'all') { + return featureFlags.future + } + + return Object.keys(_.get(config, 'future', {})).filter( + flag => featureFlags.future.includes(flag) && config.future[flag] + ) +} + +function experimentalFlagsEnabled(config) { + if (config.experimental === 'all') { + return featureFlags.experimental + } + + return Object.keys(_.get(config, 'experimental', {})).filter( + flag => featureFlags.experimental.includes(flag) && config.experimental[flag] + ) +} + +function futureFlagsAvailable(config) { + if (config.future === 'all') { + return [] + } + + return featureFlags.future.filter(flag => !_.has(config, ['future', flag])) +} + export function issueFlagNotices(config) { const log = { info(message) { - console.log(chalk.bold.cyan(' info'), '-', message) + console.log(chalk.bold.cyan('info'), '-', message) }, warn(message) { - console.log(chalk.bold.yellow(' warn'), '-', message) + console.log(chalk.bold.yellow('warn'), '-', message) }, risk(message) { - console.log(chalk.bold.magenta(' risk'), '-', message) + console.log(chalk.bold.magenta('risk'), '-', message) }, } - if (_.some(featureFlags.future, flag => _.get(config, ['future', flag], false))) { - const changes = Object.keys(config.future) - .filter(flag => featureFlags.future.includes(flag) && config.future[flag]) + if (futureFlagsEnabled(config).length > 0) { + const changes = futureFlagsEnabled(config) .map(s => chalk.cyan(s)) .join(', ') + console.log() log.info(`You have opted-in to future-facing breaking changes: ${changes}`) log.info( @@ -43,11 +71,11 @@ export function issueFlagNotices(config) { ) } - if (_.some(featureFlags.experimental, flag => _.get(config, ['experimental', flag], false))) { - const changes = Object.keys(config.experimental) - .filter(flag => featureFlags.experimental.includes(flag) && config.experimental[flag]) + if (experimentalFlagsEnabled(config).length > 0) { + const changes = experimentalFlagsEnabled(config) .map(s => chalk.yellow(s)) .join(', ') + console.log() log.warn(`You have enabled experimental features: ${changes}`) log.warn( @@ -55,11 +83,11 @@ export function issueFlagNotices(config) { ) } - if (Object.keys(_.get(config, 'future', {})).length < featureFlags.future.length) { - const changes = featureFlags.future - .filter(flag => !_.has(config, ['future', flag])) + if (futureFlagsAvailable(config).length > 0) { + const changes = futureFlagsAvailable(config) .map(s => chalk.magenta(s)) .join(', ') + console.log() log.risk(`There are upcoming breaking changes: ${changes}`) log.risk(