@atlaskit/media-common 2.12.1 → 2.15.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/analytics/package.json +1 -0
  3. package/dist/cjs/index.js +6 -0
  4. package/dist/cjs/mediaFeatureFlags/index.js +43 -0
  5. package/dist/cjs/{mediaFeatureFlags.js → mediaFeatureFlags/mediaFeatureFlags.js} +89 -49
  6. package/dist/cjs/mediaFeatureFlags/productKeys.js +37 -0
  7. package/dist/cjs/mediaFeatureFlags/types.js +10 -0
  8. package/dist/cjs/version.json +1 -1
  9. package/dist/es2019/index.js +1 -1
  10. package/dist/es2019/mediaFeatureFlags/index.js +1 -0
  11. package/dist/es2019/{mediaFeatureFlags.js → mediaFeatureFlags/mediaFeatureFlags.js} +51 -28
  12. package/dist/es2019/mediaFeatureFlags/productKeys.js +26 -0
  13. package/dist/es2019/mediaFeatureFlags/types.js +3 -0
  14. package/dist/es2019/version.json +1 -1
  15. package/dist/esm/index.js +1 -1
  16. package/dist/esm/mediaFeatureFlags/index.js +1 -0
  17. package/dist/esm/{mediaFeatureFlags.js → mediaFeatureFlags/mediaFeatureFlags.js} +72 -41
  18. package/dist/esm/mediaFeatureFlags/productKeys.js +28 -0
  19. package/dist/esm/mediaFeatureFlags/types.js +3 -0
  20. package/dist/esm/version.json +1 -1
  21. package/dist/types/index.d.ts +2 -2
  22. package/dist/types/mediaFeatureFlags/index.d.ts +2 -0
  23. package/dist/types/{mediaFeatureFlags.d.ts → mediaFeatureFlags/mediaFeatureFlags.d.ts} +13 -14
  24. package/dist/types/mediaFeatureFlags/productKeys.d.ts +2 -0
  25. package/dist/types/mediaFeatureFlags/types.d.ts +17 -0
  26. package/downloadUrl/package.json +1 -0
  27. package/mediaFeatureFlags/package.json +5 -4
  28. package/mediaTypeUtils/package.json +1 -0
  29. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # @atlaskit/media-common
2
2
 
