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.
Files changed (150) hide show
  1. package/README.md +24 -18
  2. package/dist/CmpStr.esm.js +485 -220
  3. package/dist/CmpStr.esm.min.js +2 -3
  4. package/dist/CmpStr.umd.js +484 -220
  5. package/dist/CmpStr.umd.min.js +2 -3
  6. package/dist/cjs/CmpStr.cjs +57 -36
  7. package/dist/cjs/CmpStrAsync.cjs +30 -24
  8. package/dist/cjs/index.cjs +1 -2
  9. package/dist/cjs/metric/Cosine.cjs +1 -2
  10. package/dist/cjs/metric/DamerauLevenshtein.cjs +1 -2
  11. package/dist/cjs/metric/DiceSorensen.cjs +1 -2
  12. package/dist/cjs/metric/Hamming.cjs +5 -4
  13. package/dist/cjs/metric/Jaccard.cjs +1 -2
  14. package/dist/cjs/metric/JaroWinkler.cjs +1 -2
  15. package/dist/cjs/metric/LCS.cjs +1 -2
  16. package/dist/cjs/metric/Levenshtein.cjs +1 -2
  17. package/dist/cjs/metric/Metric.cjs +57 -38
  18. package/dist/cjs/metric/NeedlemanWunsch.cjs +1 -2
  19. package/dist/cjs/metric/QGram.cjs +1 -2
  20. package/dist/cjs/metric/SmithWaterman.cjs +1 -2
  21. package/dist/cjs/phonetic/Caverphone.cjs +1 -2
  22. package/dist/cjs/phonetic/Cologne.cjs +1 -2
  23. package/dist/cjs/phonetic/Metaphone.cjs +1 -2
  24. package/dist/cjs/phonetic/Phonetic.cjs +55 -35
  25. package/dist/cjs/phonetic/Soundex.cjs +1 -2
  26. package/dist/cjs/root.cjs +3 -2
  27. package/dist/cjs/utils/DeepMerge.cjs +10 -5
  28. package/dist/cjs/utils/DiffChecker.cjs +1 -2
  29. package/dist/cjs/utils/Errors.cjs +103 -0
  30. package/dist/cjs/utils/Filter.cjs +52 -27
  31. package/dist/cjs/utils/HashTable.cjs +1 -2
  32. package/dist/cjs/utils/Normalizer.cjs +54 -34
  33. package/dist/cjs/utils/Pool.cjs +42 -18
  34. package/dist/cjs/utils/Profiler.cjs +1 -2
  35. package/dist/cjs/utils/Registry.cjs +46 -22
  36. package/dist/cjs/utils/StructuredData.cjs +13 -5
  37. package/dist/cjs/utils/TextAnalyzer.cjs +1 -2
  38. package/dist/esm/CmpStr.mjs +55 -32
  39. package/dist/esm/CmpStrAsync.mjs +26 -20
  40. package/dist/esm/index.mjs +1 -2
  41. package/dist/esm/metric/Cosine.mjs +1 -2
  42. package/dist/esm/metric/DamerauLevenshtein.mjs +1 -2
  43. package/dist/esm/metric/DiceSorensen.mjs +1 -2
  44. package/dist/esm/metric/Hamming.mjs +5 -4
  45. package/dist/esm/metric/Jaccard.mjs +1 -2
  46. package/dist/esm/metric/JaroWinkler.mjs +1 -2
  47. package/dist/esm/metric/LCS.mjs +1 -2
  48. package/dist/esm/metric/Levenshtein.mjs +1 -2
  49. package/dist/esm/metric/Metric.mjs +59 -38
  50. package/dist/esm/metric/NeedlemanWunsch.mjs +1 -2
  51. package/dist/esm/metric/QGram.mjs +1 -2
  52. package/dist/esm/metric/SmithWaterman.mjs +1 -2
  53. package/dist/esm/phonetic/Caverphone.mjs +1 -2
  54. package/dist/esm/phonetic/Cologne.mjs +1 -2
  55. package/dist/esm/phonetic/Metaphone.mjs +1 -2
  56. package/dist/esm/phonetic/Phonetic.mjs +55 -35
  57. package/dist/esm/phonetic/Soundex.mjs +1 -2
  58. package/dist/esm/root.mjs +3 -2
  59. package/dist/esm/utils/DeepMerge.mjs +10 -5
  60. package/dist/esm/utils/DiffChecker.mjs +1 -2
  61. package/dist/esm/utils/Errors.mjs +103 -0
  62. package/dist/esm/utils/Filter.mjs +52 -27
  63. package/dist/esm/utils/HashTable.mjs +1 -2
  64. package/dist/esm/utils/Normalizer.mjs +54 -34
  65. package/dist/esm/utils/Pool.mjs +38 -18
  66. package/dist/esm/utils/Profiler.mjs +1 -2
  67. package/dist/esm/utils/Registry.mjs +46 -22
  68. package/dist/esm/utils/StructuredData.mjs +13 -5
  69. package/dist/esm/utils/TextAnalyzer.mjs +1 -2
  70. package/dist/types/CmpStr.d.ts +5 -1
  71. package/dist/types/CmpStrAsync.d.ts +1 -0
  72. package/dist/types/index.d.ts +3 -2
  73. package/dist/types/metric/Metric.d.ts +6 -5
  74. package/dist/types/phonetic/Phonetic.d.ts +3 -1
  75. package/dist/types/root.d.ts +2 -1
  76. package/dist/types/utils/DeepMerge.d.ts +1 -1
  77. package/dist/types/utils/Errors.d.ts +137 -0
  78. package/dist/types/utils/Filter.d.ts +4 -0
  79. package/dist/types/utils/Normalizer.d.ts +3 -0
  80. package/dist/types/utils/Pool.d.ts +2 -0
  81. package/dist/types/utils/Registry.d.ts +3 -3
  82. package/dist/types/utils/StructuredData.d.ts +3 -1
  83. package/dist/types/utils/Types.d.ts +26 -0
  84. package/package.json +7 -7
  85. package/dist/CmpStr.esm.js.map +0 -1
  86. package/dist/CmpStr.esm.min.js.map +0 -1
  87. package/dist/CmpStr.umd.js.map +0 -1
  88. package/dist/CmpStr.umd.min.js.map +0 -1
  89. package/dist/cjs/CmpStr.cjs.map +0 -1
  90. package/dist/cjs/CmpStrAsync.cjs.map +0 -1
  91. package/dist/cjs/index.cjs.map +0 -1
  92. package/dist/cjs/metric/Cosine.cjs.map +0 -1
  93. package/dist/cjs/metric/DamerauLevenshtein.cjs.map +0 -1
  94. package/dist/cjs/metric/DiceSorensen.cjs.map +0 -1
  95. package/dist/cjs/metric/Hamming.cjs.map +0 -1
  96. package/dist/cjs/metric/Jaccard.cjs.map +0 -1
  97. package/dist/cjs/metric/JaroWinkler.cjs.map +0 -1
  98. package/dist/cjs/metric/LCS.cjs.map +0 -1
  99. package/dist/cjs/metric/Levenshtein.cjs.map +0 -1
  100. package/dist/cjs/metric/Metric.cjs.map +0 -1
  101. package/dist/cjs/metric/NeedlemanWunsch.cjs.map +0 -1
  102. package/dist/cjs/metric/QGram.cjs.map +0 -1
  103. package/dist/cjs/metric/SmithWaterman.cjs.map +0 -1
  104. package/dist/cjs/phonetic/Caverphone.cjs.map +0 -1
  105. package/dist/cjs/phonetic/Cologne.cjs.map +0 -1
  106. package/dist/cjs/phonetic/Metaphone.cjs.map +0 -1
  107. package/dist/cjs/phonetic/Phonetic.cjs.map +0 -1
  108. package/dist/cjs/phonetic/Soundex.cjs.map +0 -1
  109. package/dist/cjs/root.cjs.map +0 -1
  110. package/dist/cjs/utils/DeepMerge.cjs.map +0 -1
  111. package/dist/cjs/utils/DiffChecker.cjs.map +0 -1
  112. package/dist/cjs/utils/Filter.cjs.map +0 -1
  113. package/dist/cjs/utils/HashTable.cjs.map +0 -1
  114. package/dist/cjs/utils/Normalizer.cjs.map +0 -1
  115. package/dist/cjs/utils/Pool.cjs.map +0 -1
  116. package/dist/cjs/utils/Profiler.cjs.map +0 -1
  117. package/dist/cjs/utils/Registry.cjs.map +0 -1
  118. package/dist/cjs/utils/StructuredData.cjs.map +0 -1
  119. package/dist/cjs/utils/TextAnalyzer.cjs.map +0 -1
  120. package/dist/esm/CmpStr.mjs.map +0 -1
  121. package/dist/esm/CmpStrAsync.mjs.map +0 -1
  122. package/dist/esm/index.mjs.map +0 -1
  123. package/dist/esm/metric/Cosine.mjs.map +0 -1
  124. package/dist/esm/metric/DamerauLevenshtein.mjs.map +0 -1
  125. package/dist/esm/metric/DiceSorensen.mjs.map +0 -1
  126. package/dist/esm/metric/Hamming.mjs.map +0 -1
  127. package/dist/esm/metric/Jaccard.mjs.map +0 -1
  128. package/dist/esm/metric/JaroWinkler.mjs.map +0 -1
  129. package/dist/esm/metric/LCS.mjs.map +0 -1
  130. package/dist/esm/metric/Levenshtein.mjs.map +0 -1
  131. package/dist/esm/metric/Metric.mjs.map +0 -1
  132. package/dist/esm/metric/NeedlemanWunsch.mjs.map +0 -1
  133. package/dist/esm/metric/QGram.mjs.map +0 -1
  134. package/dist/esm/metric/SmithWaterman.mjs.map +0 -1
  135. package/dist/esm/phonetic/Caverphone.mjs.map +0 -1
  136. package/dist/esm/phonetic/Cologne.mjs.map +0 -1
  137. package/dist/esm/phonetic/Metaphone.mjs.map +0 -1
  138. package/dist/esm/phonetic/Phonetic.mjs.map +0 -1
  139. package/dist/esm/phonetic/Soundex.mjs.map +0 -1
  140. package/dist/esm/root.mjs.map +0 -1
  141. package/dist/esm/utils/DeepMerge.mjs.map +0 -1
  142. package/dist/esm/utils/DiffChecker.mjs.map +0 -1
  143. package/dist/esm/utils/Filter.mjs.map +0 -1
  144. package/dist/esm/utils/HashTable.mjs.map +0 -1
  145. package/dist/esm/utils/Normalizer.mjs.map +0 -1
  146. package/dist/esm/utils/Pool.mjs.map +0 -1
  147. package/dist/esm/utils/Profiler.mjs.map +0 -1
  148. package/dist/esm/utils/Registry.mjs.map +0 -1
  149. package/dist/esm/utils/StructuredData.mjs.map +0 -1
  150. package/dist/esm/utils/TextAnalyzer.mjs.map +0 -1
