@aiconnect/confidant 1.0.0 → 1.0.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiconnect/confidant",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Secure secret handoff system with time-limited access",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -17,6 +17,7 @@
17
17
  },
18
18
  "files": [
19
19
  "dist",
20
+ "!dist/**/*.test.*",
20
21
  "public",
21
22
  "README.md"
22
23
  ],
@@ -27,7 +28,14 @@
27
28
  "test": "vitest",
28
29
  "test:ui": "vitest --ui",
29
30
  "test:run": "vitest run",
30
- "prepublishOnly": "npm run build"
31
+ "prepublishOnly": "npm run build",
32
+ "preversion": "npm run test:run",
33
+ "version": "npm run build",
34
+ "postversion": "git push && git push --tags",
35
+ "release:patch": "npm version patch",
36
+ "release:minor": "npm version minor",
37
+ "release:major": "npm version major",
38
+ "publish:npm": "npm publish --access public"
31
39
  },
32
40
  "keywords": [
33
41
  "secret",
@@ -1,5 +0,0 @@
1
- /**
2
- * Tests for crypto utilities
3
- */
4
- export {};
5
- //# sourceMappingURL=crypto.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"crypto.test.d.ts","sourceRoot":"","sources":["../src/crypto.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,77 +0,0 @@
1
- /**
2
- * Tests for crypto utilities
3
- */
4
- import { describe, it, expect } from 'vitest';
5
- import { generateHash, encryptSecret, decryptSecret, generateUUID } from './crypto.js';
6
- describe('crypto', () => {
7
- describe('generateHash', () => {
8
- it('should generate a 64-character hex string', () => {
9
- const hash = generateHash();
10
- expect(hash).toHaveLength(64);
11
- expect(hash).toMatch(/^[a-f0-9]{64}$/);
12
- });
13
- it('should generate unique hashes', () => {
14
- const hash1 = generateHash();
15
- const hash2 = generateHash();
16
- expect(hash1).not.toBe(hash2);
17
- });
18
- });
19
- describe('encryptSecret and decryptSecret', () => {
20
- it('should encrypt and decrypt a secret correctly', () => {
21
- const secret = 'my-secret-password';
22
- const hash = generateHash();
23
- const encrypted = encryptSecret(secret, hash);
24
- const decrypted = decryptSecret(encrypted, hash);
25
- expect(decrypted).toBe(secret);
26
- });
27
- it('should produce different encrypted values for the same secret with different hashes', () => {
28
- const secret = 'my-secret-password';
29
- const hash1 = generateHash();
30
- const hash2 = generateHash();
31
- const encrypted1 = encryptSecret(secret, hash1);
32
- const encrypted2 = encryptSecret(secret, hash2);
33
- expect(encrypted1).not.toBe(encrypted2);
34
- });
35
- it('should encrypt multi-line secrets', () => {
36
- const secret = 'line1\nline2\nline3';
37
- const hash = generateHash();
38
- const encrypted = encryptSecret(secret, hash);
39
- const decrypted = decryptSecret(encrypted, hash);
40
- expect(decrypted).toBe(secret);
41
- });
42
- it('should encrypt special characters', () => {
43
- const secret = '!@#$%^&*()_+-=[]{}|;:,.<>?';
44
- const hash = generateHash();
45
- const encrypted = encryptSecret(secret, hash);
46
- const decrypted = decryptSecret(encrypted, hash);
47
- expect(decrypted).toBe(secret);
48
- });
49
- it('should throw error when decrypting with wrong hash', () => {
50
- const secret = 'my-secret-password';
51
- const hash1 = generateHash();
52
- const hash2 = generateHash();
53
- const encrypted = encryptSecret(secret, hash1);
54
- expect(() => {
55
- decryptSecret(encrypted, hash2);
56
- }).toThrow();
57
- });
58
- it('should throw error when decrypting invalid format', () => {
59
- const hash = generateHash();
60
- expect(() => {
61
- decryptSecret('invalid-format', hash);
62
- }).toThrow();
63
- });
64
- });
65
- describe('generateUUID', () => {
66
- it('should generate a valid UUID v4 format', () => {
67
- const uuid = generateUUID();
68
- expect(uuid).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i);
69
- });
70
- it('should generate unique UUIDs', () => {
71
- const uuid1 = generateUUID();
72
- const uuid2 = generateUUID();
73
- expect(uuid1).not.toBe(uuid2);
74
- });
75
- });
76
- });
77
- //# sourceMappingURL=crypto.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"crypto.test.js","sourceRoot":"","sources":["../src/crypto.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=network-detection.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"network-detection.test.d.ts","sourceRoot":"","sources":["../src/network-detection.test.ts"],"names":[],"mappings":""}
@@ -1,150 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
- import * as os from 'os';
3
- import { isPrivateIp, detectLocalIp } from './network-detection.js';
4
- // Mock the os module
5
- vi.mock('os', () => ({
6
- networkInterfaces: vi.fn(),
7
- }));
8
- describe('network detection', () => {
9
- beforeEach(() => {
10
- vi.clearAllMocks();
11
- });
12
- afterEach(() => {
13
- vi.restoreAllMocks();
14
- });
15
- describe('isPrivateIp', () => {
16
- it('should return true for 10.x.x.x addresses', () => {
17
- expect(isPrivateIp('10.0.0.1')).toBe(true);
18
- expect(isPrivateIp('10.255.255.255')).toBe(true);
19
- expect(isPrivateIp('10.128.64.32')).toBe(true);
20
- });
21
- it('should return true for 172.16.x.x to 172.31.x.x addresses', () => {
22
- expect(isPrivateIp('172.16.0.1')).toBe(true);
23
- expect(isPrivateIp('172.31.255.255')).toBe(true);
24
- expect(isPrivateIp('172.20.128.64')).toBe(true);
25
- });
26
- it('should return false for 172.15.x.x addresses', () => {
27
- expect(isPrivateIp('172.15.255.255')).toBe(false);
28
- });
29
- it('should return false for 172.32.x.x addresses', () => {
30
- expect(isPrivateIp('172.32.0.1')).toBe(false);
31
- });
32
- it('should return true for 192.168.x.x addresses', () => {
33
- expect(isPrivateIp('192.168.0.1')).toBe(true);
34
- expect(isPrivateIp('192.168.255.255')).toBe(true);
35
- expect(isPrivateIp('192.168.128.64')).toBe(true);
36
- });
37
- it('should return false for public IP addresses', () => {
38
- expect(isPrivateIp('8.8.8.8')).toBe(false);
39
- expect(isPrivateIp('1.1.1.1')).toBe(false);
40
- expect(isPrivateIp('172.32.0.1')).toBe(false);
41
- expect(isPrivateIp('192.169.0.1')).toBe(false);
42
- });
43
- it('should return false for invalid IP addresses', () => {
44
- expect(isPrivateIp('')).toBe(false);
45
- expect(isPrivateIp('invalid')).toBe(false);
46
- expect(isPrivateIp('192.168')).toBe(false);
47
- expect(isPrivateIp('192.168.1.1.1')).toBe(false);
48
- expect(isPrivateIp('256.168.1.1')).toBe(false);
49
- });
50
- });
51
- describe('detectLocalIp', () => {
52
- it('should return first private IP address found', () => {
53
- const mockInterfaces = [
54
- { address: '192.168.1.100', netmask: '255.255.255.0', family: 'IPv4', mac: '00:00:00:00:00:00', internal: false, cidr: '192.168.1.100/24' },
55
- { address: '10.0.0.1', netmask: '255.0.0.0', family: 'IPv4', mac: '00:00:00:00:00:01', internal: false, cidr: '10.0.0.1/8' },
56
- ];
57
- vi.mocked(os.networkInterfaces).mockReturnValue({
58
- 'eth0': mockInterfaces,
59
- });
60
- const result = detectLocalIp();
61
- expect(result).toBe('192.168.1.100');
62
- });
63
- it('should skip internal addresses', () => {
64
- const mockInterfaces = [
65
- { address: '127.0.0.1', netmask: '255.0.0.0', family: 'IPv4', mac: '00:00:00:00:00:00', internal: true, cidr: '127.0.0.1/8' },
66
- { address: '192.168.1.100', netmask: '255.255.255.0', family: 'IPv4', mac: '00:00:00:00:00:01', internal: false, cidr: '192.168.1.100/24' },
67
- ];
68
- vi.mocked(os.networkInterfaces).mockReturnValue({
69
- 'lo': [mockInterfaces[0]],
70
- 'eth0': [mockInterfaces[1]],
71
- });
72
- const result = detectLocalIp();
73
- expect(result).toBe('192.168.1.100');
74
- });
75
- it('should skip IPv6 addresses', () => {
76
- const mockInterfaces = [
77
- { address: 'fe80::1', netmask: 'ffff:ffff:ffff:ffff::', family: 'IPv6', mac: '00:00:00:00:00:00', internal: false, cidr: 'fe80::1/64', scopeid: 1 },
78
- { address: '192.168.1.100', netmask: '255.255.255.0', family: 'IPv4', mac: '00:00:00:00:00:01', internal: false, cidr: '192.168.1.100/24' },
79
- ];
80
- vi.mocked(os.networkInterfaces).mockReturnValue({
81
- 'eth0': mockInterfaces,
82
- });
83
- const result = detectLocalIp();
84
- expect(result).toBe('192.168.1.100');
85
- });
86
- it('should skip public IP addresses', () => {
87
- const mockInterfaces = [
88
- { address: '8.8.8.8', netmask: '255.255.255.0', family: 'IPv4', mac: '00:00:00:00:00:00', internal: false, cidr: '8.8.8.8/24' },
89
- { address: '192.168.1.100', netmask: '255.255.255.0', family: 'IPv4', mac: '00:00:00:00:00:01', internal: false, cidr: '192.168.1.100/24' },
90
- ];
91
- vi.mocked(os.networkInterfaces).mockReturnValue({
92
- 'eth0': mockInterfaces,
93
- });
94
- const result = detectLocalIp();
95
- expect(result).toBe('192.168.1.100');
96
- });
97
- it('should return null when no private IP is found', () => {
98
- const mockInterfaces = [
99
- { address: '8.8.8.8', netmask: '255.255.255.0', family: 'IPv4', mac: '00:00:00:00:00:00', internal: false, cidr: '8.8.8.8/24' },
100
- { address: '127.0.0.1', netmask: '255.0.0.0', family: 'IPv4', mac: '00:00:00:00:00:01', internal: true, cidr: '127.0.0.1/8' },
101
- ];
102
- vi.mocked(os.networkInterfaces).mockReturnValue({
103
- 'eth0': [mockInterfaces[0]],
104
- 'lo': [mockInterfaces[1]],
105
- });
106
- const result = detectLocalIp();
107
- expect(result).toBeNull();
108
- });
109
- it('should return null when networkInterfaces returns empty object', () => {
110
- vi.mocked(os.networkInterfaces).mockReturnValue({});
111
- const result = detectLocalIp();
112
- expect(result).toBeNull();
113
- });
114
- it('should return null when networkInterfaces throws error', () => {
115
- vi.mocked(os.networkInterfaces).mockImplementation(() => {
116
- throw new Error('Network error');
117
- });
118
- const result = detectLocalIp();
119
- expect(result).toBeNull();
120
- });
121
- it('should handle multiple network interfaces', () => {
122
- const mockInterfaces = {
123
- 'eth0': [
124
- { address: '8.8.8.8', netmask: '255.255.255.0', family: 'IPv4', mac: '00:00:00:00:00:00', internal: false, cidr: '8.8.8.8/24' },
125
- ],
126
- 'wlan0': [
127
- { address: '192.168.1.100', netmask: '255.255.255.0', family: 'IPv4', mac: '00:00:00:00:00:01', internal: false, cidr: '192.168.1.100/24' },
128
- ],
129
- 'lo': [
130
- { address: '127.0.0.1', netmask: '255.0.0.0', family: 'IPv4', mac: '00:00:00:00:00:02', internal: true, cidr: '127.0.0.1/8' },
131
- ],
132
- };
133
- vi.mocked(os.networkInterfaces).mockReturnValue(mockInterfaces);
134
- const result = detectLocalIp();
135
- expect(result).toBe('192.168.1.100');
136
- });
137
- it('should prefer 10.x.x.x over 192.168.x.x when both present', () => {
138
- const mockInterfaces = [
139
- { address: '192.168.1.100', netmask: '255.255.255.0', family: 'IPv4', mac: '00:00:00:00:00:00', internal: false, cidr: '192.168.1.100/24' },
140
- { address: '10.0.0.1', netmask: '255.0.0.0', family: 'IPv4', mac: '00:00:00:00:00:01', internal: false, cidr: '10.0.0.1/8' },
141
- ];
142
- vi.mocked(os.networkInterfaces).mockReturnValue({
143
- 'eth0': mockInterfaces,
144
- });
145
- const result = detectLocalIp();
146
- expect(result).toBe('192.168.1.100'); // First one found
147
- });
148
- });
149
- });
150
- //# sourceMappingURL=network-detection.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"network-detection.test.js","sourceRoot":"","sources":["../src/network-detection.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Tests for rate limiter
3
- */
4
- export {};
5
- //# sourceMappingURL=rate-limiter.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rate-limiter.test.d.ts","sourceRoot":"","sources":["../src/rate-limiter.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,130 +0,0 @@
1
- /**
2
- * Tests for rate limiter
3
- */
4
- import { describe, it, expect, beforeEach } from 'vitest';
5
- import { RateLimiter } from './rate-limiter.js';
6
- describe('RateLimiter', () => {
7
- let rateLimiter;
8
- beforeEach(() => {
9
- rateLimiter = new RateLimiter({
10
- maxRequests: 5,
11
- windowMs: 1000
12
- });
13
- });
14
- describe('check', () => {
15
- it('should allow requests within the limit', () => {
16
- const result1 = rateLimiter.check('127.0.0.1');
17
- const result2 = rateLimiter.check('127.0.0.1');
18
- const result3 = rateLimiter.check('127.0.0.1');
19
- expect(result1.allowed).toBe(true);
20
- expect(result1.remaining).toBe(4);
21
- expect(result2.allowed).toBe(true);
22
- expect(result2.remaining).toBe(3);
23
- expect(result3.allowed).toBe(true);
24
- expect(result3.remaining).toBe(2);
25
- });
26
- it('should block requests exceeding the limit', () => {
27
- // Make 5 requests (within limit)
28
- for (let i = 0; i < 5; i++) {
29
- const result = rateLimiter.check('127.0.0.1');
30
- expect(result.allowed).toBe(true);
31
- }
32
- // 6th request should be blocked
33
- const result = rateLimiter.check('127.0.0.1');
34
- expect(result.allowed).toBe(false);
35
- expect(result.remaining).toBe(0);
36
- });
37
- it('should track requests separately for different IPs', () => {
38
- // Make 5 requests from IP1
39
- for (let i = 0; i < 5; i++) {
40
- rateLimiter.check('127.0.0.1');
41
- }
42
- // IP1 should be blocked
43
- const result1 = rateLimiter.check('127.0.0.1');
44
- expect(result1.allowed).toBe(false);
45
- // IP2 should still be allowed
46
- const result2 = rateLimiter.check('192.168.1.1');
47
- expect(result2.allowed).toBe(true);
48
- });
49
- it('should reset the window after it expires', async () => {
50
- // Make 5 requests (within limit)
51
- for (let i = 0; i < 5; i++) {
52
- rateLimiter.check('127.0.0.1');
53
- }
54
- // 6th request should be blocked
55
- let result = rateLimiter.check('127.0.0.1');
56
- expect(result.allowed).toBe(false);
57
- // Wait for window to expire
58
- await new Promise(resolve => setTimeout(resolve, 1100));
59
- // Should be allowed again
60
- result = rateLimiter.check('127.0.0.1');
61
- expect(result.allowed).toBe(true);
62
- expect(result.remaining).toBe(4);
63
- });
64
- it('should provide correct reset time', () => {
65
- const result = rateLimiter.check('127.0.0.1');
66
- const now = Date.now();
67
- expect(result.resetTime).toBeGreaterThan(now);
68
- expect(result.resetTime).toBeLessThanOrEqual(now + 1000);
69
- });
70
- });
71
- describe('reset', () => {
72
- it('should reset the rate limit for a specific IP', () => {
73
- // Make 5 requests (within limit)
74
- for (let i = 0; i < 5; i++) {
75
- rateLimiter.check('127.0.0.1');
76
- }
77
- // 6th request should be blocked
78
- let result = rateLimiter.check('127.0.0.1');
79
- expect(result.allowed).toBe(false);
80
- // Reset the IP
81
- rateLimiter.reset('127.0.0.1');
82
- // Should be allowed again
83
- result = rateLimiter.check('127.0.0.1');
84
- expect(result.allowed).toBe(true);
85
- });
86
- });
87
- describe('cleanup', () => {
88
- it('should remove old records', async () => {
89
- // Make requests from two IPs
90
- rateLimiter.check('127.0.0.1');
91
- rateLimiter.check('192.168.1.1');
92
- // Wait for records to become old
93
- await new Promise(resolve => setTimeout(resolve, 100));
94
- // Cleanup with max age of 50ms
95
- rateLimiter.cleanup(50);
96
- // Both records should be removed (old enough)
97
- const status1 = rateLimiter.getStatus('127.0.0.1');
98
- const status2 = rateLimiter.getStatus('192.168.1.1');
99
- expect(status1.remaining).toBe(5); // Reset to full limit
100
- expect(status2.remaining).toBe(5); // Reset to full limit
101
- });
102
- });
103
- describe('getStatus', () => {
104
- it('should return status without incrementing count', () => {
105
- const status1 = rateLimiter.getStatus('127.0.0.1');
106
- expect(status1.allowed).toBe(true);
107
- expect(status1.remaining).toBe(5);
108
- const status2 = rateLimiter.getStatus('127.0.0.1');
109
- expect(status2.allowed).toBe(true);
110
- expect(status2.remaining).toBe(5); // Still 5, not decremented
111
- });
112
- it('should return correct status for IPs that have made requests', () => {
113
- rateLimiter.check('127.0.0.1');
114
- rateLimiter.check('127.0.0.1');
115
- const status = rateLimiter.getStatus('127.0.0.1');
116
- expect(status.allowed).toBe(true);
117
- expect(status.remaining).toBe(3);
118
- });
119
- it('should return not allowed for IPs that have exceeded the limit', () => {
120
- // Make 5 requests (within limit)
121
- for (let i = 0; i < 5; i++) {
122
- rateLimiter.check('127.0.0.1');
123
- }
124
- const status = rateLimiter.getStatus('127.0.0.1');
125
- expect(status.allowed).toBe(false);
126
- expect(status.remaining).toBe(0);
127
- });
128
- });
129
- });
130
- //# sourceMappingURL=rate-limiter.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rate-limiter.test.js","sourceRoot":"","sources":["../src/rate-limiter.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAM,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,WAAwB,CAAC;IAE7B,UAAU,CAAC,GAAG,EAAE;QACd,WAAW,GAAG,IAAI,WAAW,CAAC;YAC5B,WAAW,EAAE,CAAC;YACd,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAE/C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAElC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAElC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,iCAAiC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC;YAED,gCAAgC;YAChC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,2BAA2B;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;YAED,wBAAwB;YACxB,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEpC,8BAA8B;YAC9B,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACjD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,iCAAiC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;YAED,gCAAgC;YAChC,IAAI,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEnC,4BAA4B;YAC5B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAExD,0BAA0B;YAC1B,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEvB,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,mBAAmB,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,iCAAiC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;YAED,gCAAgC;YAChC,IAAI,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEnC,eAAe;YACf,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAE/B,0BAA0B;YAC1B,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YACzC,6BAA6B;YAC7B,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/B,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAEjC,iCAAiC;YACjC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAEvD,+BAA+B;YAC/B,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAExB,8CAA8C;YAC9C,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAErD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB;YACzD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACnD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAElC,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACnD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,2BAA2B;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;YACtE,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/B,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAE/B,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACxE,iCAAiC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;YAED,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,13 +0,0 @@
1
- /**
2
- * Registry System Tests
3
- *
4
- * Tests for the generic registry system including:
5
- * - Basic registry operations
6
- * - Register/unregister functionality
7
- * - Get/has/list methods
8
- * - Lifecycle hooks (init/destroy)
9
- * - Error handling
10
- * - Typed registry instances
11
- */
12
- export {};
13
- //# sourceMappingURL=registry.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.test.d.ts","sourceRoot":"","sources":["../src/registry.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}