@feature-gate/core 0.1.0-beta.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 +21 -0
- package/README.md +74 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +85 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/base.d.ts +3 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +29 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/mock.d.ts +7 -0
- package/dist/providers/mock.d.ts.map +1 -0
- package/dist/providers/mock.js +38 -0
- package/dist/providers/mock.js.map +1 -0
- package/dist/providers/statsig.d.ts +7 -0
- package/dist/providers/statsig.d.ts.map +1 -0
- package/dist/providers/statsig.js +61 -0
- package/dist/providers/statsig.js.map +1 -0
- package/dist/providers/unleash.d.ts +10 -0
- package/dist/providers/unleash.d.ts.map +1 -0
- package/dist/providers/unleash.js +84 -0
- package/dist/providers/unleash.js.map +1 -0
- package/dist/types.d.ts +46 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +54 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 feature-gate
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
<h1 align="center">
|
|
2
|
+
<code>@feature-gate/core</code>
|
|
3
|
+
</h1>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
A TypeScript library that gives you a single, consistent API to evaluate feature flags and read remote config values — no matter which backend you use.
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# bun
|
|
13
|
+
bun add @feature-gate/core
|
|
14
|
+
|
|
15
|
+
# npm
|
|
16
|
+
npm install @feature-gate/core
|
|
17
|
+
|
|
18
|
+
# pnpm
|
|
19
|
+
pnpm add @feature-gate/core
|
|
20
|
+
|
|
21
|
+
# yarn
|
|
22
|
+
yarn add @feature-gate/core
|
|
23
|
+
|
|
24
|
+
# deno
|
|
25
|
+
deno add npm:@feature-gate/core
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Each provider also requires its own peer dependency:
|
|
29
|
+
|
|
30
|
+
| Provider | Command |
|
|
31
|
+
|----------|---------|
|
|
32
|
+
| Statsig | `npm install statsig-node` |
|
|
33
|
+
| Unleash | `npm install unleash-client` |
|
|
34
|
+
| Mock | *(no extra package needed)* |
|
|
35
|
+
|
|
36
|
+
## Quick Example
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
import { featureManagement, statsigProvider } from '@feature-gate/core';
|
|
40
|
+
|
|
41
|
+
const provider = unleashProvider({
|
|
42
|
+
url: 'https://unleash.example.com/api',
|
|
43
|
+
token: process.env.UNLEASH_TOKEN!,
|
|
44
|
+
appName: 'my-service',
|
|
45
|
+
environment: 'production', // optional, defaults to Unleash default
|
|
46
|
+
refreshInterval: 30, // optional, seconds between rule refreshes (default: 15)
|
|
47
|
+
});
|
|
48
|
+
// or
|
|
49
|
+
const provider = statsigProvider({
|
|
50
|
+
serverSecret: process.env.STATSIG_SERVER_SECRET!,
|
|
51
|
+
environment: 'staging',
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
await provider.initialize();
|
|
55
|
+
|
|
56
|
+
const service = featureManagement(provider);
|
|
57
|
+
|
|
58
|
+
const enabled = await service.isEnabled({
|
|
59
|
+
flag: 'new-checkout',
|
|
60
|
+
context: { userId: 'user-123', ip: '1.2.3.4' },
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const config = await service.getConfig<{ timeout: number }>({
|
|
64
|
+
key: 'api-settings',
|
|
65
|
+
context: { userId: 'user-123' },
|
|
66
|
+
fallback: { timeout: 5000 },
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
await service.shutdown();
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Documentation
|
|
73
|
+
|
|
74
|
+
Full documentation is available in the [`docs/`](./docs) folder.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { FeatureManagementService, FeatureProvider } from './types';
|
|
2
|
+
export { baseProvider } from './providers/base';
|
|
3
|
+
export type { MockProviderConfig } from './providers/mock';
|
|
4
|
+
export { mockProvider } from './providers/mock';
|
|
5
|
+
export type { AreEnabledSyncParams as AreEnabledParams, FeatureContext, FeatureManagementService, FeatureProvider, GetConfigSyncParams as GetConfigParams, GetServiceConfigSyncParams as GetServiceConfigParams, IsEnabledSyncParams as IsEnabledParams, } from './types';
|
|
6
|
+
export declare const featureManagement: (provider: FeatureProvider) => FeatureManagementService;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,wBAAwB,EACxB,eAAe,EAGhB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,YAAY,EACV,oBAAoB,IAAI,gBAAgB,EACxC,cAAc,EACd,wBAAwB,EACxB,eAAe,EACf,mBAAmB,IAAI,eAAe,EACtC,0BAA0B,IAAI,sBAAsB,EACpD,mBAAmB,IAAI,eAAe,GACvC,MAAM,SAAS,CAAC;AAIjB,eAAO,MAAM,iBAAiB,aAAc,eAAe,KAAG,wBA0D7D,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.featureManagement = exports.mockProvider = exports.baseProvider = void 0;
|
|
7
|
+
const pino_1 = __importDefault(require("pino"));
|
|
8
|
+
var base_1 = require("./providers/base");
|
|
9
|
+
Object.defineProperty(exports, "baseProvider", { enumerable: true, get: function () { return base_1.baseProvider; } });
|
|
10
|
+
var mock_1 = require("./providers/mock");
|
|
11
|
+
Object.defineProperty(exports, "mockProvider", { enumerable: true, get: function () { return mock_1.mockProvider; } });
|
|
12
|
+
const log = (0, pino_1.default)({ level: 'error' });
|
|
13
|
+
const featureManagement = (provider) => {
|
|
14
|
+
return {
|
|
15
|
+
isEnabledSync: ({ flag, context }) => {
|
|
16
|
+
if (!provider.initialized)
|
|
17
|
+
return false;
|
|
18
|
+
try {
|
|
19
|
+
return provider.isEnabledSync({ flag, context });
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
log.error({ error, flag }, 'FLAG_EVALUATION_FAILED');
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
areEnabledSync: ({ flags, context }) => {
|
|
27
|
+
if (!provider.initialized)
|
|
28
|
+
return flags.map(() => false);
|
|
29
|
+
try {
|
|
30
|
+
return provider.areEnabledSync({ flags, context });
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
log.error({ error, flags }, 'FLAGS_EVALUATION_FAILED');
|
|
34
|
+
return flags.map(() => false);
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
getConfigSync: ({ key, context, fallback }) => {
|
|
38
|
+
if (!provider.initialized)
|
|
39
|
+
return fallback;
|
|
40
|
+
try {
|
|
41
|
+
return provider.getConfigSync({ key, context, fallback: fallback });
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
log.error({ error, key }, 'CONFIG_RETRIEVAL_FAILED');
|
|
45
|
+
return fallback;
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
isEnabled: async ({ flag, context }) => {
|
|
49
|
+
if (!provider.initialized)
|
|
50
|
+
return false;
|
|
51
|
+
try {
|
|
52
|
+
return await provider.isEnabled({ flag, context });
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
log.error({ error, flag }, 'FLAG_EVALUATION_FAILED');
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
areEnabled: async ({ flags, context }) => {
|
|
60
|
+
if (!provider.initialized)
|
|
61
|
+
return flags.map(() => false);
|
|
62
|
+
try {
|
|
63
|
+
return await provider.areEnabled({ flags, context });
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
log.error({ error, flags }, 'FLAGS_EVALUATION_FAILED');
|
|
67
|
+
return flags.map(() => false);
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
getConfig: async ({ key, context, fallback }) => {
|
|
71
|
+
if (!provider.initialized)
|
|
72
|
+
return fallback;
|
|
73
|
+
try {
|
|
74
|
+
return await provider.getConfig({ key, context, fallback: fallback });
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
log.error({ error, key }, 'CONFIG_RETRIEVAL_FAILED');
|
|
78
|
+
return fallback;
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
shutdown: () => provider.shutdown(),
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
exports.featureManagement = featureManagement;
|
|
85
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAIhD,eAAO,MAAM,YAAY,EAAE,eAgC1B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.baseProvider = void 0;
|
|
4
|
+
exports.baseProvider = {
|
|
5
|
+
initialized: false,
|
|
6
|
+
async initialize() {
|
|
7
|
+
this.initialized = true;
|
|
8
|
+
},
|
|
9
|
+
async shutdown() { },
|
|
10
|
+
isEnabledSync() {
|
|
11
|
+
throw new Error('FeatureProvider: "isEnabledSync" is not implemented');
|
|
12
|
+
},
|
|
13
|
+
areEnabledSync() {
|
|
14
|
+
throw new Error('FeatureProvider: "areEnabledSync" is not implemented');
|
|
15
|
+
},
|
|
16
|
+
getConfigSync() {
|
|
17
|
+
throw new Error('FeatureProvider: "getConfigSync" is not implemented');
|
|
18
|
+
},
|
|
19
|
+
async isEnabled() {
|
|
20
|
+
throw new Error('FeatureProvider: "isEnabled" is not implemented');
|
|
21
|
+
},
|
|
22
|
+
async areEnabled() {
|
|
23
|
+
throw new Error('FeatureProvider: "areEnabled" is not implemented');
|
|
24
|
+
},
|
|
25
|
+
async getConfig() {
|
|
26
|
+
throw new Error('FeatureProvider: "getConfig" is not implemented');
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":";;;AAIa,QAAA,YAAY,GAAoB;IAC3C,WAAW,EAAE,KAAK;IAElB,KAAK,CAAC,UAAU;QACb,IAAwB,CAAC,WAAW,GAAG,IAAI,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,QAAQ,KAAmB,CAAC;IAElC,aAAa;QACX,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,cAAc;QACZ,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,aAAa;QACX,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { FeatureProvider } from '../types';
|
|
2
|
+
export interface MockProviderConfig {
|
|
3
|
+
configs?: Record<string, unknown>;
|
|
4
|
+
flags?: Record<string, boolean>;
|
|
5
|
+
}
|
|
6
|
+
export declare const mockProvider: (config?: MockProviderConfig) => FeatureProvider;
|
|
7
|
+
//# sourceMappingURL=mock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/providers/mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwB,eAAe,EAA4C,MAAM,UAAU,CAAC;AAEhH,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,eAAO,MAAM,YAAY,YAAY,kBAAkB,KAAQ,eAgC9D,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mockProvider = void 0;
|
|
4
|
+
const mockProvider = (config = {}) => {
|
|
5
|
+
let initialized = false;
|
|
6
|
+
return {
|
|
7
|
+
get initialized() {
|
|
8
|
+
return initialized;
|
|
9
|
+
},
|
|
10
|
+
initialize: () => {
|
|
11
|
+
initialized = true;
|
|
12
|
+
return Promise.resolve();
|
|
13
|
+
},
|
|
14
|
+
isEnabledSync: ({ flag }) => {
|
|
15
|
+
return config.flags?.[flag] ?? false;
|
|
16
|
+
},
|
|
17
|
+
areEnabledSync: ({ flags }) => {
|
|
18
|
+
return flags.map((flag) => config.flags?.[flag] ?? false);
|
|
19
|
+
},
|
|
20
|
+
getConfigSync: ({ key, fallback }) => {
|
|
21
|
+
return config.configs?.[key] ?? fallback;
|
|
22
|
+
},
|
|
23
|
+
isEnabled: async ({ flag }) => {
|
|
24
|
+
return Promise.resolve(config.flags?.[flag] ?? false);
|
|
25
|
+
},
|
|
26
|
+
areEnabled: async ({ flags }) => {
|
|
27
|
+
return Promise.resolve(flags.map((flag) => config.flags?.[flag] ?? false));
|
|
28
|
+
},
|
|
29
|
+
getConfig: async ({ key, fallback }) => {
|
|
30
|
+
return Promise.resolve(config.configs?.[key] ?? fallback);
|
|
31
|
+
},
|
|
32
|
+
shutdown: () => {
|
|
33
|
+
return Promise.resolve();
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
exports.mockProvider = mockProvider;
|
|
38
|
+
//# sourceMappingURL=mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/providers/mock.ts"],"names":[],"mappings":";;;AAOO,MAAM,YAAY,GAAG,CAAC,MAAM,GAAuB,EAAE,EAAmB,EAAE;IAC/E,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,OAAO;QACL,IAAI,WAAW;YACb,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,UAAU,EAAE,GAAkB,EAAE;YAC9B,WAAW,GAAG,IAAI,CAAC;YACnB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QACD,aAAa,EAAE,CAAC,EAAE,IAAI,EAAuB,EAAE,EAAE;YAC/C,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;QACvC,CAAC;QACD,cAAc,EAAE,CAAC,EAAE,KAAK,EAAwB,EAAa,EAAE;YAC7D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;QAC5D,CAAC;QACD,aAAa,EAAE,CAAI,EAAE,GAAG,EAAE,QAAQ,EAA0B,EAAK,EAAE;YACjE,OAAQ,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,CAAO,IAAI,QAAQ,CAAC;QAClD,CAAC;QACD,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAuB,EAAE,EAAE;YACjD,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;QACxD,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAwB,EAAsB,EAAE;YACxE,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,SAAS,EAAE,KAAK,EAAK,EAAE,GAAG,EAAE,QAAQ,EAA0B,EAAc,EAAE;YAC5E,OAAO,OAAO,CAAC,OAAO,CAAE,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,CAAO,IAAI,QAAQ,CAAC,CAAC;QACnE,CAAC;QACD,QAAQ,EAAE,GAAG,EAAE;YACb,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAhCW,QAAA,YAAY,GAAZ,YAAY,CAgCvB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { FeatureProvider } from '../types';
|
|
2
|
+
export interface StatsigProviderConfig {
|
|
3
|
+
environment?: string;
|
|
4
|
+
serverSecret: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const statsigProvider: (config: StatsigProviderConfig) => FeatureProvider;
|
|
7
|
+
//# sourceMappingURL=statsig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statsig.d.ts","sourceRoot":"","sources":["../../src/providers/statsig.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,eAAe,EAGhB,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAWD,eAAO,MAAM,eAAe,WAAY,qBAAqB,KAAG,eA6C/D,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.statsigProvider = void 0;
|
|
7
|
+
const statsig_node_1 = __importDefault(require("statsig-node"));
|
|
8
|
+
const mapContextToStatsigUser = (ctx) => {
|
|
9
|
+
return {
|
|
10
|
+
custom: ctx?.properties,
|
|
11
|
+
customIDs: ctx?.sessionId ? { sessionId: ctx.sessionId } : {},
|
|
12
|
+
ip: ctx?.ip,
|
|
13
|
+
userID: ctx?.userId,
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
const statsigProvider = (config) => {
|
|
17
|
+
let initialized = false;
|
|
18
|
+
return {
|
|
19
|
+
get initialized() {
|
|
20
|
+
return initialized;
|
|
21
|
+
},
|
|
22
|
+
initialize: async () => {
|
|
23
|
+
await statsig_node_1.default.initialize(config.serverSecret, {
|
|
24
|
+
environment: { tier: config.environment ?? 'development' },
|
|
25
|
+
});
|
|
26
|
+
initialized = true;
|
|
27
|
+
},
|
|
28
|
+
isEnabledSync: ({ flag, context }) => {
|
|
29
|
+
const statsigUser = mapContextToStatsigUser(context);
|
|
30
|
+
return statsig_node_1.default.checkGate(statsigUser, flag);
|
|
31
|
+
},
|
|
32
|
+
areEnabledSync: ({ flags, context }) => {
|
|
33
|
+
const statsigUser = mapContextToStatsigUser(context);
|
|
34
|
+
return flags.map((flag) => statsig_node_1.default.checkGate(statsigUser, flag));
|
|
35
|
+
},
|
|
36
|
+
getConfigSync: ({ key, context, fallback }) => {
|
|
37
|
+
const statsigUser = mapContextToStatsigUser(context);
|
|
38
|
+
return statsig_node_1.default.getConfig(statsigUser, key).value ?? fallback;
|
|
39
|
+
},
|
|
40
|
+
isEnabled: async ({ flag, context }) => {
|
|
41
|
+
const statsigUser = mapContextToStatsigUser(context);
|
|
42
|
+
return Promise.resolve(statsig_node_1.default.checkGate(statsigUser, flag));
|
|
43
|
+
},
|
|
44
|
+
areEnabled: async ({ flags, context }) => {
|
|
45
|
+
const statsigUser = mapContextToStatsigUser(context);
|
|
46
|
+
return Promise.all(flags.map(async (flag) => {
|
|
47
|
+
return await Promise.resolve(statsig_node_1.default.checkGate(statsigUser, flag));
|
|
48
|
+
}));
|
|
49
|
+
},
|
|
50
|
+
getConfig: ({ key, context, fallback }) => {
|
|
51
|
+
const statsigUser = mapContextToStatsigUser(context);
|
|
52
|
+
return Promise.resolve(statsig_node_1.default.getConfig(statsigUser, key).value ?? fallback);
|
|
53
|
+
},
|
|
54
|
+
shutdown: () => {
|
|
55
|
+
statsig_node_1.default.shutdown();
|
|
56
|
+
return Promise.resolve();
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
exports.statsigProvider = statsigProvider;
|
|
61
|
+
//# sourceMappingURL=statsig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statsig.js","sourceRoot":"","sources":["../../src/providers/statsig.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { FeatureProvider } from '../types';
|
|
2
|
+
export interface UnleashProviderConfig {
|
|
3
|
+
appName: string;
|
|
4
|
+
environment?: string;
|
|
5
|
+
refreshInterval?: number;
|
|
6
|
+
token: string;
|
|
7
|
+
url: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const unleashProvider: (config: UnleashProviderConfig) => FeatureProvider;
|
|
10
|
+
//# sourceMappingURL=unleash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unleash.d.ts","sourceRoot":"","sources":["../../src/providers/unleash.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,eAAe,EAGhB,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAyBD,eAAO,MAAM,eAAe,WAAY,qBAAqB,KAAG,eA4D/D,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.unleashProvider = void 0;
|
|
4
|
+
const unleash_client_1 = require("unleash-client");
|
|
5
|
+
const mapFeatureContextToUnleashContext = (ctx) => ({
|
|
6
|
+
environment: ctx?.environment,
|
|
7
|
+
properties: ctx?.properties,
|
|
8
|
+
remoteAddress: ctx?.ip,
|
|
9
|
+
sessionId: ctx?.sessionId,
|
|
10
|
+
userId: ctx?.userId,
|
|
11
|
+
});
|
|
12
|
+
const resolveConfig = (client, { key, context, fallback }) => {
|
|
13
|
+
if (!client)
|
|
14
|
+
return fallback;
|
|
15
|
+
const variant = client.getVariant(key, mapFeatureContextToUnleashContext(context));
|
|
16
|
+
if (variant?.enabled && variant.payload) {
|
|
17
|
+
const { type, value } = variant.payload;
|
|
18
|
+
if (type === 'json')
|
|
19
|
+
return JSON.parse(value);
|
|
20
|
+
if (type === 'string' || type === 'csv')
|
|
21
|
+
return String(value);
|
|
22
|
+
if (type === 'number')
|
|
23
|
+
return Number(value);
|
|
24
|
+
}
|
|
25
|
+
return fallback;
|
|
26
|
+
};
|
|
27
|
+
const unleashProvider = (config) => {
|
|
28
|
+
let client = null;
|
|
29
|
+
let initialized = false;
|
|
30
|
+
return {
|
|
31
|
+
get initialized() {
|
|
32
|
+
return initialized;
|
|
33
|
+
},
|
|
34
|
+
initialize: () => {
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
client = new unleash_client_1.Unleash({
|
|
37
|
+
appName: config.appName,
|
|
38
|
+
customHeaders: { Authorization: config.token },
|
|
39
|
+
environment: config.environment ?? 'development',
|
|
40
|
+
refreshInterval: config.refreshInterval ?? 15,
|
|
41
|
+
url: config.url,
|
|
42
|
+
});
|
|
43
|
+
const timer = setTimeout(() => reject(new Error('Unleash init timeout')), 30000);
|
|
44
|
+
client.once('ready', () => {
|
|
45
|
+
clearTimeout(timer);
|
|
46
|
+
initialized = true;
|
|
47
|
+
resolve();
|
|
48
|
+
});
|
|
49
|
+
client.once('error', (err) => {
|
|
50
|
+
clearTimeout(timer);
|
|
51
|
+
reject(err);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
isEnabledSync: ({ flag, context }) => {
|
|
56
|
+
const unleashContext = mapFeatureContextToUnleashContext(context);
|
|
57
|
+
return client?.isEnabled(flag, unleashContext) ?? false;
|
|
58
|
+
},
|
|
59
|
+
areEnabledSync: ({ flags, context }) => {
|
|
60
|
+
const unleashContext = mapFeatureContextToUnleashContext(context);
|
|
61
|
+
return flags.map((flag) => client?.isEnabled(flag, unleashContext) ?? false);
|
|
62
|
+
},
|
|
63
|
+
getConfigSync: (params) => {
|
|
64
|
+
return resolveConfig(client, params);
|
|
65
|
+
},
|
|
66
|
+
isEnabled: ({ flag, context }) => {
|
|
67
|
+
const unleashContext = mapFeatureContextToUnleashContext(context);
|
|
68
|
+
return Promise.resolve(client?.isEnabled(flag, unleashContext) ?? false);
|
|
69
|
+
},
|
|
70
|
+
areEnabled: ({ flags, context }) => {
|
|
71
|
+
const unleashContext = mapFeatureContextToUnleashContext(context);
|
|
72
|
+
return Promise.all(flags.map((flag) => Promise.resolve(client?.isEnabled(flag, unleashContext) ?? false)));
|
|
73
|
+
},
|
|
74
|
+
getConfig: (params) => {
|
|
75
|
+
return Promise.resolve(resolveConfig(client, params));
|
|
76
|
+
},
|
|
77
|
+
shutdown: () => {
|
|
78
|
+
client?.destroy();
|
|
79
|
+
return Promise.resolve();
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
exports.unleashProvider = unleashProvider;
|
|
84
|
+
//# sourceMappingURL=unleash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unleash.js","sourceRoot":"","sources":["../../src/providers/unleash.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export interface FeatureContext {
|
|
2
|
+
environment?: string;
|
|
3
|
+
ip?: string;
|
|
4
|
+
properties?: Record<string, string>;
|
|
5
|
+
sessionId?: string;
|
|
6
|
+
userId?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface GetServiceConfigSyncParams<T> {
|
|
9
|
+
context?: FeatureContext;
|
|
10
|
+
fallback?: T;
|
|
11
|
+
key: string;
|
|
12
|
+
}
|
|
13
|
+
export interface IsEnabledSyncParams {
|
|
14
|
+
context?: FeatureContext;
|
|
15
|
+
flag: string;
|
|
16
|
+
}
|
|
17
|
+
export interface AreEnabledSyncParams {
|
|
18
|
+
context?: FeatureContext;
|
|
19
|
+
flags: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface FeatureManagementService {
|
|
22
|
+
isEnabledSync(params: IsEnabledSyncParams): boolean;
|
|
23
|
+
areEnabledSync(params: AreEnabledSyncParams): boolean[];
|
|
24
|
+
getConfigSync<T>(params: GetServiceConfigSyncParams<T>): T | undefined;
|
|
25
|
+
isEnabled(params: IsEnabledSyncParams): Promise<boolean>;
|
|
26
|
+
areEnabled(params: AreEnabledSyncParams): Promise<boolean[]>;
|
|
27
|
+
getConfig<T>(params: GetServiceConfigSyncParams<T>): Promise<T | undefined>;
|
|
28
|
+
shutdown(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
export interface GetConfigSyncParams<T> {
|
|
31
|
+
key: string;
|
|
32
|
+
fallback: T;
|
|
33
|
+
context?: FeatureContext;
|
|
34
|
+
}
|
|
35
|
+
export interface FeatureProvider {
|
|
36
|
+
readonly initialized: boolean;
|
|
37
|
+
initialize(): Promise<void>;
|
|
38
|
+
isEnabledSync(params: IsEnabledSyncParams): boolean;
|
|
39
|
+
areEnabledSync(params: AreEnabledSyncParams): boolean[];
|
|
40
|
+
getConfigSync<T>(params: GetConfigSyncParams<T>): T;
|
|
41
|
+
isEnabled(params: IsEnabledSyncParams): Promise<boolean>;
|
|
42
|
+
areEnabled(params: AreEnabledSyncParams): Promise<boolean[]>;
|
|
43
|
+
getConfig<T>(params: GetConfigSyncParams<T>): Promise<T>;
|
|
44
|
+
shutdown(): Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC;IACpD,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,EAAE,CAAC;IACxD,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,0BAA0B,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IACvE,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,UAAU,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7D,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,0BAA0B,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC5E,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,CAAC,CAAC;IACZ,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC;IACpD,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,EAAE,CAAC;IACxD,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpD,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,UAAU,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7D,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACzD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@feature-gate/core",
|
|
3
|
+
"version": "0.1.0-beta.0",
|
|
4
|
+
"description": "Core library for feature-gate",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"build:watch": "tsc --watch",
|
|
13
|
+
"typecheck": "tsc --noEmit",
|
|
14
|
+
"clean": "rm -rf dist",
|
|
15
|
+
"prepublishOnly": "npm run clean && npm run build",
|
|
16
|
+
"test": "vitest run",
|
|
17
|
+
"test:watch": "vitest",
|
|
18
|
+
"lint": "biome lint .",
|
|
19
|
+
"linter-fix": "biome format --write .",
|
|
20
|
+
"check": "biome check --write ."
|
|
21
|
+
},
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "https://github.com/feature-gate/core-js.git"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"feature-gate",
|
|
28
|
+
"feature-flags",
|
|
29
|
+
"dynamic-configuration",
|
|
30
|
+
"feature-management"
|
|
31
|
+
],
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"i": "^0.3.7",
|
|
35
|
+
"npm": "^12.0.1",
|
|
36
|
+
"pino": "^10.3.1",
|
|
37
|
+
"statsig-node": "^6.5.1",
|
|
38
|
+
"unleash-client": "^6.0.0"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@biomejs/biome": "^2.5.4",
|
|
42
|
+
"@faker-js/faker": "^8.4.1",
|
|
43
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
44
|
+
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
45
|
+
"@semantic-release/git": "^10.0.1",
|
|
46
|
+
"@semantic-release/github": "^12.0.9",
|
|
47
|
+
"@semantic-release/npm": "^13.1.5",
|
|
48
|
+
"@semantic-release/release-notes-generator": "^14.1.1",
|
|
49
|
+
"@types/node": "^26.1.1",
|
|
50
|
+
"semantic-release": "^25.0.8",
|
|
51
|
+
"typescript": "^7.0.2",
|
|
52
|
+
"vitest": "^4.1.10"
|
|
53
|
+
}
|
|
54
|
+
}
|