cry-search 2.0.2 → 2.1.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.
Files changed (40) hide show
  1. package/CLAUDE.md +8 -2
  2. package/README.md +53 -0
  3. package/UNIVERSE.md +12 -0
  4. package/dist/common/numeric/createSearchArrayMetadata.d.ts +10 -0
  5. package/dist/common/numeric/createSearchArrayMetadata.d.ts.map +1 -1
  6. package/dist/common/numeric/matchMany.d.ts +111 -0
  7. package/dist/common/numeric/matchMany.d.ts.map +1 -0
  8. package/dist/common/numeric/prepareQueryVariants.d.ts +24 -0
  9. package/dist/common/numeric/prepareQueryVariants.d.ts.map +1 -1
  10. package/dist/common/numeric/searchAndRank.d.ts.map +1 -1
  11. package/dist/common/numeric/searchInData.d.ts.map +1 -1
  12. package/dist/common/numeric/syncSearchArrayMetadata.d.ts.map +1 -1
  13. package/dist/common/numeric/updateSearchMetadata.d.ts.map +1 -1
  14. package/dist/index.cjs +316 -112
  15. package/dist/index.d.cts +6 -1
  16. package/dist/index.d.ts +6 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +316 -112
  19. package/dist/types/index.d.ts +65 -0
  20. package/dist/types/index.d.ts.map +1 -1
  21. package/dist/utils/compareTokenized.d.ts +24 -0
  22. package/dist/utils/compareTokenized.d.ts.map +1 -0
  23. package/dist/vet/data/enote.d.ts +40 -0
  24. package/dist/vet/data/enote.d.ts.map +1 -0
  25. package/dist/vet/data/znamke.gen.d.ts +41 -0
  26. package/dist/vet/data/znamke.gen.d.ts.map +1 -0
  27. package/dist/vet/index.cjs +2468 -0
  28. package/dist/vet/index.d.cts +24 -0
  29. package/dist/vet/index.d.ts +24 -0
  30. package/dist/vet/index.d.ts.map +1 -0
  31. package/dist/vet/index.js +2426 -0
  32. package/dist/vet/normalizatorji.d.ts +104 -0
  33. package/dist/vet/normalizatorji.d.ts.map +1 -0
  34. package/dist/vet/ocena.d.ts +46 -0
  35. package/dist/vet/ocena.d.ts.map +1 -0
  36. package/dist/vet/spec.d.ts +35 -0
  37. package/dist/vet/spec.d.ts.map +1 -0
  38. package/dist/vet/uparjanje.d.ts +72 -0
  39. package/dist/vet/uparjanje.d.ts.map +1 -0
  40. package/package.json +29 -11
package/dist/index.js CHANGED
@@ -212,6 +212,22 @@ function prepareStringForSearch(input) {
212
212
  const tokens = tokenize(sanitised, DEFAULT_TOKENIZE_CONFIG);
213
213
  return tokens.sort();
214
214
  }
215
+ // src/utils/compareTokenized.ts
216
+ function compareTokenized(a, b) {
217
+ const aTokens = new Set(prepareStringForSearch(a));
218
+ const bTokens = new Set(prepareStringForSearch(b));
219
+ if (aTokens.size === 0 && bTokens.size === 0)
220
+ return 1;
221
+ let intersection = 0;
222
+ for (const token of aTokens) {
223
+ if (bTokens.has(token))
224
+ intersection++;
225
+ }
226
+ const union = aTokens.size + bTokens.size - intersection;
227
+ if (union === 0)
228
+ return 0;
229
+ return intersection / union;
230
+ }
215
231
  // src/utils/phoneNormalization.ts
216
232
  var RE_ASCII_DIGITS = /^[0-9]+$/;
217
233
  var RE_PHONE_LIKE_QUERY = /^[\d+()/\-. ]+$/;
@@ -410,6 +426,38 @@ function extractStringsFromValue(value, results) {
410
426
  }
411
427
  }
412
428
  }
