@adaas/a-utils 0.1.17 → 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.
Files changed (47) hide show
  1. package/dist/index.d.mts +964 -354
  2. package/dist/index.d.ts +964 -354
  3. package/dist/index.js +1426 -714
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.mjs +1426 -714
  6. package/dist/index.mjs.map +1 -1
  7. package/examples/A-Channel-examples.ts +13 -11
  8. package/examples/A-Command-examples-2.ts +429 -0
  9. package/examples/A-Command-examples.ts +487 -202
  10. package/examples/A-StateMachine-examples.ts +609 -0
  11. package/package.json +3 -2
  12. package/src/index.ts +1 -2
  13. package/src/lib/A-Channel/A-Channel.component.ts +14 -74
  14. package/src/lib/A-Channel/A-Channel.error.ts +5 -5
  15. package/src/lib/A-Channel/A-Channel.types.ts +2 -10
  16. package/src/lib/A-Channel/A-ChannelRequest.context.ts +25 -74
  17. package/src/lib/A-Command/A-Command.constants.ts +78 -23
  18. package/src/lib/A-Command/A-Command.entity.ts +447 -119
  19. package/src/lib/A-Command/A-Command.error.ts +11 -0
  20. package/src/lib/A-Command/A-Command.types.ts +96 -20
  21. package/src/lib/A-Command/A-CommandExecution.context.ts +0 -0
  22. package/src/lib/A-Command/README.md +164 -68
  23. package/src/lib/A-Config/A-Config.container.ts +2 -2
  24. package/src/lib/A-Config/A-Config.context.ts +19 -5
  25. package/src/lib/A-Config/components/ConfigReader.component.ts +1 -1
  26. package/src/lib/A-Logger/A-Logger.component.ts +211 -35
  27. package/src/lib/A-Logger/A-Logger.constants.ts +50 -10
  28. package/src/lib/A-Logger/A-Logger.env.ts +17 -1
  29. package/src/lib/A-Memory/A-Memory.component.ts +440 -0
  30. package/src/lib/A-Memory/A-Memory.constants.ts +49 -0
  31. package/src/lib/A-Memory/A-Memory.context.ts +14 -118
  32. package/src/lib/A-Memory/A-Memory.error.ts +21 -0
  33. package/src/lib/A-Memory/A-Memory.types.ts +21 -0
  34. package/src/lib/A-Operation/A-Operation.context.ts +58 -0
  35. package/src/lib/A-Operation/A-Operation.types.ts +47 -0
  36. package/src/lib/A-StateMachine/A-StateMachine.component.ts +258 -0
  37. package/src/lib/A-StateMachine/A-StateMachine.constants.ts +18 -0
  38. package/src/lib/A-StateMachine/A-StateMachine.error.ts +10 -0
  39. package/src/lib/A-StateMachine/A-StateMachine.types.ts +20 -0
  40. package/src/lib/A-StateMachine/A-StateMachineTransition.context.ts +41 -0
  41. package/src/lib/A-StateMachine/README.md +391 -0
  42. package/tests/A-Channel.test.ts +17 -14
  43. package/tests/A-Command.test.ts +548 -460
  44. package/tests/A-Logger.test.ts +8 -4
  45. package/tests/A-Memory.test.ts +151 -115
  46. package/tests/A-Schedule.test.ts +2 -2
  47. package/tests/A-StateMachine.test.ts +760 -0
@@ -118,7 +118,9 @@ describe('A_Logger Component', () => {
118
118
  longLogger.log('Test message');
119
119
 
120
120
  const logs = getCapturedLogs();
121
- expect(logs[0]).toContain('VeryLongServiceNameThatExceedsStandardLength');
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
- expect(log).toMatch(/\[.*\] \|.*\|/); // Pattern: [scope] |time|
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', 'white', 'pink'
251
+ 'magenta', 'cyan'
248
252
  ];
249
253
 
250
254
  colors.forEach(color => {
@@ -1,169 +1,203 @@
1
- import { A_Memory } from '@adaas/a-utils/lib/A-Memory/A-Memory.context';
2
- import { A_Error } from '@adaas/a-concept';
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
- it('Should allow to create memory instance', () => {
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.Errors).toBeUndefined();
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 create memory with initial values', () => {
16
- const initialValues = {
17
- key1: 'value1',
18
- key2: 42,
19
- key3: { nested: 'object' }
20
- };
21
-
22
- const memory = new A_Memory(initialValues);
23
-
24
- expect(memory.get('key1')).toBe('value1');
25
- expect(memory.get('key2')).toBe(42);
26
- expect(memory.get('key3')).toEqual({ nested: 'object' });
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
- expect(memory.get('existingKey')).toBeUndefined();
49
- expect(memory.get('nonExistentKey' as any)).toBeUndefined();
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 handle errors correctly', async () => {
83
- const memory = new A_Memory();
84
-
85
- expect(memory.Errors).toBeUndefined();
86
-
87
- const error1 = new A_Error({ title: 'Error 1' });
88
- const error2 = new A_Error({ title: 'Error 2' });
89
-
90
- await memory.error(error1);
91
- await memory.error(error2);
92
-
93
- expect(memory.Errors).toBeDefined();
94
- expect(memory.Errors?.size).toBe(2);
95
- expect(memory.Errors?.has(error1)).toBe(true);
96
- expect(memory.Errors?.has(error2)).toBe(true);
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 verify prerequisites correctly', async () => {
100
- const memory = new A_Memory<{
101
- required1: string;
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
- // Test with empty requirements
118
- expect(await memory.prerequisites([])).toBe(true);
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 serialize to JSON correctly', async () => {
122
- const memory = new A_Memory<{
123
- stringProp: string;
124
- numberProp: number;
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
- expect(json).toEqual({
137
- stringProp: 'test',
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 handle objects with toJSON method in serialization', async () => {
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
- expect(json).toEqual({
164
- regular: 'normal value',
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
- expect(json.nullValue).toBe(null);
186
- expect(json.undefinedValue).toBe(undefined);
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
  });
@@ -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