@forjio/engine-auth 0.1.0

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.
Files changed (68) hide show
  1. package/dist/__tests__/api-keys.test.d.ts +2 -0
  2. package/dist/__tests__/api-keys.test.d.ts.map +1 -0
  3. package/dist/__tests__/api-keys.test.js +78 -0
  4. package/dist/__tests__/api-keys.test.js.map +1 -0
  5. package/dist/__tests__/helpers/express-mock.d.ts +13 -0
  6. package/dist/__tests__/helpers/express-mock.d.ts.map +1 -0
  7. package/dist/__tests__/helpers/express-mock.js +46 -0
  8. package/dist/__tests__/helpers/express-mock.js.map +1 -0
  9. package/dist/__tests__/helpers/redis-mock.d.ts +19 -0
  10. package/dist/__tests__/helpers/redis-mock.d.ts.map +1 -0
  11. package/dist/__tests__/helpers/redis-mock.js +69 -0
  12. package/dist/__tests__/helpers/redis-mock.js.map +1 -0
  13. package/dist/__tests__/jwt.test.d.ts +2 -0
  14. package/dist/__tests__/jwt.test.d.ts.map +1 -0
  15. package/dist/__tests__/jwt.test.js +98 -0
  16. package/dist/__tests__/jwt.test.js.map +1 -0
  17. package/dist/__tests__/middleware.test.d.ts +2 -0
  18. package/dist/__tests__/middleware.test.d.ts.map +1 -0
  19. package/dist/__tests__/middleware.test.js +173 -0
  20. package/dist/__tests__/middleware.test.js.map +1 -0
  21. package/dist/__tests__/session.test.d.ts +2 -0
  22. package/dist/__tests__/session.test.d.ts.map +1 -0
  23. package/dist/__tests__/session.test.js +96 -0
  24. package/dist/__tests__/session.test.js.map +1 -0
  25. package/dist/api-keys.d.ts +29 -0
  26. package/dist/api-keys.d.ts.map +1 -0
  27. package/dist/api-keys.js +50 -0
  28. package/dist/api-keys.js.map +1 -0
  29. package/dist/index.d.ts +10 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +31 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/jwt.d.ts +7 -0
  34. package/dist/jwt.d.ts.map +1 -0
  35. package/dist/jwt.js +66 -0
  36. package/dist/jwt.js.map +1 -0
  37. package/dist/middleware.d.ts +29 -0
  38. package/dist/middleware.d.ts.map +1 -0
  39. package/dist/middleware.js +94 -0
  40. package/dist/middleware.js.map +1 -0
  41. package/dist/oauth.d.ts +16 -0
  42. package/dist/oauth.d.ts.map +1 -0
  43. package/dist/oauth.js +78 -0
  44. package/dist/oauth.js.map +1 -0
  45. package/dist/session.d.ts +9 -0
  46. package/dist/session.d.ts.map +1 -0
  47. package/dist/session.js +61 -0
  48. package/dist/session.js.map +1 -0
  49. package/dist/types.d.ts +50 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +3 -0
  52. package/dist/types.js.map +1 -0
  53. package/package.json +34 -0
  54. package/src/__tests__/api-keys.test.ts +94 -0
  55. package/src/__tests__/helpers/express-mock.ts +47 -0
  56. package/src/__tests__/helpers/redis-mock.ts +65 -0
  57. package/src/__tests__/jwt.test.ts +122 -0
  58. package/src/__tests__/middleware.test.ts +220 -0
  59. package/src/__tests__/session.test.ts +120 -0
  60. package/src/api-keys.ts +56 -0
  61. package/src/index.ts +46 -0
  62. package/src/jwt.ts +61 -0
  63. package/src/middleware.ts +113 -0
  64. package/src/oauth.ts +111 -0
  65. package/src/session.ts +78 -0
  66. package/src/types.ts +45 -0
  67. package/tsconfig.json +19 -0
  68. package/vitest.config.ts +21 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=api-keys.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-keys.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/api-keys.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const api_keys_1 = require("../api-keys");
