@aiconnect/confidant 1.0.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.
- package/README.md +570 -0
- package/dist/api-client.d.ts +58 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +101 -0
- package/dist/api-client.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +69 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/create.d.ts +3 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +51 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/delete.d.ts +3 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +29 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/get-request.d.ts +3 -0
- package/dist/commands/get-request.d.ts.map +1 -0
- package/dist/commands/get-request.js +89 -0
- package/dist/commands/get-request.js.map +1 -0
- package/dist/commands/get.d.ts +3 -0
- package/dist/commands/get.d.ts.map +1 -0
- package/dist/commands/get.js +29 -0
- package/dist/commands/get.js.map +1 -0
- package/dist/commands/request.d.ts +3 -0
- package/dist/commands/request.d.ts.map +1 -0
- package/dist/commands/request.js +289 -0
- package/dist/commands/request.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +40 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/crypto.d.ts +32 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +79 -0
- package/dist/crypto.js.map +1 -0
- package/dist/crypto.test.d.ts +5 -0
- package/dist/crypto.test.d.ts.map +1 -0
- package/dist/crypto.test.js +77 -0
- package/dist/crypto.test.js.map +1 -0
- package/dist/i18n.d.ts +55 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +63 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/network-detection.d.ts +11 -0
- package/dist/network-detection.d.ts.map +1 -0
- package/dist/network-detection.js +54 -0
- package/dist/network-detection.js.map +1 -0
- package/dist/network-detection.test.d.ts +2 -0
- package/dist/network-detection.test.d.ts.map +1 -0
- package/dist/network-detection.test.js +150 -0
- package/dist/network-detection.test.js.map +1 -0
- package/dist/rate-limiter.d.ts +61 -0
- package/dist/rate-limiter.d.ts.map +1 -0
- package/dist/rate-limiter.js +128 -0
- package/dist/rate-limiter.js.map +1 -0
- package/dist/rate-limiter.test.d.ts +5 -0
- package/dist/rate-limiter.test.d.ts.map +1 -0
- package/dist/rate-limiter.test.js +130 -0
- package/dist/rate-limiter.test.js.map +1 -0
- package/dist/registry.d.ts +136 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +182 -0
- package/dist/registry.js.map +1 -0
- package/dist/registry.test.d.ts +13 -0
- package/dist/registry.test.d.ts.map +1 -0
- package/dist/registry.test.js +308 -0
- package/dist/registry.test.js.map +1 -0
- package/dist/routes.d.ts +4 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +931 -0
- package/dist/routes.js.map +1 -0
- package/dist/server.d.ts +27 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +79 -0
- package/dist/server.js.map +1 -0
- package/dist/storage.d.ts +150 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +298 -0
- package/dist/storage.js.map +1 -0
- package/dist/storage.test.d.ts +5 -0
- package/dist/storage.test.d.ts.map +1 -0
- package/dist/storage.test.js +466 -0
- package/dist/storage.test.js.map +1 -0
- package/dist/types.d.ts +144 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +56 -0
- package/dist/types.js.map +1 -0
- package/dist/url-helper.d.ts +16 -0
- package/dist/url-helper.d.ts.map +1 -0
- package/dist/url-helper.js +27 -0
- package/dist/url-helper.js.map +1 -0
- package/dist/url-helper.test.d.ts +2 -0
- package/dist/url-helper.test.d.ts.map +1 -0
- package/dist/url-helper.test.js +70 -0
- package/dist/url-helper.test.js.map +1 -0
- package/package.json +73 -0
- package/public/index.html +352 -0
|
@@ -0,0 +1,130 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.test.js","sourceRoot":"","sources":["../src/rate-limiter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modular Registry System
|
|
3
|
+
*
|
|
4
|
+
* A generic, type-safe registry system for managing components/modules.
|
|
5
|
+
* Enables dynamic registration, retrieval, and lifecycle management of modules.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Base Module interface with optional lifecycle hooks
|
|
9
|
+
* All modules must implement this interface to be registered in a registry.
|
|
10
|
+
*/
|
|
11
|
+
export interface Module {
|
|
12
|
+
/** Unique identifier for the module */
|
|
13
|
+
name: string;
|
|
14
|
+
/** Optional initialization hook called when module is registered */
|
|
15
|
+
init?(): Promise<void> | void;
|
|
16
|
+
/** Optional cleanup hook called when module is unregistered */
|
|
17
|
+
destroy?(): Promise<void> | void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Generic Registry class for managing modules
|
|
21
|
+
* @template T - The module type (must extend Module)
|
|
22
|
+
*/
|
|
23
|
+
export declare class Registry<T extends Module> {
|
|
24
|
+
private modules;
|
|
25
|
+
/**
|
|
26
|
+
* Registers a module with the given name
|
|
27
|
+
* @param name - Unique identifier for the module
|
|
28
|
+
* @param module - Module instance to register
|
|
29
|
+
* @throws Error if a module with the same name is already registered
|
|
30
|
+
*/
|
|
31
|
+
register(name: string, module: T): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Unregisters a module by name
|
|
34
|
+
* @param name - Name of the module to unregister
|
|
35
|
+
* @throws Error if module is not found
|
|
36
|
+
*/
|
|
37
|
+
unregister(name: string): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Retrieves a registered module by name
|
|
40
|
+
* @param name - Name of the module to retrieve
|
|
41
|
+
* @returns Module instance if found, undefined otherwise
|
|
42
|
+
*/
|
|
43
|
+
get(name: string): T | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* Checks if a module is registered
|
|
46
|
+
* @param name - Name of the module to check
|
|
47
|
+
* @returns true if module is registered, false otherwise
|
|
48
|
+
*/
|
|
49
|
+
has(name: string): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Returns list of all registered module names
|
|
52
|
+
* @returns Array of module names
|
|
53
|
+
*/
|
|
54
|
+
list(): string[];
|
|
55
|
+
/**
|
|
56
|
+
* Clears all registered modules
|
|
57
|
+
* Calls destroy hook on all modules if present
|
|
58
|
+
*/
|
|
59
|
+
clear(): Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Storage Module interface for storage backends
|
|
63
|
+
*/
|
|
64
|
+
export interface StorageModule extends Module {
|
|
65
|
+
/** Retrieve a value by key */
|
|
66
|
+
get(key: string): Promise<any>;
|
|
67
|
+
/** Set a value with optional TTL */
|
|
68
|
+
set(key: string, value: any, ttl?: number): Promise<void>;
|
|
69
|
+
/** Delete a value by key */
|
|
70
|
+
delete(key: string): Promise<void>;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Validator Module interface for data validation
|
|
74
|
+
*/
|
|
75
|
+
export interface ValidatorModule extends Module {
|
|
76
|
+
/** Validate data and return true if valid */
|
|
77
|
+
validate(data: any): boolean | Promise<boolean>;
|
|
78
|
+
/** Get validation errors */
|
|
79
|
+
getErrors(): string[];
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Transformer Module interface for data transformation
|
|
83
|
+
*/
|
|
84
|
+
export interface TransformerModule extends Module {
|
|
85
|
+
/** Transform data and return the result */
|
|
86
|
+
transform(data: any): any | Promise<any>;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Singleton registry instances for different module types
|
|
90
|
+
*/
|
|
91
|
+
/**
|
|
92
|
+
* Registry for storage modules
|
|
93
|
+
*/
|
|
94
|
+
export declare const storageRegistry: Registry<StorageModule>;
|
|
95
|
+
/**
|
|
96
|
+
* Registry for validator modules
|
|
97
|
+
*/
|
|
98
|
+
export declare const validatorRegistry: Registry<ValidatorModule>;
|
|
99
|
+
/**
|
|
100
|
+
* Registry for transformer modules
|
|
101
|
+
*/
|
|
102
|
+
export declare const transformerRegistry: Registry<TransformerModule>;
|
|
103
|
+
/**
|
|
104
|
+
* Example: Memory Storage Module
|
|
105
|
+
* Simple in-memory storage implementation for demonstration
|
|
106
|
+
*/
|
|
107
|
+
declare class MemoryStorageModuleImpl implements StorageModule {
|
|
108
|
+
name: string;
|
|
109
|
+
private storage;
|
|
110
|
+
init(): Promise<void>;
|
|
111
|
+
destroy(): Promise<void>;
|
|
112
|
+
get(key: string): Promise<any>;
|
|
113
|
+
set(key: string, value: any, ttl?: number): Promise<void>;
|
|
114
|
+
delete(key: string): Promise<void>;
|
|
115
|
+
}
|
|
116
|
+
export declare const MemoryStorageModule: MemoryStorageModuleImpl;
|
|
117
|
+
/**
|
|
118
|
+
* Example: Basic Validator Module
|
|
119
|
+
* Simple validator that checks if data is not empty
|
|
120
|
+
*/
|
|
121
|
+
declare class BasicValidatorModuleImpl implements ValidatorModule {
|
|
122
|
+
name: string;
|
|
123
|
+
private errors;
|
|
124
|
+
init(): Promise<void>;
|
|
125
|
+
destroy(): Promise<void>;
|
|
126
|
+
validate(data: any): boolean;
|
|
127
|
+
getErrors(): string[];
|
|
128
|
+
}
|
|
129
|
+
export declare const BasicValidatorModule: BasicValidatorModuleImpl;
|
|
130
|
+
/**
|
|
131
|
+
* Example: Uppercase Transformer Module
|
|
132
|
+
* Transforms strings to uppercase
|
|
133
|
+
*/
|
|
134
|
+
export declare const UppercaseTransformerModule: TransformerModule;
|
|
135
|
+
export {};
|
|
136
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modular Registry System
|
|
3
|
+
*
|
|
4
|
+
* A generic, type-safe registry system for managing components/modules.
|
|
5
|
+
* Enables dynamic registration, retrieval, and lifecycle management of modules.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Generic Registry class for managing modules
|
|
9
|
+
* @template T - The module type (must extend Module)
|
|
10
|
+
*/
|
|
11
|
+
export class Registry {
|
|
12
|
+
modules = new Map();
|
|
13
|
+
/**
|
|
14
|
+
* Registers a module with the given name
|
|
15
|
+
* @param name - Unique identifier for the module
|
|
16
|
+
* @param module - Module instance to register
|
|
17
|
+
* @throws Error if a module with the same name is already registered
|
|
18
|
+
*/
|
|
19
|
+
async register(name, module) {
|
|
20
|
+
if (this.modules.has(name)) {
|
|
21
|
+
throw new Error(`Module with name '${name}' is already registered`);
|
|
22
|
+
}
|
|
23
|
+
// Call init hook if present
|
|
24
|
+
if (module.init) {
|
|
25
|
+
await module.init();
|
|
26
|
+
}
|
|
27
|
+
this.modules.set(name, module);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Unregisters a module by name
|
|
31
|
+
* @param name - Name of the module to unregister
|
|
32
|
+
* @throws Error if module is not found
|
|
33
|
+
*/
|
|
34
|
+
async unregister(name) {
|
|
35
|
+
const module = this.modules.get(name);
|
|
36
|
+
if (!module) {
|
|
37
|
+
throw new Error(`Module '${name}' not found`);
|
|
38
|
+
}
|
|
39
|
+
// Call destroy hook if present
|
|
40
|
+
if (module.destroy) {
|
|
41
|
+
await module.destroy();
|
|
42
|
+
}
|
|
43
|
+
this.modules.delete(name);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Retrieves a registered module by name
|
|
47
|
+
* @param name - Name of the module to retrieve
|
|
48
|
+
* @returns Module instance if found, undefined otherwise
|
|
49
|
+
*/
|
|
50
|
+
get(name) {
|
|
51
|
+
return this.modules.get(name);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Checks if a module is registered
|
|
55
|
+
* @param name - Name of the module to check
|
|
56
|
+
* @returns true if module is registered, false otherwise
|
|
57
|
+
*/
|
|
58
|
+
has(name) {
|
|
59
|
+
return this.modules.has(name);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Returns list of all registered module names
|
|
63
|
+
* @returns Array of module names
|
|
64
|
+
*/
|
|
65
|
+
list() {
|
|
66
|
+
return Array.from(this.modules.keys());
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Clears all registered modules
|
|
70
|
+
* Calls destroy hook on all modules if present
|
|
71
|
+
*/
|
|
72
|
+
async clear() {
|
|
73
|
+
const promises = Array.from(this.modules.values()).map(async (module) => {
|
|
74
|
+
if (module.destroy) {
|
|
75
|
+
await module.destroy();
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
await Promise.all(promises);
|
|
79
|
+
this.modules.clear();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Singleton registry instances for different module types
|
|
84
|
+
*/
|
|
85
|
+
/**
|
|
86
|
+
* Registry for storage modules
|
|
87
|
+
*/
|
|
88
|
+
export const storageRegistry = new Registry();
|
|
89
|
+
/**
|
|
90
|
+
* Registry for validator modules
|
|
91
|
+
*/
|
|
92
|
+
export const validatorRegistry = new Registry();
|
|
93
|
+
/**
|
|
94
|
+
* Registry for transformer modules
|
|
95
|
+
*/
|
|
96
|
+
export const transformerRegistry = new Registry();
|
|
97
|
+
/**
|
|
98
|
+
* Example: Memory Storage Module
|
|
99
|
+
* Simple in-memory storage implementation for demonstration
|
|
100
|
+
*/
|
|
101
|
+
class MemoryStorageModuleImpl {
|
|
102
|
+
name = 'memory-storage';
|
|
103
|
+
storage = new Map();
|
|
104
|
+
async init() {
|
|
105
|
+
console.log('MemoryStorageModule initialized');
|
|
106
|
+
}
|
|
107
|
+
async destroy() {
|
|
108
|
+
this.storage.clear();
|
|
109
|
+
console.log('MemoryStorageModule destroyed');
|
|
110
|
+
}
|
|
111
|
+
async get(key) {
|
|
112
|
+
const entry = this.storage.get(key);
|
|
113
|
+
if (!entry) {
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
// Check if expired
|
|
117
|
+
if (entry.expiresAt && Date.now() > entry.expiresAt) {
|
|
118
|
+
this.storage.delete(key);
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
return entry.value;
|
|
122
|
+
}
|
|
123
|
+
async set(key, value, ttl) {
|
|
124
|
+
const expiresAt = ttl ? Date.now() + ttl : undefined;
|
|
125
|
+
this.storage.set(key, { value, expiresAt });
|
|
126
|
+
}
|
|
127
|
+
async delete(key) {
|
|
128
|
+
this.storage.delete(key);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
export const MemoryStorageModule = new MemoryStorageModuleImpl();
|
|
132
|
+
/**
|
|
133
|
+
* Example: Basic Validator Module
|
|
134
|
+
* Simple validator that checks if data is not empty
|
|
135
|
+
*/
|
|
136
|
+
class BasicValidatorModuleImpl {
|
|
137
|
+
name = 'basic-validator';
|
|
138
|
+
errors = [];
|
|
139
|
+
async init() {
|
|
140
|
+
console.log('BasicValidatorModule initialized');
|
|
141
|
+
}
|
|
142
|
+
async destroy() {
|
|
143
|
+
this.errors = [];
|
|
144
|
+
console.log('BasicValidatorModule destroyed');
|
|
145
|
+
}
|
|
146
|
+
validate(data) {
|
|
147
|
+
this.errors = [];
|
|
148
|
+
if (data === null || data === undefined) {
|
|
149
|
+
this.errors.push('Data cannot be null or undefined');
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
if (typeof data === 'string' && data.trim() === '') {
|
|
153
|
+
this.errors.push('String cannot be empty');
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
getErrors() {
|
|
159
|
+
return [...this.errors];
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
export const BasicValidatorModule = new BasicValidatorModuleImpl();
|
|
163
|
+
/**
|
|
164
|
+
* Example: Uppercase Transformer Module
|
|
165
|
+
* Transforms strings to uppercase
|
|
166
|
+
*/
|
|
167
|
+
export const UppercaseTransformerModule = {
|
|
168
|
+
name: 'uppercase-transformer',
|
|
169
|
+
async init() {
|
|
170
|
+
console.log('UppercaseTransformerModule initialized');
|
|
171
|
+
},
|
|
172
|
+
async destroy() {
|
|
173
|
+
console.log('UppercaseTransformerModule destroyed');
|
|
174
|
+
},
|
|
175
|
+
transform(data) {
|
|
176
|
+
if (typeof data === 'string') {
|
|
177
|
+
return data.toUpperCase();
|
|
178
|
+
}
|
|
179
|
+
return data;
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.d.ts","sourceRoot":"","sources":["../src/registry.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|