Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions packages/analytics-core/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -769,13 +769,14 @@ function analytics(config = {}) {
* @param {String} key - storage key
* @param {any} value - storage value
* @param {Object} [options] - storage options
* @return {Promise<Object>} Dispatch promise for storage pipeline
*
* @example
*
* analytics.storage.setItem('storage_key', 'value')
*/
setItem: (key, value, options) => {
store.dispatch({
return store.dispatch({
type: EVENTS.setItemStart,
key: key,
value: value,
Expand All @@ -787,13 +788,14 @@ function analytics(config = {}) {
* @typedef {Function} RemoveItem
* @param {String} key - storage key
* @param {Object} [options] - storage options
* @return {Promise<Object>} Dispatch promise for storage pipeline
*
* @example
*
* analytics.storage.removeItem('storage_key')
*/
removeItem: (key, options) => {
store.dispatch({
return store.dispatch({
type: EVENTS.removeItemStart,
key: key,
options: options
Expand Down
5 changes: 3 additions & 2 deletions packages/analytics-core/src/utils/filterDisabled.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@ import { isBoolean } from '@analytics/type-utils'

export default function fitlerDisabledPlugins(allPlugins, settings = {}, options = {}) {
return Object.keys(allPlugins).filter((name) => {
const plugin = allPlugins[name]
const fromCallOptions = options.plugins || {}
// If enabled/disabled by options. Override settings
if (isBoolean(fromCallOptions[name])) {
return fromCallOptions[name]
}
// If all: false disable everything unless true explicitly set
// If all: false disable everything unless explicitly enabled or alwaysEnabled
if (fromCallOptions.all === false) {
return false
return plugin && plugin.alwaysEnabled === true
}
// else use state.plugin settings
if (settings[name] && settings[name].enabled === false) {
Expand Down
39 changes: 39 additions & 0 deletions packages/analytics-core/tests/plugins-scoped-calls.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,45 @@ test('No plugins get called if config.plugins.all set to false', async () => {
assert.is(dummyThree.callCount, 0)
})

test('alwaysEnabled plugin still runs when config.plugins.all false', async () => {
const destinationSpy = sandbox.spy()
const enricherSpy = sandbox.spy()

const analytics = Analytics({
app: 'appname',
plugins: [
{
name: 'destination-plugin',
page: destinationSpy,
track: destinationSpy,
identify: destinationSpy
},
{
name: 'enricher-plugin',
alwaysEnabled: true,
page: enricherSpy,
track: enricherSpy,
identify: enricherSpy
},
]
})

const opts = {
plugins: {
all: false,
}
}

analytics.page({}, opts)
analytics.track('eventName', {}, opts)
analytics.identify('userId-123', {}, opts)

await delay(100)

assert.is(destinationSpy.callCount, 0)
assert.is(enricherSpy.callCount, 3)
})

test('Single destination via config.plugins.all false works', async () => {
const dummyOne = sandbox.spy()
const dummyTwo = sandbox.spy()
Expand Down
52 changes: 52 additions & 0 deletions packages/analytics-core/tests/storage/storage.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import '../_setup.js'
import { test } from 'uvu'
import * as assert from 'uvu/assert'
import isPromise from '../_utils/isPromise.js'
import Analytics from '../../src/index.js'

test('storage.setItem returns a promise', () => {
const analytics = Analytics({
app: 'appname',
version: 100
})

const promise = analytics.storage.setItem('storage_key', 'storage_value')
assert.is(isPromise(promise), true)
})

test('storage.removeItem returns a promise', () => {
const analytics = Analytics({
app: 'appname',
version: 100
})

const promise = analytics.storage.removeItem('storage_key')
assert.is(isPromise(promise), true)
})

test('awaiting storage.setItem allows immediate reads', async () => {
const analytics = Analytics({
app: 'appname',
version: 100
})

await analytics.storage.setItem('storage_key', 'storage_value')

const value = analytics.storage.getItem('storage_key')
assert.is(value, 'storage_value')
})

test('awaiting storage.removeItem removes value', async () => {
const analytics = Analytics({
app: 'appname',
version: 100
})

await analytics.storage.setItem('storage_key', 'storage_value')
await analytics.storage.removeItem('storage_key')

const value = analytics.storage.getItem('storage_key')
assert.is(value, undefined)
})

test.run()