429
+ function applyValueNormalizers(value, field, normalizers) {
430
+ let text = value;
431
+ const classes = {};
432
+ if (!normalizers?.length)
433
+ return { text, classes };
434
+ for (const normalizer of normalizers) {
435
+ if (normalizer.fields && !normalizer.fields.includes(field))
436
+ continue;
437
+ const izhod = normalizer.fn(text, field);
438
+ if (izhod === undefined)
439
+ continue;
440
+ if (typeof izhod === "string") {
441
+ text = izhod;
442
+ continue;
443
+ }
444
+ text = izhod.text;
445
+ for (const [kljuc, vrednost] of Object.entries(izhod.classes ?? {})) {
446
+ const seznam = Array.isArray(vrednost) ? vrednost : [vrednost];
447
+ const obstojeci = classes[kljuc] ?? [];
448
+ for (const v of seznam) {
449
+ if (v != null && v !== "" && !obstojeci.includes(String(v)))
450
+ obstojeci.push(String(v));
451
+ }
452
+ classes[kljuc] = obstojeci;
453
+ }
454
+ }
455
+ return { text, classes };
456
+ }
457
+ function itemClasses(metadata, id) {
458
+ const zapis = metadata.classes?.get(id);
459
+ return zapis && Object.keys(zapis).length ? zapis : undefined;
460
+ }
413
461
  function prepareObjectForSearchNumeric(obj, spec, tokensMap) {
414
462
  if (isDeletedOrBlocked(obj)) {
415
463
  return;
@@ -417,11 +465,12 @@ function prepareObjectForSearchNumeric(obj, spec, tokensMap) {
417
465
  if (spec?.enrichSearchObjectFn) {
418
466
  spec.enrichSearchObjectFn(obj, spec.searchContext);
419
467
  }
420
- const sorted = spec?.extractSearchableStringFn ? buildSortedFromExtractFn(obj, spec.extractSearchableStringFn, tokensMap) : buildSortedFromFields(obj, spec, tokensMap);
468
+ const classes = {};
469
+ const sorted = spec?.extractSearchableStringFn ? buildSortedFromExtractFn(obj, spec.extractSearchableStringFn, tokensMap) : buildSortedFromFields(obj, spec, tokensMap, classes);
421
470
  if (sorted === undefined)
422
471
  return;
423
- const firstN = spec?.keyFields && spec.keyFields.length > 0 ? buildFirstNFromKeyFields(obj, spec.keyFields, spec.firstTokensN ?? DEFAULT_FIRST_TOKENS_N, spec.phoneFields ?? DEFAULT_PHONE_FIELDS, tokensMap) : undefined;
424
- return { sorted, firstN };
472
+ const firstN = spec?.keyFields && spec.keyFields.length > 0 ? buildFirstNFromKeyFields(obj, spec.keyFields, spec.firstTokensN ?? DEFAULT_FIRST_TOKENS_N, spec.phoneFields ?? DEFAULT_PHONE_FIELDS, tokensMap, spec.valueNormalizers) : undefined;
473
+ return Object.keys(classes).length ? { sorted, firstN, classes } : { sorted, firstN };
425
474
  }
426
475
  function buildSortedFromExtractFn(obj, extractFn, tokensMap) {
427
476
  const str = extractFn(obj);
@@ -429,7 +478,7 @@ function buildSortedFromExtractFn(obj, extractFn, tokensMap) {
429
478
  return;
430
479
  return prepareStringForSearchNumeric(str, tokensMap).sorted;
431
480
  }
432
- function buildSortedFromFields(obj, spec, tokensMap) {
481
+ function buildSortedFromFields(obj, spec, tokensMap, classesOut = {}) {
433
482
  const allTokens = [];
434
483
  const fieldMatchModes = spec?.fieldMatchModes;
435
484
  const fieldsToSearch = spec?.searchInFields ?? Object.keys(obj);
@@ -462,7 +511,19 @@ function buildSortedFromFields(obj, spec, tokensMap) {
462
511
  }
463
512
  if (fieldStrings.length === 0)
464
513
  continue;
465
- const fieldText = fieldStrings.join(" ");
514
+ const normalizirane = spec?.valueNormalizers?.length ? fieldStrings.map((s) => applyValueNormalizers(s, keyStr, spec.valueNormalizers)) : undefined;
515
+ const fieldText = normalizirane ? normalizirane.map((n) => n.text).join(" ") : fieldStrings.join(" ");
516
+ if (normalizirane) {
517
+ for (const n of normalizirane) {
518
+ for (const [kljuc, vrednosti] of Object.entries(n.classes)) {
519
+ const obstojeci = classesOut[kljuc] ?? [];
520
+ for (const v of vrednosti)
521
+ if (!obstojeci.includes(v))
522
+ obstojeci.push(v);
523
+ classesOut[kljuc] = obstojeci;
524
+ }
525
+ }
526
+ }
466
527
  const datesNormalized = normalizeDates(fieldText);
467
528
  const preprocessed = preprocessString(datesNormalized);
468
529
  const sanitised = sanitiseString(preprocessed);
@@ -480,7 +541,7 @@ function buildSortedFromFields(obj, spec, tokensMap) {
480
541
  const uniqueTokens = [...new Set(allTokens)].sort((a, b) => a - b);
481
542
  return new Uint32Array(uniqueTokens);
482
543
  }
483
- function buildFirstNFromKeyFields(obj, keyFields, n, phoneFields, tokensMap) {
544
+ function buildFirstNFromKeyFields(obj, keyFields, n, phoneFields, tokensMap, normalizers) {
484
545
  const strings = [];
485
546
  const phoneFieldPaths = new Set(phoneFields);
486
547
  for (const field of keyFields) {
@@ -490,7 +551,9 @@ function buildFirstNFromKeyFields(obj, keyFields, n, phoneFields, tokensMap) {
490
551
  const value = isDotNotation(keyStr) ? getValueByPath(obj, keyStr) : obj[field];
491
552
  if (value == null)
492
553
  continue;
493
- extractStringsFromValue(value, strings);
554
+ const zacasno = [];
555
+ extractStringsFromValue(value, zacasno);
556
+ strings.push(...normalizers?.length ? zacasno.map((s) => applyValueNormalizers(s, keyStr, normalizers).text) : zacasno);
494
557
  }
495
558
  if (strings.length === 0)
496
559
  return;
@@ -519,6 +582,9 @@ function createSearchArrayMetadataNumeric(data, spec) {
519
582
  if (result.firstN !== undefined) {
520
583
  metadata.unsorted.set(id, result.firstN);
521
584
  }
585
+ if (result.classes !== undefined) {
586
+ (metadata.classes ??= new Map).set(id, result.classes);
587
+ }
522
588
  }
523
589
  }
524
590
  return metadata;
@@ -554,6 +620,7 @@ function updateSearchMetadataNumeric(metadata, objectId, obj, spec, tokensMap) {
554
620
  if (result === undefined) {
555
621
  metadata.sorted.delete(objectId);
556
622
  metadata.unsorted.delete(objectId);
623
+ metadata.classes?.delete(objectId);
557
624
  return false;
558
625
  }
559
626
  metadata.sorted.set(objectId, result.sorted);
@@ -562,6 +629,11 @@ function updateSearchMetadataNumeric(metadata, objectId, obj, spec, tokensMap) {
562
629
  } else {
563
630
  metadata.unsorted.delete(objectId);
564
631
  }
632
+ if (result.classes !== undefined) {
633
+ (metadata.classes ??= new Map).set(objectId, result.classes);
634
+ } else {
635
+ metadata.classes?.delete(objectId);
636
+ }
565
637
  return true;
566
638
  }
567
639
  function updateSearchMetadataBatchNumeric(metadata, batch, spec) {
@@ -790,20 +862,49 @@ function allTokensMatchNumeric(searchTokenStrs, targetTokens, opts) {
790
862
  }
791
863
 
792
864
  // src/common/numeric/prepareQueryVariants.ts
865
+ function normalizeQueryWithOpts(query, opts) {
866
+ const normalizers = opts?.queryNormalizers;
867
+ if (!normalizers?.length)
868
+ return { text: query, classes: {} };
869
+ let text = query;
870
+ const classes = {};
871
+ for (const normalizer of normalizers) {
872
+ const fn = typeof normalizer === "function" ? normalizer : normalizer.fn;
873
+ const izhod = fn(text, "");
874
+ if (izhod === undefined)
875
+ continue;
876
+ if (typeof izhod === "string") {
877
+ text = izhod;
878
+ continue;
879
+ }
880
+ text = izhod.text;
881
+ for (const [kljuc, vrednost] of Object.entries(izhod.classes ?? {})) {
882
+ const seznam = Array.isArray(vrednost) ? vrednost : [vrednost];
883
+ const obstojeci = classes[kljuc] ?? [];
884
+ for (const v of seznam) {
885
+ if (v != null && v !== "" && !obstojeci.includes(String(v)))
886
+ obstojeci.push(String(v));
887
+ }
888
+ classes[kljuc] = obstojeci;
889
+ }
890
+ }
891
+ return { text, classes };
892
+ }
793
893
  function prepareQueryVariants(query, opts) {
794
- const rawTokenStrs = prepareStringForSearch(query);
894
+ const { text: normalizirano, classes } = normalizeQueryWithOpts(query, opts);
895
+ const rawTokenStrs = prepareStringForSearch(normalizirano);
795
896
  const rawTokens = prepareQueryTokens(rawTokenStrs);
796
897
  const normalizers = opts?.phoneQueryNormalizers ?? [defaultQueryPhoneNormalizer];
797
898
  const seenPhones = new Set;
798
899
  const phoneTokens = [];
799
900
  for (const normalizer of normalizers) {
800
- const normalized = validateNormalizedPhone(normalizer(query), "Phone query normalizer");
901
+ const normalized = validateNormalizedPhone(normalizer(normalizirano), "Phone query normalizer");
801
902
  if (normalized === undefined || seenPhones.has(normalized))
802
903
  continue;
803
904
  seenPhones.add(normalized);
804
905
  phoneTokens.push(prepareQueryTokens([normalized]));
805
906
  }
806
- return { rawTokenStrs, rawTokens, phoneTokens };
907
+ return { rawTokenStrs, rawTokens, phoneTokens, classes };
807
908
  }
808
909
 
809
910
  // src/common/numeric/scoring.ts
@@ -922,12 +1023,13 @@ function searchInDataReturnObjectsNumeric(query, metadata, data, opts) {
922
1023
  return results;
923
1024
  }
924
1025
  function searchInDataReturnIdsWithLimitNumeric(query, metadata, limit, opts) {
925
- const { rawTokenStrs, rawTokens, phoneTokens } = prepareQueryVariants(query, opts);
1026
+ const { rawTokens, phoneTokens } = prepareQueryVariants(query, opts);
926
1027
  const phoneCandidates = findMatchingCandidates(metadata, phoneTokens, opts);
927
1028
  const candidates = phoneCandidates.length > 0 ? phoneCandidates : findMatchingCandidates(metadata, rawTokens.length > 0 ? [rawTokens] : [], opts);
928
1029
  if (candidates.length === 0)
929
1030
  return [];
930
- const qTokens = orderedTokenize(query);
1031
+ const qText = normalizeQueryWithOpts(query, opts).text;
1032
+ const qTokens = orderedTokenize(qText);
931
1033
  const hasUnsorted = metadata.unsorted.size > 0;
932
1034
  if (!hasUnsorted) {
933
1035
  if (limit === Infinity || limit >= candidates.length)
@@ -946,7 +1048,7 @@ function searchInDataReturnIdsWithLimitNumeric(query, metadata, limit, opts) {
946
1048
  for (let j = 0;j < unsortedIds.length; j++) {
947
1049
  itemTokens[j] = tokens[unsortedIds[j]] ?? "";
948
1050
  }
949
- scored[i] = { id, score: scoreOne(query, qTokens, itemTokens), order: i };
1051
+ scored[i] = { id, score: scoreOne(qText, qTokens, itemTokens), order: i };
950
1052
  }
951
1053
  scored.sort((a, b) => {
952
1054
  if (a.score !== b.score)
@@ -1398,10 +1500,16 @@ function applyPreparedTokens(metadata, id, result) {
1398
1500
  } else {
1399
1501
  metadata.unsorted.delete(id);
1400
1502
  }
1503
+ if (result.classes !== undefined) {
1504
+ (metadata.classes ??= new Map).set(id, result.classes);
1505
+ } else {
1506
+ metadata.classes?.delete(id);
1507
+ }
1401
1508
  }
1402
1509
  function deletePreparedTokens(metadata, id) {
1403
1510
  metadata.sorted.delete(id);
1404
1511
  metadata.unsorted.delete(id);
1512
+ metadata.classes?.delete(id);
1405
1513
  }
1406
1514
  function syncSearchArrayMetadataNumeric(metadata, newData, spec) {
1407
1515
  const result = {
@@ -1491,6 +1599,135 @@ function syncSearchArrayMetadataNumericWithPrevious(metadata, previousData, newD
1491
1599
  clearTokensMap(tokensMap);
1492
1600
  return result;
1493
1601
  }
1602
+ // src/common/numeric/searchAndRank.ts
1603
+ function tokenIdsToStrings(tokenIds) {
1604
+ if (tokenIds === undefined)
1605
+ return;
1606
+ const out = new Array(tokenIds.length);
1607
+ for (let i = 0;i < tokenIds.length; i++) {
1608
+ out[i] = tokens[tokenIds[i]] ?? "";
1609
+ }
1610
+ return out;
1611
+ }
1612
+ function searchAndRankNumeric(query, data, metadata, options) {
1613
+ const { primaryTextFn, exactKeysFn, limit, opts } = options;
1614
+ const ids = searchInDataReturnIdsNumeric(query, metadata, opts);
1615
+ if (ids.length === 0)
1616
+ return [];
1617
+ const qText = normalizeQueryWithOpts(query, opts).text;
1618
+ const qTokens = orderedTokenize(qText);
1619
+ const scored = [];
1620
+ for (const id of ids) {
1621
+ const item = data.get(id);
1622
+ if (!item)
1623
+ continue;
1624
+ const itemTokens = tokenIdsToStrings(metadata.unsorted.get(id)) ?? orderedTokenize(primaryTextFn(item) || "");
1625
+ const exactKeys = exactKeysFn?.(item);
1626
+ const score = scoreOne(qText, qTokens, itemTokens, exactKeys);
1627
+ scored.push({ id, item, score });
1628
+ }
1629
+ scored.sort((x, y) => {
1630
+ if (y.score !== x.score)
1631
+ return y.score - x.score;
1632
+ const xText = primaryTextFn(x.item) || "";
1633
+ const yText = primaryTextFn(y.item) || "";
1634
+ return xText.localeCompare(yText);
1635
+ });
1636
+ if (limit === undefined || limit === Infinity || limit >= scored.length)
1637
+ return scored;
1638
+ return scored.slice(0, limit);
1639
+ }
1640
+
1641
+ // src/common/numeric/matchMany.ts
1642
+ function naSezname(classes) {
1643
+ if (!classes)
1644
+ return;
1645
+ const out = {};
1646
+ for (const [kljuc, vrednost] of Object.entries(classes)) {
1647
+ const seznam = Array.isArray(vrednost) ? vrednost.map(String) : [String(vrednost)];
1648
+ if (seznam.length)
1649
+ out[kljuc] = seznam;
1650
+ }
1651
+ return Object.keys(out).length ? out : undefined;
1652
+ }
1653
+ async function* matchMany(prepared, queries, options) {
1654
+ const { queryOf, idOf, limit = 3, minScore = 0, kos = 50, samoEnolicno, rank, accept, opts } = options;
1655
+ const retrievalLimit = options.retrievalLimit ?? Math.max(20, limit * 4);
1656
+ const primaryTextOf = options.primaryTextOf ?? ((item) => item["naziv"]);
1657
+ const porabljeni = samoEnolicno ? new Set : undefined;
1658
+ let kosZbirka = [];
1659
+ for (let indeks = 0;indeks < queries.length; indeks++) {
1660
+ const query = queries[indeks];
1661
+ const vhod = queryOf(query);
1662
+ const text = typeof vhod === "string" ? vhod : vhod.text;
1663
+ const queryClasses = typeof vhod === "string" ? undefined : naSezname(vhod.classes);
1664
+ const id = idOf ? idOf(query, indeks) : String(query["_id"] ?? query["id"] ?? indeks);
1665
+ const poisciKandidate = (besedilo, razredi) => {
1666
+ if (!besedilo.trim())
1667
+ return { kandidati: [], zadetkov: 0 };
1668
+ const zadetki = searchAndRankNumeric(besedilo, prepared.data, prepared.metadata, {
1669
+ primaryTextFn: primaryTextOf,
1670
+ ...options.exactKeysOf ? { exactKeysFn: options.exactKeysOf } : {},
1671
+ ...opts ? { opts } : {},
1672
+ limit: retrievalLimit
1673
+ });
1674
+ const poizvedbaZaDomeno = { text: besedilo, ...razredi ? { classes: razredi } : {} };
1675
+ const najdeni = [];
1676
+ for (const zadetek of zadetki) {
1677
+ const classes = itemClasses(prepared.metadata, zadetek.id);
1678
+ const kandidat = {
1679
+ id: zadetek.id,
1680
+ item: zadetek.item,
1681
+ ...classes ? { classes } : {}
1682
+ };
1683
+ if (accept && !accept(kandidat, poizvedbaZaDomeno))
1684
+ continue;
1685
+ const ocena = rank ? rank(kandidat, poizvedbaZaDomeno) : zadetek.score;
1686
+ if (ocena < minScore)
1687
+ continue;
1688
+ if (porabljeni?.has(zadetek.id))
1689
+ continue;
1690
+ najdeni.push({ id: zadetek.id, item: zadetek.item, score: ocena, ...classes ? { classes } : {} });
1691
+ }
1692
+ najdeni.sort((a, b) => {
1693
+ if (b.score !== a.score)
1694
+ return b.score - a.score;
1695
+ return (primaryTextOf(a.item) ?? "").localeCompare(primaryTextOf(b.item) ?? "");
1696
+ });
1697
+ if (najdeni.length > limit)
1698
+ najdeni.length = limit;
1699
+ return { kandidati: najdeni, zadetkov: zadetki.length };
1700
+ };
1701
+ let { kandidati, zadetkov } = poisciKandidate(text, queryClasses);
1702
+ const poskusiAlternative = kandidati.length === 0 && (options.alternativneLeCeNiZadetkov ? zadetkov === 0 : true);
1703
+ if (poskusiAlternative && options.alternativnePoizvedbe) {
1704
+ for (const alternativa of options.alternativnePoizvedbe(query)) {
1705
+ const altBesedilo = typeof alternativa === "string" ? alternativa : alternativa.text;
1706
+ if (!altBesedilo?.trim() || altBesedilo === text)
1707
+ continue;
1708
+ const altRazredi = typeof alternativa === "string" ? undefined : naSezname(alternativa.classes);
1709
+ ({ kandidati } = poisciKandidate(altBesedilo, altRazredi));
1710
+ if (kandidati.length)
1711
+ break;
1712
+ }
1713
+ }
1714
+ if (porabljeni) {
1715
+ for (const kandidat of kandidati)
1716
+ porabljeni.add(kandidat.id);
1717
+ }
1718
+ kosZbirka.push({
1719
+ id,
1720
+ ...queryClasses ? { queryClasses } : {},
1721
+ kandidati
1722
+ });
1723
+ if (kosZbirka.length >= kos) {
1724
+ yield kosZbirka;
1725
+ kosZbirka = [];
1726
+ }
1727
+ }
1728
+ if (kosZbirka.length)
1729
+ yield kosZbirka;
1730
+ }
1494
1731
  // src/common/numeric/updateSearchLinkedMetadata.ts
1495
1732
  function tokensEqual2(a, b) {
1496
1733
  if (a.length !== b.length)
@@ -1643,43 +1880,6 @@ function syncLinkedItemsForPrimaryNumeric(linked, primaryId, newLinkedItems, for
1643
1880
  clearTokensMap(tokensMap);
1644
1881
  return result;
1645
1882
  }
1646
- // src/common/numeric/searchAndRank.ts
1647
- function tokenIdsToStrings(tokenIds) {
1648
- if (tokenIds === undefined)
1649
- return;
1650
- const out = new Array(tokenIds.length);
1651
- for (let i = 0;i < tokenIds.length; i++) {
1652
- out[i] = tokens[tokenIds[i]] ?? "";
1653
- }
1654
- return out;
1655
- }
1656
- function searchAndRankNumeric(query, data, metadata, options) {
1657
- const { primaryTextFn, exactKeysFn, limit, opts } = options;
1658
- const ids = searchInDataReturnIdsNumeric(query, metadata, opts);
1659
- if (ids.length === 0)
1660
- return [];
1661
- const qTokens = orderedTokenize(query);
1662
- const scored = [];
1663
- for (const id of ids) {
1664
- const item = data.get(id);
1665
- if (!item)
1666
- continue;
1667
- const itemTokens = tokenIdsToStrings(metadata.unsorted.get(id)) ?? orderedTokenize(primaryTextFn(item) || "");
1668
- const exactKeys = exactKeysFn?.(item);
1669
- const score = scoreOne(query, qTokens, itemTokens, exactKeys);
1670
- scored.push({ id, item, score });
1671
- }
1672
- scored.sort((x, y) => {
1673
- if (y.score !== x.score)
1674
- return y.score - x.score;
1675
- const xText = primaryTextFn(x.item) || "";
1676
- const yText = primaryTextFn(y.item) || "";
1677
- return xText.localeCompare(yText);
1678
- });
1679
- if (limit === undefined || limit === Infinity || limit >= scored.length)
1680
- return scored;
1681
- return scored.slice(0, limit);
1682
- }
1683
1883
  // src/common/SearchUniverse.ts
1684
1884
  function tokensEqual3(a, b) {
1685
1885
  if (a.length !== b.length)
@@ -2121,67 +2321,71 @@ class SearchUniverse {
2121
2321
  }
2122
2322
  }
2123
2323
  export {
2124
- upsertPrimaryItemNumeric as upsertPrimaryItem,
2125
- upsertLinkedItemNumeric as upsertLinkedItem,
2126
- updateSearchMetadataBatchNumeric as updateSearchMetadataBatch,
2127
- updateSearchMetadataNumeric as updateSearchMetadata,
2128
- tokens,
2129
- tokenize,
2130
- syncSearchArrayMetadataNumericWithPrevious as syncSearchArrayMetadataWithPrevious,
2131
- syncSearchArrayMetadataNumeric as syncSearchArrayMetadata,
2132
- syncLinkedItemsForPrimaryNumeric as syncLinkedItemsForPrimary,
2133
- searchableDataToArray,
2134
- searchInDataReturnIdsWithLimitNumeric as searchInDataWithLimit,
2135
- searchInDataReturnObjectsNumeric as searchInDataReturnObjects,
2136
- searchInDataReturnIdsNumeric as searchInDataReturnIds,
2137
- searchInDataReturnIdsNumeric as searchInData,
2138
- searchAndRankNumeric,
2139
- searchAndRankNumeric as searchAndRank,
2140
- scoreOrderAndPresence,
2141
- scoreOne,
2142
- scoreBag,
2143
- sanitiseString,
2144
- resolvePhoneQueryNormalizer,
2145
- resetTokenRegistry,
2146
- removePrimaryItemNumeric as removePrimaryItem,
2147
- removeLinkedItemNumeric as removeLinkedItem,
2148
- removeFromSearchMetadataBatchNumeric as removeFromSearchMetadataBatch,
2149
- removeFromSearchMetadataNumeric as removeFromSearchMetadata,
2150
- registerToken,
2151
- preprocessString,
2152
- prepareStringForSearch,
2153
- prepareQueryTokens,
2154
- prepareObjectForSearchNumeric as prepareObjectForSearch,
2155
- orderedTokenize,
2156
- normalizeDates,
2157
- matchTokenInSortedListNumeric,
2158
- matchPreparedTokenInSortedList,
2159
- isDeletedOrBlocked,
2160
- getTokenCount,
2161
- getTokenById,
2162
- getOrCreateTokenId,
2163
- findTokenId,
2164
- findInLinkedArraysSimpleNumeric,
2165
- findInLinkedArraysNumeric,
2166
- encodeTokenWithMode,
2167
- defaultQueryPhoneNormalizer,
2168
- defaultPhoneNormalizer,
2169
- decodeTokenId,
2170
- decodeMatchMode,
2171
- createTokensMap,
2172
- createSearchLinkedMetadataNumeric as createSearchLinkedMetadata,
2173
- createSearchArrayMetadataNumeric as createSearchArrayMetadata,
2174
- clearTokensMap,
2175
- binarySearchUint32,
2176
- arrayToSearchableData,
2177
- allTokensMatchNumeric,
2178
- allPreparedTokensMatch,
2179
- TOKEN_ID_MASK,
2180
- SearchUniverse,
2181
- PREFIX_TO_MATCH_MODE,
2182
- MATCH_MODE_PREFIXES,
2183
- MATCH_MODE_BITS,
2184
- DEFAULT_SEARCH_OPTS,
2324
+ AugmentedMetadata,
2185
2325
  DEFAULT_PHONE_FIELDS,
2186
- AugmentedMetadata
2326
+ DEFAULT_SEARCH_OPTS,
2327
+ MATCH_MODE_BITS,
2328
+ MATCH_MODE_PREFIXES,
2329
+ PREFIX_TO_MATCH_MODE,
2330
+ SearchUniverse,
2331
+ TOKEN_ID_MASK,
2332
+ allPreparedTokensMatch,
2333
+ allTokensMatchNumeric,
2334
+ arrayToSearchableData,
2335
+ binarySearchUint32,
2336
+ clearTokensMap,
2337
+ compareTokenized,
2338
+ createSearchArrayMetadataNumeric as createSearchArrayMetadata,
2339
+ createSearchLinkedMetadataNumeric as createSearchLinkedMetadata,
2340
+ createTokensMap,
2341
+ decodeMatchMode,
2342
+ decodeTokenId,
2343
+ defaultPhoneNormalizer,
2344
+ defaultQueryPhoneNormalizer,
2345
+ encodeTokenWithMode,
2346
+ findInLinkedArraysNumeric,
2347
+ findInLinkedArraysSimpleNumeric,
2348
+ findTokenId,
2349
+ getOrCreateTokenId,
2350
+ getTokenById,
2351
+ getTokenCount,
2352
+ isDeletedOrBlocked,
2353
+ itemClasses,
2354
+ matchMany,
2355
+ matchPreparedTokenInSortedList,
2356
+ matchTokenInSortedListNumeric,
2357
+ normalizeDates,
2358
+ normalizeQueryWithOpts,
2359
+ orderedTokenize,
2360
+ prepareObjectForSearchNumeric as prepareObjectForSearch,
2361
+ prepareQueryTokens,
2362
+ prepareStringForSearch,
2363
+ preprocessString,
2364
+ registerToken,
2365
+ removeFromSearchMetadataNumeric as removeFromSearchMetadata,
2366
+ removeFromSearchMetadataBatchNumeric as removeFromSearchMetadataBatch,
2367
+ removeLinkedItemNumeric as removeLinkedItem,
2368
+ removePrimaryItemNumeric as removePrimaryItem,
2369
+ resetTokenRegistry,
2370
+ resolvePhoneQueryNormalizer,
2371
+ sanitiseString,
2372
+ scoreBag,
2373
+ scoreOne,
2374
+ scoreOrderAndPresence,
2375
+ searchAndRankNumeric as searchAndRank,
2376
+ searchAndRankNumeric,
2377
+ searchInDataReturnIdsNumeric as searchInData,
2378
+ searchInDataReturnIdsNumeric as searchInDataReturnIds,
2379
+ searchInDataReturnObjectsNumeric as searchInDataReturnObjects,
2380
+ searchInDataReturnIdsWithLimitNumeric as searchInDataWithLimit,
2381
+ searchableDataToArray,
2382
+ syncLinkedItemsForPrimaryNumeric as syncLinkedItemsForPrimary,
2383
+ syncSearchArrayMetadataNumeric as syncSearchArrayMetadata,
2384
+ syncSearchArrayMetadataNumericWithPrevious as syncSearchArrayMetadataWithPrevious,
2385
+ tokenize,
2386
+ tokens,
2387
+ updateSearchMetadataNumeric as updateSearchMetadata,
2388
+ updateSearchMetadataBatchNumeric as updateSearchMetadataBatch,
2389
+ upsertLinkedItemNumeric as upsertLinkedItem,
2390
+ upsertPrimaryItemNumeric as upsertPrimaryItem
2187
2391
  };
@@ -27,6 +27,17 @@ export interface NumericSearchMetadata {
27
27
  sorted: Map<Id, NumericTokenSortedList>;
28
28
  /** First-N token IDs in SOURCE order per item — used for positional ranking. */
29
29
  unsorted: Map<Id, NumericTokenUnsortedList>;
30
+ /**
31
+ * Domain classes per item, produced by `SearchableObjectSpec.valueNormalizers`
32
+ * (e.g. `{ razpon: ['15-30'], enota: ['tbl'] }`).
33
+ *
34
+ * Classes are **not tokens**: they never take part in retrieval, so a candidate
35
+ * missing a class is never excluded. They exist so a domain scorer can reward
36
+ * equal class values and penalize conflicting ones (soft semantics).
37
+ *
38
+ * Absent when no normalizer produced classes.
39
+ */
40
+ classes?: Map<Id, Record<string, string[]>>;
30
41
  }
31
42
  /** Map of objects by their ID for efficient lookup */
32
43
  export type SearchableData<T extends SearchableObject> = Map<Id, T>;
@@ -97,7 +108,55 @@ export interface SearchableObjectSpec<T extends SearchableObject, C = unknown> {
97
108
  * @default 8
98
109
  */
99
110
  firstTokensN?: number;
111
+ /**
112
+ * Domain normalizers applied to FIELD VALUES at index time, before the standard
113
+ * pipeline (dates → preprocess → sanitise → tokenize) and before `fieldMatchModes`.
114
+ *
115
+ * A normalizer either returns a replacement string (canonical units, brand aliases)
116
+ * or a {@link NormalizedValue} carrying extra **domain classes** (a range, a pack
117
+ * size, an animal species). Classes are stored in `metadata.classes` and are never
118
+ * required for a match — see {@link NumericSearchMetadata.classes}.
119
+ *
120
+ * @example
121
+ * ```typescript
122
+ * valueNormalizers: [{ fn: (v) => v.replace(/\btablete?\b/gi, 'tbl') }]
123
+ * ```
124
+ */
125
+ valueNormalizers?: readonly ValueNormalizer[];
100
126
  }
127
+ /**
128
+ * Result of a domain normalizer: canonical text plus optional domain classes.
129
+ *
130
+ * @example
131
+ * ```typescript
132
+ * { text: '15 30 KG', classes: { razpon: '15-30' } }
133
+ * ```
134
+ */
135
+ export interface NormalizedValue {
136
+ /** Canonical (replacement) text that continues through the normal pipeline. */
137
+ text: string;
138
+ /** Domain classes; a single value or a list (both become a list in metadata). */
139
+ classes?: Record<string, string | string[]>;
140
+ }
141
+ /**
142
+ * Index-time normalizer for a field value (domain extension seam).
143
+ *
144
+ * Returning `undefined` keeps the previous text; normalizers run in order, so a
145
+ * later one sees the previous one's replacement (but not its classes).
146
+ */
147
+ export interface ValueNormalizer {
148
+ /** Fields this normalizer applies to. Default: every searched field. */
149
+ fields?: readonly string[];
150
+ fn: (value: string, field: string) => string | NormalizedValue | undefined;
151
+ }
152
+ /**
153
+ * Query-time normalizer (domain extension seam). Must be the same mapping as the
154
+ * index-time one, otherwise query tokens and stored tokens drift apart.
155
+ *
156
+ * Accepts either a plain function or the same `{ fn }` shape as
157
+ * {@link ValueNormalizer}, so one definition can be reused on both sides.
158
+ */
159
+ export type QueryNormalizer = ((query: string) => string | NormalizedValue | undefined) | ValueNormalizer;
101
160
  /** Default cap on `metadata.unsorted` length. */
102
161
  export declare const DEFAULT_FIRST_TOKENS_N = 8;
103
162
  /**
@@ -134,6 +193,12 @@ export interface SearchOpts {
134
193
  * When a phone variant finds candidates, it takes precedence over raw tokens.
135
194
  */
136
195
  phoneQueryNormalizers?: readonly PhoneQueryNormalizer[];
196
+ /**
197
+ * Domain normalizers applied to the QUERY before tokenization; the same mapping
198
+ * must be configured as `SearchableObjectSpec.valueNormalizers` at index time.
199
+ * Query classes are available to the caller through {@link normalizeQueryWithOpts}.
200
+ */
201
+ queryNormalizers?: readonly QueryNormalizer[];
137
202
  }
138
203
  /** Default match-mode options. Phone query normalizers are resolved per search. */
139
204
  export declare const DEFAULT_SEARCH_OPTS: Required<Pick<SearchOpts, 'matchWords' | 'matchNumbers' | 'matchNumbersShort' | 'matchNumbersThreshold'>>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}