UNPKG

@atlaskit/editor-common

Version:

A package that contains common classes and components for editor and renderer

87 lines (84 loc) 2.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getEnabledFeatureFlagKeys = getEnabledFeatureFlagKeys; exports.normalizeFeatureFlags = normalizeFeatureFlags; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _camelCase = _interopRequireDefault(require("lodash/camelCase")); var _kebabCase = _interopRequireDefault(require("lodash/kebabCase")); var EMPTY = {}; function isObjectFlagKey(key, value, objectFlagKeys) { return Boolean(typeof value === 'string' && (objectFlagKeys === null || objectFlagKeys === void 0 ? void 0 : objectFlagKeys.includes(key))); } function isValidJSONObject(value) { try { var result = JSON.parse(value); if ((0, _typeof2.default)(result) === 'object' && result !== null) { return true; } return false; } catch (err) { return false; } } /** * Normalise and filter a free Record<string, unknown> to match * the rules for feature flags in editor and renderer * * Input has to match to not be filtered output: * 1. cased in kebab-case (match [a-z-]) * 2. has any value * * Output matches * 1. cased in camelCase (match [a-zA-Z]) * 2. has boolean value or object {} value * * @param rawFeatureFlags */ function normalizeFeatureFlags(rawFeatureFlags, options) { if (!rawFeatureFlags) { return EMPTY; } return Object.entries(rawFeatureFlags).filter(function (e) { if (typeof e[1] === 'boolean') { return true; } if (isObjectFlagKey((0, _camelCase.default)(e[0]), e[1], options === null || options === void 0 ? void 0 : options.objectFlagKeys) && isValidJSONObject(e[1])) { return true; } return false; }).filter(function (_ref) { var _ref2 = (0, _slicedToArray2.default)(_ref, 1), key = _ref2[0]; return (0, _kebabCase.default)(key) === key; }).map(function (_ref3) { var _ref4 = (0, _slicedToArray2.default)(_ref3, 2), key = _ref4[0], value = _ref4[1]; return [(0, _camelCase.default)(key), value]; }).reduce(function (flags, _ref5) { var _ref6 = (0, _slicedToArray2.default)(_ref5, 2), key = _ref6[0], value = _ref6[1]; if (isObjectFlagKey(key, value, options === null || options === void 0 ? void 0 : options.objectFlagKeys)) { flags[key] = JSON.parse(value); } if (typeof value === 'boolean') { flags[key] = value; } return flags; }, {}); } /** * Transforms FeatureFlags to a type safe string array of the enabled feature flags. * * Useful for analytics and analysis purposes. */ function getEnabledFeatureFlagKeys(featureFlags) { return Object.keys(featureFlags).filter(function (key) { return featureFlags[key] === true; }); }