@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 +11 -0
- package/dist/cjs/analytics/withMediaAnalyticsContext.js +2 -12
- package/dist/cjs/index.js +4 -4
- package/dist/cjs/mediaFeatureFlags/genericFeatureFlag.js +38 -0
- package/dist/cjs/mediaFeatureFlags/index.js +4 -4
- package/dist/cjs/mediaFeatureFlags/mediaFeatureFlags.js +11 -33
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/analytics/withMediaAnalyticsContext.js +3 -13
- package/dist/es2019/index.js +1 -1
- package/dist/es2019/mediaFeatureFlags/genericFeatureFlag.js +33 -0
- package/dist/es2019/mediaFeatureFlags/index.js +1 -1
- package/dist/es2019/mediaFeatureFlags/mediaFeatureFlags.js +8 -24
- package/dist/es2019/version.json +1 -1
- package/dist/esm/analytics/withMediaAnalyticsContext.js +2 -12
- package/dist/esm/index.js +1 -1
- package/dist/esm/mediaFeatureFlags/genericFeatureFlag.js +33 -0
- package/dist/esm/mediaFeatureFlags/index.js +1 -1
- package/dist/esm/mediaFeatureFlags/mediaFeatureFlags.js +7 -28
- package/dist/esm/version.json +1 -1
- package/dist/types/analytics/withMediaAnalyticsContext.d.ts +1 -4
- package/dist/types/index.d.ts +1 -1
- package/dist/types/mediaFeatureFlags/genericFeatureFlag.d.ts +7 -0
- package/dist/types/mediaFeatureFlags/index.d.ts +1 -1
- package/dist/types/mediaFeatureFlags/mediaFeatureFlags.d.ts +2 -7
- package/package.json +2 -2
- package/report.api.md +3 -8
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:
|
|
37
|
+
featureFlags: featureFlags
|
|
48
38
|
};
|
|
49
39
|
return _objectSpread(_objectSpread({}, contextPublicAttributes), {}, (0, _defineProperty2.default)({}, _MediaAnalyticsContext.MEDIA_CONTEXT, _objectSpread({}, contextPrivateAttributes)));
|
|
50
|
-
}, [
|
|
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, "
|
|
36
|
+
Object.defineProperty(exports, "filterFeatureFlagNames", {
|
|
37
37
|
enumerable: true,
|
|
38
38
|
get: function get() {
|
|
39
|
-
return _mediaFeatureFlags.
|
|
39
|
+
return _mediaFeatureFlags.filterFeatureFlagNames;
|
|
40
40
|
}
|
|
41
41
|
});
|
|
42
|
-
Object.defineProperty(exports, "
|
|
42
|
+
Object.defineProperty(exports, "getFeatureFlagKeysAllProducts", {
|
|
43
43
|
enumerable: true,
|
|
44
44
|
get: function get() {
|
|
45
|
-
return _mediaFeatureFlags.
|
|
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, "
|
|
18
|
+
Object.defineProperty(exports, "filterFeatureFlagNames", {
|
|
19
19
|
enumerable: true,
|
|
20
20
|
get: function get() {
|
|
21
|
-
return _mediaFeatureFlags.
|
|
21
|
+
return _mediaFeatureFlags.filterFeatureFlagNames;
|
|
22
22
|
}
|
|
23
23
|
});
|
|
24
|
-
Object.defineProperty(exports, "
|
|
24
|
+
Object.defineProperty(exports, "getFeatureFlagKeysAllProducts", {
|
|
25
25
|
enumerable: true,
|
|
26
26
|
get: function get() {
|
|
27
|
-
return _mediaFeatureFlags.
|
|
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.
|
|
7
|
+
exports.getFeatureFlagKeysAllProducts = exports.filterFeatureFlagNames = exports.defaultMediaFeatureFlags = exports.areEqualFeatureFlags = void 0;
|
|
8
8
|
exports.getMediaFeatureFlag = getMediaFeatureFlag;
|
|
9
|
-
exports.useMemoizeFeatureFlags =
|
|
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.
|
|
69
|
-
var
|
|
70
|
-
var
|
|
57
|
+
exports.filterFeatureFlagNames = filterFeatureFlagNames;
|
|
58
|
+
var getFeatureFlagKeysAllProducts = function getFeatureFlagKeysAllProducts() {
|
|
59
|
+
var productKeys = (0, _productKeys.getProductKeys)();
|
|
71
60
|
var ldFeatureFlags = [];
|
|
72
|
-
|
|
73
|
-
|
|
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.
|
|
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
|
-
|
|
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)();
|
package/dist/cjs/version.json
CHANGED
|
@@ -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 =
|
|
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
|
|
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
|
-
}, [
|
|
33
|
+
}, [featureFlags]);
|
|
44
34
|
return /*#__PURE__*/React.createElement(AnalyticsContext, {
|
|
45
35
|
data: contextData
|
|
46
36
|
}, /*#__PURE__*/React.createElement(WrappedComponent, _extends({}, props, {
|
package/dist/es2019/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,
|
|
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,
|
|
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
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
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();
|
package/dist/es2019/version.json
CHANGED
|
@@ -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:
|
|
27
|
+
featureFlags: featureFlags
|
|
38
28
|
};
|
|
39
29
|
return _objectSpread(_objectSpread({}, contextPublicAttributes), {}, _defineProperty({}, MEDIA_CONTEXT, _objectSpread({}, contextPrivateAttributes)));
|
|
40
|
-
}, [
|
|
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,
|
|
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,
|
|
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
|
|
58
|
-
var
|
|
47
|
+
export var getFeatureFlagKeysAllProducts = function getFeatureFlagKeysAllProducts() {
|
|
48
|
+
var productKeys = getProductKeys();
|
|
59
49
|
var ldFeatureFlags = [];
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
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();
|
package/dist/esm/version.json
CHANGED
|
@@ -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,
|
|
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>>;
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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,
|
|
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,
|
|
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
|
|
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
|
|
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
|
+
"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": "^
|
|
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>,
|