@atlaskit/media-common 2.19.2 → 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.
Files changed (29) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/cjs/analytics/withMediaAnalyticsContext.js +2 -12
  3. package/dist/cjs/index.js +10 -4
  4. package/dist/cjs/mediaFeatureFlags/genericFeatureFlag.js +38 -0
  5. package/dist/cjs/mediaFeatureFlags/index.js +4 -4
  6. package/dist/cjs/mediaFeatureFlags/mediaFeatureFlags.js +22 -38
  7. package/dist/cjs/mediaFeatureFlags/productKeys.js +0 -4
  8. package/dist/cjs/version.json +1 -1
  9. package/dist/es2019/analytics/withMediaAnalyticsContext.js +3 -13
  10. package/dist/es2019/index.js +2 -2
  11. package/dist/es2019/mediaFeatureFlags/genericFeatureFlag.js +33 -0
  12. package/dist/es2019/mediaFeatureFlags/index.js +1 -1
  13. package/dist/es2019/mediaFeatureFlags/mediaFeatureFlags.js +19 -29
  14. package/dist/es2019/mediaFeatureFlags/productKeys.js +0 -4
  15. package/dist/es2019/version.json +1 -1
  16. package/dist/esm/analytics/withMediaAnalyticsContext.js +2 -12
  17. package/dist/esm/index.js +2 -2
  18. package/dist/esm/mediaFeatureFlags/genericFeatureFlag.js +33 -0
  19. package/dist/esm/mediaFeatureFlags/index.js +1 -1
  20. package/dist/esm/mediaFeatureFlags/mediaFeatureFlags.js +18 -33
  21. package/dist/esm/mediaFeatureFlags/productKeys.js +0 -4
  22. package/dist/esm/version.json +1 -1
  23. package/dist/types/analytics/withMediaAnalyticsContext.d.ts +1 -4
  24. package/dist/types/index.d.ts +2 -2
  25. package/dist/types/mediaFeatureFlags/genericFeatureFlag.d.ts +7 -0
  26. package/dist/types/mediaFeatureFlags/index.d.ts +1 -1
  27. package/dist/types/mediaFeatureFlags/mediaFeatureFlags.d.ts +13 -7
  28. package/package.json +2 -2
  29. package/report.api.md +7 -9
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
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
+
14
+ ## 3.0.0
15
+
16
+ ### Major Changes
17
+
18
+ - [`c2bc38829e1`](https://bitbucket.org/atlassian/atlassian-frontend/commits/c2bc38829e1) - Removed mediaUploadApiV2 feature flag (now as a breaking change)
19
+
20
+ ### Minor Changes
21
+
22
+ - [`8a0a92b2885`](https://bitbucket.org/atlassian/atlassian-frontend/commits/8a0a92b2885) - MEX-2210 improve inconsistent behaviour on timestampOnVideo playback
23
+
3
24
  ## 2.19.2
4
25
 
5
26
  ### Patch 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", {
@@ -117,6 +117,12 @@ Object.defineProperty(exports, "isUnknownMimeTypeSupportedByServer", {
117
117
  return _mediaTypeUtils.isUnknownMimeTypeSupportedByServer;
118
118
  }
119
119
  });
120
+ Object.defineProperty(exports, "isVideoMimeTypeSupportedByBrowser", {
121
+ enumerable: true,
122
+ get: function get() {
123
+ return _mediaTypeUtils.isVideoMimeTypeSupportedByBrowser;
124
+ }
125
+ });
120
126
  Object.defineProperty(exports, "isVideoMimeTypeSupportedByServer", {
121
127
  enumerable: true,
122
128
  get: function get() {
@@ -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;
@@ -26,8 +27,6 @@ var areEqualFeatureFlags = function areEqualFeatureFlags(ffA, ffB) {
26
27
  folderUploads: ffA.folderUploads === ffB.folderUploads,
27
28
  observedWidth: ffA.observedWidth === ffB.observedWidth,
28
29
  timestampOnVideo: ffA.timestampOnVideo === ffB.timestampOnVideo,
29
- // @ts-ignore
30
- mediaUploadApiV2: ffA.mediaUploadApiV2 === ffB.mediaUploadApiV2,
31
30
  memoryCacheLogging: ffA.memoryCacheLogging === ffB.memoryCacheLogging,
32
31
  fetchFileStateAfterUpload: ffA.fetchFileStateAfterUpload === ffB.fetchFileStateAfterUpload
33
32
  };
@@ -50,39 +49,35 @@ var filterFeatureFlagNames = function filterFeatureFlagNames(flags) {
50
49
  });
51
50
  };
52
51
 
53
- /**
54
- * Takes a record of {Media Feature Flag Names → boolean} and a supported product name.
55
- * Returns the corresponding product’s Launch Darkly Keys for each of the flags set as true in the input record.
56
- * */
57
- exports.filterFeatureFlagNames = filterFeatureFlagNames;
58
- var mapAndFilterFeatureFlagNames = function mapAndFilterFeatureFlagNames(flags, product) {
59
- var mediaFeatureFlags = filterFeatureFlagNames(flags);
60
- return mediaFeatureFlags.map(function (key) {
61
- return (0, _productKeys.getProductKeys)()[product][key];
62
- });
63
- };
64
-
65
52
  // TODO(MEX-1547): This is temporary solution to just return the launch darkly feature flags for all products.
66
53
  /**
67
54
  * Takes a record of {Media Feature Flag Names → boolean}.
68
55
  * Returns the Launch Darkly Keys from all products for each of the flags set as true in the input record.
69
56
  * */
70
- exports.mapAndFilterFeatureFlagNames = mapAndFilterFeatureFlagNames;
71
- var filterFeatureFlagKeysAllProducts = function filterFeatureFlagKeysAllProducts(flags) {
72
- var filteredFlags = filterFeatureFlagNames(flags);
57
+ exports.filterFeatureFlagNames = filterFeatureFlagNames;
58
+ var getFeatureFlagKeysAllProducts = function getFeatureFlagKeysAllProducts() {
59
+ var productKeys = (0, _productKeys.getProductKeys)();
73
60
  var ldFeatureFlags = [];
74
- filteredFlags.forEach(function (flag) {
75
- return _types.supportedProducts.forEach(function (product) {
76
- return ldFeatureFlags.push((0, _productKeys.getProductKeys)()[product][flag]);
77
- });
61
+ _types.supportedProducts.forEach(function (product) {
62
+ ldFeatureFlags = [].concat((0, _toConsumableArray2.default)(ldFeatureFlags), (0, _toConsumableArray2.default)(Object.values(productKeys[product])));
78
63
  });
79
64
  return ldFeatureFlags.filter(function (flag) {
80
65
  return flag !== '';
81
66
  });
82
67
  };
83
68
 
84
- // default values defined here, not necessary for components to know directly as they should use the function below
85
- exports.filterFeatureFlagKeysAllProducts = filterFeatureFlagKeysAllProducts;
69
+ /**
70
+ * defaultMediaFeatureFlags set default values used by the getter function getMediaFeatureFlag
71
+ *
72
+ * *************************************
73
+ * ************* IMPORTANT *************
74
+ * *************************************
75
+ * Only in exceptional cases a FF should be 'true' by default.
76
+ * Making a flag default to 'true' can lead to confusing and unexpected scenarios.
77
+ * If you must set a flag default = true, whenever you remove that flag
78
+ * that change should be released as a MAJOR, because it's a breaking change.
79
+ */
80
+ exports.getFeatureFlagKeysAllProducts = getFeatureFlagKeysAllProducts;
86
81
  var defaultMediaFeatureFlags = {
87
82
  newCardExperience: false,
88
83
  captions: false,
@@ -92,8 +87,6 @@ var defaultMediaFeatureFlags = {
92
87
  folderUploads: false,
93
88
  observedWidth: false,
94
89
  timestampOnVideo: false,
95
- // @ts-ignore
96
- mediaUploadApiV2: true,
97
90
  memoryCacheLogging: false,
98
91
  fetchFileStateAfterUpload: false
99
92
  };
@@ -110,16 +103,7 @@ var defaultMediaFeatureFlags = {
110
103
  * */
111
104
  exports.defaultMediaFeatureFlags = defaultMediaFeatureFlags;
112
105
  function getMediaFeatureFlag(flagName, featureFlags) {
113
- var devOverride = (0, _mediaFeatureFlagLocal.getLocalMediaFeatureFlag)(flagName);
114
- if (devOverride !== null) {
115
- try {
116
- return JSON.parse(devOverride);
117
- } catch (e) {}
118
- }
119
- if (featureFlags) {
120
- return flagName in featureFlags ? featureFlags[flagName] : defaultMediaFeatureFlags[flagName];
121
- }
122
- return defaultMediaFeatureFlags[flagName];
106
+ return (0, _genericFeatureFlag.getGenericFeatureFlag)(flagName, defaultMediaFeatureFlags, featureFlags);
123
107
  }
124
108
  var useMemoizeFeatureFlags = function useMemoizeFeatureFlags(featureFlags) {
125
109
  var ref = (0, _react.useRef)();
@@ -13,8 +13,6 @@ var productKeys = {
13
13
  //TODO fill the value after https://product-fabric.atlassian.net/browse/MEX-1593
14
14
  observedWidth: '',
15
15
  timestampOnVideo: 'confluence.frontend.media.timestamp.on.video',
16
- // @ts-ignore
17
- mediaUploadApiV2: 'confluence.enable.media.upload.api.v2',
18
16
  memoryCacheLogging: 'confluence-frontend-media-card-memory-cache-logging',
19
17
  fetchFileStateAfterUpload: 'confluence-frontend-media-client-fetch-file-state-after-upload'
20
18
  },
@@ -27,8 +25,6 @@ var productKeys = {
27
25
  //TODO fill the value after https://product-fabric.atlassian.net/browse/MEX-1593
28
26
  observedWidth: '',
29
27
  timestampOnVideo: 'issue.details.media-cards-timestamp-on-video',
30
- // @ts-ignore
31
- mediaUploadApiV2: 'issue.details.enable-media-upload-api-version-2',
32
28
  memoryCacheLogging: 'jira-frontend-media-card-memory-cache-logging',
33
29
  fetchFileStateAfterUpload: 'jira-frontend-media-client-fetch-file-state-after-upload'
34
30
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/media-common",
3
- "version": "2.19.2",
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,11 +3,11 @@ 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
 
10
10
  // Analytics constants
11
11
  export { ANALYTICS_MEDIA_CHANNEL } from './analytics/constants';
12
- export { getMediaTypeFromMimeType, isImageMimeTypeSupportedByBrowser, isDocumentMimeTypeSupportedByBrowser, isMimeTypeSupportedByBrowser, isImageMimeTypeSupportedByServer, isDocumentMimeTypeSupportedByServer, isAudioMimeTypeSupportedByServer, isVideoMimeTypeSupportedByServer, isUnknownMimeTypeSupportedByServer, isMimeTypeSupportedByServer } from './mediaTypeUtils';
12
+ export { getMediaTypeFromMimeType, isImageMimeTypeSupportedByBrowser, isDocumentMimeTypeSupportedByBrowser, isVideoMimeTypeSupportedByBrowser, isMimeTypeSupportedByBrowser, isImageMimeTypeSupportedByServer, isDocumentMimeTypeSupportedByServer, isAudioMimeTypeSupportedByServer, isVideoMimeTypeSupportedByServer, isUnknownMimeTypeSupportedByServer, isMimeTypeSupportedByServer } from './mediaTypeUtils';
13
13
  export { isUndefined, pick, omitBy, debounce, matches, getRandomHex } from './utils/helpers';
@@ -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;
@@ -16,8 +16,6 @@ export const areEqualFeatureFlags = (ffA, ffB) => {
16
16
  folderUploads: ffA.folderUploads === ffB.folderUploads,
17
17
  observedWidth: ffA.observedWidth === ffB.observedWidth,
18
18
  timestampOnVideo: ffA.timestampOnVideo === ffB.timestampOnVideo,
19
- // @ts-ignore
20
- mediaUploadApiV2: ffA.mediaUploadApiV2 === ffB.mediaUploadApiV2,
21
19
  memoryCacheLogging: ffA.memoryCacheLogging === ffB.memoryCacheLogging,
22
20
  fetchFileStateAfterUpload: ffA.fetchFileStateAfterUpload === ffB.fetchFileStateAfterUpload
23
21
  };
@@ -28,28 +26,31 @@ export const filterFeatureFlagNames = flags => {
28
26
  return pairs.filter(([_key, value]) => !!value).map(([key]) => key);
29
27
  };
30
28
 
31
- /**
32
- * Takes a record of {Media Feature Flag Names → boolean} and a supported product name.
33
- * Returns the corresponding product’s Launch Darkly Keys for each of the flags set as true in the input record.
34
- * */
35
- export const mapAndFilterFeatureFlagNames = (flags, product) => {
36
- const mediaFeatureFlags = filterFeatureFlagNames(flags);
37
- return mediaFeatureFlags.map(key => getProductKeys()[product][key]);
38
- };
39
-
40
29
  // TODO(MEX-1547): This is temporary solution to just return the launch darkly feature flags for all products.
41
30
  /**
42
31
  * Takes a record of {Media Feature Flag Names → boolean}.
43
32
  * Returns the Launch Darkly Keys from all products for each of the flags set as true in the input record.
44
33
  * */
45
- export const filterFeatureFlagKeysAllProducts = flags => {
46
- const filteredFlags = filterFeatureFlagNames(flags);
47
- const ldFeatureFlags = [];
48
- 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
+ });
49
40
  return ldFeatureFlags.filter(flag => flag !== '');
50
41
  };
51
42
 
52
- // default values defined here, not necessary for components to know directly as they should use the function below
43
+ /**
44
+ * defaultMediaFeatureFlags set default values used by the getter function getMediaFeatureFlag
45
+ *
46
+ * *************************************
47
+ * ************* IMPORTANT *************
48
+ * *************************************
49
+ * Only in exceptional cases a FF should be 'true' by default.
50
+ * Making a flag default to 'true' can lead to confusing and unexpected scenarios.
51
+ * If you must set a flag default = true, whenever you remove that flag
52
+ * that change should be released as a MAJOR, because it's a breaking change.
53
+ */
53
54
  export const defaultMediaFeatureFlags = {
54
55
  newCardExperience: false,
55
56
  captions: false,
@@ -59,8 +60,6 @@ export const defaultMediaFeatureFlags = {
59
60
  folderUploads: false,
60
61
  observedWidth: false,
61
62
  timestampOnVideo: false,
62
- // @ts-ignore
63
- mediaUploadApiV2: true,
64
63
  memoryCacheLogging: false,
65
64
  fetchFileStateAfterUpload: false
66
65
  };
@@ -76,16 +75,7 @@ export const defaultMediaFeatureFlags = {
76
75
  * (you will see a warning in console if override used)
77
76
  * */
78
77
  export function getMediaFeatureFlag(flagName, featureFlags) {
79
- const devOverride = getLocalMediaFeatureFlag(flagName);
80
- if (devOverride !== null) {
81
- try {
82
- return JSON.parse(devOverride);
83
- } catch (e) {}
84
- }
85
- if (featureFlags) {
86
- return flagName in featureFlags ? featureFlags[flagName] : defaultMediaFeatureFlags[flagName];
87
- }
88
- return defaultMediaFeatureFlags[flagName];
78
+ return getGenericFeatureFlag(flagName, defaultMediaFeatureFlags, featureFlags);
89
79
  }
90
80
  export const useMemoizeFeatureFlags = featureFlags => {
91
81
  const ref = useRef();
@@ -7,8 +7,6 @@ const productKeys = {
7
7
  //TODO fill the value after https://product-fabric.atlassian.net/browse/MEX-1593
8
8
  observedWidth: '',
9
9
  timestampOnVideo: 'confluence.frontend.media.timestamp.on.video',
10
- // @ts-ignore
11
- mediaUploadApiV2: 'confluence.enable.media.upload.api.v2',
12
10
  memoryCacheLogging: 'confluence-frontend-media-card-memory-cache-logging',
13
11
  fetchFileStateAfterUpload: 'confluence-frontend-media-client-fetch-file-state-after-upload'
14
12
  },
@@ -21,8 +19,6 @@ const productKeys = {
21
19
  //TODO fill the value after https://product-fabric.atlassian.net/browse/MEX-1593
22
20
  observedWidth: '',
23
21
  timestampOnVideo: 'issue.details.media-cards-timestamp-on-video',
24
- // @ts-ignore
25
- mediaUploadApiV2: 'issue.details.enable-media-upload-api-version-2',
26
22
  memoryCacheLogging: 'jira-frontend-media-card-memory-cache-logging',
27
23
  fetchFileStateAfterUpload: 'jira-frontend-media-client-fetch-file-state-after-upload'
28
24
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/media-common",
3
- "version": "2.19.2",
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,11 +3,11 @@ 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
 
10
10
  // Analytics constants
11
11
  export { ANALYTICS_MEDIA_CHANNEL } from './analytics/constants';
12
- export { getMediaTypeFromMimeType, isImageMimeTypeSupportedByBrowser, isDocumentMimeTypeSupportedByBrowser, isMimeTypeSupportedByBrowser, isImageMimeTypeSupportedByServer, isDocumentMimeTypeSupportedByServer, isAudioMimeTypeSupportedByServer, isVideoMimeTypeSupportedByServer, isUnknownMimeTypeSupportedByServer, isMimeTypeSupportedByServer } from './mediaTypeUtils';
12
+ export { getMediaTypeFromMimeType, isImageMimeTypeSupportedByBrowser, isDocumentMimeTypeSupportedByBrowser, isVideoMimeTypeSupportedByBrowser, isMimeTypeSupportedByBrowser, isImageMimeTypeSupportedByServer, isDocumentMimeTypeSupportedByServer, isAudioMimeTypeSupportedByServer, isVideoMimeTypeSupportedByServer, isUnknownMimeTypeSupportedByServer, isMimeTypeSupportedByServer } from './mediaTypeUtils';
13
13
  export { isUndefined, pick, omitBy, debounce, matches, getRandomHex } from './utils/helpers';
@@ -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;
@@ -17,8 +18,6 @@ export var areEqualFeatureFlags = function areEqualFeatureFlags(ffA, ffB) {
17
18
  folderUploads: ffA.folderUploads === ffB.folderUploads,
18
19
  observedWidth: ffA.observedWidth === ffB.observedWidth,
19
20
  timestampOnVideo: ffA.timestampOnVideo === ffB.timestampOnVideo,
20
- // @ts-ignore
21
- mediaUploadApiV2: ffA.mediaUploadApiV2 === ffB.mediaUploadApiV2,
22
21
  memoryCacheLogging: ffA.memoryCacheLogging === ffB.memoryCacheLogging,
23
22
  fetchFileStateAfterUpload: ffA.fetchFileStateAfterUpload === ffB.fetchFileStateAfterUpload
24
23
  };
@@ -40,36 +39,33 @@ export var filterFeatureFlagNames = function filterFeatureFlagNames(flags) {
40
39
  });
41
40
  };
42
41
 
43
- /**
44
- * Takes a record of {Media Feature Flag Names → boolean} and a supported product name.
45
- * Returns the corresponding product’s Launch Darkly Keys for each of the flags set as true in the input record.
46
- * */
47
- export var mapAndFilterFeatureFlagNames = function mapAndFilterFeatureFlagNames(flags, product) {
48
- var mediaFeatureFlags = filterFeatureFlagNames(flags);
49
- return mediaFeatureFlags.map(function (key) {
50
- return getProductKeys()[product][key];
51
- });
52
- };
53
-
54
42
  // TODO(MEX-1547): This is temporary solution to just return the launch darkly feature flags for all products.
55
43
  /**
56
44
  * Takes a record of {Media Feature Flag Names → boolean}.
57
45
  * Returns the Launch Darkly Keys from all products for each of the flags set as true in the input record.
58
46
  * */
59
- export var filterFeatureFlagKeysAllProducts = function filterFeatureFlagKeysAllProducts(flags) {
60
- var filteredFlags = filterFeatureFlagNames(flags);
47
+ export var getFeatureFlagKeysAllProducts = function getFeatureFlagKeysAllProducts() {
48
+ var productKeys = getProductKeys();
61
49
  var ldFeatureFlags = [];
62
- filteredFlags.forEach(function (flag) {
63
- return supportedProducts.forEach(function (product) {
64
- return ldFeatureFlags.push(getProductKeys()[product][flag]);
65
- });
50
+ supportedProducts.forEach(function (product) {
51
+ ldFeatureFlags = [].concat(_toConsumableArray(ldFeatureFlags), _toConsumableArray(Object.values(productKeys[product])));
66
52
  });
67
53
  return ldFeatureFlags.filter(function (flag) {
68
54
  return flag !== '';
69
55
  });
70
56
  };
71
57
 
72
- // default values defined here, not necessary for components to know directly as they should use the function below
58
+ /**
59
+ * defaultMediaFeatureFlags set default values used by the getter function getMediaFeatureFlag
60
+ *
61
+ * *************************************
62
+ * ************* IMPORTANT *************
63
+ * *************************************
64
+ * Only in exceptional cases a FF should be 'true' by default.
65
+ * Making a flag default to 'true' can lead to confusing and unexpected scenarios.
66
+ * If you must set a flag default = true, whenever you remove that flag
67
+ * that change should be released as a MAJOR, because it's a breaking change.
68
+ */
73
69
  export var defaultMediaFeatureFlags = {
74
70
  newCardExperience: false,
75
71
  captions: false,
@@ -79,8 +75,6 @@ export var defaultMediaFeatureFlags = {
79
75
  folderUploads: false,
80
76
  observedWidth: false,
81
77
  timestampOnVideo: false,
82
- // @ts-ignore
83
- mediaUploadApiV2: true,
84
78
  memoryCacheLogging: false,
85
79
  fetchFileStateAfterUpload: false
86
80
  };
@@ -96,16 +90,7 @@ export var defaultMediaFeatureFlags = {
96
90
  * (you will see a warning in console if override used)
97
91
  * */
98
92
  export function getMediaFeatureFlag(flagName, featureFlags) {
99
- var devOverride = getLocalMediaFeatureFlag(flagName);
100
- if (devOverride !== null) {
101
- try {
102
- return JSON.parse(devOverride);
103
- } catch (e) {}
104
- }
105
- if (featureFlags) {
106
- return flagName in featureFlags ? featureFlags[flagName] : defaultMediaFeatureFlags[flagName];
107
- }
108
- return defaultMediaFeatureFlags[flagName];
93
+ return getGenericFeatureFlag(flagName, defaultMediaFeatureFlags, featureFlags);
109
94
  }
110
95
  export var useMemoizeFeatureFlags = function useMemoizeFeatureFlags(featureFlags) {
111
96
  var ref = useRef();
@@ -7,8 +7,6 @@ var productKeys = {
7
7
  //TODO fill the value after https://product-fabric.atlassian.net/browse/MEX-1593
8
8
  observedWidth: '',
9
9
  timestampOnVideo: 'confluence.frontend.media.timestamp.on.video',
10
- // @ts-ignore
11
- mediaUploadApiV2: 'confluence.enable.media.upload.api.v2',
12
10
  memoryCacheLogging: 'confluence-frontend-media-card-memory-cache-logging',
13
11
  fetchFileStateAfterUpload: 'confluence-frontend-media-client-fetch-file-state-after-upload'
14
12
  },
@@ -21,8 +19,6 @@ var productKeys = {
21
19
  //TODO fill the value after https://product-fabric.atlassian.net/browse/MEX-1593
22
20
  observedWidth: '',
23
21
  timestampOnVideo: 'issue.details.media-cards-timestamp-on-video',
24
- // @ts-ignore
25
- mediaUploadApiV2: 'issue.details.enable-media-upload-api-version-2',
26
22
  memoryCacheLogging: 'jira-frontend-media-card-memory-cache-logging',
27
23
  fetchFileStateAfterUpload: 'jira-frontend-media-client-fetch-file-state-after-upload'
28
24
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/media-common",
3
- "version": "2.19.2",
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;
@@ -10,7 +10,7 @@ export interface NumericalCardDimensions {
10
10
  export type { PackageAttributes, WithFileAttributes, WithPerformanceAttributes, WithTraceContext, FileAttributes, PerformanceAttributes, SuccessAttributes, FailureAttributes, OperationalAttributes, OperationalEventPayload, UIAttributes, UIEventPayload, ScreenAttributes, ScreenEventPayload, TrackAttributes, TrackEventPayload, ContextPublicAttributes, ContextStaticProps, } from './analytics/types';
11
11
  export { withMediaAnalyticsContext } from './analytics/withMediaAnalyticsContext';
12
12
  export { ANALYTICS_MEDIA_CHANNEL } from './analytics/constants';
13
- export { getMediaTypeFromMimeType, isImageMimeTypeSupportedByBrowser, isDocumentMimeTypeSupportedByBrowser, isMimeTypeSupportedByBrowser, isImageMimeTypeSupportedByServer, isDocumentMimeTypeSupportedByServer, isAudioMimeTypeSupportedByServer, isVideoMimeTypeSupportedByServer, isUnknownMimeTypeSupportedByServer, isMimeTypeSupportedByServer, } from './mediaTypeUtils';
13
+ export { getMediaTypeFromMimeType, isImageMimeTypeSupportedByBrowser, isDocumentMimeTypeSupportedByBrowser, isVideoMimeTypeSupportedByBrowser, isMimeTypeSupportedByBrowser, isImageMimeTypeSupportedByServer, isDocumentMimeTypeSupportedByServer, isAudioMimeTypeSupportedByServer, isVideoMimeTypeSupportedByServer, isUnknownMimeTypeSupportedByServer, isMimeTypeSupportedByServer, } from './mediaTypeUtils';
14
14
  export declare type SSR = 'client' | 'server';
15
15
  export { isUndefined, pick, omitBy, debounce, matches, getRandomHex, } from './utils/helpers';
16
16
  export declare type MediaTraceContext = {
@@ -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,22 @@
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>;
9
+ /**
10
+ * defaultMediaFeatureFlags set default values used by the getter function getMediaFeatureFlag
11
+ *
12
+ * *************************************
13
+ * ************* IMPORTANT *************
14
+ * *************************************
15
+ * Only in exceptional cases a FF should be 'true' by default.
16
+ * Making a flag default to 'true' can lead to confusing and unexpected scenarios.
17
+ * If you must set a flag default = true, whenever you remove that flag
18
+ * that change should be released as a MAJOR, because it's a breaking change.
19
+ */
14
20
  export declare const defaultMediaFeatureFlags: Required<MediaFeatureFlags>;
15
21
  /**
16
22
  * Public accessor from components to fallback to defaults if flags not passed,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/media-common",
3
- "version": "2.19.2",
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
@@ -50,7 +50,7 @@ export const debounce: (
50
50
  wait: number,
51
51
  ) => (...args: any[]) => void;
52
52
 
53
- // @public (undocumented)
53
+ // @public
54
54
  export const defaultMediaFeatureFlags: Required<MediaFeatureFlags>;
55
55
 
56
56
  // @public (undocumented)
@@ -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,
@@ -142,6 +140,9 @@ export const isUndefined: (value: any) => boolean;
142
140
  // @public (undocumented)
143
141
  export const isUnknownMimeTypeSupportedByServer: (mimeType: string) => boolean;
144
142
 
143
+ // @public
144
+ export const isVideoMimeTypeSupportedByBrowser: (mimeType: string) => boolean;
145
+
145
146
  // @public (undocumented)
146
147
  export const isVideoMimeTypeSupportedByServer: (mimeType: string) => boolean;
147
148
 
@@ -328,9 +329,6 @@ export type WithFileAttributes = {
328
329
  // @public
329
330
  export const withMediaAnalyticsContext: (
330
331
  contextPublicAttributes: ContextPublicAttributes,
331
- options?: {
332
- filterFeatureFlags?: Array<keyof MediaFeatureFlags>;
333
- },
334
332
  ) => <
335
333
  Props extends WithMediaFeatureFlags,
336
334
  Component extends React_2.ComponentType<Props>,