@servicetitan/launchdarkly-service 39.2.0 → 40.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.
Files changed (68) hide show
  1. package/dist/create-ld-client.d.ts +4 -0
  2. package/dist/create-ld-client.d.ts.map +1 -0
  3. package/dist/create-ld-client.js +12 -0
  4. package/dist/create-ld-client.js.map +1 -0
  5. package/dist/get-client.d.ts +4 -0
  6. package/dist/get-client.d.ts.map +1 -0
  7. package/dist/get-client.js +13 -0
  8. package/dist/get-client.js.map +1 -0
  9. package/dist/get-ld-client.d.ts +1 -1
  10. package/dist/get-ld-client.d.ts.map +1 -1
  11. package/dist/get-ld-client.js +8 -15
  12. package/dist/get-ld-client.js.map +1 -1
  13. package/dist/get-sdk-version.d.ts +2 -0
  14. package/dist/get-sdk-version.d.ts.map +1 -0
  15. package/dist/get-sdk-version.js +11 -0
  16. package/dist/get-sdk-version.js.map +1 -0
  17. package/dist/get-version-client.d.ts +4 -0
  18. package/dist/get-version-client.d.ts.map +1 -0
  19. package/dist/get-version-client.js +12 -0
  20. package/dist/get-version-client.js.map +1 -0
  21. package/dist/index.d.ts +2 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +2 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/ld-provider.js +2 -3
  26. package/dist/ld-provider.js.map +1 -1
  27. package/dist/ld-service-provider.d.ts.map +1 -1
  28. package/dist/ld-service-provider.js +3 -1
  29. package/dist/ld-service-provider.js.map +1 -1
  30. package/dist/tests/create-ld-client.test.d.ts +2 -0
  31. package/dist/tests/create-ld-client.test.d.ts.map +1 -0
  32. package/dist/tests/create-ld-client.test.js +58 -0
  33. package/dist/tests/create-ld-client.test.js.map +1 -0
  34. package/dist/tests/get-client.test.d.ts +2 -0
  35. package/dist/tests/get-client.test.d.ts.map +1 -0
  36. package/dist/tests/get-client.test.js +81 -0
  37. package/dist/tests/get-client.test.js.map +1 -0
  38. package/dist/tests/get-ld-client.test.js +24 -41
  39. package/dist/tests/get-ld-client.test.js.map +1 -1
  40. package/dist/tests/get-sdk-version.test.d.ts +2 -0
  41. package/dist/tests/get-sdk-version.test.d.ts.map +1 -0
  42. package/dist/tests/get-sdk-version.test.js +41 -0
  43. package/dist/tests/get-sdk-version.test.js.map +1 -0
  44. package/dist/tests/get-version-client.test.d.ts +2 -0
  45. package/dist/tests/get-version-client.test.d.ts.map +1 -0
  46. package/dist/tests/get-version-client.test.js +63 -0
  47. package/dist/tests/get-version-client.test.js.map +1 -0
  48. package/dist/tests/ld-service-provider.test.js +3 -1
  49. package/dist/tests/ld-service-provider.test.js.map +1 -1
  50. package/dist/types.d.ts +7 -0
  51. package/dist/types.d.ts.map +1 -1
  52. package/dist/types.js.map +1 -1
  53. package/package.json +11 -11
  54. package/src/create-ld-client.ts +8 -0
  55. package/src/get-client.ts +13 -0
  56. package/src/get-ld-client.ts +8 -11
  57. package/src/get-sdk-version.ts +10 -0
  58. package/src/get-version-client.ts +18 -0
  59. package/src/index.ts +2 -0
  60. package/src/ld-provider.tsx +2 -2
  61. package/src/ld-service-provider.tsx +2 -0
  62. package/src/tests/create-ld-client.test.ts +64 -0
  63. package/src/tests/get-client.test.ts +98 -0
  64. package/src/tests/get-ld-client.test.ts +30 -44
  65. package/src/tests/get-sdk-version.test.ts +48 -0
  66. package/src/tests/get-version-client.test.ts +70 -0
  67. package/src/tests/ld-service-provider.test.tsx +2 -1
  68. package/src/types.ts +11 -0
@@ -1,68 +1,54 @@
1
- import { initialize } from 'launchdarkly-js-client-sdk';
1
+ import { createLDClient } from '../create-ld-client';
2
2
  import { getLDClient } from '../get-ld-client';
3
+ import { getSDKVersion } from '../get-sdk-version';
4
+ import { getVersionClient } from '../get-version-client';
5
+ import { ClientConfig } from '../types';
3
6
 
