@rudderjs/session 0.0.5

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Suleiman Shahbari
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,161 @@
1
+ # @rudderjs/session
2
+
3
+ HTTP session support for RudderJS — signed cookie sessions (default) and Redis-backed sessions.
4
+
5
+ ```bash
6
+ pnpm add @rudderjs/session
7
+ ```
8
+
9
+ For Redis sessions, also install `ioredis`:
10
+
11
+ ```bash
12
+ pnpm add ioredis
13
+ ```
14
+
15
+ ---
16
+
17
+ ## Setup
18
+
19
+ ### 1. Config
20
+
21
+ ```ts
22
+ // config/session.ts
23
+ import { Env } from '@rudderjs/support'
24
+ import type { SessionConfig } from '@rudderjs/session'
25
+
26
+ export default {
27
+ driver: Env.get('SESSION_DRIVER', 'cookie') as 'cookie' | 'redis',
28
+ lifetime: 120, // minutes
29
+ secret: Env.get('SESSION_SECRET', 'change-me-in-production'),
30
+ cookie: {
31
+ name: 'rudderjs_session',
32
+ secure: Env.getBool('SESSION_SECURE', false),
33
+ httpOnly: true,
34
+ sameSite: 'lax',
35
+ path: '/',
36
+ },
37
+ } satisfies SessionConfig
38
+ ```
39
+
40
+ ### 2. Register the provider
41
+
42
+ ```ts
43
+ // bootstrap/providers.ts
44
+ import { session } from '@rudderjs/session'
45
+ import configs from '../config/index.js'
46
+
47
+ export default [
48
+ session(configs.session),
49
+ ]
50
+ ```
51
+
52
+ ### 3. Add middleware to routes
53
+
54
+ ```ts
55
+ // routes/web.ts
56
+ import { Route } from '@rudderjs/router'
57
+ import { SessionMiddleware } from '@rudderjs/session'
58
+
59
+ const webMw = [SessionMiddleware()]
60
+
61
+ Route.get('/dashboard', handler, webMw)
62
+ Route.post('/contact', handler, webMw)
63
+ ```
64
+
65
+ ---
66
+
67
+ ## Usage
68
+
69
+ ### `req.session`
70
+
71
+ ```ts
72
+ Route.get('/profile', (req, res) => {
73
+ const visits = (req.session.get<number>('visits') ?? 0) + 1
74
+ req.session.put('visits', visits)
75
+ res.json({ visits })
76
+ }, webMw)
77
+ ```
78
+
79
+ ### `Session` facade
80
+
81
+ ```ts
82
+ import { Session } from '@rudderjs/session'
83
+
84
+ Session.put('theme', 'dark')
85
+ const theme = Session.get<string>('theme')
86
+ Session.forget('theme')
87
+ ```
88
+
89
+ ### Flash data
90
+
91
+ ```ts
92
+ // Set on this request — available on the next request only
93
+ Session.flash('success', 'Post created!')
94
+ req.session.flash('error', 'Something went wrong.')
95
+
96
+ // Read on the next request
97
+ const msg = Session.getFlash<string>('success')
98
+ ```
99
+
100
+ ### Session ID
101
+
102
+ ```ts
103
+ const id = req.session.id() // current session ID
104
+ await req.session.regenerate() // new ID, same data (use after login)
105
+ ```
106
+
107
+ ---
108
+
109
+ ## API
110
+
111
+ ### `SessionInstance`
112
+
113
+ | Method | Description |
114
+ |---|---|
115
+ | `get<T>(key, fallback?)` | Read a value. Returns `fallback` if missing. |
116
+ | `put(key, value)` | Write a value. |
117
+ | `forget(key)` | Delete a value. |
118
+ | `flush()` | Clear all session data. |
119
+ | `flash(key, value)` | Store a value readable on the *next* request via `getFlash()`. |
120
+ | `getFlash<T>(key, fallback?)` | Read a flash value set by the *previous* request. |
121
+ | `has(key)` | Check whether a key exists. |
122
+ | `all()` | Return a shallow copy of all session data. |
123
+ | `id()` | Return the current session ID. |
124
+ | `regenerate()` | Assign a new session ID (destroys old in Redis, keeps data). |
125
+
126
+ ### `Session` facade
127
+
128
+ Mirrors `SessionInstance` as static methods, backed by `AsyncLocalStorage`. Throws if called outside a request wrapped by `SessionMiddleware()`.
129
+
130
+ `get` · `put` · `forget` · `flash` · `getFlash` · `has` · `all` · `regenerate`
131
+
132
+ ---
133
+
134
+ ## Drivers
135
+
136
+ ### `cookie` (default)
137
+
138
+ Session data is JSON-serialised, base64url-encoded, and signed with HMAC-SHA256. No external dependencies. The entire payload is stored in the cookie (~4 KB limit).
139
+
140
+ ### `redis`
141
+
142
+ Session ID is stored in the cookie; data lives in Redis under `{prefix}{id}`. Requires `ioredis`.
143
+
144
+ ```ts
145
+ {
146
+ driver: 'redis',
147
+ redis: {
148
+ url: 'redis://localhost:6379',
149
+ prefix: 'session:',
150
+ },
151
+ }
152
+ ```
153
+
154
+ ---
155
+
156
+ ## Notes
157
+
158
+ - Apply `SessionMiddleware()` to web routes only — API routes should use stateless auth.
159
+ - Session is saved automatically after the route handler returns; no manual `save()` needed.
160
+ - The cookie driver stores all data client-side — keep values small. Use Redis for larger payloads.
161
+ - `SessionMiddleware()` reads config from the DI container. Use `sessionMiddleware(config)` for manual wiring without a provider.
@@ -0,0 +1,105 @@
1
+ import { ServiceProvider, type Application } from '@rudderjs/core';
2
+ import type { AppResponse, MiddlewareHandler } from '@rudderjs/contracts';
3
+ declare module '@rudderjs/contracts' {
4
+ interface AppRequest {
5
+ session: SessionInstance;
6
+ }
7
+ }
8
+ export interface SessionConfig {
9
+ driver: 'cookie' | 'redis';
10
+ lifetime: number;
11
+ secret: string;
12
+ cookie: {
13
+ name: string;
14
+ secure: boolean;
15
+ httpOnly: boolean;
16
+ sameSite: 'lax' | 'strict' | 'none';
17
+ path: string;
18
+ };
19
+ redis?: {
20
+ prefix?: string;
21
+ url?: string;
22
+ host?: string;
23
+ port?: number;
24
+ password?: string;
25
+ };
26
+ }
27
+ interface SessionPayload {
28
+ id: string;
29
+ data: Record<string, unknown>;
30
+ flash_next: Record<string, unknown>;
31
+ }
32
+ interface InternalDriver {
33
+ /** Load payload from the raw cookie value (undefined = no cookie). */
34
+ load(cookieValue: string | undefined): Promise<SessionPayload>;
35
+ /** Persist payload and return the value to store in the cookie. */
36
+ persist(payload: SessionPayload, ttlSeconds: number): Promise<string>;
37
+ /** Destroy a session by ID. */
38
+ destroy(id: string): Promise<void>;
39
+ }
40
+ export declare class SessionInstance {
41
+ private _data;
42
+ private _flash;
43
+ private _flashNext;
44
+ private _id;
45
+ private _dirty;
46
+ private readonly _driver;
47
+ private readonly _config;
48
+ constructor(payload: SessionPayload, driver: InternalDriver, config: SessionConfig);
49
+ get<T>(key: string, fallback?: T): T | undefined;
50
+ put(key: string, value: unknown): void;
51
+ forget(key: string): void;
52
+ flush(): void;
53
+ /** Store a value that will be readable on the *next* request via getFlash(). */
54
+ flash(key: string, value: unknown): void;
55
+ /** Read a flash value set by the *previous* request. */
56
+ getFlash<T>(key: string, fallback?: T): T | undefined;
57
+ has(key: string): boolean;
58
+ all(): Record<string, unknown>;
59
+ id(): string;
60
+ regenerate(): Promise<void>;
61
+ /** Whether the session data has been modified since loading. */
62
+ isDirty(): boolean;
63
+ /** @internal — force the session to be saved (e.g. new sessions, flash consumption). */
64
+ markDirty(): void;
65
+ save(res: AppResponse): Promise<void>;
66
+ }
67
+ export declare class Session {
68
+ private static current;
69
+ static get<T>(key: string, fallback?: T): T | undefined;
70
+ static put(key: string, value: unknown): void;
71
+ static forget(key: string): void;
72
+ static flash(key: string, value: unknown): void;
73
+ static getFlash<T>(key: string, fallback?: T): T | undefined;
74
+ static has(key: string): boolean;
75
+ static all(): Record<string, unknown>;
76
+ static regenerate(): Promise<void>;
77
+ }
78
+ export declare function sessionMiddleware(config: SessionConfig): MiddlewareHandler;
79
+ /**
80
+ * Session middleware that reads its config from the DI container.
81
+ * Requires session() provider to be registered in bootstrap/providers.ts.
82
+ *
83
+ * Usage in routes:
84
+ * import { SessionMiddleware } from '@rudderjs/session'
85
+ * Route.get('/path', handler, [SessionMiddleware()])
86
+ */
87
+ export declare function SessionMiddleware(): MiddlewareHandler;
88
+ /**
89
+ * Returns a SessionServiceProvider class configured for the given session config.
90
+ *
91
+ * Built-in drivers: cookie (signed HMAC — no external deps)
92
+ * redis (requires ioredis: pnpm add ioredis)
93
+ *
94
+ * Usage in bootstrap/providers.ts:
95
+ * import { session } from '@rudderjs/session'
96
+ * import configs from '../config/index.js'
97
+ * export default [..., session(configs.session), ...]
98
+ *
99
+ * Usage in bootstrap/app.ts:
100
+ * import { sessionMiddleware } from '@rudderjs/session'
101
+ * .withMiddleware((m) => { m.use(sessionMiddleware(configs.session)) })
102
+ */
103
+ export declare function session(config: SessionConfig): new (app: Application) => ServiceProvider;
104
+ export {};
105
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,321 @@
1
+ import { createHmac, randomUUID } from 'node:crypto';
2
+ import { AsyncLocalStorage } from 'node:async_hooks';
3
+ import { ServiceProvider, app } from '@rudderjs/core';
4
+ // ─── SessionInstance ───────────────────────────────────────
5
+ export class SessionInstance {
6
+ _data;
7
+ _flash;
8
+ _flashNext;
9
+ _id;
10
+ _dirty = false;
11
+ _driver;
12
+ _config;
13
+ constructor(payload, driver, config) {
14
+ this._id = payload.id;
15
+ this._data = { ...payload.data };
16
+ this._flash = { ...payload.flash_next }; // prev flash_next → current flash
17
+ this._flashNext = {};
18
+ this._driver = driver;
19
+ this._config = config;
20
+ // Flash data was consumed — mark dirty so save() clears it from the cookie
21
+ if (Object.keys(payload.flash_next).length > 0)
22
+ this._dirty = true;
23
+ }
24
+ get(key, fallback) {
25
+ return (key in this._data ? this._data[key] : fallback);
26
+ }
27
+ put(key, value) {
28
+ this._data[key] = value;
29
+ this._dirty = true;
30
+ }
31
+ forget(key) {
32
+ delete this._data[key];
33
+ this._dirty = true;
34
+ }
35
+ flush() {
36
+ this._data = {};
37
+ this._dirty = true;
38
+ }
39
+ /** Store a value that will be readable on the *next* request via getFlash(). */
40
+ flash(key, value) {
41
+ this._flashNext[key] = value;
42
+ this._dirty = true;
43
+ }
44
+ /** Read a flash value set by the *previous* request. */
45
+ getFlash(key, fallback) {
46
+ return (key in this._flash ? this._flash[key] : fallback);
47
+ }
48
+ has(key) {
49
+ return key in this._data;
50
+ }
51
+ all() {
52
+ return { ...this._data };
53
+ }
54
+ id() {
55
+ return this._id;
56
+ }
57
+ async regenerate() {
58
+ await this._driver.destroy(this._id);
59
+ this._id = randomUUID();
60
+ this._dirty = true;
61
+ }
62
+ /** Whether the session data has been modified since loading. */
63
+ isDirty() { return this._dirty; }
64
+ /** @internal — force the session to be saved (e.g. new sessions, flash consumption). */
65
+ markDirty() { this._dirty = true; }
66
+ async save(res) {
67
+ if (!this._dirty)
68
+ return; // skip Set-Cookie if session wasn't modified
69
+ const payload = {
70
+ id: this._id,
71
+ data: this._data,
72
+ flash_next: this._flashNext,
73
+ };
74
+ const ttl = this._config.lifetime * 60;
75
+ const cookieValue = await this._driver.persist(payload, ttl);
76
+ const cookieStr = buildCookieHeader(this._config.cookie.name, cookieValue, this._config);
77
+ const c = res.raw;
78
+ if (c.res) {
79
+ // Response already finalized — clone with Set-Cookie header
80
+ const newHeaders = new Headers(c.res.headers);
81
+ newHeaders.append('Set-Cookie', cookieStr);
82
+ c.res = new Response(c.res.body, {
83
+ status: c.res.status,
84
+ statusText: c.res.statusText,
85
+ headers: newHeaders,
86
+ });
87
+ }
88
+ else {
89
+ c.header('Set-Cookie', cookieStr);
90
+ }
91
+ }
92
+ }
93
+ // ─── AsyncLocalStorage + Session Facade ───────────────────
94
+ const _als = new AsyncLocalStorage();
95
+ export class Session {
96
+ static current() {
97
+ const s = _als.getStore();
98
+ if (!s)
99
+ throw new Error('[RudderJS Session] No session in context. Use sessionMiddleware.');
100
+ return s;
101
+ }
102
+ static get(key, fallback) {
103
+ return this.current().get(key, fallback);
104
+ }
105
+ static put(key, value) {
106
+ this.current().put(key, value);
107
+ }
108
+ static forget(key) {
109
+ this.current().forget(key);
110
+ }
111
+ static flash(key, value) {
112
+ this.current().flash(key, value);
113
+ }
114
+ static getFlash(key, fallback) {
115
+ return this.current().getFlash(key, fallback);
116
+ }
117
+ static has(key) {
118
+ return this.current().has(key);
119
+ }
120
+ static all() {
121
+ return this.current().all();
122
+ }
123
+ static regenerate() {
124
+ return this.current().regenerate();
125
+ }
126
+ }
127
+ // ─── Cookie Driver ─────────────────────────────────────────
128
+ function signPayload(payload, secret) {
129
+ const b64 = Buffer.from(JSON.stringify(payload)).toString('base64url');
130
+ const hmac = createHmac('sha256', secret).update(b64).digest('base64url');
131
+ return `${b64}.${hmac}`;
132
+ }
133
+ function verifyPayload(cookieValue, secret) {
134
+ const dotIdx = cookieValue.lastIndexOf('.');
135
+ if (dotIdx === -1)
136
+ return null;
137
+ const b64 = cookieValue.slice(0, dotIdx);
138
+ const hmac = cookieValue.slice(dotIdx + 1);
139
+ const expected = createHmac('sha256', secret).update(b64).digest('base64url');
140
+ // Constant-time comparison
141
+ if (expected.length !== hmac.length)
142
+ return null;
143
+ let mismatch = 0;
144
+ for (let i = 0; i < expected.length; i++) {
145
+ mismatch |= (expected.codePointAt(i) ?? 0) ^ (hmac.codePointAt(i) ?? 0);
146
+ }
147
+ if (mismatch !== 0)
148
+ return null;
149
+ try {
150
+ return JSON.parse(Buffer.from(b64, 'base64url').toString('utf8'));
151
+ }
152
+ catch {
153
+ return null;
154
+ }
155
+ }
156
+ class CookieDriver {
157
+ secret;
158
+ constructor(secret) {
159
+ this.secret = secret;
160
+ }
161
+ async load(cookieValue) {
162
+ if (!cookieValue)
163
+ return this.empty();
164
+ return verifyPayload(cookieValue, this.secret) ?? this.empty();
165
+ }
166
+ async persist(payload, _ttl) {
167
+ return signPayload(payload, this.secret);
168
+ }
169
+ async destroy(_id) {
170
+ // Cookie driver: nothing to destroy server-side
171
+ }
172
+ empty() {
173
+ return { id: randomUUID(), data: {}, flash_next: {} };
174
+ }
175
+ }
176
+ // ─── Redis Driver ──────────────────────────────────────────
177
+ class RedisDriver {
178
+ config;
179
+ client;
180
+ prefix;
181
+ constructor(config) {
182
+ this.config = config;
183
+ this.prefix = config.prefix ?? 'session:';
184
+ }
185
+ async getClient() {
186
+ if (!this.client) {
187
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
188
+ const { Redis } = await import('ioredis');
189
+ this.client = this.config.url
190
+ ? new Redis(this.config.url)
191
+ : new Redis({
192
+ host: this.config.host ?? '127.0.0.1',
193
+ port: this.config.port ?? 6379,
194
+ password: this.config.password,
195
+ });
196
+ }
197
+ return this.client;
198
+ }
199
+ key(id) { return `${this.prefix}${id}`; }
200
+ async load(cookieValue) {
201
+ if (!cookieValue)
202
+ return this.empty();
203
+ try {
204
+ const client = await this.getClient();
205
+ const raw = await client.get(this.key(cookieValue));
206
+ if (!raw)
207
+ return this.emptyWithId(cookieValue);
208
+ return JSON.parse(raw);
209
+ }
210
+ catch {
211
+ return this.empty();
212
+ }
213
+ }
214
+ async persist(payload, ttl) {
215
+ const client = await this.getClient();
216
+ await client.set(this.key(payload.id), JSON.stringify(payload), 'EX', ttl);
217
+ return payload.id;
218
+ }
219
+ async destroy(id) {
220
+ try {
221
+ const client = await this.getClient();
222
+ await client.del(this.key(id));
223
+ }
224
+ catch {
225
+ // ignore
226
+ }
227
+ }
228
+ empty() {
229
+ return { id: randomUUID(), data: {}, flash_next: {} };
230
+ }
231
+ emptyWithId(id) {
232
+ return { id, data: {}, flash_next: {} };
233
+ }
234
+ }
235
+ // ─── Helpers ───────────────────────────────────────────────
236
+ function parseCookie(header, name) {
237
+ for (const part of header.split(';')) {
238
+ const eqIdx = part.indexOf('=');
239
+ if (eqIdx === -1)
240
+ continue;
241
+ const k = part.slice(0, eqIdx).trim();
242
+ if (k === name)
243
+ return part.slice(eqIdx + 1).trim();
244
+ }
245
+ return undefined;
246
+ }
247
+ function buildCookieHeader(name, value, config) {
248
+ const parts = [
249
+ `${name}=${value}`,
250
+ `Path=${config.cookie.path}`,
251
+ `Max-Age=${config.lifetime * 60}`,
252
+ `SameSite=${config.cookie.sameSite}`,
253
+ ];
254
+ if (config.cookie.httpOnly)
255
+ parts.push('HttpOnly');
256
+ if (config.cookie.secure)
257
+ parts.push('Secure');
258
+ return parts.join('; ');
259
+ }
260
+ function makeDriver(config) {
261
+ if (config.driver === 'redis')
262
+ return new RedisDriver(config.redis ?? {});
263
+ return new CookieDriver(config.secret);
264
+ }
265
+ // ─── Session Middleware ────────────────────────────────────
266
+ export function sessionMiddleware(config) {
267
+ const driver = makeDriver(config);
268
+ return async function SessionMiddleware(req, res, next) {
269
+ const cookieHeader = req.headers['cookie'] ?? '';
270
+ const cookieValue = parseCookie(cookieHeader, config.cookie.name);
271
+ const payload = await driver.load(cookieValue);
272
+ const session = new SessionInstance(payload, driver, config);
273
+ // New session (no cookie yet) — always write Set-Cookie to establish the session
274
+ if (!cookieValue)
275
+ session.markDirty();
276
+ req.raw['__rjs_session'] = session;
277
+ await _als.run(session, next);
278
+ await session.save(res);
279
+ };
280
+ }
281
+ // ─── Zero-config middleware (reads config from DI) ─────────
282
+ /**
283
+ * Session middleware that reads its config from the DI container.
284
+ * Requires session() provider to be registered in bootstrap/providers.ts.
285
+ *
286
+ * Usage in routes:
287
+ * import { SessionMiddleware } from '@rudderjs/session'
288
+ * Route.get('/path', handler, [SessionMiddleware()])
289
+ */
290
+ export function SessionMiddleware() {
291
+ const config = app().make('session.config');
292
+ return sessionMiddleware(config);
293
+ }
294
+ // ─── Service Provider Factory ──────────────────────────────
295
+ /**
296
+ * Returns a SessionServiceProvider class configured for the given session config.
297
+ *
298
+ * Built-in drivers: cookie (signed HMAC — no external deps)
299
+ * redis (requires ioredis: pnpm add ioredis)
300
+ *
301
+ * Usage in bootstrap/providers.ts:
302
+ * import { session } from '@rudderjs/session'
303
+ * import configs from '../config/index.js'
304
+ * export default [..., session(configs.session), ...]
305
+ *
306
+ * Usage in bootstrap/app.ts:
307
+ * import { sessionMiddleware } from '@rudderjs/session'
308
+ * .withMiddleware((m) => { m.use(sessionMiddleware(configs.session)) })
309
+ */
310
+ export function session(config) {
311
+ class SessionServiceProvider extends ServiceProvider {
312
+ register() { }
313
+ boot() {
314
+ this.app.instance('session.config', config);
315
+ this.app.instance('session.middleware', sessionMiddleware(config));
316
+ this.app.instance('session.facade', Session);
317
+ }
318
+ }
319
+ return SessionServiceProvider;
320
+ }
321
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@rudderjs/session",
3
+ "version": "0.0.5",
4
+ "license": "MIT",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/rudderjs/rudder",
8
+ "directory": "packages/session"
9
+ },
10
+ "type": "module",
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "main": "./dist/index.js",
15
+ "types": "./dist/index.d.ts",
16
+ "exports": {
17
+ ".": {
18
+ "import": "./dist/index.js",
19
+ "types": "./dist/index.d.ts"
20
+ }
21
+ },
22
+ "dependencies": {
23
+ "@rudderjs/contracts": "0.0.3",
24
+ "@rudderjs/core": "0.0.8"
25
+ },
26
+ "optionalDependencies": {
27
+ "ioredis": "^5.3.0"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^20.0.0",
31
+ "typescript": "^5.4.0"
32
+ },
33
+ "author": "Suleiman Shahbari",
34
+ "scripts": {
35
+ "build": "tsc -p tsconfig.build.json",
36
+ "dev": "tsc -p tsconfig.build.json --watch",
37
+ "typecheck": "tsc --noEmit",
38
+ "lint": "eslint src",
39
+ "test": "tsc -p tsconfig.test.json && node --test dist-test/index.test.js; EXIT=$?; rm -rf dist-test; exit $EXIT",
40
+ "clean": "rm -rf dist"
41
+ }
42
+ }