5
+ (0, vitest_1.describe)('api-keys', () => {
6
+ (0, vitest_1.describe)('generateApiKey', () => {
7
+ (0, vitest_1.it)('should generate key with ek_ prefix', () => {
8
+ const key = (0, api_keys_1.generateApiKey)();
9
+ (0, vitest_1.expect)(key.startsWith('ek_')).toBe(true);
10
+ });
11
+ (0, vitest_1.it)('should generate unique keys', () => {
12
+ const key1 = (0, api_keys_1.generateApiKey)();
13
+ const key2 = (0, api_keys_1.generateApiKey)();
14
+ (0, vitest_1.expect)(key1).not.toBe(key2);
15
+ });
16
+ (0, vitest_1.it)('should generate key of expected length', () => {
17
+ const key = (0, api_keys_1.generateApiKey)();
18
+ // ek_ prefix (3) + 32 bytes hex encoded (64) = 67 chars
19
+ (0, vitest_1.expect)(key.length).toBe(67);
20
+ });
21
+ (0, vitest_1.it)('should accept a custom prefix', () => {
22
+ const key = (0, api_keys_1.generateApiKey)('custom_');
23
+ (0, vitest_1.expect)(key.startsWith('custom_')).toBe(true);
24
+ });
25
+ });
26
+ (0, vitest_1.describe)('hashApiKey', () => {
27
+ (0, vitest_1.it)('should return consistent hash for same key', () => {
28
+ const key = 'ek_abc123';
29
+ const hash1 = (0, api_keys_1.hashApiKey)(key);
30
+ const hash2 = (0, api_keys_1.hashApiKey)(key);
31
+ (0, vitest_1.expect)(hash1).toBe(hash2);
32
+ });
33
+ (0, vitest_1.it)('should return different hash for different key', () => {
34
+ const hash1 = (0, api_keys_1.hashApiKey)('ek_key1');
35
+ const hash2 = (0, api_keys_1.hashApiKey)('ek_key2');
36
+ (0, vitest_1.expect)(hash1).not.toBe(hash2);
37
+ });
38
+ (0, vitest_1.it)('should not be reversible (hash !== key)', () => {
39
+ const key = (0, api_keys_1.generateApiKey)();
40
+ const hash = (0, api_keys_1.hashApiKey)(key);
41
+ (0, vitest_1.expect)(hash).not.toBe(key);
42
+ (0, vitest_1.expect)(hash).not.toContain('ek_');
43
+ });
44
+ });
45
+ (0, vitest_1.describe)('validateApiKeyFormat', () => {
46
+ (0, vitest_1.it)('should accept valid ek_ prefixed key', () => {
47
+ const key = (0, api_keys_1.generateApiKey)();
48
+ (0, vitest_1.expect)((0, api_keys_1.validateApiKeyFormat)(key)).toBe(true);
49
+ });
50
+ (0, vitest_1.it)('should reject key without prefix', () => {
51
+ const hex = 'a'.repeat(64);
52
+ (0, vitest_1.expect)((0, api_keys_1.validateApiKeyFormat)(hex)).toBe(false);
53
+ });
54
+ (0, vitest_1.it)('should reject empty string', () => {
55
+ (0, vitest_1.expect)((0, api_keys_1.validateApiKeyFormat)('')).toBe(false);
56
+ });
57
+ (0, vitest_1.it)('should reject key with wrong length', () => {
58
+ (0, vitest_1.expect)((0, api_keys_1.validateApiKeyFormat)('ek_tooshort')).toBe(false);
59
+ });
60
+ (0, vitest_1.it)('should reject key with non-hex characters', () => {
61
+ const badKey = 'ek_' + 'z'.repeat(64);
62
+ (0, vitest_1.expect)((0, api_keys_1.validateApiKeyFormat)(badKey)).toBe(false);
63
+ });
64
+ });
65
+ (0, vitest_1.describe)('createApiKeyPair', () => {
66
+ (0, vitest_1.it)('should return both plain key and hash', () => {
67
+ const pair = (0, api_keys_1.createApiKeyPair)();
68
+ (0, vitest_1.expect)(pair.plainKey).toBeDefined();
69
+ (0, vitest_1.expect)(pair.hashedKey).toBeDefined();
70
+ (0, vitest_1.expect)(pair.plainKey).not.toBe(pair.hashedKey);
71
+ });
72
+ (0, vitest_1.it)('should return hash that matches hashing the plain key', () => {
73
+ const pair = (0, api_keys_1.createApiKeyPair)();
74
+ (0, vitest_1.expect)((0, api_keys_1.hashApiKey)(pair.plainKey)).toBe(pair.hashedKey);
75
+ });
76
+ });
77
+ });
78
+ //# sourceMappingURL=api-keys.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-keys.test.js","sourceRoot":"","sources":["../../src/__tests__/api-keys.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,0CAKqB;AAErB,IAAA,iBAAQ,EAAC,UAAU,EAAE,GAAG,EAAE;IACxB,IAAA,iBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,IAAA,WAAE,EAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,GAAG,GAAG,IAAA,yBAAc,GAAE,CAAC;YAC7B,IAAA,eAAM,EAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,IAAI,GAAG,IAAA,yBAAc,GAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,IAAA,yBAAc,GAAE,CAAC;YAC9B,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,GAAG,GAAG,IAAA,yBAAc,GAAE,CAAC;YAC7B,wDAAwD;YACxD,IAAA,eAAM,EAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,GAAG,GAAG,IAAA,yBAAc,EAAC,SAAS,CAAC,CAAC;YACtC,IAAA,eAAM,EAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,IAAA,WAAE,EAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,GAAG,GAAG,WAAW,CAAC;YACxB,MAAM,KAAK,GAAG,IAAA,qBAAU,EAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,KAAK,GAAG,IAAA,qBAAU,EAAC,GAAG,CAAC,CAAC;YAC9B,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,KAAK,GAAG,IAAA,qBAAU,EAAC,SAAS,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,IAAA,qBAAU,EAAC,SAAS,CAAC,CAAC;YACpC,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,GAAG,GAAG,IAAA,yBAAc,GAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAA,qBAAU,EAAC,GAAG,CAAC,CAAC;YAC7B,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,GAAG,GAAG,IAAA,yBAAc,GAAE,CAAC;YAC7B,IAAA,eAAM,EAAC,IAAA,+BAAoB,EAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAA,eAAM,EAAC,IAAA,+BAAoB,EAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,IAAA,eAAM,EAAC,IAAA,+BAAoB,EAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,IAAA,eAAM,EAAC,IAAA,+BAAoB,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,MAAM,GAAG,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACtC,IAAA,eAAM,EAAC,IAAA,+BAAoB,EAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,IAAA,WAAE,EAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,IAAI,GAAG,IAAA,2BAAgB,GAAE,CAAC;YAChC,IAAA,eAAM,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YACpC,IAAA,eAAM,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;YACrC,IAAA,eAAM,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,IAAI,GAAG,IAAA,2BAAgB,GAAE,CAAC;YAChC,IAAA,eAAM,EAAC,IAAA,qBAAU,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Creates a mock Express Request object.
3
+ */
4
+ export declare function createMockReq(overrides?: Record<string, unknown>): any;
5
+ /**
6
+ * Creates a mock Express Response object with chainable methods.
7
+ */
8
+ export declare function createMockRes(): any;
9
+ /**
10
+ * Creates a mock Express next function.
11
+ */
12
+ export declare function createMockNext(): import("vitest").Mock<(...args: any[]) => any>;
13
+ //# sourceMappingURL=express-mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express-mock.d.ts","sourceRoot":"","sources":["../../../src/__tests__/helpers/express-mock.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAM9D,GAAG,CACT;AAED;;GAEG;AACH,wBAAgB,aAAa,QAsB5B;AAED;;GAEG;AACH,wBAAgB,cAAc,mDAE7B"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMockReq = createMockReq;
4
+ exports.createMockRes = createMockRes;
5
+ exports.createMockNext = createMockNext;
6
+ const vitest_1 = require("vitest");
7
+ /**
8
+ * Creates a mock Express Request object.
9
+ */
10
+ function createMockReq(overrides = {}) {
11
+ return {
12
+ headers: {},
13
+ authUser: undefined,
14
+ apiKey: undefined,
15
+ ...overrides,
16
+ };
17
+ }
18
+ /**
19
+ * Creates a mock Express Response object with chainable methods.
20
+ */
21
+ function createMockRes() {
22
+ const res = {
23
+ statusCode: 200,
24
+ _json: null,
25
+ };
26
+ res.status = vitest_1.vi.fn((code) => {
27
+ res.statusCode = code;
28
+ return res;
29
+ });
30
+ res.json = vitest_1.vi.fn((data) => {
31
+ res._json = data;
32
+ return res;
33
+ });
34
+ res.send = vitest_1.vi.fn((data) => {
35
+ res._json = data;
36
+ return res;
37
+ });
38
+ return res;
39
+ }
40
+ /**
41
+ * Creates a mock Express next function.
42
+ */
43
+ function createMockNext() {
44
+ return vitest_1.vi.fn();
45
+ }
46
+ //# sourceMappingURL=express-mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express-mock.js","sourceRoot":"","sources":["../../../src/__tests__/helpers/express-mock.ts"],"names":[],"mappings":";;AAKA,sCAOC;AAKD,sCAsBC;AAKD,wCAEC;AA9CD,mCAA4B;AAE5B;;GAEG;AACH,SAAgB,aAAa,CAAC,YAAqC,EAAE;IACnE,OAAO;QACL,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,SAAS;QACjB,GAAG,SAAS;KACN,CAAC;AACX,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa;IAC3B,MAAM,GAAG,GAAQ;QACf,UAAU,EAAE,GAAG;QACf,KAAK,EAAE,IAAe;KACvB,CAAC;IAEF,GAAG,CAAC,MAAM,GAAG,WAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE;QAClC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;QACtB,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,GAAG,WAAE,CAAC,EAAE,CAAC,CAAC,IAAa,EAAE,EAAE;QACjC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;QACjB,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,GAAG,WAAE,CAAC,EAAE,CAAC,CAAC,IAAa,EAAE,EAAE;QACjC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;QACjB,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc;IAC5B,OAAO,WAAE,CAAC,EAAE,EAAE,CAAC;AACjB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * In-memory Redis mock for testing session store.
3
+ * Implements the subset of ioredis methods used by session.ts.
4
+ */
5
+ export declare class RedisMock {
6
+ private store;
7
+ private sets;
8
+ private ttls;
9
+ get(key: string): Promise<string | null>;
10
+ setex(key: string, ttl: number, value: string): Promise<'OK'>;
11
+ del(...keys: string[]): Promise<number>;
12
+ sadd(key: string, ...members: string[]): Promise<number>;
13
+ srem(key: string, ...members: string[]): Promise<number>;
14
+ smembers(key: string): Promise<string[]>;
15
+ expire(_key: string, _seconds: number): Promise<number>;
16
+ /** Helper: clear all data between tests */
17
+ clear(): void;
18
+ }
19
+ //# sourceMappingURL=redis-mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-mock.d.ts","sourceRoot":"","sources":["../../../src/__tests__/helpers/redis-mock.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,IAAI,CAAkC;IAC9C,OAAO,CAAC,IAAI,CAA6B;IAEnC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7D,GAAG,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAUvC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAUxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAUxD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKxC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI7D,2CAA2C;IAC3C,KAAK,IAAI,IAAI;CAKd"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RedisMock = void 0;
4
+ /**
5
+ * In-memory Redis mock for testing session store.
6
+ * Implements the subset of ioredis methods used by session.ts.
7
+ */
8
+ class RedisMock {
9
+ store = new Map();
10
+ sets = new Map();
11
+ ttls = new Map();
12
+ async get(key) {
13
+ return this.store.get(key) ?? null;
14
+ }
15
+ async setex(key, ttl, value) {
16
+ this.store.set(key, value);
17
+ this.ttls.set(key, ttl);
18
+ return 'OK';
19
+ }
20
+ async del(...keys) {
21
+ let count = 0;
22
+ for (const key of keys) {
23
+ if (this.store.delete(key))
24
+ count++;
25
+ this.sets.delete(key);
26
+ this.ttls.delete(key);
27
+ }
28
+ return count;
29
+ }
30
+ async sadd(key, ...members) {
31
+ if (!this.sets.has(key))
32
+ this.sets.set(key, new Set());
33
+ const set = this.sets.get(key);
34
+ let added = 0;
35
+ for (const m of members) {
36
+ if (!set.has(m)) {
37
+ set.add(m);
38
+ added++;
39
+ }
40
+ }
41
+ return added;
42
+ }
43
+ async srem(key, ...members) {
44
+ const set = this.sets.get(key);
45
+ if (!set)
46
+ return 0;
47
+ let removed = 0;
48
+ for (const m of members) {
49
+ if (set.delete(m))
50
+ removed++;
51
+ }
52
+ return removed;
53
+ }
54
+ async smembers(key) {
55
+ const set = this.sets.get(key);
56
+ return set ? Array.from(set) : [];
57
+ }
58
+ async expire(_key, _seconds) {
59
+ return 1;
60
+ }
61
+ /** Helper: clear all data between tests */
62
+ clear() {
63
+ this.store.clear();
64
+ this.sets.clear();
65
+ this.ttls.clear();
66
+ }
67
+ }
68
+ exports.RedisMock = RedisMock;
69
+ //# sourceMappingURL=redis-mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-mock.js","sourceRoot":"","sources":["../../../src/__tests__/helpers/redis-mock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=jwt.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/jwt.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const vitest_1 = require("vitest");
7
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
8
+ const jwt_1 = require("../jwt");
9
+ const TEST_CONFIG = {
10
+ jwtSecret: 'test-access-secret-key-for-testing',
11
+ jwtRefreshSecret: 'test-refresh-secret-key-for-testing',
12
+ };
13
+ const TEST_PAYLOAD = {
14
+ userId: 'user-123',
15
+ email: 'test@example.com',
16
+ role: 'user',
17
+ subscriptionTier: 'pro',
18
+ };
19
+ (0, vitest_1.describe)('jwt', () => {
20
+ (0, vitest_1.describe)('signAccessToken', () => {
21
+ (0, vitest_1.it)('should sign a valid JWT with correct expiry', () => {
22
+ const token = (0, jwt_1.signAccessToken)(TEST_PAYLOAD, TEST_CONFIG);
23
+ (0, vitest_1.expect)(token).toBeDefined();
24
+ (0, vitest_1.expect)(typeof token).toBe('string');
25
+ const decoded = jsonwebtoken_1.default.decode(token);
26
+ (0, vitest_1.expect)(decoded.exp).toBeDefined();
27
+ // Default expiry is 15 minutes (900s)
28
+ const expectedExpiry = decoded.iat + 900;
29
+ (0, vitest_1.expect)(decoded.exp).toBe(expectedExpiry);
30
+ });
31
+ (0, vitest_1.it)('should include userId, email, role in payload', () => {
32
+ const token = (0, jwt_1.signAccessToken)(TEST_PAYLOAD, TEST_CONFIG);
33
+ const decoded = jsonwebtoken_1.default.decode(token);
34
+ (0, vitest_1.expect)(decoded.userId).toBe('user-123');
35
+ (0, vitest_1.expect)(decoded.email).toBe('test@example.com');
36
+ (0, vitest_1.expect)(decoded.role).toBe('user');
37
+ (0, vitest_1.expect)(decoded.subscriptionTier).toBe('pro');
38
+ });
39
+ (0, vitest_1.it)('should use custom expiry when configured', () => {
40
+ const config = {
41
+ ...TEST_CONFIG,
42
+ jwtExpiresIn: '1h',
43
+ };
44
+ const token = (0, jwt_1.signAccessToken)(TEST_PAYLOAD, config);
45
+ const decoded = jsonwebtoken_1.default.decode(token);
46
+ // 1 hour = 3600 seconds
47
+ const expectedExpiry = decoded.iat + 3600;
48
+ (0, vitest_1.expect)(decoded.exp).toBe(expectedExpiry);
49
+ });
50
+ });
51
+ (0, vitest_1.describe)('verifyAccessToken', () => {
52
+ (0, vitest_1.it)('should verify and return payload for valid token', () => {
53
+ const token = (0, jwt_1.signAccessToken)(TEST_PAYLOAD, TEST_CONFIG);
54
+ const result = (0, jwt_1.verifyAccessToken)(token, TEST_CONFIG);
55
+ (0, vitest_1.expect)(result.userId).toBe('user-123');
56
+ (0, vitest_1.expect)(result.email).toBe('test@example.com');
57
+ (0, vitest_1.expect)(result.role).toBe('user');
58
+ (0, vitest_1.expect)(result.subscriptionTier).toBe('pro');
59
+ });
60
+ (0, vitest_1.it)('should throw for expired token', () => {
61
+ const expiredToken = jsonwebtoken_1.default.sign(TEST_PAYLOAD, TEST_CONFIG.jwtSecret, {
62
+ expiresIn: -10, // already expired
63
+ });
64
+ (0, vitest_1.expect)(() => (0, jwt_1.verifyAccessToken)(expiredToken, TEST_CONFIG)).toThrow();
65
+ });
66
+ (0, vitest_1.it)('should throw for invalid signature', () => {
67
+ const token = jsonwebtoken_1.default.sign(TEST_PAYLOAD, 'wrong-secret', {
68
+ expiresIn: 900,
69
+ });
70
+ (0, vitest_1.expect)(() => (0, jwt_1.verifyAccessToken)(token, TEST_CONFIG)).toThrow();
71
+ });
72
+ (0, vitest_1.it)('should throw for malformed token', () => {
73
+ (0, vitest_1.expect)(() => (0, jwt_1.verifyAccessToken)('not-a-jwt', TEST_CONFIG)).toThrow();
74
+ });
75
+ });
76
+ (0, vitest_1.describe)('signRefreshToken / verifyRefreshToken', () => {
77
+ (0, vitest_1.it)('should sign with refresh secret', () => {
78
+ const token = (0, jwt_1.signRefreshToken)(TEST_PAYLOAD, TEST_CONFIG);
79
+ const result = (0, jwt_1.verifyRefreshToken)(token, TEST_CONFIG);
80
+ (0, vitest_1.expect)(result.userId).toBe('user-123');
81
+ (0, vitest_1.expect)(result.email).toBe('test@example.com');
82
+ });
83
+ (0, vitest_1.it)('should reject access token verified with refresh secret', () => {
84
+ const accessToken = (0, jwt_1.signAccessToken)(TEST_PAYLOAD, TEST_CONFIG);
85
+ (0, vitest_1.expect)(() => (0, jwt_1.verifyRefreshToken)(accessToken, TEST_CONFIG)).toThrow();
86
+ });
87
+ });
88
+ (0, vitest_1.describe)('signRememberMeToken', () => {
89
+ (0, vitest_1.it)('should have 30d expiry', () => {
90
+ const token = (0, jwt_1.signRememberMeToken)(TEST_PAYLOAD, TEST_CONFIG);
91
+ const decoded = jsonwebtoken_1.default.decode(token);
92
+ // 30 days = 2592000 seconds
93
+ const expectedExpiry = decoded.iat + 30 * 24 * 60 * 60;
94
+ (0, vitest_1.expect)(decoded.exp).toBe(expectedExpiry);
95
+ });
96
+ });
97
+ });
98
+ //# sourceMappingURL=jwt.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.test.js","sourceRoot":"","sources":["../../src/__tests__/jwt.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=middleware.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/middleware.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const express_mock_1 = require("./helpers/express-mock");
5
+ const middleware_1 = require("../middleware");
6
+ const jwt_1 = require("../jwt");
7
+ const TEST_CONFIG = {
8
+ jwtSecret: 'test-middleware-secret',
9
+ jwtRefreshSecret: 'test-middleware-refresh-secret',
10
+ };
11
+ const TEST_PAYLOAD = {
12
+ userId: 'user-789',
13
+ email: 'mw@example.com',
14
+ role: 'admin',
15
+ subscriptionTier: 'enterprise',
16
+ };
17
+ (0, vitest_1.describe)('authenticateToken', () => {
18
+ const middleware = (0, middleware_1.authenticateToken)(TEST_CONFIG);
19
+ (0, vitest_1.it)('should call next() with valid Bearer token', () => {
20
+ const token = (0, jwt_1.signAccessToken)(TEST_PAYLOAD, TEST_CONFIG);
21
+ const req = (0, express_mock_1.createMockReq)({
22
+ headers: { authorization: `Bearer ${token}` },
23
+ });
24
+ const res = (0, express_mock_1.createMockRes)();
25
+ const next = (0, express_mock_1.createMockNext)();
26
+ middleware(req, res, next);
27
+ (0, vitest_1.expect)(next).toHaveBeenCalled();
28
+ (0, vitest_1.expect)(res.status).not.toHaveBeenCalled();
29
+ });
30
+ (0, vitest_1.it)('should set req.authUser with payload', () => {
31
+ const token = (0, jwt_1.signAccessToken)(TEST_PAYLOAD, TEST_CONFIG);
32
+ const req = (0, express_mock_1.createMockReq)({
33
+ headers: { authorization: `Bearer ${token}` },
34
+ });
35
+ const res = (0, express_mock_1.createMockRes)();
36
+ const next = (0, express_mock_1.createMockNext)();
37
+ middleware(req, res, next);
38
+ (0, vitest_1.expect)(req.authUser).toBeDefined();
39
+ (0, vitest_1.expect)(req.authUser.userId).toBe('user-789');
40
+ (0, vitest_1.expect)(req.authUser.email).toBe('mw@example.com');
41
+ (0, vitest_1.expect)(req.authUser.role).toBe('admin');
42
+ });
43
+ (0, vitest_1.it)('should return 401 for missing Authorization header', () => {
44
+ const req = (0, express_mock_1.createMockReq)({ headers: {} });
45
+ const res = (0, express_mock_1.createMockRes)();
46
+ const next = (0, express_mock_1.createMockNext)();
47
+ middleware(req, res, next);
48
+ (0, vitest_1.expect)(res.status).toHaveBeenCalledWith(401);
49
+ (0, vitest_1.expect)(res.json).toHaveBeenCalledWith(vitest_1.expect.objectContaining({ error: vitest_1.expect.any(String) }));
50
+ (0, vitest_1.expect)(next).not.toHaveBeenCalled();
51
+ });
52
+ (0, vitest_1.it)('should return 401 for invalid token', () => {
53
+ const req = (0, express_mock_1.createMockReq)({
54
+ headers: { authorization: 'Bearer invalid-token-here' },
55
+ });
56
+ const res = (0, express_mock_1.createMockRes)();
57
+ const next = (0, express_mock_1.createMockNext)();
58
+ middleware(req, res, next);
59
+ (0, vitest_1.expect)(res.status).toHaveBeenCalledWith(401);
60
+ (0, vitest_1.expect)(next).not.toHaveBeenCalled();
61
+ });
62
+ (0, vitest_1.it)('should return 401 for Authorization header without Bearer prefix', () => {
63
+ const token = (0, jwt_1.signAccessToken)(TEST_PAYLOAD, TEST_CONFIG);
64
+ const req = (0, express_mock_1.createMockReq)({
65
+ headers: { authorization: token },
66
+ });
67
+ const res = (0, express_mock_1.createMockRes)();
68
+ const next = (0, express_mock_1.createMockNext)();
69
+ middleware(req, res, next);
70
+ (0, vitest_1.expect)(res.status).toHaveBeenCalledWith(401);
71
+ (0, vitest_1.expect)(next).not.toHaveBeenCalled();
72
+ });
73
+ });
74
+ (0, vitest_1.describe)('requireApiKey', () => {
75
+ const mockApiKey = {
76
+ id: 'key-1',
77
+ key: 'ek_hashed',
78
+ userId: 'user-1',
79
+ productSlug: 'portal',
80
+ scopes: ['read', 'write'],
81
+ expiresAt: null,
82
+ lastUsedAt: null,
83
+ createdAt: new Date(),
84
+ };
85
+ (0, vitest_1.it)('should call next() when X-API-Key is valid', async () => {
86
+ const validateKey = vitest_1.vi.fn().mockResolvedValue(mockApiKey);
87
+ const middleware = (0, middleware_1.requireApiKey)(validateKey);
88
+ const req = (0, express_mock_1.createMockReq)({
89
+ headers: { 'x-api-key': 'ek_some_key' },
90
+ });
91
+ const res = (0, express_mock_1.createMockRes)();
92
+ const next = (0, express_mock_1.createMockNext)();
93
+ await middleware(req, res, next);
94
+ (0, vitest_1.expect)(validateKey).toHaveBeenCalledWith('ek_some_key');
95
+ (0, vitest_1.expect)(next).toHaveBeenCalled();
96
+ (0, vitest_1.expect)(req.apiKey).toEqual(mockApiKey);
97
+ });
98
+ (0, vitest_1.it)('should return 401 when no API key provided', async () => {
99
+ const validateKey = vitest_1.vi.fn();
100
+ const middleware = (0, middleware_1.requireApiKey)(validateKey);
101
+ const req = (0, express_mock_1.createMockReq)({ headers: {} });
102
+ const res = (0, express_mock_1.createMockRes)();
103
+ const next = (0, express_mock_1.createMockNext)();
104
+ await middleware(req, res, next);
105
+ (0, vitest_1.expect)(res.status).toHaveBeenCalledWith(401);
106
+ (0, vitest_1.expect)(next).not.toHaveBeenCalled();
107
+ });
108
+ (0, vitest_1.it)('should return 401 when API key validation fails', async () => {
109
+ const validateKey = vitest_1.vi.fn().mockResolvedValue(null);
110
+ const middleware = (0, middleware_1.requireApiKey)(validateKey);
111
+ const req = (0, express_mock_1.createMockReq)({
112
+ headers: { 'x-api-key': 'ek_invalid' },
113
+ });
114
+ const res = (0, express_mock_1.createMockRes)();
115
+ const next = (0, express_mock_1.createMockNext)();
116
+ await middleware(req, res, next);
117
+ (0, vitest_1.expect)(res.status).toHaveBeenCalledWith(401);
118
+ (0, vitest_1.expect)(next).not.toHaveBeenCalled();
119
+ });
120
+ (0, vitest_1.it)('should return 401 for expired API key', async () => {
121
+ const expiredKey = {
122
+ ...mockApiKey,
123
+ expiresAt: new Date('2020-01-01'),
124
+ };
125
+ const validateKey = vitest_1.vi.fn().mockResolvedValue(expiredKey);
126
+ const middleware = (0, middleware_1.requireApiKey)(validateKey);
127
+ const req = (0, express_mock_1.createMockReq)({
128
+ headers: { 'x-api-key': 'ek_expired' },
129
+ });
130
+ const res = (0, express_mock_1.createMockRes)();
131
+ const next = (0, express_mock_1.createMockNext)();
132
+ await middleware(req, res, next);
133
+ (0, vitest_1.expect)(res.status).toHaveBeenCalledWith(401);
134
+ (0, vitest_1.expect)(next).not.toHaveBeenCalled();
135
+ });
136
+ });
137
+ (0, vitest_1.describe)('requireRole', () => {
138
+ (0, vitest_1.it)('should allow matching role', () => {
139
+ const middleware = (0, middleware_1.requireRole)('admin');
140
+ const req = (0, express_mock_1.createMockReq)({ authUser: { role: 'admin' } });
141
+ const res = (0, express_mock_1.createMockRes)();
142
+ const next = (0, express_mock_1.createMockNext)();
143
+ middleware(req, res, next);
144
+ (0, vitest_1.expect)(next).toHaveBeenCalled();
145
+ });
146
+ (0, vitest_1.it)('should reject non-matching role', () => {
147
+ const middleware = (0, middleware_1.requireRole)('admin');
148
+ const req = (0, express_mock_1.createMockReq)({ authUser: { role: 'user' } });
149
+ const res = (0, express_mock_1.createMockRes)();
150
+ const next = (0, express_mock_1.createMockNext)();
151
+ middleware(req, res, next);
152
+ (0, vitest_1.expect)(res.status).toHaveBeenCalledWith(403);
153
+ (0, vitest_1.expect)(next).not.toHaveBeenCalled();
154
+ });
155
+ (0, vitest_1.it)('should accept any of multiple allowed roles', () => {
156
+ const middleware = (0, middleware_1.requireRole)('admin', 'moderator');
157
+ const req = (0, express_mock_1.createMockReq)({ authUser: { role: 'moderator' } });
158
+ const res = (0, express_mock_1.createMockRes)();
159
+ const next = (0, express_mock_1.createMockNext)();
160
+ middleware(req, res, next);
161
+ (0, vitest_1.expect)(next).toHaveBeenCalled();
162
+ });
163
+ (0, vitest_1.it)('should return 401 when no authUser is present', () => {
164
+ const middleware = (0, middleware_1.requireRole)('admin');
165
+ const req = (0, express_mock_1.createMockReq)({});
166
+ const res = (0, express_mock_1.createMockRes)();
167
+ const next = (0, express_mock_1.createMockNext)();
168
+ middleware(req, res, next);
169
+ (0, vitest_1.expect)(res.status).toHaveBeenCalledWith(401);
170
+ (0, vitest_1.expect)(next).not.toHaveBeenCalled();
171
+ });
172
+ });
173
+ //# sourceMappingURL=middleware.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.test.js","sourceRoot":"","sources":["../../src/__tests__/middleware.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/session.test.ts"],"names":[],"mappings":""}