4
- jest.mock('launchdarkly-js-client-sdk', () => ({
5
- initialize: jest.fn(),
7
+ jest.mock('../create-ld-client', () => ({
8
+ createLDClient: jest.fn(),
9
+ }));
10
+ jest.mock('../get-sdk-version', () => ({
11
+ getSDKVersion: jest.fn(),
12
+ }));
13
+ jest.mock('../get-version-client', () => ({
14
+ getVersionClient: jest.fn(),
6
15
  }));
7
16
 
8
17
  describe(`[launchdarkly-service] ${getLDClient.name}`, () => {
9
- const mockClient: any = Symbol('mockClient');
10
- const defaultOptions = { sendEventsOnlyForVariation: true };
11
- let config: Parameters<typeof getLDClient>[0];
18
+ const client: any = Symbol('client');
19
+ const version = '3.9.5';
20
+ let config: ClientConfig;
12
21
 
13
22
  const subject = () => getLDClient(config);
14
23
 
15
24
  beforeEach(() => {
16
25
  jest.clearAllMocks();
17
- jest.mocked(initialize).mockImplementation(() => mockClient);
26
+ jest.mocked(getSDKVersion).mockReturnValue(version);
27
+ jest.mocked(getVersionClient).mockReturnValue(client);
18
28
  config = { clientSideID: makeId(), context: { kind: 'multi' } };
19
29
  });
20
30
 
21
- test('initializes client with the given context and default options', () => {
22
- expect(subject()).toBe(mockClient);
23
- expect(initialize).toHaveBeenCalledWith(
24
- config.clientSideID,
25
- config.context,
26
- defaultOptions
27
- );
28
- });
29
-
30
- describe('when given options', () => {
31
- beforeEach(() => (config.options = { hash: 'foo' }));
32
-
33
- test('passes options through alongside the defaults', () => {
34
- subject();
31
+ test('requests it using the running SDK version, the config, and a client factory', () => {
32
+ subject();
35
33
 
36
- expect(initialize).toHaveBeenCalledWith(config.clientSideID, config.context, {
37
- ...defaultOptions,
38
- ...config.options,
39
- });
40
- });
34
+ expect(getVersionClient).toHaveBeenCalledWith(version, config, createLDClient);
41
35
  });
42
36
 
43
- describe('when given sendEventsOnlyForVariation', () => {
44
- beforeEach(() => (config.options = { sendEventsOnlyForVariation: false }));
45
-
46
- test('lets the caller override the default', () => {
47
- subject();
48
-
49
- expect(initialize).toHaveBeenCalledWith(config.clientSideID, config.context, {
50
- sendEventsOnlyForVariation: false,
51
- });
52
- });
37
+ test('returns the client', () => {
38
+ expect(subject()).toBe(client);
53
39
  });
54
40
 
55
- describe('when client already exists', () => {
56
- const existingClient: any = Symbol('existingClient');
41
+ describe('when the running SDK version is unknown', () => {
42
+ beforeEach(() => jest.mocked(getSDKVersion).mockReturnValue(undefined));
57
43
 
58
- beforeEach(() => {
59
- jest.mocked(initialize).mockImplementationOnce(() => existingClient);
44
+ test('uses a syntactically valid semver as the version', () => {
60
45
  subject();
61
- });
62
46
 
63
- test('returns existing client', () => {
64
- expect(subject()).toBe(existingClient);
65
- expect(initialize).toHaveBeenCalledTimes(1);
47
+ expect(getVersionClient).toHaveBeenCalledWith(
48
+ expect.stringMatching(/^\d+\.\d+\.\d+-\S+$/),
49
+ config,
50
+ createLDClient
51
+ );
66
52
  });
67
53
  });
68
54
  });
@@ -0,0 +1,48 @@
1
+ import { getSDKVersion } from '../get-sdk-version';
2
+
3
+ let mockSdkVersion: string | undefined;
4
+ let mockPackageJsonVersion: string | undefined;
5
+
6
+ jest.mock('launchdarkly-js-client-sdk', () => ({
7
+ get version() {
8
+ return mockSdkVersion;
9
+ },
10
+ }));
11
+ jest.mock('launchdarkly-js-client-sdk/package.json', () => ({
12
+ get version() {
13
+ return mockPackageJsonVersion;
14
+ },
15
+ }));
16
+
17
+ describe(`[launchdarkly-service] ${getSDKVersion.name}`, () => {
18
+ beforeEach(() => {
19
+ mockSdkVersion = '3.9.5';
20
+ mockPackageJsonVersion = '3.9.6';
21
+ });
22
+
23
+ const subject = () => getSDKVersion();
24
+
25
+ test('returns the version exported by the running SDK', () => {
26
+ expect(subject()).toBe(mockSdkVersion);
27
+ });
28
+
29
+ describe('when the running SDK does not export a version', () => {
30
+ beforeEach(() => {
31
+ mockSdkVersion = undefined;
32
+ });
33
+
34
+ test('returns the version from package.json instead', () => {
35
+ expect(subject()).toBe(mockPackageJsonVersion);
36
+ });
37
+
38
+ describe('when package.json also has no version', () => {
39
+ beforeEach(() => {
40
+ mockPackageJsonVersion = undefined;
41
+ });
42
+
43
+ test('returns undefined', () => {
44
+ expect(subject()).toBeUndefined();
45
+ });
46
+ });
47
+ });
48
+ });
@@ -0,0 +1,70 @@
1
+ import { LDClient } from 'launchdarkly-js-client-sdk';
2
+ import { getVersionClient } from '../get-version-client';
3
+ import { ClientConfig } from '../types';
4
+
5
+ describe(`[launchdarkly-service] ${getVersionClient.name}`, () => {
6
+ let version: string;
7
+ let config: ClientConfig;
8
+ let createClient: jest.Mock<LDClient, [ClientConfig]>;
9
+ let client: LDClient;
10
+
11
+ const subject = () => getVersionClient(version, config, createClient);
12
+
13
+ beforeEach(() => {
14
+ version = '3.9.5';
15
+ config = { clientSideID: makeId(), context: { kind: 'multi' } };
16
+ client = Symbol('client') as unknown as LDClient;
17
+ createClient = jest.fn().mockReturnValue(client);
18
+ });
19
+
20
+ test('returns the client created by createClient', () => {
21
+ expect(subject()).toBe(client);
22
+ });
23
+
24
+ test('creates the client using the given config', () => {
25
+ subject();
26
+
27
+ expect(createClient).toHaveBeenCalledWith(config);
28
+ });
29
+
30
+ describe('when a client already exists', () => {
31
+ const newClient = Symbol('newClient') as unknown as LDClient;
32
+
33
+ beforeEach(() => {
34
+ subject();
35
+ createClient.mockClear();
36
+ createClient.mockReturnValue(newClient);
37
+ });
38
+
39
+ test('returns the existing client', () => {
40
+ expect(subject()).toBe(client);
41
+ expect(createClient).not.toHaveBeenCalled();
42
+ });
43
+
44
+ function itCreatesNewClient() {
45
+ test('creates a new client', () => {
46
+ expect(subject()).toBe(newClient);
47
+ });
48
+ }
49
+
50
+ describe('when clientSideID differs', () => {
51
+ beforeEach(() => {
52
+ config = { ...config, clientSideID: makeId() };
53
+ });
54
+
55
+ itCreatesNewClient();
56
+ });
57
+
58
+ describe('when version differs', () => {
59
+ beforeEach(() => {
60
+ version = '3.5.0';
61
+ });
62
+
63
+ itCreatesNewClient();
64
+ });
65
+ });
66
+ });
67
+
68
+ function makeId() {
69
+ return Math.round(1e6 * Math.random()).toString(36);
70
+ }
@@ -3,6 +3,7 @@ import { render } from '@testing-library/react';
3
3
  import { LDOptions } from 'launchdarkly-js-client-sdk';
4
4
  import { ComponentProps, FC } from 'react';
5
5
  import { getLDClient } from '../get-ld-client';
6
+ import { getVersionClient } from '../get-version-client';
6
7
  import { LDServiceProvider } from '../ld-service-provider';
7
8
  import { LD_SERVICE_TOKEN, LDApplication, LDService } from '../types';
8
9
 
@@ -38,7 +39,7 @@ describe(`[launchdarkly-service] ${LDServiceProvider.name}`, () => {
38
39
  test('provides LDService instance', () => {
39
40
  subject();
40
41
 
41
- expect(providedLDService).toEqual({ getClient: getLDClient });
42
+ expect(providedLDService).toEqual({ getClient: getLDClient, getVersionClient });
42
43
  });
43
44
 
44
45
  test('provides no application', () => {
package/src/types.ts CHANGED
@@ -13,6 +13,17 @@ export interface ClientConfig {
13
13
 
14
14
  export interface LDService {
15
15
  getClient: (config: ClientConfig) => LDClient;
16
+ /**
17
+ * Like `getClient`, but shares the client with any other caller using the same `version` and
18
+ * `clientSideID`, regardless of which side's SDK build constructed it. Callers supply
19
+ * `createClient` because the provider may not have the SDK version needed to build a client
20
+ * for a `version` it doesn't recognize.
21
+ */
22
+ getVersionClient?: (
23
+ version: string,
24
+ config: ClientConfig,
25
+ createClient: (config: ClientConfig) => LDClient
26
+ ) => LDClient;
16
27
  application?: LDApplication;
17
28
  options?: Omit<LDOptions, 'application'>;
18
29
  }