3
+ ## 2.15.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`1a76e2839e6`](https://bitbucket.org/atlassian/atlassian-frontend/commits/1a76e2839e6) - Default value for mediaUploadApiV2 Media feature flag set to true.
8
+
9
+ ## 2.14.0
10
+
11
+ ### Minor Changes
12
+
13
+ - [`bfde909c9b4`](https://bitbucket.org/atlassian/atlassian-frontend/commits/bfde909c9b4) - Add new feature flag mediaUploadApiV2
14
+ - [`8d6064cece4`](https://bitbucket.org/atlassian/atlassian-frontend/commits/8d6064cece4) - Add missing values for the launch darkly feature flags name
15
+
16
+ ## 2.13.0
17
+
18
+ ### Minor Changes
19
+
20
+ - [`501240ef964`](https://bitbucket.org/atlassian/atlassian-frontend/commits/501240ef964) - Export `filterFeatureFlagKeysAllProducts`
21
+ - [`a09f961b9b2`](https://bitbucket.org/atlassian/atlassian-frontend/commits/a09f961b9b2) - Add filterFeatureFlagNamesWithAllProducts for returning the feature flags for all the products
22
+ - [`a4f822c2d5d`](https://bitbucket.org/atlassian/atlassian-frontend/commits/a4f822c2d5d) - Add MediaFeatureFlagMap for Confluence and Jira
23
+
3
24
  ## 2.12.1
4
25
 
5
26
  ### Patch Changes
@@ -3,5 +3,6 @@
3
3
  "main": "../dist/cjs/analytics/index.js",
4
4
  "module": "../dist/esm/analytics/index.js",
5
5
  "module:es2019": "../dist/es2019/analytics/index.js",
6
+ "sideEffects": false,
6
7
  "types": "../dist/types/analytics/index.d.ts"
7
8
  }
package/dist/cjs/index.js CHANGED
@@ -33,6 +33,12 @@ Object.defineProperty(exports, "downloadUrl", {
33
33
  return _downloadUrl.downloadUrl;
34
34
  }
35
35
  });
36
+ Object.defineProperty(exports, "filterFeatureFlagKeysAllProducts", {
37
+ enumerable: true,
38
+ get: function get() {
39
+ return _mediaFeatureFlags.filterFeatureFlagKeysAllProducts;
40
+ }
41
+ });
36
42
  Object.defineProperty(exports, "filterFeatureFlagNames", {
37
43
  enumerable: true,
38
44
  get: function get() {
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "areEqualFeatureFlags", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _mediaFeatureFlags.areEqualFeatureFlags;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "defaultMediaFeatureFlags", {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _mediaFeatureFlags.defaultMediaFeatureFlags;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "filterFeatureFlagKeysAllProducts", {
19
+ enumerable: true,
20
+ get: function get() {
21
+ return _mediaFeatureFlags.filterFeatureFlagKeysAllProducts;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "filterFeatureFlagNames", {
25
+ enumerable: true,
26
+ get: function get() {
27
+ return _mediaFeatureFlags.filterFeatureFlagNames;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "getMediaFeatureFlag", {
31
+ enumerable: true,
32
+ get: function get() {
33
+ return _mediaFeatureFlags.getMediaFeatureFlag;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "useMemoizeFeatureFlags", {
37
+ enumerable: true,
38
+ get: function get() {
39
+ return _mediaFeatureFlags.useMemoizeFeatureFlags;
40
+ }
41
+ });
42
+
43
+ var _mediaFeatureFlags = require("./mediaFeatureFlags");
@@ -5,17 +5,98 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.filterFeatureFlagNames = exports.defaultMediaFeatureFlags = exports.areEqualFeatureFlags = void 0;
8
+ exports.filterFeatureFlagNames = exports.filterFeatureFlagKeysAllProducts = exports.defaultMediaFeatureFlags = exports.areEqualFeatureFlags = void 0;
9
9
  exports.getMediaFeatureFlag = getMediaFeatureFlag;
10
- exports.useMemoizeFeatureFlags = void 0;
10
+ exports.useMemoizeFeatureFlags = exports.mapAndFilterFeatureFlagNames = void 0;
11
11
 
12
12
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
13
 
14
14
  var _react = require("react");
15
15
 
16
- var _mediaFeatureFlagLocal = require("./mediaFeatureFlag-local");
16
+ var _mediaFeatureFlagLocal = require("../mediaFeatureFlag-local");
17
17
 
18
- // default values defined here, not necessary for components to know directly as they should use the function below
18
+ var _types = require("./types");
19
+
20
+ var _productKeys = require("./productKeys");
21
+
22
+ var areEqualFeatureFlags = function areEqualFeatureFlags(ffA, ffB) {
23
+ if (!ffA && !ffB) {
24
+ return true;
25
+ }
26
+
27
+ if (!ffA || !ffB) {
28
+ return false;
29
+ }
30
+
31
+ var results = {
32
+ newCardExperience: ffA.newCardExperience === ffB.newCardExperience,
33
+ captions: ffA.captions === ffB.captions,
34
+ mediaInline: ffA.mediaInline === ffB.mediaInline,
35
+ folderUploads: ffA.folderUploads === ffB.folderUploads,
36
+ observedWidth: ffA.observedWidth === ffB.observedWidth,
37
+ timestampOnVideo: ffA.timestampOnVideo === ffB.timestampOnVideo,
38
+ mediaUploadApiV2: ffA.mediaUploadApiV2 === ffB.mediaUploadApiV2
39
+ };
40
+ return Object.values(results).every(function (result) {
41
+ return result;
42
+ });
43
+ };
44
+
45
+ exports.areEqualFeatureFlags = areEqualFeatureFlags;
46
+
47
+ var filterFeatureFlagNames = function filterFeatureFlagNames(flags) {
48
+ var pairs = Object.entries(flags);
49
+ return pairs.filter(function (_ref) {
50
+ var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
51
+ _key = _ref2[0],
52
+ value = _ref2[1];
53
+
54
+ return !!value;
55
+ }).map(function (_ref3) {
56
+ var _ref4 = (0, _slicedToArray2.default)(_ref3, 1),
57
+ key = _ref4[0];
58
+
59
+ return key;
60
+ });
61
+ };
62
+ /**
63
+ * Takes a record of {Media Feature Flag Names → boolean} and a supported product name.
64
+ * Returns the corresponding product’s Launch Darkly Keys for each of the flags set as true in the input record.
65
+ * */
66
+
67
+
68
+ exports.filterFeatureFlagNames = filterFeatureFlagNames;
69
+
70
+ var mapAndFilterFeatureFlagNames = function mapAndFilterFeatureFlagNames(flags, product) {
71
+ var mediaFeatureFlags = filterFeatureFlagNames(flags);
72
+ return mediaFeatureFlags.map(function (key) {
73
+ return (0, _productKeys.getProductKeys)()[product][key];
74
+ });
75
+ }; // TODO(MEX-1547): This is temporary solution to just return the launch darkly feature flags for all products.
76
+
77
+ /**
78
+ * Takes a record of {Media Feature Flag Names → boolean}.
79
+ * Returns the Launch Darkly Keys from all products for each of the flags set as true in the input record.
80
+ * */
81
+
82
+
83
+ exports.mapAndFilterFeatureFlagNames = mapAndFilterFeatureFlagNames;
84
+
85
+ var filterFeatureFlagKeysAllProducts = function filterFeatureFlagKeysAllProducts(flags) {
86
+ var filteredFlags = filterFeatureFlagNames(flags);
87
+ var ldFeatureFlags = [];
88
+ filteredFlags.forEach(function (flag) {
89
+ return _types.supportedProducts.forEach(function (product) {
90
+ return ldFeatureFlags.push((0, _productKeys.getProductKeys)()[product][flag]);
91
+ });
92
+ });
93
+ return ldFeatureFlags.filter(function (flag) {
94
+ return flag !== '';
95
+ });
96
+ }; // default values defined here, not necessary for components to know directly as they should use the function below
97
+
98
+
99
+ exports.filterFeatureFlagKeysAllProducts = filterFeatureFlagKeysAllProducts;
19
100
  var defaultMediaFeatureFlags = {
20
101
  newCardExperience: false,
21
102
  captions: false,
@@ -23,8 +104,9 @@ var defaultMediaFeatureFlags = {
23
104
  // We can't yet switch this feature on
24
105
  // TODO https://product-fabric.atlassian.net/browse/MEX-104
25
106
  folderUploads: false,
107
+ observedWidth: false,
26
108
  timestampOnVideo: false,
27
- observedWidth: false
109
+ mediaUploadApiV2: true
28
110
  };
29
111
  /**
30
112
  * Public accessor from components to fallback to defaults if flags not passed,
@@ -66,31 +148,7 @@ Object.keys(defaultMediaFeatureFlags).forEach(function (flagName) {
66
148
  // eslint-disable-next-line no-console
67
149
  console.info("%c* LOCAL * MediaFeatureFlag.".concat(flagName, " = ").concat(localOverride), 'font-weight:bold;color:cyan');
68
150
  }
69
- }); // With this type we ensure the object will contain all the flags
70
-
71
- var areEqualFeatureFlags = function areEqualFeatureFlags(ffA, ffB) {
72
- if (!ffA && !ffB) {
73
- return true;
74
- }
75
-
76
- if (!ffA || !ffB) {
77
- return false;
78
- }
79
-
80
- var results = {
81
- newCardExperience: ffA.newCardExperience === ffB.newCardExperience,
82
- captions: ffA.captions === ffB.captions,
83
- mediaInline: ffA.mediaInline === ffB.mediaInline,
84
- folderUploads: ffA.folderUploads === ffB.folderUploads,
85
- timestampOnVideo: ffA.timestampOnVideo === ffB.timestampOnVideo,
86
- observedWidth: ffA.observedWidth === ffB.observedWidth
87
- };
88
- return Object.values(results).every(function (result) {
89
- return result;
90
- });
91
- };
92
-
93
- exports.areEqualFeatureFlags = areEqualFeatureFlags;
151
+ });
94
152
 
95
153
  var useMemoizeFeatureFlags = function useMemoizeFeatureFlags(featureFlags) {
96
154
  var ref = (0, _react.useRef)();
@@ -102,22 +160,4 @@ var useMemoizeFeatureFlags = function useMemoizeFeatureFlags(featureFlags) {
102
160
  return ref.current;
103
161
  };
104
162
 
105
- exports.useMemoizeFeatureFlags = useMemoizeFeatureFlags;
106
-
107
- var filterFeatureFlagNames = function filterFeatureFlagNames(flags) {
108
- var pairs = Object.entries(flags);
109
- return pairs.filter(function (_ref) {
110
- var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
111
- _key = _ref2[0],
112
- value = _ref2[1];
113
-
114
- return !!value;
115
- }).map(function (_ref3) {
116
- var _ref4 = (0, _slicedToArray2.default)(_ref3, 1),
117
- key = _ref4[0];
118
-
119
- return key;
120
- });
121
- };
122
-
123
- exports.filterFeatureFlagNames = filterFeatureFlagNames;
163
+ exports.useMemoizeFeatureFlags = useMemoizeFeatureFlags;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getProductKeys = void 0;
7
+ var productKeys = {
8
+ confluence: {
9
+ newCardExperience: 'confluence.frontend.media.cards.new.experience',
10
+ captions: 'confluence.frontend.fabric.editor.media.captions',
11
+ mediaInline: 'confluence.frontend.fabric.editor.media.inline',
12
+ folderUploads: 'confluence.frontend.media.picker.folder.uploads',
13
+ //TODO fill the value after https://product-fabric.atlassian.net/browse/MEX-1593
14
+ observedWidth: '',
15
+ // TODO https://product-fabric.atlassian.net/browse/MEX-1620
16
+ timestampOnVideo: '',
17
+ mediaUploadApiV2: 'confluence.enable.media.upload.api.v2'
18
+ },
19
+ jira: {
20
+ newCardExperience: 'issue.details.media-cards-new-experience',
21
+ captions: 'issue.details.editor.media.captions',
22
+ // Manged by Linking Platform. No Rollout plan found for Jira
23
+ mediaInline: '',
24
+ folderUploads: 'issue.details.media-picker-folder-upload',
25
+ //TODO fill the value after https://product-fabric.atlassian.net/browse/MEX-1593
26
+ observedWidth: '',
27
+ // TODO https://product-fabric.atlassian.net/browse/MEX-1620
28
+ timestampOnVideo: '',
29
+ mediaUploadApiV2: 'issue.details.enable-media-upload-api-version-2'
30
+ }
31
+ };
32
+
33
+ var getProductKeys = function getProductKeys() {
34
+ return productKeys;
35
+ };
36
+
37
+ exports.getProductKeys = getProductKeys;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.supportedProducts = void 0;
7
+ // Media feature flags - type and defaults defined here in one source of truth
8
+ // With this type we ensure the object will contain all the flags
9
+ var supportedProducts = ['confluence', 'jira'];
10
+ exports.supportedProducts = supportedProducts;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/media-common",
3
- "version": "2.12.1",
3
+ "version": "2.15.0",
4
4
  "sideEffects": false
5
5
  }
@@ -2,7 +2,7 @@ export { downloadUrl } from './downloadUrl'; // Warning! You can't add new media
2
2
  // See packages/media/media-core/src/__tests__/cache-backward-compatibility.spec.ts
3
3
 
4
4
  // Media Feature Flags
5
- export { getMediaFeatureFlag, defaultMediaFeatureFlags, areEqualFeatureFlags, useMemoizeFeatureFlags, filterFeatureFlagNames } from './mediaFeatureFlags';
5
+ export { getMediaFeatureFlag, defaultMediaFeatureFlags, areEqualFeatureFlags, useMemoizeFeatureFlags, filterFeatureFlagNames, filterFeatureFlagKeysAllProducts } from './mediaFeatureFlags';
6
6
  // Analytics context
7
7
  export { withMediaAnalyticsContext } from './analytics/withMediaAnalyticsContext'; // Analytics constants
8
8
 
@@ -0,0 +1 @@
1
+ export { getMediaFeatureFlag, useMemoizeFeatureFlags, defaultMediaFeatureFlags, areEqualFeatureFlags, filterFeatureFlagNames, filterFeatureFlagKeysAllProducts } from './mediaFeatureFlags';
@@ -1,7 +1,53 @@
1
1
  import { useRef } from 'react';
2
- import { getLocalMediaFeatureFlag } from './mediaFeatureFlag-local'; // Media feature flags - type and defaults defined here in one source of truth
2
+ import { getLocalMediaFeatureFlag } from '../mediaFeatureFlag-local';
3
+ import { supportedProducts } from './types';
4
+ import { getProductKeys } from './productKeys';
5
+ export const areEqualFeatureFlags = (ffA, ffB) => {
6
+ if (!ffA && !ffB) {
7
+ return true;
8
+ }
9
+
10
+ if (!ffA || !ffB) {
11
+ return false;
12
+ }
13
+
14
+ const results = {
15
+ newCardExperience: ffA.newCardExperience === ffB.newCardExperience,
16
+ captions: ffA.captions === ffB.captions,
17
+ mediaInline: ffA.mediaInline === ffB.mediaInline,
18
+ folderUploads: ffA.folderUploads === ffB.folderUploads,
19
+ observedWidth: ffA.observedWidth === ffB.observedWidth,
20
+ timestampOnVideo: ffA.timestampOnVideo === ffB.timestampOnVideo,
21
+ mediaUploadApiV2: ffA.mediaUploadApiV2 === ffB.mediaUploadApiV2
22
+ };
23
+ return Object.values(results).every(result => result);
24
+ };
25
+ export const filterFeatureFlagNames = flags => {
26
+ const pairs = Object.entries(flags);
27
+ return pairs.filter(([_key, value]) => !!value).map(([key]) => key);
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
+
34
+ export const mapAndFilterFeatureFlagNames = (flags, product) => {
35
+ const mediaFeatureFlags = filterFeatureFlagNames(flags);
36
+ return mediaFeatureFlags.map(key => getProductKeys()[product][key]);
37
+ }; // TODO(MEX-1547): This is temporary solution to just return the launch darkly feature flags for all products.
38
+
39
+ /**
40
+ * Takes a record of {Media Feature Flag Names → boolean}.
41
+ * Returns the Launch Darkly Keys from all products for each of the flags set as true in the input record.
42
+ * */
43
+
44
+ export const filterFeatureFlagKeysAllProducts = flags => {
45
+ const filteredFlags = filterFeatureFlagNames(flags);
46
+ const ldFeatureFlags = [];
47
+ filteredFlags.forEach(flag => supportedProducts.forEach(product => ldFeatureFlags.push(getProductKeys()[product][flag])));
48
+ return ldFeatureFlags.filter(flag => flag !== '');
49
+ }; // default values defined here, not necessary for components to know directly as they should use the function below
3
50
 
4
- // default values defined here, not necessary for components to know directly as they should use the function below
5
51
  export const defaultMediaFeatureFlags = {
6
52
  newCardExperience: false,
7
53
  captions: false,
@@ -9,8 +55,9 @@ export const defaultMediaFeatureFlags = {
9
55
  // We can't yet switch this feature on
10
56
  // TODO https://product-fabric.atlassian.net/browse/MEX-104
11
57
  folderUploads: false,
58
+ observedWidth: false,
12
59
  timestampOnVideo: false,
13
- observedWidth: false
60
+ mediaUploadApiV2: true
14
61
  };
15
62
  /**
16
63
  * Public accessor from components to fallback to defaults if flags not passed,
@@ -49,27 +96,7 @@ Object.keys(defaultMediaFeatureFlags).forEach(flagName => {
49
96
  // eslint-disable-next-line no-console
50
97
  console.info(`%c* LOCAL * MediaFeatureFlag.${flagName} = ${localOverride}`, 'font-weight:bold;color:cyan');
51
98
  }
52
- }); // With this type we ensure the object will contain all the flags
53
-
54
- export const areEqualFeatureFlags = (ffA, ffB) => {
55
- if (!ffA && !ffB) {
56
- return true;
57
- }
58
-
59
- if (!ffA || !ffB) {
60
- return false;
61
- }
62
-
63
- const results = {
64
- newCardExperience: ffA.newCardExperience === ffB.newCardExperience,
65
- captions: ffA.captions === ffB.captions,
66
- mediaInline: ffA.mediaInline === ffB.mediaInline,
67
- folderUploads: ffA.folderUploads === ffB.folderUploads,
68
- timestampOnVideo: ffA.timestampOnVideo === ffB.timestampOnVideo,
69
- observedWidth: ffA.observedWidth === ffB.observedWidth
70
- };
71
- return Object.values(results).every(result => result);
72
- };
99
+ });
73
100
  export const useMemoizeFeatureFlags = featureFlags => {
74
101
  const ref = useRef();
75
102
 
@@ -78,8 +105,4 @@ export const useMemoizeFeatureFlags = featureFlags => {
78
105
  }
79
106
 
80
107
  return ref.current;
81
- };
82
- export const filterFeatureFlagNames = flags => {
83
- const pairs = Object.entries(flags);
84
- return pairs.filter(([_key, value]) => !!value).map(([key]) => key);
85
108
  };
@@ -0,0 +1,26 @@
1
+ const productKeys = {
2
+ confluence: {
3
+ newCardExperience: 'confluence.frontend.media.cards.new.experience',
4
+ captions: 'confluence.frontend.fabric.editor.media.captions',
5
+ mediaInline: 'confluence.frontend.fabric.editor.media.inline',
6
+ folderUploads: 'confluence.frontend.media.picker.folder.uploads',
7
+ //TODO fill the value after https://product-fabric.atlassian.net/browse/MEX-1593
8
+ observedWidth: '',
9
+ // TODO https://product-fabric.atlassian.net/browse/MEX-1620
10
+ timestampOnVideo: '',
11
+ mediaUploadApiV2: 'confluence.enable.media.upload.api.v2'
12
+ },
13
+ jira: {
14
+ newCardExperience: 'issue.details.media-cards-new-experience',
15
+ captions: 'issue.details.editor.media.captions',
16
+ // Manged by Linking Platform. No Rollout plan found for Jira
17
+ mediaInline: '',
18
+ folderUploads: 'issue.details.media-picker-folder-upload',
19
+ //TODO fill the value after https://product-fabric.atlassian.net/browse/MEX-1593
20
+ observedWidth: '',
21
+ // TODO https://product-fabric.atlassian.net/browse/MEX-1620
22
+ timestampOnVideo: '',
23
+ mediaUploadApiV2: 'issue.details.enable-media-upload-api-version-2'
24
+ }
25
+ };
26
+ export const getProductKeys = () => productKeys;
@@ -0,0 +1,3 @@
1
+ // Media feature flags - type and defaults defined here in one source of truth
2
+ // With this type we ensure the object will contain all the flags
3
+ export const supportedProducts = ['confluence', 'jira'];
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/media-common",
3
- "version": "2.12.1",
3
+ "version": "2.15.0",
4
4
  "sideEffects": false
5
5
  }
package/dist/esm/index.js CHANGED
@@ -2,7 +2,7 @@ export { downloadUrl } from './downloadUrl'; // Warning! You can't add new media
2
2
  // See packages/media/media-core/src/__tests__/cache-backward-compatibility.spec.ts
3
3
 
4
4
  // Media Feature Flags
5
- export { getMediaFeatureFlag, defaultMediaFeatureFlags, areEqualFeatureFlags, useMemoizeFeatureFlags, filterFeatureFlagNames } from './mediaFeatureFlags';
5
+ export { getMediaFeatureFlag, defaultMediaFeatureFlags, areEqualFeatureFlags, useMemoizeFeatureFlags, filterFeatureFlagNames, filterFeatureFlagKeysAllProducts } from './mediaFeatureFlags';
6
6
  // Analytics context
7
7
  export { withMediaAnalyticsContext } from './analytics/withMediaAnalyticsContext'; // Analytics constants
8
8
 
@@ -0,0 +1 @@
1
+ export { getMediaFeatureFlag, useMemoizeFeatureFlags, defaultMediaFeatureFlags, areEqualFeatureFlags, filterFeatureFlagNames, filterFeatureFlagKeysAllProducts } from './mediaFeatureFlags';
@@ -1,8 +1,75 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
2
  import { useRef } from 'react';
3
- import { getLocalMediaFeatureFlag } from './mediaFeatureFlag-local'; // Media feature flags - type and defaults defined here in one source of truth
3
+ import { getLocalMediaFeatureFlag } from '../mediaFeatureFlag-local';
4
+ import { supportedProducts } from './types';
5
+ import { getProductKeys } from './productKeys';
6
+ export var areEqualFeatureFlags = function areEqualFeatureFlags(ffA, ffB) {
7
+ if (!ffA && !ffB) {
8
+ return true;
9
+ }
10
+
11
+ if (!ffA || !ffB) {
12
+ return false;
13
+ }
14
+
15
+ var results = {
16
+ newCardExperience: ffA.newCardExperience === ffB.newCardExperience,
17
+ captions: ffA.captions === ffB.captions,
18
+ mediaInline: ffA.mediaInline === ffB.mediaInline,
19
+ folderUploads: ffA.folderUploads === ffB.folderUploads,
20
+ observedWidth: ffA.observedWidth === ffB.observedWidth,
21
+ timestampOnVideo: ffA.timestampOnVideo === ffB.timestampOnVideo,
22
+ mediaUploadApiV2: ffA.mediaUploadApiV2 === ffB.mediaUploadApiV2
23
+ };
24
+ return Object.values(results).every(function (result) {
25
+ return result;
26
+ });
27
+ };
28
+ export var filterFeatureFlagNames = function filterFeatureFlagNames(flags) {
29
+ var pairs = Object.entries(flags);
30
+ return pairs.filter(function (_ref) {
31
+ var _ref2 = _slicedToArray(_ref, 2),
32
+ _key = _ref2[0],
33
+ value = _ref2[1];
34
+
35
+ return !!value;
36
+ }).map(function (_ref3) {
37
+ var _ref4 = _slicedToArray(_ref3, 1),
38
+ key = _ref4[0];
39
+
40
+ return key;
41
+ });
42
+ };
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
+
48
+ export var mapAndFilterFeatureFlagNames = function mapAndFilterFeatureFlagNames(flags, product) {
49
+ var mediaFeatureFlags = filterFeatureFlagNames(flags);
50
+ return mediaFeatureFlags.map(function (key) {
51
+ return getProductKeys()[product][key];
52
+ });
53
+ }; // TODO(MEX-1547): This is temporary solution to just return the launch darkly feature flags for all products.
54
+
55
+ /**
56
+ * Takes a record of {Media Feature Flag Names → boolean}.
57
+ * Returns the Launch Darkly Keys from all products for each of the flags set as true in the input record.
58
+ * */
59
+
60
+ export var filterFeatureFlagKeysAllProducts = function filterFeatureFlagKeysAllProducts(flags) {
61
+ var filteredFlags = filterFeatureFlagNames(flags);
62
+ var ldFeatureFlags = [];
63
+ filteredFlags.forEach(function (flag) {
64
+ return supportedProducts.forEach(function (product) {
65
+ return ldFeatureFlags.push(getProductKeys()[product][flag]);
66
+ });
67
+ });
68
+ return ldFeatureFlags.filter(function (flag) {
69
+ return flag !== '';
70
+ });
71
+ }; // default values defined here, not necessary for components to know directly as they should use the function below
4
72
 
5
- // default values defined here, not necessary for components to know directly as they should use the function below
6
73
  export var defaultMediaFeatureFlags = {
7
74
  newCardExperience: false,
8
75
  captions: false,
@@ -10,8 +77,9 @@ export var defaultMediaFeatureFlags = {
10
77
  // We can't yet switch this feature on
11
78
  // TODO https://product-fabric.atlassian.net/browse/MEX-104
12
79
  folderUploads: false,
80
+ observedWidth: false,
13
81
  timestampOnVideo: false,
14
- observedWidth: false
82
+ mediaUploadApiV2: true
15
83
  };
16
84
  /**
17
85
  * Public accessor from components to fallback to defaults if flags not passed,
@@ -50,29 +118,7 @@ Object.keys(defaultMediaFeatureFlags).forEach(function (flagName) {
50
118
  // eslint-disable-next-line no-console
51
119
  console.info("%c* LOCAL * MediaFeatureFlag.".concat(flagName, " = ").concat(localOverride), 'font-weight:bold;color:cyan');
52
120
  }
53
- }); // With this type we ensure the object will contain all the flags
54
-
55
- export var areEqualFeatureFlags = function areEqualFeatureFlags(ffA, ffB) {
56
- if (!ffA && !ffB) {
57
- return true;
58
- }
59
-
60
- if (!ffA || !ffB) {
61
- return false;
62
- }
63
-
64
- var results = {
65
- newCardExperience: ffA.newCardExperience === ffB.newCardExperience,
66
- captions: ffA.captions === ffB.captions,
67
- mediaInline: ffA.mediaInline === ffB.mediaInline,
68
- folderUploads: ffA.folderUploads === ffB.folderUploads,
69
- timestampOnVideo: ffA.timestampOnVideo === ffB.timestampOnVideo,
70
- observedWidth: ffA.observedWidth === ffB.observedWidth
71
- };
72
- return Object.values(results).every(function (result) {
73
- return result;
74
- });
75
- };
121
+ });
76
122
  export var useMemoizeFeatureFlags = function useMemoizeFeatureFlags(featureFlags) {
77
123
  var ref = useRef();
78
124
 
@@ -81,19 +127,4 @@ export var useMemoizeFeatureFlags = function useMemoizeFeatureFlags(featureFlags
81
127
  }
82
128
 
83
129
  return ref.current;
84
- };
85
- export var filterFeatureFlagNames = function filterFeatureFlagNames(flags) {
86
- var pairs = Object.entries(flags);
87
- return pairs.filter(function (_ref) {
88
- var _ref2 = _slicedToArray(_ref, 2),
89
- _key = _ref2[0],
90
- value = _ref2[1];
91
-
92
- return !!value;
93
- }).map(function (_ref3) {
94
- var _ref4 = _slicedToArray(_ref3, 1),
95
- key = _ref4[0];
96
-
97
- return key;
98
- });
99
130
  };
@@ -0,0 +1,28 @@
1
+ var productKeys = {
2
+ confluence: {
3
+ newCardExperience: 'confluence.frontend.media.cards.new.experience',
4
+ captions: 'confluence.frontend.fabric.editor.media.captions',
5
+ mediaInline: 'confluence.frontend.fabric.editor.media.inline',
6
+ folderUploads: 'confluence.frontend.media.picker.folder.uploads',
7
+ //TODO fill the value after https://product-fabric.atlassian.net/browse/MEX-1593
8
+ observedWidth: '',
9
+ // TODO https://product-fabric.atlassian.net/browse/MEX-1620
10
+ timestampOnVideo: '',
11
+ mediaUploadApiV2: 'confluence.enable.media.upload.api.v2'
12
+ },
13
+ jira: {
14
+ newCardExperience: 'issue.details.media-cards-new-experience',
15
+ captions: 'issue.details.editor.media.captions',
16
+ // Manged by Linking Platform. No Rollout plan found for Jira
17
+ mediaInline: '',
18
+ folderUploads: 'issue.details.media-picker-folder-upload',
19
+ //TODO fill the value after https://product-fabric.atlassian.net/browse/MEX-1593
20
+ observedWidth: '',
21
+ // TODO https://product-fabric.atlassian.net/browse/MEX-1620
22
+ timestampOnVideo: '',
23
+ mediaUploadApiV2: 'issue.details.enable-media-upload-api-version-2'
24
+ }
25
+ };
26
+ export var getProductKeys = function getProductKeys() {
27
+ return productKeys;
28
+ };
@@ -0,0 +1,3 @@
1
+ // Media feature flags - type and defaults defined here in one source of truth
2
+ // With this type we ensure the object will contain all the flags
3
+ export var supportedProducts = ['confluence', 'jira'];
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/media-common",
3
- "version": "2.12.1",
3
+ "version": "2.15.0",
4
4
  "sideEffects": false
5
5
  }
@@ -1,8 +1,8 @@
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, } from './mediaFeatureFlags';
5
- export type { MediaFeatureFlags, WithMediaFeatureFlags, RequiredMediaFeatureFlags, } from './mediaFeatureFlags';
4
+ export { getMediaFeatureFlag, defaultMediaFeatureFlags, areEqualFeatureFlags, useMemoizeFeatureFlags, filterFeatureFlagNames, filterFeatureFlagKeysAllProducts, } from './mediaFeatureFlags';
5
+ export type { MediaFeatureFlags, WithMediaFeatureFlags, } from './mediaFeatureFlags';
6
6
  export interface NumericalCardDimensions {
7
7
  width: number;
8
8
  height: number;
@@ -0,0 +1,2 @@
1
+ export { getMediaFeatureFlag, useMemoizeFeatureFlags, defaultMediaFeatureFlags, areEqualFeatureFlags, filterFeatureFlagNames, filterFeatureFlagKeysAllProducts, } from './mediaFeatureFlags';
2
+ export type { MediaFeatureFlags, WithMediaFeatureFlags, SupportedProduct, } from './types';
@@ -1,14 +1,16 @@
1
- export interface MediaFeatureFlags {
2
- newCardExperience?: boolean;
3
- captions?: boolean;
4
- mediaInline?: boolean;
5
- folderUploads?: boolean;
6
- timestampOnVideo?: boolean;
7
- observedWidth?: boolean;
8
- }
9
- export interface WithMediaFeatureFlags {
10
- featureFlags?: MediaFeatureFlags;
11
- }
1
+ import { RequiredMediaFeatureFlags, MediaFeatureFlags, SupportedProduct } from './types';
2
+ export declare const areEqualFeatureFlags: (ffA?: MediaFeatureFlags | undefined, ffB?: MediaFeatureFlags | undefined) => boolean;
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
+ /**
10
+ * Takes a record of {Media Feature Flag Names → boolean}.
11
+ * Returns the Launch Darkly Keys from all products for each of the flags set as true in the input record.
12
+ * */
13
+ export declare const filterFeatureFlagKeysAllProducts: (flags: RequiredMediaFeatureFlags) => Array<string>;
12
14
  export declare const defaultMediaFeatureFlags: Required<MediaFeatureFlags>;
13
15
  /**
14
16
  * Public accessor from components to fallback to defaults if flags not passed,
@@ -21,7 +23,4 @@ export declare const defaultMediaFeatureFlags: Required<MediaFeatureFlags>;
21
23
  * (you will see a warning in console if override used)
22
24
  * */
23
25
  export declare function getMediaFeatureFlag<T = boolean>(flagName: keyof MediaFeatureFlags, featureFlags?: MediaFeatureFlags): T;
24
- export declare type RequiredMediaFeatureFlags = Record<keyof Required<MediaFeatureFlags>, boolean>;
25
- export declare const areEqualFeatureFlags: (ffA?: MediaFeatureFlags | undefined, ffB?: MediaFeatureFlags | undefined) => boolean;
26
26
  export declare const useMemoizeFeatureFlags: (featureFlags?: MediaFeatureFlags | undefined) => MediaFeatureFlags | undefined;
27
- export declare const filterFeatureFlagNames: (flags: RequiredMediaFeatureFlags) => Array<keyof MediaFeatureFlags>;
@@ -0,0 +1,2 @@
1
+ import { ProductKeys } from './types';
2
+ export declare const getProductKeys: () => ProductKeys;
@@ -0,0 +1,17 @@
1
+ export interface MediaFeatureFlags {
2
+ newCardExperience?: boolean;
3
+ captions?: boolean;
4
+ mediaInline?: boolean;
5
+ folderUploads?: boolean;
6
+ observedWidth?: boolean;
7
+ timestampOnVideo?: boolean;
8
+ mediaUploadApiV2?: boolean;
9
+ }
10
+ export interface WithMediaFeatureFlags {
11
+ featureFlags?: MediaFeatureFlags;
12
+ }
13
+ export declare type RequiredMediaFeatureFlags = Record<keyof Required<MediaFeatureFlags>, boolean>;
14
+ export declare type MediaFeatureFlagsMap = Record<keyof Required<MediaFeatureFlags>, string>;
15
+ export declare const supportedProducts: readonly ["confluence", "jira"];
16
+ export declare type SupportedProduct = typeof supportedProducts[number];
17
+ export declare type ProductKeys = Record<SupportedProduct, MediaFeatureFlagsMap>;
@@ -3,5 +3,6 @@
3
3
  "main": "../dist/cjs/downloadUrl.js",
4
4
  "module": "../dist/esm/downloadUrl.js",
5
5
  "module:es2019": "../dist/es2019/downloadUrl.js",
6
+ "sideEffects": false,
6
7
  "types": "../dist/types/downloadUrl.d.ts"
7
8
  }
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@atlaskit/media-common/mediaFeatureFlags",
3
- "main": "../dist/cjs/mediaFeatureFlags.js",
4
- "module": "../dist/esm/mediaFeatureFlags.js",
5
- "module:es2019": "../dist/es2019/mediaFeatureFlags.js",
6
- "types": "../dist/types/mediaFeatureFlags.d.ts"
3
+ "main": "../dist/cjs/mediaFeatureFlags/index.js",
4
+ "module": "../dist/esm/mediaFeatureFlags/index.js",
5
+ "module:es2019": "../dist/es2019/mediaFeatureFlags/index.js",
6
+ "sideEffects": false,
7
+ "types": "../dist/types/mediaFeatureFlags/index.d.ts"
7
8
  }
@@ -3,5 +3,6 @@
3
3
  "main": "../dist/cjs/mediaTypeUtils/index.js",
4
4
  "module": "../dist/esm/mediaTypeUtils/index.js",
5
5
  "module:es2019": "../dist/es2019/mediaTypeUtils/index.js",
6
+ "sideEffects": false,
6
7
  "types": "../dist/types/mediaTypeUtils/index.d.ts"
7
8
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/media-common",
3
- "version": "2.12.1",
3
+ "version": "2.15.0",
4
4
  "description": "Includes common utilities used by other media packages",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -16,7 +16,7 @@
16
16
  "atlaskit:src": "src/index.ts",
17
17
  "af:exports": {
18
18
  "./downloadUrl": "./src/downloadUrl.ts",
19
- "./mediaFeatureFlags": "./src/mediaFeatureFlags.ts",
19
+ "./mediaFeatureFlags": "./src/mediaFeatureFlags/index.ts",
20
20
  "./analytics": "./src/analytics/index.ts",
21
21
  "./docs": "./src/docs/index.ts",
22
22
  "./mediaTypeUtils": "./src/mediaTypeUtils/index.ts",
@@ -44,7 +44,7 @@
44
44
  },
45
45
  "devDependencies": {
46
46
  "@atlaskit/docs": "*",
47
- "@atlaskit/media-test-helpers": "^29.4.0",
47
+ "@atlaskit/media-test-helpers": "^30.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",