@webex/internal-plugin-feature 3.0.0-beta.9 → 3.0.0-bnr.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/README.md +1 -3
- package/dist/config.js +0 -3
- package/dist/config.js.map +1 -1
- package/dist/feature.js +3 -29
- package/dist/feature.js.map +1 -1
- package/dist/index.js +1 -8
- package/dist/index.js.map +1 -1
- package/dist/internal-plugin-feature.d.ts +4 -0
- package/dist/tsdoc-metadata.json +11 -0
- package/dist/types/config.d.ts +4 -0
- package/dist/types/feature.d.ts +2 -0
- package/dist/types/index.d.ts +1 -0
- package/package.json +9 -9
- package/src/config.js +1 -1
- package/src/feature.js +37 -19
- package/src/index.js +1 -1
- package/test/integration/spec/feature.js +65 -51
- package/test/unit/spec/feature.js +38 -37
package/README.md
CHANGED
|
@@ -21,14 +21,12 @@ npm install --save @webex/internal-plugin-feature
|
|
|
21
21
|
## Usage
|
|
22
22
|
|
|
23
23
|
```js
|
|
24
|
-
|
|
25
24
|
import '@webex/internal-plugin-feature';
|
|
26
25
|
|
|
27
26
|
import WebexCore from '@webex/webex-core';
|
|
28
27
|
|
|
29
28
|
const webex = new WebexCore();
|
|
30
|
-
webex.internal.feature.WHATEVER
|
|
31
|
-
|
|
29
|
+
webex.internal.feature.WHATEVER;
|
|
32
30
|
```
|
|
33
31
|
|
|
34
32
|
## Maintainers
|
package/dist/config.js
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
4
|
-
|
|
5
4
|
_Object$defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
|
-
|
|
9
7
|
exports.default = void 0;
|
|
10
|
-
|
|
11
8
|
/*!
|
|
12
9
|
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
13
10
|
*/
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["feature"],"sources":["config.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nexport default {\n feature: {}
|
|
1
|
+
{"version":3,"names":["feature"],"sources":["config.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nexport default {\n feature: {},\n};\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AAFA,eAIe;EACbA,OAAO,EAAE,CAAC;AACZ,CAAC;AAAA"}
|
package/dist/feature.js
CHANGED
|
@@ -1,31 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
4
|
-
|
|
5
4
|
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
6
|
-
|
|
7
5
|
_Object$defineProperty(exports, "__esModule", {
|
|
8
6
|
value: true
|
|
9
7
|
});
|
|
10
|
-
|
|
11
8
|
exports.default = void 0;
|
|
12
|
-
|
|
13
9
|
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
|
|
14
|
-
|
|
15
10
|
var _apply = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/reflect/apply"));
|
|
16
|
-
|
|
17
11
|
var _partition2 = _interopRequireDefault(require("lodash/partition"));
|
|
18
|
-
|
|
19
12
|
require("@webex/internal-plugin-device");
|
|
20
|
-
|
|
21
13
|
var _webexCore = require("@webex/webex-core");
|
|
22
|
-
|
|
23
14
|
/*!
|
|
24
15
|
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
25
16
|
*/
|
|
17
|
+
|
|
26
18
|
var Feature = _webexCore.WebexPlugin.extend({
|
|
27
19
|
namespace: 'Feature',
|
|
28
|
-
|
|
29
20
|
/**
|
|
30
21
|
* Returns the value of the requested feature toggle.
|
|
31
22
|
* @param {string} keyType <developer|user|entitlement>
|
|
@@ -38,21 +29,16 @@ var Feature = _webexCore.WebexPlugin.extend({
|
|
|
38
29
|
if (keyType !== 'developer' && keyType !== 'user' && keyType !== 'entitlement') {
|
|
39
30
|
return _promise.default.reject(new Error('Invalid feature keyType provided. Only `developer`, `user`, and `entitlement` feature toggles are permitted.'));
|
|
40
31
|
}
|
|
41
|
-
|
|
42
32
|
options = options || {};
|
|
43
33
|
var feature = this.webex.internal.device.features[keyType].get(key);
|
|
44
|
-
|
|
45
34
|
if (!feature) {
|
|
46
35
|
return _promise.default.resolve(null);
|
|
47
36
|
}
|
|
48
|
-
|
|
49
37
|
if (options.full) {
|
|
50
38
|
return _promise.default.resolve(feature.serialize());
|
|
51
39
|
}
|
|
52
|
-
|
|
53
40
|
return _promise.default.resolve(feature.value);
|
|
54
41
|
},
|
|
55
|
-
|
|
56
42
|
/**
|
|
57
43
|
* Handles a feature toggle update from the server.
|
|
58
44
|
* @param {Object} envelope
|
|
@@ -62,7 +48,6 @@ var Feature = _webexCore.WebexPlugin.extend({
|
|
|
62
48
|
if (envelope && envelope.data) {
|
|
63
49
|
var feature = envelope.data.featureToggle;
|
|
64
50
|
var keyType = feature.type.toLowerCase();
|
|
65
|
-
|
|
66
51
|
if (keyType === 'user' || keyType === 'developer') {
|
|
67
52
|
this.webex.internal.device.features[keyType].add([feature], {
|
|
68
53
|
merge: true
|
|
@@ -70,7 +55,6 @@ var Feature = _webexCore.WebexPlugin.extend({
|
|
|
70
55
|
}
|
|
71
56
|
}
|
|
72
57
|
},
|
|
73
|
-
|
|
74
58
|
/**
|
|
75
59
|
* Register to listen for incoming feature events
|
|
76
60
|
* @instance
|
|
@@ -79,7 +63,6 @@ var Feature = _webexCore.WebexPlugin.extend({
|
|
|
79
63
|
listen: function listen() {
|
|
80
64
|
this.listenTo(this.webex.internal.mercury, 'event:featureToggle_update', this.handleFeatureUpdate);
|
|
81
65
|
},
|
|
82
|
-
|
|
83
66
|
/**
|
|
84
67
|
* Issues request to server to set a value for a feature toggle.
|
|
85
68
|
* @param {string} keyType <developer|user>
|
|
@@ -89,12 +72,10 @@ var Feature = _webexCore.WebexPlugin.extend({
|
|
|
89
72
|
*/
|
|
90
73
|
setFeature: function setFeature(keyType, key, value) {
|
|
91
74
|
var _this = this;
|
|
92
|
-
|
|
93
75
|
// Limit only to developer feature toggles for now.
|
|
94
76
|
if (keyType !== 'developer' && keyType !== 'user') {
|
|
95
77
|
return _promise.default.reject(new Error('Only `developer` and `user` feature toggles can be set.'));
|
|
96
78
|
}
|
|
97
|
-
|
|
98
79
|
return this.request({
|
|
99
80
|
method: 'POST',
|
|
100
81
|
api: 'feature',
|
|
@@ -110,18 +91,15 @@ var Feature = _webexCore.WebexPlugin.extend({
|
|
|
110
91
|
});
|
|
111
92
|
});
|
|
112
93
|
},
|
|
113
|
-
|
|
114
94
|
/**
|
|
115
95
|
* Issues request to server to set a value for a feature toggle.
|
|
116
|
-
* @param {array} featureList
|
|
96
|
+
* @param {array} featureList - in the form of `Array<{ type: 'USER' | 'DEV', key: string, val: any }>`
|
|
117
97
|
* @returns {Promise} Refreshes the local device and resolves with the features endpoint`s response.
|
|
118
98
|
*/
|
|
119
99
|
setBundledFeatures: function setBundledFeatures(featureList) {
|
|
120
100
|
var _this2 = this;
|
|
121
|
-
|
|
122
101
|
featureList.forEach(function (item) {
|
|
123
102
|
item.mutable = item.mutable || 'true';
|
|
124
|
-
|
|
125
103
|
if (item.type !== 'USER' && item.type !== 'DEV') {
|
|
126
104
|
item.type = 'USER';
|
|
127
105
|
}
|
|
@@ -135,11 +113,9 @@ var Feature = _webexCore.WebexPlugin.extend({
|
|
|
135
113
|
var partitionedToggles = (0, _partition2.default)(res.body.featureToggles, {
|
|
136
114
|
type: 'USER'
|
|
137
115
|
});
|
|
138
|
-
|
|
139
116
|
_this2.webex.internal.device.features.user.add(partitionedToggles[0], {
|
|
140
117
|
merge: true
|
|
141
118
|
});
|
|
142
|
-
|
|
143
119
|
_this2.webex.internal.device.features.developer.add(partitionedToggles[1], {
|
|
144
120
|
merge: true
|
|
145
121
|
});
|
|
@@ -149,15 +125,13 @@ var Feature = _webexCore.WebexPlugin.extend({
|
|
|
149
125
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
150
126
|
args[_key] = arguments[_key];
|
|
151
127
|
}
|
|
152
|
-
|
|
153
128
|
(0, _apply.default)(_webexCore.WebexPlugin.prototype.initialize, this, args);
|
|
154
129
|
this.listenToAndRun(this.webex, 'change:internal.device.features.developer', this.trigger.bind(this, 'change:developer'));
|
|
155
130
|
this.listenToAndRun(this.webex, 'change:internal.device.features.entitlement', this.trigger.bind(this, 'change:entitlement'));
|
|
156
131
|
this.listenToAndRun(this.webex, 'change:internal.device.features.user', this.trigger.bind(this, 'change:user'));
|
|
157
132
|
},
|
|
158
|
-
version: "3.0.0-
|
|
133
|
+
version: "3.0.0-bnr.0"
|
|
159
134
|
});
|
|
160
|
-
|
|
161
135
|
var _default = Feature;
|
|
162
136
|
exports.default = _default;
|
|
163
137
|
//# sourceMappingURL=feature.js.map
|
package/dist/feature.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Feature","WebexPlugin","extend","namespace","getFeature","keyType","key","options","reject","Error","feature","webex","internal","device","features","get","resolve","full","serialize","value","handleFeatureUpdate","envelope","data","featureToggle","type","toLowerCase","add","merge","listen","listenTo","mercury","setFeature","request","method","api","resource","userId","body","mutable","val","then","res","setBundledFeatures","featureList","forEach","item","partitionedToggles","featureToggles","user","developer","initialize","args","prototype","listenToAndRun","trigger","bind"],"sources":["feature.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport '@webex/internal-plugin-device';\nimport {partition} from 'lodash';\nimport {WebexPlugin} from '@webex/webex-core';\n\nconst Feature = WebexPlugin.extend({\n namespace: 'Feature',\n\n /**\n * Returns the value of the requested feature toggle.\n * @param {string} keyType <developer|user|entitlement>\n * @param {string} key\n * @param {Object} options\n * @param {boolean} options.full to get full feature record including metadata.\n * @returns {string|boolean|number|FeatureModel|null}\n */\n getFeature(keyType, key, options) {\n if (keyType !== 'developer' && keyType !== 'user' && keyType !== 'entitlement') {\n return Promise.reject(new Error('Invalid feature keyType provided. Only `developer`, `user`, and `entitlement` feature toggles are permitted.'));\n }\n\n options = options || {};\n\n const feature = this.webex.internal.device.features[keyType].get(key);\n\n if (!feature) {\n return Promise.resolve(null);\n }\n\n if (options.full) {\n return Promise.resolve(feature.serialize());\n }\n\n return Promise.resolve(feature.value);\n },\n\n /**\n * Handles a feature toggle update from the server.\n * @param {Object} envelope\n * @returns {undefined}\n */\n handleFeatureUpdate(envelope) {\n if (envelope && envelope.data) {\n const feature = envelope.data.featureToggle;\n const keyType = feature.type.toLowerCase();\n\n if (keyType === 'user' || keyType === 'developer') {\n this.webex.internal.device.features[keyType].add([feature], {merge: true});\n }\n }\n },\n\n /**\n * Register to listen for incoming feature events\n * @instance\n * @returns {undefined}\n */\n listen() {\n this.listenTo(this.webex.internal.mercury
|
|
1
|
+
{"version":3,"names":["Feature","WebexPlugin","extend","namespace","getFeature","keyType","key","options","reject","Error","feature","webex","internal","device","features","get","resolve","full","serialize","value","handleFeatureUpdate","envelope","data","featureToggle","type","toLowerCase","add","merge","listen","listenTo","mercury","setFeature","request","method","api","resource","userId","body","mutable","val","then","res","setBundledFeatures","featureList","forEach","item","partitionedToggles","featureToggles","user","developer","initialize","args","prototype","listenToAndRun","trigger","bind"],"sources":["feature.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport '@webex/internal-plugin-device';\nimport {partition} from 'lodash';\nimport {WebexPlugin} from '@webex/webex-core';\n\nconst Feature = WebexPlugin.extend({\n namespace: 'Feature',\n\n /**\n * Returns the value of the requested feature toggle.\n * @param {string} keyType <developer|user|entitlement>\n * @param {string} key\n * @param {Object} options\n * @param {boolean} options.full to get full feature record including metadata.\n * @returns {string|boolean|number|FeatureModel|null}\n */\n getFeature(keyType, key, options) {\n if (keyType !== 'developer' && keyType !== 'user' && keyType !== 'entitlement') {\n return Promise.reject(\n new Error(\n 'Invalid feature keyType provided. Only `developer`, `user`, and `entitlement` feature toggles are permitted.'\n )\n );\n }\n\n options = options || {};\n\n const feature = this.webex.internal.device.features[keyType].get(key);\n\n if (!feature) {\n return Promise.resolve(null);\n }\n\n if (options.full) {\n return Promise.resolve(feature.serialize());\n }\n\n return Promise.resolve(feature.value);\n },\n\n /**\n * Handles a feature toggle update from the server.\n * @param {Object} envelope\n * @returns {undefined}\n */\n handleFeatureUpdate(envelope) {\n if (envelope && envelope.data) {\n const feature = envelope.data.featureToggle;\n const keyType = feature.type.toLowerCase();\n\n if (keyType === 'user' || keyType === 'developer') {\n this.webex.internal.device.features[keyType].add([feature], {merge: true});\n }\n }\n },\n\n /**\n * Register to listen for incoming feature events\n * @instance\n * @returns {undefined}\n */\n listen() {\n this.listenTo(\n this.webex.internal.mercury,\n 'event:featureToggle_update',\n this.handleFeatureUpdate\n );\n },\n\n /**\n * Issues request to server to set a value for a feature toggle.\n * @param {string} keyType <developer|user>\n * @param {string} key\n * @param {string} value\n * @returns {Promise} Refreshes the local device and resolves with the features endpoint's response.\n */\n setFeature(keyType, key, value) {\n // Limit only to developer feature toggles for now.\n if (keyType !== 'developer' && keyType !== 'user') {\n return Promise.reject(new Error('Only `developer` and `user` feature toggles can be set.'));\n }\n\n return this.request({\n method: 'POST',\n api: 'feature',\n resource: `features/users/${this.webex.internal.device.userId}/${keyType}`,\n body: {\n key,\n mutable: true,\n val: value,\n },\n }).then((res) => this.webex.internal.device.features[keyType].add(res.body, {merge: true}));\n },\n\n /**\n * Issues request to server to set a value for a feature toggle.\n * @param {array} featureList - in the form of `Array<{ type: 'USER' | 'DEV', key: string, val: any }>`\n * @returns {Promise} Refreshes the local device and resolves with the features endpoint`s response.\n */\n setBundledFeatures(featureList) {\n featureList.forEach((item) => {\n item.mutable = item.mutable || 'true';\n if (item.type !== 'USER' && item.type !== 'DEV') {\n item.type = 'USER';\n }\n });\n\n return this.request({\n method: 'POST',\n api: 'feature',\n resource: `features/users/${this.webex.internal.device.userId}/toggles`,\n body: featureList,\n }).then((res) => {\n const partitionedToggles = partition(res.body.featureToggles, {type: 'USER'});\n\n this.webex.internal.device.features.user.add(partitionedToggles[0], {merge: true});\n this.webex.internal.device.features.developer.add(partitionedToggles[1], {merge: true});\n });\n },\n\n initialize(...args) {\n Reflect.apply(WebexPlugin.prototype.initialize, this, args);\n\n this.listenToAndRun(\n this.webex,\n 'change:internal.device.features.developer',\n this.trigger.bind(this, 'change:developer')\n );\n this.listenToAndRun(\n this.webex,\n 'change:internal.device.features.entitlement',\n this.trigger.bind(this, 'change:entitlement')\n );\n this.listenToAndRun(\n this.webex,\n 'change:internal.device.features.user',\n this.trigger.bind(this, 'change:user')\n );\n },\n});\n\nexport default Feature;\n"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,31 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
4
|
-
|
|
5
4
|
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
6
|
-
|
|
7
5
|
_Object$defineProperty(exports, "__esModule", {
|
|
8
6
|
value: true
|
|
9
7
|
});
|
|
10
|
-
|
|
11
8
|
_Object$defineProperty(exports, "default", {
|
|
12
9
|
enumerable: true,
|
|
13
10
|
get: function get() {
|
|
14
11
|
return _feature.default;
|
|
15
12
|
}
|
|
16
13
|
});
|
|
17
|
-
|
|
18
14
|
require("@webex/internal-plugin-mercury");
|
|
19
|
-
|
|
20
15
|
var _webexCore = require("@webex/webex-core");
|
|
21
|
-
|
|
22
16
|
var _feature = _interopRequireDefault(require("./feature"));
|
|
23
|
-
|
|
24
17
|
var _config = _interopRequireDefault(require("./config"));
|
|
25
|
-
|
|
26
18
|
/*!
|
|
27
19
|
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
28
20
|
*/
|
|
21
|
+
|
|
29
22
|
(0, _webexCore.registerInternalPlugin)('feature', _feature.default, {
|
|
30
23
|
config: _config.default
|
|
31
24
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["registerInternalPlugin","Feature","config"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\nimport '@webex/internal-plugin-mercury';\n\nimport {registerInternalPlugin} from '@webex/webex-core';\n\nimport Feature from './feature';\nimport config from './config';\n\nregisterInternalPlugin('feature', Feature, {\n config
|
|
1
|
+
{"version":3,"names":["registerInternalPlugin","Feature","config"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\nimport '@webex/internal-plugin-mercury';\n\nimport {registerInternalPlugin} from '@webex/webex-core';\n\nimport Feature from './feature';\nimport config from './config';\n\nregisterInternalPlugin('feature', Feature, {\n config,\n});\n\nexport {default} from './feature';\n"],"mappings":";;;;;;;;;;;;;AAGA;AAEA;AAEA;AACA;AARA;AACA;AACA;;AAQA,IAAAA,iCAAsB,EAAC,SAAS,EAAEC,gBAAO,EAAE;EACzCC,MAAM,EAANA;AACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// This file is read by tools that parse documentation comments conforming to the TSDoc standard.
|
|
2
|
+
// It should be published with your NPM package. It should not be tracked by Git.
|
|
3
|
+
{
|
|
4
|
+
"tsdocVersion": "0.12",
|
|
5
|
+
"toolPackages": [
|
|
6
|
+
{
|
|
7
|
+
"packageName": "@microsoft/api-extractor",
|
|
8
|
+
"packageVersion": "7.34.4"
|
|
9
|
+
}
|
|
10
|
+
]
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "./feature";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/internal-plugin-feature",
|
|
3
|
-
"version": "3.0.0-
|
|
3
|
+
"version": "3.0.0-bnr.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Aimee <aimma@cisco.com>",
|
|
@@ -21,17 +21,17 @@
|
|
|
21
21
|
]
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
|
-
"@webex/test-helper-chai": "3.0.0-
|
|
25
|
-
"@webex/test-helper-mocha": "3.0.0-
|
|
26
|
-
"@webex/test-helper-mock-webex": "3.0.0-
|
|
27
|
-
"@webex/test-helper-test-users": "3.0.0-
|
|
24
|
+
"@webex/test-helper-chai": "3.0.0-bnr.0",
|
|
25
|
+
"@webex/test-helper-mocha": "3.0.0-bnr.0",
|
|
26
|
+
"@webex/test-helper-mock-webex": "3.0.0-bnr.0",
|
|
27
|
+
"@webex/test-helper-test-users": "3.0.0-bnr.0",
|
|
28
28
|
"sinon": "^9.2.4"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@webex/internal-plugin-device": "3.0.0-
|
|
32
|
-
"@webex/internal-plugin-feature": "3.0.0-
|
|
33
|
-
"@webex/internal-plugin-mercury": "3.0.0-
|
|
34
|
-
"@webex/webex-core": "3.0.0-
|
|
31
|
+
"@webex/internal-plugin-device": "3.0.0-bnr.0",
|
|
32
|
+
"@webex/internal-plugin-feature": "3.0.0-bnr.0",
|
|
33
|
+
"@webex/internal-plugin-mercury": "3.0.0-bnr.0",
|
|
34
|
+
"@webex/webex-core": "3.0.0-bnr.0",
|
|
35
35
|
"lodash": "^4.17.21"
|
|
36
36
|
}
|
|
37
37
|
}
|
package/src/config.js
CHANGED
package/src/feature.js
CHANGED
|
@@ -19,7 +19,11 @@ const Feature = WebexPlugin.extend({
|
|
|
19
19
|
*/
|
|
20
20
|
getFeature(keyType, key, options) {
|
|
21
21
|
if (keyType !== 'developer' && keyType !== 'user' && keyType !== 'entitlement') {
|
|
22
|
-
return Promise.reject(
|
|
22
|
+
return Promise.reject(
|
|
23
|
+
new Error(
|
|
24
|
+
'Invalid feature keyType provided. Only `developer`, `user`, and `entitlement` feature toggles are permitted.'
|
|
25
|
+
)
|
|
26
|
+
);
|
|
23
27
|
}
|
|
24
28
|
|
|
25
29
|
options = options || {};
|
|
@@ -59,7 +63,11 @@ const Feature = WebexPlugin.extend({
|
|
|
59
63
|
* @returns {undefined}
|
|
60
64
|
*/
|
|
61
65
|
listen() {
|
|
62
|
-
this.listenTo(
|
|
66
|
+
this.listenTo(
|
|
67
|
+
this.webex.internal.mercury,
|
|
68
|
+
'event:featureToggle_update',
|
|
69
|
+
this.handleFeatureUpdate
|
|
70
|
+
);
|
|
63
71
|
},
|
|
64
72
|
|
|
65
73
|
/**
|
|
@@ -82,15 +90,14 @@ const Feature = WebexPlugin.extend({
|
|
|
82
90
|
body: {
|
|
83
91
|
key,
|
|
84
92
|
mutable: true,
|
|
85
|
-
val: value
|
|
86
|
-
}
|
|
87
|
-
})
|
|
88
|
-
.then((res) => this.webex.internal.device.features[keyType].add(res.body, {merge: true}));
|
|
93
|
+
val: value,
|
|
94
|
+
},
|
|
95
|
+
}).then((res) => this.webex.internal.device.features[keyType].add(res.body, {merge: true}));
|
|
89
96
|
},
|
|
90
97
|
|
|
91
98
|
/**
|
|
92
99
|
* Issues request to server to set a value for a feature toggle.
|
|
93
|
-
* @param {array} featureList
|
|
100
|
+
* @param {array} featureList - in the form of `Array<{ type: 'USER' | 'DEV', key: string, val: any }>`
|
|
94
101
|
* @returns {Promise} Refreshes the local device and resolves with the features endpoint`s response.
|
|
95
102
|
*/
|
|
96
103
|
setBundledFeatures(featureList) {
|
|
@@ -105,23 +112,34 @@ const Feature = WebexPlugin.extend({
|
|
|
105
112
|
method: 'POST',
|
|
106
113
|
api: 'feature',
|
|
107
114
|
resource: `features/users/${this.webex.internal.device.userId}/toggles`,
|
|
108
|
-
body: featureList
|
|
109
|
-
})
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
});
|
|
115
|
+
body: featureList,
|
|
116
|
+
}).then((res) => {
|
|
117
|
+
const partitionedToggles = partition(res.body.featureToggles, {type: 'USER'});
|
|
118
|
+
|
|
119
|
+
this.webex.internal.device.features.user.add(partitionedToggles[0], {merge: true});
|
|
120
|
+
this.webex.internal.device.features.developer.add(partitionedToggles[1], {merge: true});
|
|
121
|
+
});
|
|
116
122
|
},
|
|
117
123
|
|
|
118
124
|
initialize(...args) {
|
|
119
125
|
Reflect.apply(WebexPlugin.prototype.initialize, this, args);
|
|
120
126
|
|
|
121
|
-
this.listenToAndRun(
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
127
|
+
this.listenToAndRun(
|
|
128
|
+
this.webex,
|
|
129
|
+
'change:internal.device.features.developer',
|
|
130
|
+
this.trigger.bind(this, 'change:developer')
|
|
131
|
+
);
|
|
132
|
+
this.listenToAndRun(
|
|
133
|
+
this.webex,
|
|
134
|
+
'change:internal.device.features.entitlement',
|
|
135
|
+
this.trigger.bind(this, 'change:entitlement')
|
|
136
|
+
);
|
|
137
|
+
this.listenToAndRun(
|
|
138
|
+
this.webex,
|
|
139
|
+
'change:internal.device.features.user',
|
|
140
|
+
this.trigger.bind(this, 'change:user')
|
|
141
|
+
);
|
|
142
|
+
},
|
|
125
143
|
});
|
|
126
144
|
|
|
127
145
|
export default Feature;
|
package/src/index.js
CHANGED
|
@@ -15,8 +15,8 @@ describe('plugin-feature', function () {
|
|
|
15
15
|
let webex, spock;
|
|
16
16
|
|
|
17
17
|
describe('#setFeature()', () => {
|
|
18
|
-
before(() =>
|
|
19
|
-
.then(async (users) => {
|
|
18
|
+
before(() =>
|
|
19
|
+
testUsers.create({count: 1}).then(async (users) => {
|
|
20
20
|
spock = users[0];
|
|
21
21
|
|
|
22
22
|
// Pause for 5 seconds for CI
|
|
@@ -24,72 +24,83 @@ describe('plugin-feature', function () {
|
|
|
24
24
|
|
|
25
25
|
webex = new WebexCore({
|
|
26
26
|
credentials: {
|
|
27
|
-
authorization: spock.token
|
|
28
|
-
}
|
|
27
|
+
authorization: spock.token,
|
|
28
|
+
},
|
|
29
29
|
});
|
|
30
30
|
|
|
31
31
|
return webex.internal.device.register();
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
it(`sets a value for a ${keyType} feature toggle`, () => webex.internal.feature.setFeature(keyType, 'testFeature', false)
|
|
39
|
-
.then((res) => {
|
|
32
|
+
})
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
['developer', 'user'].forEach((keyType) => {
|
|
36
|
+
it(`sets a value for a ${keyType} feature toggle`, () =>
|
|
37
|
+
webex.internal.feature.setFeature(keyType, 'testFeature', false).then((res) => {
|
|
40
38
|
assert.equal(res.key, 'testFeature');
|
|
41
39
|
assert.equal(res.val, 'false');
|
|
42
40
|
assert.equal(res.value, false);
|
|
43
41
|
assert.equal(res.type, 'boolean');
|
|
44
42
|
|
|
45
|
-
assert.equal(
|
|
43
|
+
assert.equal(
|
|
44
|
+
webex.internal.device.features[keyType].get({key: 'testFeature'}).val,
|
|
45
|
+
'false'
|
|
46
|
+
);
|
|
46
47
|
|
|
47
|
-
return webex.internal.feature
|
|
48
|
+
return webex.internal.feature
|
|
49
|
+
.getFeature(keyType, 'testFeature')
|
|
48
50
|
.then((result) => assert.deepEqual(result, false));
|
|
49
51
|
}));
|
|
50
52
|
});
|
|
51
53
|
});
|
|
52
54
|
|
|
53
55
|
describe('#setBundledFeatures()', () => {
|
|
54
|
-
before(() =>
|
|
55
|
-
.then((users) => {
|
|
56
|
+
before(() =>
|
|
57
|
+
testUsers.create({count: 1}).then((users) => {
|
|
56
58
|
spock = users[0];
|
|
57
59
|
webex = new WebexCore({
|
|
58
60
|
credentials: {
|
|
59
|
-
authorization: spock.token
|
|
60
|
-
}
|
|
61
|
+
authorization: spock.token,
|
|
62
|
+
},
|
|
61
63
|
});
|
|
62
64
|
|
|
63
65
|
return webex.internal.device.register();
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
66
|
+
})
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
const featureUpdateArray = [
|
|
70
|
+
{
|
|
71
|
+
key: 'key1',
|
|
72
|
+
val: 'value1',
|
|
73
|
+
type: 'USER',
|
|
74
|
+
mutable: 'true',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
key: 'key2',
|
|
78
|
+
val: 'value2',
|
|
79
|
+
mutable: 'false',
|
|
80
|
+
},
|
|
81
|
+
];
|
|
76
82
|
|
|
77
83
|
it('sets a value for two user feature toggle', () => {
|
|
78
84
|
webex.internal.feature.setFeature('user', 'key1', false);
|
|
79
85
|
|
|
80
|
-
return webex.internal.feature
|
|
81
|
-
.
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
86
|
+
return webex.internal.feature
|
|
87
|
+
.setBundledFeatures(featureUpdateArray)
|
|
88
|
+
.then(() =>
|
|
89
|
+
Promise.all([
|
|
90
|
+
webex.internal.feature
|
|
91
|
+
.getFeature('user', 'key1')
|
|
92
|
+
.then((result) => assert.deepEqual(result, 'value1')),
|
|
93
|
+
webex.internal.feature
|
|
94
|
+
.getFeature('user', 'key2')
|
|
95
|
+
.then((result) => assert.deepEqual(result, 'value2')),
|
|
96
|
+
])
|
|
97
|
+
);
|
|
87
98
|
});
|
|
88
99
|
});
|
|
89
100
|
|
|
90
101
|
describe('when feature toggle update event is received', () => {
|
|
91
|
-
before(() =>
|
|
92
|
-
.then(async (users) => {
|
|
102
|
+
before(() =>
|
|
103
|
+
testUsers.create({count: 1}).then(async (users) => {
|
|
93
104
|
spock = users[0];
|
|
94
105
|
|
|
95
106
|
// Pause for 5 seconds for CI
|
|
@@ -97,29 +108,32 @@ describe('plugin-feature', function () {
|
|
|
97
108
|
|
|
98
109
|
webex = new WebexCore({
|
|
99
110
|
credentials: {
|
|
100
|
-
authorization: spock.token
|
|
101
|
-
}
|
|
111
|
+
authorization: spock.token,
|
|
112
|
+
},
|
|
102
113
|
});
|
|
103
114
|
|
|
104
115
|
sinon.spy(webex.internal.feature, 'handleFeatureUpdate');
|
|
105
116
|
|
|
106
|
-
return webex.internal.device.register()
|
|
107
|
-
|
|
108
|
-
|
|
117
|
+
return webex.internal.device.register().then(() => webex.internal.mercury.connect());
|
|
118
|
+
})
|
|
119
|
+
);
|
|
109
120
|
|
|
110
121
|
after(() => webex.internal.mercury.disconnect());
|
|
111
122
|
|
|
112
123
|
flaky(it, process.env.SKIP_FLAKY_TESTS)('updates the feature toggle', () => {
|
|
113
|
-
const featureUpdateArray = [
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
124
|
+
const featureUpdateArray = [
|
|
125
|
+
{
|
|
126
|
+
key: 'mention-notifications',
|
|
127
|
+
val: false,
|
|
128
|
+
type: 'USER',
|
|
129
|
+
mutable: true,
|
|
130
|
+
},
|
|
131
|
+
];
|
|
119
132
|
|
|
120
133
|
webex.internal.feature.listen();
|
|
121
134
|
|
|
122
|
-
return webex.internal.feature
|
|
135
|
+
return webex.internal.feature
|
|
136
|
+
.getFeature('user', 'mention-notifications')
|
|
123
137
|
.then((result) => assert.deepEqual(result, true))
|
|
124
138
|
.then(() => webex.internal.feature.setBundledFeatures(featureUpdateArray))
|
|
125
139
|
.then(() => expectEvent(10000, 'event:featureToggle_update', webex.internal.mercury))
|
|
@@ -16,16 +16,17 @@ describe('plugin-feature', () => {
|
|
|
16
16
|
webex = new MockWebex({
|
|
17
17
|
children: {
|
|
18
18
|
device: Device,
|
|
19
|
-
feature: Feature
|
|
20
|
-
}
|
|
19
|
+
feature: Feature,
|
|
20
|
+
},
|
|
21
21
|
});
|
|
22
22
|
});
|
|
23
23
|
|
|
24
24
|
describe('#getFeature()', () => {
|
|
25
|
-
it('requires a valid keyType', () =>
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
it('requires a valid keyType', () =>
|
|
26
|
+
assert.isRejected(
|
|
27
|
+
webex.internal.feature.getFeature('none', 'featureName', {}),
|
|
28
|
+
/Invalid feature keyType provided. Only `developer`, `user`, and `entitlement` feature toggles are permitted./
|
|
29
|
+
));
|
|
29
30
|
|
|
30
31
|
it('returns the full feature object', () => {
|
|
31
32
|
const key = 'featureName';
|
|
@@ -35,12 +36,13 @@ describe('plugin-feature', () => {
|
|
|
35
36
|
mutable: true,
|
|
36
37
|
type: 'boolean',
|
|
37
38
|
val: 'true',
|
|
38
|
-
value: true
|
|
39
|
+
value: true,
|
|
39
40
|
};
|
|
40
41
|
|
|
41
42
|
webex.internal.device.features[keyType].add(feature);
|
|
42
43
|
|
|
43
|
-
return webex.internal.feature
|
|
44
|
+
return webex.internal.feature
|
|
45
|
+
.getFeature(keyType, key, {full: true})
|
|
44
46
|
.then((result) => assert.deepEqual(result, feature));
|
|
45
47
|
});
|
|
46
48
|
|
|
@@ -52,43 +54,46 @@ describe('plugin-feature', () => {
|
|
|
52
54
|
mutable: true,
|
|
53
55
|
type: 'boolean',
|
|
54
56
|
val: 'true',
|
|
55
|
-
value: true
|
|
57
|
+
value: true,
|
|
56
58
|
};
|
|
57
59
|
|
|
58
60
|
webex.internal.device.features[keyType].add(feature);
|
|
59
61
|
|
|
60
|
-
return webex.internal.feature
|
|
62
|
+
return webex.internal.feature
|
|
63
|
+
.getFeature(keyType, key)
|
|
61
64
|
.then((result) => assert.deepEqual(result, feature.value));
|
|
62
65
|
});
|
|
63
66
|
});
|
|
64
67
|
|
|
65
68
|
describe('#setFeature()', () => {
|
|
66
69
|
beforeEach(() => {
|
|
67
|
-
webex.request = sinon.stub().returns(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
70
|
+
webex.request = sinon.stub().returns(
|
|
71
|
+
Promise.resolve({
|
|
72
|
+
body: {},
|
|
73
|
+
statusCode: 200,
|
|
74
|
+
})
|
|
75
|
+
);
|
|
71
76
|
});
|
|
72
77
|
afterEach(() => {
|
|
73
78
|
webex.request.resetHistory();
|
|
74
79
|
});
|
|
75
|
-
it('does not allow entitlement keyType to be set', () =>
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
'user'
|
|
83
|
-
].forEach((keyType) => {
|
|
80
|
+
it('does not allow entitlement keyType to be set', () =>
|
|
81
|
+
assert.isRejected(
|
|
82
|
+
webex.internal.feature.setFeature('entitlement', 'featureName', true),
|
|
83
|
+
/Only `developer` and `user` feature toggles can be set./
|
|
84
|
+
));
|
|
85
|
+
|
|
86
|
+
['developer', 'user'].forEach((keyType) => {
|
|
84
87
|
it(`sets a value for a ${keyType} feature toggle`, () => {
|
|
85
88
|
sinon.spy(webex.internal.device.features[keyType], 'add');
|
|
86
89
|
|
|
87
|
-
return webex.internal.feature.setFeature(keyType, 'featureName', true)
|
|
88
|
-
.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
return webex.internal.feature.setFeature(keyType, 'featureName', true).then(() => {
|
|
91
|
+
assert.called(webex.internal.device.features[keyType].add);
|
|
92
|
+
assert.equal(
|
|
93
|
+
webex.request.getCall(0).args[0].resource,
|
|
94
|
+
`features/users/${webex.internal.device.userId}/${keyType}`
|
|
95
|
+
);
|
|
96
|
+
});
|
|
92
97
|
});
|
|
93
98
|
});
|
|
94
99
|
});
|
|
@@ -104,9 +109,9 @@ describe('plugin-feature', () => {
|
|
|
104
109
|
mutable: true,
|
|
105
110
|
type: 'USER',
|
|
106
111
|
val: 'true',
|
|
107
|
-
value: true
|
|
108
|
-
}
|
|
109
|
-
}
|
|
112
|
+
value: true,
|
|
113
|
+
},
|
|
114
|
+
},
|
|
110
115
|
};
|
|
111
116
|
|
|
112
117
|
sinon.spy(webex.internal.device.features[keyType], 'add');
|
|
@@ -116,11 +121,7 @@ describe('plugin-feature', () => {
|
|
|
116
121
|
});
|
|
117
122
|
|
|
118
123
|
describe('when a feature is changed', () => {
|
|
119
|
-
[
|
|
120
|
-
'developer',
|
|
121
|
-
'entitlement',
|
|
122
|
-
'user'
|
|
123
|
-
].forEach((keyType) => {
|
|
124
|
+
['developer', 'entitlement', 'user'].forEach((keyType) => {
|
|
124
125
|
it(`emits \`change:${keyType}\` on ${keyType} feature change`, () => {
|
|
125
126
|
const mockEventHandler = sinon.spy();
|
|
126
127
|
|
|
@@ -131,7 +132,7 @@ describe('plugin-feature', () => {
|
|
|
131
132
|
mutable: true,
|
|
132
133
|
type: 'boolean',
|
|
133
134
|
val: 'true',
|
|
134
|
-
value: true
|
|
135
|
+
value: true,
|
|
135
136
|
};
|
|
136
137
|
|
|
137
138
|
webex.internal.device.features[keyType].add(feature);
|