@atlaskit/media-common 3.0.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # @atlaskit/media-common
2
2
 
3
+ ## 4.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - [`b37723f2cfa`](https://bitbucket.org/atlassian/atlassian-frontend/commits/b37723f2cfa) - Removed unused method filterFeatureFlagKeysAllProducts
8
+ Added new method getFeatureFlagKeysAllProducts
9
+
10
+ ### Patch Changes
11
+
12
+ - [`5859ee7d4e6`](https://bitbucket.org/atlassian/atlassian-frontend/commits/5859ee7d4e6) - Refactored code for better testing
13
+
3
14
  ## 3.0.0
4
15
 
5
16
  ### Major Changes
@@ -11,17 +11,10 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
11
11
  var _react = _interopRequireWildcard(require("react"));
12
12
  var _analyticsNext = require("@atlaskit/analytics-next");
13
13
  var _MediaAnalyticsContext = require("@atlaskit/analytics-namespaced-context/MediaAnalyticsContext");
14
- var _mediaFeatureFlags = require("../mediaFeatureFlags");
15
14
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
16
15
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
17
16
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
18
17
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
19
- var getFilteredFeatureFlags = function getFilteredFeatureFlags(keys, featureFlags) {
20
- return keys.reduce(function (result, key) {
21
- return _objectSpread(_objectSpread({}, result), {}, (0, _defineProperty2.default)({}, key, (0, _mediaFeatureFlags.getMediaFeatureFlag)(key, featureFlags)));
22
- }, {});
23
- };
24
-
25
18
  /**
26
19
  * HOC for attaching MediaAnalyticsContext to a top-level React Component.
27
20
  *
@@ -35,19 +28,16 @@ var getFilteredFeatureFlags = function getFilteredFeatureFlags(keys, featureFlag
35
28
  * @see packages/analytics/analytics-next/src/hocs/withAnalyticsContext.tsx
36
29
  */
37
30
  var withMediaAnalyticsContext = function withMediaAnalyticsContext(contextPublicAttributes) {
38
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
39
31
  return function (WrappedComponent) {
40
32
  // forwardRef() allows passing React refs to the wrapped component WithMediaAnalyticsContext
41
33
  var WithMediaAnalyticsContext = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
42
34
  var featureFlags = props.featureFlags;
43
- var filterFeatureFlags = options.filterFeatureFlags;
44
35
  var contextData = (0, _react.useMemo)(function () {
45
- var filteredFlags = filterFeatureFlags && featureFlags ? getFilteredFeatureFlags(filterFeatureFlags, featureFlags) : featureFlags;
46
36
  var contextPrivateAttributes = {
47
- featureFlags: filteredFlags
37
+ featureFlags: featureFlags
48
38
  };
49
39
  return _objectSpread(_objectSpread({}, contextPublicAttributes), {}, (0, _defineProperty2.default)({}, _MediaAnalyticsContext.MEDIA_CONTEXT, _objectSpread({}, contextPrivateAttributes)));
50
- }, [filterFeatureFlags, featureFlags]);
40
+ }, [featureFlags]);
51
41
  return /*#__PURE__*/_react.default.createElement(_analyticsNext.AnalyticsContext, {
52
42
  data: contextData
53
43
  }, /*#__PURE__*/_react.default.createElement(WrappedComponent, (0, _extends2.default)({}, props, {
package/dist/cjs/index.js CHANGED
@@ -33,16 +33,16 @@ Object.defineProperty(exports, "downloadUrl", {
33
33
  return _downloadUrl.downloadUrl;
34
34
  }
35
35
  });
36
- Object.defineProperty(exports, "filterFeatureFlagKeysAllProducts", {
36
+ Object.defineProperty(exports, "filterFeatureFlagNames", {
37
37
  enumerable: true,
38
38
  get: function get() {
39
- return _mediaFeatureFlags.filterFeatureFlagKeysAllProducts;
39
+ return _mediaFeatureFlags.filterFeatureFlagNames;
40
40
  }
41
41
  });
42
- Object.defineProperty(exports, "filterFeatureFlagNames", {
42
+ Object.defineProperty(exports, "getFeatureFlagKeysAllProducts", {
43
43
  enumerable: true,
44
44
  get: function get() {
45
- return _mediaFeatureFlags.filterFeatureFlagNames;
45
+ return _mediaFeatureFlags.getFeatureFlagKeysAllProducts;
46
46
  }
47
47
  });
48
48
  Object.defineProperty(exports, "getMediaFeatureFlag", {
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getGenericFeatureFlag = getGenericFeatureFlag;
7
+ var _mediaFeatureFlagLocal = require("../mediaFeatureFlag-local");
8
+ // Strongly typed method
9
+ // Enforces consistency bewteen flagName, defaults & featureFlags parameters
10
+ // All keys and value types need to match.
11
+ // Examples (Uncomment to see results):
12
+ // This works:
13
+ // getGenericFeatureFlag('key1',{ key1: true, key2: 'hiya', key3: 554 },{ key1: false, key2: 'bye', key3: 4 });
14
+ // getGenericFeatureFlag('key1',{ key1: true, key2: 'hiya', key3: 554 },{ key1: false, key3: 4 });
15
+ // TS Error: key5 does not exist in default
16
+ // getGenericFeatureFlag('key5',{ key1: true, key2: 'hiya', key3: 554 },{ key1: false, key2: 'bye', key3: 4 });
17
+ // getGenericFeatureFlag('key1',{ key1: true, key2: 'hiya', key3: 554 },{ key1: false, key5: 'bye', key3: 4 });
18
+ // TS Error: key2 values are inconsistent
19
+ // getGenericFeatureFlag('key1',{ key1: true, key2: 'hiya', key3: 554 },{ key1: false, key2: true, key3: 4 });
20
+
21
+ /**
22
+ * Returns the first value for the flagName found in this priority
23
+ * 1: local storage
24
+ * 2: featureFlags parameter
25
+ * 3: defaults parameter
26
+ */
27
+ function getGenericFeatureFlag(flagName, defaults, featureFlags) {
28
+ var devOverride = (0, _mediaFeatureFlagLocal.getLocalMediaFeatureFlag)(flagName);
29
+ if (devOverride !== null) {
30
+ try {
31
+ return JSON.parse(devOverride);
32
+ } catch (e) {}
33
+ }
34
+ if (featureFlags) {
35
+ return flagName in featureFlags ? featureFlags[flagName] : defaults[flagName];
36
+ }
37
+ return defaults[flagName];
38
+ }
@@ -15,16 +15,16 @@ Object.defineProperty(exports, "defaultMediaFeatureFlags", {
15
15
  return _mediaFeatureFlags.defaultMediaFeatureFlags;
16
16
  }
17
17
  });
18
- Object.defineProperty(exports, "filterFeatureFlagKeysAllProducts", {
18
+ Object.defineProperty(exports, "filterFeatureFlagNames", {
19
19
  enumerable: true,
20
20
  get: function get() {
21
- return _mediaFeatureFlags.filterFeatureFlagKeysAllProducts;
21
+ return _mediaFeatureFlags.filterFeatureFlagNames;
22
22
  }
23
23
  });
24
- Object.defineProperty(exports, "filterFeatureFlagNames", {
24
+ Object.defineProperty(exports, "getFeatureFlagKeysAllProducts", {
25
25
  enumerable: true,
26
26
  get: function get() {
27
- return _mediaFeatureFlags.filterFeatureFlagNames;
27
+ return _mediaFeatureFlags.getFeatureFlagKeysAllProducts;
28
28
  }
29
29
  });
30
30
  Object.defineProperty(exports, "getMediaFeatureFlag", {
@@ -4,14 +4,15 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.filterFeatureFlagNames = exports.filterFeatureFlagKeysAllProducts = exports.defaultMediaFeatureFlags = exports.areEqualFeatureFlags = void 0;
7
+ exports.getFeatureFlagKeysAllProducts = exports.filterFeatureFlagNames = exports.defaultMediaFeatureFlags = exports.areEqualFeatureFlags = void 0;
8
8
  exports.getMediaFeatureFlag = getMediaFeatureFlag;
9
- exports.useMemoizeFeatureFlags = exports.mapAndFilterFeatureFlagNames = void 0;
9
+ exports.useMemoizeFeatureFlags = void 0;
10
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
11
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
12
  var _react = require("react");
12
- var _mediaFeatureFlagLocal = require("../mediaFeatureFlag-local");
13
13
  var _types = require("./types");
14
14
  var _productKeys = require("./productKeys");
15
+ var _genericFeatureFlag = require("./genericFeatureFlag");
15
16
  var areEqualFeatureFlags = function areEqualFeatureFlags(ffA, ffB) {
16
17
  if (!ffA && !ffB) {
17
18
  return true;
@@ -48,31 +49,17 @@ var filterFeatureFlagNames = function filterFeatureFlagNames(flags) {
48
49
  });
49
50
  };
50
51
 
51
- /**
52
- * Takes a record of {Media Feature Flag Names → boolean} and a supported product name.
53
- * Returns the corresponding product’s Launch Darkly Keys for each of the flags set as true in the input record.
54
- * */
55
- exports.filterFeatureFlagNames = filterFeatureFlagNames;
56
- var mapAndFilterFeatureFlagNames = function mapAndFilterFeatureFlagNames(flags, product) {
57
- var mediaFeatureFlags = filterFeatureFlagNames(flags);
58
- return mediaFeatureFlags.map(function (key) {
59
- return (0, _productKeys.getProductKeys)()[product][key];
60
- });
61
- };
62
-
63
52
  // TODO(MEX-1547): This is temporary solution to just return the launch darkly feature flags for all products.
64
53
  /**
65
54
  * Takes a record of {Media Feature Flag Names → boolean}.
66
55
  * Returns the Launch Darkly Keys from all products for each of the flags set as true in the input record.
67
56
  * */
68
- exports.mapAndFilterFeatureFlagNames = mapAndFilterFeatureFlagNames;
69
- var filterFeatureFlagKeysAllProducts = function filterFeatureFlagKeysAllProducts(flags) {
70
- var filteredFlags = filterFeatureFlagNames(flags);
57
+ exports.filterFeatureFlagNames = filterFeatureFlagNames;
58
+ var getFeatureFlagKeysAllProducts = function getFeatureFlagKeysAllProducts() {
59
+ var productKeys = (0, _productKeys.getProductKeys)();
71
60
  var ldFeatureFlags = [];
72
- filteredFlags.forEach(function (flag) {
73
- return _types.supportedProducts.forEach(function (product) {
74
- return ldFeatureFlags.push((0, _productKeys.getProductKeys)()[product][flag]);
75
- });
61
+ _types.supportedProducts.forEach(function (product) {
62
+ ldFeatureFlags = [].concat((0, _toConsumableArray2.default)(ldFeatureFlags), (0, _toConsumableArray2.default)(Object.values(productKeys[product])));
76
63
  });
77
64
  return ldFeatureFlags.filter(function (flag) {
78
65
  return flag !== '';
@@ -90,7 +77,7 @@ var filterFeatureFlagKeysAllProducts = function filterFeatureFlagKeysAllProducts
90
77
  * If you must set a flag default = true, whenever you remove that flag
91
78
  * that change should be released as a MAJOR, because it's a breaking change.
92
79
  */
93
- exports.filterFeatureFlagKeysAllProducts = filterFeatureFlagKeysAllProducts;
80
+ exports.getFeatureFlagKeysAllProducts = getFeatureFlagKeysAllProducts;
94
81
  var defaultMediaFeatureFlags = {
95
82
  newCardExperience: false,
96
83
  captions: false,
@@ -116,16 +103,7 @@ var defaultMediaFeatureFlags = {
116
103
  * */
117
104
  exports.defaultMediaFeatureFlags = defaultMediaFeatureFlags;
118
105
  function getMediaFeatureFlag(flagName, featureFlags) {
119
- var devOverride = (0, _mediaFeatureFlagLocal.getLocalMediaFeatureFlag)(flagName);
120
- if (devOverride !== null) {
121
- try {
122
- return JSON.parse(devOverride);
123
- } catch (e) {}
124
- }
125
- if (featureFlags) {
126
- return flagName in featureFlags ? featureFlags[flagName] : defaultMediaFeatureFlags[flagName];
127
- }
128
- return defaultMediaFeatureFlags[flagName];
106
+ return (0, _genericFeatureFlag.getGenericFeatureFlag)(flagName, defaultMediaFeatureFlags, featureFlags);
129
107
  }
130
108
  var useMemoizeFeatureFlags = function useMemoizeFeatureFlags(featureFlags) {
131
109
  var ref = (0, _react.useRef)();
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/media-common",
3
- "version": "3.0.0",
3
+ "version": "4.0.0",
4
4
  "sideEffects": false
5
5
  }
@@ -2,12 +2,6 @@ import _extends from "@babel/runtime/helpers/extends";
2
2
  import React, { forwardRef, useMemo } from 'react';
3
3
  import { AnalyticsContext } from '@atlaskit/analytics-next';
4
4
  import { MEDIA_CONTEXT } from '@atlaskit/analytics-namespaced-context/MediaAnalyticsContext';
5
- import { getMediaFeatureFlag } from '../mediaFeatureFlags';
6
- const getFilteredFeatureFlags = (keys, featureFlags) => keys.reduce((result, key) => ({
7
- ...result,
8
- [key]: getMediaFeatureFlag(key, featureFlags)
9
- }), {});
10
-
11
5
  /**
12
6
  * HOC for attaching MediaAnalyticsContext to a top-level React Component.
13
7
  *
@@ -20,19 +14,15 @@ const getFilteredFeatureFlags = (keys, featureFlags) => keys.reduce((result, key
20
14
  *
21
15
  * @see packages/analytics/analytics-next/src/hocs/withAnalyticsContext.tsx
22
16
  */
23
- export const withMediaAnalyticsContext = (contextPublicAttributes, options = {}) => WrappedComponent => {
17
+ export const withMediaAnalyticsContext = contextPublicAttributes => WrappedComponent => {
24
18
  // forwardRef() allows passing React refs to the wrapped component WithMediaAnalyticsContext
25
19
  const WithMediaAnalyticsContext = /*#__PURE__*/forwardRef((props, ref) => {
26
20
  const {
27
21
  featureFlags
28
22
  } = props;
29
- const {
30
- filterFeatureFlags
31
- } = options;
32
23
  const contextData = useMemo(() => {
33
- const filteredFlags = filterFeatureFlags && featureFlags ? getFilteredFeatureFlags(filterFeatureFlags, featureFlags) : featureFlags;
34
24
  const contextPrivateAttributes = {
35
- featureFlags: filteredFlags
25
+ featureFlags
36
26
  };
37
27
  return {
38
28
  ...contextPublicAttributes,
@@ -40,7 +30,7 @@ export const withMediaAnalyticsContext = (contextPublicAttributes, options = {})
40
30
  ...contextPrivateAttributes
41
31
  }
42
32
  };
43
- }, [filterFeatureFlags, featureFlags]);
33
+ }, [featureFlags]);
44
34
  return /*#__PURE__*/React.createElement(AnalyticsContext, {
45
35
  data: contextData
46
36
  }, /*#__PURE__*/React.createElement(WrappedComponent, _extends({}, props, {
@@ -3,7 +3,7 @@ export { downloadUrl } from './downloadUrl';
3
3
  // See packages/media/media-core/src/__tests__/cache-backward-compatibility.spec.ts
4
4
 
5
5
  // Media Feature Flags
6
- export { getMediaFeatureFlag, defaultMediaFeatureFlags, areEqualFeatureFlags, useMemoizeFeatureFlags, filterFeatureFlagNames, filterFeatureFlagKeysAllProducts } from './mediaFeatureFlags';
6
+ export { getMediaFeatureFlag, defaultMediaFeatureFlags, areEqualFeatureFlags, useMemoizeFeatureFlags, filterFeatureFlagNames, getFeatureFlagKeysAllProducts } from './mediaFeatureFlags';
7
7
  // Analytics context
8
8
  export { withMediaAnalyticsContext } from './analytics/withMediaAnalyticsContext';
9
9
 
@@ -0,0 +1,33 @@
1
+ import { getLocalMediaFeatureFlag } from '../mediaFeatureFlag-local';
2
+
3
+ // Strongly typed method
4
+ // Enforces consistency bewteen flagName, defaults & featureFlags parameters
5
+ // All keys and value types need to match.
6
+ // Examples (Uncomment to see results):
7
+ // This works:
8
+ // getGenericFeatureFlag('key1',{ key1: true, key2: 'hiya', key3: 554 },{ key1: false, key2: 'bye', key3: 4 });
9
+ // getGenericFeatureFlag('key1',{ key1: true, key2: 'hiya', key3: 554 },{ key1: false, key3: 4 });
10
+ // TS Error: key5 does not exist in default
11
+ // getGenericFeatureFlag('key5',{ key1: true, key2: 'hiya', key3: 554 },{ key1: false, key2: 'bye', key3: 4 });
12
+ // getGenericFeatureFlag('key1',{ key1: true, key2: 'hiya', key3: 554 },{ key1: false, key5: 'bye', key3: 4 });
13
+ // TS Error: key2 values are inconsistent
14
+ // getGenericFeatureFlag('key1',{ key1: true, key2: 'hiya', key3: 554 },{ key1: false, key2: true, key3: 4 });
15
+
16
+ /**
17
+ * Returns the first value for the flagName found in this priority
18
+ * 1: local storage
19
+ * 2: featureFlags parameter
20
+ * 3: defaults parameter
21
+ */
22
+ export function getGenericFeatureFlag(flagName, defaults, featureFlags) {
23
+ const devOverride = getLocalMediaFeatureFlag(flagName);
24
+ if (devOverride !== null) {
25
+ try {
26
+ return JSON.parse(devOverride);
27
+ } catch (e) {}
28
+ }
29
+ if (featureFlags) {
30
+ return flagName in featureFlags ? featureFlags[flagName] : defaults[flagName];
31
+ }
32
+ return defaults[flagName];
33
+ }
@@ -1 +1 @@
1
- export { getMediaFeatureFlag, useMemoizeFeatureFlags, defaultMediaFeatureFlags, areEqualFeatureFlags, filterFeatureFlagNames, filterFeatureFlagKeysAllProducts } from './mediaFeatureFlags';
1
+ export { getMediaFeatureFlag, useMemoizeFeatureFlags, defaultMediaFeatureFlags, areEqualFeatureFlags, filterFeatureFlagNames, getFeatureFlagKeysAllProducts } from './mediaFeatureFlags';
@@ -1,7 +1,7 @@
1
1
  import { useRef } from 'react';
2
- import { getLocalMediaFeatureFlag } from '../mediaFeatureFlag-local';
3
2
  import { supportedProducts } from './types';
4
3
  import { getProductKeys } from './productKeys';
4
+ import { getGenericFeatureFlag } from './genericFeatureFlag';
5
5
  export const areEqualFeatureFlags = (ffA, ffB) => {
6
6
  if (!ffA && !ffB) {
7
7
  return true;
@@ -26,24 +26,17 @@ export const filterFeatureFlagNames = flags => {
26
26
  return pairs.filter(([_key, value]) => !!value).map(([key]) => key);
27
27
  };
28
28
 
29
- /**
30
- * Takes a record of {Media Feature Flag Names → boolean} and a supported product name.
31
- * Returns the corresponding product’s Launch Darkly Keys for each of the flags set as true in the input record.
32
- * */
33
- export const mapAndFilterFeatureFlagNames = (flags, product) => {
34
- const mediaFeatureFlags = filterFeatureFlagNames(flags);
35
- return mediaFeatureFlags.map(key => getProductKeys()[product][key]);
36
- };
37
-
38
29
  // TODO(MEX-1547): This is temporary solution to just return the launch darkly feature flags for all products.
39
30
  /**
40
31
  * Takes a record of {Media Feature Flag Names → boolean}.
41
32
  * Returns the Launch Darkly Keys from all products for each of the flags set as true in the input record.
42
33
  * */
43
- export const filterFeatureFlagKeysAllProducts = flags => {
44
- const filteredFlags = filterFeatureFlagNames(flags);
45
- const ldFeatureFlags = [];
46
- filteredFlags.forEach(flag => supportedProducts.forEach(product => ldFeatureFlags.push(getProductKeys()[product][flag])));
34
+ export const getFeatureFlagKeysAllProducts = () => {
35
+ const productKeys = getProductKeys();
36
+ let ldFeatureFlags = [];
37
+ supportedProducts.forEach(product => {
38
+ ldFeatureFlags = [...ldFeatureFlags, ...Object.values(productKeys[product])];
39
+ });
47
40
  return ldFeatureFlags.filter(flag => flag !== '');
48
41
  };
49
42
 
@@ -82,16 +75,7 @@ export const defaultMediaFeatureFlags = {
82
75
  * (you will see a warning in console if override used)
83
76
  * */
84
77
  export function getMediaFeatureFlag(flagName, featureFlags) {
85
- const devOverride = getLocalMediaFeatureFlag(flagName);
86
- if (devOverride !== null) {
87
- try {
88
- return JSON.parse(devOverride);
89
- } catch (e) {}
90
- }
91
- if (featureFlags) {
92
- return flagName in featureFlags ? featureFlags[flagName] : defaultMediaFeatureFlags[flagName];
93
- }
94
- return defaultMediaFeatureFlags[flagName];
78
+ return getGenericFeatureFlag(flagName, defaultMediaFeatureFlags, featureFlags);
95
79
  }
96
80
  export const useMemoizeFeatureFlags = featureFlags => {
97
81
  const ref = useRef();
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/media-common",
3
- "version": "3.0.0",
3
+ "version": "4.0.0",
4
4
  "sideEffects": false
5
5
  }
@@ -5,13 +5,6 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
5
5
  import React, { forwardRef, useMemo } from 'react';
6
6
  import { AnalyticsContext } from '@atlaskit/analytics-next';
7
7
  import { MEDIA_CONTEXT } from '@atlaskit/analytics-namespaced-context/MediaAnalyticsContext';
8
- import { getMediaFeatureFlag } from '../mediaFeatureFlags';
9
- var getFilteredFeatureFlags = function getFilteredFeatureFlags(keys, featureFlags) {
10
- return keys.reduce(function (result, key) {
11
- return _objectSpread(_objectSpread({}, result), {}, _defineProperty({}, key, getMediaFeatureFlag(key, featureFlags)));
12
- }, {});
13
- };
14
-
15
8
  /**
16
9
  * HOC for attaching MediaAnalyticsContext to a top-level React Component.
17
10
  *
@@ -25,19 +18,16 @@ var getFilteredFeatureFlags = function getFilteredFeatureFlags(keys, featureFlag
25
18
  * @see packages/analytics/analytics-next/src/hocs/withAnalyticsContext.tsx
26
19
  */
27
20
  export var withMediaAnalyticsContext = function withMediaAnalyticsContext(contextPublicAttributes) {
28
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
29
21
  return function (WrappedComponent) {
30
22
  // forwardRef() allows passing React refs to the wrapped component WithMediaAnalyticsContext
31
23
  var WithMediaAnalyticsContext = /*#__PURE__*/forwardRef(function (props, ref) {
32
24
  var featureFlags = props.featureFlags;
33
- var filterFeatureFlags = options.filterFeatureFlags;
34
25
  var contextData = useMemo(function () {
35
- var filteredFlags = filterFeatureFlags && featureFlags ? getFilteredFeatureFlags(filterFeatureFlags, featureFlags) : featureFlags;
36
26
  var contextPrivateAttributes = {
37
- featureFlags: filteredFlags
27
+ featureFlags: featureFlags
38
28
  };
39
29
  return _objectSpread(_objectSpread({}, contextPublicAttributes), {}, _defineProperty({}, MEDIA_CONTEXT, _objectSpread({}, contextPrivateAttributes)));
40
- }, [filterFeatureFlags, featureFlags]);
30
+ }, [featureFlags]);
41
31
  return /*#__PURE__*/React.createElement(AnalyticsContext, {
42
32
  data: contextData
43
33
  }, /*#__PURE__*/React.createElement(WrappedComponent, _extends({}, props, {
package/dist/esm/index.js CHANGED
@@ -3,7 +3,7 @@ export { downloadUrl } from './downloadUrl';
3
3
  // See packages/media/media-core/src/__tests__/cache-backward-compatibility.spec.ts
4
4
 
5
5
  // Media Feature Flags
6
- export { getMediaFeatureFlag, defaultMediaFeatureFlags, areEqualFeatureFlags, useMemoizeFeatureFlags, filterFeatureFlagNames, filterFeatureFlagKeysAllProducts } from './mediaFeatureFlags';
6
+ export { getMediaFeatureFlag, defaultMediaFeatureFlags, areEqualFeatureFlags, useMemoizeFeatureFlags, filterFeatureFlagNames, getFeatureFlagKeysAllProducts } from './mediaFeatureFlags';
7
7
  // Analytics context
8
8
  export { withMediaAnalyticsContext } from './analytics/withMediaAnalyticsContext';
9
9
 
@@ -0,0 +1,33 @@
1
+ import { getLocalMediaFeatureFlag } from '../mediaFeatureFlag-local';
2
+
3
+ // Strongly typed method
4
+ // Enforces consistency bewteen flagName, defaults & featureFlags parameters
5
+ // All keys and value types need to match.
6
+ // Examples (Uncomment to see results):
7
+ // This works:
8
+ // getGenericFeatureFlag('key1',{ key1: true, key2: 'hiya', key3: 554 },{ key1: false, key2: 'bye', key3: 4 });
9
+ // getGenericFeatureFlag('key1',{ key1: true, key2: 'hiya', key3: 554 },{ key1: false, key3: 4 });
10
+ // TS Error: key5 does not exist in default
11
+ // getGenericFeatureFlag('key5',{ key1: true, key2: 'hiya', key3: 554 },{ key1: false, key2: 'bye', key3: 4 });
12
+ // getGenericFeatureFlag('key1',{ key1: true, key2: 'hiya', key3: 554 },{ key1: false, key5: 'bye', key3: 4 });
13
+ // TS Error: key2 values are inconsistent
14
+ // getGenericFeatureFlag('key1',{ key1: true, key2: 'hiya', key3: 554 },{ key1: false, key2: true, key3: 4 });
15
+
16
+ /**
17
+ * Returns the first value for the flagName found in this priority
18
+ * 1: local storage
19
+ * 2: featureFlags parameter
20
+ * 3: defaults parameter
21
+ */
22
+ export function getGenericFeatureFlag(flagName, defaults, featureFlags) {
23
+ var devOverride = getLocalMediaFeatureFlag(flagName);
24
+ if (devOverride !== null) {
25
+ try {
26
+ return JSON.parse(devOverride);
27
+ } catch (e) {}
28
+ }
29
+ if (featureFlags) {
30
+ return flagName in featureFlags ? featureFlags[flagName] : defaults[flagName];
31
+ }
32
+ return defaults[flagName];
33
+ }
@@ -1 +1 @@
1
- export { getMediaFeatureFlag, useMemoizeFeatureFlags, defaultMediaFeatureFlags, areEqualFeatureFlags, filterFeatureFlagNames, filterFeatureFlagKeysAllProducts } from './mediaFeatureFlags';
1
+ export { getMediaFeatureFlag, useMemoizeFeatureFlags, defaultMediaFeatureFlags, areEqualFeatureFlags, filterFeatureFlagNames, getFeatureFlagKeysAllProducts } from './mediaFeatureFlags';
@@ -1,8 +1,9 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
1
2
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
3
  import { useRef } from 'react';
3
- import { getLocalMediaFeatureFlag } from '../mediaFeatureFlag-local';
4
4
  import { supportedProducts } from './types';
5
5
  import { getProductKeys } from './productKeys';
6
+ import { getGenericFeatureFlag } from './genericFeatureFlag';
6
7
  export var areEqualFeatureFlags = function areEqualFeatureFlags(ffA, ffB) {
7
8
  if (!ffA && !ffB) {
8
9
  return true;
@@ -38,29 +39,16 @@ export var filterFeatureFlagNames = function filterFeatureFlagNames(flags) {
38
39
  });
39
40
  };
40
41
 
41
- /**
42
- * Takes a record of {Media Feature Flag Names → boolean} and a supported product name.
43
- * Returns the corresponding product’s Launch Darkly Keys for each of the flags set as true in the input record.
44
- * */
45
- export var mapAndFilterFeatureFlagNames = function mapAndFilterFeatureFlagNames(flags, product) {
46
- var mediaFeatureFlags = filterFeatureFlagNames(flags);
47
- return mediaFeatureFlags.map(function (key) {
48
- return getProductKeys()[product][key];
49
- });
50
- };
51
-
52
42
  // TODO(MEX-1547): This is temporary solution to just return the launch darkly feature flags for all products.
53
43
  /**
54
44
  * Takes a record of {Media Feature Flag Names → boolean}.
55
45
  * Returns the Launch Darkly Keys from all products for each of the flags set as true in the input record.
56
46
  * */
57
- export var filterFeatureFlagKeysAllProducts = function filterFeatureFlagKeysAllProducts(flags) {
58
- var filteredFlags = filterFeatureFlagNames(flags);
47
+ export var getFeatureFlagKeysAllProducts = function getFeatureFlagKeysAllProducts() {
48
+ var productKeys = getProductKeys();
59
49
  var ldFeatureFlags = [];
60
- filteredFlags.forEach(function (flag) {
61
- return supportedProducts.forEach(function (product) {
62
- return ldFeatureFlags.push(getProductKeys()[product][flag]);
63
- });
50
+ supportedProducts.forEach(function (product) {
51
+ ldFeatureFlags = [].concat(_toConsumableArray(ldFeatureFlags), _toConsumableArray(Object.values(productKeys[product])));
64
52
  });
65
53
  return ldFeatureFlags.filter(function (flag) {
66
54
  return flag !== '';
@@ -102,16 +90,7 @@ export var defaultMediaFeatureFlags = {
102
90
  * (you will see a warning in console if override used)
103
91
  * */
104
92
  export function getMediaFeatureFlag(flagName, featureFlags) {
105
- var devOverride = getLocalMediaFeatureFlag(flagName);
106
- if (devOverride !== null) {
107
- try {
108
- return JSON.parse(devOverride);
109
- } catch (e) {}
110
- }
111
- if (featureFlags) {
112
- return flagName in featureFlags ? featureFlags[flagName] : defaultMediaFeatureFlags[flagName];
113
- }
114
- return defaultMediaFeatureFlags[flagName];
93
+ return getGenericFeatureFlag(flagName, defaultMediaFeatureFlags, featureFlags);
115
94
  }
116
95
  export var useMemoizeFeatureFlags = function useMemoizeFeatureFlags(featureFlags) {
117
96
  var ref = useRef();
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/media-common",
3
- "version": "3.0.0",
3
+ "version": "4.0.0",
4
4
  "sideEffects": false
5
5
  }
@@ -1,5 +1,4 @@
1
1
  import React from 'react';
2
- import { MediaFeatureFlags } from '../mediaFeatureFlags';
3
2
  import { ContextPublicAttributes } from './types';
4
3
  /**
5
4
  * HOC for attaching MediaAnalyticsContext to a top-level React Component.
@@ -13,6 +12,4 @@ import { ContextPublicAttributes } from './types';
13
12
  *
14
13
  * @see packages/analytics/analytics-next/src/hocs/withAnalyticsContext.tsx
15
14
  */
16
- export declare const withMediaAnalyticsContext: (contextPublicAttributes: ContextPublicAttributes, options?: {
17
- filterFeatureFlags?: Array<keyof MediaFeatureFlags>;
18
- }) => <Props extends import("../mediaFeatureFlags").WithMediaFeatureFlags, Component extends React.ComponentType<Props>>(WrappedComponent: React.JSXElementConstructor<Props> & Component) => React.ForwardRefExoticComponent<React.PropsWithoutRef<JSX.LibraryManagedAttributes<Component, Props>> & React.RefAttributes<any>>;
15
+ export declare const withMediaAnalyticsContext: (contextPublicAttributes: ContextPublicAttributes) => <Props extends import("..").WithMediaFeatureFlags, Component extends React.ComponentType<Props>>(WrappedComponent: React.JSXElementConstructor<Props> & Component) => React.ForwardRefExoticComponent<React.PropsWithoutRef<JSX.LibraryManagedAttributes<Component, Props>> & React.RefAttributes<any>>;
@@ -1,7 +1,7 @@
1
1
  export { downloadUrl } from './downloadUrl';
2
2
  export declare type MediaType = 'doc' | 'audio' | 'video' | 'image' | 'archive' | 'unknown';
3
3
  export declare type FileStatus = 'uploading' | 'processing' | 'processed' | 'error' | 'failed-processing';
4
- export { getMediaFeatureFlag, defaultMediaFeatureFlags, areEqualFeatureFlags, useMemoizeFeatureFlags, filterFeatureFlagNames, filterFeatureFlagKeysAllProducts, } from './mediaFeatureFlags';
4
+ export { getMediaFeatureFlag, defaultMediaFeatureFlags, areEqualFeatureFlags, useMemoizeFeatureFlags, filterFeatureFlagNames, getFeatureFlagKeysAllProducts, } from './mediaFeatureFlags';
5
5
  export type { MediaFeatureFlags, WithMediaFeatureFlags, } from './mediaFeatureFlags';
6
6
  export interface NumericalCardDimensions {
7
7
  width: number;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Returns the first value for the flagName found in this priority
3
+ * 1: local storage
4
+ * 2: featureFlags parameter
5
+ * 3: defaults parameter
6
+ */
7
+ export declare function getGenericFeatureFlag<T, K extends string, M extends Record<K, any>>(flagName: K, defaults: M, featureFlags?: Partial<M>): T;
@@ -1,2 +1,2 @@
1
- export { getMediaFeatureFlag, useMemoizeFeatureFlags, defaultMediaFeatureFlags, areEqualFeatureFlags, filterFeatureFlagNames, filterFeatureFlagKeysAllProducts, } from './mediaFeatureFlags';
1
+ export { getMediaFeatureFlag, useMemoizeFeatureFlags, defaultMediaFeatureFlags, areEqualFeatureFlags, filterFeatureFlagNames, getFeatureFlagKeysAllProducts, } from './mediaFeatureFlags';
2
2
  export type { MediaFeatureFlags, WithMediaFeatureFlags, SupportedProduct, } from './types';
@@ -1,16 +1,11 @@
1
- import { RequiredMediaFeatureFlags, MediaFeatureFlags, SupportedProduct } from './types';
1
+ import { RequiredMediaFeatureFlags, MediaFeatureFlags } from './types';
2
2
  export declare const areEqualFeatureFlags: (ffA?: MediaFeatureFlags | undefined, ffB?: MediaFeatureFlags | undefined) => boolean;
3
3
  export declare const filterFeatureFlagNames: (flags: RequiredMediaFeatureFlags) => Array<keyof MediaFeatureFlags>;
4
- /**
5
- * Takes a record of {Media Feature Flag Names → boolean} and a supported product name.
6
- * Returns the corresponding product’s Launch Darkly Keys for each of the flags set as true in the input record.
7
- * */
8
- export declare const mapAndFilterFeatureFlagNames: (flags: RequiredMediaFeatureFlags, product: SupportedProduct) => Array<string>;
9
4
  /**
10
5
  * Takes a record of {Media Feature Flag Names → boolean}.
11
6
  * Returns the Launch Darkly Keys from all products for each of the flags set as true in the input record.
12
7
  * */
13
- export declare const filterFeatureFlagKeysAllProducts: (flags: RequiredMediaFeatureFlags) => Array<string>;
8
+ export declare const getFeatureFlagKeysAllProducts: () => Array<string>;
14
9
  /**
15
10
  * defaultMediaFeatureFlags set default values used by the getter function getMediaFeatureFlag
16
11
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/media-common",
3
- "version": "3.0.0",
3
+ "version": "4.0.0",
4
4
  "description": "Includes common utilities used by other media packages",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -44,7 +44,7 @@
44
44
  },
45
45
  "devDependencies": {
46
46
  "@atlaskit/docs": "*",
47
- "@atlaskit/media-test-helpers": "^30.1.0",
47
+ "@atlaskit/media-test-helpers": "^31.0.0",
48
48
  "@atlassian/atlassian-frontend-prettier-config-1.0.1": "npm:@atlassian/atlassian-frontend-prettier-config@1.0.1",
49
49
  "enzyme": "^3.10.0",
50
50
  "react": "^16.8.0",
package/report.api.md CHANGED
@@ -91,16 +91,14 @@ export type FileStatus =
91
91
  | 'processing'
92
92
  | 'uploading';
93
93
 
94
- // @public
95
- export const filterFeatureFlagKeysAllProducts: (
96
- flags: RequiredMediaFeatureFlags,
97
- ) => Array<string>;
98
-
99
94
  // @public (undocumented)
100
95
  export const filterFeatureFlagNames: (
101
96
  flags: RequiredMediaFeatureFlags,
102
97
  ) => Array<keyof MediaFeatureFlags>;
103
98
 
99
+ // @public
100
+ export const getFeatureFlagKeysAllProducts: () => Array<string>;
101
+
104
102
  // @public
105
103
  export function getMediaFeatureFlag<T = boolean>(
106
104
  flagName: keyof MediaFeatureFlags,
@@ -331,9 +329,6 @@ export type WithFileAttributes = {
331
329
  // @public
332
330
  export const withMediaAnalyticsContext: (
333
331
  contextPublicAttributes: ContextPublicAttributes,
334
- options?: {
335
- filterFeatureFlags?: Array<keyof MediaFeatureFlags>;
336
- },
337
332
  ) => <
338
333
  Props extends WithMediaFeatureFlags,
339
334
  Component extends React_2.ComponentType<Props>,