@servicetitan/launchdarkly-service 29.0.0 → 30.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/launchdarkly-service",
3
- "version": "29.0.0",
3
+ "version": "30.0.0",
4
4
  "description": "",
5
5
  "homepage": "https://docs.st.dev/docs/frontend/launchdarkly-service",
6
6
  "repository": {
@@ -16,22 +16,22 @@
16
16
  "src"
17
17
  ],
18
18
  "devDependencies": {
19
- "@servicetitan/log-service": "29.0.0",
20
- "@servicetitan/react-ioc": "29.0.0",
19
+ "@servicetitan/log-service": "30.0.0",
20
+ "@servicetitan/react-ioc": "30.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.2.0",
24
24
  "launchdarkly-js-client-sdk": "3.5.0",
25
25
  "launchdarkly-react-client-sdk": "^3.6.1",
26
- "mobx": "~6.13.6",
26
+ "mobx": "~6.13.7",
27
27
  "react": "~18.3.1"
28
28
  },
29
29
  "peerDependencies": {
30
- "@servicetitan/log-service": "29.0.0",
31
- "@servicetitan/react-ioc": "29.0.0",
30
+ "@servicetitan/log-service": "30.0.0",
31
+ "@servicetitan/react-ioc": "30.0.0",
32
32
  "launchdarkly-js-client-sdk": "3.5.0",
33
33
  "launchdarkly-react-client-sdk": "^3.6.1",
34
- "mobx": ">= 6.13.6",
34
+ "mobx": ">= 6.13.7",
35
35
  "react": ">=17.0.2"
36
36
  },
37
37
  "publishConfig": {
@@ -40,5 +40,5 @@
40
40
  "cli": {
41
41
  "webpack": false
42
42
  },
43
- "gitHead": "67b2763ad7c21532ea47c920974f87e8de433d32"
43
+ "gitHead": "e182cbb85cf66d62f235a9ca172fc04dc705fd0a"
44
44
  }
