@pl4yzonellc/empire-analytics 0.0.2
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/CHANGELOG.md +28 -0
- package/LICENSE +21 -0
- package/README.md +744 -0
- package/dist/chunk-J5GXHJNU.js +1105 -0
- package/dist/chunk-J5GXHJNU.js.map +1 -0
- package/dist/index.d.ts +200 -0
- package/dist/index.js +117 -0
- package/dist/index.js.map +1 -0
- package/dist/testing/index.d.ts +91 -0
- package/dist/testing/index.js +108 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/types-Bzaq1v4t.d.ts +507 -0
- package/package.json +97 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { e as AnalyticsAdapter, A as AnalyticsClient, i as AnalyticsConfigBase } from '../types-Bzaq1v4t.js';
|
|
2
|
+
|
|
3
|
+
interface MemoryAdapterEvent {
|
|
4
|
+
name: string;
|
|
5
|
+
properties?: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* An in-memory {@link AnalyticsAdapter} that records everything and sends nothing.
|
|
9
|
+
* Use it to assert on what the SDK forwards to a provider, without loading Plausible.
|
|
10
|
+
*/
|
|
11
|
+
declare class MemoryAdapter implements AnalyticsAdapter {
|
|
12
|
+
readonly name = "memory";
|
|
13
|
+
events: MemoryAdapterEvent[];
|
|
14
|
+
pageViews: (string | undefined)[];
|
|
15
|
+
initializeCount: number;
|
|
16
|
+
destroyCount: number;
|
|
17
|
+
get initialized(): boolean;
|
|
18
|
+
initialize(): void;
|
|
19
|
+
track(name: string, properties?: Record<string, unknown>): void;
|
|
20
|
+
pageView(path?: string): void;
|
|
21
|
+
destroy(): void;
|
|
22
|
+
reset(): void;
|
|
23
|
+
/** Convenience: the most recent recorded event, or `undefined`. */
|
|
24
|
+
get lastEvent(): MemoryAdapterEvent | undefined;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface RecordedEvent {
|
|
28
|
+
name: string;
|
|
29
|
+
properties?: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
interface MockAnalyticsClient extends AnalyticsClient {
|
|
32
|
+
/** Every `track()` call, in order. */
|
|
33
|
+
readonly events: RecordedEvent[];
|
|
34
|
+
/** Every `pageView()` path, in order. */
|
|
35
|
+
readonly pageViews: (string | undefined)[];
|
|
36
|
+
/** Clear recorded calls and restore the initial enabled/initialized state. */
|
|
37
|
+
reset(): void;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* `spy` wraps each method so matchers like `toHaveBeenCalledWith` work. Pass your
|
|
41
|
+
* test runner's spy factory, e.g. `{ spy: (fn) => vi.fn(fn) }`.
|
|
42
|
+
*/
|
|
43
|
+
type MockSpyFactory = (fn: (...args: any[]) => any) => (...args: any[]) => any;
|
|
44
|
+
interface CreateMockAnalyticsClientOptions {
|
|
45
|
+
/** Initial `isEnabled()` value. Default `true`. */
|
|
46
|
+
enabled?: boolean;
|
|
47
|
+
/** Initial `isInitialized()` value. Default `true`. */
|
|
48
|
+
initialized?: boolean;
|
|
49
|
+
/** Optional spy wrapper (e.g. `vi.fn`) so call assertions work on the methods. */
|
|
50
|
+
spy?: MockSpyFactory;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* A zero-dependency fake {@link AnalyticsClient} for consuming-app unit tests.
|
|
54
|
+
* Nothing is loaded or sent; calls are recorded on `events` / `pageViews`.
|
|
55
|
+
*
|
|
56
|
+
* ```ts
|
|
57
|
+
* import { createMockAnalyticsClient } from '@pl4yzonellc/empire-analytics/testing';
|
|
58
|
+
*
|
|
59
|
+
* const analytics = createMockAnalyticsClient({ spy: (fn) => vi.fn(fn) });
|
|
60
|
+
* render(<AnalyticsProvider config={config} client={analytics}><App /></AnalyticsProvider>);
|
|
61
|
+
* // ...
|
|
62
|
+
* expect(analytics.track).toHaveBeenCalledWith('checkout_started', expect.anything());
|
|
63
|
+
* expect(analytics.events).toContainEqual({ name: 'checkout_started', properties: { cartValue: 1 } });
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
declare function createMockAnalyticsClient(options?: CreateMockAnalyticsClientOptions): MockAnalyticsClient;
|
|
67
|
+
|
|
68
|
+
interface TestAnalyticsClient {
|
|
69
|
+
/** A real {@link AnalyticsClient} wired to an in-memory adapter. */
|
|
70
|
+
client: AnalyticsClient;
|
|
71
|
+
/** The adapter backing `client` — inspect `adapter.events` / `adapter.pageViews`. */
|
|
72
|
+
adapter: MemoryAdapter;
|
|
73
|
+
}
|
|
74
|
+
type TestConfigOverrides = Partial<Pick<AnalyticsConfigBase, 'environment' | 'enabled' | 'debug' | 'tenantKey' | 'includeTenantKey' | 'tenantPropertyName' | 'defaultProperties' | 'privacy' | 'onError' | 'onEvent'>>;
|
|
75
|
+
/**
|
|
76
|
+
* Spin up a fully wired client that exercises the real core pipeline (privacy
|
|
77
|
+
* sanitization, tenant handling, enabled/disabled logic) but records events in
|
|
78
|
+
* memory instead of hitting a network.
|
|
79
|
+
*
|
|
80
|
+
* Defaults: `environment: 'test'`, `enabled: true`. Initialization is synchronous
|
|
81
|
+
* for practical purposes — the client is usable the moment this returns.
|
|
82
|
+
*
|
|
83
|
+
* ```ts
|
|
84
|
+
* const { client, adapter } = createTestAnalyticsClient();
|
|
85
|
+
* client.track('checkout_started', { cartValue: 125 });
|
|
86
|
+
* expect(adapter.lastEvent).toEqual({ name: 'checkout_started', properties: { cartValue: 125 } });
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
declare function createTestAnalyticsClient(overrides?: TestConfigOverrides): TestAnalyticsClient;
|
|
90
|
+
|
|
91
|
+
export { type CreateMockAnalyticsClientOptions, MemoryAdapter, type MemoryAdapterEvent, type MockAnalyticsClient, type MockSpyFactory, type RecordedEvent, type TestAnalyticsClient, createMockAnalyticsClient, createTestAnalyticsClient };
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { createAnalyticsClient } from '../chunk-J5GXHJNU.js';
|
|
2
|
+
|
|
3
|
+
// src/testing/MemoryAdapter.ts
|
|
4
|
+
var MemoryAdapter = class {
|
|
5
|
+
name = "memory";
|
|
6
|
+
events = [];
|
|
7
|
+
pageViews = [];
|
|
8
|
+
initializeCount = 0;
|
|
9
|
+
destroyCount = 0;
|
|
10
|
+
get initialized() {
|
|
11
|
+
return this.initializeCount > this.destroyCount;
|
|
12
|
+
}
|
|
13
|
+
initialize() {
|
|
14
|
+
this.initializeCount += 1;
|
|
15
|
+
}
|
|
16
|
+
track(name, properties) {
|
|
17
|
+
this.events.push({ name, properties });
|
|
18
|
+
}
|
|
19
|
+
pageView(path) {
|
|
20
|
+
this.pageViews.push(path);
|
|
21
|
+
}
|
|
22
|
+
destroy() {
|
|
23
|
+
this.destroyCount += 1;
|
|
24
|
+
}
|
|
25
|
+
reset() {
|
|
26
|
+
this.events = [];
|
|
27
|
+
this.pageViews = [];
|
|
28
|
+
this.initializeCount = 0;
|
|
29
|
+
this.destroyCount = 0;
|
|
30
|
+
}
|
|
31
|
+
/** Convenience: the most recent recorded event, or `undefined`. */
|
|
32
|
+
get lastEvent() {
|
|
33
|
+
return this.events.at(-1);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
// src/testing/createMockAnalyticsClient.ts
|
|
38
|
+
function createMockAnalyticsClient(options = {}) {
|
|
39
|
+
const identity = (fn) => fn;
|
|
40
|
+
const wrap = options.spy ?? identity;
|
|
41
|
+
const defaults = {
|
|
42
|
+
enabled: options.enabled ?? true,
|
|
43
|
+
initialized: options.initialized ?? true
|
|
44
|
+
};
|
|
45
|
+
let enabled = defaults.enabled;
|
|
46
|
+
let initialized = defaults.initialized;
|
|
47
|
+
const events = [];
|
|
48
|
+
const pageViews = [];
|
|
49
|
+
const initialize = wrap((_config) => {
|
|
50
|
+
initialized = true;
|
|
51
|
+
return Promise.resolve();
|
|
52
|
+
});
|
|
53
|
+
const track = wrap((event, ...args) => {
|
|
54
|
+
const properties = args[0];
|
|
55
|
+
events.push({ name: event, properties });
|
|
56
|
+
});
|
|
57
|
+
const pageView = wrap((path) => {
|
|
58
|
+
pageViews.push(path);
|
|
59
|
+
});
|
|
60
|
+
const setEnabled = wrap((next) => {
|
|
61
|
+
enabled = next;
|
|
62
|
+
});
|
|
63
|
+
const destroy = wrap(() => {
|
|
64
|
+
initialized = false;
|
|
65
|
+
});
|
|
66
|
+
return {
|
|
67
|
+
events,
|
|
68
|
+
pageViews,
|
|
69
|
+
initialize,
|
|
70
|
+
track,
|
|
71
|
+
pageView,
|
|
72
|
+
setEnabled,
|
|
73
|
+
destroy,
|
|
74
|
+
isEnabled: () => enabled,
|
|
75
|
+
isInitialized: () => initialized,
|
|
76
|
+
getState: () => ({
|
|
77
|
+
initialized,
|
|
78
|
+
enabled,
|
|
79
|
+
environment: "test",
|
|
80
|
+
provider: "custom",
|
|
81
|
+
debug: false
|
|
82
|
+
}),
|
|
83
|
+
reset: () => {
|
|
84
|
+
events.length = 0;
|
|
85
|
+
pageViews.length = 0;
|
|
86
|
+
enabled = defaults.enabled;
|
|
87
|
+
initialized = defaults.initialized;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// src/testing/createTestAnalyticsClient.ts
|
|
93
|
+
function createTestAnalyticsClient(overrides = {}) {
|
|
94
|
+
const adapter = new MemoryAdapter();
|
|
95
|
+
const client = createAnalyticsClient();
|
|
96
|
+
void client.initialize({
|
|
97
|
+
provider: "custom",
|
|
98
|
+
environment: "test",
|
|
99
|
+
enabled: true,
|
|
100
|
+
...overrides,
|
|
101
|
+
adapter: () => adapter
|
|
102
|
+
});
|
|
103
|
+
return { client, adapter };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export { MemoryAdapter, createMockAnalyticsClient, createTestAnalyticsClient };
|
|
107
|
+
//# sourceMappingURL=index.js.map
|
|
108
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/testing/MemoryAdapter.ts","../../src/testing/createMockAnalyticsClient.ts","../../src/testing/createTestAnalyticsClient.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { AnalyticsAdapter } from '../providers/types';\n\nexport interface MemoryAdapterEvent {\n name: string;\n properties?: Record<string, unknown>;\n}\n\n/**\n * An in-memory {@link AnalyticsAdapter} that records everything and sends nothing.\n * Use it to assert on what the SDK forwards to a provider, without loading Plausible.\n */\nexport class MemoryAdapter implements AnalyticsAdapter {\n readonly name = 'memory';\n\n events: MemoryAdapterEvent[] = [];\n pageViews: (string | undefined)[] = [];\n initializeCount = 0;\n destroyCount = 0;\n\n get initialized(): boolean {\n return this.initializeCount > this.destroyCount;\n }\n\n initialize(): void {\n this.initializeCount += 1;\n }\n\n track(name: string, properties?: Record<string, unknown>): void {\n this.events.push({ name, properties });\n }\n\n pageView(path?: string): void {\n this.pageViews.push(path);\n }\n\n destroy(): void {\n this.destroyCount += 1;\n }\n\n reset(): void {\n this.events = [];\n this.pageViews = [];\n this.initializeCount = 0;\n this.destroyCount = 0;\n }\n\n /** Convenience: the most recent recorded event, or `undefined`. */\n get lastEvent(): MemoryAdapterEvent | undefined {\n return this.events.at(-1);\n }\n}\n","import type { AnalyticsClient, AnalyticsClientState, AnalyticsConfig } from '../core/types';\nimport type { AnalyticsEventName, TrackArgs } from '../events/types';\n\nexport interface RecordedEvent {\n name: string;\n properties?: Record<string, unknown>;\n}\n\nexport interface MockAnalyticsClient extends AnalyticsClient {\n /** Every `track()` call, in order. */\n readonly events: RecordedEvent[];\n /** Every `pageView()` path, in order. */\n readonly pageViews: (string | undefined)[];\n /** Clear recorded calls and restore the initial enabled/initialized state. */\n reset(): void;\n}\n\n/**\n * `spy` wraps each method so matchers like `toHaveBeenCalledWith` work. Pass your\n * test runner's spy factory, e.g. `{ spy: (fn) => vi.fn(fn) }`.\n */\nexport type MockSpyFactory = (fn: (...args: any[]) => any) => (...args: any[]) => any;\n\nexport interface CreateMockAnalyticsClientOptions {\n /** Initial `isEnabled()` value. Default `true`. */\n enabled?: boolean;\n /** Initial `isInitialized()` value. Default `true`. */\n initialized?: boolean;\n /** Optional spy wrapper (e.g. `vi.fn`) so call assertions work on the methods. */\n spy?: MockSpyFactory;\n}\n\n/**\n * A zero-dependency fake {@link AnalyticsClient} for consuming-app unit tests.\n * Nothing is loaded or sent; calls are recorded on `events` / `pageViews`.\n *\n * ```ts\n * import { createMockAnalyticsClient } from '@pl4yzonellc/empire-analytics/testing';\n *\n * const analytics = createMockAnalyticsClient({ spy: (fn) => vi.fn(fn) });\n * render(<AnalyticsProvider config={config} client={analytics}><App /></AnalyticsProvider>);\n * // ...\n * expect(analytics.track).toHaveBeenCalledWith('checkout_started', expect.anything());\n * expect(analytics.events).toContainEqual({ name: 'checkout_started', properties: { cartValue: 1 } });\n * ```\n */\nexport function createMockAnalyticsClient(\n options: CreateMockAnalyticsClientOptions = {},\n): MockAnalyticsClient {\n const identity = <F extends (...args: any[]) => any>(fn: F): F => fn;\n const wrap = (options.spy ?? identity) as <F extends (...args: any[]) => any>(fn: F) => F;\n\n const defaults = {\n enabled: options.enabled ?? true,\n initialized: options.initialized ?? true,\n };\n\n let enabled = defaults.enabled;\n let initialized = defaults.initialized;\n const events: RecordedEvent[] = [];\n const pageViews: (string | undefined)[] = [];\n\n const initialize = wrap((_config: AnalyticsConfig): Promise<void> => {\n initialized = true;\n return Promise.resolve();\n });\n\n const track = wrap(<K extends AnalyticsEventName>(event: K, ...args: TrackArgs<K>): void => {\n const properties: Record<string, unknown> | undefined = args[0];\n events.push({ name: event, properties });\n });\n\n const pageView = wrap((path?: string): void => {\n pageViews.push(path);\n });\n\n const setEnabled = wrap((next: boolean): void => {\n enabled = next;\n });\n\n const destroy = wrap((): void => {\n initialized = false;\n });\n\n return {\n events,\n pageViews,\n initialize,\n track,\n pageView,\n setEnabled,\n destroy,\n isEnabled: () => enabled,\n isInitialized: () => initialized,\n getState: (): AnalyticsClientState => ({\n initialized,\n enabled,\n environment: 'test',\n provider: 'custom',\n debug: false,\n }),\n reset: () => {\n events.length = 0;\n pageViews.length = 0;\n enabled = defaults.enabled;\n initialized = defaults.initialized;\n },\n };\n}\n","import { createAnalyticsClient } from '../core/AnalyticsClient';\nimport type { AnalyticsClient, AnalyticsConfigBase } from '../core/types';\nimport { MemoryAdapter } from './MemoryAdapter';\n\nexport interface TestAnalyticsClient {\n /** A real {@link AnalyticsClient} wired to an in-memory adapter. */\n client: AnalyticsClient;\n /** The adapter backing `client` — inspect `adapter.events` / `adapter.pageViews`. */\n adapter: MemoryAdapter;\n}\n\ntype TestConfigOverrides = Partial<\n Pick<\n AnalyticsConfigBase,\n | 'environment'\n | 'enabled'\n | 'debug'\n | 'tenantKey'\n | 'includeTenantKey'\n | 'tenantPropertyName'\n | 'defaultProperties'\n | 'privacy'\n | 'onError'\n | 'onEvent'\n >\n>;\n\n/**\n * Spin up a fully wired client that exercises the real core pipeline (privacy\n * sanitization, tenant handling, enabled/disabled logic) but records events in\n * memory instead of hitting a network.\n *\n * Defaults: `environment: 'test'`, `enabled: true`. Initialization is synchronous\n * for practical purposes — the client is usable the moment this returns.\n *\n * ```ts\n * const { client, adapter } = createTestAnalyticsClient();\n * client.track('checkout_started', { cartValue: 125 });\n * expect(adapter.lastEvent).toEqual({ name: 'checkout_started', properties: { cartValue: 125 } });\n * ```\n */\nexport function createTestAnalyticsClient(\n overrides: TestConfigOverrides = {},\n): TestAnalyticsClient {\n const adapter = new MemoryAdapter();\n const client = createAnalyticsClient();\n\n void client.initialize({\n provider: 'custom',\n environment: 'test',\n enabled: true,\n ...overrides,\n adapter: () => adapter,\n });\n\n return { client, adapter };\n}\n"]}
|