@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.
@@ -1,4 +1,8 @@
1
1
  export function createFlagKeys(...keys) {
2
- return keys.reduce((result, key) => ({ ...result, [key]: key }), {});
2
+ return keys.reduce((result, key)=>({
3
+ ...result,
4
+ [key]: key
5
+ }), {});
3
6
  }
7
+
4
8
  //# sourceMappingURL=create-flag-keys.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-flag-keys.js","sourceRoot":"","sources":["../src/create-flag-keys.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,cAAc,CAAI,GAAG,IAAiB;IAClD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAiB,CAAC,CAAC;AACxF,CAAC"}
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,EAAa,MAAM,OAAO,CAAC;AAIrD,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,EAAE,iBAAiB,6BASlE"}
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
- }, [flags, setFlags]);
11
- return children;
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,"file":"feature-flag-provider.js","sourceRoot":"","sources":["../src/feature-flag-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAqB,SAAS,EAAE,MAAM,OAAO,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,UAAU,mBAAmB,CAAC,EAAE,QAAQ,EAAqB;IAC/D,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IAEzB,SAAS,CAAC,GAAG,EAAE;QACX,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEtB,OAAO,QAAQ,CAAC;AACpB,CAAC"}
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
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
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 (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;
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
- var __metadata = (this && this.__metadata) || function (k, v) {
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
- let FeatureFlagStore = class FeatureFlagStore {
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
- Object.defineProperty(this, "flags", {
16
- enumerable: true,
17
- configurable: true,
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
- __decorate([
34
+ }
35
+ _ts_decorate([
33
36
  observable,
34
- __metadata("design:type", Object)
37
+ _ts_metadata("design:type", typeof T === "undefined" ? Object : T)
35
38
  ], FeatureFlagStore.prototype, "flags", void 0);
36
- __decorate([
37
- action,
38
- __metadata("design:type", Object)
39
+ _ts_decorate([
40
+ action
39
41
  ], FeatureFlagStore.prototype, "setFlags", void 0);
40
- FeatureFlagStore = __decorate([
42
+ FeatureFlagStore = _ts_decorate([
41
43
  injectable(),
42
- __metadata("design:paramtypes", [])
44
+ _ts_metadata("design:type", Function),
45
+ _ts_metadata("design:paramtypes", [])
43
46
  ], FeatureFlagStore);
44
- export { FeatureFlagStore };
47
+
45
48
  //# sourceMappingURL=feature-flag-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flag-store.js","sourceRoot":"","sources":["../src/feature-flag-store.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAGnD,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAIzB;QAHA,yJAAyJ;QAC7I;;;;mBAAW,EAAe;WAAC;QAOvC;;;;mBAAW,CAAC,KAAQ,EAAE,EAAE;gBACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACvB,CAAC;WAAC;QANE,cAAc,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;CAMJ,CAAA;AAVe;IAAX,UAAU;;+CAA4B;AAOvC;IADC,MAAM;;kDAGL;AAXO,gBAAgB;IAD5B,UAAU,EAAE;;GACA,gBAAgB,CAY5B"}
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"}
@@ -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 : { kind: 'user', anonymous: true }, options);
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,"file":"get-ld-client.js","sourceRoot":"","sources":["../src/get-ld-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAGlE,MAAM,SAAS,GAA0B,IAAI,GAAG,EAAE,CAAC;AAEnD,MAAM,UAAU,WAAW,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAkB;IAC1E,IAAI,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,GAAG,UAAU,CAAC,YAAY,EAAE,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;QACzF,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC"}
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
@@ -5,4 +5,5 @@ export * from './ld-provider';
5
5
  export * from './ld-service-provider';
6
6
  export * from './types';
7
7
  export * from './with-feature-flag';
8
+
8
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,qBAAqB,CAAC"}
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"}
@@ -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, } from 'launchdarkly-react-client-sdk';
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: [FeatureFlagStore],
12
- })(props => {
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) => x + 1, 0);
17
- useEffect(() => {
18
+ const [counter, forceUpdate] = useReducer((x)=>x + 1, 0);
19
+ useEffect(()=>{
18
20
  (async function initializeClient() {
19
- var _a;
20
- const config = { clientSideID, context };
21
- const client = (_a = ldService === null || ldService === void 0 ? void 0 : ldService.getClient(config)) !== null && _a !== void 0 ? _a : getLDClient(config);
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
- // eslint-disable-next-line react-hooks/exhaustive-deps
38
- }, [clientSideID]); // only reload if clientSideID changes
39
- useEffect(() => {
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
- }, [ldClient, waitForInitialization]);
52
+ }, [
53
+ ldClient,
54
+ waitForInitialization
55
+ ]);
47
56
  if (!ldClient) {
48
57
  return null;
49
58
  }
50
- return (_jsx(BaseLDProvider, { clientSideID: clientSideID, ldClient: ldClient, children: _jsx(FeatureFlagProvider, { children: children }) }, counter.toString()));
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
@@ -1 +1 @@
1
- {"version":3,"file":"ld-provider.js","sourceRoot":"","sources":["../src/ld-provider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAE3E,OAAO,EACH,UAAU,IAAI,cAAc,GAE/B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAyB,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAO3C,MAAM,CAAC,MAAM,UAAU,GAA0C,OAAO,CAAC;IACrE,UAAU,EAAE,CAAC,gBAAgB,CAAC;CACjC,CAAC,CAAC,KAAK,CAAC,EAAE;IACP,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,qBAAqB,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAC7F,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,EAAY,CAAC;IACrD,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,uBAAuB,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;IACxE,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,UAAU,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAEnE,SAAS,CAAC,GAAG,EAAE;QACX,CAAC,KAAK,UAAU,gBAAgB;;YAC5B,MAAM,MAAM,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,SAAS,CAAC,MAAM,CAAC,mCAAI,WAAW,CAAC,MAAM,CAAC,CAAC;YACnE,IAAI,qBAAqB,EAAE,CAAC;gBACxB,IAAI,CAAC;oBACD,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;gBAC1C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACb,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,KAAK,CAAC;wBACP,QAAQ,EAAE,cAAc;wBACxB,IAAI,EAAE,sBAAsB;wBAC5B,KAAK;wBACL,OAAO,EAAE,IAAI,WAAW,+BAA+B;qBAC1D,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;YACD,WAAW,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC,CAAC,EAAE,CAAC;QACL,uDAAuD;IAC3D,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,sCAAsC;IAE1D,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,qBAAqB,IAAI,QAAQ,EAAE,CAAC;YACrC,QAAQ,CAAC,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;YACxC,OAAO,GAAG,EAAE;gBACR,QAAQ,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;YAC7C,CAAC,CAAC;QACN,CAAC;IACL,CAAC,EAAE,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAEtC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,CACH,KAAC,cAAc,IAA0B,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,YACnF,KAAC,mBAAmB,cAAE,QAAQ,GAAuB,IADpC,OAAO,CAAC,QAAQ,EAAE,CAEtB,CACpB,CAAC;AACN,CAAC,CAAC,CAAC"}
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: [{ provide: LD_SERVICE_TOKEN, useValue: ldService, inherit: true }],
9
- })(({ children }) => children);
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,"file":"ld-service-provider.js","sourceRoot":"","sources":["../src/ld-service-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAa,MAAM,SAAS,CAAC;AAEtD,MAAM,SAAS,GAAc;IACzB,SAAS,EAAE,WAAW;CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC;IACrC,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;CAClF,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC"}
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
@@ -1,3 +1,4 @@
1
1
  import { symbolToken } from '@servicetitan/react-ioc';
2
2
  export const LD_SERVICE_TOKEN = symbolToken('LD_SERVICE_TOKEN');
3
+
3
4
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAY,kBAAkB,CAAC,CAAC"}
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,"file":"with-feature-flag.js","sourceRoot":"","sources":["../src/with-feature-flag.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAczD,MAAM,UAAU,eAAe,CAC3B,KAAiC;IAEjC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACjC,MAAM,SAAS,GAAG,QAAQ,EAAK,CAAC,OAAO,CAAC,CAAC;IAEzC,MAAM,SAAS,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,IAAI,SAAS,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAC,KAAK,CAAC,EAAE,KAAG,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;IACpD,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAC,KAAK,CAAC,GAAG,KAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5C,CAAC"}
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": "30.3.0",
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": "30.3.0",
20
- "@servicetitan/react-ioc": "30.3.0",
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": "30.3.0",
31
- "@servicetitan/react-ioc": "30.3.0",
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": "7521e8d9534299652c39fb5e71348c68120aee70"
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
  }