@servicetitan/launchdarkly-service 30.3.0 → 31.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/dist/create-flag-keys.js +5 -1
- package/dist/create-flag-keys.js.map +1 -1
- package/dist/feature-flag-provider.d.ts.map +1 -1
- package/dist/feature-flag-provider.js +10 -4
- package/dist/feature-flag-provider.js.map +1 -1
- package/dist/feature-flag-store.js +32 -29
- package/dist/feature-flag-store.js.map +1 -1
- package/dist/get-ld-client.js +5 -1
- package/dist/get-ld-client.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/ld-provider.js +33 -17
- package/dist/ld-provider.js.map +1 -1
- package/dist/ld-service-provider.js +10 -3
- package/dist/ld-service-provider.js.map +1 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/dist/with-feature-flag.js +3 -2
- package/dist/with-feature-flag.js.map +1 -1
- package/package.json +6 -6
- package/src/feature-flag-provider.tsx +4 -2
package/dist/create-flag-keys.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/create-flag-keys.ts"],"sourcesContent":["import { FlagKey } from './types';\n\ntype FlagKeys<S> = {\n [K in keyof S]: FlagKey<S, K>;\n};\n\nexport function createFlagKeys<S>(...keys: (keyof S)[]): FlagKeys<S> {\n return keys.reduce((result, key) => ({ ...result, [key]: key }), {} as FlagKeys<S>);\n}\n"],"names":["createFlagKeys","keys","reduce","result","key"],"mappings":"AAMA,OAAO,SAASA,eAAkB,GAAGC,IAAiB;IAClD,OAAOA,KAAKC,MAAM,CAAC,CAACC,QAAQC,MAAS,CAAA;YAAE,GAAGD,MAAM;YAAE,CAACC,IAAI,EAAEA;QAAI,CAAA,GAAI,CAAC;AACtE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-flag-provider.d.ts","sourceRoot":"","sources":["../src/feature-flag-provider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"feature-flag-provider.d.ts","sourceRoot":"","sources":["../src/feature-flag-provider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAuB,MAAM,OAAO,CAAC;AAI/D,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,EAAE,iBAAiB,6BAWlE"}
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import { useDependencies } from '@servicetitan/react-ioc';
|
|
2
2
|
import { useFlags } from 'launchdarkly-react-client-sdk';
|
|
3
|
-
import { useEffect } from 'react';
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
4
|
import { FeatureFlagStore } from './feature-flag-store';
|
|
5
5
|
export function FeatureFlagProvider({ children }) {
|
|
6
|
+
const [initialized, setInitialized] = useState(false);
|
|
6
7
|
const [{ setFlags }] = useDependencies(FeatureFlagStore);
|
|
7
8
|
const flags = useFlags();
|
|
8
|
-
useEffect(()
|
|
9
|
+
useEffect(()=>{
|
|
9
10
|
setFlags(flags);
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
setInitialized(true);
|
|
12
|
+
}, [
|
|
13
|
+
flags,
|
|
14
|
+
setFlags
|
|
15
|
+
]);
|
|
16
|
+
return initialized ? children : null;
|
|
12
17
|
}
|
|
18
|
+
|
|
13
19
|
//# sourceMappingURL=feature-flag-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/feature-flag-provider.tsx"],"sourcesContent":["import { useDependencies } from '@servicetitan/react-ioc';\nimport { useFlags } from 'launchdarkly-react-client-sdk';\nimport { PropsWithChildren, useEffect, useState } from 'react';\n\nimport { FeatureFlagStore } from './feature-flag-store';\n\nexport function FeatureFlagProvider({ children }: PropsWithChildren) {\n const [initialized, setInitialized] = useState(false);\n const [{ setFlags }] = useDependencies(FeatureFlagStore);\n const flags = useFlags();\n\n useEffect(() => {\n setFlags(flags);\n setInitialized(true);\n }, [flags, setFlags]);\n\n return initialized ? children : null;\n}\n"],"names":["useDependencies","useFlags","useEffect","useState","FeatureFlagStore","FeatureFlagProvider","children","initialized","setInitialized","setFlags","flags"],"mappings":"AAAA,SAASA,eAAe,QAAQ,0BAA0B;AAC1D,SAASC,QAAQ,QAAQ,gCAAgC;AACzD,SAA4BC,SAAS,EAAEC,QAAQ,QAAQ,QAAQ;AAE/D,SAASC,gBAAgB,QAAQ,uBAAuB;AAExD,OAAO,SAASC,oBAAoB,EAAEC,QAAQ,EAAqB;IAC/D,MAAM,CAACC,aAAaC,eAAe,GAAGL,SAAS;IAC/C,MAAM,CAAC,EAAEM,QAAQ,EAAE,CAAC,GAAGT,gBAAgBI;IACvC,MAAMM,QAAQT;IAEdC,UAAU;QACNO,SAASC;QACTF,eAAe;IACnB,GAAG;QAACE;QAAOD;KAAS;IAEpB,OAAOF,cAAcD,WAAW;AACpC"}
|
|
@@ -1,45 +1,48 @@
|
|
|
1
|
-
|
|
1
|
+
function _define_property(obj, key, value) {
|
|
2
|
+
if (key in obj) {
|
|
3
|
+
Object.defineProperty(obj, key, {
|
|
4
|
+
value: value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true
|
|
8
|
+
});
|
|
9
|
+
} else {
|
|
10
|
+
obj[key] = value;
|
|
11
|
+
}
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
2
15
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
16
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for
|
|
17
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
18
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
}
|
|
7
|
-
|
|
19
|
+
}
|
|
20
|
+
function _ts_metadata(k, v) {
|
|
8
21
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
-
}
|
|
22
|
+
}
|
|
10
23
|
import { injectable } from '@servicetitan/react-ioc';
|
|
11
24
|
import { action, makeObservable, observable } from 'mobx';
|
|
12
|
-
|
|
13
|
-
constructor()
|
|
25
|
+
export class FeatureFlagStore {
|
|
26
|
+
constructor(){
|
|
14
27
|
// @ts-expect-error because 'LDFlagSet' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
writable: true,
|
|
19
|
-
value: {}
|
|
20
|
-
});
|
|
21
|
-
Object.defineProperty(this, "setFlags", {
|
|
22
|
-
enumerable: true,
|
|
23
|
-
configurable: true,
|
|
24
|
-
writable: true,
|
|
25
|
-
value: (flags) => {
|
|
26
|
-
this.flags = flags;
|
|
27
|
-
}
|
|
28
|
+
_define_property(this, "flags", {});
|
|
29
|
+
_define_property(this, "setFlags", (flags)=>{
|
|
30
|
+
this.flags = flags;
|
|
28
31
|
});
|
|
29
32
|
makeObservable(this);
|
|
30
33
|
}
|
|
31
|
-
}
|
|
32
|
-
|
|
34
|
+
}
|
|
35
|
+
_ts_decorate([
|
|
33
36
|
observable,
|
|
34
|
-
|
|
37
|
+
_ts_metadata("design:type", typeof T === "undefined" ? Object : T)
|
|
35
38
|
], FeatureFlagStore.prototype, "flags", void 0);
|
|
36
|
-
|
|
37
|
-
action
|
|
38
|
-
__metadata("design:type", Object)
|
|
39
|
+
_ts_decorate([
|
|
40
|
+
action
|
|
39
41
|
], FeatureFlagStore.prototype, "setFlags", void 0);
|
|
40
|
-
FeatureFlagStore =
|
|
42
|
+
FeatureFlagStore = _ts_decorate([
|
|
41
43
|
injectable(),
|
|
42
|
-
|
|
44
|
+
_ts_metadata("design:type", Function),
|
|
45
|
+
_ts_metadata("design:paramtypes", [])
|
|
43
46
|
], FeatureFlagStore);
|
|
44
|
-
|
|
47
|
+
|
|
45
48
|
//# sourceMappingURL=feature-flag-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/feature-flag-store.ts"],"sourcesContent":["import { injectable } from '@servicetitan/react-ioc';\nimport { LDFlagSet } from 'launchdarkly-react-client-sdk';\nimport { action, makeObservable, observable } from 'mobx';\n\n@injectable()\nexport class FeatureFlagStore<T extends LDFlagSet = LDFlagSet> {\n // @ts-expect-error because 'LDFlagSet' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint\n @observable flags: T = {} as LDFlagSet;\n\n constructor() {\n makeObservable(this);\n }\n\n @action\n setFlags = (flags: T) => {\n this.flags = flags;\n };\n}\n"],"names":["injectable","action","makeObservable","observable","FeatureFlagStore","constructor","flags","setFlags"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,UAAU,QAAQ,0BAA0B;AAErD,SAASC,MAAM,EAAEC,cAAc,EAAEC,UAAU,QAAQ,OAAO;AAG1D,OAAO,MAAMC;IAITC,aAAc;QAHd,yJAAyJ;QACzJ,uBAAYC,SAAW,CAAC;QAMxB,uBACAC,YAAW,CAACD;YACR,IAAI,CAACA,KAAK,GAAGA;QACjB;QANIJ,eAAe,IAAI;IACvB;AAMJ"}
|
package/dist/get-ld-client.js
CHANGED
|
@@ -3,9 +3,13 @@ const ldClients = new Map();
|
|
|
3
3
|
export function getLDClient({ clientSideID, context, options }) {
|
|
4
4
|
let client = ldClients.get(clientSideID);
|
|
5
5
|
if (!client) {
|
|
6
|
-
client = initialize(clientSideID, context !== null && context !== void 0 ? context : {
|
|
6
|
+
client = initialize(clientSideID, context !== null && context !== void 0 ? context : {
|
|
7
|
+
kind: 'user',
|
|
8
|
+
anonymous: true
|
|
9
|
+
}, options);
|
|
7
10
|
ldClients.set(clientSideID, client);
|
|
8
11
|
}
|
|
9
12
|
return client;
|
|
10
13
|
}
|
|
14
|
+
|
|
11
15
|
//# sourceMappingURL=get-ld-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/get-ld-client.ts"],"sourcesContent":["import { LDClient, initialize } from 'launchdarkly-js-client-sdk';\nimport { ProviderConfig } from 'launchdarkly-react-client-sdk';\n\nconst ldClients: Map<string, LDClient> = new Map();\n\nexport function getLDClient({ clientSideID, context, options }: ProviderConfig) {\n let client = ldClients.get(clientSideID);\n if (!client) {\n client = initialize(clientSideID, context ?? { kind: 'user', anonymous: true }, options);\n ldClients.set(clientSideID, client);\n }\n return client;\n}\n"],"names":["initialize","ldClients","Map","getLDClient","clientSideID","context","options","client","get","kind","anonymous","set"],"mappings":"AAAA,SAAmBA,UAAU,QAAQ,6BAA6B;AAGlE,MAAMC,YAAmC,IAAIC;AAE7C,OAAO,SAASC,YAAY,EAAEC,YAAY,EAAEC,OAAO,EAAEC,OAAO,EAAkB;IAC1E,IAAIC,SAASN,UAAUO,GAAG,CAACJ;IAC3B,IAAI,CAACG,QAAQ;QACTA,SAASP,WAAWI,cAAcC,oBAAAA,qBAAAA,UAAW;YAAEI,MAAM;YAAQC,WAAW;QAAK,GAAGJ;QAChFL,UAAUU,GAAG,CAACP,cAAcG;IAChC;IACA,OAAOA;AACX"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './create-flag-keys';\nexport * from './feature-flag-store';\nexport * from './get-ld-client';\nexport * from './ld-provider';\nexport * from './ld-service-provider';\nexport * from './types';\nexport * from './with-feature-flag';\n"],"names":[],"mappings":"AAAA,cAAc,qBAAqB;AACnC,cAAc,uBAAuB;AACrC,cAAc,kBAAkB;AAChC,cAAc,gBAAgB;AAC9B,cAAc,wBAAwB;AACtC,cAAc,UAAU;AACxB,cAAc,sBAAsB"}
|
package/dist/ld-provider.js
CHANGED
|
@@ -1,52 +1,68 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { Log } from '@servicetitan/log-service';
|
|
3
3
|
import { provide, useOptionalDependencies } from '@servicetitan/react-ioc';
|
|
4
|
-
import { LDProvider as BaseLDProvider
|
|
4
|
+
import { LDProvider as BaseLDProvider } from 'launchdarkly-react-client-sdk';
|
|
5
5
|
import { useEffect, useReducer, useState } from 'react';
|
|
6
6
|
import { FeatureFlagProvider } from './feature-flag-provider';
|
|
7
7
|
import { FeatureFlagStore } from './feature-flag-store';
|
|
8
8
|
import { getLDClient } from './get-ld-client';
|
|
9
9
|
import { LD_SERVICE_TOKEN } from './types';
|
|
10
10
|
export const LDProvider = provide({
|
|
11
|
-
singletons: [
|
|
12
|
-
|
|
11
|
+
singletons: [
|
|
12
|
+
FeatureFlagStore
|
|
13
|
+
]
|
|
14
|
+
})((props)=>{
|
|
13
15
|
const { children, clientSideID, context, projectName, waitForInitialization = true } = props;
|
|
14
16
|
const [ldClient, setLDClient] = useState();
|
|
15
17
|
const [ldService, log] = useOptionalDependencies(LD_SERVICE_TOKEN, Log);
|
|
16
|
-
const [counter, forceUpdate] = useReducer((x)
|
|
17
|
-
useEffect(()
|
|
18
|
+
const [counter, forceUpdate] = useReducer((x)=>x + 1, 0);
|
|
19
|
+
useEffect(()=>{
|
|
18
20
|
(async function initializeClient() {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
const config = {
|
|
22
|
+
clientSideID,
|
|
23
|
+
context
|
|
24
|
+
};
|
|
25
|
+
var _ldService_getClient;
|
|
26
|
+
const client = (_ldService_getClient = ldService === null || ldService === void 0 ? void 0 : ldService.getClient(config)) !== null && _ldService_getClient !== void 0 ? _ldService_getClient : getLDClient(config);
|
|
22
27
|
if (waitForInitialization) {
|
|
23
28
|
try {
|
|
24
29
|
await client.waitForInitialization(5);
|
|
25
|
-
}
|
|
26
|
-
catch (error) {
|
|
30
|
+
} catch (error) {
|
|
27
31
|
log === null || log === void 0 ? void 0 : log.error({
|
|
28
32
|
category: 'LaunchDarkly',
|
|
29
33
|
code: 'InitializationFailed',
|
|
30
34
|
error,
|
|
31
|
-
message: `"${projectName}" client failed to initialize
|
|
35
|
+
message: `"${projectName}" client failed to initialize`
|
|
32
36
|
});
|
|
33
37
|
}
|
|
34
38
|
}
|
|
35
39
|
setLDClient(client);
|
|
36
40
|
})();
|
|
37
|
-
|
|
38
|
-
}, [
|
|
39
|
-
|
|
41
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
42
|
+
}, [
|
|
43
|
+
clientSideID
|
|
44
|
+
]); // only reload if clientSideID changes
|
|
45
|
+
useEffect(()=>{
|
|
40
46
|
if (!waitForInitialization && ldClient) {
|
|
41
47
|
ldClient.on('initialized', forceUpdate);
|
|
42
|
-
return ()
|
|
48
|
+
return ()=>{
|
|
43
49
|
ldClient.off('initialized', forceUpdate);
|
|
44
50
|
};
|
|
45
51
|
}
|
|
46
|
-
}, [
|
|
52
|
+
}, [
|
|
53
|
+
ldClient,
|
|
54
|
+
waitForInitialization
|
|
55
|
+
]);
|
|
47
56
|
if (!ldClient) {
|
|
48
57
|
return null;
|
|
49
58
|
}
|
|
50
|
-
return
|
|
59
|
+
return /*#__PURE__*/ _jsx(BaseLDProvider, {
|
|
60
|
+
clientSideID: clientSideID,
|
|
61
|
+
ldClient: ldClient,
|
|
62
|
+
children: /*#__PURE__*/ _jsx(FeatureFlagProvider, {
|
|
63
|
+
children: children
|
|
64
|
+
})
|
|
65
|
+
}, counter.toString());
|
|
51
66
|
});
|
|
67
|
+
|
|
52
68
|
//# sourceMappingURL=ld-provider.js.map
|
package/dist/ld-provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/ld-provider.tsx"],"sourcesContent":["import { Log } from '@servicetitan/log-service';\nimport { provide, useOptionalDependencies } from '@servicetitan/react-ioc';\nimport { LDClient } from 'launchdarkly-js-client-sdk';\nimport {\n LDProvider as BaseLDProvider,\n ProviderConfig as BaseProviderConfig,\n} from 'launchdarkly-react-client-sdk';\nimport { FC, PropsWithChildren, useEffect, useReducer, useState } from 'react';\n\nimport { FeatureFlagProvider } from './feature-flag-provider';\nimport { FeatureFlagStore } from './feature-flag-store';\nimport { getLDClient } from './get-ld-client';\nimport { LD_SERVICE_TOKEN } from './types';\n\nexport type ProviderConfig = Pick<BaseProviderConfig, 'clientSideID' | 'context'> & {\n projectName: string;\n waitForInitialization?: boolean;\n};\n\nexport const LDProvider: FC<PropsWithChildren<ProviderConfig>> = provide({\n singletons: [FeatureFlagStore],\n})(props => {\n const { children, clientSideID, context, projectName, waitForInitialization = true } = props;\n const [ldClient, setLDClient] = useState<LDClient>();\n const [ldService, log] = useOptionalDependencies(LD_SERVICE_TOKEN, Log);\n const [counter, forceUpdate] = useReducer((x: number) => x + 1, 0);\n\n useEffect(() => {\n (async function initializeClient() {\n const config = { clientSideID, context };\n const client = ldService?.getClient(config) ?? getLDClient(config);\n if (waitForInitialization) {\n try {\n await client.waitForInitialization(5);\n } catch (error) {\n log?.error({\n category: 'LaunchDarkly',\n code: 'InitializationFailed',\n error,\n message: `\"${projectName}\" client failed to initialize`,\n });\n }\n }\n setLDClient(client);\n })();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [clientSideID]); // only reload if clientSideID changes\n\n useEffect(() => {\n if (!waitForInitialization && ldClient) {\n ldClient.on('initialized', forceUpdate);\n return () => {\n ldClient.off('initialized', forceUpdate);\n };\n }\n }, [ldClient, waitForInitialization]);\n\n if (!ldClient) {\n return null;\n }\n\n return (\n <BaseLDProvider key={counter.toString()} clientSideID={clientSideID} ldClient={ldClient}>\n <FeatureFlagProvider>{children}</FeatureFlagProvider>\n </BaseLDProvider>\n );\n});\n"],"names":["Log","provide","useOptionalDependencies","LDProvider","BaseLDProvider","useEffect","useReducer","useState","FeatureFlagProvider","FeatureFlagStore","getLDClient","LD_SERVICE_TOKEN","singletons","props","children","clientSideID","context","projectName","waitForInitialization","ldClient","setLDClient","ldService","log","counter","forceUpdate","x","initializeClient","config","client","getClient","error","category","code","message","on","off","toString"],"mappings":";AAAA,SAASA,GAAG,QAAQ,4BAA4B;AAChD,SAASC,OAAO,EAAEC,uBAAuB,QAAQ,0BAA0B;AAE3E,SACIC,cAAcC,cAAc,QAEzB,gCAAgC;AACvC,SAAgCC,SAAS,EAAEC,UAAU,EAAEC,QAAQ,QAAQ,QAAQ;AAE/E,SAASC,mBAAmB,QAAQ,0BAA0B;AAC9D,SAASC,gBAAgB,QAAQ,uBAAuB;AACxD,SAASC,WAAW,QAAQ,kBAAkB;AAC9C,SAASC,gBAAgB,QAAQ,UAAU;AAO3C,OAAO,MAAMR,aAAoDF,QAAQ;IACrEW,YAAY;QAACH;KAAiB;AAClC,GAAGI,CAAAA;IACC,MAAM,EAAEC,QAAQ,EAAEC,YAAY,EAAEC,OAAO,EAAEC,WAAW,EAAEC,wBAAwB,IAAI,EAAE,GAAGL;IACvF,MAAM,CAACM,UAAUC,YAAY,GAAGb;IAChC,MAAM,CAACc,WAAWC,IAAI,GAAGpB,wBAAwBS,kBAAkBX;IACnE,MAAM,CAACuB,SAASC,YAAY,GAAGlB,WAAW,CAACmB,IAAcA,IAAI,GAAG;IAEhEpB,UAAU;QACL,CAAA,eAAeqB;YACZ,MAAMC,SAAS;gBAAEZ;gBAAcC;YAAQ;gBACxBK;YAAf,MAAMO,SAASP,CAAAA,uBAAAA,sBAAAA,gCAAAA,UAAWQ,SAAS,CAACF,qBAArBN,kCAAAA,uBAAgCX,YAAYiB;YAC3D,IAAIT,uBAAuB;gBACvB,IAAI;oBACA,MAAMU,OAAOV,qBAAqB,CAAC;gBACvC,EAAE,OAAOY,OAAO;oBACZR,gBAAAA,0BAAAA,IAAKQ,KAAK,CAAC;wBACPC,UAAU;wBACVC,MAAM;wBACNF;wBACAG,SAAS,CAAC,CAAC,EAAEhB,YAAY,6BAA6B,CAAC;oBAC3D;gBACJ;YACJ;YACAG,YAAYQ;QAChB,CAAA;IACA,uDAAuD;IAC3D,GAAG;QAACb;KAAa,GAAG,sCAAsC;IAE1DV,UAAU;QACN,IAAI,CAACa,yBAAyBC,UAAU;YACpCA,SAASe,EAAE,CAAC,eAAeV;YAC3B,OAAO;gBACHL,SAASgB,GAAG,CAAC,eAAeX;YAChC;QACJ;IACJ,GAAG;QAACL;QAAUD;KAAsB;IAEpC,IAAI,CAACC,UAAU;QACX,OAAO;IACX;IAEA,qBACI,KAACf;QAAwCW,cAAcA;QAAcI,UAAUA;kBAC3E,cAAA,KAACX;sBAAqBM;;OADLS,QAAQa,QAAQ;AAI7C,GAAG"}
|
|
@@ -2,9 +2,16 @@ import { provide } from '@servicetitan/react-ioc';
|
|
|
2
2
|
import { getLDClient } from './get-ld-client';
|
|
3
3
|
import { LD_SERVICE_TOKEN } from './types';
|
|
4
4
|
const ldService = {
|
|
5
|
-
getClient: getLDClient
|
|
5
|
+
getClient: getLDClient
|
|
6
6
|
};
|
|
7
7
|
export const LDServiceProvider = provide({
|
|
8
|
-
singletons: [
|
|
9
|
-
|
|
8
|
+
singletons: [
|
|
9
|
+
{
|
|
10
|
+
provide: LD_SERVICE_TOKEN,
|
|
11
|
+
useValue: ldService,
|
|
12
|
+
inherit: true
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
})(({ children })=>children);
|
|
16
|
+
|
|
10
17
|
//# sourceMappingURL=ld-service-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/ld-service-provider.tsx"],"sourcesContent":["import { provide } from '@servicetitan/react-ioc';\n\nimport { getLDClient } from './get-ld-client';\nimport { LD_SERVICE_TOKEN, LDService } from './types';\n\nconst ldService: LDService = {\n getClient: getLDClient,\n};\n\nexport const LDServiceProvider = provide({\n singletons: [{ provide: LD_SERVICE_TOKEN, useValue: ldService, inherit: true }],\n})(({ children }) => children);\n"],"names":["provide","getLDClient","LD_SERVICE_TOKEN","ldService","getClient","LDServiceProvider","singletons","useValue","inherit","children"],"mappings":"AAAA,SAASA,OAAO,QAAQ,0BAA0B;AAElD,SAASC,WAAW,QAAQ,kBAAkB;AAC9C,SAASC,gBAAgB,QAAmB,UAAU;AAEtD,MAAMC,YAAuB;IACzBC,WAAWH;AACf;AAEA,OAAO,MAAMI,oBAAoBL,QAAQ;IACrCM,YAAY;QAAC;YAAEN,SAASE;YAAkBK,UAAUJ;YAAWK,SAAS;QAAK;KAAE;AACnF,GAAG,CAAC,EAAEC,QAAQ,EAAE,GAAKA,UAAU"}
|
package/dist/types.js
CHANGED
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import { symbolToken } from '@servicetitan/react-ioc';\nimport { type LDContext, type LDClient, type LDOptions } from 'launchdarkly-js-client-sdk';\n\nexport const LD_SERVICE_TOKEN = symbolToken<LDService>('LD_SERVICE_TOKEN');\n\nexport interface ClientConfig {\n clientSideID: string;\n context?: LDContext;\n options?: LDOptions;\n}\n\nexport interface LDService {\n getClient: (config: ClientConfig) => LDClient;\n}\n\nexport type FlagKey<S, K extends keyof S> = K & {\n typeRef?: S[K];\n};\n"],"names":["symbolToken","LD_SERVICE_TOKEN"],"mappings":"AAAA,SAASA,WAAW,QAAQ,0BAA0B;AAGtD,OAAO,MAAMC,mBAAmBD,YAAuB,oBAAoB"}
|
|
@@ -5,8 +5,9 @@ export function WithFeatureFlag(props) {
|
|
|
5
5
|
const flagValue = useFlags()[flagKey];
|
|
6
6
|
const isEnabled = value !== undefined ? flagValue === value : !!flagValue;
|
|
7
7
|
if (isEnabled) {
|
|
8
|
-
return props.on ? _jsx(props.on, {}) : props.children;
|
|
8
|
+
return props.on ? /*#__PURE__*/ _jsx(props.on, {}) : props.children;
|
|
9
9
|
}
|
|
10
|
-
return props.off ? _jsx(props.off, {}) : null;
|
|
10
|
+
return props.off ? /*#__PURE__*/ _jsx(props.off, {}) : null;
|
|
11
11
|
}
|
|
12
|
+
|
|
12
13
|
//# sourceMappingURL=with-feature-flag.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/with-feature-flag.tsx"],"sourcesContent":["import { LDFlagSet } from 'launchdarkly-js-client-sdk';\nimport { useFlags } from 'launchdarkly-react-client-sdk';\nimport { ComponentType, ReactNode } from 'react';\nimport { FlagKey } from './types';\n\ninterface BaseProps<S extends LDFlagSet, T extends keyof S> {\n flagKey: FlagKey<S, T>;\n off?: ComponentType;\n value?: S[T];\n}\n\nexport type WithFeatureFlagProps<S extends LDFlagSet, T extends keyof S = keyof S> =\n | (BaseProps<S, T> & { children?: ReactNode; on?: never })\n | (BaseProps<S, T> & { on?: ComponentType; children?: never });\n\nexport function WithFeatureFlag<S extends LDFlagSet, T extends keyof S = keyof S>(\n props: WithFeatureFlagProps<S, T>\n): ReactNode {\n const { flagKey, value } = props;\n const flagValue = useFlags<S>()[flagKey];\n\n const isEnabled = value !== undefined ? flagValue === value : !!flagValue;\n if (isEnabled) {\n return props.on ? <props.on /> : props.children;\n }\n\n return props.off ? <props.off /> : null;\n}\n"],"names":["useFlags","WithFeatureFlag","props","flagKey","value","flagValue","isEnabled","undefined","on","children","off"],"mappings":";AACA,SAASA,QAAQ,QAAQ,gCAAgC;AAczD,OAAO,SAASC,gBACZC,KAAiC;IAEjC,MAAM,EAAEC,OAAO,EAAEC,KAAK,EAAE,GAAGF;IAC3B,MAAMG,YAAYL,UAAa,CAACG,QAAQ;IAExC,MAAMG,YAAYF,UAAUG,YAAYF,cAAcD,QAAQ,CAAC,CAACC;IAChE,IAAIC,WAAW;QACX,OAAOJ,MAAMM,EAAE,iBAAG,KAACN,MAAMM,EAAE,QAAMN,MAAMO,QAAQ;IACnD;IAEA,OAAOP,MAAMQ,GAAG,iBAAG,KAACR,MAAMQ,GAAG,QAAM;AACvC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@servicetitan/launchdarkly-service",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "31.0.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"homepage": "https://docs.st.dev/docs/frontend/launchdarkly-service",
|
|
6
6
|
"repository": {
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
"src"
|
|
17
17
|
],
|
|
18
18
|
"devDependencies": {
|
|
19
|
-
"@servicetitan/log-service": "
|
|
20
|
-
"@servicetitan/react-ioc": "
|
|
19
|
+
"@servicetitan/log-service": "31.0.0",
|
|
20
|
+
"@servicetitan/react-ioc": "31.0.0",
|
|
21
21
|
"@testing-library/dom": "^10.4.0",
|
|
22
22
|
"@testing-library/jest-dom": "^6.6.3",
|
|
23
23
|
"@testing-library/react": "^16.3.0",
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"react": "~18.3.1"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
30
|
-
"@servicetitan/log-service": "
|
|
31
|
-
"@servicetitan/react-ioc": "
|
|
30
|
+
"@servicetitan/log-service": "31.0.0",
|
|
31
|
+
"@servicetitan/react-ioc": "31.0.0",
|
|
32
32
|
"launchdarkly-js-client-sdk": "3.5.0",
|
|
33
33
|
"launchdarkly-react-client-sdk": "3.6.1",
|
|
34
34
|
"mobx": ">= 6.13.7",
|
|
@@ -40,5 +40,5 @@
|
|
|
40
40
|
"cli": {
|
|
41
41
|
"webpack": false
|
|
42
42
|
},
|
|
43
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "c52e188a1217df74052774a2eea6a5126089e3d5"
|
|
44
44
|
}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { useDependencies } from '@servicetitan/react-ioc';
|
|
2
2
|
import { useFlags } from 'launchdarkly-react-client-sdk';
|
|
3
|
-
import { PropsWithChildren, useEffect } from 'react';
|
|
3
|
+
import { PropsWithChildren, useEffect, useState } from 'react';
|
|
4
4
|
|
|
5
5
|
import { FeatureFlagStore } from './feature-flag-store';
|
|
6
6
|
|
|
7
7
|
export function FeatureFlagProvider({ children }: PropsWithChildren) {
|
|
8
|
+
const [initialized, setInitialized] = useState(false);
|
|
8
9
|
const [{ setFlags }] = useDependencies(FeatureFlagStore);
|
|
9
10
|
const flags = useFlags();
|
|
10
11
|
|
|
11
12
|
useEffect(() => {
|
|
12
13
|
setFlags(flags);
|
|
14
|
+
setInitialized(true);
|
|
13
15
|
}, [flags, setFlags]);
|
|
14
16
|
|
|
15
|
-
return children;
|
|
17
|
+
return initialized ? children : null;
|
|
16
18
|
}
|