cmpstr 2.0.2 → 3.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/LICENSE +21 -21
- package/README.md +75 -499
- package/dist/CmpStr.esm.js +4863 -0
- package/dist/CmpStr.esm.js.map +1 -0
- package/dist/CmpStr.esm.min.js +8 -0
- package/dist/CmpStr.esm.min.js.map +1 -0
- package/dist/CmpStr.umd.js +4875 -0
- package/dist/CmpStr.umd.js.map +1 -0
- package/dist/CmpStr.umd.min.js +8 -0
- package/dist/CmpStr.umd.min.js.map +1 -0
- package/dist/cjs/CmpStr.js +663 -0
- package/dist/cjs/CmpStr.js.map +1 -0
- package/dist/cjs/CmpStrAsync.js +336 -0
- package/dist/cjs/CmpStrAsync.js.map +1 -0
- package/dist/cjs/index.js +15 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/metric/Cosine.js +101 -0
- package/dist/cjs/metric/Cosine.js.map +1 -0
- package/dist/cjs/metric/DamerauLevenshtein.js +110 -0
- package/dist/cjs/metric/DamerauLevenshtein.js.map +1 -0
- package/dist/cjs/metric/DiceSorensen.js +91 -0
- package/dist/cjs/metric/DiceSorensen.js.map +1 -0
- package/dist/cjs/metric/Hamming.js +82 -0
- package/dist/cjs/metric/Hamming.js.map +1 -0
- package/dist/cjs/metric/Jaccard.js +76 -0
- package/dist/cjs/metric/Jaccard.js.map +1 -0
- package/dist/cjs/metric/JaroWinkler.js +114 -0
- package/dist/cjs/metric/JaroWinkler.js.map +1 -0
- package/dist/cjs/metric/LCS.js +89 -0
- package/dist/cjs/metric/LCS.js.map +1 -0
- package/dist/cjs/metric/Levenshtein.js +94 -0
- package/dist/cjs/metric/Levenshtein.js.map +1 -0
- package/dist/cjs/metric/Metric.js +445 -0
- package/dist/cjs/metric/Metric.js.map +1 -0
- package/dist/cjs/metric/NeedlemanWunsch.js +95 -0
- package/dist/cjs/metric/NeedlemanWunsch.js.map +1 -0
- package/dist/cjs/metric/SmithWaterman.js +98 -0
- package/dist/cjs/metric/SmithWaterman.js.map +1 -0
- package/dist/cjs/metric/qGram.js +91 -0
- package/dist/cjs/metric/qGram.js.map +1 -0
- package/dist/cjs/phonetic/Cologne.js +112 -0
- package/dist/cjs/phonetic/Cologne.js.map +1 -0
- package/dist/cjs/phonetic/Metaphone.js +172 -0
- package/dist/cjs/phonetic/Metaphone.js.map +1 -0
- package/dist/cjs/phonetic/Phonetic.js +413 -0
- package/dist/cjs/phonetic/Phonetic.js.map +1 -0
- package/dist/cjs/phonetic/Soundex.js +135 -0
- package/dist/cjs/phonetic/Soundex.js.map +1 -0
- package/dist/cjs/utils/DeepMerge.js +144 -0
- package/dist/cjs/utils/DeepMerge.js.map +1 -0
- package/dist/cjs/utils/DiffChecker.js +500 -0
- package/dist/cjs/utils/DiffChecker.js.map +1 -0
- package/dist/cjs/utils/Filter.js +189 -0
- package/dist/cjs/utils/Filter.js.map +1 -0
- package/dist/cjs/utils/HashTable.js +175 -0
- package/dist/cjs/utils/HashTable.js.map +1 -0
- package/dist/cjs/utils/Normalizer.js +144 -0
- package/dist/cjs/utils/Normalizer.js.map +1 -0
- package/dist/cjs/utils/Pool.js +196 -0
- package/dist/cjs/utils/Pool.js.map +1 -0
- package/dist/cjs/utils/Profiler.js +229 -0
- package/dist/cjs/utils/Profiler.js.map +1 -0
- package/dist/cjs/utils/Registry.js +148 -0
- package/dist/cjs/utils/Registry.js.map +1 -0
- package/dist/cjs/utils/TextAnalyzer.js +358 -0
- package/dist/cjs/utils/TextAnalyzer.js.map +1 -0
- package/dist/esm/CmpStr.js +662 -0
- package/dist/esm/CmpStr.js.map +1 -0
- package/dist/esm/CmpStrAsync.js +331 -0
- package/dist/esm/CmpStrAsync.js.map +1 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/metric/Cosine.js +99 -0
- package/dist/esm/metric/Cosine.js.map +1 -0
- package/dist/esm/metric/DamerauLevenshtein.js +108 -0
- package/dist/esm/metric/DamerauLevenshtein.js.map +1 -0
- package/dist/esm/metric/DiceSorensen.js +89 -0
- package/dist/esm/metric/DiceSorensen.js.map +1 -0
- package/dist/esm/metric/Hamming.js +77 -0
- package/dist/esm/metric/Hamming.js.map +1 -0
- package/dist/esm/metric/Jaccard.js +74 -0
- package/dist/esm/metric/Jaccard.js.map +1 -0
- package/dist/esm/metric/JaroWinkler.js +112 -0
- package/dist/esm/metric/JaroWinkler.js.map +1 -0
- package/dist/esm/metric/LCS.js +87 -0
- package/dist/esm/metric/LCS.js.map +1 -0
- package/dist/esm/metric/Levenshtein.js +92 -0
- package/dist/esm/metric/Levenshtein.js.map +1 -0
- package/dist/esm/metric/Metric.js +442 -0
- package/dist/esm/metric/Metric.js.map +1 -0
- package/dist/esm/metric/NeedlemanWunsch.js +93 -0
- package/dist/esm/metric/NeedlemanWunsch.js.map +1 -0
- package/dist/esm/metric/SmithWaterman.js +96 -0
- package/dist/esm/metric/SmithWaterman.js.map +1 -0
- package/dist/esm/metric/qGram.js +89 -0
- package/dist/esm/metric/qGram.js.map +1 -0
- package/dist/esm/phonetic/Cologne.js +114 -0
- package/dist/esm/phonetic/Cologne.js.map +1 -0
- package/dist/esm/phonetic/Metaphone.js +174 -0
- package/dist/esm/phonetic/Metaphone.js.map +1 -0
- package/dist/esm/phonetic/Phonetic.js +409 -0
- package/dist/esm/phonetic/Phonetic.js.map +1 -0
- package/dist/esm/phonetic/Soundex.js +137 -0
- package/dist/esm/phonetic/Soundex.js.map +1 -0
- package/dist/esm/utils/DeepMerge.js +139 -0
- package/dist/esm/utils/DeepMerge.js.map +1 -0
- package/dist/esm/utils/DiffChecker.js +498 -0
- package/dist/esm/utils/DiffChecker.js.map +1 -0
- package/dist/esm/utils/Filter.js +187 -0
- package/dist/esm/utils/Filter.js.map +1 -0
- package/dist/esm/utils/HashTable.js +173 -0
- package/dist/esm/utils/HashTable.js.map +1 -0
- package/dist/esm/utils/Normalizer.js +142 -0
- package/dist/esm/utils/Normalizer.js.map +1 -0
- package/dist/esm/utils/Pool.js +194 -0
- package/dist/esm/utils/Pool.js.map +1 -0
- package/dist/esm/utils/Profiler.js +227 -0
- package/dist/esm/utils/Profiler.js.map +1 -0
- package/dist/esm/utils/Registry.js +142 -0
- package/dist/esm/utils/Registry.js.map +1 -0
- package/dist/esm/utils/TextAnalyzer.js +356 -0
- package/dist/esm/utils/TextAnalyzer.js.map +1 -0
- package/dist/types/CmpStr.d.ts +472 -0
- package/dist/types/CmpStrAsync.d.ts +233 -0
- package/dist/types/index.d.ts +51 -0
- package/dist/types/metric/Cosine.d.ts +57 -0
- package/dist/types/metric/DamerauLevenshtein.d.ts +50 -0
- package/dist/types/metric/DiceSorensen.d.ts +57 -0
- package/dist/types/metric/Hamming.d.ts +49 -0
- package/dist/types/metric/Jaccard.d.ts +48 -0
- package/dist/types/metric/JaroWinkler.d.ts +50 -0
- package/dist/types/metric/LCS.d.ts +50 -0
- package/dist/types/metric/Levenshtein.d.ts +50 -0
- package/dist/types/metric/Metric.d.ts +261 -0
- package/dist/types/metric/NeedlemanWunsch.d.ts +47 -0
- package/dist/types/metric/SmithWaterman.d.ts +48 -0
- package/dist/types/metric/index.d.ts +41 -0
- package/dist/types/metric/qGram.d.ts +56 -0
- package/dist/types/phonetic/Cologne.d.ts +46 -0
- package/dist/types/phonetic/Metaphone.d.ts +50 -0
- package/dist/types/phonetic/Phonetic.d.ts +189 -0
- package/dist/types/phonetic/Soundex.d.ts +49 -0
- package/dist/types/phonetic/index.d.ts +30 -0
- package/dist/types/utils/DeepMerge.d.ts +70 -0
- package/dist/types/utils/DiffChecker.d.ts +137 -0
- package/dist/types/utils/Filter.d.ts +97 -0
- package/dist/types/utils/HashTable.d.ts +86 -0
- package/dist/types/utils/Normalizer.d.ts +76 -0
- package/dist/types/utils/Pool.d.ts +63 -0
- package/dist/types/utils/Profiler.d.ts +129 -0
- package/dist/types/utils/Registry.d.ts +57 -0
- package/dist/types/utils/TextAnalyzer.d.ts +199 -0
- package/dist/types/utils/Types.d.ts +313 -0
- package/package.json +62 -49
- package/src/CmpStr.d.ts +0 -70
- package/src/CmpStr.js +0 -912
- package/src/CmpStrAsync.d.ts +0 -19
- package/src/CmpStrAsync.js +0 -204
- package/src/algorithms/cosine.js +0 -86
- package/src/algorithms/damerau.js +0 -78
- package/src/algorithms/dice.js +0 -65
- package/src/algorithms/hamming.js +0 -44
- package/src/algorithms/jaccard.js +0 -34
- package/src/algorithms/jaroWinkler.js +0 -106
- package/src/algorithms/lcs.js +0 -58
- package/src/algorithms/levenshtein.js +0 -70
- package/src/algorithms/needlemanWunsch.js +0 -72
- package/src/algorithms/qGram.js +0 -63
- package/src/algorithms/smithWaterman.js +0 -78
- package/src/algorithms/soundex.js +0 -152
- package/src/index.d.ts +0 -3
- package/src/index.js +0 -47
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
// CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
|
|
2
|
+
/**
|
|
3
|
+
* Pool Utility
|
|
4
|
+
* src/utils/Pool.ts
|
|
5
|
+
*
|
|
6
|
+
* @see https://en.wikipedia.org/wiki/Circular_buffer
|
|
7
|
+
*
|
|
8
|
+
* The Pool class provides a simple and efficient buffer pool for dynamic programming
|
|
9
|
+
* algorithms that require temporary arrays (such as Levenshtein, LCS, etc.).
|
|
10
|
+
* By reusing pre-allocated typed arrays, it reduces memory allocations and garbage
|
|
11
|
+
* collection overhead, especially for repeated or batch computations.
|
|
12
|
+
*
|
|
13
|
+
* It supports different types of buffers (Uint16Array, number[], Set, Map) and allows
|
|
14
|
+
* for acquiring buffers of specific sizes while managing a maximum pool size.
|
|
15
|
+
*
|
|
16
|
+
* @module Utils/Pool
|
|
17
|
+
* @author Paul Köhler (komed3)
|
|
18
|
+
* @license MIT
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* RingPool is a circular buffer implementation that manages a pool of buffers.
|
|
22
|
+
*
|
|
23
|
+
* It allows for efficient acquisition and release of buffers, ensuring that
|
|
24
|
+
* buffers are reused without unnecessary allocations.
|
|
25
|
+
*
|
|
26
|
+
* @template T - The type of buffers managed by the pool
|
|
27
|
+
*/
|
|
28
|
+
class RingPool {
|
|
29
|
+
maxSize;
|
|
30
|
+
// The buffers in the pool
|
|
31
|
+
buffers = [];
|
|
32
|
+
// The current pointer for acquiring buffers
|
|
33
|
+
pointer = 0;
|
|
34
|
+
/**
|
|
35
|
+
* Creates a new RingPool with a specified maximum size.
|
|
36
|
+
*
|
|
37
|
+
* @param {number} maxSize - The maximum number of buffers that can be stored in the pool
|
|
38
|
+
*/
|
|
39
|
+
constructor(maxSize) {
|
|
40
|
+
this.maxSize = maxSize;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Acquires a buffer of at least the specified minimum size from the pool.
|
|
44
|
+
*
|
|
45
|
+
* @param {number} minSize - The minimum size of the buffer to acquire
|
|
46
|
+
* @param {boolean} allowOversize - Whether to allow buffers larger than minSize
|
|
47
|
+
* @return {PoolBuffer<T>|null} - The acquired buffer or null if no suitable buffer is found
|
|
48
|
+
*/
|
|
49
|
+
acquire(minSize, allowOversize) {
|
|
50
|
+
const len = this.buffers.length;
|
|
51
|
+
// Iterate through the buffers in the pool
|
|
52
|
+
for (let i = 0; i < len; i++) {
|
|
53
|
+
const idx = (this.pointer + i) % len;
|
|
54
|
+
const item = this.buffers[idx];
|
|
55
|
+
// Check if the item size is greater than or equal to the minimum size
|
|
56
|
+
if (item.size >= minSize) {
|
|
57
|
+
// Set the pointer to the next position
|
|
58
|
+
this.pointer = (idx + 1) % len;
|
|
59
|
+
// If the item size is equal to minSize or oversize is allowed, return the item
|
|
60
|
+
return allowOversize || item.size === minSize ? item : null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// If no suitable buffer is found, return null
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Releases a buffer back to the pool.
|
|
68
|
+
* If the pool is full, it replaces the oldest buffer with the new one.
|
|
69
|
+
*
|
|
70
|
+
* @param {PoolBuffer<T>} item - The buffer to release back to the pool
|
|
71
|
+
*/
|
|
72
|
+
release(item) {
|
|
73
|
+
if (this.buffers.length < this.maxSize) {
|
|
74
|
+
// If the pool is not full, simply add the item
|
|
75
|
+
this.buffers.push(item);
|
|
76
|
+
} else {
|
|
77
|
+
// If the pool is full, replace the oldest buffer
|
|
78
|
+
this.buffers[this.pointer] = item;
|
|
79
|
+
this.pointer = (this.pointer + 1) % this.maxSize;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Clears the pool, removing all buffers.
|
|
84
|
+
* This resets the pointer and empties the buffer list.
|
|
85
|
+
*/
|
|
86
|
+
clear() {
|
|
87
|
+
this.buffers = [];
|
|
88
|
+
this.pointer = 0;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The Pool class provides a buffer pool for dynamic programming algorithms.
|
|
93
|
+
*
|
|
94
|
+
* It allows for efficient reuse of buffers (Uint16Array, number[], Set, Map)
|
|
95
|
+
* to reduce memory allocations and garbage collection overhead.
|
|
96
|
+
*/
|
|
97
|
+
class Pool {
|
|
98
|
+
// Pool Types
|
|
99
|
+
static CONFIG = {
|
|
100
|
+
uint16: {
|
|
101
|
+
type: 'uint16',
|
|
102
|
+
maxSize: 32,
|
|
103
|
+
maxItemSize: 2048,
|
|
104
|
+
allowOversize: true
|
|
105
|
+
},
|
|
106
|
+
'number[]': {
|
|
107
|
+
type: 'number[]',
|
|
108
|
+
maxSize: 16,
|
|
109
|
+
maxItemSize: 1024,
|
|
110
|
+
allowOversize: false
|
|
111
|
+
},
|
|
112
|
+
set: { type: 'set', maxSize: 8, maxItemSize: 0, allowOversize: false },
|
|
113
|
+
map: { type: 'map', maxSize: 8, maxItemSize: 0, allowOversize: false }
|
|
114
|
+
};
|
|
115
|
+
// Pool Rings for each type
|
|
116
|
+
static POOLS = {
|
|
117
|
+
uint16: new RingPool(32),
|
|
118
|
+
'number[]': new RingPool(16),
|
|
119
|
+
set: new RingPool(8),
|
|
120
|
+
map: new RingPool(8)
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* Allocates a new buffer of the specified type and size.
|
|
124
|
+
*
|
|
125
|
+
* @param {PoolType} type - The type of buffer to allocate
|
|
126
|
+
* @param {number} size - The size of the buffer to allocate
|
|
127
|
+
* @return {any} - The newly allocated buffer
|
|
128
|
+
*/
|
|
129
|
+
static allocate(type, size) {
|
|
130
|
+
switch (type) {
|
|
131
|
+
case 'uint16':
|
|
132
|
+
return new Uint16Array(size);
|
|
133
|
+
case 'number[]':
|
|
134
|
+
return new Array(size).fill(0);
|
|
135
|
+
case 'set':
|
|
136
|
+
return new Set();
|
|
137
|
+
case 'map':
|
|
138
|
+
return new Map();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Acquires a buffer of the specified type and size from the pool.
|
|
143
|
+
* If no suitable buffer is available, it allocates a new one.
|
|
144
|
+
*
|
|
145
|
+
* @param {PoolType} type - The type of buffer to acquire (e.g., 'uint16', 'number[]', 'set', 'map')
|
|
146
|
+
* @param {number} size - The size of the buffer to acquire
|
|
147
|
+
* @return {T} - The acquired buffer of the specified type
|
|
148
|
+
*/
|
|
149
|
+
static acquire(type, size) {
|
|
150
|
+
// Get the configuration for the specified type
|
|
151
|
+
const CONFIG = this.CONFIG[type];
|
|
152
|
+
// If the requested size exceeds the maximum item size, allocate a new buffer
|
|
153
|
+
if (size > CONFIG.maxItemSize) return this.allocate(type, size);
|
|
154
|
+
// Try to acquire a buffer from the pool ring
|
|
155
|
+
// If a suitable buffer is found, return it (subarray for uint16)
|
|
156
|
+
const item = this.POOLS[type].acquire(size, CONFIG.allowOversize);
|
|
157
|
+
if (item) {
|
|
158
|
+
// If the type is 'uint16', return a subarray of the buffer
|
|
159
|
+
return type === 'uint16' ? item.buffer.subarray(0, size) : item.buffer;
|
|
160
|
+
}
|
|
161
|
+
// If no suitable buffer is found, allocate a new one
|
|
162
|
+
return this.allocate(type, size);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Acquires multiple buffers of the specified type and sizes from the pool.
|
|
166
|
+
*
|
|
167
|
+
* @param {PoolType} type - The type of buffers to acquire
|
|
168
|
+
* @param {number[]} sizes - An array of sizes for each buffer to acquire
|
|
169
|
+
* @return {T[]} - An array of acquired buffers of the specified type
|
|
170
|
+
*/
|
|
171
|
+
static acquireMany(type, sizes) {
|
|
172
|
+
return sizes.map((size) => this.acquire(type, size));
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Releases a buffer back to the pool.
|
|
176
|
+
* If the size of the buffer is larger than the maximum item size, it will not be released.
|
|
177
|
+
*
|
|
178
|
+
* @param {PoolType} type - The type of buffer to release
|
|
179
|
+
* @param {T} buffer - The buffer to release
|
|
180
|
+
* @param {number} size - The size of the buffer
|
|
181
|
+
*/
|
|
182
|
+
static release(type, buffer, size) {
|
|
183
|
+
// Get the configuration for the specified type
|
|
184
|
+
const CONFIG = this.CONFIG[type];
|
|
185
|
+
// If the size of the buffer is less than or equal to the maximum item size, release it
|
|
186
|
+
if (size <= CONFIG.maxItemSize) {
|
|
187
|
+
// Release the buffer back to the pool ring
|
|
188
|
+
this.POOLS[type].release({ buffer, size });
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export { Pool };
|
|
194
|
+
//# sourceMappingURL=Pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pool.js","sources":["../../../src/utils/Pool.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
// CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
|
|
2
|
+
/**
|
|
3
|
+
* Profiler Utility
|
|
4
|
+
* src/utils/profiler.ts
|
|
5
|
+
*
|
|
6
|
+
* @see https://en.wikipedia.org/wiki/Profiling_(computer_programming)
|
|
7
|
+
*
|
|
8
|
+
* This class provides methods to run synchronous and asynchronous functions, capturing
|
|
9
|
+
* their execution time and memory usage, and storing the results in a set of profiler
|
|
10
|
+
* entries. It supports both Node.js and browser environments, detecting the environment
|
|
11
|
+
* automatically.
|
|
12
|
+
*
|
|
13
|
+
* The class is optimized for minimal overhead and can be used for fine-grained
|
|
14
|
+
* performance profiling.
|
|
15
|
+
*
|
|
16
|
+
* @module Utils/Profiler
|
|
17
|
+
* @author Paul Köhler (komed3)
|
|
18
|
+
* @license MIT
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Profiler class for measuring execution time and memory usage of functions.
|
|
22
|
+
*/
|
|
23
|
+
class Profiler {
|
|
24
|
+
// Environment detection
|
|
25
|
+
static ENV;
|
|
26
|
+
// Singleton instance
|
|
27
|
+
static instance;
|
|
28
|
+
// Store for profiler entries
|
|
29
|
+
store = new Set();
|
|
30
|
+
// Total time and memory consumption
|
|
31
|
+
totalTime = 0;
|
|
32
|
+
totalMem = 0;
|
|
33
|
+
// The Profiler active state
|
|
34
|
+
active;
|
|
35
|
+
/**
|
|
36
|
+
* Sets the environment based on the available global objects.
|
|
37
|
+
* Detects if running in Node.js or browser and sets the ENV property accordingly.
|
|
38
|
+
*/
|
|
39
|
+
static detectEnv() {
|
|
40
|
+
// Check for Node.js environment
|
|
41
|
+
if (typeof process !== 'undefined') Profiler.ENV = 'nodejs';
|
|
42
|
+
// Check for browser environment
|
|
43
|
+
else if (typeof performance !== 'undefined') Profiler.ENV = 'browser';
|
|
44
|
+
// If neither, set ENV to unknown
|
|
45
|
+
else Profiler.ENV = 'unknown';
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Returns the singleton instance of the Perf class.
|
|
49
|
+
* If the instance does not exist, it creates a new one.
|
|
50
|
+
*
|
|
51
|
+
* @param {boolean} [enable=false] - Optional parameter to enable the profiler upon instantiation
|
|
52
|
+
* @returns {Profiler} - Singleton Profiler instance
|
|
53
|
+
*/
|
|
54
|
+
static getInstance(enable) {
|
|
55
|
+
// Ensure the environment is detected
|
|
56
|
+
if (!Profiler.ENV) Profiler.detectEnv();
|
|
57
|
+
// If instance does not exist, create a new one
|
|
58
|
+
if (!Profiler.instance) Profiler.instance = new Profiler(enable);
|
|
59
|
+
// Return singleton instance
|
|
60
|
+
return Profiler.instance;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Private constructor to enforce singleton pattern.
|
|
64
|
+
* Initializes the store for profiler entries.
|
|
65
|
+
*
|
|
66
|
+
* @param {boolean} [enable=false] - Optional parameter to enable the profiler
|
|
67
|
+
*/
|
|
68
|
+
constructor(enable) {
|
|
69
|
+
this.active = enable ?? false;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Gets the current time based on the environment.
|
|
73
|
+
*
|
|
74
|
+
* Uses process.hrtime.bigint() for Node.js, performance.now() for browsers,
|
|
75
|
+
* and Date.now() as a fallback.
|
|
76
|
+
*
|
|
77
|
+
* @returns {number} - Current time in milliseconds
|
|
78
|
+
*/
|
|
79
|
+
now() {
|
|
80
|
+
switch (Profiler.ENV) {
|
|
81
|
+
// Node.js environment
|
|
82
|
+
case 'nodejs':
|
|
83
|
+
return Number(process.hrtime.bigint()) / 1e6;
|
|
84
|
+
// Browser environment
|
|
85
|
+
case 'browser':
|
|
86
|
+
return performance.now();
|
|
87
|
+
// Fallback
|
|
88
|
+
default:
|
|
89
|
+
return Date.now();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Gets the current memory usage based on the environment.
|
|
94
|
+
*
|
|
95
|
+
* Uses process.memoryUsage().heapUsed for Node.js, performance.memory.usedJSHeapSize
|
|
96
|
+
* for browsers, and returns 0 as a fallback.
|
|
97
|
+
*
|
|
98
|
+
* @returns {number} - Current memory usage in bytes
|
|
99
|
+
*/
|
|
100
|
+
mem() {
|
|
101
|
+
switch (Profiler.ENV) {
|
|
102
|
+
// Node.js environment
|
|
103
|
+
case 'nodejs':
|
|
104
|
+
return process.memoryUsage().heapUsed;
|
|
105
|
+
// Browser environment
|
|
106
|
+
case 'browser':
|
|
107
|
+
return performance.memory?.usedJSHeapSize ?? 0;
|
|
108
|
+
// Fallback
|
|
109
|
+
default:
|
|
110
|
+
return 0;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Enables the profiler.
|
|
115
|
+
* Sets the active state to true, allowing profiling to occur.
|
|
116
|
+
*/
|
|
117
|
+
enable() {
|
|
118
|
+
this.active = true;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Disables the profiler.
|
|
122
|
+
* Sets the active state to false, preventing further profiling.
|
|
123
|
+
*/
|
|
124
|
+
disable() {
|
|
125
|
+
this.active = false;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Resets the profiler by clearing the store, total time and memory consumption.
|
|
129
|
+
* This method is useful for starting a new profiling session.
|
|
130
|
+
*/
|
|
131
|
+
clear() {
|
|
132
|
+
this.store.clear();
|
|
133
|
+
this.totalTime = 0;
|
|
134
|
+
this.totalMem = 0;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Runs a synchronous function and profiles its execution time and memory usage.
|
|
138
|
+
* If the profiler is not active, it simply executes the function without profiling.
|
|
139
|
+
*
|
|
140
|
+
* @param {() => T} fn - Function to be executed and profiled
|
|
141
|
+
* @param {Record<string, any>} meta - Metadata to be associated with the profiling entry
|
|
142
|
+
* @returns {T} - The result of the executed function
|
|
143
|
+
*/
|
|
144
|
+
run(fn, meta = {}) {
|
|
145
|
+
// If the profiler is not active, simply execute the function without profiling
|
|
146
|
+
if (!this.active) return fn();
|
|
147
|
+
// Capture the start time and memory usage
|
|
148
|
+
const startTime = this.now(),
|
|
149
|
+
startMem = this.mem();
|
|
150
|
+
// Execute the function and capture the result
|
|
151
|
+
const res = fn();
|
|
152
|
+
// Calculate the time and memory consumption
|
|
153
|
+
const deltaTime = this.now() - startTime;
|
|
154
|
+
const deltaMem = this.mem() - startMem;
|
|
155
|
+
// Add the profiling entry to the store
|
|
156
|
+
this.store.add({ time: deltaTime, mem: deltaMem, res, meta });
|
|
157
|
+
(this.totalTime += deltaTime), (this.totalMem += deltaMem);
|
|
158
|
+
// Return the result of the function
|
|
159
|
+
return res;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Runs an asynchronous function and profiles its execution time and memory usage.
|
|
163
|
+
* If the profiler is not active, it simply executes the function without profiling.
|
|
164
|
+
*
|
|
165
|
+
* @param {() => Promise<T>} fn - Asynchronous function to be executed and profiled
|
|
166
|
+
* @param {Record<string, any>} meta - Metadata to be associated with the profiling entry
|
|
167
|
+
* @returns {Promise<T>} - A promise that resolves to the result of the executed function
|
|
168
|
+
*/
|
|
169
|
+
async runAsync(fn, meta = {}) {
|
|
170
|
+
// If the profiler is not active, simply execute the function without profiling
|
|
171
|
+
if (!this.active) return await fn();
|
|
172
|
+
// Capture the start time and memory usage
|
|
173
|
+
const startTime = this.now(),
|
|
174
|
+
startMem = this.mem();
|
|
175
|
+
// Execute the asynchronous function and wait for its result
|
|
176
|
+
const res = await fn();
|
|
177
|
+
// Calculate the time and memory consumption
|
|
178
|
+
const deltaTime = this.now() - startTime;
|
|
179
|
+
const deltaMem = this.mem() - startMem;
|
|
180
|
+
// Add the profiling entry to the store
|
|
181
|
+
this.store.add({ time: deltaTime, mem: deltaMem, res, meta });
|
|
182
|
+
(this.totalTime += deltaTime), (this.totalMem += deltaMem);
|
|
183
|
+
// Return the result of the function
|
|
184
|
+
return res;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Retrieves all profiler entries stored in the profiler.
|
|
188
|
+
*
|
|
189
|
+
* @returns {ProfilerEntry<any>[]} - An array of profiler entries
|
|
190
|
+
*/
|
|
191
|
+
getAll() {
|
|
192
|
+
return [...this.store];
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Retrieves the last profiler entry stored in the profiler.
|
|
196
|
+
*
|
|
197
|
+
* @returns {ProfilerEntry<any> | undefined} - The last profiler entry or undefined if no entries exist
|
|
198
|
+
*/
|
|
199
|
+
getLast() {
|
|
200
|
+
return this.getAll().pop();
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Retrieves the total time and memory consumption recorded by the profiler.
|
|
204
|
+
*
|
|
205
|
+
* @returns {{ time: number, mem: number }} - An object containing total time and memory usage
|
|
206
|
+
*/
|
|
207
|
+
getTotal() {
|
|
208
|
+
return { time: this.totalTime, mem: this.totalMem };
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Returns the services provided by the Profiler class.
|
|
212
|
+
* This allows for easy access to the profiler's methods.
|
|
213
|
+
*
|
|
214
|
+
* @returns {ProfilerService<any>} - An object containing methods to control the profiler
|
|
215
|
+
*/
|
|
216
|
+
services = {
|
|
217
|
+
enable: this.enable.bind(this),
|
|
218
|
+
disable: this.disable.bind(this),
|
|
219
|
+
clear: this.clear.bind(this),
|
|
220
|
+
report: this.getAll.bind(this),
|
|
221
|
+
last: this.getLast.bind(this),
|
|
222
|
+
total: this.getTotal.bind(this)
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export { Profiler };
|
|
227
|
+
//# sourceMappingURL=Profiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Profiler.js","sources":["../../../src/utils/Profiler.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
|
|
2
|
+
/**
|
|
3
|
+
* Registry Utility
|
|
4
|
+
* src/utils/Registry.ts
|
|
5
|
+
*
|
|
6
|
+
* This module provides a Registry function that allows for registering,
|
|
7
|
+
* removing, checking, getting, and listing class constructors.
|
|
8
|
+
*
|
|
9
|
+
* It is designed to manage class extensions, ensuring that all registered
|
|
10
|
+
* classes extend a specified base constructor.
|
|
11
|
+
*
|
|
12
|
+
* @module Utils/Registry
|
|
13
|
+
* @author Paul Köhler (komed3)
|
|
14
|
+
* @license MIT
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Global registry object to hold multiple registries.
|
|
18
|
+
* Each registry is keyed by a string identifier.
|
|
19
|
+
*
|
|
20
|
+
* @type {Record<string, RegistryService<any>>}
|
|
21
|
+
*/
|
|
22
|
+
const registry = Object.create(null);
|
|
23
|
+
/**
|
|
24
|
+
* Factory object to hold factory functions for creating instances.
|
|
25
|
+
* This is used to create instances of registered classes.
|
|
26
|
+
*
|
|
27
|
+
* @type {Record<string, ( cls: string, ...args: any[] ) => InstanceType<any>>}
|
|
28
|
+
*/
|
|
29
|
+
const factory = Object.create(null);
|
|
30
|
+
/**
|
|
31
|
+
* Registry function to create a service for managing class constructors.
|
|
32
|
+
*
|
|
33
|
+
* @param {string} reg - The name of the registry
|
|
34
|
+
* @param {RegistryConstructor<T>} ctor - The base constructor that all registered classes must extend
|
|
35
|
+
* @returns {RegistryService<T>} - An object with methods to register, remove, check, get, and list classes
|
|
36
|
+
* @throws {Error} If the registry already exists (overwriting is forbidden)
|
|
37
|
+
*/
|
|
38
|
+
function Registry(reg, ctor) {
|
|
39
|
+
// Throws an error if the registry already exists
|
|
40
|
+
if (reg in registry || reg in factory)
|
|
41
|
+
throw new Error(
|
|
42
|
+
`registry <${reg}> already exists / overwriting is forbidden`
|
|
43
|
+
);
|
|
44
|
+
// Create a registry object to hold class constructors
|
|
45
|
+
const classes = Object.create(null);
|
|
46
|
+
const service = {
|
|
47
|
+
/**
|
|
48
|
+
* Register a new extension of the base class.
|
|
49
|
+
*
|
|
50
|
+
* @param {string} name - The name of the class to register
|
|
51
|
+
* @param {RegistryConstructor<T>} cls - The class constructor
|
|
52
|
+
* @param {boolean} [update=false] - Whether to allow overwriting an existing entry
|
|
53
|
+
* @throws {TypeError} If the class does not extend the base constructor
|
|
54
|
+
* @throws {Error} If the class name already exists and update is false
|
|
55
|
+
*/
|
|
56
|
+
add(name, cls, update = false) {
|
|
57
|
+
if (!(cls.prototype instanceof ctor))
|
|
58
|
+
throw new TypeError(`class must extend <${reg}>`);
|
|
59
|
+
if (!update && name in classes)
|
|
60
|
+
throw new Error(
|
|
61
|
+
`entry <${name}> already exists / use <update=true> to overwrite`
|
|
62
|
+
);
|
|
63
|
+
classes[name] = cls;
|
|
64
|
+
},
|
|
65
|
+
/**
|
|
66
|
+
* Remove a class from the registry.
|
|
67
|
+
*
|
|
68
|
+
* @param {string} name - The name of the class to remove
|
|
69
|
+
*/
|
|
70
|
+
remove(name) {
|
|
71
|
+
delete classes[name];
|
|
72
|
+
},
|
|
73
|
+
/**
|
|
74
|
+
* Check if a class is registered.
|
|
75
|
+
*
|
|
76
|
+
* @param {string} name - The name of the class to check
|
|
77
|
+
* @returns {boolean} - True if the class is registered, false otherwise
|
|
78
|
+
*/
|
|
79
|
+
has(name) {
|
|
80
|
+
return name in classes;
|
|
81
|
+
},
|
|
82
|
+
/**
|
|
83
|
+
* List all registered class names.
|
|
84
|
+
*
|
|
85
|
+
* @returns {string[]} - An array of registered class names
|
|
86
|
+
*/
|
|
87
|
+
list() {
|
|
88
|
+
return Object.keys(classes);
|
|
89
|
+
},
|
|
90
|
+
/**
|
|
91
|
+
* Get a registered class by name.
|
|
92
|
+
*
|
|
93
|
+
* @param {string} name - The name of the class to retrieve
|
|
94
|
+
* @returns {RegistryConstructor<T>} - The class constructor
|
|
95
|
+
* @throws {Error} If the class is not registered
|
|
96
|
+
*/
|
|
97
|
+
get(name) {
|
|
98
|
+
if (!(name in classes))
|
|
99
|
+
throw new Error(`class <${name}> not registered for <${reg}>`);
|
|
100
|
+
return classes[name];
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
// Register the service in the global registry
|
|
104
|
+
registry[reg] = service;
|
|
105
|
+
// Create a factory function for creating instances from the registry
|
|
106
|
+
factory[reg] = (cls, ...args) => createFromRegistry(reg, cls, ...args);
|
|
107
|
+
// Return the service object
|
|
108
|
+
return service;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Resolve a class constructor from a specific registry.
|
|
112
|
+
*
|
|
113
|
+
* @param {string} reg - The name of the registry
|
|
114
|
+
* @param {T|string} cls - The class itself or name of the class to resolve
|
|
115
|
+
* @returns {T|undefined} - The class constructor if found, otherwise undefined
|
|
116
|
+
* @throws {ReferenceError} If the registry does not exist
|
|
117
|
+
*/
|
|
118
|
+
function resolveCls(reg, cls) {
|
|
119
|
+
if (!(reg in registry))
|
|
120
|
+
throw new ReferenceError(`registry <${reg}> does not exist`);
|
|
121
|
+
return typeof cls === 'string' ? registry[reg]?.get(cls) : cls;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Create an instance of a class from a specific registry.
|
|
125
|
+
*
|
|
126
|
+
* @param {string} reg - The name of the registry
|
|
127
|
+
* @param {T|string} cls - The class itself or name of the class to instantiate
|
|
128
|
+
* @param {...any} args - Arguments to pass to the class constructor
|
|
129
|
+
* @returns {T} - An instance of the class
|
|
130
|
+
* @throws {Error} If the class cannot be instantiated
|
|
131
|
+
*/
|
|
132
|
+
function createFromRegistry(reg, cls, ...args) {
|
|
133
|
+
cls = resolveCls(reg, cls);
|
|
134
|
+
try {
|
|
135
|
+
return new cls(...args);
|
|
136
|
+
} catch (err) {
|
|
137
|
+
throw new Error(`cannot instantiate class <${cls}>`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export { Registry, createFromRegistry, factory, registry, resolveCls };
|
|
142
|
+
//# sourceMappingURL=Registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Registry.js","sources":["../../../src/utils/Registry.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|