Skip to content

Commit a5c1ea2

Browse files
feat(audience): scaffold @imtbl/audience-sdk package
Package scaffold with types, config, context wrapper, and debug logger. No SDK class yet — that comes in the next PR. Also fixes pre-existing CI flaky tests: - x-client: mock getStarkPublicKeyFromImx and IMX API calls - checkout: stop replacing entire window object in connect tests Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 4b3ad9c commit a5c1ea2

15 files changed

Lines changed: 242 additions & 36 deletions

File tree

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module.exports = {
2+
extends: ['../../../.eslintrc'],
3+
parserOptions: {
4+
project: './tsconfig.eslint.json',
5+
tsconfigRootDir: __dirname,
6+
},
7+
};
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import type { Config } from 'jest';
2+
3+
const config: Config = {
4+
roots: ['<rootDir>/src'],
5+
moduleDirectories: ['node_modules', 'src'],
6+
testEnvironment: 'jsdom',
7+
transform: {
8+
'^.+\\.(t|j)sx?$': '@swc/jest',
9+
},
10+
moduleNameMapper: {
11+
'^@imtbl/audience-core$': '<rootDir>/../core/src/index.ts',
12+
},
13+
};
14+
15+
export default config;

packages/audience/sdk/package.json

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
{
2+
"name": "@imtbl/audience-sdk",
3+
"description": "Immutable Audience SDK — consent-aware event tracking and identity management",
4+
"version": "0.0.0",
5+
"author": "Immutable",
6+
"bugs": "https://github.com/immutable/ts-immutable-sdk/issues",
7+
"dependencies": {
8+
"@imtbl/audience-core": "workspace:*"
9+
},
10+
"devDependencies": {
11+
"@swc/core": "^1.4.2",
12+
"@swc/jest": "^0.2.37",
13+
"@types/jest": "^29.5.12",
14+
"@types/node": "^22.10.7",
15+
"eslint": "^8.56.0",
16+
"jest": "^29.7.0",
17+
"jest-environment-jsdom": "^29.4.3",
18+
"ts-jest": "^29.1.0",
19+
"tsup": "^8.3.0",
20+
"typescript": "^5.6.2"
21+
},
22+
"engines": {
23+
"node": ">=20.11.0"
24+
},
25+
"exports": {
26+
"development": {
27+
"types": "./src/index.ts",
28+
"browser": "./dist/browser/index.js",
29+
"require": "./dist/node/index.cjs",
30+
"default": "./dist/node/index.js"
31+
},
32+
"default": {
33+
"types": "./dist/types/index.d.ts",
34+
"browser": "./dist/browser/index.js",
35+
"require": "./dist/node/index.cjs",
36+
"default": "./dist/node/index.js"
37+
}
38+
},
39+
"files": ["dist"],
40+
"homepage": "https://github.com/immutable/ts-immutable-sdk#readme",
41+
"main": "dist/node/index.cjs",
42+
"module": "dist/node/index.js",
43+
"browser": "dist/browser/index.js",
44+
"publishConfig": {
45+
"access": "public"
46+
},
47+
"repository": "immutable/ts-immutable-sdk.git",
48+
"scripts": {
49+
"build": "pnpm transpile && pnpm typegen",
50+
"transpile": "tsup src/index.ts --config ../../../tsup.config.js",
51+
"typegen": "tsc --customConditions default --emitDeclarationOnly --outDir dist/types",
52+
"lint": "eslint ./src --ext .ts,.jsx,.tsx --max-warnings=0",
53+
"test": "jest --passWithNoTests",
54+
"test:watch": "jest --watch",
55+
"typecheck": "tsc --customConditions development --noEmit --jsx preserve"
56+
},
57+
"type": "module",
58+
"types": "./dist/types/index.d.ts"
59+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// SDK-specific constants.
2+
// Backend endpoints and base URLs come from @imtbl/audience-core.
3+
4+
export const LIBRARY_NAME = '@imtbl/audience-sdk';
5+
// Replaced at build time by esbuild replace plugin
6+
export const LIBRARY_VERSION = '__SDK_VERSION__';
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import type { EventContext } from '@imtbl/audience-core';
2+
import { collectContext as coreCollectContext } from '@imtbl/audience-core';
3+
import { LIBRARY_NAME, LIBRARY_VERSION } from './config';
4+
5+
export function collectContext(): EventContext {
6+
return coreCollectContext(LIBRARY_NAME, LIBRARY_VERSION);
7+
}

packages/audience/sdk/src/debug.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import type { ConsentLevel, Message } from '@imtbl/audience-core';
2+
3+
const PREFIX = '[Immutable Audience]';
4+
5+
export class DebugLogger {
6+
private enabled: boolean;
7+
8+
constructor(enabled = false) {
9+
this.enabled = enabled;
10+
}
11+
12+
logEvent(method: string, message: Message): void {
13+
if (!this.enabled) return;
14+
// eslint-disable-next-line no-console
15+
console.log(`${PREFIX} ${method}`, message);
16+
}
17+
18+
logFlush(ok: boolean, count: number): void {
19+
if (!this.enabled) return;
20+
// eslint-disable-next-line no-console
21+
console.log(`${PREFIX} flush ${ok ? 'ok' : 'failed'} (${count} messages)`);
22+
}
23+
24+
logConsent(from: ConsentLevel, to: ConsentLevel): void {
25+
if (!this.enabled) return;
26+
// eslint-disable-next-line no-console
27+
console.log(`${PREFIX} consent ${from}${to}`);
28+
}
29+
30+
logWarning(msg: string): void {
31+
if (!this.enabled) return;
32+
// eslint-disable-next-line no-console
33+
console.warn(`${PREFIX} ${msg}`);
34+
}
35+
}

packages/audience/sdk/src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export type { AudienceSDKConfig } from './types';
2+
export { DebugLogger } from './debug';
3+
export { collectContext } from './context';

packages/audience/sdk/src/types.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import type { Environment, ConsentLevel } from '@imtbl/audience-core';
2+
3+
/** Configuration for the Immutable Audience SDK. */
4+
export interface AudienceSDKConfig {
5+
publishableKey: string;
6+
environment: Environment;
7+
/** Defaults to 'none' — no tracking until explicitly opted in. */
8+
consent?: ConsentLevel;
9+
debug?: boolean;
10+
cookieDomain?: string;
11+
flushInterval?: number;
12+
flushSize?: number;
13+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"extends": "./tsconfig.json",
3+
"include": ["src"],
4+
"exclude": []
5+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"extends": "../../../tsconfig.base.json",
3+
"compilerOptions": {
4+
"outDir": "./dist",
5+
"rootDirs": ["src"],
6+
"customConditions": ["development"]
7+
},
8+
"include": ["src"],
9+
"exclude": ["dist", "jest.config.ts", "node_modules", "src/**/*.test.ts"]
10+
}

0 commit comments

Comments
 (0)