@@ -1,6 +1,7 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
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
- if (Normalizer.pipeline.has(flags)) return Normalizer.pipeline.get(flags);
21
- const { REGEX } = Normalizer;
22
- const steps = [
23
- ['d', (s) => s.normalize('NFD')],
24
- ['i', (s) => s.toLowerCase()],
25
- ['k', (s) => s.replace(REGEX.nonLetters, '')],
26
- ['n', (s) => s.replace(REGEX.nonNumbers, '')],
27
- ['r', (s) => s.replace(REGEX.doubleChars, '$1')],
28
- ['s', (s) => s.replace(REGEX.specialChars, '')],
29
- ['t', (s) => s.trim()],
30
- ['u', (s) => s.normalize('NFC')],
31
- ['w', (s) => s.replace(REGEX.whitespace, ' ')],
32
- ['x', (s) => s.normalize('NFKC')]
33
- ];
34
- const pipeline = steps
35
- .filter(([f]) => flags.includes(f))
36
- .map(([, fn]) => fn);
37
- const fn = (s) => pipeline.reduce((v, f) => f(v), s);
38
- Normalizer.pipeline.set(flags, fn);
39
- return fn;
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
- if (!flags || typeof flags !== 'string' || !input) return input;
43
- flags = this.canonicalFlags(flags);
44
- if (Array.isArray(input))
45
- return input.map((s) => Normalizer.normalize(s, flags));
46
- const key = Normalizer.cache.key(flags, [input]);
47
- if (key && Normalizer.cache.has(key)) return Normalizer.cache.get(key);
48
- const res = Normalizer.getPipeline(flags)(input);
49
- if (key) Normalizer.cache.set(key, res);
50
- return res;
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 (Array.isArray(input)
54
- ? Promise.all(input.map((s) => Normalizer.normalize(s, flags)))
55
- : Promise.resolve(Normalizer.normalize(input, flags)));
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
@@ -1,6 +1,8 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
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
- const len = this.buffers.length;
13
- for (let i = 0; i < len; i++) {
14
- const idx = (this.pointer + i) & (len - 1);
15
- const item = this.buffers[idx];
16
- if (item.size >= minSize && (allowOversize || item.size === minSize)) {
17
- this.pointer = (idx + 1) & (len - 1);
18
- return item;
19
- }
20
- }
21
- return null;
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
- if (this.buffers.length < this.maxSize)
25
- return void [this.buffers.push(item)];
26
- this.buffers[this.pointer] = item;
27
- this.pointer = (this.pointer + 1) % this.maxSize;
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
- if (size <= this.CONFIG[type].maxItemSize)
91
- this.POOLS[type].release({ buffer, size });
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 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
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 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
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
- if (reg in registry || reg in factory)
8
- throw new Error(
9
- `Registry <${reg}> already exists / overwriting is forbidden`
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
- if (!(cls.prototype instanceof ctor))
15
- throw new TypeError(`Class must extend <${reg}>`);
16
- if (!update && name in classes)
17
- throw new Error(
18
- `Entry <${name}> already exists / use <update=true> to overwrite`
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
- if (!(name in classes))
33
- throw new Error(`Class <${name}> not registered for <${reg}>`);
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 ReferenceError(`Registry <${reg}> does not exist`);
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
- try {
49
- return new cls(...args);
50
- } catch (err) {
51
- throw new Error(`Cannot instantiate class <${cls.name ?? cls}>`, {
52
- cause: err
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 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
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 TypeError(
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 this.finalizeLookup(fn(), extractedStrings, opt);
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 this.finalizeLookup(await fn(), extractedStrings, opt);
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 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
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
@@ -1,6 +1,11 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
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 Error(
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 Error(
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 Error(`Cmpstr condition <${cond}> unknown`);
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
- const resolved = this.resolveOptions(opt);
137
- this.assert('metric', resolved.metric);
138
- const A = skip ? a : this.prepare(a, resolved);
139
- const B = skip ? b : this.prepare(b, resolved);
140
- if (
141
- resolved.safeEmpty &&
142
- ((Array.isArray(A) && A.length === 0) ||
143
- (Array.isArray(B) && B.length === 0) ||
144
- A === '' ||
145
- B === '')
146
- ) {
147
- return [];
148
- }
149
- const metric = factory['metric'](resolved.metric, A, B, resolved.opt);
150
- if (resolved.output !== 'prep') metric.setOriginal(a, b);
151
- metric.run(mode);
152
- const result = this.postProcess(metric.getResults(), resolved);
153
- return this.output(result, raw ?? resolved.raw);
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 (raw ?? this.options.raw)
157
- ? result
158
- : Array.isArray(result)
159
- ? result.map((r) => ({ source: r.a, target: r.b, match: r.res }))
160
- : { source: result.a, target: result.b, match: result.res };
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
- this.options = JSON.parse(opt);
177
- return this;
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
@@ -1,4 +1,5 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
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
- const resolved = this.resolveOptions(opt);
42
- this.assert('metric', resolved.metric);
43
- const A = skip ? a : await this.prepareAsync(a, resolved);
44
- const B = skip ? b : await this.prepareAsync(b, resolved);
45
- if (
46
- resolved.safeEmpty &&
47
- ((Array.isArray(A) && A.length === 0) ||
48
- (Array.isArray(B) && B.length === 0) ||
49
- A === '' ||
50
- B === '')
51
- ) {
52
- return [];
53
- }
54
- const metric = factory['metric'](resolved.metric, A, B, resolved.opt);
55
- if (resolved.output !== 'prep') metric.setOriginal(a, b);
56
- await metric.runAsync(mode);
57
- const result = this.postProcess(metric.getResults(), resolved);
58
- return this.output(result, raw ?? resolved.raw);
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
@@ -1,7 +1,6 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
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 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
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 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
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 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
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 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
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 Error(
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 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
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 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
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