diff --git a/CHANGES.txt b/CHANGES.txt index e8fb97f..038d10f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,7 @@ +1.5.0 (October 7, 2025) + - Added support for custom loggers: added `logger` configuration option and `factory.Logger.setLogger` method to allow the SDK to use a custom logger. + - Updated @splitsoftware/splitio-commons package to version 2.7.0. + 1.4.0 (September 18, 2025) - Added the `wrapper` option to the SDK's `InLocalStorage` module, to allow passing a custom storage for persisting the SDK rollout plan. The default is `window.localStorage`. - Added the `initialRolloutPlan` configuration option for the SDK in standalone mode, to allow preloading the SDK storage with a snapshot of the rollout plan. diff --git a/package-lock.json b/package-lock.json index 457f921..75ed7ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "@splitsoftware/splitio-browserjs", - "version": "1.4.0", + "version": "1.5.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@splitsoftware/splitio-browserjs", - "version": "1.4.0", + "version": "1.5.0", "license": "Apache-2.0", "dependencies": { - "@splitsoftware/splitio-commons": "2.6.0", + "@splitsoftware/splitio-commons": "2.7.0", "tslib": "^2.3.1", "unfetch": "^4.2.0" }, @@ -1396,9 +1396,9 @@ "dev": true }, "node_modules/@splitsoftware/splitio-commons": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-commons/-/splitio-commons-2.6.0.tgz", - "integrity": "sha512-0xODXLciIvHSuMlb8eukIB2epb3ZyGOsrwS0cMuTdxEvCqr7Nuc9pWDdJtRuN1UwL/jIjBnpDYAc8s6mpqLX2g==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-commons/-/splitio-commons-2.7.0.tgz", + "integrity": "sha512-w2aemu5HNVQXX/tbmSuFjpWa/AjS+EBiH6ltHMqfg2MZMWayTFJbfjjQcudAVLR+vLjDw2DuCTp/xj3kKlcf5g==", "license": "Apache-2.0", "dependencies": { "@types/ioredis": "^4.28.0", @@ -8623,9 +8623,9 @@ } }, "node_modules/tar-fs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", - "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10493,9 +10493,9 @@ "dev": true }, "@splitsoftware/splitio-commons": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-commons/-/splitio-commons-2.6.0.tgz", - "integrity": "sha512-0xODXLciIvHSuMlb8eukIB2epb3ZyGOsrwS0cMuTdxEvCqr7Nuc9pWDdJtRuN1UwL/jIjBnpDYAc8s6mpqLX2g==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-commons/-/splitio-commons-2.7.0.tgz", + "integrity": "sha512-w2aemu5HNVQXX/tbmSuFjpWa/AjS+EBiH6ltHMqfg2MZMWayTFJbfjjQcudAVLR+vLjDw2DuCTp/xj3kKlcf5g==", "requires": { "@types/ioredis": "^4.28.0", "tslib": "^2.3.1" @@ -15887,9 +15887,9 @@ } }, "tar-fs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", - "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "dev": true, "requires": { "chownr": "^1.1.1", diff --git a/package.json b/package.json index cfbb8dc..889e806 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@splitsoftware/splitio-browserjs", - "version": "1.4.0", + "version": "1.5.0", "description": "Split SDK for JavaScript on Browser", "main": "cjs/index.js", "module": "esm/index.js", @@ -59,7 +59,7 @@ "bugs": "https://github.com/splitio/javascript-browser-client/issues", "homepage": "https://github.com/splitio/javascript-browser-client#readme", "dependencies": { - "@splitsoftware/splitio-commons": "2.6.0", + "@splitsoftware/splitio-commons": "2.7.0", "tslib": "^2.3.1", "unfetch": "^4.2.0" }, diff --git a/src/__tests__/logger/browser.spec.js b/src/__tests__/logger/browser.spec.js index 4443fef..c4dd0d2 100644 --- a/src/__tests__/logger/browser.spec.js +++ b/src/__tests__/logger/browser.spec.js @@ -54,6 +54,26 @@ tape('## E2E Logger Tests ##', assert => { t.end(); }); + assert.test('debug settings: custom logger', async (t) => { + const customLogger = { + debug: sinon.spy(), + info: sinon.spy(), + warn: sinon.spy(), + error: sinon.spy() + }; + + const factory = SplitFactory({ ...minConfig, debug: 'INFO', logger: customLogger }); + + t.equal(factory.settings.log.options.logLevel, 'DEBUG', 'When combined with the `logger` option, any log level other than `NONE` (false) will be set to `DEBUG` (true)'); + + await factory.client().destroy(); + t.true(customLogger.debug.calledWithMatch('splitio => '), 'should log messages with level DEBUG'); + t.true(customLogger.info.calledWithMatch('splitio => '), 'should log messages with level INFO'); + + logSpy.resetHistory(); + t.end(); + }); + assert.test('debug settings: localStorage.splitio_debug = "enable"', async (t) => { const factory = SplitFactory(minConfig); await Promise.resolve(); @@ -79,6 +99,18 @@ tape('## E2E Logger Tests ##', assert => { factory.Logger.setLogLevel('invalid'); t.equal(factory.settings.log.options.logLevel, 'WARN'); + // attempt to set invalid logger + factory.Logger.setLogger('invalid logger'); + t.equal(factory.settings.log.logger, undefined); + + // set logger + factory.Logger.setLogger(console); + t.equal(factory.settings.log.logger, console); + + // unset logger + factory.Logger.setLogger(undefined); + t.equal(factory.settings.log.logger, undefined); + factory.client().destroy(); } diff --git a/src/settings/defaults.ts b/src/settings/defaults.ts index 5f930ad..d89c0ab 100644 --- a/src/settings/defaults.ts +++ b/src/settings/defaults.ts @@ -2,7 +2,7 @@ import type SplitIO from '@splitsoftware/splitio-commons/types/splitio'; import { LogLevels, isLogLevelString } from '@splitsoftware/splitio-commons/src/logger/index'; import { CONSENT_GRANTED } from '@splitsoftware/splitio-commons/src/utils/constants'; -const packageVersion = '1.4.0'; +const packageVersion = '1.5.0'; /** * In browser, the default debug level, can be set via the `localStorage.splitio_debug` item. diff --git a/ts-tests/index.ts b/ts-tests/index.ts index 643fc26..b7d27e0 100644 --- a/ts-tests/index.ts +++ b/ts-tests/index.ts @@ -54,6 +54,7 @@ let asyncClient: SplitIO.IBrowserAsyncClient; let asyncManager: SplitIO.IAsyncManager; // Utility interfaces let impressionListener: SplitIO.IImpressionListener; +let MyLogger: SplitIO.Logger = console; /**** Custom Types ****/ @@ -248,6 +249,7 @@ SDK.Logger.setLogLevel(SDK.Logger.LogLevel.WARN); SDK.Logger.setLogLevel(SDK.Logger.LogLevel.ERROR); SDK.Logger.setLogLevel(SDK.Logger.LogLevel.NONE); SDK.Logger.disable(); +SDK.Logger.setLogger(MyLogger); AsyncSDK.Logger.enable(); AsyncSDK.Logger.setLogLevel(AsyncSDK.Logger.LogLevel.DEBUG); @@ -256,6 +258,7 @@ AsyncSDK.Logger.setLogLevel(AsyncSDK.Logger.LogLevel.WARN); AsyncSDK.Logger.setLogLevel(AsyncSDK.Logger.LogLevel.ERROR); AsyncSDK.Logger.setLogLevel(AsyncSDK.Logger.LogLevel.NONE); AsyncSDK.Logger.disable(); +AsyncSDK.Logger.setLogger(MyLogger); /**** Tests for IClient interface ****/ @@ -598,6 +601,7 @@ let fullBrowserSettings: SplitIO.IClientSideSettings = { storage: syncStorageFactory, impressionListener: impressionListener, debug: true, + logger: MyLogger, integrations: [], streamingEnabled: true, sync: { @@ -645,6 +649,7 @@ let fullBrowserAsyncSettings: SplitIO.IClientSideAsyncSettings = { }), impressionListener: impressionListener, debug: true, + logger: MyLogger, integrations: [], sync: { impressionsMode: 'DEBUG', diff --git a/types/index.d.ts b/types/index.d.ts index 1a44e1a..53f7c3b 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -19,7 +19,7 @@ declare module JsSdk { /** * Persistent storage. By default, it uses the browser's LocalStorage API if available. * - * @see {@link https://developer.harness.io/docs/feature-management-experimentation/sdks-and-infrastructure/client-side-sdks/browser-sdk/#configuring-persistent-cache-for-the-sdk} + * @see {@link https://developer.harness.io/docs/feature-management-experimentation/sdks-and-infrastructure/client-side-sdks/browser-sdk/#configuring-cache} */ export function InLocalStorage(options?: SplitIO.InLocalStorageOptions): SplitIO.StorageSyncFactory;