@servicetitan/launchdarkly-service 39.3.0 → 40.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/create-ld-client.d.ts +4 -0
- package/dist/create-ld-client.d.ts.map +1 -0
- package/dist/create-ld-client.js +12 -0
- package/dist/create-ld-client.js.map +1 -0
- package/dist/get-client.d.ts +4 -0
- package/dist/get-client.d.ts.map +1 -0
- package/dist/get-client.js +13 -0
- package/dist/get-client.js.map +1 -0
- package/dist/get-ld-client.d.ts +1 -1
- package/dist/get-ld-client.d.ts.map +1 -1
- package/dist/get-ld-client.js +8 -15
- package/dist/get-ld-client.js.map +1 -1
- package/dist/get-sdk-version.d.ts +2 -0
- package/dist/get-sdk-version.d.ts.map +1 -0
- package/dist/get-sdk-version.js +11 -0
- package/dist/get-sdk-version.js.map +1 -0
- package/dist/get-version-client.d.ts +4 -0
- package/dist/get-version-client.d.ts.map +1 -0
- package/dist/get-version-client.js +12 -0
- package/dist/get-version-client.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/ld-provider.js +2 -3
- package/dist/ld-provider.js.map +1 -1
- package/dist/ld-service-provider.d.ts.map +1 -1
- package/dist/ld-service-provider.js +3 -1
- package/dist/ld-service-provider.js.map +1 -1
- package/dist/tests/create-ld-client.test.d.ts +2 -0
- package/dist/tests/create-ld-client.test.d.ts.map +1 -0
- package/dist/tests/create-ld-client.test.js +58 -0
- package/dist/tests/create-ld-client.test.js.map +1 -0
- package/dist/tests/get-client.test.d.ts +2 -0
- package/dist/tests/get-client.test.d.ts.map +1 -0
- package/dist/tests/get-client.test.js +81 -0
- package/dist/tests/get-client.test.js.map +1 -0
- package/dist/tests/get-ld-client.test.js +24 -41
- package/dist/tests/get-ld-client.test.js.map +1 -1
- package/dist/tests/get-sdk-version.test.d.ts +2 -0
- package/dist/tests/get-sdk-version.test.d.ts.map +1 -0
- package/dist/tests/get-sdk-version.test.js +41 -0
- package/dist/tests/get-sdk-version.test.js.map +1 -0
- package/dist/tests/get-version-client.test.d.ts +2 -0
- package/dist/tests/get-version-client.test.d.ts.map +1 -0
- package/dist/tests/get-version-client.test.js +63 -0
- package/dist/tests/get-version-client.test.js.map +1 -0
- package/dist/tests/ld-service-provider.test.js +3 -1
- package/dist/tests/ld-service-provider.test.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +11 -11
- package/src/create-ld-client.ts +8 -0
- package/src/get-client.ts +13 -0
- package/src/get-ld-client.ts +8 -11
- package/src/get-sdk-version.ts +10 -0
- package/src/get-version-client.ts +18 -0
- package/src/index.ts +2 -0
- package/src/ld-provider.tsx +2 -2
- package/src/ld-service-provider.tsx +2 -0
- package/src/tests/create-ld-client.test.ts +64 -0
- package/src/tests/get-client.test.ts +98 -0
- package/src/tests/get-ld-client.test.ts +30 -44
- package/src/tests/get-sdk-version.test.ts +48 -0
- package/src/tests/get-version-client.test.ts +70 -0
- package/src/tests/ld-service-provider.test.tsx +2 -1
- package/src/types.ts +11 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-ld-client.d.ts","sourceRoot":"","sources":["../src/create-ld-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAyB,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAIvC,wBAAgB,cAAc,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,YAAY,GAAG,QAAQ,CAEzF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { initialize } from 'launchdarkly-js-client-sdk';
|
|
2
|
+
const defaultOptions = {
|
|
3
|
+
sendEventsOnlyForVariation: true
|
|
4
|
+
};
|
|
5
|
+
export function createLDClient({ clientSideID, context, options }) {
|
|
6
|
+
return initialize(clientSideID, context, {
|
|
7
|
+
...defaultOptions,
|
|
8
|
+
...options
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=create-ld-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/create-ld-client.ts"],"sourcesContent":["import { LDClient, LDOptions, initialize } from 'launchdarkly-js-client-sdk';\nimport { ClientConfig } from './types';\n\nconst defaultOptions: LDOptions = { sendEventsOnlyForVariation: true };\n\nexport function createLDClient({ clientSideID, context, options }: ClientConfig): LDClient {\n return initialize(clientSideID, context, { ...defaultOptions, ...options });\n}\n"],"names":["initialize","defaultOptions","sendEventsOnlyForVariation","createLDClient","clientSideID","context","options"],"mappings":"AAAA,SAA8BA,UAAU,QAAQ,6BAA6B;AAG7E,MAAMC,iBAA4B;IAAEC,4BAA4B;AAAK;AAErE,OAAO,SAASC,eAAe,EAAEC,YAAY,EAAEC,OAAO,EAAEC,OAAO,EAAgB;IAC3E,OAAON,WAAWI,cAAcC,SAAS;QAAE,GAAGJ,cAAc;QAAE,GAAGK,OAAO;IAAC;AAC7E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-client.d.ts","sourceRoot":"","sources":["../src/get-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAItD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAElD,wBAAgB,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,QAAQ,CAM1F"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createLDClient } from './create-ld-client';
|
|
2
|
+
import { getLDClient } from './get-ld-client';
|
|
3
|
+
import { getSDKVersion } from './get-sdk-version';
|
|
4
|
+
export function getClient(ldService, config) {
|
|
5
|
+
var _ref;
|
|
6
|
+
const version = getSDKVersion();
|
|
7
|
+
if (version && (ldService === null || ldService === void 0 ? void 0 : ldService.getVersionClient)) {
|
|
8
|
+
return ldService.getVersionClient(version, config, createLDClient);
|
|
9
|
+
}
|
|
10
|
+
return (_ref = ldService === null || ldService === void 0 ? void 0 : ldService.getClient(config)) !== null && _ref !== void 0 ? _ref : getLDClient(config);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=get-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/get-client.ts"],"sourcesContent":["import { LDClient } from 'launchdarkly-js-client-sdk';\nimport { createLDClient } from './create-ld-client';\nimport { getLDClient } from './get-ld-client';\nimport { getSDKVersion } from './get-sdk-version';\nimport { ClientConfig, LDService } from './types';\n\nexport function getClient(ldService: LDService | undefined, config: ClientConfig): LDClient {\n const version = getSDKVersion();\n if (version && ldService?.getVersionClient) {\n return ldService.getVersionClient(version, config, createLDClient);\n }\n return ldService?.getClient(config) ?? getLDClient(config);\n}\n"],"names":["createLDClient","getLDClient","getSDKVersion","getClient","ldService","config","version","getVersionClient"],"mappings":"AACA,SAASA,cAAc,QAAQ,qBAAqB;AACpD,SAASC,WAAW,QAAQ,kBAAkB;AAC9C,SAASC,aAAa,QAAQ,oBAAoB;AAGlD,OAAO,SAASC,UAAUC,SAAgC,EAAEC,MAAoB;;IAC5E,MAAMC,UAAUJ;IAChB,IAAII,YAAWF,sBAAAA,gCAAAA,UAAWG,gBAAgB,GAAE;QACxC,OAAOH,UAAUG,gBAAgB,CAACD,SAASD,QAAQL;IACvD;IACA,eAAOI,sBAAAA,gCAAAA,UAAWD,SAAS,CAACE,8CAAWJ,YAAYI;AACvD"}
|
package/dist/get-ld-client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { LDClient } from 'launchdarkly-js-client-sdk';
|
|
2
2
|
import { ClientConfig } from './types';
|
|
3
|
-
export declare function getLDClient(
|
|
3
|
+
export declare function getLDClient(config: ClientConfig): LDClient;
|
|
4
4
|
//# sourceMappingURL=get-ld-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-ld-client.d.ts","sourceRoot":"","sources":["../src/get-ld-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"get-ld-client.d.ts","sourceRoot":"","sources":["../src/get-ld-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAItD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAKvC,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,QAAQ,CAE1D"}
|
package/dist/get-ld-client.js
CHANGED
|
@@ -1,18 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
export function getLDClient(
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
client = initialize(clientSideID, context, {
|
|
10
|
-
...defaultOptions,
|
|
11
|
-
...options
|
|
12
|
-
});
|
|
13
|
-
ldClients.set(clientSideID, client);
|
|
14
|
-
}
|
|
15
|
-
return client;
|
|
1
|
+
import { createLDClient } from './create-ld-client';
|
|
2
|
+
import { getSDKVersion } from './get-sdk-version';
|
|
3
|
+
import { getVersionClient } from './get-version-client';
|
|
4
|
+
// Ensures different bundles that fail version detection won't share an incompatible client.
|
|
5
|
+
const UNKNOWN_VERSION = `0.0.0-unknown.${Math.round(1e6 * Math.random()).toString(36)}`;
|
|
6
|
+
export function getLDClient(config) {
|
|
7
|
+
var _getSDKVersion;
|
|
8
|
+
return getVersionClient((_getSDKVersion = getSDKVersion()) !== null && _getSDKVersion !== void 0 ? _getSDKVersion : UNKNOWN_VERSION, config, createLDClient);
|
|
16
9
|
}
|
|
17
10
|
|
|
18
11
|
//# sourceMappingURL=get-ld-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/get-ld-client.ts"],"sourcesContent":["import { LDClient
|
|
1
|
+
{"version":3,"sources":["../src/get-ld-client.ts"],"sourcesContent":["import { LDClient } from 'launchdarkly-js-client-sdk';\nimport { createLDClient } from './create-ld-client';\nimport { getSDKVersion } from './get-sdk-version';\nimport { getVersionClient } from './get-version-client';\nimport { ClientConfig } from './types';\n\n// Ensures different bundles that fail version detection won't share an incompatible client.\nconst UNKNOWN_VERSION = `0.0.0-unknown.${Math.round(1e6 * Math.random()).toString(36)}`;\n\nexport function getLDClient(config: ClientConfig): LDClient {\n return getVersionClient(getSDKVersion() ?? UNKNOWN_VERSION, config, createLDClient);\n}\n"],"names":["createLDClient","getSDKVersion","getVersionClient","UNKNOWN_VERSION","Math","round","random","toString","getLDClient","config"],"mappings":"AACA,SAASA,cAAc,QAAQ,qBAAqB;AACpD,SAASC,aAAa,QAAQ,oBAAoB;AAClD,SAASC,gBAAgB,QAAQ,uBAAuB;AAGxD,4FAA4F;AAC5F,MAAMC,kBAAkB,CAAC,cAAc,EAAEC,KAAKC,KAAK,CAAC,MAAMD,KAAKE,MAAM,IAAIC,QAAQ,CAAC,KAAK;AAEvF,OAAO,SAASC,YAAYC,MAAoB;QACpBR;IAAxB,OAAOC,kBAAiBD,iBAAAA,6BAAAA,4BAAAA,iBAAmBE,iBAAiBM,QAAQT;AACxE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-sdk-version.d.ts","sourceRoot":"","sources":["../src/get-sdk-version.ts"],"names":[],"mappings":"AAOA,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,CAElD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as LDClientSDK from 'launchdarkly-js-client-sdk';
|
|
2
|
+
import ldClientPackageJson from 'launchdarkly-js-client-sdk/package.json';
|
|
3
|
+
/*
|
|
4
|
+
* "version" isn't declared in the SDK's typings, but is present at runtime. Fall back to
|
|
5
|
+
* package.json's version in case a future SDK release removes the runtime export.
|
|
6
|
+
*/ export function getSDKVersion() {
|
|
7
|
+
var _LDClientSDK_version;
|
|
8
|
+
return (_LDClientSDK_version = LDClientSDK.version) !== null && _LDClientSDK_version !== void 0 ? _LDClientSDK_version : ldClientPackageJson.version;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=get-sdk-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/get-sdk-version.ts"],"sourcesContent":["import * as LDClientSDK from 'launchdarkly-js-client-sdk';\nimport ldClientPackageJson from 'launchdarkly-js-client-sdk/package.json';\n\n/*\n * \"version\" isn't declared in the SDK's typings, but is present at runtime. Fall back to\n * package.json's version in case a future SDK release removes the runtime export.\n */\nexport function getSDKVersion(): string | undefined {\n return (LDClientSDK as unknown as { version?: string }).version ?? ldClientPackageJson.version;\n}\n"],"names":["LDClientSDK","ldClientPackageJson","getSDKVersion","version"],"mappings":"AAAA,YAAYA,iBAAiB,6BAA6B;AAC1D,OAAOC,yBAAyB,0CAA0C;AAE1E;;;CAGC,GACD,OAAO,SAASC;QACL;IAAP,QAAO,uBAAA,AAACF,YAAgDG,OAAO,cAAxD,kCAAA,uBAA4DF,oBAAoBE,OAAO;AAClG"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { LDClient } from 'launchdarkly-js-client-sdk';
|
|
2
|
+
import { ClientConfig } from './types';
|
|
3
|
+
export declare function getVersionClient(version: string, config: ClientConfig, createClient: (config: ClientConfig) => LDClient): LDClient;
|
|
4
|
+
//# sourceMappingURL=get-version-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-version-client.d.ts","sourceRoot":"","sources":["../src/get-version-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAIvC,wBAAgB,gBAAgB,CAC5B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,QAAQ,GACjD,QAAQ,CAQV"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const clients = new Map();
|
|
2
|
+
export function getVersionClient(version, config, createClient) {
|
|
3
|
+
const key = `${version}:${config.clientSideID}`;
|
|
4
|
+
let client = clients.get(key);
|
|
5
|
+
if (!client) {
|
|
6
|
+
client = createClient(config);
|
|
7
|
+
clients.set(key, client);
|
|
8
|
+
}
|
|
9
|
+
return client;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=get-version-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/get-version-client.ts"],"sourcesContent":["import { LDClient } from 'launchdarkly-js-client-sdk';\nimport { ClientConfig } from './types';\n\nconst clients: Map<string, LDClient> = new Map();\n\nexport function getVersionClient(\n version: string,\n config: ClientConfig,\n createClient: (config: ClientConfig) => LDClient\n): LDClient {\n const key = `${version}:${config.clientSideID}`;\n let client = clients.get(key);\n if (!client) {\n client = createClient(config);\n clients.set(key, client);\n }\n return client;\n}\n"],"names":["clients","Map","getVersionClient","version","config","createClient","key","clientSideID","client","get","set"],"mappings":"AAGA,MAAMA,UAAiC,IAAIC;AAE3C,OAAO,SAASC,iBACZC,OAAe,EACfC,MAAoB,EACpBC,YAAgD;IAEhD,MAAMC,MAAM,GAAGH,QAAQ,CAAC,EAAEC,OAAOG,YAAY,EAAE;IAC/C,IAAIC,SAASR,QAAQS,GAAG,CAACH;IACzB,IAAI,CAACE,QAAQ;QACTA,SAASH,aAAaD;QACtBJ,QAAQU,GAAG,CAACJ,KAAKE;IACrB;IACA,OAAOA;AACX"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","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,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './create-flag-keys';\nexport * from './create-ld-client';\nexport * from './feature-flag-store';\nexport * from './get-client';\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,qBAAqB;AACnC,cAAc,uBAAuB;AACrC,cAAc,eAAe;AAC7B,cAAc,kBAAkB;AAChC,cAAc,gBAAgB;AAC9B,cAAc,wBAAwB;AACtC,cAAc,UAAU;AACxB,cAAc,sBAAsB"}
|
package/dist/ld-provider.js
CHANGED
|
@@ -5,7 +5,7 @@ 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
|
-
import {
|
|
8
|
+
import { getClient } from './get-client';
|
|
9
9
|
import { LD_SERVICE_TOKEN } from './types';
|
|
10
10
|
function mergeOptions(ldService) {
|
|
11
11
|
const { application, options } = ldService !== null && ldService !== void 0 ? ldService : {};
|
|
@@ -35,14 +35,13 @@ export const LDProvider = provide({
|
|
|
35
35
|
}
|
|
36
36
|
let cancelled = false;
|
|
37
37
|
(async function initializeClient() {
|
|
38
|
-
var _ref;
|
|
39
38
|
const options = mergeOptions(ldService);
|
|
40
39
|
const config = {
|
|
41
40
|
clientSideID,
|
|
42
41
|
context,
|
|
43
42
|
options
|
|
44
43
|
};
|
|
45
|
-
const client = (
|
|
44
|
+
const client = getClient(ldService, config);
|
|
46
45
|
if (waitForInitialization) {
|
|
47
46
|
try {
|
|
48
47
|
await client.waitForInitialization(5);
|
package/dist/ld-provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ld-provider.tsx"],"sourcesContent":["import { Log } from '@servicetitan/log-service';\nimport { provide, useOptionalDependencies } from '@servicetitan/react-ioc';\nimport { LDClient, LDContext } 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';\nimport { FeatureFlagProvider } from './feature-flag-provider';\nimport { FeatureFlagStore } from './feature-flag-store';\nimport {
|
|
1
|
+
{"version":3,"sources":["../src/ld-provider.tsx"],"sourcesContent":["import { Log } from '@servicetitan/log-service';\nimport { provide, useOptionalDependencies } from '@servicetitan/react-ioc';\nimport { LDClient, LDContext } 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';\nimport { FeatureFlagProvider } from './feature-flag-provider';\nimport { FeatureFlagStore } from './feature-flag-store';\nimport { getClient } from './get-client';\nimport { ClientConfig, LDService, LD_SERVICE_TOKEN } from './types';\n\nexport type ProviderConfig = Pick<BaseProviderConfig, 'clientSideID' | 'flags'> & {\n /** Pass `null` to defer client init until a real context is available. */\n context: LDContext | null;\n projectName: string;\n waitForInitialization?: boolean;\n};\n\nfunction mergeOptions(ldService: LDService | undefined): BaseProviderConfig['options'] {\n const { application, options } = ldService ?? {};\n if (!options && application === undefined) {\n return undefined;\n }\n return {\n ...options,\n ...(application !== undefined ? { application } : {}),\n };\n}\n\nexport const LDProvider: FC<PropsWithChildren<ProviderConfig>> = provide({\n singletons: [FeatureFlagStore],\n})(props => {\n const {\n children,\n clientSideID,\n context,\n flags,\n projectName,\n waitForInitialization = true,\n } = 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 if (context === null) {\n setLDClient(undefined);\n return;\n }\n\n let cancelled = false;\n\n (async function initializeClient() {\n const options = mergeOptions(ldService);\n const config: ClientConfig = { clientSideID, context, options };\n const client = getClient(ldService, 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 if (!cancelled) {\n setLDClient(client);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n // Presence only — avoid re-init when callers pass a new context object each render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [clientSideID, context === null]);\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 (context === null || !ldClient) {\n return null;\n }\n\n return (\n <BaseLDProvider\n key={counter.toString()}\n clientSideID={clientSideID}\n ldClient={ldClient}\n {...(flags && { flags })}\n >\n <FeatureFlagProvider>{children}</FeatureFlagProvider>\n </BaseLDProvider>\n );\n});\n"],"names":["Log","provide","useOptionalDependencies","LDProvider","BaseLDProvider","useEffect","useReducer","useState","FeatureFlagProvider","FeatureFlagStore","getClient","LD_SERVICE_TOKEN","mergeOptions","ldService","application","options","undefined","singletons","props","children","clientSideID","context","flags","projectName","waitForInitialization","ldClient","setLDClient","log","counter","forceUpdate","x","cancelled","initializeClient","config","client","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;AAC/E,SAASC,mBAAmB,QAAQ,0BAA0B;AAC9D,SAASC,gBAAgB,QAAQ,uBAAuB;AACxD,SAASC,SAAS,QAAQ,eAAe;AACzC,SAAkCC,gBAAgB,QAAQ,UAAU;AASpE,SAASC,aAAaC,SAAgC;IAClD,MAAM,EAAEC,WAAW,EAAEC,OAAO,EAAE,GAAGF,sBAAAA,uBAAAA,YAAa,CAAC;IAC/C,IAAI,CAACE,WAAWD,gBAAgBE,WAAW;QACvC,OAAOA;IACX;IACA,OAAO;QACH,GAAGD,OAAO;QACV,GAAID,gBAAgBE,YAAY;YAAEF;QAAY,IAAI,CAAC,CAAC;IACxD;AACJ;AAEA,OAAO,MAAMX,aAAoDF,QAAQ;IACrEgB,YAAY;QAACR;KAAiB;AAClC,GAAGS,CAAAA;IACC,MAAM,EACFC,QAAQ,EACRC,YAAY,EACZC,OAAO,EACPC,KAAK,EACLC,WAAW,EACXC,wBAAwB,IAAI,EAC/B,GAAGN;IACJ,MAAM,CAACO,UAAUC,YAAY,GAAGnB;IAChC,MAAM,CAACM,WAAWc,IAAI,GAAGzB,wBAAwBS,kBAAkBX;IACnE,MAAM,CAAC4B,SAASC,YAAY,GAAGvB,WAAW,CAACwB,IAAcA,IAAI,GAAG;IAEhEzB,UAAU;QACN,IAAIgB,YAAY,MAAM;YAClBK,YAAYV;YACZ;QACJ;QAEA,IAAIe,YAAY;QAEf,CAAA,eAAeC;YACZ,MAAMjB,UAAUH,aAAaC;YAC7B,MAAMoB,SAAuB;gBAAEb;gBAAcC;gBAASN;YAAQ;YAC9D,MAAMmB,SAASxB,UAAUG,WAAWoB;YACpC,IAAIT,uBAAuB;gBACvB,IAAI;oBACA,MAAMU,OAAOV,qBAAqB,CAAC;gBACvC,EAAE,OAAOW,OAAO;oBACZR,gBAAAA,0BAAAA,IAAKQ,KAAK,CAAC;wBACPC,UAAU;wBACVC,MAAM;wBACNF;wBACAG,SAAS,GAAGf,YAAY,4BAA4B,CAAC;oBACzD;gBACJ;YACJ;YACA,IAAI,CAACQ,WAAW;gBACZL,YAAYQ;YAChB;QACJ,CAAA;QAEA,OAAO;YACHH,YAAY;QAChB;IACA,oFAAoF;IACpF,uDAAuD;IAC3D,GAAG;QAACX;QAAcC,YAAY;KAAK;IAEnChB,UAAU;QACN,IAAI,CAACmB,yBAAyBC,UAAU;YACpCA,SAASc,EAAE,CAAC,eAAeV;YAC3B,OAAO;gBACHJ,SAASe,GAAG,CAAC,eAAeX;YAChC;QACJ;IACJ,GAAG;QAACJ;QAAUD;KAAsB;IAEpC,IAAIH,YAAY,QAAQ,CAACI,UAAU;QAC/B,OAAO;IACX;IAEA,qBACI,KAACrB;QAEGgB,cAAcA;QACdK,UAAUA;QACT,GAAIH,SAAS;YAAEA;QAAM,CAAC;kBAEvB,cAAA,KAACd;sBAAqBW;;OALjBS,QAAQa,QAAQ;AAQjC,GAAG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ld-service-provider.d.ts","sourceRoot":"","sources":["../src/ld-service-provider.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,iBAAiB,EAAqB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ld-service-provider.d.ts","sourceRoot":"","sources":["../src/ld-service-provider.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,iBAAiB,EAAqB,MAAM,OAAO,CAAC;AAGjE,OAAO,EAAoB,aAAa,EAAa,MAAM,SAAS,CAAC;AAOrE,UAAU,sBAAsB;IAC5B,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;CAC5C;AAED,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CAwB1E,CAAC"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { provide, useDependencies } from '@servicetitan/react-ioc';
|
|
2
2
|
import { useEffect, useRef } from 'react';
|
|
3
3
|
import { getLDClient } from './get-ld-client';
|
|
4
|
+
import { getVersionClient } from './get-version-client';
|
|
4
5
|
import { LD_SERVICE_TOKEN } from './types';
|
|
5
6
|
const ldService = {
|
|
6
|
-
getClient: getLDClient
|
|
7
|
+
getClient: getLDClient,
|
|
8
|
+
getVersionClient
|
|
7
9
|
};
|
|
8
10
|
export const LDServiceProvider = provide({
|
|
9
11
|
singletons: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ld-service-provider.tsx"],"sourcesContent":["import { provide, useDependencies } from '@servicetitan/react-ioc';\nimport { LDOptions } from 'launchdarkly-js-client-sdk';\nimport { FC, PropsWithChildren, useEffect, useRef } from 'react';\nimport { getLDClient } from './get-ld-client';\nimport { LD_SERVICE_TOKEN, LDApplication, LDService } from './types';\n\nconst ldService: LDService = {\n getClient: getLDClient,\n};\n\ninterface LDServiceProviderProps {\n application?: LDApplication;\n options?: Omit<LDOptions, 'application'>;\n}\n\nexport const LDServiceProvider: FC<PropsWithChildren<LDServiceProviderProps>> = provide({\n singletons: [{ provide: LD_SERVICE_TOKEN, useValue: ldService, inherit: true }],\n})(({ children, application, options }) => {\n const [providedLDService] = useDependencies(LD_SERVICE_TOKEN);\n const prevApplication = useRef(providedLDService.application);\n const prevOptions = useRef(providedLDService.options);\n\n if (providedLDService === ldService || !providedLDService.application) {\n providedLDService.application = application;\n }\n if (providedLDService === ldService || !providedLDService.options) {\n providedLDService.options = options;\n }\n\n useEffect(() => {\n return () => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n providedLDService.application = prevApplication.current;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n providedLDService.options = prevOptions.current;\n };\n }, [providedLDService]);\n\n return children;\n});\n"],"names":["provide","useDependencies","useEffect","useRef","getLDClient","LD_SERVICE_TOKEN","ldService","getClient","LDServiceProvider","singletons","useValue","inherit","children","application","options","providedLDService","prevApplication","prevOptions","current"],"mappings":"AAAA,SAASA,OAAO,EAAEC,eAAe,QAAQ,0BAA0B;AAEnE,SAAgCC,SAAS,EAAEC,MAAM,QAAQ,QAAQ;AACjE,SAASC,WAAW,QAAQ,kBAAkB;AAC9C,SAASC,gBAAgB,QAAkC,UAAU;AAErE,MAAMC,YAAuB;IACzBC,
|
|
1
|
+
{"version":3,"sources":["../src/ld-service-provider.tsx"],"sourcesContent":["import { provide, useDependencies } from '@servicetitan/react-ioc';\nimport { LDOptions } from 'launchdarkly-js-client-sdk';\nimport { FC, PropsWithChildren, useEffect, useRef } from 'react';\nimport { getLDClient } from './get-ld-client';\nimport { getVersionClient } from './get-version-client';\nimport { LD_SERVICE_TOKEN, LDApplication, LDService } from './types';\n\nconst ldService: LDService = {\n getClient: getLDClient,\n getVersionClient,\n};\n\ninterface LDServiceProviderProps {\n application?: LDApplication;\n options?: Omit<LDOptions, 'application'>;\n}\n\nexport const LDServiceProvider: FC<PropsWithChildren<LDServiceProviderProps>> = provide({\n singletons: [{ provide: LD_SERVICE_TOKEN, useValue: ldService, inherit: true }],\n})(({ children, application, options }) => {\n const [providedLDService] = useDependencies(LD_SERVICE_TOKEN);\n const prevApplication = useRef(providedLDService.application);\n const prevOptions = useRef(providedLDService.options);\n\n if (providedLDService === ldService || !providedLDService.application) {\n providedLDService.application = application;\n }\n if (providedLDService === ldService || !providedLDService.options) {\n providedLDService.options = options;\n }\n\n useEffect(() => {\n return () => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n providedLDService.application = prevApplication.current;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n providedLDService.options = prevOptions.current;\n };\n }, [providedLDService]);\n\n return children;\n});\n"],"names":["provide","useDependencies","useEffect","useRef","getLDClient","getVersionClient","LD_SERVICE_TOKEN","ldService","getClient","LDServiceProvider","singletons","useValue","inherit","children","application","options","providedLDService","prevApplication","prevOptions","current"],"mappings":"AAAA,SAASA,OAAO,EAAEC,eAAe,QAAQ,0BAA0B;AAEnE,SAAgCC,SAAS,EAAEC,MAAM,QAAQ,QAAQ;AACjE,SAASC,WAAW,QAAQ,kBAAkB;AAC9C,SAASC,gBAAgB,QAAQ,uBAAuB;AACxD,SAASC,gBAAgB,QAAkC,UAAU;AAErE,MAAMC,YAAuB;IACzBC,WAAWJ;IACXC;AACJ;AAOA,OAAO,MAAMI,oBAAmET,QAAQ;IACpFU,YAAY;QAAC;YAAEV,SAASM;YAAkBK,UAAUJ;YAAWK,SAAS;QAAK;KAAE;AACnF,GAAG,CAAC,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,OAAO,EAAE;IAClC,MAAM,CAACC,kBAAkB,GAAGf,gBAAgBK;IAC5C,MAAMW,kBAAkBd,OAAOa,kBAAkBF,WAAW;IAC5D,MAAMI,cAAcf,OAAOa,kBAAkBD,OAAO;IAEpD,IAAIC,sBAAsBT,aAAa,CAACS,kBAAkBF,WAAW,EAAE;QACnEE,kBAAkBF,WAAW,GAAGA;IACpC;IACA,IAAIE,sBAAsBT,aAAa,CAACS,kBAAkBD,OAAO,EAAE;QAC/DC,kBAAkBD,OAAO,GAAGA;IAChC;IAEAb,UAAU;QACN,OAAO;YACH,uDAAuD;YACvDc,kBAAkBF,WAAW,GAAGG,gBAAgBE,OAAO;YACvD,uDAAuD;YACvDH,kBAAkBD,OAAO,GAAGG,YAAYC,OAAO;QACnD;IACJ,GAAG;QAACH;KAAkB;IAEtB,OAAOH;AACX,GAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-ld-client.test.d.ts","sourceRoot":"","sources":["../../src/tests/create-ld-client.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { initialize } from 'launchdarkly-js-client-sdk';
|
|
2
|
+
import { createLDClient } from '../create-ld-client';
|
|
3
|
+
jest.mock('launchdarkly-js-client-sdk', ()=>({
|
|
4
|
+
initialize: jest.fn()
|
|
5
|
+
}));
|
|
6
|
+
describe(`[launchdarkly-service] ${createLDClient.name}`, ()=>{
|
|
7
|
+
const mockClient = Symbol('mockClient');
|
|
8
|
+
const defaultOptions = {
|
|
9
|
+
sendEventsOnlyForVariation: true
|
|
10
|
+
};
|
|
11
|
+
let config;
|
|
12
|
+
const subject = ()=>createLDClient(config);
|
|
13
|
+
beforeEach(()=>{
|
|
14
|
+
jest.clearAllMocks();
|
|
15
|
+
jest.mocked(initialize).mockImplementation(()=>mockClient);
|
|
16
|
+
config = {
|
|
17
|
+
clientSideID: makeId(),
|
|
18
|
+
context: {
|
|
19
|
+
kind: 'multi'
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
test('initializes client with the given context and default options', ()=>{
|
|
24
|
+
subject();
|
|
25
|
+
expect(initialize).toHaveBeenCalledWith(config.clientSideID, config.context, defaultOptions);
|
|
26
|
+
});
|
|
27
|
+
test('returns the client', ()=>{
|
|
28
|
+
expect(subject()).toBe(mockClient);
|
|
29
|
+
});
|
|
30
|
+
describe('when given options', ()=>{
|
|
31
|
+
beforeEach(()=>config.options = {
|
|
32
|
+
hash: 'foo'
|
|
33
|
+
});
|
|
34
|
+
test('passes options through alongside the defaults', ()=>{
|
|
35
|
+
subject();
|
|
36
|
+
expect(initialize).toHaveBeenCalledWith(config.clientSideID, config.context, {
|
|
37
|
+
...defaultOptions,
|
|
38
|
+
...config.options
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
describe('when given sendEventsOnlyForVariation', ()=>{
|
|
43
|
+
beforeEach(()=>config.options = {
|
|
44
|
+
sendEventsOnlyForVariation: false
|
|
45
|
+
});
|
|
46
|
+
test('lets the caller override the default', ()=>{
|
|
47
|
+
subject();
|
|
48
|
+
expect(initialize).toHaveBeenCalledWith(config.clientSideID, config.context, {
|
|
49
|
+
sendEventsOnlyForVariation: false
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
function makeId() {
|
|
55
|
+
return Math.round(1e6 * Math.random()).toString(36);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=create-ld-client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/tests/create-ld-client.test.ts"],"sourcesContent":["import { initialize } from 'launchdarkly-js-client-sdk';\nimport { createLDClient } from '../create-ld-client';\nimport { ClientConfig } from '../types';\n\njest.mock('launchdarkly-js-client-sdk', () => ({\n initialize: jest.fn(),\n}));\n\ndescribe(`[launchdarkly-service] ${createLDClient.name}`, () => {\n const mockClient: any = Symbol('mockClient');\n const defaultOptions = { sendEventsOnlyForVariation: true };\n let config: ClientConfig;\n\n const subject = () => createLDClient(config);\n\n beforeEach(() => {\n jest.clearAllMocks();\n jest.mocked(initialize).mockImplementation(() => mockClient);\n config = { clientSideID: makeId(), context: { kind: 'multi' } };\n });\n\n test('initializes client with the given context and default options', () => {\n subject();\n\n expect(initialize).toHaveBeenCalledWith(\n config.clientSideID,\n config.context,\n defaultOptions\n );\n });\n\n test('returns the client', () => {\n expect(subject()).toBe(mockClient);\n });\n\n describe('when given options', () => {\n beforeEach(() => (config.options = { hash: 'foo' }));\n\n test('passes options through alongside the defaults', () => {\n subject();\n\n expect(initialize).toHaveBeenCalledWith(config.clientSideID, config.context, {\n ...defaultOptions,\n ...config.options,\n });\n });\n });\n\n describe('when given sendEventsOnlyForVariation', () => {\n beforeEach(() => (config.options = { sendEventsOnlyForVariation: false }));\n\n test('lets the caller override the default', () => {\n subject();\n\n expect(initialize).toHaveBeenCalledWith(config.clientSideID, config.context, {\n sendEventsOnlyForVariation: false,\n });\n });\n });\n});\n\nfunction makeId() {\n return Math.round(1e6 * Math.random()).toString(36);\n}\n"],"names":["initialize","createLDClient","jest","mock","fn","describe","name","mockClient","Symbol","defaultOptions","sendEventsOnlyForVariation","config","subject","beforeEach","clearAllMocks","mocked","mockImplementation","clientSideID","makeId","context","kind","test","expect","toHaveBeenCalledWith","toBe","options","hash","Math","round","random","toString"],"mappings":"AAAA,SAASA,UAAU,QAAQ,6BAA6B;AACxD,SAASC,cAAc,QAAQ,sBAAsB;AAGrDC,KAAKC,IAAI,CAAC,8BAA8B,IAAO,CAAA;QAC3CH,YAAYE,KAAKE,EAAE;IACvB,CAAA;AAEAC,SAAS,CAAC,uBAAuB,EAAEJ,eAAeK,IAAI,EAAE,EAAE;IACtD,MAAMC,aAAkBC,OAAO;IAC/B,MAAMC,iBAAiB;QAAEC,4BAA4B;IAAK;IAC1D,IAAIC;IAEJ,MAAMC,UAAU,IAAMX,eAAeU;IAErCE,WAAW;QACPX,KAAKY,aAAa;QAClBZ,KAAKa,MAAM,CAACf,YAAYgB,kBAAkB,CAAC,IAAMT;QACjDI,SAAS;YAAEM,cAAcC;YAAUC,SAAS;gBAAEC,MAAM;YAAQ;QAAE;IAClE;IAEAC,KAAK,iEAAiE;QAClET;QAEAU,OAAOtB,YAAYuB,oBAAoB,CACnCZ,OAAOM,YAAY,EACnBN,OAAOQ,OAAO,EACdV;IAER;IAEAY,KAAK,sBAAsB;QACvBC,OAAOV,WAAWY,IAAI,CAACjB;IAC3B;IAEAF,SAAS,sBAAsB;QAC3BQ,WAAW,IAAOF,OAAOc,OAAO,GAAG;gBAAEC,MAAM;YAAM;QAEjDL,KAAK,iDAAiD;YAClDT;YAEAU,OAAOtB,YAAYuB,oBAAoB,CAACZ,OAAOM,YAAY,EAAEN,OAAOQ,OAAO,EAAE;gBACzE,GAAGV,cAAc;gBACjB,GAAGE,OAAOc,OAAO;YACrB;QACJ;IACJ;IAEApB,SAAS,yCAAyC;QAC9CQ,WAAW,IAAOF,OAAOc,OAAO,GAAG;gBAAEf,4BAA4B;YAAM;QAEvEW,KAAK,wCAAwC;YACzCT;YAEAU,OAAOtB,YAAYuB,oBAAoB,CAACZ,OAAOM,YAAY,EAAEN,OAAOQ,OAAO,EAAE;gBACzET,4BAA4B;YAChC;QACJ;IACJ;AACJ;AAEA,SAASQ;IACL,OAAOS,KAAKC,KAAK,CAAC,MAAMD,KAAKE,MAAM,IAAIC,QAAQ,CAAC;AACpD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-client.test.d.ts","sourceRoot":"","sources":["../../src/tests/get-client.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { createLDClient } from '../create-ld-client';
|
|
2
|
+
import { getClient } from '../get-client';
|
|
3
|
+
import { getLDClient } from '../get-ld-client';
|
|
4
|
+
import { getSDKVersion } from '../get-sdk-version';
|
|
5
|
+
jest.mock('../create-ld-client', ()=>({
|
|
6
|
+
createLDClient: jest.fn()
|
|
7
|
+
}));
|
|
8
|
+
jest.mock('../get-ld-client', ()=>({
|
|
9
|
+
getLDClient: jest.fn()
|
|
10
|
+
}));
|
|
11
|
+
jest.mock('../get-sdk-version', ()=>({
|
|
12
|
+
getSDKVersion: jest.fn()
|
|
13
|
+
}));
|
|
14
|
+
describe(`[launchdarkly-service] ${getClient.name}`, ()=>{
|
|
15
|
+
const client = Symbol('client');
|
|
16
|
+
const version = '3.9.5';
|
|
17
|
+
let ldService;
|
|
18
|
+
let config;
|
|
19
|
+
const subject = ()=>getClient(ldService, config);
|
|
20
|
+
beforeEach(()=>{
|
|
21
|
+
jest.clearAllMocks();
|
|
22
|
+
jest.mocked(getLDClient).mockReturnValue(client);
|
|
23
|
+
jest.mocked(getSDKVersion).mockReturnValue(version);
|
|
24
|
+
config = {
|
|
25
|
+
clientSideID: makeId(),
|
|
26
|
+
context: {
|
|
27
|
+
kind: 'multi'
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
ldService = undefined;
|
|
31
|
+
});
|
|
32
|
+
test('returns the locally created client', ()=>{
|
|
33
|
+
expect(subject()).toBe(client);
|
|
34
|
+
});
|
|
35
|
+
describe('when ldService is provided', ()=>{
|
|
36
|
+
const ldServiceClient = Symbol('ldServiceClient');
|
|
37
|
+
beforeEach(()=>{
|
|
38
|
+
ldService = {
|
|
39
|
+
getClient: jest.fn().mockReturnValue(ldServiceClient)
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
function itReturnsLDServiceClient() {
|
|
43
|
+
test('returns the LDService client', ()=>{
|
|
44
|
+
expect(subject()).toBe(ldServiceClient);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
itReturnsLDServiceClient();
|
|
48
|
+
test('requests it using the config', ()=>{
|
|
49
|
+
subject();
|
|
50
|
+
expect(ldService === null || ldService === void 0 ? void 0 : ldService.getClient).toHaveBeenCalledWith(config);
|
|
51
|
+
});
|
|
52
|
+
describe('when LDService includes getVersionClient', ()=>{
|
|
53
|
+
const versionedClient = Symbol('versionedClient');
|
|
54
|
+
beforeEach(()=>{
|
|
55
|
+
ldService.getVersionClient = jest.fn().mockReturnValue(versionedClient);
|
|
56
|
+
});
|
|
57
|
+
test('returns the version-aware client', ()=>{
|
|
58
|
+
expect(subject()).toBe(versionedClient);
|
|
59
|
+
});
|
|
60
|
+
test('requests it using the running SDK version, the config, and the client factory', ()=>{
|
|
61
|
+
subject();
|
|
62
|
+
expect(ldService.getVersionClient).toHaveBeenCalledWith(version, config, createLDClient);
|
|
63
|
+
});
|
|
64
|
+
describe('when the running SDK version is unknown', ()=>{
|
|
65
|
+
beforeEach(()=>{
|
|
66
|
+
jest.mocked(getSDKVersion).mockReturnValue(undefined);
|
|
67
|
+
});
|
|
68
|
+
itReturnsLDServiceClient();
|
|
69
|
+
test('does not call getVersionClient', ()=>{
|
|
70
|
+
subject();
|
|
71
|
+
expect(ldService.getVersionClient).not.toHaveBeenCalled();
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
function makeId() {
|
|
78
|
+
return Math.round(1e6 * Math.random()).toString(36);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
//# sourceMappingURL=get-client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/tests/get-client.test.ts"],"sourcesContent":["import { createLDClient } from '../create-ld-client';\nimport { getClient } from '../get-client';\nimport { getLDClient } from '../get-ld-client';\nimport { getSDKVersion } from '../get-sdk-version';\nimport { ClientConfig, LDService } from '../types';\n\njest.mock('../create-ld-client', () => ({\n createLDClient: jest.fn(),\n}));\njest.mock('../get-ld-client', () => ({\n getLDClient: jest.fn(),\n}));\njest.mock('../get-sdk-version', () => ({\n getSDKVersion: jest.fn(),\n}));\n\ndescribe(`[launchdarkly-service] ${getClient.name}`, () => {\n const client: any = Symbol('client');\n const version = '3.9.5';\n let ldService: LDService | undefined;\n let config: ClientConfig;\n\n const subject = () => getClient(ldService, config);\n\n beforeEach(() => {\n jest.clearAllMocks();\n jest.mocked(getLDClient).mockReturnValue(client);\n jest.mocked(getSDKVersion).mockReturnValue(version);\n config = { clientSideID: makeId(), context: { kind: 'multi' } };\n ldService = undefined;\n });\n\n test('returns the locally created client', () => {\n expect(subject()).toBe(client);\n });\n\n describe('when ldService is provided', () => {\n const ldServiceClient: any = Symbol('ldServiceClient');\n\n beforeEach(() => {\n ldService = { getClient: jest.fn().mockReturnValue(ldServiceClient) };\n });\n\n function itReturnsLDServiceClient() {\n test('returns the LDService client', () => {\n expect(subject()).toBe(ldServiceClient);\n });\n }\n\n itReturnsLDServiceClient();\n\n test('requests it using the config', () => {\n subject();\n\n expect(ldService?.getClient).toHaveBeenCalledWith(config);\n });\n\n describe('when LDService includes getVersionClient', () => {\n const versionedClient: any = Symbol('versionedClient');\n\n beforeEach(() => {\n ldService!.getVersionClient = jest.fn().mockReturnValue(versionedClient);\n });\n\n test('returns the version-aware client', () => {\n expect(subject()).toBe(versionedClient);\n });\n\n test('requests it using the running SDK version, the config, and the client factory', () => {\n subject();\n\n expect(ldService!.getVersionClient).toHaveBeenCalledWith(\n version,\n config,\n createLDClient\n );\n });\n\n describe('when the running SDK version is unknown', () => {\n beforeEach(() => {\n jest.mocked(getSDKVersion).mockReturnValue(undefined);\n });\n\n itReturnsLDServiceClient();\n\n test('does not call getVersionClient', () => {\n subject();\n\n expect(ldService!.getVersionClient).not.toHaveBeenCalled();\n });\n });\n });\n });\n});\n\nfunction makeId() {\n return Math.round(1e6 * Math.random()).toString(36);\n}\n"],"names":["createLDClient","getClient","getLDClient","getSDKVersion","jest","mock","fn","describe","name","client","Symbol","version","ldService","config","subject","beforeEach","clearAllMocks","mocked","mockReturnValue","clientSideID","makeId","context","kind","undefined","test","expect","toBe","ldServiceClient","itReturnsLDServiceClient","toHaveBeenCalledWith","versionedClient","getVersionClient","not","toHaveBeenCalled","Math","round","random","toString"],"mappings":"AAAA,SAASA,cAAc,QAAQ,sBAAsB;AACrD,SAASC,SAAS,QAAQ,gBAAgB;AAC1C,SAASC,WAAW,QAAQ,mBAAmB;AAC/C,SAASC,aAAa,QAAQ,qBAAqB;AAGnDC,KAAKC,IAAI,CAAC,uBAAuB,IAAO,CAAA;QACpCL,gBAAgBI,KAAKE,EAAE;IAC3B,CAAA;AACAF,KAAKC,IAAI,CAAC,oBAAoB,IAAO,CAAA;QACjCH,aAAaE,KAAKE,EAAE;IACxB,CAAA;AACAF,KAAKC,IAAI,CAAC,sBAAsB,IAAO,CAAA;QACnCF,eAAeC,KAAKE,EAAE;IAC1B,CAAA;AAEAC,SAAS,CAAC,uBAAuB,EAAEN,UAAUO,IAAI,EAAE,EAAE;IACjD,MAAMC,SAAcC,OAAO;IAC3B,MAAMC,UAAU;IAChB,IAAIC;IACJ,IAAIC;IAEJ,MAAMC,UAAU,IAAMb,UAAUW,WAAWC;IAE3CE,WAAW;QACPX,KAAKY,aAAa;QAClBZ,KAAKa,MAAM,CAACf,aAAagB,eAAe,CAACT;QACzCL,KAAKa,MAAM,CAACd,eAAee,eAAe,CAACP;QAC3CE,SAAS;YAAEM,cAAcC;YAAUC,SAAS;gBAAEC,MAAM;YAAQ;QAAE;QAC9DV,YAAYW;IAChB;IAEAC,KAAK,sCAAsC;QACvCC,OAAOX,WAAWY,IAAI,CAACjB;IAC3B;IAEAF,SAAS,8BAA8B;QACnC,MAAMoB,kBAAuBjB,OAAO;QAEpCK,WAAW;YACPH,YAAY;gBAAEX,WAAWG,KAAKE,EAAE,GAAGY,eAAe,CAACS;YAAiB;QACxE;QAEA,SAASC;YACLJ,KAAK,gCAAgC;gBACjCC,OAAOX,WAAWY,IAAI,CAACC;YAC3B;QACJ;QAEAC;QAEAJ,KAAK,gCAAgC;YACjCV;YAEAW,OAAOb,sBAAAA,gCAAAA,UAAWX,SAAS,EAAE4B,oBAAoB,CAAChB;QACtD;QAEAN,SAAS,4CAA4C;YACjD,MAAMuB,kBAAuBpB,OAAO;YAEpCK,WAAW;gBACPH,UAAWmB,gBAAgB,GAAG3B,KAAKE,EAAE,GAAGY,eAAe,CAACY;YAC5D;YAEAN,KAAK,oCAAoC;gBACrCC,OAAOX,WAAWY,IAAI,CAACI;YAC3B;YAEAN,KAAK,iFAAiF;gBAClFV;gBAEAW,OAAOb,UAAWmB,gBAAgB,EAAEF,oBAAoB,CACpDlB,SACAE,QACAb;YAER;YAEAO,SAAS,2CAA2C;gBAChDQ,WAAW;oBACPX,KAAKa,MAAM,CAACd,eAAee,eAAe,CAACK;gBAC/C;gBAEAK;gBAEAJ,KAAK,kCAAkC;oBACnCV;oBAEAW,OAAOb,UAAWmB,gBAAgB,EAAEC,GAAG,CAACC,gBAAgB;gBAC5D;YACJ;QACJ;IACJ;AACJ;AAEA,SAASb;IACL,OAAOc,KAAKC,KAAK,CAAC,MAAMD,KAAKE,MAAM,IAAIC,QAAQ,CAAC;AACpD"}
|
|
@@ -1,18 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createLDClient } from '../create-ld-client';
|
|
2
2
|
import { getLDClient } from '../get-ld-client';
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
import { getSDKVersion } from '../get-sdk-version';
|
|
4
|
+
import { getVersionClient } from '../get-version-client';
|
|
5
|
+
jest.mock('../create-ld-client', ()=>({
|
|
6
|
+
createLDClient: jest.fn()
|
|
7
|
+
}));
|
|
8
|
+
jest.mock('../get-sdk-version', ()=>({
|
|
9
|
+
getSDKVersion: jest.fn()
|
|
10
|
+
}));
|
|
11
|
+
jest.mock('../get-version-client', ()=>({
|
|
12
|
+
getVersionClient: jest.fn()
|
|
5
13
|
}));
|
|
6
14
|
describe(`[launchdarkly-service] ${getLDClient.name}`, ()=>{
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
sendEventsOnlyForVariation: true
|
|
10
|
-
};
|
|
15
|
+
const client = Symbol('client');
|
|
16
|
+
const version = '3.9.5';
|
|
11
17
|
let config;
|
|
12
18
|
const subject = ()=>getLDClient(config);
|
|
13
19
|
beforeEach(()=>{
|
|
14
20
|
jest.clearAllMocks();
|
|
15
|
-
jest.mocked(
|
|
21
|
+
jest.mocked(getSDKVersion).mockReturnValue(version);
|
|
22
|
+
jest.mocked(getVersionClient).mockReturnValue(client);
|
|
16
23
|
config = {
|
|
17
24
|
clientSideID: makeId(),
|
|
18
25
|
context: {
|
|
@@ -20,42 +27,18 @@ describe(`[launchdarkly-service] ${getLDClient.name}`, ()=>{
|
|
|
20
27
|
}
|
|
21
28
|
};
|
|
22
29
|
});
|
|
23
|
-
test('
|
|
24
|
-
|
|
25
|
-
expect(
|
|
26
|
-
});
|
|
27
|
-
describe('when given options', ()=>{
|
|
28
|
-
beforeEach(()=>config.options = {
|
|
29
|
-
hash: 'foo'
|
|
30
|
-
});
|
|
31
|
-
test('passes options through alongside the defaults', ()=>{
|
|
32
|
-
subject();
|
|
33
|
-
expect(initialize).toHaveBeenCalledWith(config.clientSideID, config.context, {
|
|
34
|
-
...defaultOptions,
|
|
35
|
-
...config.options
|
|
36
|
-
});
|
|
37
|
-
});
|
|
30
|
+
test('requests it using the running SDK version, the config, and a client factory', ()=>{
|
|
31
|
+
subject();
|
|
32
|
+
expect(getVersionClient).toHaveBeenCalledWith(version, config, createLDClient);
|
|
38
33
|
});
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
sendEventsOnlyForVariation: false
|
|
42
|
-
});
|
|
43
|
-
test('lets the caller override the default', ()=>{
|
|
44
|
-
subject();
|
|
45
|
-
expect(initialize).toHaveBeenCalledWith(config.clientSideID, config.context, {
|
|
46
|
-
sendEventsOnlyForVariation: false
|
|
47
|
-
});
|
|
48
|
-
});
|
|
34
|
+
test('returns the client', ()=>{
|
|
35
|
+
expect(subject()).toBe(client);
|
|
49
36
|
});
|
|
50
|
-
describe('when
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
jest.mocked(initialize).mockImplementationOnce(()=>existingClient);
|
|
37
|
+
describe('when the running SDK version is unknown', ()=>{
|
|
38
|
+
beforeEach(()=>jest.mocked(getSDKVersion).mockReturnValue(undefined));
|
|
39
|
+
test('uses a syntactically valid semver as the version', ()=>{
|
|
54
40
|
subject();
|
|
55
|
-
|
|
56
|
-
test('returns existing client', ()=>{
|
|
57
|
-
expect(subject()).toBe(existingClient);
|
|
58
|
-
expect(initialize).toHaveBeenCalledTimes(1);
|
|
41
|
+
expect(getVersionClient).toHaveBeenCalledWith(expect.stringMatching(/^\d+\.\d+\.\d+-\S+$/), config, createLDClient);
|
|
59
42
|
});
|
|
60
43
|
});
|
|
61
44
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tests/get-ld-client.test.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../src/tests/get-ld-client.test.ts"],"sourcesContent":["import { createLDClient } from '../create-ld-client';\nimport { getLDClient } from '../get-ld-client';\nimport { getSDKVersion } from '../get-sdk-version';\nimport { getVersionClient } from '../get-version-client';\nimport { ClientConfig } from '../types';\n\njest.mock('../create-ld-client', () => ({\n createLDClient: jest.fn(),\n}));\njest.mock('../get-sdk-version', () => ({\n getSDKVersion: jest.fn(),\n}));\njest.mock('../get-version-client', () => ({\n getVersionClient: jest.fn(),\n}));\n\ndescribe(`[launchdarkly-service] ${getLDClient.name}`, () => {\n const client: any = Symbol('client');\n const version = '3.9.5';\n let config: ClientConfig;\n\n const subject = () => getLDClient(config);\n\n beforeEach(() => {\n jest.clearAllMocks();\n jest.mocked(getSDKVersion).mockReturnValue(version);\n jest.mocked(getVersionClient).mockReturnValue(client);\n config = { clientSideID: makeId(), context: { kind: 'multi' } };\n });\n\n test('requests it using the running SDK version, the config, and a client factory', () => {\n subject();\n\n expect(getVersionClient).toHaveBeenCalledWith(version, config, createLDClient);\n });\n\n test('returns the client', () => {\n expect(subject()).toBe(client);\n });\n\n describe('when the running SDK version is unknown', () => {\n beforeEach(() => jest.mocked(getSDKVersion).mockReturnValue(undefined));\n\n test('uses a syntactically valid semver as the version', () => {\n subject();\n\n expect(getVersionClient).toHaveBeenCalledWith(\n expect.stringMatching(/^\\d+\\.\\d+\\.\\d+-\\S+$/),\n config,\n createLDClient\n );\n });\n });\n});\n\nfunction makeId() {\n return Math.round(1e6 * Math.random()).toString(36);\n}\n"],"names":["createLDClient","getLDClient","getSDKVersion","getVersionClient","jest","mock","fn","describe","name","client","Symbol","version","config","subject","beforeEach","clearAllMocks","mocked","mockReturnValue","clientSideID","makeId","context","kind","test","expect","toHaveBeenCalledWith","toBe","undefined","stringMatching","Math","round","random","toString"],"mappings":"AAAA,SAASA,cAAc,QAAQ,sBAAsB;AACrD,SAASC,WAAW,QAAQ,mBAAmB;AAC/C,SAASC,aAAa,QAAQ,qBAAqB;AACnD,SAASC,gBAAgB,QAAQ,wBAAwB;AAGzDC,KAAKC,IAAI,CAAC,uBAAuB,IAAO,CAAA;QACpCL,gBAAgBI,KAAKE,EAAE;IAC3B,CAAA;AACAF,KAAKC,IAAI,CAAC,sBAAsB,IAAO,CAAA;QACnCH,eAAeE,KAAKE,EAAE;IAC1B,CAAA;AACAF,KAAKC,IAAI,CAAC,yBAAyB,IAAO,CAAA;QACtCF,kBAAkBC,KAAKE,EAAE;IAC7B,CAAA;AAEAC,SAAS,CAAC,uBAAuB,EAAEN,YAAYO,IAAI,EAAE,EAAE;IACnD,MAAMC,SAAcC,OAAO;IAC3B,MAAMC,UAAU;IAChB,IAAIC;IAEJ,MAAMC,UAAU,IAAMZ,YAAYW;IAElCE,WAAW;QACPV,KAAKW,aAAa;QAClBX,KAAKY,MAAM,CAACd,eAAee,eAAe,CAACN;QAC3CP,KAAKY,MAAM,CAACb,kBAAkBc,eAAe,CAACR;QAC9CG,SAAS;YAAEM,cAAcC;YAAUC,SAAS;gBAAEC,MAAM;YAAQ;QAAE;IAClE;IAEAC,KAAK,+EAA+E;QAChFT;QAEAU,OAAOpB,kBAAkBqB,oBAAoB,CAACb,SAASC,QAAQZ;IACnE;IAEAsB,KAAK,sBAAsB;QACvBC,OAAOV,WAAWY,IAAI,CAAChB;IAC3B;IAEAF,SAAS,2CAA2C;QAChDO,WAAW,IAAMV,KAAKY,MAAM,CAACd,eAAee,eAAe,CAACS;QAE5DJ,KAAK,oDAAoD;YACrDT;YAEAU,OAAOpB,kBAAkBqB,oBAAoB,CACzCD,OAAOI,cAAc,CAAC,wBACtBf,QACAZ;QAER;IACJ;AACJ;AAEA,SAASmB;IACL,OAAOS,KAAKC,KAAK,CAAC,MAAMD,KAAKE,MAAM,IAAIC,QAAQ,CAAC;AACpD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-sdk-version.test.d.ts","sourceRoot":"","sources":["../../src/tests/get-sdk-version.test.ts"],"names":[],"mappings":""}
|