reactor-feature-toggle 6.1.0 → 8.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/LICENSE +1 -1
- package/README.md +62 -4
- package/dist/cjs/feature-toggle-provider.js +49 -9
- package/dist/cjs/feature-toggle-provider.js.map +1 -0
- package/dist/cjs/feature-toggle.d.ts +2 -2
- package/dist/cjs/feature-toggle.js +4 -2
- package/dist/cjs/feature-toggle.js.map +1 -0
- package/dist/cjs/index.js +17 -3
- package/dist/cjs/index.js.map +1 -0
- package/dist/esm/feature-toggle-provider.js +21 -9
- package/dist/esm/feature-toggle.d.ts +2 -2
- package/dist/esm/feature-toggle.js +7 -3
- package/dist/esm/index.js +5 -2
- package/dist/umd/reactor-feature-toggle.js +1 -63
- package/dist/umd/reactor-feature-toggle.min.js +1 -1
- package/dist/umd/reactor-feature-toggle.min.js.gz +0 -0
- package/package.json +41 -35
- package/CHANGELOG.md +0 -188
- package/dist/es2015/feature-toggle-provider.d.ts +0 -13
- package/dist/es2015/feature-toggle-provider.js +0 -17
- package/dist/es2015/feature-toggle.d.ts +0 -7
- package/dist/es2015/feature-toggle.js +0 -29
- package/dist/es2015/index.d.ts +0 -2
- package/dist/es2015/index.js +0 -2
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
The MIT License (MIT)
|
|
2
2
|
|
|
3
|
-
Copyright (c)
|
|
3
|
+
Copyright (c) 2025 Wilson Mendes <willmendesneto@gmail.com>
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
package/README.md
CHANGED
|
@@ -38,8 +38,6 @@ You can get it on NPM installing `reactor-feature-toggle` module as a project de
|
|
|
38
38
|
|
|
39
39
|
```shell
|
|
40
40
|
npm install reactor-feature-toggle --save
|
|
41
|
-
# or
|
|
42
|
-
yarn add reactor-feature-toggle
|
|
43
41
|
```
|
|
44
42
|
|
|
45
43
|
You can also use the standalone UMD build by including `dist/reactor-feature-toggle.js` in your page. If you do this you'll also need to include the dependencies. For example:
|
|
@@ -52,6 +50,8 @@ You can also use the standalone UMD build by including `dist/reactor-feature-tog
|
|
|
52
50
|
|
|
53
51
|
## Setup
|
|
54
52
|
|
|
53
|
+
### Client-side
|
|
54
|
+
|
|
55
55
|
You'll need to import `FeatureToggleProvider` and add it into the root component of your application. So that you can enable/disable features via `FeatureToggle` component any place in your application.
|
|
56
56
|
|
|
57
57
|
Also, multiple `FeatureToggleProvider` are allowed, which gives more flexibility for your application.
|
|
@@ -119,7 +119,66 @@ const AppWrapper = () => {
|
|
|
119
119
|
export default AppWrapper;
|
|
120
120
|
```
|
|
121
121
|
|
|
122
|
-
|
|
122
|
+
### Using `useFeatureToggle()`
|
|
123
|
+
|
|
124
|
+
```javascript
|
|
125
|
+
import { useFeatureToggle } from 'reactor-feature-toggle';
|
|
126
|
+
|
|
127
|
+
function Dashboard() {
|
|
128
|
+
const { isOn } = useFeatureToggle();
|
|
129
|
+
|
|
130
|
+
// {
|
|
131
|
+
// enableNewDashboard: true,
|
|
132
|
+
// enableProPlan: true,
|
|
133
|
+
// enableBetaFeatures: false,
|
|
134
|
+
// }
|
|
135
|
+
//
|
|
136
|
+
const canAccessNewDashboard = isOn('enableNewDashboard') && isOn('enableProPlan');
|
|
137
|
+
const showBetaFeatures = isOn('enableBetaFeatures');
|
|
138
|
+
|
|
139
|
+
if (canAccessNewDashboard) {
|
|
140
|
+
return <div>New Dashboard</div>;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (showBetaFeatures) {
|
|
144
|
+
return <div>Beta Feature!</div>;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return <div>Current Dashboard</div>;
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Server-Side Usage
|
|
152
|
+
|
|
153
|
+
For Server-Side Rendering or React Server Components, initialize `feature-toggle-service` directly without the Provider:
|
|
154
|
+
|
|
155
|
+
```javascript
|
|
156
|
+
import { set, FeatureToggle } from 'reactor-feature-toggle';
|
|
157
|
+
|
|
158
|
+
// Initialize feature flags (typically in your root server component)
|
|
159
|
+
const featureFlags = {
|
|
160
|
+
enableMainContent: true,
|
|
161
|
+
enableServerSideFeature: true,
|
|
162
|
+
enableNewAPI: false,
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
set(featureFlags);
|
|
166
|
+
|
|
167
|
+
// Use FeatureToggle component in any Server Component
|
|
168
|
+
export default function ServerPage() {
|
|
169
|
+
return
|
|
170
|
+
(
|
|
171
|
+
<div>
|
|
172
|
+
<h1>ServerPage</h1>
|
|
173
|
+
<FeatureToggle featureName={['enableMainContent']}>
|
|
174
|
+
<div>Main Content visible!</div>
|
|
175
|
+
</FeatureToggle>
|
|
176
|
+
</div>
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Demo
|
|
123
182
|
|
|
124
183
|
Try out the [demo](https://stackblitz.com/edit/reactor-feature-toggle-sample)!
|
|
125
184
|
|
|
@@ -132,5 +191,4 @@ this project is using `np` package to publish, which makes things straightforwar
|
|
|
132
191
|
## Author
|
|
133
192
|
|
|
134
193
|
**Wilson Mendes (willmendesneto)**
|
|
135
|
-
|
|
136
194
|
- <http://github.com/willmendesneto>
|
|
@@ -1,23 +1,63 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
|
|
5
|
-
var react_1 =
|
|
36
|
+
exports.FeatureToggleProvider = void 0;
|
|
37
|
+
exports.useFeatureToggle = useFeatureToggle;
|
|
38
|
+
var react_1 = __importStar(require("react"));
|
|
6
39
|
var feature_toggle_service_1 = require("feature-toggle-service");
|
|
7
|
-
var FeatureToggleContext = react_1.createContext({
|
|
40
|
+
var FeatureToggleContext = (0, react_1.createContext)({
|
|
8
41
|
isOn: feature_toggle_service_1.isOn,
|
|
9
42
|
toggles: null,
|
|
10
43
|
});
|
|
11
|
-
|
|
44
|
+
var FeatureToggleProvider = function (_a) {
|
|
12
45
|
var children = _a.children, featureToggleService = _a.featureToggleService;
|
|
13
|
-
|
|
14
|
-
|
|
46
|
+
(0, react_1.useMemo)(function () {
|
|
47
|
+
(0, feature_toggle_service_1.set)(featureToggleService);
|
|
48
|
+
}, [featureToggleService]);
|
|
49
|
+
var value = (0, react_1.useMemo)(function () { return ({
|
|
50
|
+
isOn: feature_toggle_service_1.isOn,
|
|
51
|
+
toggles: featureToggleService,
|
|
52
|
+
}); }, [featureToggleService]);
|
|
53
|
+
return (react_1.default.createElement(FeatureToggleContext.Provider, { value: value }, children));
|
|
15
54
|
};
|
|
55
|
+
exports.FeatureToggleProvider = FeatureToggleProvider;
|
|
16
56
|
function useFeatureToggle() {
|
|
17
|
-
var context = react_1.useContext(FeatureToggleContext);
|
|
57
|
+
var context = (0, react_1.useContext)(FeatureToggleContext);
|
|
18
58
|
if (!context) {
|
|
19
59
|
throw new Error('useFeatureToggle must be used within FeatureToggleClientProvider');
|
|
20
60
|
}
|
|
21
61
|
return context;
|
|
22
62
|
}
|
|
23
|
-
|
|
63
|
+
//# sourceMappingURL=feature-toggle-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-toggle-provider.js","sourceRoot":"","sources":["../../src/feature-toggle-provider.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,4CASC;AAhDD,6CAA6E;AAC7E,iEAA+E;AAW/E,IAAM,oBAAoB,GAAG,IAAA,qBAAa,EAA2B;IACnE,IAAI,+BAAA;IACJ,OAAO,EAAE,IAAI;CACd,CAAC,CAAC;AAEI,IAAM,qBAAqB,GAAG,UAAC,EAGF;QAFlC,QAAQ,cAAA,EACR,oBAAoB,0BAAA;IAEpB,IAAA,eAAO,EAAC;QACN,IAAA,4BAAG,EAAC,oBAAoB,CAAC,CAAC;IAC5B,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC3B,IAAM,KAAK,GAAG,IAAA,eAAO,EACnB,cAAM,OAAA,CAAC;QACL,IAAI,+BAAA;QACJ,OAAO,EAAE,oBAAoB;KAC9B,CAAC,EAHI,CAGJ,EACF,CAAC,oBAAoB,CAAC,CACvB,CAAC;IAEF,OAAO,CACL,8BAAC,oBAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,IACxC,QAAQ,CACqB,CACjC,CAAC;AACJ,CAAC,CAAC;AApBW,QAAA,qBAAqB,yBAoBhC;AAEF,SAAgB,gBAAgB;IAC9B,IAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,oBAAoB,CAAC,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { ReactNode,
|
|
1
|
+
import { ReactNode, ReactElement } from 'react';
|
|
2
2
|
export interface FeatureToggleProps {
|
|
3
3
|
children?: ReactNode;
|
|
4
4
|
featureName: string[] | string;
|
|
5
5
|
showWhenDisabled?: boolean;
|
|
6
6
|
}
|
|
7
|
-
export declare const FeatureToggle:
|
|
7
|
+
export declare const FeatureToggle: (props: FeatureToggleProps) => ReactElement | null;
|
|
@@ -18,7 +18,7 @@ var feature_toggle_service_1 = require("feature-toggle-service");
|
|
|
18
18
|
*/
|
|
19
19
|
var isOnCheck = function (featureName) {
|
|
20
20
|
var isFeatureToggleOn = function (toggle) {
|
|
21
|
-
return toggle[0] === '!' ? !feature_toggle_service_1.isOn(toggle.replace('!', '')) : feature_toggle_service_1.isOn(toggle);
|
|
21
|
+
return toggle[0] === '!' ? !(0, feature_toggle_service_1.isOn)(toggle.replace('!', '')) : (0, feature_toggle_service_1.isOn)(toggle);
|
|
22
22
|
};
|
|
23
23
|
if (typeof featureName === 'string') {
|
|
24
24
|
return isFeatureToggleOn(featureName);
|
|
@@ -28,7 +28,9 @@ var isOnCheck = function (featureName) {
|
|
|
28
28
|
}
|
|
29
29
|
return false;
|
|
30
30
|
};
|
|
31
|
-
|
|
31
|
+
var FeatureToggle = function (props) {
|
|
32
32
|
var showContent = isOnCheck(props.featureName);
|
|
33
33
|
return showContent ? props.children : null;
|
|
34
34
|
};
|
|
35
|
+
exports.FeatureToggle = FeatureToggle;
|
|
36
|
+
//# sourceMappingURL=feature-toggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-toggle.js","sourceRoot":"","sources":["../../src/feature-toggle.tsx"],"names":[],"mappings":";;;AAEA,iEAA8C;AAQ9C;;;;;;GAMG;AAEH;;;;;;GAMG;AACH,IAAM,SAAS,GAAG,UAAC,WAA8B;IAC/C,IAAM,iBAAiB,GAAG,UAAC,MAAc;QACvC,OAAA,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAA,6BAAI,EAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAA,6BAAI,EAAC,MAAM,CAAC;IAAjE,CAAiE,CAAC;IAEpE,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,iBAAiB,CAAC,WAAqB,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,OAAQ,WAAwB,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEK,IAAM,aAAa,GAAG,UAC3B,KAAyB;IAEzB,IAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAEjD,OAAO,WAAW,CAAC,CAAC,CAAE,KAAK,CAAC,QAAyB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC,CAAC;AANW,QAAA,aAAa,iBAMxB"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
2
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
17
|
+
__exportStar(require("./feature-toggle"), exports);
|
|
18
|
+
__exportStar(require("./feature-toggle-provider"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,4DAA0C"}
|
|
@@ -1,16 +1,28 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FeatureToggleProvider = void 0;
|
|
4
|
+
exports.useFeatureToggle = useFeatureToggle;
|
|
5
|
+
var tslib_1 = require("tslib");
|
|
6
|
+
var react_1 = tslib_1.__importStar(require("react"));
|
|
7
|
+
var feature_toggle_service_1 = require("feature-toggle-service");
|
|
8
|
+
var FeatureToggleContext = (0, react_1.createContext)({
|
|
9
|
+
isOn: feature_toggle_service_1.isOn,
|
|
5
10
|
toggles: null,
|
|
6
11
|
});
|
|
7
|
-
|
|
12
|
+
var FeatureToggleProvider = function (_a) {
|
|
8
13
|
var children = _a.children, featureToggleService = _a.featureToggleService;
|
|
9
|
-
|
|
10
|
-
|
|
14
|
+
(0, react_1.useMemo)(function () {
|
|
15
|
+
(0, feature_toggle_service_1.set)(featureToggleService);
|
|
16
|
+
}, [featureToggleService]);
|
|
17
|
+
var value = (0, react_1.useMemo)(function () { return ({
|
|
18
|
+
isOn: feature_toggle_service_1.isOn,
|
|
19
|
+
toggles: featureToggleService,
|
|
20
|
+
}); }, [featureToggleService]);
|
|
21
|
+
return (react_1.default.createElement(FeatureToggleContext.Provider, { value: value }, children));
|
|
11
22
|
};
|
|
12
|
-
|
|
13
|
-
|
|
23
|
+
exports.FeatureToggleProvider = FeatureToggleProvider;
|
|
24
|
+
function useFeatureToggle() {
|
|
25
|
+
var context = (0, react_1.useContext)(FeatureToggleContext);
|
|
14
26
|
if (!context) {
|
|
15
27
|
throw new Error('useFeatureToggle must be used within FeatureToggleClientProvider');
|
|
16
28
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { ReactNode,
|
|
1
|
+
import { ReactNode, ReactElement } from 'react';
|
|
2
2
|
export interface FeatureToggleProps {
|
|
3
3
|
children?: ReactNode;
|
|
4
4
|
featureName: string[] | string;
|
|
5
5
|
showWhenDisabled?: boolean;
|
|
6
6
|
}
|
|
7
|
-
export declare const FeatureToggle:
|
|
7
|
+
export declare const FeatureToggle: (props: FeatureToggleProps) => ReactElement | null;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FeatureToggle = void 0;
|
|
4
|
+
var feature_toggle_service_1 = require("feature-toggle-service");
|
|
2
5
|
/**
|
|
3
6
|
* Checks if feature toggle is turned on of turned off
|
|
4
7
|
*
|
|
@@ -15,7 +18,7 @@ import { isOn } from 'feature-toggle-service';
|
|
|
15
18
|
*/
|
|
16
19
|
var isOnCheck = function (featureName) {
|
|
17
20
|
var isFeatureToggleOn = function (toggle) {
|
|
18
|
-
return toggle[0] === '!' ? !isOn(toggle.replace('!', '')) : isOn(toggle);
|
|
21
|
+
return toggle[0] === '!' ? !(0, feature_toggle_service_1.isOn)(toggle.replace('!', '')) : (0, feature_toggle_service_1.isOn)(toggle);
|
|
19
22
|
};
|
|
20
23
|
if (typeof featureName === 'string') {
|
|
21
24
|
return isFeatureToggleOn(featureName);
|
|
@@ -25,7 +28,8 @@ var isOnCheck = function (featureName) {
|
|
|
25
28
|
}
|
|
26
29
|
return false;
|
|
27
30
|
};
|
|
28
|
-
|
|
31
|
+
var FeatureToggle = function (props) {
|
|
29
32
|
var showContent = isOnCheck(props.featureName);
|
|
30
33
|
return showContent ? props.children : null;
|
|
31
34
|
};
|
|
35
|
+
exports.FeatureToggle = FeatureToggle;
|
package/dist/esm/index.js
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./feature-toggle"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./feature-toggle-provider"), exports);
|
|
@@ -1,63 +1 @@
|
|
|
1
|
-
(function (global, factory) {
|
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('feature-toggle-service'), require('react')) :
|
|
3
|
-
typeof define === 'function' && define.amd ? define(['exports', 'feature-toggle-service', 'react'], factory) :
|
|
4
|
-
(global = global || self, factory(global.ReactorFeatureToggle = {}, global.featureToggleService, global.React));
|
|
5
|
-
}(this, (function (exports, featureToggleService, React) { 'use strict';
|
|
6
|
-
|
|
7
|
-
var React__default = 'default' in React ? React['default'] : React;
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Checks if feature toggle is turned on of turned off
|
|
11
|
-
*
|
|
12
|
-
* @param {string} toggle: name of the feature toggle previously configured via `FeatureToggleProvider`
|
|
13
|
-
*
|
|
14
|
-
* @returns boolean
|
|
15
|
-
*/
|
|
16
|
-
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* @param {(string[] | string)} featureName: : name of the feature toggle previously configured via `FeatureToggleProvider`
|
|
20
|
-
*
|
|
21
|
-
* @returns boolean
|
|
22
|
-
*/
|
|
23
|
-
var isOnCheck = function (featureName) {
|
|
24
|
-
var isFeatureToggleOn = function (toggle) {
|
|
25
|
-
return toggle[0] === '!' ? !featureToggleService.isOn(toggle.replace('!', '')) : featureToggleService.isOn(toggle);
|
|
26
|
-
};
|
|
27
|
-
if (typeof featureName === 'string') {
|
|
28
|
-
return isFeatureToggleOn(featureName);
|
|
29
|
-
}
|
|
30
|
-
else if (Array.isArray(featureName)) {
|
|
31
|
-
return featureName.every(isFeatureToggleOn);
|
|
32
|
-
}
|
|
33
|
-
return false;
|
|
34
|
-
};
|
|
35
|
-
var FeatureToggle = function (props) {
|
|
36
|
-
var showContent = isOnCheck(props.featureName);
|
|
37
|
-
return showContent ? props.children : null;
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
var FeatureToggleContext = React.createContext({
|
|
41
|
-
isOn: featureToggleService.isOn,
|
|
42
|
-
toggles: null,
|
|
43
|
-
});
|
|
44
|
-
var FeatureToggleProvider = function (_a) {
|
|
45
|
-
var children = _a.children, featureToggleService$1 = _a.featureToggleService;
|
|
46
|
-
featureToggleService.set(featureToggleService$1);
|
|
47
|
-
return (React__default.createElement(FeatureToggleContext.Provider, { value: { isOn: featureToggleService.isOn, toggles: featureToggleService$1 } }, children));
|
|
48
|
-
};
|
|
49
|
-
function useFeatureToggle() {
|
|
50
|
-
var context = React.useContext(FeatureToggleContext);
|
|
51
|
-
if (!context) {
|
|
52
|
-
throw new Error('useFeatureToggle must be used within FeatureToggleClientProvider');
|
|
53
|
-
}
|
|
54
|
-
return context;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
exports.FeatureToggle = FeatureToggle;
|
|
58
|
-
exports.FeatureToggleProvider = FeatureToggleProvider;
|
|
59
|
-
exports.useFeatureToggle = useFeatureToggle;
|
|
60
|
-
|
|
61
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
62
|
-
|
|
63
|
-
})));
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("react")):"function"==typeof define&&define.amd?define(["react"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).ReactorFeatureToggle=t(e.react)}(this,function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var r=t(e);function n(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function o(e,t){return e(t={exports:{}},t.exports),t.exports}var i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)};var a=function(){return a=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},a.apply(this,arguments)};var c=Object.create?function(e,t,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(t,r);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,o)}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]};function u(e){var t="function"==typeof Symbol&&Symbol.iterator,r=t&&e[t],n=0;if(r)return r.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function s(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,i=r.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(n=i.next()).done;)a.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return a}function f(e){return this instanceof f?(this.v=e,this):new f(e)}var l=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t},p=function(e){return p=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r);return t},p(e)};var y="function"==typeof SuppressedError?SuppressedError:function(e,t,r){var n=new Error(r);return n.name="SuppressedError",n.error=e,n.suppressed=t,n};var d,v={__extends:function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},__assign:a,__rest:function(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(r[n[o]]=e[n[o]])}return r},__decorate:function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var c=e.length-1;c>=0;c--)(o=e[c])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a},__param:function(e,t){return function(r,n){t(r,n,e)}},__esDecorate:function(e,t,r,n,o,i){function a(e){if(void 0!==e&&"function"!=typeof e)throw new TypeError("Function expected");return e}for(var c,u=n.kind,s="getter"===u?"get":"setter"===u?"set":"value",f=!t&&e?n.static?e:e.prototype:null,l=t||(f?Object.getOwnPropertyDescriptor(f,n.name):{}),p=!1,y=r.length-1;y>=0;y--){var d={};for(var v in n)d[v]="access"===v?{}:n[v];for(var v in n.access)d.access[v]=n.access[v];d.addInitializer=function(e){if(p)throw new TypeError("Cannot add initializers after decoration has completed");i.push(a(e||null))};var h=(0,r[y])("accessor"===u?{get:l.get,set:l.set}:l[s],d);if("accessor"===u){if(void 0===h)continue;if(null===h||"object"!=typeof h)throw new TypeError("Object expected");(c=a(h.get))&&(l.get=c),(c=a(h.set))&&(l.set=c),(c=a(h.init))&&o.unshift(c)}else(c=a(h))&&("field"===u?o.unshift(c):l[s]=c)}f&&Object.defineProperty(f,n.name,l),p=!0},__runInitializers:function(e,t,r){for(var n=arguments.length>2,o=0;o<t.length;o++)r=n?t[o].call(e,r):t[o].call(e);return n?r:void 0},__propKey:function(e){return"symbol"==typeof e?e:"".concat(e)},__setFunctionName:function(e,t,r){return"symbol"==typeof t&&(t=t.description?"[".concat(t.description,"]"):""),Object.defineProperty(e,"name",{configurable:!0,value:r?"".concat(r," ",t):t})},__metadata:function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},__awaiter:function(e,t,r,n){return new(r||(r=Promise))(function(o,i){function a(e){try{u(n.next(e))}catch(e){i(e)}}function c(e){try{u(n.throw(e))}catch(e){i(e)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(a,c)}u((n=n.apply(e,t||[])).next())})},__generator:function(e,t){var r,n,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=c(0),a.throw=c(1),a.return=c(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function c(c){return function(u){return function(c){if(r)throw new TypeError("Generator is already executing.");for(;a&&(a=0,c[0]&&(i=0)),i;)try{if(r=1,n&&(o=2&c[0]?n.return:c[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,c[1])).done)return o;switch(n=0,o&&(c=[2&c[0],o.value]),c[0]){case 0:case 1:o=c;break;case 4:return i.label++,{value:c[1],done:!1};case 5:i.label++,n=c[1],c=[0];continue;case 7:c=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==c[0]&&2!==c[0])){i=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]<o[3])){i.label=c[1];break}if(6===c[0]&&i.label<o[1]){i.label=o[1],o=c;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(c);break}o[2]&&i.ops.pop(),i.trys.pop();continue}c=t.call(e,i)}catch(e){c=[6,e],n=0}finally{r=o=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}([c,u])}}},__createBinding:c,__exportStar:function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||c(t,e,r)},__values:u,__read:s,__spread:function(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(s(arguments[t]));return e},__spreadArrays:function(){for(var e=0,t=0,r=arguments.length;t<r;t++)e+=arguments[t].length;var n=Array(e),o=0;for(t=0;t<r;t++)for(var i=arguments[t],a=0,c=i.length;a<c;a++,o++)n[o]=i[a];return n},__spreadArray:function(e,t,r){if(r||2===arguments.length)for(var n,o=0,i=t.length;o<i;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))},__await:f,__asyncGenerator:function(e,t,r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n,o=r.apply(e,t||[]),i=[];return n=Object.create(("function"==typeof AsyncIterator?AsyncIterator:Object).prototype),a("next"),a("throw"),a("return",function(e){return function(t){return Promise.resolve(t).then(e,s)}}),n[Symbol.asyncIterator]=function(){return this},n;function a(e,t){o[e]&&(n[e]=function(t){return new Promise(function(r,n){i.push([e,t,r,n])>1||c(e,t)})},t&&(n[e]=t(n[e])))}function c(e,t){try{(r=o[e](t)).value instanceof f?Promise.resolve(r.value.v).then(u,s):l(i[0][2],r)}catch(e){l(i[0][3],e)}var r}function u(e){c("next",e)}function s(e){c("throw",e)}function l(e,t){e(t),i.shift(),i.length&&c(i[0][0],i[0][1])}},__asyncDelegator:function(e){var t,r;return t={},n("next"),n("throw",function(e){throw e}),n("return"),t[Symbol.iterator]=function(){return this},t;function n(n,o){t[n]=e[n]?function(t){return(r=!r)?{value:f(e[n](t)),done:!1}:o?o(t):t}:o}},__asyncValues:function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,r=e[Symbol.asyncIterator];return r?r.call(e):(e=u(e),t={},n("next"),n("throw"),n("return"),t[Symbol.asyncIterator]=function(){return this},t);function n(r){t[r]=e[r]&&function(t){return new Promise(function(n,o){(function(e,t,r,n){Promise.resolve(n).then(function(t){e({value:t,done:r})},t)})(n,o,(t=e[r](t)).done,t.value)})}}},__makeTemplateObject:function(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e},__importStar:function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r=p(e),n=0;n<r.length;n++)"default"!==r[n]&&c(t,e,r[n]);return l(t,e),t},__importDefault:function(e){return e&&e.__esModule?e:{default:e}},__classPrivateFieldGet:function(e,t,r,n){if("a"===r&&!n)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===r?n:"a"===r?n.call(e):n?n.value:t.get(e)},__classPrivateFieldSet:function(e,t,r,n,o){if("m"===n)throw new TypeError("Private method is not writable");if("a"===n&&!o)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!o:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===n?o.call(e,r):o?o.value=r:t.set(e,r),r},__classPrivateFieldIn:function(e,t){if(null===t||"object"!=typeof t&&"function"!=typeof t)throw new TypeError("Cannot use 'in' operator on non-object");return"function"==typeof e?t===e:e.has(t)},__addDisposableResource:function(e,t,r){if(null!=t){if("object"!=typeof t&&"function"!=typeof t)throw new TypeError("Object expected.");var n,o;if(r){if(!Symbol.asyncDispose)throw new TypeError("Symbol.asyncDispose is not defined.");n=t[Symbol.asyncDispose]}if(void 0===n){if(!Symbol.dispose)throw new TypeError("Symbol.dispose is not defined.");n=t[Symbol.dispose],r&&(o=n)}if("function"!=typeof n)throw new TypeError("Object not disposable.");o&&(n=function(){try{o.call(this)}catch(e){return Promise.reject(e)}}),e.stack.push({value:t,dispose:n,async:r})}else r&&e.stack.push({async:!0});return t},__disposeResources:function(e){function t(t){e.error=e.hasError?new y(t,e.error,"An error was suppressed during disposal."):t,e.hasError=!0}var r,n=0;return function o(){for(;r=e.stack.pop();)try{if(!r.async&&1===n)return n=0,e.stack.push(r),Promise.resolve().then(o);if(r.dispose){var i=r.dispose.call(r.value);if(r.async)return n|=2,Promise.resolve(i).then(o,function(e){return t(e),o()})}else n|=1}catch(e){t(e)}if(1===n)return e.hasError?Promise.reject(e.error):Promise.resolve();if(e.hasError)throw e.error}()},__rewriteRelativeImportExtension:function(e,t){return"string"==typeof e&&/^\.\.?\//.test(e)?e.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(e,r,n,o,i){return r?t?".jsx":".js":!n||o&&i?n+o+"."+i.toLowerCase()+"js":e}):e}},h="6.1.0",b=((d={})[h]={},d),_=Object.freeze({__proto__:null,isOn:function(e,t){return t&&console.log("\n[DEBUG] Execution Time in milliseconds: ".concat(Date.now(),' version: "').concat(h,'" key: "').concat(e,'" settings: ').concat(JSON.stringify(b),"\n")),"string"==typeof e&&!!b[h][e]},set:function(e){b[h]=Object.assign({},b[h],e)}}),w=o(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.FeatureToggle=void 0;t.FeatureToggle=function(e){var t,r;return(t=e.featureName,r=function(e){return"!"===e[0]?!(0,_.isOn)(e.replace("!","")):(0,_.isOn)(e)},"string"==typeof t?r(t):!!Array.isArray(t)&&t.every(r))?e.children:null}});n(w),w.FeatureToggle;var g=o(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.FeatureToggleProvider=void 0,t.useFeatureToggle=function(){var e=(0,n.useContext)(o);if(!e)throw new Error("useFeatureToggle must be used within FeatureToggleClientProvider");return e};var n=v.__importStar(r.default),o=(0,n.createContext)({isOn:_.isOn,toggles:null});t.FeatureToggleProvider=function(e){var t=e.children,r=e.featureToggleService;(0,n.useMemo)(function(){(0,_.set)(r)},[r]);var i=(0,n.useMemo)(function(){return{isOn:_.isOn,toggles:r}},[r]);return n.default.createElement(o.Provider,{value:i},t)}});n(g),g.FeatureToggleProvider,g.useFeatureToggle;var m=w,O=g;return n(o(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),v.__exportStar(m,t),v.__exportStar(O,t)}))});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(e,
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("react")):"function"==typeof define&&define.amd?define(["react"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).ReactorFeatureToggle=t(e.react)}(this,function(e){"use strict";var t,r=(t=e)&&"object"==typeof t&&"default"in t?t:{default:t};function n(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function o(e,t){return e(t={exports:{}},t.exports),t.exports}var u=Object.create?function(e,t,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(t,r);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,o)}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]};var i,a=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t},l=function(e){return(l=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r);return t})(e)},c=function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||u(t,e,r)},f=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r=l(e),n=0;n<r.length;n++)"default"!==r[n]&&u(t,e,r[n]);return a(t,e),t},s="6.1.0",d=((i={})[s]={},i),g=Object.freeze({__proto__:null,isOn:function(e,t){return t&&console.log("\n[DEBUG] Execution Time in milliseconds: ".concat(Date.now(),' version: "').concat(s,'" key: "').concat(e,'" settings: ').concat(JSON.stringify(d),"\n")),"string"==typeof e&&!!d[s][e]},set:function(e){d[s]=Object.assign({},d[s],e)}}),v=o(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.FeatureToggle=void 0,t.FeatureToggle=function(e){var t=e.featureName,r=function(e){return"!"===e[0]?!(0,g.isOn)(e.replace("!","")):(0,g.isOn)(e)};return("string"==typeof t?r(t):Array.isArray(t)&&t.every(r))?e.children:null}});n(v),v.FeatureToggle;var p=o(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.FeatureToggleProvider=void 0,t.useFeatureToggle=function(){var e=(0,o.useContext)(u);if(!e)throw new Error("useFeatureToggle must be used within FeatureToggleClientProvider");return e};var o=f(r.default),u=(0,o.createContext)({isOn:g.isOn,toggles:null});t.FeatureToggleProvider=function(e){var t=e.children,r=e.featureToggleService;(0,o.useMemo)(function(){(0,g.set)(r)},[r]);var n=(0,o.useMemo)(function(){return{isOn:g.isOn,toggles:r}},[r]);return o.default.createElement(u.Provider,{value:n},t)}});n(p),p.FeatureToggleProvider,p.useFeatureToggle;var O=v,y=p;return n(o(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),c(O,t),c(y,t)}))});
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "reactor-feature-toggle",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.0.0",
|
|
4
4
|
"description": "Your module to handle with feature toggles in ReactJS applications easier",
|
|
5
5
|
"author": "Will Mendes <willmendesneto@gmail.com> (http://github.com/willmendesneto)",
|
|
6
6
|
"keywords": [
|
|
@@ -30,23 +30,28 @@
|
|
|
30
30
|
"sideEffects": false,
|
|
31
31
|
"browser": "dist/umd/reactor-feature-toggle.js",
|
|
32
32
|
"jsnext:main": "dist/esm/index.js",
|
|
33
|
-
"es2015": "dist/cjs/index.js",
|
|
34
33
|
"cjs": "dist/cjs/index.js",
|
|
34
|
+
"exports": {
|
|
35
|
+
".": {
|
|
36
|
+
"types": "./dist/cjs/index.d.ts",
|
|
37
|
+
"import": "./dist/esm/index.js",
|
|
38
|
+
"require": "./dist/cjs/index.js"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
35
41
|
"scripts": {
|
|
36
|
-
"build": "npm run build:clean && npm run build:
|
|
37
|
-
"build:
|
|
42
|
+
"build": "npm run build:clean && npm run build:cjs && npm run build:esm && npm run build:umd",
|
|
43
|
+
"build:cjs": "tsc --project ./tsconfig.cjs.json --declaration --module commonjs --target es5 --outDir dist/cjs",
|
|
44
|
+
"build:umd": "rollup --config && npm run build:umd:min",
|
|
38
45
|
"build:umd:min": "uglifyjs --compress --mangle --screw-ie8 --comments -o dist/umd/reactor-feature-toggle.min.js -- dist/umd/reactor-feature-toggle.js && gzip dist/umd/reactor-feature-toggle.min.js -c > dist/umd/reactor-feature-toggle.min.js.gz",
|
|
39
|
-
"build:
|
|
40
|
-
"build:
|
|
41
|
-
"build:cjs": "tsc --project ./tsconfig.build.json --module commonjs --target es5 --outDir dist/cjs",
|
|
42
|
-
"build:clean": "rm -rf ./dist ./.jest ./coverage",
|
|
46
|
+
"build:esm": "tsc --project ./tsconfig.esm.json --outDir dist/esm",
|
|
47
|
+
"build:clean": "rm -rf ./dist ./coverage .tsbuildinfo",
|
|
43
48
|
"lint": "eslint --ext .ts,.tsx,.js src/",
|
|
44
49
|
"lint:fix": "eslint --ext .ts,.tsx,.js src/ --fix",
|
|
45
50
|
"lint:types": "tsc --noEmit",
|
|
46
51
|
"lint:types-watch": "tsc --noEmit --watch",
|
|
47
52
|
"prepack": "npm run preversion -s && npm run build -s",
|
|
48
|
-
"test": "
|
|
49
|
-
"test:watch": "
|
|
53
|
+
"test": "vitest --watch=false",
|
|
54
|
+
"test:watch": "vitest --watch",
|
|
50
55
|
"preversion": "npm run lint -s && npm run lint:types -s && npm run test -s",
|
|
51
56
|
"bundlesize": "bundlesize",
|
|
52
57
|
"coveralls": "cat ./coverage/lcov.info | ./node_modules/.bin/coveralls && rm -rf coverage",
|
|
@@ -54,11 +59,14 @@
|
|
|
54
59
|
"vc": "version-changelog CHANGELOG.md"
|
|
55
60
|
},
|
|
56
61
|
"dependencies": {
|
|
62
|
+
"@types/jsdom": "^27.0.0",
|
|
57
63
|
"feature-toggle-service": "^6.0.0",
|
|
64
|
+
"iltorb": "^2.4.5",
|
|
65
|
+
"parse5": "^6.0.0",
|
|
58
66
|
"tslib": "^2.3.0"
|
|
59
67
|
},
|
|
60
68
|
"devDependencies": {
|
|
61
|
-
"@babel/cli": "^7.
|
|
69
|
+
"@babel/cli": "^7.28.3",
|
|
62
70
|
"@babel/core": "^7.9.6",
|
|
63
71
|
"@babel/plugin-proposal-class-properties": "^7.5.5",
|
|
64
72
|
"@babel/plugin-proposal-export-namespace-from": "^7.5.2",
|
|
@@ -69,54 +77,52 @@
|
|
|
69
77
|
"@babel/preset-env": "^7.9.6",
|
|
70
78
|
"@babel/preset-react": "^7.9.4",
|
|
71
79
|
"@babel/preset-typescript": "^7.9.0",
|
|
72
|
-
"@babel/runtime": "^7.
|
|
73
|
-
"@testing-library/jest-dom": "^5.
|
|
74
|
-
"@testing-library/react": "^10.
|
|
80
|
+
"@babel/runtime": "^7.28.4",
|
|
81
|
+
"@testing-library/jest-dom": "^5.17.0",
|
|
82
|
+
"@testing-library/react": "^10.4.9",
|
|
75
83
|
"@types/enzyme": "^3.10.5",
|
|
76
|
-
"@types/jest": "^25.2.2",
|
|
77
84
|
"@types/react": "^16.9.35",
|
|
78
85
|
"@types/react-dom": "^16.9.8",
|
|
79
86
|
"@typescript-eslint/eslint-plugin": "^3.1.0",
|
|
80
87
|
"@typescript-eslint/parser": "^3.1.0",
|
|
88
|
+
"@vitejs/plugin-react": "^5.1.1",
|
|
89
|
+
"@vitest/ui": "^4.0.15",
|
|
81
90
|
"babel-eslint": "^10.0.2",
|
|
82
|
-
"babel-jest": "^26.0.1",
|
|
83
91
|
"babel-loader": "^8.1.0",
|
|
84
92
|
"babel-types": "^6.26.0",
|
|
85
|
-
"bundlesize": "^0.18.
|
|
93
|
+
"bundlesize": "^0.18.2",
|
|
86
94
|
"changelog-verify": "^1.1.2",
|
|
87
95
|
"confusing-browser-globals": "^1.0.9",
|
|
88
96
|
"coveralls": "^3.1.0",
|
|
89
97
|
"dtslint": "^3.6.4",
|
|
90
|
-
"enzyme": "^3.10.0",
|
|
91
|
-
"enzyme-adapter-react-16": "^1.15.2",
|
|
92
98
|
"eslint": "^7.0.0",
|
|
93
99
|
"eslint-config-prettier": "^6.11.0",
|
|
94
|
-
"eslint-plugin-import": "^2.
|
|
95
|
-
"eslint-plugin-jest": "^23.11.0",
|
|
100
|
+
"eslint-plugin-import": "^2.32.0",
|
|
96
101
|
"eslint-plugin-prettier": "^3.1.3",
|
|
97
102
|
"eslint-plugin-react": "^7.20.0",
|
|
98
103
|
"eslint-plugin-react-hooks": "^4.0.2",
|
|
99
|
-
"
|
|
104
|
+
"jsdom": "^27.2.0",
|
|
100
105
|
"prettier": "^2.0.5",
|
|
101
|
-
"react": "
|
|
102
|
-
"react-dom": "
|
|
103
|
-
"rollup": "^2.
|
|
104
|
-
"
|
|
105
|
-
"
|
|
106
|
-
"
|
|
106
|
+
"react": "18.2.0",
|
|
107
|
+
"react-dom": "18.2.0",
|
|
108
|
+
"rollup": "^2.58.3",
|
|
109
|
+
"rollup-plugin-commonjs": "^10.1.0",
|
|
110
|
+
"rollup-plugin-node-resolve": "^5.2.0",
|
|
111
|
+
"rollup-plugin-replace": "^2.2.0",
|
|
112
|
+
"rollup-plugin-terser": "^7.0.2",
|
|
113
|
+
"typescript": "^5.9.3",
|
|
114
|
+
"uglify-js": "3.9.4",
|
|
115
|
+
"version-changelog": "^3.1.1",
|
|
116
|
+
"vitest": "^4.0.15"
|
|
107
117
|
},
|
|
108
118
|
"peerDependencies": {
|
|
109
|
-
"react": ">=
|
|
110
|
-
"react-dom": ">=
|
|
119
|
+
"react": ">=18.2.0",
|
|
120
|
+
"react-dom": ">=18.2.0"
|
|
111
121
|
},
|
|
112
122
|
"bundlesize": [
|
|
113
123
|
{
|
|
114
124
|
"path": "./dist/umd/reactor-feature-toggle.min.js",
|
|
115
|
-
"maxSize": "
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
"path": "./dist/cjs/index.js",
|
|
119
|
-
"maxSize": "162B"
|
|
125
|
+
"maxSize": "1.1KB"
|
|
120
126
|
}
|
|
121
127
|
],
|
|
122
128
|
"engines": {
|
package/CHANGELOG.md
DELETED
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
# Change Log
|
|
2
|
-
|
|
3
|
-
All notable changes to this project will be documented in this file.
|
|
4
|
-
|
|
5
|
-
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
|
6
|
-
and this project adheres to [Semantic Versioning](http://semver.org/).
|
|
7
|
-
|
|
8
|
-
## [Unreleased][]
|
|
9
|
-
|
|
10
|
-
## [6.1.0][] - 2025-12-04
|
|
11
|
-
|
|
12
|
-
### Added
|
|
13
|
-
|
|
14
|
-
- Adding `useFeatureToggle()` context
|
|
15
|
-
|
|
16
|
-
## [6.0.1][] - 2025-12-04
|
|
17
|
-
|
|
18
|
-
### Fixed
|
|
19
|
-
|
|
20
|
-
- Fixed exported library types
|
|
21
|
-
|
|
22
|
-
## [6.0.0][] - 2025-12-04
|
|
23
|
-
|
|
24
|
-
### Updated
|
|
25
|
-
|
|
26
|
-
- Updating peerDependencies to accept react and react-dom >= v16
|
|
27
|
-
|
|
28
|
-
## [5.0.0][] - 2020-07-20
|
|
29
|
-
|
|
30
|
-
### Updated
|
|
31
|
-
|
|
32
|
-
- Breaking changes: updating `feature-toggle-service` to version 6.0.0. The new package behavior introduces combination instead of overriding. Since it's a different feature, it can affect nested provider components.
|
|
33
|
-
|
|
34
|
-
## [4.0.5][] - 2020-06-18
|
|
35
|
-
|
|
36
|
-
### Fixed
|
|
37
|
-
|
|
38
|
-
- Decreasing package download time
|
|
39
|
-
|
|
40
|
-
## [4.0.4][] - 2020-06-14
|
|
41
|
-
|
|
42
|
-
### Updated
|
|
43
|
-
|
|
44
|
-
- Update demo example to use Stackblitz
|
|
45
|
-
- Updating Github templates
|
|
46
|
-
|
|
47
|
-
## [4.0.3][] - 2020-06-14
|
|
48
|
-
|
|
49
|
-
### Updated
|
|
50
|
-
|
|
51
|
-
- Update demo example to use Stackblitz
|
|
52
|
-
- Updating Github templates
|
|
53
|
-
|
|
54
|
-
## [4.0.2][] - 2020-06-14
|
|
55
|
-
|
|
56
|
-
### Updated
|
|
57
|
-
|
|
58
|
-
- Minor changes
|
|
59
|
-
|
|
60
|
-
## [4.0.1][] - 2020-06-14
|
|
61
|
-
|
|
62
|
-
### Updated
|
|
63
|
-
|
|
64
|
-
- Update demo example to use Stackblitz
|
|
65
|
-
- Updating Github templates
|
|
66
|
-
|
|
67
|
-
## [4.0.0][] - 2020-06-14
|
|
68
|
-
|
|
69
|
-
### Added
|
|
70
|
-
|
|
71
|
-
- Supporting `!` prefix to change the boolean value to false on the `featureName` props check
|
|
72
|
-
|
|
73
|
-
```ts
|
|
74
|
-
{
|
|
75
|
-
enableSecondContent: false,
|
|
76
|
-
}
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
```jsx
|
|
80
|
-
<FeatureToggle featureName={'!enableSecondContent'}>
|
|
81
|
-
<p>
|
|
82
|
-
This content is disabled, but should be displayed since it has `!` prefix at
|
|
83
|
-
`featureName`
|
|
84
|
-
</p>
|
|
85
|
-
</FeatureToggle>
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
- Adding support for accept string or an array or strings as feature toggle configuration
|
|
89
|
-
|
|
90
|
-
Example using string
|
|
91
|
-
|
|
92
|
-
```jsx
|
|
93
|
-
<FeatureToggle featureName={'enableMainContent'}>
|
|
94
|
-
<div className="content">
|
|
95
|
-
<p>This content is enabled if `enableMainContent` is true</p>
|
|
96
|
-
</div>
|
|
97
|
-
</FeatureToggle>
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
Example using Array of strings
|
|
101
|
-
|
|
102
|
-
```jsx
|
|
103
|
-
<FeatureToggle featureName={['enableMainContent', 'enableDescriptionContent']}>
|
|
104
|
-
<div className="content">
|
|
105
|
-
<p>
|
|
106
|
-
This content is enabled if `enableMainContent` and
|
|
107
|
-
`enableDescriptionContent` are both truthly
|
|
108
|
-
</p>
|
|
109
|
-
</div>
|
|
110
|
-
</FeatureToggle>
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
### Updated
|
|
114
|
-
|
|
115
|
-
- Breaking changes:
|
|
116
|
-
- _`showWhenDisabled`_ prop was removed since we can have the same behavior
|
|
117
|
-
by using `FeatureToggle` component and passing `!` as a prefix for the
|
|
118
|
-
`featureName` prop value.
|
|
119
|
-
|
|
120
|
-
So if you have this configuration for your feature toggle
|
|
121
|
-
|
|
122
|
-
```ts
|
|
123
|
-
{
|
|
124
|
-
enableSecondContent: false,
|
|
125
|
-
}
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
You should replace your component configuration from this way
|
|
129
|
-
|
|
130
|
-
```jsx
|
|
131
|
-
<FeatureToggle featureName={'enableSecondContent'} showWhenDisabled>
|
|
132
|
-
<p>
|
|
133
|
-
This content is disabled, but should be displayed since it has
|
|
134
|
-
`showWhenDisabled` prop
|
|
135
|
-
</p>
|
|
136
|
-
</FeatureToggle>
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
And pass `featureName` prop with `!` prefix to keep the same behavior on WebApp
|
|
140
|
-
|
|
141
|
-
```jsx
|
|
142
|
-
<FeatureToggle featureName={'!enableSecondContent'}>
|
|
143
|
-
<p>
|
|
144
|
-
This content is disabled, but should be displayed since it has `!` prefix at
|
|
145
|
-
`featureName`
|
|
146
|
-
</p>
|
|
147
|
-
</FeatureToggle>
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
## [3.0.0][] - 2020-06-03
|
|
151
|
-
|
|
152
|
-
### Updated
|
|
153
|
-
|
|
154
|
-
- Bumping `feature-toggle-service` to 4.0.0
|
|
155
|
-
- Decreasing bundle size to `303B`
|
|
156
|
-
- Migrated Test Framework from Mocha to Jest
|
|
157
|
-
- Code Cleanup
|
|
158
|
-
|
|
159
|
-
### Fixed
|
|
160
|
-
|
|
161
|
-
- Adding missed dependencies
|
|
162
|
-
- Adding different build distrubutions: UMD, CommonJS, ES2015 and ESM
|
|
163
|
-
|
|
164
|
-
### Added
|
|
165
|
-
|
|
166
|
-
- Decreasing the bundle size to 1KB minified and Gzipped
|
|
167
|
-
|
|
168
|
-
[unreleased]: https://github.com/willmendesneto/reactor-feature-toggle/compare/v3.0.0...HEAD
|
|
169
|
-
[3.0.0]: https://github.com/willmendesneto/reactor-feature-toggle/tree/v3.0.0
|
|
170
|
-
[unreleased]: https://github.com/willmendesneto/reactor-feature-toggle/compare/v4.0.0...HEAD
|
|
171
|
-
[4.0.0]: https://github.com/willmendesneto/reactor-feature-toggle/tree/v4.0.0
|
|
172
|
-
[unreleased]: https://github.com/willmendesneto/reactor-feature-toggle/compare/v4.0.2...HEAD
|
|
173
|
-
[4.0.2]: https://github.com/willmendesneto/reactor-feature-toggle/compare/v4.0.1...v4.0.2
|
|
174
|
-
[4.0.1]: https://github.com/willmendesneto/reactor-feature-toggle/tree/v4.0.1
|
|
175
|
-
[unreleased]: https://github.com/willmendesneto/reactor-feature-toggle/compare/v4.0.3...HEAD
|
|
176
|
-
[4.0.3]: https://github.com/willmendesneto/reactor-feature-toggle/tree/v4.0.3
|
|
177
|
-
[unreleased]: https://github.com/willmendesneto/reactor-feature-toggle/compare/v4.0.3...HEAD
|
|
178
|
-
[unreleased]: https://github.com/willmendesneto/reactor-feature-toggle/compare/v4.0.4...HEAD
|
|
179
|
-
[4.0.4]: https://github.com/willmendesneto/reactor-feature-toggle/tree/v4.0.4
|
|
180
|
-
[unreleased]: https://github.com/willmendesneto/reactor-feature-toggle/compare/v4.0.5...HEAD
|
|
181
|
-
[4.0.5]: https://github.com/willmendesneto/reactor-feature-toggle/tree/v4.0.5
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
[Unreleased]: https://github.com/willmendesneto/reactor-feature-toggle/compare/v6.1.0...HEAD
|
|
185
|
-
[6.1.0]: https://github.com/willmendesneto/reactor-feature-toggle/compare/v6.0.1...v6.1.0
|
|
186
|
-
[6.0.1]: https://github.com/willmendesneto/reactor-feature-toggle/compare/v6.0.0...v6.0.1
|
|
187
|
-
[6.0.0]: https://github.com/willmendesneto/reactor-feature-toggle/compare/v5.0.0...v6.0.0
|
|
188
|
-
[5.0.0]: https://github.com/willmendesneto/reactor-feature-toggle/tree/v5.0.0
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { ReactNode } from 'react';
|
|
2
|
-
import { FeatureToggleServiceConfig } from 'feature-toggle-service';
|
|
3
|
-
export interface ReactorFeatureToggleProviderProps {
|
|
4
|
-
children: ReactNode;
|
|
5
|
-
featureToggleService: FeatureToggleServiceConfig;
|
|
6
|
-
}
|
|
7
|
-
interface FeatureToggleContextType {
|
|
8
|
-
isOn: (featureName: string) => boolean;
|
|
9
|
-
toggles: FeatureToggleServiceConfig | null;
|
|
10
|
-
}
|
|
11
|
-
export declare const FeatureToggleProvider: ({ children, featureToggleService, }: ReactorFeatureToggleProviderProps) => JSX.Element;
|
|
12
|
-
export declare function useFeatureToggle(): FeatureToggleContextType;
|
|
13
|
-
export {};
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import React, { createContext, useContext } from 'react';
|
|
2
|
-
import { set, isOn } from 'feature-toggle-service';
|
|
3
|
-
const FeatureToggleContext = createContext({
|
|
4
|
-
isOn,
|
|
5
|
-
toggles: null,
|
|
6
|
-
});
|
|
7
|
-
export const FeatureToggleProvider = ({ children, featureToggleService, }) => {
|
|
8
|
-
set(featureToggleService);
|
|
9
|
-
return (React.createElement(FeatureToggleContext.Provider, { value: { isOn, toggles: featureToggleService } }, children));
|
|
10
|
-
};
|
|
11
|
-
export function useFeatureToggle() {
|
|
12
|
-
const context = useContext(FeatureToggleContext);
|
|
13
|
-
if (!context) {
|
|
14
|
-
throw new Error('useFeatureToggle must be used within FeatureToggleClientProvider');
|
|
15
|
-
}
|
|
16
|
-
return context;
|
|
17
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { isOn } from 'feature-toggle-service';
|
|
2
|
-
/**
|
|
3
|
-
* Checks if feature toggle is turned on of turned off
|
|
4
|
-
*
|
|
5
|
-
* @param {string} toggle: name of the feature toggle previously configured via `FeatureToggleProvider`
|
|
6
|
-
*
|
|
7
|
-
* @returns boolean
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* @param {(string[] | string)} featureName: : name of the feature toggle previously configured via `FeatureToggleProvider`
|
|
13
|
-
*
|
|
14
|
-
* @returns boolean
|
|
15
|
-
*/
|
|
16
|
-
const isOnCheck = (featureName) => {
|
|
17
|
-
const isFeatureToggleOn = (toggle) => toggle[0] === '!' ? !isOn(toggle.replace('!', '')) : isOn(toggle);
|
|
18
|
-
if (typeof featureName === 'string') {
|
|
19
|
-
return isFeatureToggleOn(featureName);
|
|
20
|
-
}
|
|
21
|
-
else if (Array.isArray(featureName)) {
|
|
22
|
-
return featureName.every(isFeatureToggleOn);
|
|
23
|
-
}
|
|
24
|
-
return false;
|
|
25
|
-
};
|
|
26
|
-
export const FeatureToggle = (props) => {
|
|
27
|
-
const showContent = isOnCheck(props.featureName);
|
|
28
|
-
return showContent ? props.children : null;
|
|
29
|
-
};
|
package/dist/es2015/index.d.ts
DELETED
package/dist/es2015/index.js
DELETED