@forge/bridge 5.13.1-next.3 → 5.14.0-next.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/out/featureFlags/evaluator.d.ts +9 -0
- package/out/featureFlags/evaluator.d.ts.map +1 -0
- package/out/featureFlags/evaluator.js +53 -0
- package/out/featureFlags/featureFlagEvents.d.ts +1 -1
- package/out/featureFlags/featureFlagEvents.d.ts.map +1 -1
- package/out/featureFlags/featureFlagEvents.js +1 -1
- package/out/featureFlags/featureFlags.d.ts +5 -26
- package/out/featureFlags/featureFlags.d.ts.map +1 -1
- package/out/featureFlags/featureFlags.js +17 -39
- package/out/featureFlags/index.d.ts +2 -1
- package/out/featureFlags/index.d.ts.map +1 -1
- package/out/featureFlags/index.js +2 -2
- package/out/featureFlags/initFeatureFlags.d.ts +1 -1
- package/out/featureFlags/initFeatureFlags.d.ts.map +1 -1
- package/out/featureFlags/initFeatureFlags.js +2 -2
- package/out/featureFlags/types.d.ts +29 -0
- package/out/featureFlags/types.d.ts.map +1 -0
- package/out/featureFlags/types.js +7 -0
- package/out/permissions/permissionsUtil.d.ts.map +1 -1
- package/out/permissions/permissionsUtil.js +29 -0
- package/out/types.d.ts +0 -18
- package/out/types.d.ts.map +1 -1
- package/out/types.js +1 -5
- package/package.json +1 -2
- package/out/featureFlags/dataAdapter.d.ts +0 -14
- package/out/featureFlags/dataAdapter.d.ts.map +0 -1
- package/out/featureFlags/dataAdapter.js +0 -47
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @forge/bridge
|
|
2
2
|
|
|
3
|
+
## 5.14.0-next.5
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Updated Feature flags client SDK to remove dependency on Statsig
|
|
8
|
+
|
|
9
|
+
## 5.14.0-next.4
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- 16a4b01: Updated SDK to throw type error
|
|
14
|
+
|
|
3
15
|
## 5.13.1-next.3
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { InitFeatureFlagsResponse } from './types';
|
|
2
|
+
export declare class Evaluator {
|
|
3
|
+
private results;
|
|
4
|
+
constructor(results: InitFeatureFlagsResponse);
|
|
5
|
+
checkFlag(flagName: string, defaultValue: boolean): any;
|
|
6
|
+
shutDown(): void;
|
|
7
|
+
private getHashedValue;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=evaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../src/featureFlags/evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAEnD,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAA2B;gBAE9B,OAAO,EAAE,wBAAwB;IAItC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO;IAkCjD,QAAQ;IAKf,OAAO,CAAC,cAAc;CAoBvB"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Evaluator = void 0;
|
|
4
|
+
class Evaluator {
|
|
5
|
+
constructor(results) {
|
|
6
|
+
this.results = results;
|
|
7
|
+
}
|
|
8
|
+
checkFlag(flagName, defaultValue) {
|
|
9
|
+
if (!this.results || !this.results.feature_flags) {
|
|
10
|
+
return defaultValue;
|
|
11
|
+
}
|
|
12
|
+
const featureFlags = this.results.feature_flags;
|
|
13
|
+
let hashedValue = '';
|
|
14
|
+
try {
|
|
15
|
+
hashedValue = this.getHashedValue(flagName);
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
console.error('Unexpected error occurred while evaluating flag ', err);
|
|
19
|
+
return defaultValue;
|
|
20
|
+
}
|
|
21
|
+
if (!hashedValue) {
|
|
22
|
+
return defaultValue;
|
|
23
|
+
}
|
|
24
|
+
const evaluatedFlag = featureFlags[hashedValue];
|
|
25
|
+
if (evaluatedFlag) {
|
|
26
|
+
if (evaluatedFlag.disabled) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return evaluatedFlag.value;
|
|
30
|
+
}
|
|
31
|
+
return defaultValue;
|
|
32
|
+
}
|
|
33
|
+
shutDown() {
|
|
34
|
+
this.results = undefined;
|
|
35
|
+
}
|
|
36
|
+
getHashedValue(flagName) {
|
|
37
|
+
if (typeof flagName !== 'string') {
|
|
38
|
+
return '';
|
|
39
|
+
}
|
|
40
|
+
const input = flagName.trim();
|
|
41
|
+
if (input.length === 0) {
|
|
42
|
+
return '';
|
|
43
|
+
}
|
|
44
|
+
let hash = 5381;
|
|
45
|
+
for (let i = 0; i < input.length; i += 1) {
|
|
46
|
+
const charCode = input.charCodeAt(i);
|
|
47
|
+
hash = (hash << 5) + hash + charCode;
|
|
48
|
+
hash |= 0;
|
|
49
|
+
}
|
|
50
|
+
return (hash >>> 0).toString();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.Evaluator = Evaluator;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featureFlagEvents.d.ts","sourceRoot":"","sources":["../../src/featureFlags/featureFlagEvents.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"featureFlagEvents.d.ts","sourceRoot":"","sources":["../../src/featureFlags/featureFlagEvents.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,4BAA4B,EAAwB,MAAM,SAAS,CAAC;AA6B7E,eAAO,MAAM,qBAAqB,0DAKjC,CAAC"}
|
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.trackFeatureFlagEvent = void 0;
|
|
4
4
|
const bridge_1 = require("../bridge");
|
|
5
5
|
const errors_1 = require("../errors");
|
|
6
|
-
const types_1 = require("../types");
|
|
7
6
|
const utils_1 = require("../utils");
|
|
7
|
+
const types_1 = require("./types");
|
|
8
8
|
const maxOps = 500;
|
|
9
9
|
const intervalInMs = 1000 * 25;
|
|
10
10
|
const callBridge = (0, bridge_1.getCallBridge)();
|
|
@@ -1,33 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export
|
|
3
|
-
environment?: FeatureFlagEnvironment;
|
|
4
|
-
}
|
|
5
|
-
export interface FeatureFlagUser {
|
|
6
|
-
userId?: string;
|
|
7
|
-
custom?: Record<string, string | number>;
|
|
8
|
-
attributes?: {
|
|
9
|
-
installContext?: string;
|
|
10
|
-
accountId?: string;
|
|
11
|
-
appVersion?: string;
|
|
12
|
-
license?: string;
|
|
13
|
-
capabilitySet?: string;
|
|
14
|
-
};
|
|
15
|
-
identifiers?: {
|
|
16
|
-
installContext?: string;
|
|
17
|
-
accountId?: string;
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
export declare class ForgeFeatureFlags {
|
|
1
|
+
import { FeatureFlagUser, ForgeFeatureFlagConfig } from './types';
|
|
2
|
+
export declare class FeatureFlags {
|
|
21
3
|
private initialized;
|
|
22
|
-
private
|
|
23
|
-
private dataAdapter;
|
|
4
|
+
private evaluator;
|
|
24
5
|
private eventProps;
|
|
25
|
-
private readonly CLIENT_KEY;
|
|
26
6
|
initialize(user: FeatureFlagUser, config?: ForgeFeatureFlagConfig): Promise<void>;
|
|
27
|
-
checkFlag(flagName: string): boolean;
|
|
28
|
-
shutdown():
|
|
7
|
+
checkFlag(flagName: string, defaultValue?: boolean): boolean;
|
|
8
|
+
shutdown(): void;
|
|
29
9
|
isInitialized(): boolean;
|
|
30
|
-
private convertUser;
|
|
31
10
|
private sendCheckFlagEvent;
|
|
32
11
|
}
|
|
33
12
|
//# sourceMappingURL=featureFlags.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featureFlags.d.ts","sourceRoot":"","sources":["../../src/featureFlags/featureFlags.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"featureFlags.d.ts","sourceRoot":"","sources":["../../src/featureFlags/featureFlags.ts"],"names":[],"mappings":"AAGA,OAAO,EAKL,eAAe,EACf,sBAAsB,EAEvB,MAAM,SAAS,CAAC;AAEjB,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,UAAU,CAAkC;IAKvC,UAAU,CACrB,IAAI,EAAE,eAAe,EACrB,MAAM,GAAE,sBAAuD,GAC9D,OAAO,CAAC,IAAI,CAAC;IAgBT,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,OAAO;IAa1D,QAAQ;IAQR,aAAa;IAIpB,OAAO,CAAC,kBAAkB;CAa3B"}
|
|
@@ -1,64 +1,42 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
const
|
|
5
|
-
const dataAdapter_1 = require("./dataAdapter");
|
|
6
|
-
const types_1 = require("../types");
|
|
3
|
+
exports.FeatureFlags = void 0;
|
|
4
|
+
const evaluator_1 = require("./evaluator");
|
|
7
5
|
const featureFlagEvents_1 = require("./featureFlagEvents");
|
|
8
|
-
|
|
6
|
+
const initFeatureFlags_1 = require("./initFeatureFlags");
|
|
7
|
+
const types_1 = require("./types");
|
|
8
|
+
class FeatureFlags {
|
|
9
9
|
constructor() {
|
|
10
10
|
this.initialized = false;
|
|
11
|
-
this.client = null;
|
|
12
|
-
this.dataAdapter = null;
|
|
13
11
|
this.eventProps = {};
|
|
14
|
-
this.CLIENT_KEY = 'client-forge-internal-key';
|
|
15
12
|
}
|
|
16
|
-
async initialize(user, config = {}) {
|
|
17
|
-
var _a;
|
|
13
|
+
async initialize(user, config = { environment: 'development' }) {
|
|
18
14
|
if (this.isInitialized()) {
|
|
19
15
|
return;
|
|
20
16
|
}
|
|
21
|
-
this.
|
|
22
|
-
const
|
|
23
|
-
environment: { tier: config.environment || 'development' },
|
|
24
|
-
disableEvaluationMemoization: false,
|
|
25
|
-
loggingEnabled: js_client_1.LoggingEnabledOption.disabled,
|
|
26
|
-
logLevel: js_client_1.LogLevel.None,
|
|
27
|
-
dataAdapter: this.dataAdapter
|
|
28
|
-
};
|
|
29
|
-
this.eventProps.environment = (_a = options.environment) === null || _a === void 0 ? void 0 : _a.tier;
|
|
30
|
-
this.client = new js_client_1.StatsigClient(this.CLIENT_KEY, this.convertUser(user), options);
|
|
31
|
-
await this.client.initializeAsync();
|
|
17
|
+
this.eventProps.environment = config.environment;
|
|
18
|
+
const result = await (0, initFeatureFlags_1.initFeatureFlags)({ user, config });
|
|
32
19
|
this.initialized = true;
|
|
20
|
+
this.evaluator = new evaluator_1.Evaluator(result);
|
|
33
21
|
}
|
|
34
|
-
checkFlag(flagName) {
|
|
35
|
-
if (!this.isInitialized() || !this.
|
|
22
|
+
checkFlag(flagName, defaultValue = false) {
|
|
23
|
+
if (!this.isInitialized() || !this.evaluator) {
|
|
36
24
|
this.sendCheckFlagEvent(flagName, false);
|
|
37
|
-
throw new Error('
|
|
25
|
+
throw new Error('FeatureFlags not initialized. Call initialize() first.');
|
|
38
26
|
}
|
|
39
27
|
this.sendCheckFlagEvent(flagName, true);
|
|
40
|
-
return this.
|
|
28
|
+
return this.evaluator.checkFlag(flagName, defaultValue);
|
|
41
29
|
}
|
|
42
|
-
|
|
43
|
-
if (!this.isInitialized()
|
|
30
|
+
shutdown() {
|
|
31
|
+
if (!this.isInitialized()) {
|
|
44
32
|
return;
|
|
45
33
|
}
|
|
46
|
-
await this.client.shutdown();
|
|
47
|
-
if (this.dataAdapter) {
|
|
48
|
-
await this.dataAdapter.shutdown();
|
|
49
|
-
}
|
|
50
34
|
this.initialized = false;
|
|
35
|
+
this.evaluator.shutDown();
|
|
51
36
|
}
|
|
52
37
|
isInitialized() {
|
|
53
38
|
return this.initialized;
|
|
54
39
|
}
|
|
55
|
-
convertUser(user) {
|
|
56
|
-
return {
|
|
57
|
-
userID: user.userId,
|
|
58
|
-
custom: { ...(user.custom || {}), ...(user.attributes || {}) },
|
|
59
|
-
customIDs: user.identifiers || {}
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
40
|
sendCheckFlagEvent(flagName, success) {
|
|
63
41
|
const props = {
|
|
64
42
|
type: types_1.FeatureFlagEventType.CHECKFLAG,
|
|
@@ -72,4 +50,4 @@ class ForgeFeatureFlags {
|
|
|
72
50
|
void (0, featureFlagEvents_1.trackFeatureFlagEvent)(props);
|
|
73
51
|
}
|
|
74
52
|
}
|
|
75
|
-
exports.
|
|
53
|
+
exports.FeatureFlags = FeatureFlags;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/featureFlags/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/featureFlags/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.FeatureFlags = void 0;
|
|
4
4
|
var featureFlags_1 = require("./featureFlags");
|
|
5
|
-
Object.defineProperty(exports, "
|
|
5
|
+
Object.defineProperty(exports, "FeatureFlags", { enumerable: true, get: function () { return featureFlags_1.FeatureFlags; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initFeatureFlags.d.ts","sourceRoot":"","sources":["../../src/featureFlags/initFeatureFlags.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"initFeatureFlags.d.ts","sourceRoot":"","sources":["../../src/featureFlags/initFeatureFlags.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,uBAAuB,EAA4B,MAAM,SAAS,CAAC;AAuB5E,eAAO,MAAM,gBAAgB,qDAK5B,CAAC"}
|
|
@@ -8,7 +8,7 @@ const maxOps = 500;
|
|
|
8
8
|
const intervalInMs = 1000 * 25;
|
|
9
9
|
const callBridge = (0, bridge_1.getCallBridge)();
|
|
10
10
|
const validatePayload = (payload) => {
|
|
11
|
-
if (!payload || !payload.user) {
|
|
11
|
+
if (!payload || !payload.user || !payload.config) {
|
|
12
12
|
throw new errors_1.BridgeAPIError('Missing required parameters. Parameter user is required in the payload.');
|
|
13
13
|
}
|
|
14
14
|
if (Object.values(payload).some((val) => typeof val === 'function')) {
|
|
@@ -17,6 +17,6 @@ const validatePayload = (payload) => {
|
|
|
17
17
|
};
|
|
18
18
|
const _initFeatureFlags = (payload) => {
|
|
19
19
|
validatePayload(payload);
|
|
20
|
-
return callBridge('initFeatureFlags', { user: payload.user });
|
|
20
|
+
return callBridge('initFeatureFlags', { user: payload.user, config: payload.config });
|
|
21
21
|
};
|
|
22
22
|
exports.initFeatureFlags = (0, utils_1.withRateLimiter)(_initFeatureFlags, maxOps, intervalInMs, `Feature flags initialisation calls are rate limited at ${maxOps}req/${intervalInMs / 1000}s`);
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface ForgeFeatureFlagConfig {
|
|
2
|
+
environment: FeatureFlagEnvironment;
|
|
3
|
+
}
|
|
4
|
+
export interface FeatureFlagUser {
|
|
5
|
+
attributes?: Record<string, string | number>;
|
|
6
|
+
identifiers?: {
|
|
7
|
+
installContext?: string;
|
|
8
|
+
accountId?: string;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export declare type InitFeatureFlagsPayload = {
|
|
12
|
+
user: FeatureFlagUser;
|
|
13
|
+
config: ForgeFeatureFlagConfig;
|
|
14
|
+
};
|
|
15
|
+
export declare type InitFeatureFlagsResponse = Record<string, any> | void;
|
|
16
|
+
export declare enum FeatureFlagEventType {
|
|
17
|
+
CHECKFLAG = "checkFlag"
|
|
18
|
+
}
|
|
19
|
+
export declare type FeatureFlagEnvironment = 'development' | 'staging' | 'production';
|
|
20
|
+
export declare type FeatureFlagEventProperties = {
|
|
21
|
+
environment?: FeatureFlagEnvironment;
|
|
22
|
+
success?: boolean;
|
|
23
|
+
name?: string;
|
|
24
|
+
};
|
|
25
|
+
export declare type FeatureFlagEventTrackPayload = {
|
|
26
|
+
type: FeatureFlagEventType;
|
|
27
|
+
properties: FeatureFlagEventProperties;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/featureFlags/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,sBAAsB,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IAC7C,WAAW,CAAC,EAAE;QACZ,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,oBAAY,uBAAuB,GAAG;IACpC,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,sBAAsB,CAAC;CAChC,CAAC;AAEF,oBAAY,wBAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;AAElE,oBAAY,oBAAoB;IAC9B,SAAS,cAAc;CACxB;AAED,oBAAY,sBAAsB,GAAG,aAAa,GAAG,SAAS,GAAG,YAAY,CAAC;AAE9E,oBAAY,0BAA0B,GAAG;IACvC,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,oBAAY,4BAA4B,GAAG;IACzC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,UAAU,EAAE,0BAA0B,CAAC;CACxC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FeatureFlagEventType = void 0;
|
|
4
|
+
var FeatureFlagEventType;
|
|
5
|
+
(function (FeatureFlagEventType) {
|
|
6
|
+
FeatureFlagEventType["CHECKFLAG"] = "checkFlag";
|
|
7
|
+
})(FeatureFlagEventType = exports.FeatureFlagEventType || (exports.FeatureFlagEventType = {}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissionsUtil.d.ts","sourceRoot":"","sources":["../../src/permissions/permissionsUtil.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"permissionsUtil.d.ts","sourceRoot":"","sources":["../../src/permissions/permissionsUtil.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAS,MAAM,iBAAiB,CAAC;AAEvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAoBnD,QAAA,MAAM,cAAc,sEAAuE,CAAC;AAC5F,oBAAY,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAK3D,QAAA,MAAM,WAAW,gCAAiC,CAAC;AACnD,oBAAY,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAKrD,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE;QACT,KAAK,CAAC,EAAE;YACN,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;SACnB,CAAC;QACF,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAKD,oBAAY,kBAAkB,GAAG,sBAAsB,CAAC;AAKxD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACpC;AAKD,MAAM,WAAW,eAAe;IAI9B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAOrC,YAAY,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAOxD,eAAe,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAK9D,SAAS,EAAE,MAAM,MAAM,EAAE,CAAC;IAK1B,sBAAsB,EAAE,MAAM,QAAQ,GAAG,SAAS,CAAC;IAKnD,iBAAiB,EAAE,MAAM,OAAO,CAAC;CAClC;AAOD,wBAAgB,qBAAqB,CAAC,kBAAkB,EAAE,kBAAkB,GAAG,SAAS,GAAG,eAAe,GAAG,IAAI,CAmDhH;AA+ID,wBAAsB,gBAAgB,CACpC,mBAAmB,EAAE,sBAAsB,EAC3C,kBAAkB,CAAC,EAAE,kBAAkB,GAAG,SAAS,GAClD,OAAO,CAAC,qBAAqB,CAAC,CAiDhC"}
|
|
@@ -106,11 +106,40 @@ function checkExternalPermissions(requiredExternal, permissionUtils) {
|
|
|
106
106
|
}
|
|
107
107
|
return missingExternal;
|
|
108
108
|
}
|
|
109
|
+
function validateObjectField(value, fieldPath) {
|
|
110
|
+
if (value !== undefined) {
|
|
111
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
112
|
+
throw new TypeError(`${fieldPath} should be an object, not ${Array.isArray(value) ? 'an array' : `a ${typeof value}`}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function validateArrayField(value, fieldPath) {
|
|
117
|
+
if (value !== undefined && !Array.isArray(value)) {
|
|
118
|
+
throw new TypeError(`${fieldPath} should be an array, not a ${typeof value}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function validatePermissionShape(requiredPermissions) {
|
|
122
|
+
validateArrayField(requiredPermissions.scopes, 'scopes');
|
|
123
|
+
const external = requiredPermissions.external;
|
|
124
|
+
if (external === undefined)
|
|
125
|
+
return;
|
|
126
|
+
validateObjectField(external, 'external');
|
|
127
|
+
if (external.fetch !== undefined) {
|
|
128
|
+
validateObjectField(external.fetch, 'external.fetch');
|
|
129
|
+
for (const type of FETCH_TYPES) {
|
|
130
|
+
validateArrayField(external.fetch[type], `external.fetch.${type}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
for (const type of RESOURCE_TYPES) {
|
|
134
|
+
validateArrayField(external[type], `external.${type}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
109
137
|
async function checkPermissions(requiredPermissions, runtimePermissions) {
|
|
110
138
|
var _a;
|
|
111
139
|
if (!requiredPermissions) {
|
|
112
140
|
return { granted: false, missing: null };
|
|
113
141
|
}
|
|
142
|
+
validatePermissionShape(requiredPermissions);
|
|
114
143
|
if (!((_a = requiredPermissions.scopes) === null || _a === void 0 ? void 0 : _a.length) && !requiredPermissions.external) {
|
|
115
144
|
return { granted: true, missing: null };
|
|
116
145
|
}
|
package/out/types.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { type ForgeSupportedLocaleCode } from '@forge/i18n';
|
|
2
2
|
import { type ThemeState } from '@atlaskit/tokens';
|
|
3
|
-
import { StatsigUserInternal } from '@statsig/js-client';
|
|
4
3
|
import { type Scopes, type External } from '@forge/manifest';
|
|
5
4
|
export declare type InvokePayload = {
|
|
6
5
|
[key in number | string]: any;
|
|
@@ -64,23 +63,6 @@ export interface LicenseDetails {
|
|
|
64
63
|
export declare type Subscription = {
|
|
65
64
|
unsubscribe: () => void;
|
|
66
65
|
};
|
|
67
|
-
export declare type InitFeatureFlagsPayload = {
|
|
68
|
-
user: StatsigUserInternal;
|
|
69
|
-
};
|
|
70
|
-
export declare type InitFeatureFlagsResponse = Record<string, any> | void;
|
|
71
|
-
export declare enum FeatureFlagEventType {
|
|
72
|
-
CHECKFLAG = "checkFlag"
|
|
73
|
-
}
|
|
74
|
-
export declare type FeatureFlagEnvironment = 'development' | 'staging' | 'production';
|
|
75
|
-
export declare type FeatureFlagEventProperties = {
|
|
76
|
-
environment?: FeatureFlagEnvironment;
|
|
77
|
-
success?: boolean;
|
|
78
|
-
name?: string;
|
|
79
|
-
};
|
|
80
|
-
export declare type FeatureFlagEventTrackPayload = {
|
|
81
|
-
type: FeatureFlagEventType;
|
|
82
|
-
properties: FeatureFlagEventProperties;
|
|
83
|
-
};
|
|
84
66
|
export interface RuntimePermissions {
|
|
85
67
|
scopes?: Scopes;
|
|
86
68
|
external?: External;
|
package/out/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE7D,oBAAY,aAAa,GAAG;KACzB,GAAG,IAAI,MAAM,GAAG,MAAM,GAAG,GAAG;CAC9B,CAAC;AAEF,oBAAY,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;AAExD,aAAK,aAAa,GAAG;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACnC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,YAAY,CAAC,CAAC;AAEhD,oBAAY,oBAAoB,GAAG,aAAa,CAAC;AACjD,oBAAY,mBAAmB,GAAG,aAAa,CAAC;AAEhD,oBAAY,oBAAoB;IAC9B,WAAW,gBAAgB;IAC3B,OAAO,YAAY;IACnB,UAAU,eAAe;CAC1B;AAED,aAAK,iBAAiB,GAAG;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,oBAAY,eAAe,GAAG,MAAM,OAAO,oBAAoB,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,aAAa,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,wBAAwB,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;AACD,UAAU,aAAa;IACrB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAClB;AAED,aAAK,oBAAoB;IACvB,WAAW,gBAAgB;CAC5B;AACD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC;CACtC;AAED,oBAAY,YAAY,GAAG;IACzB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC;AAQF,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAGD,oBAAY,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAE3D,oBAAY,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC"}
|
package/out/types.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.ExtensionEnvironment = void 0;
|
|
4
4
|
var ExtensionEnvironment;
|
|
5
5
|
(function (ExtensionEnvironment) {
|
|
6
6
|
ExtensionEnvironment["DEVELOPMENT"] = "DEVELOPMENT";
|
|
@@ -11,7 +11,3 @@ var EcosystemLicenseMode;
|
|
|
11
11
|
(function (EcosystemLicenseMode) {
|
|
12
12
|
EcosystemLicenseMode["USER_ACCESS"] = "USER_ACCESS";
|
|
13
13
|
})(EcosystemLicenseMode || (EcosystemLicenseMode = {}));
|
|
14
|
-
var FeatureFlagEventType;
|
|
15
|
-
(function (FeatureFlagEventType) {
|
|
16
|
-
FeatureFlagEventType["CHECKFLAG"] = "checkFlag";
|
|
17
|
-
})(FeatureFlagEventType = exports.FeatureFlagEventType || (exports.FeatureFlagEventType = {}));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forge/bridge",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.14.0-next.5",
|
|
4
4
|
"description": "Forge bridge API for custom UI apps",
|
|
5
5
|
"author": "Atlassian",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
@@ -18,7 +18,6 @@
|
|
|
18
18
|
"@forge/egress": "^2.3.1",
|
|
19
19
|
"@forge/i18n": "0.0.7",
|
|
20
20
|
"@forge/resolver": "1.7.1",
|
|
21
|
-
"@statsig/js-client": "3.18.2",
|
|
22
21
|
"@types/history": "^4.7.11",
|
|
23
22
|
"@forge/manifest": "12.2.0-next.3",
|
|
24
23
|
"@types/iframe-resizer": "^3.5.8",
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { StatsigUser, EvaluationsDataAdapter, DataAdapterResult, DataAdapterAsyncOptions, NetworkCore, AnyStatsigOptions } from '@statsig/js-client';
|
|
2
|
-
export declare class ForgeDataAdapter implements EvaluationsDataAdapter {
|
|
3
|
-
private options;
|
|
4
|
-
private environment;
|
|
5
|
-
private cache;
|
|
6
|
-
getDataAsync(current: DataAdapterResult | null, user: StatsigUser, options?: DataAdapterAsyncOptions): Promise<DataAdapterResult | null>;
|
|
7
|
-
getDataSync(_user: StatsigUser): DataAdapterResult | null;
|
|
8
|
-
attach(_sdkKey: string, options: AnyStatsigOptions | null, _network: NetworkCore): Promise<void>;
|
|
9
|
-
prefetchData(): Promise<void>;
|
|
10
|
-
setData(_data: string): Promise<void>;
|
|
11
|
-
setDataLegacy(_data: string): Promise<void>;
|
|
12
|
-
shutdown(): Promise<void>;
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=dataAdapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dataAdapter.d.ts","sourceRoot":"","sources":["../../src/featureFlags/dataAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,WAAW,EACX,iBAAiB,EAIlB,MAAM,oBAAoB,CAAC;AAO5B,qBAAa,gBAAiB,YAAW,sBAAsB;IAC7D,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,WAAW,CAA6C;IAChE,OAAO,CAAC,KAAK,CAAkC;IAKzC,YAAY,CAChB,OAAO,EAAE,iBAAiB,GAAG,IAAI,EACjC,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IA8BpC,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,iBAAiB,GAAG,IAAI;IAOnD,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAM7B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAKhC"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ForgeDataAdapter = void 0;
|
|
4
|
-
const initFeatureFlags_1 = require("./initFeatureFlags");
|
|
5
|
-
class ForgeDataAdapter {
|
|
6
|
-
constructor() {
|
|
7
|
-
this.options = null;
|
|
8
|
-
this.environment = undefined;
|
|
9
|
-
this.cache = null;
|
|
10
|
-
}
|
|
11
|
-
async getDataAsync(current, user, options) {
|
|
12
|
-
var _a;
|
|
13
|
-
if (current) {
|
|
14
|
-
return current;
|
|
15
|
-
}
|
|
16
|
-
this.environment = ((_a = this.options) === null || _a === void 0 ? void 0 : _a.environment) || { tier: 'development' };
|
|
17
|
-
const initUser = {
|
|
18
|
-
...user,
|
|
19
|
-
statsigEnvironment: this.environment
|
|
20
|
-
};
|
|
21
|
-
const result = await (0, initFeatureFlags_1.initFeatureFlags)({ user: initUser });
|
|
22
|
-
const data = {
|
|
23
|
-
source: 'Network',
|
|
24
|
-
data: JSON.stringify(result),
|
|
25
|
-
receivedAt: Date.now(),
|
|
26
|
-
stableID: null,
|
|
27
|
-
fullUserHash: null
|
|
28
|
-
};
|
|
29
|
-
this.cache = data;
|
|
30
|
-
return data;
|
|
31
|
-
}
|
|
32
|
-
getDataSync(_user) {
|
|
33
|
-
return this.cache;
|
|
34
|
-
}
|
|
35
|
-
async attach(_sdkKey, options, _network) {
|
|
36
|
-
this.options = options;
|
|
37
|
-
}
|
|
38
|
-
async prefetchData() { }
|
|
39
|
-
async setData(_data) { }
|
|
40
|
-
async setDataLegacy(_data) { }
|
|
41
|
-
async shutdown() {
|
|
42
|
-
this.options = null;
|
|
43
|
-
this.cache = null;
|
|
44
|
-
this.environment = undefined;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
exports.ForgeDataAdapter = ForgeDataAdapter;
|