@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.
- package/dist/feature-flag-provider.d.ts.map +1 -1
- package/dist/feature-flag-provider.js +7 -3
- package/dist/feature-flag-provider.js.map +1 -1
- package/dist/tests/feature-flag-provider.test.js +15 -3
- package/dist/tests/feature-flag-provider.test.js.map +1 -1
- package/package.json +6 -6
- package/src/feature-flag-provider.tsx +7 -4
- package/src/tests/feature-flag-provider.test.tsx +18 -3
|
@@ -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,
|
|
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
|
-
|
|
11
|
-
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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.
|
|
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.
|
|
20
|
-
"@servicetitan/react-ioc": "33.
|
|
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.
|
|
31
|
-
"@servicetitan/react-ioc": "33.
|
|
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": "
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
|
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(
|
|
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
|
});
|