cmpstr 3.2.1 → 3.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -18
- package/dist/CmpStr.esm.js +485 -220
- package/dist/CmpStr.esm.min.js +2 -3
- package/dist/CmpStr.umd.js +484 -220
- package/dist/CmpStr.umd.min.js +2 -3
- package/dist/cjs/CmpStr.cjs +57 -36
- package/dist/cjs/CmpStrAsync.cjs +30 -24
- package/dist/cjs/index.cjs +1 -2
- package/dist/cjs/metric/Cosine.cjs +1 -2
- package/dist/cjs/metric/DamerauLevenshtein.cjs +1 -2
- package/dist/cjs/metric/DiceSorensen.cjs +1 -2
- package/dist/cjs/metric/Hamming.cjs +5 -4
- package/dist/cjs/metric/Jaccard.cjs +1 -2
- package/dist/cjs/metric/JaroWinkler.cjs +1 -2
- package/dist/cjs/metric/LCS.cjs +1 -2
- package/dist/cjs/metric/Levenshtein.cjs +1 -2
- package/dist/cjs/metric/Metric.cjs +57 -38
- package/dist/cjs/metric/NeedlemanWunsch.cjs +1 -2
- package/dist/cjs/metric/QGram.cjs +1 -2
- package/dist/cjs/metric/SmithWaterman.cjs +1 -2
- package/dist/cjs/phonetic/Caverphone.cjs +1 -2
- package/dist/cjs/phonetic/Cologne.cjs +1 -2
- package/dist/cjs/phonetic/Metaphone.cjs +1 -2
- package/dist/cjs/phonetic/Phonetic.cjs +55 -35
- package/dist/cjs/phonetic/Soundex.cjs +1 -2
- package/dist/cjs/root.cjs +3 -2
- package/dist/cjs/utils/DeepMerge.cjs +10 -5
- package/dist/cjs/utils/DiffChecker.cjs +1 -2
- package/dist/cjs/utils/Errors.cjs +103 -0
- package/dist/cjs/utils/Filter.cjs +52 -27
- package/dist/cjs/utils/HashTable.cjs +1 -2
- package/dist/cjs/utils/Normalizer.cjs +54 -34
- package/dist/cjs/utils/Pool.cjs +42 -18
- package/dist/cjs/utils/Profiler.cjs +1 -2
- package/dist/cjs/utils/Registry.cjs +46 -22
- package/dist/cjs/utils/StructuredData.cjs +13 -5
- package/dist/cjs/utils/TextAnalyzer.cjs +1 -2
- package/dist/esm/CmpStr.mjs +55 -32
- package/dist/esm/CmpStrAsync.mjs +26 -20
- package/dist/esm/index.mjs +1 -2
- package/dist/esm/metric/Cosine.mjs +1 -2
- package/dist/esm/metric/DamerauLevenshtein.mjs +1 -2
- package/dist/esm/metric/DiceSorensen.mjs +1 -2
- package/dist/esm/metric/Hamming.mjs +5 -4
- package/dist/esm/metric/Jaccard.mjs +1 -2
- package/dist/esm/metric/JaroWinkler.mjs +1 -2
- package/dist/esm/metric/LCS.mjs +1 -2
- package/dist/esm/metric/Levenshtein.mjs +1 -2
- package/dist/esm/metric/Metric.mjs +59 -38
- package/dist/esm/metric/NeedlemanWunsch.mjs +1 -2
- package/dist/esm/metric/QGram.mjs +1 -2
- package/dist/esm/metric/SmithWaterman.mjs +1 -2
- package/dist/esm/phonetic/Caverphone.mjs +1 -2
- package/dist/esm/phonetic/Cologne.mjs +1 -2
- package/dist/esm/phonetic/Metaphone.mjs +1 -2
- package/dist/esm/phonetic/Phonetic.mjs +55 -35
- package/dist/esm/phonetic/Soundex.mjs +1 -2
- package/dist/esm/root.mjs +3 -2
- package/dist/esm/utils/DeepMerge.mjs +10 -5
- package/dist/esm/utils/DiffChecker.mjs +1 -2
- package/dist/esm/utils/Errors.mjs +103 -0
- package/dist/esm/utils/Filter.mjs +52 -27
- package/dist/esm/utils/HashTable.mjs +1 -2
- package/dist/esm/utils/Normalizer.mjs +54 -34
- package/dist/esm/utils/Pool.mjs +38 -18
- package/dist/esm/utils/Profiler.mjs +1 -2
- package/dist/esm/utils/Registry.mjs +46 -22
- package/dist/esm/utils/StructuredData.mjs +13 -5
- package/dist/esm/utils/TextAnalyzer.mjs +1 -2
- package/dist/types/CmpStr.d.ts +5 -1
- package/dist/types/CmpStrAsync.d.ts +1 -0
- package/dist/types/index.d.ts +3 -2
- package/dist/types/metric/Metric.d.ts +6 -5
- package/dist/types/phonetic/Phonetic.d.ts +3 -1
- package/dist/types/root.d.ts +2 -1
- package/dist/types/utils/DeepMerge.d.ts +1 -1
- package/dist/types/utils/Errors.d.ts +137 -0
- package/dist/types/utils/Filter.d.ts +4 -0
- package/dist/types/utils/Normalizer.d.ts +3 -0
- package/dist/types/utils/Pool.d.ts +2 -0
- package/dist/types/utils/Registry.d.ts +3 -3
- package/dist/types/utils/StructuredData.d.ts +3 -1
- package/dist/types/utils/Types.d.ts +26 -0
- package/package.json +7 -7
- package/dist/CmpStr.esm.js.map +0 -1
- package/dist/CmpStr.esm.min.js.map +0 -1
- package/dist/CmpStr.umd.js.map +0 -1
- package/dist/CmpStr.umd.min.js.map +0 -1
- package/dist/cjs/CmpStr.cjs.map +0 -1
- package/dist/cjs/CmpStrAsync.cjs.map +0 -1
- package/dist/cjs/index.cjs.map +0 -1
- package/dist/cjs/metric/Cosine.cjs.map +0 -1
- package/dist/cjs/metric/DamerauLevenshtein.cjs.map +0 -1
- package/dist/cjs/metric/DiceSorensen.cjs.map +0 -1
- package/dist/cjs/metric/Hamming.cjs.map +0 -1
- package/dist/cjs/metric/Jaccard.cjs.map +0 -1
- package/dist/cjs/metric/JaroWinkler.cjs.map +0 -1
- package/dist/cjs/metric/LCS.cjs.map +0 -1
- package/dist/cjs/metric/Levenshtein.cjs.map +0 -1
- package/dist/cjs/metric/Metric.cjs.map +0 -1
- package/dist/cjs/metric/NeedlemanWunsch.cjs.map +0 -1
- package/dist/cjs/metric/QGram.cjs.map +0 -1
- package/dist/cjs/metric/SmithWaterman.cjs.map +0 -1
- package/dist/cjs/phonetic/Caverphone.cjs.map +0 -1
- package/dist/cjs/phonetic/Cologne.cjs.map +0 -1
- package/dist/cjs/phonetic/Metaphone.cjs.map +0 -1
- package/dist/cjs/phonetic/Phonetic.cjs.map +0 -1
- package/dist/cjs/phonetic/Soundex.cjs.map +0 -1
- package/dist/cjs/root.cjs.map +0 -1
- package/dist/cjs/utils/DeepMerge.cjs.map +0 -1
- package/dist/cjs/utils/DiffChecker.cjs.map +0 -1
- package/dist/cjs/utils/Filter.cjs.map +0 -1
- package/dist/cjs/utils/HashTable.cjs.map +0 -1
- package/dist/cjs/utils/Normalizer.cjs.map +0 -1
- package/dist/cjs/utils/Pool.cjs.map +0 -1
- package/dist/cjs/utils/Profiler.cjs.map +0 -1
- package/dist/cjs/utils/Registry.cjs.map +0 -1
- package/dist/cjs/utils/StructuredData.cjs.map +0 -1
- package/dist/cjs/utils/TextAnalyzer.cjs.map +0 -1
- package/dist/esm/CmpStr.mjs.map +0 -1
- package/dist/esm/CmpStrAsync.mjs.map +0 -1
- package/dist/esm/index.mjs.map +0 -1
- package/dist/esm/metric/Cosine.mjs.map +0 -1
- package/dist/esm/metric/DamerauLevenshtein.mjs.map +0 -1
- package/dist/esm/metric/DiceSorensen.mjs.map +0 -1
- package/dist/esm/metric/Hamming.mjs.map +0 -1
- package/dist/esm/metric/Jaccard.mjs.map +0 -1
- package/dist/esm/metric/JaroWinkler.mjs.map +0 -1
- package/dist/esm/metric/LCS.mjs.map +0 -1
- package/dist/esm/metric/Levenshtein.mjs.map +0 -1
- package/dist/esm/metric/Metric.mjs.map +0 -1
- package/dist/esm/metric/NeedlemanWunsch.mjs.map +0 -1
- package/dist/esm/metric/QGram.mjs.map +0 -1
- package/dist/esm/metric/SmithWaterman.mjs.map +0 -1
- package/dist/esm/phonetic/Caverphone.mjs.map +0 -1
- package/dist/esm/phonetic/Cologne.mjs.map +0 -1
- package/dist/esm/phonetic/Metaphone.mjs.map +0 -1
- package/dist/esm/phonetic/Phonetic.mjs.map +0 -1
- package/dist/esm/phonetic/Soundex.mjs.map +0 -1
- package/dist/esm/root.mjs.map +0 -1
- package/dist/esm/utils/DeepMerge.mjs.map +0 -1
- package/dist/esm/utils/DiffChecker.mjs.map +0 -1
- package/dist/esm/utils/Filter.mjs.map +0 -1
- package/dist/esm/utils/HashTable.mjs.map +0 -1
- package/dist/esm/utils/Normalizer.mjs.map +0 -1
- package/dist/esm/utils/Pool.mjs.map +0 -1
- package/dist/esm/utils/Profiler.mjs.map +0 -1
- package/dist/esm/utils/Registry.mjs.map +0 -1
- package/dist/esm/utils/StructuredData.mjs.map +0 -1
- package/dist/esm/utils/TextAnalyzer.mjs.map +0 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
// CmpStr v3.2.
|
|
1
|
+
// CmpStr v3.2.2 build-bb61120-260311 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
+
var Errors = require('./Errors.cjs');
|
|
4
5
|
var HashTable = require('./HashTable.cjs');
|
|
5
6
|
|
|
6
7
|
class Normalizer {
|
|
@@ -17,42 +18,62 @@ class Normalizer {
|
|
|
17
18
|
return Array.from(new Set(flags)).sort().join('');
|
|
18
19
|
}
|
|
19
20
|
static getPipeline(flags) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
21
|
+
return Errors.ErrorUtil.wrap(
|
|
22
|
+
() => {
|
|
23
|
+
if (Normalizer.pipeline.has(flags))
|
|
24
|
+
return Normalizer.pipeline.get(flags);
|
|
25
|
+
const { REGEX } = Normalizer;
|
|
26
|
+
const steps = [
|
|
27
|
+
['d', (s) => s.normalize('NFD')],
|
|
28
|
+
['i', (s) => s.toLowerCase()],
|
|
29
|
+
['k', (s) => s.replace(REGEX.nonLetters, '')],
|
|
30
|
+
['n', (s) => s.replace(REGEX.nonNumbers, '')],
|
|
31
|
+
['r', (s) => s.replace(REGEX.doubleChars, '$1')],
|
|
32
|
+
['s', (s) => s.replace(REGEX.specialChars, '')],
|
|
33
|
+
['t', (s) => s.trim()],
|
|
34
|
+
['u', (s) => s.normalize('NFC')],
|
|
35
|
+
['w', (s) => s.replace(REGEX.whitespace, ' ')],
|
|
36
|
+
['x', (s) => s.normalize('NFKC')]
|
|
37
|
+
];
|
|
38
|
+
const pipeline = steps
|
|
39
|
+
.filter(([f]) => flags.includes(f))
|
|
40
|
+
.map(([, fn]) => fn);
|
|
41
|
+
const fn = (s) => pipeline.reduce((v, f) => f(v), s);
|
|
42
|
+
Normalizer.pipeline.set(flags, fn);
|
|
43
|
+
return fn;
|
|
44
|
+
},
|
|
45
|
+
`Failed to create normalization pipeline for flags: ${flags}`,
|
|
46
|
+
{ flags }
|
|
47
|
+
);
|
|
40
48
|
}
|
|
41
49
|
static normalize(input, flags) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
return Errors.ErrorUtil.wrap(
|
|
51
|
+
() => {
|
|
52
|
+
if (!flags || typeof flags !== 'string' || !input) return input;
|
|
53
|
+
flags = this.canonicalFlags(flags);
|
|
54
|
+
if (Array.isArray(input))
|
|
55
|
+
return input.map((s) => Normalizer.normalize(s, flags));
|
|
56
|
+
const key = Normalizer.cache.key(flags, [input]);
|
|
57
|
+
if (key && Normalizer.cache.has(key)) return Normalizer.cache.get(key);
|
|
58
|
+
const res = Normalizer.getPipeline(flags)(input);
|
|
59
|
+
if (key) Normalizer.cache.set(key, res);
|
|
60
|
+
return res;
|
|
61
|
+
},
|
|
62
|
+
`Failed to normalize input with flags: ${flags}`,
|
|
63
|
+
{ input, flags }
|
|
64
|
+
);
|
|
51
65
|
}
|
|
52
66
|
static async normalizeAsync(input, flags) {
|
|
53
|
-
return await
|
|
54
|
-
|
|
55
|
-
|
|
67
|
+
return await Errors.ErrorUtil.wrapAsync(
|
|
68
|
+
async () => {
|
|
69
|
+
if (!flags || typeof flags !== 'string' || !input) return input;
|
|
70
|
+
return await (Array.isArray(input)
|
|
71
|
+
? Promise.all(input.map((s) => Normalizer.normalize(s, flags)))
|
|
72
|
+
: Promise.resolve(Normalizer.normalize(input, flags)));
|
|
73
|
+
},
|
|
74
|
+
`Failed to asynchronously normalize input with flags: ${flags}`,
|
|
75
|
+
{ input, flags }
|
|
76
|
+
);
|
|
56
77
|
}
|
|
57
78
|
static clear() {
|
|
58
79
|
Normalizer.pipeline.clear();
|
|
@@ -61,4 +82,3 @@ class Normalizer {
|
|
|
61
82
|
}
|
|
62
83
|
|
|
63
84
|
exports.Normalizer = Normalizer;
|
|
64
|
-
//# sourceMappingURL=Normalizer.cjs.map
|
package/dist/cjs/utils/Pool.cjs
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
// CmpStr v3.2.
|
|
1
|
+
// CmpStr v3.2.2 build-bb61120-260311 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
+
var Errors = require('./Errors.cjs');
|
|
5
|
+
|
|
4
6
|
class RingPool {
|
|
5
7
|
maxSize;
|
|
6
8
|
buffers = [];
|
|
@@ -9,22 +11,37 @@ class RingPool {
|
|
|
9
11
|
this.maxSize = maxSize;
|
|
10
12
|
}
|
|
11
13
|
acquire(minSize, allowOversize) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
14
|
+
return Errors.ErrorUtil.wrap(
|
|
15
|
+
() => {
|
|
16
|
+
const len = this.buffers.length;
|
|
17
|
+
for (let i = 0; i < len; i++) {
|
|
18
|
+
const idx = (this.pointer + i) & (len - 1);
|
|
19
|
+
const item = this.buffers[idx];
|
|
20
|
+
if (
|
|
21
|
+
item.size >= minSize &&
|
|
22
|
+
(allowOversize || item.size === minSize)
|
|
23
|
+
) {
|
|
24
|
+
this.pointer = (idx + 1) & (len - 1);
|
|
25
|
+
return item;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
},
|
|
30
|
+
`Failed to acquire buffer of size >= ${minSize} from pool`,
|
|
31
|
+
{ minSize, allowOversize }
|
|
32
|
+
);
|
|
22
33
|
}
|
|
23
34
|
release(item) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
35
|
+
Errors.ErrorUtil.wrap(
|
|
36
|
+
() => {
|
|
37
|
+
if (this.buffers.length < this.maxSize)
|
|
38
|
+
return void [this.buffers.push(item)];
|
|
39
|
+
this.buffers[this.pointer] = item;
|
|
40
|
+
this.pointer = (this.pointer + 1) % this.maxSize;
|
|
41
|
+
},
|
|
42
|
+
`Failed to release buffer back to pool`,
|
|
43
|
+
{ item }
|
|
44
|
+
);
|
|
28
45
|
}
|
|
29
46
|
clear() {
|
|
30
47
|
this.buffers = [];
|
|
@@ -77,6 +94,10 @@ class Pool {
|
|
|
77
94
|
}
|
|
78
95
|
static acquire(type, size) {
|
|
79
96
|
const CONFIG = this.CONFIG[type];
|
|
97
|
+
if (!CONFIG)
|
|
98
|
+
throw new Errors.CmpStrUsageError(`Unsupported pool type <${type}>`, {
|
|
99
|
+
type
|
|
100
|
+
});
|
|
80
101
|
if (size > CONFIG.maxItemSize) return this.allocate(type, size);
|
|
81
102
|
const item = this.POOLS[type].acquire(size, CONFIG.allowOversize);
|
|
82
103
|
if (item)
|
|
@@ -87,10 +108,13 @@ class Pool {
|
|
|
87
108
|
return sizes.map((size) => this.acquire(type, size));
|
|
88
109
|
}
|
|
89
110
|
static release(type, buffer, size) {
|
|
90
|
-
|
|
91
|
-
|
|
111
|
+
const CONFIG = this.CONFIG[type];
|
|
112
|
+
if (!CONFIG)
|
|
113
|
+
throw new Errors.CmpStrUsageError(`Unsupported pool type <${type}>`, {
|
|
114
|
+
type
|
|
115
|
+
});
|
|
116
|
+
if (size <= CONFIG.maxItemSize) this.POOLS[type].release({ buffer, size });
|
|
92
117
|
}
|
|
93
118
|
}
|
|
94
119
|
|
|
95
120
|
exports.Pool = Pool;
|
|
96
|
-
//# sourceMappingURL=Pool.cjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.2.
|
|
1
|
+
// CmpStr v3.2.2 build-bb61120-260311 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
class Profiler {
|
|
@@ -81,4 +81,3 @@ class Profiler {
|
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
exports.Profiler = Profiler;
|
|
84
|
-
//# sourceMappingURL=Profiler.cjs.map
|
|
@@ -1,22 +1,39 @@
|
|
|
1
|
-
// CmpStr v3.2.
|
|
1
|
+
// CmpStr v3.2.2 build-bb61120-260311 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
+
var Errors = require('./Errors.cjs');
|
|
5
|
+
|
|
4
6
|
const registry = Object.create(null);
|
|
5
7
|
const factory = Object.create(null);
|
|
6
8
|
function Registry(reg, ctor) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
Errors.ErrorUtil.assert(
|
|
10
|
+
!(reg in registry || reg in factory),
|
|
11
|
+
`Registry <${reg}> already exists / overwriting is forbidden`,
|
|
12
|
+
{ registry: reg }
|
|
13
|
+
);
|
|
11
14
|
const classes = Object.create(null);
|
|
12
15
|
const service = Object.freeze({
|
|
13
16
|
add(name, cls, update = false) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
Errors.ErrorUtil.assert(
|
|
18
|
+
typeof name === 'string' && name.length > 0,
|
|
19
|
+
`Class name must be a non-empty string`,
|
|
20
|
+
{ registry: reg, name }
|
|
21
|
+
);
|
|
22
|
+
Errors.ErrorUtil.assert(
|
|
23
|
+
typeof cls === 'function',
|
|
24
|
+
`Class must be a constructor function`,
|
|
25
|
+
{ registry: reg, class: cls }
|
|
26
|
+
);
|
|
27
|
+
Errors.ErrorUtil.assert(
|
|
28
|
+
cls.prototype instanceof ctor,
|
|
29
|
+
`Class must extend <${reg}>`,
|
|
30
|
+
{ registry: reg, class: cls }
|
|
31
|
+
);
|
|
32
|
+
Errors.ErrorUtil.assert(
|
|
33
|
+
update || !(name in classes),
|
|
34
|
+
`Class <${name}> already exists / use <update=true> to overwrite`,
|
|
35
|
+
{ registry: reg, name }
|
|
36
|
+
);
|
|
20
37
|
classes[name] = cls;
|
|
21
38
|
},
|
|
22
39
|
remove(name) {
|
|
@@ -29,8 +46,16 @@ function Registry(reg, ctor) {
|
|
|
29
46
|
return Object.keys(classes);
|
|
30
47
|
},
|
|
31
48
|
get(name) {
|
|
32
|
-
|
|
33
|
-
|
|
49
|
+
Errors.ErrorUtil.assert(
|
|
50
|
+
typeof name === 'string' && name.length > 0,
|
|
51
|
+
`Class name must be a non-empty string`,
|
|
52
|
+
{ registry: reg, name }
|
|
53
|
+
);
|
|
54
|
+
Errors.ErrorUtil.assert(
|
|
55
|
+
name in classes,
|
|
56
|
+
`Class <${name}> not registered for <${reg}>`,
|
|
57
|
+
{ registry: reg, name }
|
|
58
|
+
);
|
|
34
59
|
return classes[name];
|
|
35
60
|
}
|
|
36
61
|
});
|
|
@@ -40,18 +65,18 @@ function Registry(reg, ctor) {
|
|
|
40
65
|
}
|
|
41
66
|
function resolveCls(reg, cls) {
|
|
42
67
|
if (!(reg in registry))
|
|
43
|
-
throw new
|
|
68
|
+
throw new Errors.CmpStrNotFoundError(`Registry <${reg}> does not exist`, {
|
|
69
|
+
registry: reg
|
|
70
|
+
});
|
|
44
71
|
return typeof cls === 'string' ? registry[reg]?.get(cls) : cls;
|
|
45
72
|
}
|
|
46
73
|
function createFromRegistry(reg, cls, ...args) {
|
|
47
74
|
cls = resolveCls(reg, cls);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
});
|
|
54
|
-
}
|
|
75
|
+
return Errors.ErrorUtil.wrap(
|
|
76
|
+
() => new cls(...args),
|
|
77
|
+
`Failed to create instance of class <${cls.name ?? cls}> from registry <${reg}>`,
|
|
78
|
+
{ registry: reg, class: cls, args }
|
|
79
|
+
);
|
|
55
80
|
}
|
|
56
81
|
|
|
57
82
|
exports.Registry = Registry;
|
|
@@ -59,4 +84,3 @@ exports.createFromRegistry = createFromRegistry;
|
|
|
59
84
|
exports.factory = factory;
|
|
60
85
|
exports.registry = registry;
|
|
61
86
|
exports.resolveCls = resolveCls;
|
|
62
|
-
//# sourceMappingURL=Registry.cjs.map
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
// CmpStr v3.2.
|
|
1
|
+
// CmpStr v3.2.2 build-bb61120-260311 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
+
var Errors = require('./Errors.cjs');
|
|
4
5
|
var Pool = require('./Pool.cjs');
|
|
5
6
|
|
|
6
7
|
class StructuredData {
|
|
@@ -50,7 +51,7 @@ class StructuredData {
|
|
|
50
51
|
raw: r.raw
|
|
51
52
|
}));
|
|
52
53
|
else
|
|
53
|
-
throw new
|
|
54
|
+
throw new Errors.CmpStrValidationError(
|
|
54
55
|
'Unsupported result format for StructuredData normalization.'
|
|
55
56
|
);
|
|
56
57
|
return normalized.map((r, idx) => ({ ...r, __idx: idx }));
|
|
@@ -108,10 +109,18 @@ class StructuredData {
|
|
|
108
109
|
);
|
|
109
110
|
}
|
|
110
111
|
performLookup(fn, extractedStrings, opt) {
|
|
111
|
-
return
|
|
112
|
+
return Errors.ErrorUtil.wrap(
|
|
113
|
+
() => this.finalizeLookup(fn(), extractedStrings, opt),
|
|
114
|
+
'StructuredData lookup failed',
|
|
115
|
+
{ key: this.key }
|
|
116
|
+
);
|
|
112
117
|
}
|
|
113
118
|
async performLookupAsync(fn, extractedStrings, opt) {
|
|
114
|
-
return
|
|
119
|
+
return await Errors.ErrorUtil.wrapAsync(
|
|
120
|
+
async () => this.finalizeLookup(await fn(), extractedStrings, opt),
|
|
121
|
+
'StructuredData async lookup failed',
|
|
122
|
+
{ key: this.key }
|
|
123
|
+
);
|
|
115
124
|
}
|
|
116
125
|
lookup(fn, query, opt) {
|
|
117
126
|
const b = this.extract();
|
|
@@ -152,4 +161,3 @@ class StructuredData {
|
|
|
152
161
|
}
|
|
153
162
|
|
|
154
163
|
exports.StructuredData = StructuredData;
|
|
155
|
-
//# sourceMappingURL=StructuredData.cjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.2.
|
|
1
|
+
// CmpStr v3.2.2 build-bb61120-260311 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
class TextAnalyzer {
|
|
@@ -196,4 +196,3 @@ class TextAnalyzer {
|
|
|
196
196
|
}
|
|
197
197
|
|
|
198
198
|
exports.TextAnalyzer = TextAnalyzer;
|
|
199
|
-
//# sourceMappingURL=TextAnalyzer.cjs.map
|
package/dist/esm/CmpStr.mjs
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
// CmpStr v3.2.
|
|
1
|
+
// CmpStr v3.2.2 build-bb61120-260311 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
import { merge, set, rmv, get } from './utils/DeepMerge.mjs';
|
|
3
3
|
import { DiffChecker } from './utils/DiffChecker.mjs';
|
|
4
|
+
import {
|
|
5
|
+
CmpStrInternalError,
|
|
6
|
+
CmpStrNotFoundError,
|
|
7
|
+
ErrorUtil
|
|
8
|
+
} from './utils/Errors.mjs';
|
|
4
9
|
import { Filter } from './utils/Filter.mjs';
|
|
5
10
|
import { Normalizer } from './utils/Normalizer.mjs';
|
|
6
11
|
import { Profiler } from './utils/Profiler.mjs';
|
|
@@ -81,20 +86,22 @@ class CmpStr {
|
|
|
81
86
|
switch (cond) {
|
|
82
87
|
case 'metric':
|
|
83
88
|
if (!CmpStr.metric.has(test))
|
|
84
|
-
throw new
|
|
89
|
+
throw new CmpStrNotFoundError(
|
|
85
90
|
`CmpStr <metric> must be set, call .setMetric(), ` +
|
|
86
|
-
`use CmpStr.metric.list() for available metrics
|
|
91
|
+
`use CmpStr.metric.list() for available metrics`,
|
|
92
|
+
{ metric: test }
|
|
87
93
|
);
|
|
88
94
|
break;
|
|
89
95
|
case 'phonetic':
|
|
90
96
|
if (!CmpStr.phonetic.has(test))
|
|
91
|
-
throw new
|
|
97
|
+
throw new CmpStrNotFoundError(
|
|
92
98
|
`CmpStr <phonetic> must be set, call .setPhonetic(), ` +
|
|
93
|
-
`use CmpStr.phonetic.list() for available phonetic algorithms
|
|
99
|
+
`use CmpStr.phonetic.list() for available phonetic algorithms`,
|
|
100
|
+
{ phonetic: test }
|
|
94
101
|
);
|
|
95
102
|
break;
|
|
96
103
|
default:
|
|
97
|
-
throw new
|
|
104
|
+
throw new CmpStrInternalError(`Cmpstr condition <${cond}> unknown`);
|
|
98
105
|
}
|
|
99
106
|
}
|
|
100
107
|
assertMany(...cond) {
|
|
@@ -133,31 +140,42 @@ class CmpStr {
|
|
|
133
140
|
return StructuredData.create(data, key);
|
|
134
141
|
}
|
|
135
142
|
compute(a, b, opt, mode, raw, skip) {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
143
|
+
return ErrorUtil.wrap(
|
|
144
|
+
() => {
|
|
145
|
+
const resolved = this.resolveOptions(opt);
|
|
146
|
+
this.assert('metric', resolved.metric);
|
|
147
|
+
const A = skip ? a : this.prepare(a, resolved);
|
|
148
|
+
const B = skip ? b : this.prepare(b, resolved);
|
|
149
|
+
if (
|
|
150
|
+
resolved.safeEmpty &&
|
|
151
|
+
((Array.isArray(A) && A.length === 0) ||
|
|
152
|
+
(Array.isArray(B) && B.length === 0) ||
|
|
153
|
+
A === '' ||
|
|
154
|
+
B === '')
|
|
155
|
+
) {
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
const metric = factory['metric'](resolved.metric, A, B, resolved.opt);
|
|
159
|
+
if (resolved.output !== 'prep') metric.setOriginal(a, b);
|
|
160
|
+
metric.run(mode);
|
|
161
|
+
const result = this.postProcess(metric.getResults(), resolved);
|
|
162
|
+
return this.output(result, raw ?? resolved.raw);
|
|
163
|
+
},
|
|
164
|
+
`Failed to compute metric <${opt?.metric ?? this.options.metric}> for the given inputs`,
|
|
165
|
+
{ a, b, options: opt }
|
|
166
|
+
);
|
|
154
167
|
}
|
|
155
168
|
output(result, raw) {
|
|
156
|
-
return (
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
169
|
+
return ErrorUtil.wrap(
|
|
170
|
+
() =>
|
|
171
|
+
(raw ?? this.options.raw)
|
|
172
|
+
? result
|
|
173
|
+
: Array.isArray(result)
|
|
174
|
+
? result.map((r) => ({ source: r.a, target: r.b, match: r.res }))
|
|
175
|
+
: { source: result.a, target: result.b, match: result.res },
|
|
176
|
+
`Failed to resolve output format for the metric result`,
|
|
177
|
+
{ result, raw }
|
|
178
|
+
);
|
|
161
179
|
}
|
|
162
180
|
clone = () => Object.assign(Object.create(Object.getPrototypeOf(this)), this);
|
|
163
181
|
reset() {
|
|
@@ -173,8 +191,14 @@ class CmpStr {
|
|
|
173
191
|
return this;
|
|
174
192
|
}
|
|
175
193
|
setSerializedOptions(opt) {
|
|
176
|
-
|
|
177
|
-
|
|
194
|
+
return ErrorUtil.wrap(
|
|
195
|
+
() => {
|
|
196
|
+
this.options = JSON.parse(opt);
|
|
197
|
+
return this;
|
|
198
|
+
},
|
|
199
|
+
`Failed to parse serialized options, invalid JSON string`,
|
|
200
|
+
{ opt }
|
|
201
|
+
);
|
|
178
202
|
}
|
|
179
203
|
setOption(path, value) {
|
|
180
204
|
set(this.options, path, value);
|
|
@@ -284,4 +308,3 @@ class CmpStr {
|
|
|
284
308
|
}
|
|
285
309
|
|
|
286
310
|
export { CmpStr };
|
|
287
|
-
//# sourceMappingURL=CmpStr.mjs.map
|
package/dist/esm/CmpStrAsync.mjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// CmpStr v3.2.
|
|
1
|
+
// CmpStr v3.2.2 build-bb61120-260311 by Paul Köhler @komed3 / MIT License
|
|
2
|
+
import { ErrorUtil } from './utils/Errors.mjs';
|
|
2
3
|
import { Filter } from './utils/Filter.mjs';
|
|
3
4
|
import { Normalizer } from './utils/Normalizer.mjs';
|
|
4
5
|
import { factory } from './utils/Registry.mjs';
|
|
@@ -38,24 +39,30 @@ class CmpStrAsync extends CmpStr {
|
|
|
38
39
|
: phonetic.getIndexAsync(input).then((r) => r.join(delimiter));
|
|
39
40
|
}
|
|
40
41
|
async computeAsync(a, b, opt, mode, raw, skip) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
42
|
+
return ErrorUtil.wrapAsync(
|
|
43
|
+
async () => {
|
|
44
|
+
const resolved = this.resolveOptions(opt);
|
|
45
|
+
this.assert('metric', resolved.metric);
|
|
46
|
+
const A = skip ? a : await this.prepareAsync(a, resolved);
|
|
47
|
+
const B = skip ? b : await this.prepareAsync(b, resolved);
|
|
48
|
+
if (
|
|
49
|
+
resolved.safeEmpty &&
|
|
50
|
+
((Array.isArray(A) && A.length === 0) ||
|
|
51
|
+
(Array.isArray(B) && B.length === 0) ||
|
|
52
|
+
A === '' ||
|
|
53
|
+
B === '')
|
|
54
|
+
) {
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
const metric = factory['metric'](resolved.metric, A, B, resolved.opt);
|
|
58
|
+
if (resolved.output !== 'prep') metric.setOriginal(a, b);
|
|
59
|
+
await metric.runAsync(mode);
|
|
60
|
+
const result = this.postProcess(metric.getResults(), resolved);
|
|
61
|
+
return this.output(result, raw ?? resolved.raw);
|
|
62
|
+
},
|
|
63
|
+
`Failed to compute metric <${opt?.metric ?? this.options.metric}> for the given inputs`,
|
|
64
|
+
{ a, b, opt }
|
|
65
|
+
);
|
|
59
66
|
}
|
|
60
67
|
async testAsync(a, b, opt) {
|
|
61
68
|
return this.computeAsync(a, b, opt, 'single');
|
|
@@ -155,4 +162,3 @@ class CmpStrAsync extends CmpStr {
|
|
|
155
162
|
}
|
|
156
163
|
|
|
157
164
|
export { CmpStrAsync };
|
|
158
|
-
//# sourceMappingURL=CmpStrAsync.mjs.map
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
// CmpStr v3.2.
|
|
1
|
+
// CmpStr v3.2.2 build-bb61120-260311 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
export { CmpStr } from './CmpStr.mjs';
|
|
3
3
|
export { CmpStrAsync } from './CmpStrAsync.mjs';
|
|
4
4
|
export { DiffChecker } from './utils/DiffChecker.mjs';
|
|
5
5
|
export { Normalizer } from './utils/Normalizer.mjs';
|
|
6
6
|
export { TextAnalyzer } from './utils/TextAnalyzer.mjs';
|
|
7
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.2.
|
|
1
|
+
// CmpStr v3.2.2 build-bb61120-260311 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
import { Pool } from '../utils/Pool.mjs';
|
|
3
3
|
import { MetricRegistry, Metric } from './Metric.mjs';
|
|
4
4
|
|
|
@@ -41,4 +41,3 @@ class CosineSimilarity extends Metric {
|
|
|
41
41
|
MetricRegistry.add('cosine', CosineSimilarity);
|
|
42
42
|
|
|
43
43
|
export { CosineSimilarity };
|
|
44
|
-
//# sourceMappingURL=Cosine.mjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.2.
|
|
1
|
+
// CmpStr v3.2.2 build-bb61120-260311 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
import { Pool } from '../utils/Pool.mjs';
|
|
3
3
|
import { MetricRegistry, Metric } from './Metric.mjs';
|
|
4
4
|
|
|
@@ -45,4 +45,3 @@ class DamerauLevenshteinDistance extends Metric {
|
|
|
45
45
|
MetricRegistry.add('damerau', DamerauLevenshteinDistance);
|
|
46
46
|
|
|
47
47
|
export { DamerauLevenshteinDistance };
|
|
48
|
-
//# sourceMappingURL=DamerauLevenshtein.mjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.2.
|
|
1
|
+
// CmpStr v3.2.2 build-bb61120-260311 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
import { Pool } from '../utils/Pool.mjs';
|
|
3
3
|
import { MetricRegistry, Metric } from './Metric.mjs';
|
|
4
4
|
|
|
@@ -34,4 +34,3 @@ class DiceSorensenCoefficient extends Metric {
|
|
|
34
34
|
MetricRegistry.add('dice', DiceSorensenCoefficient);
|
|
35
35
|
|
|
36
36
|
export { DiceSorensenCoefficient };
|
|
37
|
-
//# sourceMappingURL=DiceSorensen.mjs.map
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
// CmpStr v3.2.
|
|
1
|
+
// CmpStr v3.2.2 build-bb61120-260311 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
import { MetricRegistry, Metric } from './Metric.mjs';
|
|
3
|
+
import { CmpStrUsageError } from '../utils/Errors.mjs';
|
|
3
4
|
|
|
4
5
|
class HammingDistance extends Metric {
|
|
5
6
|
constructor(a, b, opt = {}) {
|
|
@@ -12,9 +13,10 @@ class HammingDistance extends Metric {
|
|
|
12
13
|
if (n < maxLen) b = b.padEnd(maxLen, this.options.pad);
|
|
13
14
|
m = n = maxLen;
|
|
14
15
|
} else
|
|
15
|
-
throw new
|
|
16
|
+
throw new CmpStrUsageError(
|
|
16
17
|
`Strings must be of equal length for Hamming Distance, a=${m} and b=${n} given, ` +
|
|
17
|
-
`use option.pad for automatic adjustment
|
|
18
|
+
`use option.pad for automatic adjustment`,
|
|
19
|
+
{ a: m, b: n }
|
|
18
20
|
);
|
|
19
21
|
}
|
|
20
22
|
let dist = 0;
|
|
@@ -25,4 +27,3 @@ class HammingDistance extends Metric {
|
|
|
25
27
|
MetricRegistry.add('hamming', HammingDistance);
|
|
26
28
|
|
|
27
29
|
export { HammingDistance };
|
|
28
|
-
//# sourceMappingURL=Hamming.mjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.2.
|
|
1
|
+
// CmpStr v3.2.2 build-bb61120-260311 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
import { Pool } from '../utils/Pool.mjs';
|
|
3
3
|
import { MetricRegistry, Metric } from './Metric.mjs';
|
|
4
4
|
|
|
@@ -27,4 +27,3 @@ class JaccardIndex extends Metric {
|
|
|
27
27
|
MetricRegistry.add('jaccard', JaccardIndex);
|
|
28
28
|
|
|
29
29
|
export { JaccardIndex };
|
|
30
|
-
//# sourceMappingURL=Jaccard.mjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.2.
|
|
1
|
+
// CmpStr v3.2.2 build-bb61120-260311 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
import { Pool } from '../utils/Pool.mjs';
|
|
3
3
|
import { MetricRegistry, Metric } from './Metric.mjs';
|
|
4
4
|
|
|
@@ -59,4 +59,3 @@ class JaroWinklerDistance extends Metric {
|
|
|
59
59
|
MetricRegistry.add('jaroWinkler', JaroWinklerDistance);
|
|
60
60
|
|
|
61
61
|
export { JaroWinklerDistance };
|
|
62
|
-
//# sourceMappingURL=JaroWinkler.mjs.map
|