Ghost/core/server/services/labs.js
Rishabh 136fb093a3 Added labs flag for multiple products
refs https://github.com/TryGhost/Team/issues/763

- Adds new labs feature flag in the allow list to enable multiple products
2021-06-09 15:39:05 +05:30

60 lines
2.0 KiB
JavaScript

const _ = require('lodash');
const Promise = require('bluebird');
const SafeString = require('../../frontend/services/theme-engine/engine').SafeString;
const errors = require('@tryghost/errors');
const i18n = require('../../shared/i18n');
const logging = require('../../shared/logging');
const settingsCache = require('../services/settings/cache');
// NOTE: this allowlist is meant to be used to filter out any unexpected
// input for the "labs" setting value
const WRITABLE_KEYS_ALLOWLIST = [
'activitypub',
'matchHelper',
'multipleProducts'
];
module.exports.WRITABLE_KEYS_ALLOWLIST = WRITABLE_KEYS_ALLOWLIST;
module.exports.getAll = () => {
const labs = _.cloneDeep(settingsCache.get('labs')) || {};
labs.members = settingsCache.get('members_signup_access') !== 'none';
return labs;
};
module.exports.isSet = function isSet(flag) {
const labsConfig = module.exports.getAll();
return !!(labsConfig && labsConfig[flag] && labsConfig[flag] === true);
};
module.exports.enabledHelper = function enabledHelper(options, callback) {
const errDetails = {};
let errString;
if (module.exports.isSet(options.flagKey) === true) {
// helper is active, use the callback
return callback();
}
// Else, the helper is not active and we need to handle this as an error
errDetails.message = i18n.t(options.errMessagePath || 'warnings.helpers.helperNotAvailable', {helperName: options.helperName}),
errDetails.context = i18n.t(options.errContextPath || 'warnings.helpers.flagMustBeEnabled', {
helperName: options.helperName,
flagName: options.flagName
});
errDetails.help = i18n.t(options.errHelpPath || 'warnings.helpers.seeLink', {url: options.helpUrl});
logging.error(new errors.DisabledFeatureError(errDetails));
errString = new SafeString(`<script>console.error("${_.values(errDetails).join(' ')}");</script>`);
if (options.async) {
return Promise.resolve(errString);
}
return errString;
};