@@ -1,2 +0,0 @@
1
- import '@testing-library/jest-dom';
2
- //# sourceMappingURL=feature-flag-provider.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feature-flag-provider.test.d.ts","sourceRoot":"","sources":["../../src/tests/feature-flag-provider.test.tsx"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC"}
@@ -1,32 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import '@testing-library/jest-dom';
3
- import { Provider } from '@servicetitan/react-ioc';
4
- import { render, screen } from '@testing-library/react';
5
- import { FeatureFlagProvider } from '../feature-flag-provider';
6
- import { FeatureFlagStore } from '../feature-flag-store';
7
- import { useFlags } from 'launchdarkly-react-client-sdk';
8
- jest.mock('launchdarkly-react-client-sdk', () => ({
9
- useFlags: jest.fn(),
10
- }));
11
- describe(`[launchdarkly-service] ${FeatureFlagProvider.name}`, () => {
12
- const flags = { foo: 'bar', baz: 'qux' };
13
- const mockFeatureFlagStore = {
14
- setFlags: jest.fn(),
15
- };
16
- const Component = () => {
17
- return `<Component />`;
18
- };
19
- beforeEach(() => {
20
- jest.mocked(useFlags).mockImplementation(() => flags);
21
- });
22
- const subject = () => render(_jsx(Provider, { singletons: [{ provide: FeatureFlagStore, useValue: mockFeatureFlagStore }], children: _jsx(FeatureFlagProvider, { children: _jsx(Component, {}) }) }));
23
- test('renders children', () => {
24
- subject();
25
- expect(screen.getByText(`<Component />`)).toBeInTheDocument();
26
- });
27
- test('sets feature flags in store', () => {
28
- subject();
29
- expect(mockFeatureFlagStore.setFlags).toHaveBeenCalledWith(flags);
30
- });
31
- });
32
- //# sourceMappingURL=feature-flag-provider.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feature-flag-provider.test.js","sourceRoot":"","sources":["../../src/tests/feature-flag-provider.test.tsx"],"names":[],"mappings":";AAAA,OAAO,2BAA2B,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEzD,IAAI,CAAC,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9C,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;CACtB,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,0BAA0B,mBAAmB,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE;IAChE,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IACzC,MAAM,oBAAoB,GAAG;QACzB,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;KACtB,CAAC;IAEF,MAAM,SAAS,GAAO,GAAG,EAAE;QACvB,OAAO,eAAe,CAAC;IAC3B,CAAC,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACZ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,GAAG,EAAE,CACjB,MAAM,CACF,KAAC,QAAQ,IAAC,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,oBAAoB,EAAE,CAAC,YACjF,KAAC,mBAAmB,cAChB,KAAC,SAAS,KAAG,GACK,GACf,CACd,CAAC;IAEN,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,OAAO,EAAE,CAAC;QAEV,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,OAAO,EAAE,CAAC;QAEV,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=feature-flag-store.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feature-flag-store.test.d.ts","sourceRoot":"","sources":["../../src/tests/feature-flag-store.test.ts"],"names":[],"mappings":""}
@@ -1,27 +0,0 @@
1
- import { FeatureFlagStore } from '../feature-flag-store';
2
- describe(`[launchdarkly-service] ${FeatureFlagStore.name}`, () => {
3
- const subject = () => new FeatureFlagStore();
4
- test('has no flags initially', () => {
5
- expect(subject().flags).toEqual({});
6
- });
7
- describe('setFlags', () => {
8
- let store;
9
- let flags;
10
- beforeEach(() => {
11
- store = new FeatureFlagStore();
12
- flags = { foo: 'bar' };
13
- });
14
- const subject = (...args) => store.setFlags(...args);
15
- test('sets flags', () => {
16
- subject(flags);
17
- expect(store.flags).toEqual(flags);
18
- });
19
- test('stores copy of flags', () => {
20
- subject(flags);
21
- const originalFlags = { ...flags };
22
- flags.baz = 'qux';
23
- expect(store.flags).toEqual(originalFlags);
24
- });
25
- });
26
- });
27
- //# sourceMappingURL=feature-flag-store.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feature-flag-store.test.js","sourceRoot":"","sources":["../../src/tests/feature-flag-store.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,QAAQ,CAAC,0BAA0B,gBAAgB,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE;IAC7D,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,gBAAgB,EAAE,CAAC;IAE7C,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACtB,IAAI,KAAuB,CAAC;QAC5B,IAAI,KAAgB,CAAC;QAErB,UAAU,CAAC,GAAG,EAAE;YACZ,KAAK,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAC/B,KAAK,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,CAAC,GAAG,IAA8C,EAAE,EAAE,CAClE,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;QAE5B,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;YACpB,OAAO,CAAC,KAAK,CAAC,CAAC;YAEf,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE;YAC9B,OAAO,CAAC,KAAK,CAAC,CAAC;YAEf,MAAM,aAAa,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;YACnC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC;YAElB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=get-ld-client.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-ld-client.test.d.ts","sourceRoot":"","sources":["../../src/tests/get-ld-client.test.ts"],"names":[],"mappings":""}
@@ -1,51 +0,0 @@
1
- import { initialize } from 'launchdarkly-js-client-sdk';
2
- import { getLDClient } from '../get-ld-client';
3
- jest.mock('launchdarkly-js-client-sdk', () => ({
4
- initialize: jest.fn(),
5
- }));
6
- describe(`[launchdarkly-service] ${getLDClient.name}`, () => {
7
- const mockClient = Symbol('mockClient');
8
- let config;
9
- const subject = () => getLDClient(config);
10
- beforeEach(() => {
11
- jest.clearAllMocks();
12
- jest.mocked(initialize).mockImplementation(() => mockClient);
13
- config = { clientSideID: makeId() };
14
- });
15
- function anonymousUserContext() {
16
- return { kind: 'user', anonymous: true };
17
- }
18
- test('returns new LaunchDarkly client with anonymous user context', () => {
19
- expect(subject()).toBe(mockClient);
20
- expect(initialize).toHaveBeenCalledWith(config.clientSideID, anonymousUserContext(), undefined);
21
- });
22
- describe('when given a context', () => {
23
- beforeEach(() => (config.context = { kind: 'multi' }));
24
- test('initializes client with context', () => {
25
- subject();
26
- expect(initialize).toHaveBeenCalledWith(config.clientSideID, config.context, undefined);
27
- });
28
- });
29
- describe('when given options', () => {
30
- beforeEach(() => (config.options = { hash: 'foo' }));
31
- test('initializes client with options', () => {
32
- subject();
33
- expect(initialize).toHaveBeenCalledWith(config.clientSideID, anonymousUserContext(), config.options);
34
- });
35
- });
36
- describe('when client already exists', () => {
37
- const existingClient = Symbol('existingClient');
38
- beforeEach(() => {
39
- jest.mocked(initialize).mockImplementationOnce(() => existingClient);
40
- subject();
41
- });
42
- test('returns existing client', () => {
43
- expect(subject()).toBe(existingClient);
44
- expect(initialize).toHaveBeenCalledTimes(1);
45
- });
46
- });
47
- });
48
- function makeId() {
49
- return Math.round(1e6 * Math.random()).toString(36);
50
- }
51
- //# sourceMappingURL=get-ld-client.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-ld-client.test.js","sourceRoot":"","sources":["../../src/tests/get-ld-client.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import '@testing-library/jest-dom';
2
- //# sourceMappingURL=ld-provider.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ld-provider.test.d.ts","sourceRoot":"","sources":["../../src/tests/ld-provider.test.tsx"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC"}
@@ -1,152 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import '@testing-library/jest-dom';
3
- import { Log } from '@servicetitan/log-service';
4
- import { Provider, useDependencies } from '@servicetitan/react-ioc';
5
- import { render, screen, waitFor } from '@testing-library/react';
6
- import { act, Fragment } from 'react';
7
- import { FeatureFlagStore } from '../feature-flag-store';
8
- import { getLDClient } from '../get-ld-client';
9
- import { LDProvider } from '../ld-provider';
10
- import { LD_SERVICE_TOKEN } from '../types';
11
- function formatProps(props) {
12
- return Object.entries(props).map(([key, value]) => {
13
- return `${key}=${value.toString()}`;
14
- });
15
- }
16
- function mockComponent(name) {
17
- return {
18
- [name]: ({ children, ...props }) => (_jsxs(Fragment, { children: [_jsx("div", { children: `<${name} ${formatProps(props)} />` }), children] })),
19
- };
20
- }
21
- jest.mock('launchdarkly-react-client-sdk', () => ({
22
- ...mockComponent('LDProvider'),
23
- }));
24
- jest.mock('../feature-flag-provider', () => ({
25
- ...mockComponent('FeatureFlagProvider'),
26
- }));
27
- jest.mock('../get-ld-client', () => ({
28
- getLDClient: jest.fn(),
29
- }));
30
- describe(`[launchdarkly-service] ${LDProvider.name}`, () => {
31
- const log = {
32
- error: jest.fn(),
33
- };
34
- const ldClient = {
35
- on: jest.fn(),
36
- off: jest.fn(),
37
- waitUntilReady: jest.fn().mockResolvedValue(undefined),
38
- waitForInitialization: jest.fn().mockResolvedValue(undefined),
39
- toString: () => 'ldClient',
40
- };
41
- let singletons;
42
- let props;
43
- let providedFeatureFlagStore;
44
- let renderCount;
45
- const Component = () => {
46
- [providedFeatureFlagStore] = useDependencies(FeatureFlagStore);
47
- renderCount += 1;
48
- return _jsx("div", { children: '<Component />' });
49
- };
50
- beforeEach(() => {
51
- jest.clearAllMocks();
52
- jest.mocked(getLDClient).mockReturnValue(ldClient);
53
- renderCount = 0;
54
- singletons = [];
55
- props = { clientSideID: 'foo', projectName: 'bar' };
56
- });
57
- const subject = () => {
58
- return render(_jsx(Provider, { singletons: singletons, children: _jsx(LDProvider, { ...props, children: _jsx(Component, {}) }) }));
59
- };
60
- function expectLDProvider(props) {
61
- if (props) {
62
- expect(screen.getByText(`<LDProvider ${formatProps(props)} />`)).toBeInTheDocument();
63
- }
64
- else {
65
- expect(screen.getByText(/<LDProvider .* \/>/)).toBeInTheDocument();
66
- }
67
- }
68
- test('renders base LDProvider and FeatureFlagProvider after client is ready and initialized', async () => {
69
- subject();
70
- await waitFor(() => expectLDProvider({ clientSideID: props.clientSideID, ldClient }));
71
- expect(screen.getByText('<FeatureFlagProvider />')).toBeInTheDocument();
72
- expect(screen.getByText('<Component />')).toBeInTheDocument();
73
- expect(ldClient.waitForInitialization).toHaveBeenCalled();
74
- });
75
- test('provides FeatureFlagStore', async () => {
76
- subject();
77
- await waitFor(() => expectLDProvider());
78
- expect(providedFeatureFlagStore).toBeDefined();
79
- });
80
- describe('when waitForInitialization is false', () => {
81
- let initializedCallback;
82
- beforeEach(() => {
83
- var _a;
84
- props.waitForInitialization = false;
85
- (_a = jest.mocked(ldClient.on)) === null || _a === void 0 ? void 0 : _a.mockImplementation((event, callback) => {
86
- if (event === 'initialized') {
87
- initializedCallback = callback;
88
- }
89
- });
90
- });
91
- test('does not wait for client to initialize', async () => {
92
- subject();
93
- await waitFor(() => expectLDProvider());
94
- expect(ldClient.waitForInitialization).not.toHaveBeenCalled();
95
- });
96
- test('re-renders when client is initialized', async () => {
97
- subject();
98
- await waitFor(() => expectLDProvider());
99
- expect(renderCount).toBe(1);
100
- act(() => initializedCallback === null || initializedCallback === void 0 ? void 0 : initializedCallback());
101
- expect(renderCount).toBe(2);
102
- });
103
- test('deregisters listener when component is unmounted', async () => {
104
- const { unmount } = subject();
105
- await waitFor(() => expectLDProvider());
106
- unmount();
107
- expect(jest.mocked(ldClient.off)).toHaveBeenCalledWith('initialized', initializedCallback);
108
- });
109
- });
110
- describe('when initialization fails', () => {
111
- beforeEach(() => {
112
- var _a;
113
- (_a = jest.mocked(ldClient.waitForInitialization)) === null || _a === void 0 ? void 0 : _a.mockRejectedValue('Oops!');
114
- });
115
- test('renders base LDProvider', async () => {
116
- subject();
117
- await waitFor(() => expectLDProvider());
118
- });
119
- describe('when log service is provided', () => {
120
- beforeEach(() => singletons.push({ provide: Log, useValue: log }));
121
- test('logs error', async () => {
122
- subject();
123
- await waitFor(() => expectLDProvider());
124
- expect(log.error).toHaveBeenCalledWith({
125
- category: 'LaunchDarkly',
126
- code: 'InitializationFailed',
127
- error: 'Oops!',
128
- message: `"${props.projectName}" client failed to initialize`,
129
- });
130
- });
131
- });
132
- });
133
- describe('when LDService is provided', () => {
134
- const ldServiceClient = {
135
- waitUntilReady: jest.fn().mockResolvedValue(undefined),
136
- waitForInitialization: jest.fn().mockResolvedValue(undefined),
137
- toString: () => 'ldServiceClient',
138
- };
139
- const ldService = {
140
- getClient: jest.fn().mockReturnValue(ldServiceClient),
141
- };
142
- beforeEach(() => {
143
- singletons === null || singletons === void 0 ? void 0 : singletons.push({ provide: LD_SERVICE_TOKEN, useValue: ldService });
144
- });
145
- test('uses LDService client', async () => {
146
- subject();
147
- await waitFor(() => expectLDProvider({ clientSideID: props.clientSideID, ldClient: ldServiceClient }));
148
- expect(ldServiceClient.waitForInitialization).toHaveBeenCalled();
149
- });
150
- });
151
- });
152
- //# sourceMappingURL=ld-provider.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ld-provider.test.js","sourceRoot":"","sources":["../../src/tests/ld-provider.test.tsx"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=ld-service-provider.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ld-service-provider.test.d.ts","sourceRoot":"","sources":["../../src/tests/ld-service-provider.test.tsx"],"names":[],"mappings":""}
@@ -1,33 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { Provider, useDependencies } from '@servicetitan/react-ioc';
3
- import { render } from '@testing-library/react';
4
- import { getLDClient } from '../get-ld-client';
5
- import { LDServiceProvider } from '../ld-service-provider';
6
- import { LD_SERVICE_TOKEN } from '../types';
7
- describe(`[launchdarkly-service] ${LDServiceProvider.name}`, () => {
8
- let providedLDService;
9
- let singletons;
10
- const Component = () => {
11
- [providedLDService] = useDependencies(LD_SERVICE_TOKEN);
12
- return null;
13
- };
14
- beforeEach(() => (singletons = []));
15
- const subject = () => {
16
- return render(_jsx(Provider, { singletons: singletons, children: _jsx(LDServiceProvider, { children: _jsx(Component, {}) }) }));
17
- };
18
- test('provides LDService instance', () => {
19
- subject();
20
- expect(providedLDService).toEqual({
21
- getClient: getLDClient,
22
- });
23
- });
24
- describe('when LDService is already provided', () => {
25
- const ldService = Symbol('ldService');
26
- beforeEach(() => singletons === null || singletons === void 0 ? void 0 : singletons.push({ provide: LD_SERVICE_TOKEN, useValue: ldService }));
27
- test('provides existing LDService', () => {
28
- subject();
29
- expect(providedLDService).toBe(ldService);
30
- });
31
- });
32
- });
33
- //# sourceMappingURL=ld-service-provider.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ld-service-provider.test.js","sourceRoot":"","sources":["../../src/tests/ld-service-provider.test.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGhD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAa,MAAM,UAAU,CAAC;AAEvD,QAAQ,CAAC,0BAA0B,iBAAiB,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE;IAC9D,IAAI,iBAA4B,CAAC;IACjC,IAAI,UAAwD,CAAC;IAE7D,MAAM,SAAS,GAAO,GAAG,EAAE;QACvB,CAAC,iBAAiB,CAAC,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC;IAEpC,MAAM,OAAO,GAAG,GAAG,EAAE;QACjB,OAAO,MAAM,CACT,KAAC,QAAQ,IAAC,UAAU,EAAE,UAAU,YAC5B,KAAC,iBAAiB,cACd,KAAC,SAAS,KAAG,GACG,GACb,CACd,CAAC;IACN,CAAC,CAAC;IAEF,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,OAAO,EAAE,CAAC;QAEV,MAAM,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC;YAC9B,SAAS,EAAE,WAAW;SACzB,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAChD,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QAEtC,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAEvF,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,OAAO,EAAE,CAAC;YAEV,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- import '@testing-library/jest-dom';
2
- //# sourceMappingURL=with-feature-flag.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"with-feature-flag.test.d.ts","sourceRoot":"","sources":["../../src/tests/with-feature-flag.test.tsx"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC"}
@@ -1,65 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import '@testing-library/jest-dom';
3
- import { render, screen } from '@testing-library/react';
4
- import { useFlags } from 'launchdarkly-react-client-sdk';
5
- import { WithFeatureFlag } from '../with-feature-flag';
6
- jest.mock('launchdarkly-react-client-sdk', () => ({
7
- useFlags: jest.fn(),
8
- }));
9
- describe(`[launchdarkly-service] ${WithFeatureFlag.name}`, () => {
10
- const flagKey = 'foo';
11
- const childContent = 'Flag is ON';
12
- let props;
13
- let flagValue;
14
- beforeEach(() => {
15
- props = { flagKey, children: childContent };
16
- jest.mocked(useFlags).mockImplementation(() => ({ [flagKey]: flagValue }));
17
- });
18
- const subject = () => render(_jsx(WithFeatureFlag, { ...props }));
19
- function itRendersNothing() {
20
- test('renders nothing', () => {
21
- subject();
22
- expect(screen.queryByText(childContent)).not.toBeInTheDocument();
23
- });
24
- }
25
- function itRendersChildren() {
26
- test('renders children', () => {
27
- subject();
28
- expect(screen.getByText(childContent)).toBeInTheDocument();
29
- });
30
- }
31
- itRendersNothing();
32
- describe('when flag is turned on', () => {
33
- beforeEach(() => (flagValue = true));
34
- itRendersChildren();
35
- describe('with on prop', () => {
36
- const onContent = 'Flag is ENABLED';
37
- beforeEach(() => (props.on = () => onContent));
38
- test('renders on content', () => {
39
- subject();
40
- expect(screen.getByText(onContent)).toBeInTheDocument();
41
- });
42
- });
43
- });
44
- describe('when flag is turned off', () => {
45
- beforeEach(() => (flagValue = false));
46
- itRendersNothing();
47
- describe('with off prop', () => {
48
- const offContent = 'flag is OFF';
49
- beforeEach(() => (props.off = () => offContent));
50
- test('renders off content', () => {
51
- subject();
52
- expect(screen.getByText(offContent)).toBeInTheDocument();
53
- });
54
- });
55
- });
56
- describe('with flag value', () => {
57
- beforeEach(() => (props.value = 'bar'));
58
- itRendersNothing();
59
- describe('when flag matches value', () => {
60
- beforeEach(() => (flagValue = props.value));
61
- itRendersChildren();
62
- });
63
- });
64
- });
65
- //# sourceMappingURL=with-feature-flag.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"with-feature-flag.test.js","sourceRoot":"","sources":["../../src/tests/with-feature-flag.test.tsx"],"names":[],"mappings":"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"}