@servicetitan/launchdarkly-service 33.0.0 → 33.1.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 +1 @@
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
+ {"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,6BAclE"}
@@ -1,15 +1,19 @@
1
1
  import { useDependencies } from '@servicetitan/react-ioc';
2
- import { useFlags } from 'launchdarkly-react-client-sdk';
2
+ import { useFlags, useLDClient } from 'launchdarkly-react-client-sdk';
3
3
  import { useEffect, useState } from 'react';
4
4
  import { FeatureFlagStore } from './feature-flag-store';
5
5
  export function FeatureFlagProvider({ children }) {
6
6
  const [initialized, setInitialized] = useState(false);
7
7
  const [{ setFlags }] = useDependencies(FeatureFlagStore);
8
+ const client = useLDClient();
8
9
  const flags = useFlags();
9
10
  useEffect(()=>{
10
- setFlags(flags);
11
- setInitialized(true);
11
+ if (client) {
12
+ setFlags(flags);
13
+ setInitialized(true);
14
+ }
12
15
  }, [
16
+ client,
13
17
  flags,
14
18
  setFlags
15
19
  ]);
@@ -1 +1 @@
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
+ {"version":3,"sources":["../src/feature-flag-provider.tsx"],"sourcesContent":["import { useDependencies } from '@servicetitan/react-ioc';\nimport { useFlags, useLDClient } 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 client = useLDClient();\n const flags = useFlags();\n\n useEffect(() => {\n if (client) {\n setFlags(flags);\n setInitialized(true);\n }\n }, [client, flags, setFlags]);\n\n return initialized ? children : null;\n}\n"],"names":["useDependencies","useFlags","useLDClient","useEffect","useState","FeatureFlagStore","FeatureFlagProvider","children","initialized","setInitialized","setFlags","client","flags"],"mappings":"AAAA,SAASA,eAAe,QAAQ,0BAA0B;AAC1D,SAASC,QAAQ,EAAEC,WAAW,QAAQ,gCAAgC;AACtE,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,GAAGV,gBAAgBK;IACvC,MAAMM,SAAST;IACf,MAAMU,QAAQX;IAEdE,UAAU;QACN,IAAIQ,QAAQ;YACRD,SAASE;YACTH,eAAe;QACnB;IACJ,GAAG;QAACE;QAAQC;QAAOF;KAAS;IAE5B,OAAOF,cAAcD,WAAW;AACpC"}
@@ -4,8 +4,9 @@ import { Provider } from '@servicetitan/react-ioc';
4
4
  import { render, screen } from '@testing-library/react';
5
5
  import { FeatureFlagProvider } from '../feature-flag-provider';
6
6
  import { FeatureFlagStore } from '../feature-flag-store';
7
- import { useFlags } from 'launchdarkly-react-client-sdk';
7
+ import { useFlags, useLDClient } from 'launchdarkly-react-client-sdk';
8
8
  jest.mock('launchdarkly-react-client-sdk', ()=>({
9
+ useLDClient: jest.fn(),
9
10
  useFlags: jest.fn()
10
11
  }));
11
12
  describe(`[launchdarkly-service] ${FeatureFlagProvider.name}`, ()=>{
@@ -13,13 +14,16 @@ describe(`[launchdarkly-service] ${FeatureFlagProvider.name}`, ()=>{
13
14
  foo: 'bar',
14
15
  baz: 'qux'
15
16
  };
17
+ const componentText = '<Component />';
16
18
  const mockFeatureFlagStore = {
17
19
  setFlags: jest.fn()
18
20
  };
19
21
  const Component = ()=>{
20
- return `<Component />`;
22
+ return componentText;
21
23
  };
22
24
  beforeEach(()=>{
25
+ jest.clearAllMocks();
26
+ jest.mocked(useLDClient).mockImplementation(()=>({}));
23
27
  jest.mocked(useFlags).mockImplementation(()=>flags);
24
28
  });
25
29
  const subject = ()=>render(/*#__PURE__*/ _jsx(Provider, {
@@ -35,12 +39,20 @@ describe(`[launchdarkly-service] ${FeatureFlagProvider.name}`, ()=>{
35
39
  }));
36
40
  test('renders children', ()=>{
37
41
  subject();
38
- expect(screen.getByText(`<Component />`)).toBeInTheDocument();
42
+ expect(screen.getByText(componentText)).toBeInTheDocument();
39
43
  });
40
44
  test('sets feature flags in store', ()=>{
41
45
  subject();
42
46
  expect(mockFeatureFlagStore.setFlags).toHaveBeenCalledWith(flags);
43
47
  });
48
+ describe('when client is not ready', ()=>{
49
+ beforeEach(()=>jest.mocked(useLDClient).mockReturnValue(undefined));
50
+ test('does nothing', ()=>{
51
+ subject();
52
+ expect(screen.queryByText(componentText)).not.toBeInTheDocument();
53
+ expect(mockFeatureFlagStore.setFlags).not.toHaveBeenCalledWith(flags);
54
+ });
55
+ });
44
56
  });
45
57
 
46
58
  //# sourceMappingURL=feature-flag-provider.test.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/tests/feature-flag-provider.test.tsx"],"sourcesContent":["import '@testing-library/jest-dom';\nimport { Provider } from '@servicetitan/react-ioc';\nimport { FC } from 'react';\nimport { render, screen } from '@testing-library/react';\n\nimport { FeatureFlagProvider } from '../feature-flag-provider';\nimport { FeatureFlagStore } from '../feature-flag-store';\nimport { useFlags } from 'launchdarkly-react-client-sdk';\n\njest.mock('launchdarkly-react-client-sdk', () => ({\n useFlags: jest.fn(),\n}));\n\ndescribe(`[launchdarkly-service] ${FeatureFlagProvider.name}`, () => {\n const flags = { foo: 'bar', baz: 'qux' };\n const mockFeatureFlagStore = {\n setFlags: jest.fn(),\n };\n\n const Component: FC = () => {\n return `<Component />`;\n };\n\n beforeEach(() => {\n jest.mocked(useFlags).mockImplementation(() => flags);\n });\n\n const subject = () =>\n render(\n <Provider singletons={[{ provide: FeatureFlagStore, useValue: mockFeatureFlagStore }]}>\n <FeatureFlagProvider>\n <Component />\n </FeatureFlagProvider>\n </Provider>\n );\n\n test('renders children', () => {\n subject();\n\n expect(screen.getByText(`<Component />`)).toBeInTheDocument();\n });\n\n test('sets feature flags in store', () => {\n subject();\n\n expect(mockFeatureFlagStore.setFlags).toHaveBeenCalledWith(flags);\n });\n});\n"],"names":["Provider","render","screen","FeatureFlagProvider","FeatureFlagStore","useFlags","jest","mock","fn","describe","name","flags","foo","baz","mockFeatureFlagStore","setFlags","Component","beforeEach","mocked","mockImplementation","subject","singletons","provide","useValue","test","expect","getByText","toBeInTheDocument","toHaveBeenCalledWith"],"mappings":";AAAA,OAAO,4BAA4B;AACnC,SAASA,QAAQ,QAAQ,0BAA0B;AAEnD,SAASC,MAAM,EAAEC,MAAM,QAAQ,yBAAyB;AAExD,SAASC,mBAAmB,QAAQ,2BAA2B;AAC/D,SAASC,gBAAgB,QAAQ,wBAAwB;AACzD,SAASC,QAAQ,QAAQ,gCAAgC;AAEzDC,KAAKC,IAAI,CAAC,iCAAiC,IAAO,CAAA;QAC9CF,UAAUC,KAAKE,EAAE;IACrB,CAAA;AAEAC,SAAS,CAAC,uBAAuB,EAAEN,oBAAoBO,IAAI,EAAE,EAAE;IAC3D,MAAMC,QAAQ;QAAEC,KAAK;QAAOC,KAAK;IAAM;IACvC,MAAMC,uBAAuB;QACzBC,UAAUT,KAAKE,EAAE;IACrB;IAEA,MAAMQ,YAAgB;QAClB,OAAO,CAAC,aAAa,CAAC;IAC1B;IAEAC,WAAW;QACPX,KAAKY,MAAM,CAACb,UAAUc,kBAAkB,CAAC,IAAMR;IACnD;IAEA,MAAMS,UAAU,IACZnB,qBACI,KAACD;YAASqB,YAAY;gBAAC;oBAAEC,SAASlB;oBAAkBmB,UAAUT;gBAAqB;aAAE;sBACjF,cAAA,KAACX;0BACG,cAAA,KAACa;;;IAKjBQ,KAAK,oBAAoB;QACrBJ;QAEAK,OAAOvB,OAAOwB,SAAS,CAAC,CAAC,aAAa,CAAC,GAAGC,iBAAiB;IAC/D;IAEAH,KAAK,+BAA+B;QAChCJ;QAEAK,OAAOX,qBAAqBC,QAAQ,EAAEa,oBAAoB,CAACjB;IAC/D;AACJ"}
1
+ {"version":3,"sources":["../../src/tests/feature-flag-provider.test.tsx"],"sourcesContent":["import '@testing-library/jest-dom';\nimport { Provider } from '@servicetitan/react-ioc';\nimport { FC } from 'react';\nimport { render, screen } from '@testing-library/react';\n\nimport { FeatureFlagProvider } from '../feature-flag-provider';\nimport { FeatureFlagStore } from '../feature-flag-store';\nimport { useFlags, useLDClient } from 'launchdarkly-react-client-sdk';\n\njest.mock('launchdarkly-react-client-sdk', () => ({\n useLDClient: jest.fn(),\n useFlags: jest.fn(),\n}));\n\ndescribe(`[launchdarkly-service] ${FeatureFlagProvider.name}`, () => {\n const flags = { foo: 'bar', baz: 'qux' };\n const componentText = '<Component />';\n const mockFeatureFlagStore = {\n setFlags: jest.fn(),\n };\n\n const Component: FC = () => {\n return componentText;\n };\n\n beforeEach(() => {\n jest.clearAllMocks();\n jest.mocked(useLDClient).mockImplementation(() => ({}) as any);\n jest.mocked(useFlags).mockImplementation(() => flags);\n });\n\n const subject = () =>\n render(\n <Provider singletons={[{ provide: FeatureFlagStore, useValue: mockFeatureFlagStore }]}>\n <FeatureFlagProvider>\n <Component />\n </FeatureFlagProvider>\n </Provider>\n );\n\n test('renders children', () => {\n subject();\n\n expect(screen.getByText(componentText)).toBeInTheDocument();\n });\n\n test('sets feature flags in store', () => {\n subject();\n\n expect(mockFeatureFlagStore.setFlags).toHaveBeenCalledWith(flags);\n });\n\n describe('when client is not ready', () => {\n beforeEach(() => jest.mocked(useLDClient).mockReturnValue(undefined));\n\n test('does nothing', () => {\n subject();\n\n expect(screen.queryByText(componentText)).not.toBeInTheDocument();\n expect(mockFeatureFlagStore.setFlags).not.toHaveBeenCalledWith(flags);\n });\n });\n});\n"],"names":["Provider","render","screen","FeatureFlagProvider","FeatureFlagStore","useFlags","useLDClient","jest","mock","fn","describe","name","flags","foo","baz","componentText","mockFeatureFlagStore","setFlags","Component","beforeEach","clearAllMocks","mocked","mockImplementation","subject","singletons","provide","useValue","test","expect","getByText","toBeInTheDocument","toHaveBeenCalledWith","mockReturnValue","undefined","queryByText","not"],"mappings":";AAAA,OAAO,4BAA4B;AACnC,SAASA,QAAQ,QAAQ,0BAA0B;AAEnD,SAASC,MAAM,EAAEC,MAAM,QAAQ,yBAAyB;AAExD,SAASC,mBAAmB,QAAQ,2BAA2B;AAC/D,SAASC,gBAAgB,QAAQ,wBAAwB;AACzD,SAASC,QAAQ,EAAEC,WAAW,QAAQ,gCAAgC;AAEtEC,KAAKC,IAAI,CAAC,iCAAiC,IAAO,CAAA;QAC9CF,aAAaC,KAAKE,EAAE;QACpBJ,UAAUE,KAAKE,EAAE;IACrB,CAAA;AAEAC,SAAS,CAAC,uBAAuB,EAAEP,oBAAoBQ,IAAI,EAAE,EAAE;IAC3D,MAAMC,QAAQ;QAAEC,KAAK;QAAOC,KAAK;IAAM;IACvC,MAAMC,gBAAgB;IACtB,MAAMC,uBAAuB;QACzBC,UAAUV,KAAKE,EAAE;IACrB;IAEA,MAAMS,YAAgB;QAClB,OAAOH;IACX;IAEAI,WAAW;QACPZ,KAAKa,aAAa;QAClBb,KAAKc,MAAM,CAACf,aAAagB,kBAAkB,CAAC,IAAO,CAAA,CAAC,CAAA;QACpDf,KAAKc,MAAM,CAAChB,UAAUiB,kBAAkB,CAAC,IAAMV;IACnD;IAEA,MAAMW,UAAU,IACZtB,qBACI,KAACD;YAASwB,YAAY;gBAAC;oBAAEC,SAASrB;oBAAkBsB,UAAUV;gBAAqB;aAAE;sBACjF,cAAA,KAACb;0BACG,cAAA,KAACe;;;IAKjBS,KAAK,oBAAoB;QACrBJ;QAEAK,OAAO1B,OAAO2B,SAAS,CAACd,gBAAgBe,iBAAiB;IAC7D;IAEAH,KAAK,+BAA+B;QAChCJ;QAEAK,OAAOZ,qBAAqBC,QAAQ,EAAEc,oBAAoB,CAACnB;IAC/D;IAEAF,SAAS,4BAA4B;QACjCS,WAAW,IAAMZ,KAAKc,MAAM,CAACf,aAAa0B,eAAe,CAACC;QAE1DN,KAAK,gBAAgB;YACjBJ;YAEAK,OAAO1B,OAAOgC,WAAW,CAACnB,gBAAgBoB,GAAG,CAACL,iBAAiB;YAC/DF,OAAOZ,qBAAqBC,QAAQ,EAAEkB,GAAG,CAACJ,oBAAoB,CAACnB;QACnE;IACJ;AACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/launchdarkly-service",
3
- "version": "33.0.0",
3
+ "version": "33.1.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": "33.0.0",
20
- "@servicetitan/react-ioc": "33.0.0",
19
+ "@servicetitan/log-service": "33.1.0",
20
+ "@servicetitan/react-ioc": "33.1.0",
21
21
  "@testing-library/dom": "^10.4.1",
22
22
  "@testing-library/jest-dom": "^6.9.1",
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": "33.0.0",
31
- "@servicetitan/react-ioc": "33.0.0",
30
+ "@servicetitan/log-service": "33.1.0",
31
+ "@servicetitan/react-ioc": "33.1.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": "31ea85a4348eec3402ac60008c9c2944d34bdbb2"
43
+ "gitHead": "126948560bcb684f276373beb7ce45faac94205c"
44
44
  }
@@ -1,5 +1,5 @@
1
1
  import { useDependencies } from '@servicetitan/react-ioc';
2
- import { useFlags } from 'launchdarkly-react-client-sdk';
2
+ import { useFlags, useLDClient } from 'launchdarkly-react-client-sdk';
3
3
  import { PropsWithChildren, useEffect, useState } from 'react';
4
4
 
5
5
  import { FeatureFlagStore } from './feature-flag-store';
@@ -7,12 +7,15 @@ import { FeatureFlagStore } from './feature-flag-store';
7
7
  export function FeatureFlagProvider({ children }: PropsWithChildren) {
8
8
  const [initialized, setInitialized] = useState(false);
9
9
  const [{ setFlags }] = useDependencies(FeatureFlagStore);
10
+ const client = useLDClient();
10
11
  const flags = useFlags();
11
12
 
12
13
  useEffect(() => {
13
- setFlags(flags);
14
- setInitialized(true);
15
- }, [flags, setFlags]);
14
+ if (client) {
15
+ setFlags(flags);
16
+ setInitialized(true);
17
+ }
18
+ }, [client, flags, setFlags]);
16
19
 
17
20
  return initialized ? children : null;
18
21
  }
@@ -5,23 +5,27 @@ import { render, screen } from '@testing-library/react';
5
5
 
6
6
  import { FeatureFlagProvider } from '../feature-flag-provider';
7
7
  import { FeatureFlagStore } from '../feature-flag-store';
8
- import { useFlags } from 'launchdarkly-react-client-sdk';
8
+ import { useFlags, useLDClient } from 'launchdarkly-react-client-sdk';
9
9
 
10
10
  jest.mock('launchdarkly-react-client-sdk', () => ({
11
+ useLDClient: jest.fn(),
11
12
  useFlags: jest.fn(),
12
13
  }));
13
14
 
14
15
  describe(`[launchdarkly-service] ${FeatureFlagProvider.name}`, () => {
15
16
  const flags = { foo: 'bar', baz: 'qux' };
17
+ const componentText = '<Component />';
16
18
  const mockFeatureFlagStore = {
17
19
  setFlags: jest.fn(),
18
20
  };
19
21
 
20
22
  const Component: FC = () => {
21
- return `<Component />`;
23
+ return componentText;
22
24
  };
23
25
 
24
26
  beforeEach(() => {
27
+ jest.clearAllMocks();
28
+ jest.mocked(useLDClient).mockImplementation(() => ({}) as any);
25
29
  jest.mocked(useFlags).mockImplementation(() => flags);
26
30
  });
27
31
 
@@ -37,7 +41,7 @@ describe(`[launchdarkly-service] ${FeatureFlagProvider.name}`, () => {
37
41
  test('renders children', () => {
38
42
  subject();
39
43
 
40
- expect(screen.getByText(`<Component />`)).toBeInTheDocument();
44
+ expect(screen.getByText(componentText)).toBeInTheDocument();
41
45
  });
42
46
 
43
47
  test('sets feature flags in store', () => {
@@ -45,4 +49,15 @@ describe(`[launchdarkly-service] ${FeatureFlagProvider.name}`, () => {
45
49
 
46
50
  expect(mockFeatureFlagStore.setFlags).toHaveBeenCalledWith(flags);
47
51
  });
52
+
53
+ describe('when client is not ready', () => {
54
+ beforeEach(() => jest.mocked(useLDClient).mockReturnValue(undefined));
55
+
56
+ test('does nothing', () => {
57
+ subject();
58
+
59
+ expect(screen.queryByText(componentText)).not.toBeInTheDocument();
60
+ expect(mockFeatureFlagStore.setFlags).not.toHaveBeenCalledWith(flags);
61
+ });
62
+ });
48
63
  });