@adaas/a-utils 0.1.18 → 0.1.19
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/dist/index.d.mts +964 -354
- package/dist/index.d.ts +964 -354
- package/dist/index.js +1426 -714
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1426 -714
- package/dist/index.mjs.map +1 -1
- package/examples/A-Channel-examples.ts +13 -11
- package/examples/A-Command-examples-2.ts +429 -0
- package/examples/A-Command-examples.ts +487 -202
- package/examples/A-StateMachine-examples.ts +609 -0
- package/package.json +3 -2
- package/src/index.ts +1 -2
- package/src/lib/A-Channel/A-Channel.component.ts +14 -74
- package/src/lib/A-Channel/A-Channel.error.ts +5 -5
- package/src/lib/A-Channel/A-Channel.types.ts +2 -10
- package/src/lib/A-Channel/A-ChannelRequest.context.ts +25 -74
- package/src/lib/A-Command/A-Command.constants.ts +78 -23
- package/src/lib/A-Command/A-Command.entity.ts +447 -119
- package/src/lib/A-Command/A-Command.error.ts +11 -0
- package/src/lib/A-Command/A-Command.types.ts +96 -20
- package/src/lib/A-Command/A-CommandExecution.context.ts +0 -0
- package/src/lib/A-Command/README.md +164 -68
- package/src/lib/A-Config/A-Config.container.ts +2 -2
- package/src/lib/A-Config/A-Config.context.ts +19 -5
- package/src/lib/A-Config/components/ConfigReader.component.ts +1 -1
- package/src/lib/A-Logger/A-Logger.component.ts +211 -35
- package/src/lib/A-Logger/A-Logger.constants.ts +50 -10
- package/src/lib/A-Logger/A-Logger.env.ts +17 -1
- package/src/lib/A-Memory/A-Memory.component.ts +440 -0
- package/src/lib/A-Memory/A-Memory.constants.ts +49 -0
- package/src/lib/A-Memory/A-Memory.context.ts +14 -118
- package/src/lib/A-Memory/A-Memory.error.ts +21 -0
- package/src/lib/A-Memory/A-Memory.types.ts +21 -0
- package/src/lib/A-Operation/A-Operation.context.ts +58 -0
- package/src/lib/A-Operation/A-Operation.types.ts +47 -0
- package/src/lib/A-StateMachine/A-StateMachine.component.ts +258 -0
- package/src/lib/A-StateMachine/A-StateMachine.constants.ts +18 -0
- package/src/lib/A-StateMachine/A-StateMachine.error.ts +10 -0
- package/src/lib/A-StateMachine/A-StateMachine.types.ts +20 -0
- package/src/lib/A-StateMachine/A-StateMachineTransition.context.ts +41 -0
- package/src/lib/A-StateMachine/README.md +391 -0
- package/tests/A-Channel.test.ts +17 -14
- package/tests/A-Command.test.ts +548 -460
- package/tests/A-Logger.test.ts +8 -4
- package/tests/A-Memory.test.ts +151 -115
- package/tests/A-Schedule.test.ts +2 -2
- package/tests/A-StateMachine.test.ts +760 -0
package/tests/A-Logger.test.ts
CHANGED
|
@@ -118,7 +118,9 @@ describe('A_Logger Component', () => {
|
|
|
118
118
|
longLogger.log('Test message');
|
|
119
119
|
|
|
120
120
|
const logs = getCapturedLogs();
|
|
121
|
-
|
|
121
|
+
// Long scope names should be truncated to the standard length (20 characters)
|
|
122
|
+
expect(logs[0]).toContain('VeryLongServiceNameT'); // Truncated to 20 chars
|
|
123
|
+
expect(logs[0]).toContain('Test message');
|
|
122
124
|
});
|
|
123
125
|
|
|
124
126
|
test('should maintain consistent alignment across different scope lengths', () => {
|
|
@@ -137,9 +139,11 @@ describe('A_Logger Component', () => {
|
|
|
137
139
|
expect(logs).toHaveLength(3);
|
|
138
140
|
|
|
139
141
|
// All logs should have similar structure for alignment
|
|
140
|
-
logs.forEach(log => {
|
|
142
|
+
logs.forEach((log, index) => {
|
|
141
143
|
expect(log).toContain('Alignment test');
|
|
142
|
-
|
|
144
|
+
// The log format includes ANSI escape codes, so let's test the basic structure
|
|
145
|
+
expect(log).toMatch(/\[.*\]/); // Has scope brackets
|
|
146
|
+
expect(log).toMatch(/\|\d{2}:\d{2}:\d{3}\|/); // Has timestamp
|
|
143
147
|
});
|
|
144
148
|
});
|
|
145
149
|
});
|
|
@@ -244,7 +248,7 @@ describe('A_Logger Component', () => {
|
|
|
244
248
|
test('should support all defined colors', () => {
|
|
245
249
|
const colors: Array<keyof typeof A_LOGGER_COLORS> = [
|
|
246
250
|
'green', 'blue', 'red', 'yellow', 'gray',
|
|
247
|
-
'magenta', 'cyan'
|
|
251
|
+
'magenta', 'cyan'
|
|
248
252
|
];
|
|
249
253
|
|
|
250
254
|
colors.forEach(color => {
|
package/tests/A-Memory.test.ts
CHANGED
|
@@ -1,169 +1,203 @@
|
|
|
1
|
-
import { A_Memory } from '@adaas/a-utils/lib/A-Memory/A-Memory.
|
|
2
|
-
import {
|
|
1
|
+
import { A_Memory } from '@adaas/a-utils/lib/A-Memory/A-Memory.component';
|
|
2
|
+
import { A_MemoryContext } from '@adaas/a-utils/lib/A-Memory/A-Memory.context';
|
|
3
|
+
import { A_MemoryError } from '@adaas/a-utils/lib/A-Memory/A-Memory.error';
|
|
4
|
+
import { A_Component, A_Concept, A_Container, A_Context, A_Error } from '@adaas/a-concept';
|
|
3
5
|
|
|
4
6
|
jest.retryTimes(0);
|
|
5
7
|
|
|
6
8
|
describe('A-Memory tests', () => {
|
|
7
9
|
|
|
8
|
-
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
A_Context.reset();
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
it('Should allow to create memory instance', async () => {
|
|
9
15
|
const memory = new A_Memory();
|
|
10
|
-
|
|
16
|
+
A_Context.root.register(memory);
|
|
17
|
+
|
|
11
18
|
expect(memory).toBeInstanceOf(A_Memory);
|
|
12
|
-
expect(memory
|
|
19
|
+
expect(memory).toBeInstanceOf(A_Component);
|
|
20
|
+
|
|
21
|
+
// Test that memory can be initialized
|
|
22
|
+
await memory.ready;
|
|
13
23
|
});
|
|
14
24
|
|
|
15
|
-
it('Should allow to
|
|
16
|
-
const
|
|
17
|
-
key1:
|
|
18
|
-
key2:
|
|
19
|
-
key3: { nested:
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
it('Should allow to initialize and set initial values', async () => {
|
|
26
|
+
const memory = new A_Memory<{
|
|
27
|
+
key1: string;
|
|
28
|
+
key2: number;
|
|
29
|
+
key3: { nested: string };
|
|
30
|
+
}>();
|
|
31
|
+
A_Context.root.register(memory);
|
|
32
|
+
|
|
33
|
+
await memory.ready;
|
|
34
|
+
|
|
35
|
+
// Set initial values after initialization
|
|
36
|
+
await memory.set('key1', 'value1');
|
|
37
|
+
await memory.set('key2', 42);
|
|
38
|
+
await memory.set('key3', { nested: 'object' });
|
|
39
|
+
|
|
40
|
+
expect(await memory.get('key1')).toBe('value1');
|
|
41
|
+
expect(await memory.get('key2')).toBe(42);
|
|
42
|
+
expect(await memory.get('key3')).toEqual({ nested: 'object' });
|
|
27
43
|
});
|
|
28
44
|
|
|
29
45
|
it('Should allow to set and get values', async () => {
|
|
30
|
-
const memory = new A_Memory<{
|
|
46
|
+
const memory = new A_Memory<{
|
|
31
47
|
stringValue: string;
|
|
32
48
|
numberValue: number;
|
|
33
49
|
objectValue: { prop: string };
|
|
34
50
|
}>();
|
|
35
|
-
|
|
51
|
+
A_Context.root.register(memory);
|
|
52
|
+
|
|
53
|
+
await memory.ready;
|
|
54
|
+
|
|
36
55
|
await memory.set('stringValue', 'test string');
|
|
37
56
|
await memory.set('numberValue', 123);
|
|
38
57
|
await memory.set('objectValue', { prop: 'test' });
|
|
39
|
-
|
|
40
|
-
expect(memory.get('stringValue')).toBe('test string');
|
|
41
|
-
expect(memory.get('numberValue')).toBe(123);
|
|
42
|
-
expect(memory.get('objectValue')).toEqual({ prop: 'test' });
|
|
58
|
+
|
|
59
|
+
expect(await memory.get('stringValue')).toBe('test string');
|
|
60
|
+
expect(await memory.get('numberValue')).toBe(123);
|
|
61
|
+
expect(await memory.get('objectValue')).toEqual({ prop: 'test' });
|
|
43
62
|
});
|
|
44
63
|
|
|
45
|
-
it('Should return undefined for non-existent keys', () => {
|
|
64
|
+
it('Should return undefined for non-existent keys', async () => {
|
|
46
65
|
const memory = new A_Memory<{ existingKey: string }>();
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
66
|
+
A_Context.root.register(memory);
|
|
67
|
+
|
|
68
|
+
await memory.ready;
|
|
69
|
+
|
|
70
|
+
expect(await memory.get('existingKey')).toBeUndefined();
|
|
71
|
+
expect(await memory.get('nonExistentKey' as any)).toBeUndefined();
|
|
50
72
|
});
|
|
51
73
|
|
|
52
74
|
it('Should allow to drop values', async () => {
|
|
53
75
|
const memory = new A_Memory<{ key1: string; key2: number }>();
|
|
54
|
-
|
|
76
|
+
A_Context.root.register(memory);
|
|
77
|
+
|
|
78
|
+
await memory.ready;
|
|
79
|
+
|
|
55
80
|
await memory.set('key1', 'value1');
|
|
56
81
|
await memory.set('key2', 42);
|
|
57
|
-
|
|
58
|
-
expect(memory.get('key1')).toBe('value1');
|
|
59
|
-
expect(memory.get('key2')).toBe(42);
|
|
60
|
-
|
|
82
|
+
|
|
83
|
+
expect(await memory.get('key1')).toBe('value1');
|
|
84
|
+
expect(await memory.get('key2')).toBe(42);
|
|
85
|
+
|
|
61
86
|
await memory.drop('key1');
|
|
62
|
-
|
|
63
|
-
expect(memory.get('key1')).toBeUndefined();
|
|
64
|
-
expect(memory.get('key2')).toBe(42);
|
|
87
|
+
|
|
88
|
+
expect(await memory.get('key1')).toBeUndefined();
|
|
89
|
+
expect(await memory.get('key2')).toBe(42);
|
|
65
90
|
});
|
|
66
91
|
|
|
67
92
|
it('Should allow to clear all values', async () => {
|
|
68
93
|
const memory = new A_Memory<{ key1: string; key2: number }>();
|
|
69
|
-
|
|
94
|
+
A_Context.root.register(memory);
|
|
95
|
+
|
|
96
|
+
await memory.ready;
|
|
97
|
+
|
|
70
98
|
await memory.set('key1', 'value1');
|
|
71
99
|
await memory.set('key2', 42);
|
|
72
|
-
|
|
73
|
-
expect(memory.get('key1')).toBe('value1');
|
|
74
|
-
expect(memory.get('key2')).toBe(42);
|
|
75
|
-
|
|
100
|
+
|
|
101
|
+
expect(await memory.get('key1')).toBe('value1');
|
|
102
|
+
expect(await memory.get('key2')).toBe(42);
|
|
103
|
+
|
|
76
104
|
await memory.clear();
|
|
77
|
-
|
|
78
|
-
expect(memory.get('key1')).toBeUndefined();
|
|
79
|
-
expect(memory.get('key2')).toBeUndefined();
|
|
105
|
+
|
|
106
|
+
expect(await memory.get('key1')).toBeUndefined();
|
|
107
|
+
expect(await memory.get('key2')).toBeUndefined();
|
|
80
108
|
});
|
|
81
109
|
|
|
82
|
-
it('Should
|
|
83
|
-
const memory = new A_Memory();
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
await memory.
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
110
|
+
it('Should check if keys exist with has method', async () => {
|
|
111
|
+
const memory = new A_Memory<{ key1: string; key2: number }>();
|
|
112
|
+
A_Context.root.register(memory);
|
|
113
|
+
|
|
114
|
+
await memory.ready;
|
|
115
|
+
|
|
116
|
+
// Initially, keys should not exist
|
|
117
|
+
expect(await memory.has('key1')).toBe(false);
|
|
118
|
+
expect(await memory.has('key2')).toBe(false);
|
|
119
|
+
|
|
120
|
+
// Set values
|
|
121
|
+
await memory.set('key1', 'value1');
|
|
122
|
+
await memory.set('key2', 42);
|
|
123
|
+
|
|
124
|
+
// Now keys should exist
|
|
125
|
+
expect(await memory.has('key1')).toBe(true);
|
|
126
|
+
expect(await memory.has('key2')).toBe(true);
|
|
127
|
+
|
|
128
|
+
// Drop one key
|
|
129
|
+
await memory.drop('key1');
|
|
130
|
+
|
|
131
|
+
// Should only have key2 now
|
|
132
|
+
expect(await memory.has('key1')).toBe(false);
|
|
133
|
+
expect(await memory.has('key2')).toBe(true);
|
|
97
134
|
});
|
|
98
135
|
|
|
99
|
-
it('Should
|
|
100
|
-
const memory = new A_Memory<{
|
|
101
|
-
|
|
102
|
-
required2: number;
|
|
103
|
-
optional?: string;
|
|
104
|
-
}>();
|
|
105
|
-
|
|
106
|
-
// No values set initially
|
|
107
|
-
expect(await memory.prerequisites(['required1', 'required2'])).toBe(false);
|
|
108
|
-
|
|
109
|
-
// Set one required value
|
|
110
|
-
await memory.set('required1', 'value1');
|
|
111
|
-
expect(await memory.prerequisites(['required1', 'required2'])).toBe(false);
|
|
112
|
-
|
|
113
|
-
// Set both required values
|
|
114
|
-
await memory.set('required2', 42);
|
|
115
|
-
expect(await memory.prerequisites(['required1', 'required2'])).toBe(true);
|
|
136
|
+
it('Should destroy and reinitialize correctly', async () => {
|
|
137
|
+
const memory = new A_Memory<{ key1: string; key2: number }>();
|
|
138
|
+
A_Context.root.register(memory);
|
|
116
139
|
|
|
117
|
-
|
|
118
|
-
|
|
140
|
+
await memory.ready;
|
|
141
|
+
|
|
142
|
+
// Set some values
|
|
143
|
+
await memory.set('key1', 'value1');
|
|
144
|
+
await memory.set('key2', 42);
|
|
145
|
+
|
|
146
|
+
expect(await memory.get('key1')).toBe('value1');
|
|
147
|
+
expect(await memory.get('key2')).toBe(42);
|
|
148
|
+
|
|
149
|
+
// Destroy memory
|
|
150
|
+
await memory.destroy();
|
|
151
|
+
|
|
152
|
+
// Memory should be ready to reinitialize
|
|
153
|
+
await memory.ready;
|
|
154
|
+
|
|
155
|
+
// After reinitializing, values should be cleared
|
|
156
|
+
expect(await memory.get('key1')).toBeUndefined();
|
|
157
|
+
expect(await memory.get('key2')).toBeUndefined();
|
|
119
158
|
});
|
|
120
159
|
|
|
121
|
-
it('Should
|
|
122
|
-
const memory = new A_Memory
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
objectProp: { nested: string };
|
|
126
|
-
arrayProp: number[];
|
|
127
|
-
}>();
|
|
160
|
+
it('Should return undefined for toJSON when no serialization feature is implemented', async () => {
|
|
161
|
+
const memory = new A_Memory();
|
|
162
|
+
await A_Context.root.register(memory);
|
|
163
|
+
await memory.ready;
|
|
128
164
|
|
|
165
|
+
// Set some values
|
|
129
166
|
await memory.set('stringProp', 'test');
|
|
130
167
|
await memory.set('numberProp', 42);
|
|
131
168
|
await memory.set('objectProp', { nested: 'value' });
|
|
132
169
|
await memory.set('arrayProp', [1, 2, 3]);
|
|
133
|
-
|
|
134
|
-
const json = memory.toJSON();
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
numberProp: 42,
|
|
139
|
-
objectProp: { nested: 'value' },
|
|
140
|
-
arrayProp: [1, 2, 3]
|
|
141
|
-
});
|
|
170
|
+
|
|
171
|
+
const json = await memory.toJSON();
|
|
172
|
+
|
|
173
|
+
// Since no onSerialize feature is implemented, toJSON returns undefined
|
|
174
|
+
expect(json).toBeUndefined();
|
|
142
175
|
});
|
|
143
176
|
|
|
144
|
-
it('Should
|
|
177
|
+
it('Should return undefined for toJSON when no serialization feature is implemented (with complex objects)', async () => {
|
|
145
178
|
class SerializableObject {
|
|
146
|
-
constructor(private value: string) {}
|
|
147
|
-
|
|
179
|
+
constructor(private value: string) { }
|
|
180
|
+
|
|
148
181
|
toJSON() {
|
|
149
182
|
return { serialized: this.value };
|
|
150
183
|
}
|
|
151
184
|
}
|
|
152
|
-
|
|
185
|
+
|
|
153
186
|
const memory = new A_Memory<{
|
|
154
187
|
regular: string;
|
|
155
188
|
serializable: SerializableObject;
|
|
156
189
|
}>();
|
|
157
|
-
|
|
190
|
+
A_Context.root.register(memory);
|
|
191
|
+
|
|
192
|
+
await memory.ready;
|
|
193
|
+
|
|
158
194
|
await memory.set('regular', 'normal value');
|
|
159
195
|
await memory.set('serializable', new SerializableObject('test'));
|
|
160
|
-
|
|
161
|
-
const json = memory.toJSON();
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
serializable: { serialized: 'test' }
|
|
166
|
-
});
|
|
196
|
+
|
|
197
|
+
const json = await memory.toJSON();
|
|
198
|
+
|
|
199
|
+
// Since no onSerialize feature is implemented, toJSON returns undefined
|
|
200
|
+
expect(json).toBeUndefined();
|
|
167
201
|
});
|
|
168
202
|
|
|
169
203
|
it('Should handle null and undefined values correctly', async () => {
|
|
@@ -172,18 +206,20 @@ describe('A-Memory tests', () => {
|
|
|
172
206
|
undefinedValue: undefined;
|
|
173
207
|
stringValue: string;
|
|
174
208
|
}>();
|
|
175
|
-
|
|
209
|
+
A_Context.root.register(memory);
|
|
210
|
+
|
|
211
|
+
await memory.ready;
|
|
212
|
+
|
|
176
213
|
await memory.set('nullValue', null);
|
|
177
214
|
await memory.set('undefinedValue', undefined);
|
|
178
215
|
await memory.set('stringValue', 'test');
|
|
179
|
-
|
|
180
|
-
expect(memory.get('nullValue')).toBe(null);
|
|
181
|
-
expect(memory.get('undefinedValue')).toBe(undefined);
|
|
182
|
-
expect(memory.get('stringValue')).toBe('test');
|
|
183
|
-
|
|
184
|
-
const json = memory.toJSON();
|
|
185
|
-
|
|
186
|
-
expect(json
|
|
187
|
-
expect(json.stringValue).toBe('test');
|
|
216
|
+
|
|
217
|
+
expect(await memory.get('nullValue')).toBe(null);
|
|
218
|
+
expect(await memory.get('undefinedValue')).toBe(undefined);
|
|
219
|
+
expect(await memory.get('stringValue')).toBe('test');
|
|
220
|
+
|
|
221
|
+
const json = await memory.toJSON();
|
|
222
|
+
// Since no onSerialize feature is implemented, toJSON returns undefined
|
|
223
|
+
expect(json).toBeUndefined();
|
|
188
224
|
});
|
|
189
225
|
});
|
package/tests/A-Schedule.test.ts
CHANGED
|
@@ -21,7 +21,7 @@ describe('A-Schedule Tests', () => {
|
|
|
21
21
|
components: [A_Schedule]
|
|
22
22
|
});
|
|
23
23
|
|
|
24
|
-
const schedule = testScope.resolve(A_Schedule)
|
|
24
|
+
const schedule = testScope.resolve(A_Schedule)!;
|
|
25
25
|
|
|
26
26
|
const start = Date.now();
|
|
27
27
|
let res = '';
|
|
@@ -53,7 +53,7 @@ describe('A-Schedule Tests', () => {
|
|
|
53
53
|
components: [A_Schedule]
|
|
54
54
|
});
|
|
55
55
|
|
|
56
|
-
const schedule = testScope.resolve(A_Schedule)
|
|
56
|
+
const schedule = testScope.resolve(A_Schedule)!;
|
|
57
57
|
|
|
58
58
|
expect(schedule).toBeInstanceOf(A_Schedule);
|
|
59
59
|
|