@memberjunction/global 4.2.0 → 4.3.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/dist/BaseSingleton.js +1 -1
- package/dist/BaseSingleton.js.map +1 -1
- package/dist/ClassFactory.d.ts +1 -1
- package/dist/ClassFactory.d.ts.map +1 -1
- package/dist/ClassFactory.js +2 -2
- package/dist/ClassFactory.js.map +1 -1
- package/dist/ClassUtils.d.ts.map +1 -1
- package/dist/ClassUtils.js +8 -12
- package/dist/ClassUtils.js.map +1 -1
- package/dist/RegisterClass.d.ts +1 -1
- package/dist/RegisterClass.d.ts.map +1 -1
- package/dist/RegisterClass.js +2 -2
- package/dist/RegisterClass.js.map +1 -1
- package/dist/__tests__/ClassFactory.test.d.ts +2 -0
- package/dist/__tests__/ClassFactory.test.d.ts.map +1 -0
- package/dist/__tests__/ClassFactory.test.js +333 -0
- package/dist/__tests__/ClassFactory.test.js.map +1 -0
- package/dist/__tests__/ClassUtils.test.d.ts +2 -0
- package/dist/__tests__/ClassUtils.test.d.ts.map +1 -0
- package/dist/__tests__/ClassUtils.test.js +241 -0
- package/dist/__tests__/ClassUtils.test.js.map +1 -0
- package/dist/__tests__/MJGlobal.test.d.ts +2 -0
- package/dist/__tests__/MJGlobal.test.d.ts.map +1 -0
- package/dist/__tests__/MJGlobal.test.js +259 -0
- package/dist/__tests__/MJGlobal.test.js.map +1 -0
- package/dist/__tests__/ObjectCache.test.d.ts +2 -0
- package/dist/__tests__/ObjectCache.test.d.ts.map +1 -0
- package/dist/__tests__/ObjectCache.test.js +155 -0
- package/dist/__tests__/ObjectCache.test.js.map +1 -0
- package/dist/__tests__/util.test.d.ts +2 -0
- package/dist/__tests__/util.test.d.ts.map +1 -0
- package/dist/__tests__/util.test.js +434 -0
- package/dist/__tests__/util.test.js.map +1 -0
- package/package.json +5 -3
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { ObjectCache } from '../ObjectCache.js';
|
|
3
|
+
describe('ObjectCache', () => {
|
|
4
|
+
let cache;
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
cache = new ObjectCache();
|
|
7
|
+
});
|
|
8
|
+
describe('Add and Find', () => {
|
|
9
|
+
it('should add and find an object by key', () => {
|
|
10
|
+
cache.Add('greeting', 'hello');
|
|
11
|
+
const result = cache.Find('greeting');
|
|
12
|
+
expect(result).toBe('hello');
|
|
13
|
+
});
|
|
14
|
+
it('should add and find a number', () => {
|
|
15
|
+
cache.Add('count', 42);
|
|
16
|
+
expect(cache.Find('count')).toBe(42);
|
|
17
|
+
});
|
|
18
|
+
it('should add and find a complex object', () => {
|
|
19
|
+
const obj = { name: 'Test', value: 123, nested: { flag: true } };
|
|
20
|
+
cache.Add('config', obj);
|
|
21
|
+
const result = cache.Find('config');
|
|
22
|
+
expect(result).not.toBeNull();
|
|
23
|
+
expect(result.name).toBe('Test');
|
|
24
|
+
expect(result.nested.flag).toBe(true);
|
|
25
|
+
});
|
|
26
|
+
it('should return null when key is not found', () => {
|
|
27
|
+
const result = cache.Find('nonexistent');
|
|
28
|
+
expect(result).toBeNull();
|
|
29
|
+
});
|
|
30
|
+
it('should store multiple entries independently', () => {
|
|
31
|
+
cache.Add('key1', 'value1');
|
|
32
|
+
cache.Add('key2', 'value2');
|
|
33
|
+
cache.Add('key3', 'value3');
|
|
34
|
+
expect(cache.Find('key1')).toBe('value1');
|
|
35
|
+
expect(cache.Find('key2')).toBe('value2');
|
|
36
|
+
expect(cache.Find('key3')).toBe('value3');
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
describe('Duplicate key handling', () => {
|
|
40
|
+
it('should throw an error when adding a duplicate key', () => {
|
|
41
|
+
cache.Add('dupe', 'first');
|
|
42
|
+
expect(() => cache.Add('dupe', 'second')).toThrowError(/already exists in the cache/);
|
|
43
|
+
});
|
|
44
|
+
it('should throw on duplicate key regardless of case', () => {
|
|
45
|
+
cache.Add('MyKey', 'first');
|
|
46
|
+
expect(() => cache.Add('mykey', 'second')).toThrowError(/already exists in the cache/);
|
|
47
|
+
});
|
|
48
|
+
it('should throw on duplicate key with leading/trailing whitespace', () => {
|
|
49
|
+
cache.Add(' key ', 'first');
|
|
50
|
+
expect(() => cache.Add('key', 'second')).toThrowError(/already exists in the cache/);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe('Case-insensitive key matching', () => {
|
|
54
|
+
it('should find entries regardless of key case', () => {
|
|
55
|
+
cache.Add('MyCacheKey', 'value');
|
|
56
|
+
expect(cache.Find('mycachekey')).toBe('value');
|
|
57
|
+
expect(cache.Find('MYCACHEKEY')).toBe('value');
|
|
58
|
+
expect(cache.Find('myCacheKey')).toBe('value');
|
|
59
|
+
});
|
|
60
|
+
it('should remove entries regardless of key case', () => {
|
|
61
|
+
cache.Add('TestKey', 'value');
|
|
62
|
+
cache.Remove('testkey');
|
|
63
|
+
expect(cache.Find('TestKey')).toBeNull();
|
|
64
|
+
});
|
|
65
|
+
it('should replace entries regardless of key case', () => {
|
|
66
|
+
cache.Add('TestKey', 'original');
|
|
67
|
+
cache.Replace('testkey', 'replaced');
|
|
68
|
+
expect(cache.Find('TestKey')).toBe('replaced');
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('Remove', () => {
|
|
72
|
+
it('should remove an existing entry', () => {
|
|
73
|
+
cache.Add('removeMe', 'value');
|
|
74
|
+
cache.Remove('removeMe');
|
|
75
|
+
expect(cache.Find('removeMe')).toBeNull();
|
|
76
|
+
});
|
|
77
|
+
it('should not throw when removing a non-existent key', () => {
|
|
78
|
+
expect(() => cache.Remove('doesNotExist')).not.toThrow();
|
|
79
|
+
});
|
|
80
|
+
it('should only remove the targeted entry', () => {
|
|
81
|
+
cache.Add('keep', 'kept');
|
|
82
|
+
cache.Add('remove', 'removed');
|
|
83
|
+
cache.Remove('remove');
|
|
84
|
+
expect(cache.Find('keep')).toBe('kept');
|
|
85
|
+
expect(cache.Find('remove')).toBeNull();
|
|
86
|
+
});
|
|
87
|
+
it('should allow re-adding after removal', () => {
|
|
88
|
+
cache.Add('reuse', 'first');
|
|
89
|
+
cache.Remove('reuse');
|
|
90
|
+
cache.Add('reuse', 'second');
|
|
91
|
+
expect(cache.Find('reuse')).toBe('second');
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
describe('Replace', () => {
|
|
95
|
+
it('should replace an existing entry', () => {
|
|
96
|
+
cache.Add('key', 'original');
|
|
97
|
+
cache.Replace('key', 'updated');
|
|
98
|
+
expect(cache.Find('key')).toBe('updated');
|
|
99
|
+
});
|
|
100
|
+
it('should add a new entry if key does not exist', () => {
|
|
101
|
+
cache.Replace('newKey', 'newValue');
|
|
102
|
+
expect(cache.Find('newKey')).toBe('newValue');
|
|
103
|
+
});
|
|
104
|
+
it('should handle replacing with a different type', () => {
|
|
105
|
+
cache.Add('flexible', 'text');
|
|
106
|
+
cache.Replace('flexible', 999);
|
|
107
|
+
expect(cache.Find('flexible')).toBe(999);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe('Clear', () => {
|
|
111
|
+
it('should remove all entries', () => {
|
|
112
|
+
cache.Add('a', '1');
|
|
113
|
+
cache.Add('b', '2');
|
|
114
|
+
cache.Add('c', '3');
|
|
115
|
+
cache.Clear();
|
|
116
|
+
expect(cache.Find('a')).toBeNull();
|
|
117
|
+
expect(cache.Find('b')).toBeNull();
|
|
118
|
+
expect(cache.Find('c')).toBeNull();
|
|
119
|
+
});
|
|
120
|
+
it('should allow adding entries after clearing', () => {
|
|
121
|
+
cache.Add('key', 'value');
|
|
122
|
+
cache.Clear();
|
|
123
|
+
cache.Add('key', 'new-value');
|
|
124
|
+
expect(cache.Find('key')).toBe('new-value');
|
|
125
|
+
});
|
|
126
|
+
it('should not throw when clearing an empty cache', () => {
|
|
127
|
+
expect(() => cache.Clear()).not.toThrow();
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
describe('Edge cases', () => {
|
|
131
|
+
it('should handle empty string as key', () => {
|
|
132
|
+
cache.Add('', 'empty-key-value');
|
|
133
|
+
expect(cache.Find('')).toBe('empty-key-value');
|
|
134
|
+
});
|
|
135
|
+
it('should handle null as a cached value', () => {
|
|
136
|
+
cache.Add('nullValue', null);
|
|
137
|
+
const result = cache.Find('nullValue');
|
|
138
|
+
expect(result).toBeNull();
|
|
139
|
+
});
|
|
140
|
+
it('should handle undefined as a cached value', () => {
|
|
141
|
+
cache.Add('undefValue', undefined);
|
|
142
|
+
const result = cache.Find('undefValue');
|
|
143
|
+
expect(result).toBeUndefined();
|
|
144
|
+
});
|
|
145
|
+
it('should handle boolean false as a cached value', () => {
|
|
146
|
+
cache.Add('flag', false);
|
|
147
|
+
expect(cache.Find('flag')).toBe(false);
|
|
148
|
+
});
|
|
149
|
+
it('should handle zero as a cached value', () => {
|
|
150
|
+
cache.Add('zero', 0);
|
|
151
|
+
expect(cache.Find('zero')).toBe(0);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
//# sourceMappingURL=ObjectCache.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectCache.test.js","sourceRoot":"","sources":["../../src/__tests__/ObjectCache.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/util.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { GetGlobalObjectStore, CleanJSON, SafeJSONParse, CleanAndParseJSON, CopyScalarsAndArrays, convertCamelCaseToHaveSpaces, generatePluralName, getIrregularPlural, stripWhitespace, uuidv4, stripTrailingChars, replaceAllSpaces, IsOnlyTimezoneShift, } from '../util.js';
|
|
3
|
+
describe('GetGlobalObjectStore', () => {
|
|
4
|
+
it('should return a non-null object in Node environment', () => {
|
|
5
|
+
const store = GetGlobalObjectStore();
|
|
6
|
+
expect(store).not.toBeNull();
|
|
7
|
+
});
|
|
8
|
+
it('should return the global object', () => {
|
|
9
|
+
const store = GetGlobalObjectStore();
|
|
10
|
+
expect(store).toBeDefined();
|
|
11
|
+
});
|
|
12
|
+
it('should allow setting and reading arbitrary keys', () => {
|
|
13
|
+
const store = GetGlobalObjectStore();
|
|
14
|
+
if (store) {
|
|
15
|
+
const testKey = '__test_key_' + Date.now();
|
|
16
|
+
store[testKey] = 'test-value';
|
|
17
|
+
expect(store[testKey]).toBe('test-value');
|
|
18
|
+
delete store[testKey];
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
describe('CleanJSON', () => {
|
|
23
|
+
it('should return null for null input', () => {
|
|
24
|
+
expect(CleanJSON(null)).toBeNull();
|
|
25
|
+
});
|
|
26
|
+
it('should return null for empty string', () => {
|
|
27
|
+
expect(CleanJSON('')).toBeNull();
|
|
28
|
+
});
|
|
29
|
+
it('should return formatted JSON for valid JSON input', () => {
|
|
30
|
+
const input = '{"name":"test","value":123}';
|
|
31
|
+
const result = CleanJSON(input);
|
|
32
|
+
expect(result).not.toBeNull();
|
|
33
|
+
const parsed = JSON.parse(result);
|
|
34
|
+
expect(parsed.name).toBe('test');
|
|
35
|
+
expect(parsed.value).toBe(123);
|
|
36
|
+
});
|
|
37
|
+
it('should handle already-formatted JSON', () => {
|
|
38
|
+
const input = '{\n "name": "test"\n}';
|
|
39
|
+
const result = CleanJSON(input);
|
|
40
|
+
expect(result).not.toBeNull();
|
|
41
|
+
const parsed = JSON.parse(result);
|
|
42
|
+
expect(parsed.name).toBe('test');
|
|
43
|
+
});
|
|
44
|
+
it('should extract JSON from markdown code blocks', () => {
|
|
45
|
+
const input = 'Some text ```json\n{"extracted": true}\n``` more text';
|
|
46
|
+
const result = CleanJSON(input);
|
|
47
|
+
expect(result).not.toBeNull();
|
|
48
|
+
const parsed = JSON.parse(result);
|
|
49
|
+
expect(parsed.extracted).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
it('should handle JSON arrays', () => {
|
|
52
|
+
const input = '[1, 2, 3]';
|
|
53
|
+
const result = CleanJSON(input);
|
|
54
|
+
expect(result).not.toBeNull();
|
|
55
|
+
const parsed = JSON.parse(result);
|
|
56
|
+
expect(parsed).toEqual([1, 2, 3]);
|
|
57
|
+
});
|
|
58
|
+
it('should extract JSON object from mixed content', () => {
|
|
59
|
+
const input = 'Here is the result: {"status": "ok"} and some trailing text';
|
|
60
|
+
const result = CleanJSON(input);
|
|
61
|
+
expect(result).not.toBeNull();
|
|
62
|
+
const parsed = JSON.parse(result);
|
|
63
|
+
expect(parsed.status).toBe('ok');
|
|
64
|
+
});
|
|
65
|
+
it('should handle double-escaped JSON', () => {
|
|
66
|
+
const input = '{\\"name\\": \\"test\\"}';
|
|
67
|
+
const result = CleanJSON(input);
|
|
68
|
+
expect(result).not.toBeNull();
|
|
69
|
+
const parsed = JSON.parse(result);
|
|
70
|
+
expect(parsed.name).toBe('test');
|
|
71
|
+
});
|
|
72
|
+
it('should throw when input has braces but invalid JSON', () => {
|
|
73
|
+
expect(() => CleanJSON('{not valid json}')).toThrow(/Failed to find a path to CleanJSON/);
|
|
74
|
+
});
|
|
75
|
+
it('should return processed string when no braces or brackets present', () => {
|
|
76
|
+
const result = CleanJSON('not json at all without braces');
|
|
77
|
+
expect(result).toBe('not json at all without braces');
|
|
78
|
+
});
|
|
79
|
+
it('should handle nested objects', () => {
|
|
80
|
+
const input = '{"outer": {"inner": "value"}}';
|
|
81
|
+
const result = CleanJSON(input);
|
|
82
|
+
const parsed = JSON.parse(result);
|
|
83
|
+
expect(parsed.outer.inner).toBe('value');
|
|
84
|
+
});
|
|
85
|
+
it('should handle JSON with trailing extra brace by removing it', () => {
|
|
86
|
+
const input = '{"name": "test"}}';
|
|
87
|
+
const result = CleanJSON(input);
|
|
88
|
+
expect(result).not.toBeNull();
|
|
89
|
+
const parsed = JSON.parse(result);
|
|
90
|
+
expect(parsed.name).toBe('test');
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('SafeJSONParse', () => {
|
|
94
|
+
it('should parse valid JSON', () => {
|
|
95
|
+
const result = SafeJSONParse('{"name": "hello"}');
|
|
96
|
+
expect(result).not.toBeNull();
|
|
97
|
+
expect(result.name).toBe('hello');
|
|
98
|
+
});
|
|
99
|
+
it('should return null for invalid JSON', () => {
|
|
100
|
+
const result = SafeJSONParse('not json');
|
|
101
|
+
expect(result).toBeNull();
|
|
102
|
+
});
|
|
103
|
+
it('should return null for empty string', () => {
|
|
104
|
+
expect(SafeJSONParse('')).toBeNull();
|
|
105
|
+
});
|
|
106
|
+
it('should return null for null input', () => {
|
|
107
|
+
expect(SafeJSONParse(null)).toBeNull();
|
|
108
|
+
});
|
|
109
|
+
it('should parse arrays', () => {
|
|
110
|
+
const result = SafeJSONParse('[1, 2, 3]');
|
|
111
|
+
expect(result).toEqual([1, 2, 3]);
|
|
112
|
+
});
|
|
113
|
+
it('should parse primitive types', () => {
|
|
114
|
+
expect(SafeJSONParse('42')).toBe(42);
|
|
115
|
+
expect(SafeJSONParse('true')).toBe(true);
|
|
116
|
+
expect(SafeJSONParse('"hello"')).toBe('hello');
|
|
117
|
+
});
|
|
118
|
+
it('should log errors when logErrors is true', () => {
|
|
119
|
+
const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
120
|
+
SafeJSONParse('invalid', true);
|
|
121
|
+
expect(errorSpy).toHaveBeenCalledWith('Error parsing JSON string:', expect.objectContaining({ message: expect.stringContaining('') }));
|
|
122
|
+
});
|
|
123
|
+
it('should not log errors when logErrors is false', () => {
|
|
124
|
+
const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
125
|
+
SafeJSONParse('invalid', false);
|
|
126
|
+
expect(errorSpy).not.toHaveBeenCalled();
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
describe('CleanAndParseJSON', () => {
|
|
130
|
+
it('should clean and parse valid JSON', () => {
|
|
131
|
+
const result = CleanAndParseJSON('{"key": "value"}');
|
|
132
|
+
expect(result).not.toBeNull();
|
|
133
|
+
expect(result.key).toBe('value');
|
|
134
|
+
});
|
|
135
|
+
it('should handle markdown-wrapped JSON', () => {
|
|
136
|
+
const input = '```json\n{"id": 123}\n```';
|
|
137
|
+
const result = CleanAndParseJSON(input);
|
|
138
|
+
expect(result).not.toBeNull();
|
|
139
|
+
expect(result.id).toBe(123);
|
|
140
|
+
});
|
|
141
|
+
it('should return null for null input', () => {
|
|
142
|
+
expect(CleanAndParseJSON(null)).toBeNull();
|
|
143
|
+
});
|
|
144
|
+
it('should return null for empty string', () => {
|
|
145
|
+
expect(CleanAndParseJSON('')).toBeNull();
|
|
146
|
+
});
|
|
147
|
+
it('should handle double-escaped JSON', () => {
|
|
148
|
+
const input = '{\\"name\\": \\"test\\"}';
|
|
149
|
+
const result = CleanAndParseJSON(input);
|
|
150
|
+
expect(result).not.toBeNull();
|
|
151
|
+
expect(result.name).toBe('test');
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
describe('CopyScalarsAndArrays', () => {
|
|
155
|
+
it('should copy scalar properties', () => {
|
|
156
|
+
const input = { name: 'test', count: 42, flag: true };
|
|
157
|
+
const result = CopyScalarsAndArrays(input);
|
|
158
|
+
expect(result.name).toBe('test');
|
|
159
|
+
expect(result.count).toBe(42);
|
|
160
|
+
expect(result.flag).toBe(true);
|
|
161
|
+
});
|
|
162
|
+
it('should copy array properties', () => {
|
|
163
|
+
const input = { items: [1, 2, 3], tags: ['a', 'b'] };
|
|
164
|
+
const result = CopyScalarsAndArrays(input);
|
|
165
|
+
expect(result.items).toEqual([1, 2, 3]);
|
|
166
|
+
expect(result.tags).toEqual(['a', 'b']);
|
|
167
|
+
// Verify arrays are copied, not referenced
|
|
168
|
+
expect(result.items).not.toBe(input.items);
|
|
169
|
+
});
|
|
170
|
+
it('should copy function properties as scalars (typeof function !== object)', () => {
|
|
171
|
+
const input = { name: 'test', method: () => 'hello' };
|
|
172
|
+
const result = CopyScalarsAndArrays(input);
|
|
173
|
+
expect(result.name).toBe('test');
|
|
174
|
+
// Without circular ref mode, functions pass typeof !== 'object' check and are copied
|
|
175
|
+
expect('method' in result).toBe(true);
|
|
176
|
+
});
|
|
177
|
+
it('should copy null values', () => {
|
|
178
|
+
const input = { nullVal: null, name: 'test' };
|
|
179
|
+
const result = CopyScalarsAndArrays(input);
|
|
180
|
+
expect(result.nullVal).toBeNull();
|
|
181
|
+
expect(result.name).toBe('test');
|
|
182
|
+
});
|
|
183
|
+
it('should recursively copy plain nested objects', () => {
|
|
184
|
+
const input = { outer: { inner: 'deep' } };
|
|
185
|
+
const result = CopyScalarsAndArrays(input);
|
|
186
|
+
expect(result.outer).toBeDefined();
|
|
187
|
+
expect(result.outer.inner).toBe('deep');
|
|
188
|
+
});
|
|
189
|
+
it('should skip non-plain object instances', () => {
|
|
190
|
+
class Custom {
|
|
191
|
+
constructor() {
|
|
192
|
+
this.Value = 42;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const input = { data: new Custom(), name: 'test' };
|
|
196
|
+
const result = CopyScalarsAndArrays(input);
|
|
197
|
+
expect(result.name).toBe('test');
|
|
198
|
+
// Custom class instances are not plain objects, so skipped
|
|
199
|
+
expect('data' in result).toBe(false);
|
|
200
|
+
});
|
|
201
|
+
describe('with resolveCircularReferences', () => {
|
|
202
|
+
it('should handle circular references', () => {
|
|
203
|
+
const obj = { name: 'root' };
|
|
204
|
+
obj['self'] = obj;
|
|
205
|
+
const result = CopyScalarsAndArrays(obj, true);
|
|
206
|
+
expect(result.name).toBe('root');
|
|
207
|
+
expect(result.self).toBe('[Circular Reference]');
|
|
208
|
+
});
|
|
209
|
+
it('should handle Date objects', () => {
|
|
210
|
+
const input = { date: new Date('2025-01-01T00:00:00Z') };
|
|
211
|
+
const result = CopyScalarsAndArrays(input, true);
|
|
212
|
+
expect(result.date).toBe('2025-01-01T00:00:00.000Z');
|
|
213
|
+
});
|
|
214
|
+
it('should handle Error objects', () => {
|
|
215
|
+
const input = { error: new Error('test error') };
|
|
216
|
+
const result = CopyScalarsAndArrays(input, true);
|
|
217
|
+
expect(result.error.name).toBe('Error');
|
|
218
|
+
expect(result.error.message).toBe('test error');
|
|
219
|
+
});
|
|
220
|
+
it('should replace functions with [Function] marker', () => {
|
|
221
|
+
const input = { fn: () => 'hello' };
|
|
222
|
+
const result = CopyScalarsAndArrays(input, true);
|
|
223
|
+
expect(result.fn).toBe('[Function]');
|
|
224
|
+
});
|
|
225
|
+
it('should respect maxDepth', () => {
|
|
226
|
+
const input = { a: { b: { c: { d: 'deep' } } } };
|
|
227
|
+
const result = CopyScalarsAndArrays(input, true, 2);
|
|
228
|
+
// At depth 2 we should hit max depth
|
|
229
|
+
expect(result.a).toBeDefined();
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
describe('convertCamelCaseToHaveSpaces', () => {
|
|
234
|
+
it('should convert simple camelCase', () => {
|
|
235
|
+
expect(convertCamelCaseToHaveSpaces('DatabaseVersion')).toBe('Database Version');
|
|
236
|
+
});
|
|
237
|
+
it('should handle consecutive uppercase letters (acronyms)', () => {
|
|
238
|
+
expect(convertCamelCaseToHaveSpaces('AIAgentLearningCycle')).toBe('AI Agent Learning Cycle');
|
|
239
|
+
});
|
|
240
|
+
it('should return single word unchanged', () => {
|
|
241
|
+
expect(convertCamelCaseToHaveSpaces('Database')).toBe('Database');
|
|
242
|
+
});
|
|
243
|
+
it('should handle all uppercase', () => {
|
|
244
|
+
expect(convertCamelCaseToHaveSpaces('ABC')).toBe('ABC');
|
|
245
|
+
});
|
|
246
|
+
it('should handle single character', () => {
|
|
247
|
+
expect(convertCamelCaseToHaveSpaces('A')).toBe('A');
|
|
248
|
+
});
|
|
249
|
+
it('should handle empty string', () => {
|
|
250
|
+
expect(convertCamelCaseToHaveSpaces('')).toBe('');
|
|
251
|
+
});
|
|
252
|
+
it('should handle lowercase only', () => {
|
|
253
|
+
expect(convertCamelCaseToHaveSpaces('hello')).toBe('hello');
|
|
254
|
+
});
|
|
255
|
+
it('should handle multiple words', () => {
|
|
256
|
+
expect(convertCamelCaseToHaveSpaces('FirstNameLastName')).toBe('First Name Last Name');
|
|
257
|
+
});
|
|
258
|
+
it('should handle acronym at the end', () => {
|
|
259
|
+
expect(convertCamelCaseToHaveSpaces('GetHTMLParser')).toBe('Get HTML Parser');
|
|
260
|
+
});
|
|
261
|
+
it('should handle acronym at the beginning', () => {
|
|
262
|
+
expect(convertCamelCaseToHaveSpaces('HTMLParser')).toBe('HTML Parser');
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
describe('generatePluralName', () => {
|
|
266
|
+
it('should handle regular plurals by adding s', () => {
|
|
267
|
+
expect(generatePluralName('dog')).toBe('dogs');
|
|
268
|
+
expect(generatePluralName('cat')).toBe('cats');
|
|
269
|
+
expect(generatePluralName('book')).toBe('books');
|
|
270
|
+
});
|
|
271
|
+
it('should handle irregular plurals', () => {
|
|
272
|
+
expect(generatePluralName('child')).toBe('children');
|
|
273
|
+
expect(generatePluralName('person')).toBe('people');
|
|
274
|
+
expect(generatePluralName('mouse')).toBe('mice');
|
|
275
|
+
expect(generatePluralName('foot')).toBe('feet');
|
|
276
|
+
expect(generatePluralName('tooth')).toBe('teeth');
|
|
277
|
+
expect(generatePluralName('man')).toBe('men');
|
|
278
|
+
expect(generatePluralName('woman')).toBe('women');
|
|
279
|
+
});
|
|
280
|
+
it('should handle words ending in consonant + y', () => {
|
|
281
|
+
expect(generatePluralName('party')).toBe('parties');
|
|
282
|
+
expect(generatePluralName('city')).toBe('cities');
|
|
283
|
+
expect(generatePluralName('baby')).toBe('babies');
|
|
284
|
+
});
|
|
285
|
+
it('should handle words ending in vowel + y by just adding s', () => {
|
|
286
|
+
expect(generatePluralName('day')).toBe('days');
|
|
287
|
+
expect(generatePluralName('boy')).toBe('boys');
|
|
288
|
+
expect(generatePluralName('key')).toBe('keys');
|
|
289
|
+
});
|
|
290
|
+
it('should handle words ending in ch, sh, x, z by adding es', () => {
|
|
291
|
+
expect(generatePluralName('match')).toBe('matches');
|
|
292
|
+
expect(generatePluralName('wish')).toBe('wishes');
|
|
293
|
+
expect(generatePluralName('box')).toBe('boxes');
|
|
294
|
+
expect(generatePluralName('buzz')).toBe('buzzes');
|
|
295
|
+
});
|
|
296
|
+
it('should treat words ending in s as already plural (getSingularForm detects singular)', () => {
|
|
297
|
+
// 'bus' ends in 's', getSingularForm returns 'bu' (different from 'bus'),
|
|
298
|
+
// so generatePluralName considers 'bus' already plural
|
|
299
|
+
expect(generatePluralName('bus')).toBe('bus');
|
|
300
|
+
});
|
|
301
|
+
it('should detect already-plural words and return them unchanged', () => {
|
|
302
|
+
expect(generatePluralName('dogs')).toBe('dogs');
|
|
303
|
+
expect(generatePluralName('customers')).toBe('customers');
|
|
304
|
+
});
|
|
305
|
+
it('should handle capitalizeFirstLetterOnly option', () => {
|
|
306
|
+
expect(generatePluralName('dog', { capitalizeFirstLetterOnly: true })).toBe('Dogs');
|
|
307
|
+
});
|
|
308
|
+
it('should handle capitalizeEntireWord option', () => {
|
|
309
|
+
expect(generatePluralName('dog', { capitalizeEntireWord: true })).toBe('DOGS');
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
describe('getIrregularPlural', () => {
|
|
313
|
+
it('should return irregular plural for known words', () => {
|
|
314
|
+
expect(getIrregularPlural('child')).toBe('children');
|
|
315
|
+
expect(getIrregularPlural('knife')).toBe('knives');
|
|
316
|
+
expect(getIrregularPlural('leaf')).toBe('leaves');
|
|
317
|
+
});
|
|
318
|
+
it('should be case-insensitive', () => {
|
|
319
|
+
expect(getIrregularPlural('Child')).toBe('children');
|
|
320
|
+
expect(getIrregularPlural('MOUSE')).toBe('mice');
|
|
321
|
+
});
|
|
322
|
+
it('should return null for regular words', () => {
|
|
323
|
+
expect(getIrregularPlural('dog')).toBeNull();
|
|
324
|
+
expect(getIrregularPlural('table')).toBeNull();
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
describe('stripWhitespace', () => {
|
|
328
|
+
it('should remove all spaces', () => {
|
|
329
|
+
expect(stripWhitespace('Hello World')).toBe('HelloWorld');
|
|
330
|
+
});
|
|
331
|
+
it('should remove tabs and newlines', () => {
|
|
332
|
+
expect(stripWhitespace('\tExample\nString ')).toBe('ExampleString');
|
|
333
|
+
});
|
|
334
|
+
it('should handle empty string', () => {
|
|
335
|
+
expect(stripWhitespace('')).toBe('');
|
|
336
|
+
});
|
|
337
|
+
it('should return null or undefined as-is', () => {
|
|
338
|
+
expect(stripWhitespace(null)).toBeNull();
|
|
339
|
+
expect(stripWhitespace(undefined)).toBeUndefined();
|
|
340
|
+
});
|
|
341
|
+
it('should handle string with only whitespace', () => {
|
|
342
|
+
expect(stripWhitespace(' \t\n ')).toBe('');
|
|
343
|
+
});
|
|
344
|
+
it('should handle string with no whitespace', () => {
|
|
345
|
+
expect(stripWhitespace('NoSpaces')).toBe('NoSpaces');
|
|
346
|
+
});
|
|
347
|
+
it('should handle multiple consecutive whitespace types', () => {
|
|
348
|
+
expect(stripWhitespace(' a b c ')).toBe('abc');
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
describe('uuidv4', () => {
|
|
352
|
+
it('should return a string', () => {
|
|
353
|
+
expect(typeof uuidv4()).toBe('string');
|
|
354
|
+
});
|
|
355
|
+
it('should match UUID v4 format', () => {
|
|
356
|
+
const uuid = uuidv4();
|
|
357
|
+
const uuidV4Regex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
358
|
+
expect(uuid).toMatch(uuidV4Regex);
|
|
359
|
+
});
|
|
360
|
+
it('should generate unique values', () => {
|
|
361
|
+
const uuid1 = uuidv4();
|
|
362
|
+
const uuid2 = uuidv4();
|
|
363
|
+
const uuid3 = uuidv4();
|
|
364
|
+
expect(uuid1).not.toBe(uuid2);
|
|
365
|
+
expect(uuid2).not.toBe(uuid3);
|
|
366
|
+
expect(uuid1).not.toBe(uuid3);
|
|
367
|
+
});
|
|
368
|
+
it('should have the correct length', () => {
|
|
369
|
+
const uuid = uuidv4();
|
|
370
|
+
expect(uuid.length).toBe(36);
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
describe('stripTrailingChars', () => {
|
|
374
|
+
it('should strip matching trailing characters', () => {
|
|
375
|
+
expect(stripTrailingChars('example.txt', '.txt', false)).toBe('example');
|
|
376
|
+
});
|
|
377
|
+
it('should not strip when suffix does not match', () => {
|
|
378
|
+
expect(stripTrailingChars('example.csv', '.txt', false)).toBe('example.csv');
|
|
379
|
+
});
|
|
380
|
+
it('should skip stripping on exact match when skipIfExactMatch is true', () => {
|
|
381
|
+
expect(stripTrailingChars('.txt', '.txt', true)).toBe('.txt');
|
|
382
|
+
});
|
|
383
|
+
it('should strip exact match when skipIfExactMatch is false', () => {
|
|
384
|
+
expect(stripTrailingChars('.txt', '.txt', false)).toBe('');
|
|
385
|
+
});
|
|
386
|
+
it('should return input when input is empty', () => {
|
|
387
|
+
expect(stripTrailingChars('', '.txt', false)).toBe('');
|
|
388
|
+
});
|
|
389
|
+
it('should return input when charsToStrip is empty', () => {
|
|
390
|
+
expect(stripTrailingChars('test', '', false)).toBe('test');
|
|
391
|
+
});
|
|
392
|
+
});
|
|
393
|
+
describe('replaceAllSpaces', () => {
|
|
394
|
+
it('should remove all spaces', () => {
|
|
395
|
+
expect(replaceAllSpaces('Hello World')).toBe('HelloWorld');
|
|
396
|
+
});
|
|
397
|
+
it('should handle multiple spaces', () => {
|
|
398
|
+
expect(replaceAllSpaces(' Leading spaces')).toBe('Leadingspaces');
|
|
399
|
+
});
|
|
400
|
+
it('should handle string with no spaces', () => {
|
|
401
|
+
expect(replaceAllSpaces('NoSpaces')).toBe('NoSpaces');
|
|
402
|
+
});
|
|
403
|
+
it('should handle empty string', () => {
|
|
404
|
+
expect(replaceAllSpaces('')).toBe('');
|
|
405
|
+
});
|
|
406
|
+
});
|
|
407
|
+
describe('IsOnlyTimezoneShift', () => {
|
|
408
|
+
it('should return true for a 6-hour timezone shift', () => {
|
|
409
|
+
const d1 = new Date('2025-12-25T10:30:45.123Z');
|
|
410
|
+
const d2 = new Date('2025-12-25T16:30:45.123Z');
|
|
411
|
+
expect(IsOnlyTimezoneShift(d1, d2)).toBe(true);
|
|
412
|
+
});
|
|
413
|
+
it('should return false when milliseconds differ', () => {
|
|
414
|
+
const d1 = new Date('2025-12-25T10:30:45.123Z');
|
|
415
|
+
const d2 = new Date('2025-12-25T16:30:45.124Z');
|
|
416
|
+
expect(IsOnlyTimezoneShift(d1, d2)).toBe(false);
|
|
417
|
+
});
|
|
418
|
+
it('should return false for identical dates', () => {
|
|
419
|
+
const d1 = new Date('2025-12-25T10:30:45.123Z');
|
|
420
|
+
const d2 = new Date('2025-12-25T10:30:45.123Z');
|
|
421
|
+
expect(IsOnlyTimezoneShift(d1, d2)).toBe(false);
|
|
422
|
+
});
|
|
423
|
+
it('should return true for a 1-hour shift', () => {
|
|
424
|
+
const d1 = new Date('2025-12-25T10:00:00.000Z');
|
|
425
|
+
const d2 = new Date('2025-12-25T11:00:00.000Z');
|
|
426
|
+
expect(IsOnlyTimezoneShift(d1, d2)).toBe(true);
|
|
427
|
+
});
|
|
428
|
+
it('should return false for a 24-hour shift', () => {
|
|
429
|
+
const d1 = new Date('2025-12-25T00:00:00.000Z');
|
|
430
|
+
const d2 = new Date('2025-12-26T00:00:00.000Z');
|
|
431
|
+
expect(IsOnlyTimezoneShift(d1, d2)).toBe(false);
|
|
432
|
+
});
|
|
433
|
+
});
|
|
434
|
+
//# sourceMappingURL=util.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.test.js","sourceRoot":"","sources":["../../src/__tests__/util.test.ts"],"names":[],"mappings":"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"}
|