@inseefr/lunatic 3.4.8-rc.0 → 3.4.9
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/components/CheckboxGroup/CheckboxGroup.js +3 -1
- package/components/CheckboxGroup/CheckboxGroup.js.map +1 -1
- package/components/CheckboxGroup/CustomCheckboxGroup.d.ts +1 -1
- package/components/CheckboxGroup/CustomCheckboxGroup.js +2 -5
- package/components/CheckboxGroup/CustomCheckboxGroup.js.map +1 -1
- package/components/CheckboxOne/CheckboxOne.js +3 -1
- package/components/CheckboxOne/CheckboxOne.js.map +1 -1
- package/components/Datepicker/Datepicker.js +7 -1
- package/components/Datepicker/Datepicker.js.map +1 -1
- package/components/Input/Input.js +3 -1
- package/components/Input/Input.js.map +1 -1
- package/components/InputNumber/InputNumber.spec.js +12 -0
- package/components/InputNumber/InputNumber.spec.js.map +1 -1
- package/components/InputNumber/InputNumberThousand.js +3 -1
- package/components/InputNumber/InputNumberThousand.js.map +1 -1
- package/components/Radio/Radio.d.ts +1 -0
- package/components/Radio/Radio.js +3 -1
- package/components/Radio/Radio.js.map +1 -1
- package/components/library.d.ts +1 -0
- package/components/shared/Checkbox/CheckboxOption.d.ts +4 -0
- package/components/shared/Checkbox/CheckboxOption.js +4 -2
- package/components/shared/Checkbox/CheckboxOption.js.map +1 -1
- package/components/shared/Checkbox/CheckboxOption.spec.js +14 -0
- package/components/shared/Checkbox/CheckboxOption.spec.js.map +1 -1
- package/components/shared/Radio/RadioGroup.d.ts +1 -1
- package/components/shared/Radio/RadioGroup.js +2 -2
- package/components/shared/Radio/RadioGroup.js.map +1 -1
- package/components/shared/Radio/RadioOption.d.ts +1 -0
- package/components/shared/Radio/RadioOption.js +2 -2
- package/components/shared/Radio/RadioOption.js.map +1 -1
- package/components/shared/Radio/RadioOption.spec.js +12 -0
- package/components/shared/Radio/RadioOption.spec.js.map +1 -1
- package/components/type.d.ts +3 -0
- package/esm/components/CheckboxGroup/CheckboxGroup.js +3 -1
- package/esm/components/CheckboxGroup/CheckboxGroup.js.map +1 -1
- package/esm/components/CheckboxGroup/CustomCheckboxGroup.d.ts +1 -1
- package/esm/components/CheckboxGroup/CustomCheckboxGroup.js +2 -6
- package/esm/components/CheckboxGroup/CustomCheckboxGroup.js.map +1 -1
- package/esm/components/CheckboxOne/CheckboxOne.js +3 -1
- package/esm/components/CheckboxOne/CheckboxOne.js.map +1 -1
- package/esm/components/Datepicker/Datepicker.js +7 -1
- package/esm/components/Datepicker/Datepicker.js.map +1 -1
- package/esm/components/Input/Input.js +3 -1
- package/esm/components/Input/Input.js.map +1 -1
- package/esm/components/InputNumber/InputNumber.spec.js +12 -0
- package/esm/components/InputNumber/InputNumber.spec.js.map +1 -1
- package/esm/components/InputNumber/InputNumberThousand.js +3 -1
- package/esm/components/InputNumber/InputNumberThousand.js.map +1 -1
- package/esm/components/Radio/Radio.d.ts +1 -0
- package/esm/components/Radio/Radio.js +3 -1
- package/esm/components/Radio/Radio.js.map +1 -1
- package/esm/components/library.d.ts +1 -0
- package/esm/components/shared/Checkbox/CheckboxOption.d.ts +4 -0
- package/esm/components/shared/Checkbox/CheckboxOption.js +4 -2
- package/esm/components/shared/Checkbox/CheckboxOption.js.map +1 -1
- package/esm/components/shared/Checkbox/CheckboxOption.spec.js +14 -0
- package/esm/components/shared/Checkbox/CheckboxOption.spec.js.map +1 -1
- package/esm/components/shared/Radio/RadioGroup.d.ts +1 -1
- package/esm/components/shared/Radio/RadioGroup.js +2 -2
- package/esm/components/shared/Radio/RadioGroup.js.map +1 -1
- package/esm/components/shared/Radio/RadioOption.d.ts +1 -0
- package/esm/components/shared/Radio/RadioOption.js +2 -2
- package/esm/components/shared/Radio/RadioOption.js.map +1 -1
- package/esm/components/shared/Radio/RadioOption.spec.js +12 -0
- package/esm/components/shared/Radio/RadioOption.spec.js.map +1 -1
- package/esm/components/type.d.ts +3 -0
- package/esm/index.d.ts +0 -1
- package/esm/index.js +0 -1
- package/esm/index.js.map +1 -1
- package/esm/main.css +5 -2
- package/esm/main.css.map +1 -1
- package/esm/type.source.d.ts +25 -40
- package/esm/type.source.js +1 -0
- package/esm/type.source.js.map +1 -1
- package/esm/use-lunatic/commons/fill-components/fill-components.d.ts +1 -0
- package/esm/use-lunatic/commons/fill-components/fill-components.js +1 -1
- package/esm/use-lunatic/commons/fill-components/fill-components.js.map +1 -1
- package/esm/use-lunatic/commons/page.js +4 -1
- package/esm/use-lunatic/commons/page.js.map +1 -1
- package/esm/use-lunatic/lunatic-context.d.ts +7 -1
- package/esm/use-lunatic/lunatic-context.js +7 -1
- package/esm/use-lunatic/lunatic-context.js.map +1 -1
- package/esm/use-lunatic/props/getComponentTypeProps.d.ts +3 -0
- package/esm/use-lunatic/props/propOptions.d.ts +1 -1
- package/esm/use-lunatic/props/propOptions.js.map +1 -1
- package/esm/use-lunatic/reducer/reducerInitializer.d.ts +2 -1
- package/esm/use-lunatic/reducer/reducerInitializer.js +3 -1
- package/esm/use-lunatic/reducer/reducerInitializer.js.map +1 -1
- package/esm/use-lunatic/type.d.ts +7 -0
- package/esm/use-lunatic/use-lunatic.js +6 -1
- package/esm/use-lunatic/use-lunatic.js.map +1 -1
- package/esm/utils/search/SearchMiniSearch.spec.d.ts +1 -0
- package/esm/utils/search/SearchMiniSearch.spec.js +51 -0
- package/esm/utils/search/SearchMiniSearch.spec.js.map +1 -0
- package/esm/utils/search/melauto.js +1 -1
- package/esm/utils/search/melauto.spec.d.ts +1 -0
- package/esm/utils/search/melauto.spec.js +67 -0
- package/esm/utils/search/melauto.spec.js.map +1 -0
- package/esm/utils/search/tokenizer.d.ts +7 -2
- package/esm/utils/search/tokenizer.js +23 -8
- package/esm/utils/search/tokenizer.js.map +1 -1
- package/esm/utils/search/tokenizer.spec.d.ts +1 -0
- package/esm/utils/search/tokenizer.spec.js +160 -0
- package/esm/utils/search/tokenizer.spec.js.map +1 -0
- package/index.d.ts +0 -1
- package/index.js +1 -4
- package/index.js.map +1 -1
- package/main.css +5 -2
- package/main.css.map +1 -1
- package/package.json +28 -1
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +3 -0
- package/src/components/CheckboxGroup/CustomCheckboxGroup.tsx +3 -14
- package/src/components/CheckboxOne/CheckboxOne.tsx +3 -0
- package/src/components/Datepicker/Datepicker.tsx +8 -1
- package/src/components/Input/Input.tsx +4 -0
- package/src/components/Input/__snapshots__/Input.spec.tsx.snap +2 -0
- package/src/components/InputNumber/InputNumber.spec.tsx +20 -0
- package/src/components/InputNumber/InputNumberThousand.tsx +4 -0
- package/src/components/InputNumber/__snapshots__/InputNumber.spec.tsx.snap +2 -0
- package/src/components/Radio/Radio.tsx +3 -0
- package/src/components/RosterForLoop/__snapshots__/RosterForLoop.spec.tsx.snap +2 -0
- package/src/components/shared/Checkbox/CheckboxOption.spec.tsx +21 -0
- package/src/components/shared/Checkbox/CheckboxOption.tsx +19 -0
- package/src/components/shared/Radio/RadioGroup.tsx +3 -0
- package/src/components/shared/Radio/RadioOption.spec.tsx +36 -0
- package/src/components/shared/Radio/RadioOption.tsx +5 -1
- package/src/components/type.ts +3 -0
- package/src/css/components/CheckboxOne.scss +1 -1
- package/src/css/components/CheckboxOption.scss +14 -18
- package/src/css/components/Combobox.scss +3 -2
- package/src/css/components/Datepicker.scss +8 -8
- package/src/css/components/Declarations.scss +1 -1
- package/src/css/components/Dragger.scss +6 -6
- package/src/css/components/Duration.scss +4 -4
- package/src/css/components/IconButton.scss +4 -2
- package/src/css/components/Input.scss +3 -0
- package/src/css/components/Missing.scss +1 -1
- package/src/css/components/Roundabout.scss +3 -3
- package/src/css/components/Suggester.scss +2 -2
- package/src/css/components/Table.scss +9 -7
- package/src/css/main.scss +167 -167
- package/src/index.ts +0 -2
- package/src/stories/behaviour/filter/dataLoop.json +22 -0
- package/src/stories/behaviour/filter/filter.stories.jsx +36 -0
- package/src/stories/behaviour/filter/source.json +238 -0
- package/src/stories/behaviour/filter/sourceLoop.json +372 -0
- package/src/stories/behaviour/missing/missing.stories.jsx +9 -0
- package/src/stories/behaviour/paste/test.stories.jsx +5 -0
- package/src/stories/checkbox-group/checkbox-group.stories.jsx +25 -6
- package/src/stories/checkbox-one/checkboxOne.stories.jsx +24 -2
- package/src/stories/overview/overview.stories.jsx +8 -1
- package/src/stories/radio/radio.stories.jsx +46 -6
- package/src/stories/utils/default-arg-types.js +12 -1
- package/src/stories/utils/default-args.js +3 -0
- package/src/stories/utils/orchestrator.jsx +11 -1
- package/src/stories/utils/orchestrator.scss +9 -7
- package/src/stories/utils/overview.scss +0 -1
- package/src/type.source.ts +93 -108
- package/src/use-lunatic/commons/fill-components/fill-components.ts +4 -1
- package/src/use-lunatic/commons/page.ts +4 -1
- package/src/use-lunatic/lunatic-context.tsx +9 -0
- package/src/use-lunatic/props/propOptions.ts +2 -1
- package/src/use-lunatic/reducer/reducerInitializer.tsx +4 -0
- package/src/use-lunatic/type.ts +5 -0
- package/src/use-lunatic/use-lunatic.test.ts +52 -0
- package/src/use-lunatic/use-lunatic.ts +7 -0
- package/src/utils/search/SearchMiniSearch.spec.ts +58 -0
- package/src/utils/search/melauto.spec.ts +75 -0
- package/src/utils/search/melauto.ts +1 -1
- package/src/utils/search/tokenizer.spec.ts +205 -0
- package/src/utils/search/tokenizer.ts +27 -8
- package/tsconfig.build.tsbuildinfo +1 -1
- package/type.source.d.ts +25 -40
- package/type.source.js +1 -0
- package/type.source.js.map +1 -1
- package/use-lunatic/commons/fill-components/fill-components.d.ts +1 -0
- package/use-lunatic/commons/fill-components/fill-components.js +1 -1
- package/use-lunatic/commons/fill-components/fill-components.js.map +1 -1
- package/use-lunatic/commons/page.js +4 -1
- package/use-lunatic/commons/page.js.map +1 -1
- package/use-lunatic/lunatic-context.d.ts +7 -1
- package/use-lunatic/lunatic-context.js +9 -2
- package/use-lunatic/lunatic-context.js.map +1 -1
- package/use-lunatic/props/getComponentTypeProps.d.ts +3 -0
- package/use-lunatic/props/propOptions.d.ts +1 -1
- package/use-lunatic/props/propOptions.js.map +1 -1
- package/use-lunatic/reducer/reducerInitializer.d.ts +2 -1
- package/use-lunatic/reducer/reducerInitializer.js +3 -1
- package/use-lunatic/reducer/reducerInitializer.js.map +1 -1
- package/use-lunatic/type.d.ts +7 -0
- package/use-lunatic/use-lunatic.js +6 -1
- package/use-lunatic/use-lunatic.js.map +1 -1
- package/utils/search/SearchMiniSearch.spec.d.ts +1 -0
- package/utils/search/SearchMiniSearch.spec.js +51 -0
- package/utils/search/SearchMiniSearch.spec.js.map +1 -0
- package/utils/search/melauto.js +1 -1
- package/utils/search/melauto.spec.d.ts +1 -0
- package/utils/search/melauto.spec.js +69 -0
- package/utils/search/melauto.spec.js.map +1 -0
- package/utils/search/tokenizer.d.ts +7 -2
- package/utils/search/tokenizer.js +24 -8
- package/utils/search/tokenizer.js.map +1 -1
- package/utils/search/tokenizer.spec.d.ts +1 -0
- package/utils/search/tokenizer.spec.js +162 -0
- package/utils/search/tokenizer.spec.js.map +1 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const melauto_1 = require("./melauto");
|
|
5
|
+
// Mock data to test the sorting and scoring
|
|
6
|
+
const data = [
|
|
7
|
+
{ id: '1', label: 'Hello world' },
|
|
8
|
+
{ id: '2', label: 'Bonjour le monde' },
|
|
9
|
+
{ id: '3', label: 'Hello everyone' },
|
|
10
|
+
{ id: '4', label: 'Greetings planet' },
|
|
11
|
+
];
|
|
12
|
+
(0, vitest_1.describe)('applyMelauto', () => {
|
|
13
|
+
(0, vitest_1.it)('should sort data by relevance to the query', () => {
|
|
14
|
+
const sortedData = (0, melauto_1.applyMelauto)('hello', data);
|
|
15
|
+
const expectedSortedData = [
|
|
16
|
+
{ id: '1', label: 'Hello world' },
|
|
17
|
+
{ id: '3', label: 'Hello everyone' },
|
|
18
|
+
{ id: '2', label: 'Bonjour le monde' },
|
|
19
|
+
{ id: '4', label: 'Greetings planet' },
|
|
20
|
+
];
|
|
21
|
+
(0, vitest_1.expect)(sortedData).toStrictEqual(expectedSortedData);
|
|
22
|
+
});
|
|
23
|
+
(0, vitest_1.it)('should return data in original order if query is empty', () => {
|
|
24
|
+
const sortedData = (0, melauto_1.applyMelauto)('', data);
|
|
25
|
+
(0, vitest_1.expect)(sortedData).toEqual(data);
|
|
26
|
+
});
|
|
27
|
+
(0, vitest_1.it)('should handle data without labels by using id instead', () => {
|
|
28
|
+
const noLabelData = [
|
|
29
|
+
{ id: 'a' },
|
|
30
|
+
{ id: 'b', label: 'Hello' },
|
|
31
|
+
{ id: 'hello-w' },
|
|
32
|
+
];
|
|
33
|
+
const sortedData = (0, melauto_1.applyMelauto)('hello', noLabelData);
|
|
34
|
+
const expectedSortedData = [
|
|
35
|
+
{ id: 'b', label: 'Hello' },
|
|
36
|
+
{ id: 'hello-w' },
|
|
37
|
+
{ id: 'a' },
|
|
38
|
+
];
|
|
39
|
+
(0, vitest_1.expect)(sortedData).toStrictEqual(expectedSortedData);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
(0, vitest_1.describe)('melautoScore', () => {
|
|
43
|
+
(0, vitest_1.it)('should return a non-null score', () => {
|
|
44
|
+
const score = (0, melauto_1.melautoScore)('Hello world', 'hello');
|
|
45
|
+
const expectedScore = 1;
|
|
46
|
+
(0, vitest_1.expect)(score).toBeCloseTo(expectedScore, 2);
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.it)('should give a higher score for a closer match', () => {
|
|
49
|
+
const score1 = (0, melauto_1.melautoScore)('Hello beautiful world', 'hello world');
|
|
50
|
+
const score2 = (0, melauto_1.melautoScore)('Hello beautiful world', 'hello');
|
|
51
|
+
(0, vitest_1.expect)(score1).toBeGreaterThan(score2);
|
|
52
|
+
});
|
|
53
|
+
(0, vitest_1.it)('should give the same score for a same query if the comparison string is longer', () => {
|
|
54
|
+
const score1 = (0, melauto_1.melautoScore)('Hello world', 'hello');
|
|
55
|
+
const score2 = (0, melauto_1.melautoScore)('Hello beautiful world', 'hello');
|
|
56
|
+
(0, vitest_1.expect)(score1).toBeCloseTo(score2, 2);
|
|
57
|
+
});
|
|
58
|
+
(0, vitest_1.it)('should calculate a null score', () => {
|
|
59
|
+
const score = (0, melauto_1.melautoScore)('Greetings planet', 'hello');
|
|
60
|
+
const expectedScore = 0;
|
|
61
|
+
(0, vitest_1.expect)(score).toBe(expectedScore);
|
|
62
|
+
});
|
|
63
|
+
(0, vitest_1.it)('should handle accent and special characters correctly', () => {
|
|
64
|
+
const score1 = (0, melauto_1.melautoScore)('Héllo wörld', 'hello world');
|
|
65
|
+
const score2 = (0, melauto_1.melautoScore)('Hello world', 'héllo-wOrld');
|
|
66
|
+
(0, vitest_1.expect)(score1).toBeCloseTo(score2, 2);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=melauto.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"melauto.spec.js","sourceRoot":"","sources":["../../src/utils/search/melauto.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { SearchInfo } from './SearchInterface';
|
|
2
2
|
import type { ItemOf } from '../../type.utils';
|
|
3
3
|
/**
|
|
4
|
-
* Generates a tokenize method
|
|
4
|
+
* Generates a tokenize method.
|
|
5
|
+
* When used for tokenizing a search query instead of the indexing, the fieldName is undefined.
|
|
5
6
|
*/
|
|
6
7
|
export declare const tokenizer: (info: SearchInfo) => (str: string, fieldName?: string) => string[];
|
|
7
8
|
/**
|
|
@@ -11,4 +12,8 @@ export declare const tokenizeQuery: (str: string, info: SearchInfo["queryParser"
|
|
|
11
12
|
/**
|
|
12
13
|
* Tokenizer used for indexing (based on "fields" specification)
|
|
13
14
|
*/
|
|
14
|
-
export declare const tokenizeIndex: (str: string, info: ItemOf<SearchInfo["fields"]
|
|
15
|
+
export declare const tokenizeIndex: (str: string, info: ItemOf<SearchInfo["fields"]>, stopWords?: string[]) => string[];
|
|
16
|
+
/**
|
|
17
|
+
* remove from a string all the words that are included in a stopwords list
|
|
18
|
+
*/
|
|
19
|
+
export declare function filterStopWords(input: string, stopWords?: string[]): string;
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.tokenizeIndex = exports.tokenizeQuery = exports.tokenizer = void 0;
|
|
4
|
+
exports.filterStopWords = filterStopWords;
|
|
4
5
|
/**
|
|
5
|
-
* Generates a tokenize method
|
|
6
|
+
* Generates a tokenize method.
|
|
7
|
+
* When used for tokenizing a search query instead of the indexing, the fieldName is undefined.
|
|
6
8
|
*/
|
|
7
9
|
const tokenizer = (info) => (str, fieldName) => {
|
|
8
10
|
const field = info.fields.find((f) => f.name === fieldName);
|
|
11
|
+
const stopWords = info.stopWords;
|
|
9
12
|
return field
|
|
10
|
-
? (0, exports.tokenizeIndex)(str, field)
|
|
13
|
+
? (0, exports.tokenizeIndex)(str, field, stopWords)
|
|
11
14
|
: (0, exports.tokenizeQuery)(str, info.queryParser);
|
|
12
15
|
};
|
|
13
16
|
exports.tokenizer = tokenizer;
|
|
@@ -21,8 +24,8 @@ const tokenizeQuery = (str, info) => {
|
|
|
21
24
|
.filter((w) => w.length > 0);
|
|
22
25
|
}
|
|
23
26
|
const wordRegex = info.params.pattern && info.params.pattern !== 'soft'
|
|
24
|
-
?
|
|
25
|
-
:
|
|
27
|
+
? new RegExp(info.params.pattern, 'gi')
|
|
28
|
+
: /\w+/gi;
|
|
26
29
|
const minLength = info.params.min ?? 1;
|
|
27
30
|
return (normalizeStr(str)
|
|
28
31
|
.match(wordRegex)
|
|
@@ -32,10 +35,10 @@ exports.tokenizeQuery = tokenizeQuery;
|
|
|
32
35
|
/**
|
|
33
36
|
* Tokenizer used for indexing (based on "fields" specification)
|
|
34
37
|
*/
|
|
35
|
-
const tokenizeIndex = (str, info) => {
|
|
38
|
+
const tokenizeIndex = (str, info, stopWords) => {
|
|
36
39
|
const wordRegex = info.rules && info.rules !== 'soft'
|
|
37
|
-
?
|
|
38
|
-
:
|
|
40
|
+
? new RegExp(info.rules[0], 'gi')
|
|
41
|
+
: /\w+/gi;
|
|
39
42
|
const minLength = info.min ?? 1;
|
|
40
43
|
// For synonyms, add the synonyms to the string
|
|
41
44
|
if (info.synonyms) {
|
|
@@ -44,7 +47,8 @@ const tokenizeIndex = (str, info) => {
|
|
|
44
47
|
str = str.replaceAll(source, `${source} ${synonyms}`);
|
|
45
48
|
}
|
|
46
49
|
}
|
|
47
|
-
|
|
50
|
+
// We remove the stopWords from the string
|
|
51
|
+
return (filterStopWords(normalizeStr(str), stopWords)
|
|
48
52
|
.match(wordRegex)
|
|
49
53
|
?.filter((w) => w.length >= minLength) ?? []);
|
|
50
54
|
};
|
|
@@ -60,4 +64,16 @@ const normalizeStr = (str) => {
|
|
|
60
64
|
.replace(/[\u0300-\u036f]/g, '')
|
|
61
65
|
.toLowerCase();
|
|
62
66
|
};
|
|
67
|
+
/**
|
|
68
|
+
* remove from a string all the words that are included in a stopwords list
|
|
69
|
+
*/
|
|
70
|
+
function filterStopWords(input, stopWords) {
|
|
71
|
+
if (!stopWords) {
|
|
72
|
+
return input;
|
|
73
|
+
}
|
|
74
|
+
const lowerCaseStopWords = stopWords.map((word) => word.toLowerCase());
|
|
75
|
+
const words = input.split(/\s+/);
|
|
76
|
+
const filteredWords = words.filter((word) => !lowerCaseStopWords.includes(word.toLowerCase()));
|
|
77
|
+
return filteredWords.join(' ');
|
|
78
|
+
}
|
|
63
79
|
//# sourceMappingURL=tokenizer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/utils/search/tokenizer.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/utils/search/tokenizer.ts"],"names":[],"mappings":";;;AAqFA,0CAUC;AA5FD;;;GAGG;AACI,MAAM,SAAS,GACrB,CAAC,IAAgB,EAAE,EAAE,CAAC,CAAC,GAAW,EAAE,SAAkB,EAAE,EAAE;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAEjC,OAAO,KAAK;QACX,CAAC,CAAC,IAAA,qBAAa,EAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC;QACtC,CAAC,CAAC,IAAA,qBAAa,EAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;AACzC,CAAC,CAAC;AARU,QAAA,SAAS,aAQnB;AAEH;;GAEG;AACI,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,IAA+B,EAAE,EAAE;IAC7E,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,YAAY,CAAC,GAAG,CAAC;aACtB,KAAK,CAAC,YAAY,CAAC;aACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,SAAS,GACd,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,MAAM;QACpD,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC;QACvC,CAAC,CAAC,OAAO,CAAC;IACZ,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAEvC,OAAO,CACN,YAAY,CAAC,GAAG,CAAC;SACf,KAAK,CAAC,SAAS,CAAC;QACjB,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,EAAE,CAC7C,CAAC;AACH,CAAC,CAAC;AAlBW,QAAA,aAAa,iBAkBxB;AAEF;;GAEG;AACI,MAAM,aAAa,GAAG,CAC5B,GAAW,EACX,IAAkC,EAClC,SAAoB,EACnB,EAAE;IACH,MAAM,SAAS,GACd,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM;QAClC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;QAClC,CAAC,CAAC,OAAO,CAAC;IACZ,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAEhC,+CAA+C;IAC/C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjD,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC;QACvD,CAAC;IACF,CAAC;IAED,0CAA0C;IAC1C,OAAO,CACN,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC;SAC3C,KAAK,CAAC,SAAS,CAAC;QACjB,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,EAAE,CAC7C,CAAC;AACH,CAAC,CAAC;AAzBW,QAAA,aAAa,iBAyBxB;AAEF;;;;GAIG;AACH,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE;IACpC,OAAO,GAAG;SACR,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,WAAW,EAAE,CAAC;AACjB,CAAC,CAAC;AAEF;;GAEG;AACH,SAAgB,eAAe,CAAC,KAAa,EAAE,SAAoB;IAClE,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC;IACd,CAAC;IACD,MAAM,kBAAkB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CACjC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAC1D,CAAC;IACF,OAAO,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const tokenizer_1 = require("./tokenizer");
|
|
5
|
+
const mockSearchInfo = {
|
|
6
|
+
name: 'Products',
|
|
7
|
+
fields: [
|
|
8
|
+
{
|
|
9
|
+
name: 'title',
|
|
10
|
+
min: 3,
|
|
11
|
+
rules: ['[\\w]+'],
|
|
12
|
+
synonyms: {
|
|
13
|
+
car: ['vehicle', 'automobile'],
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
queryParser: {
|
|
18
|
+
type: 'tokenized',
|
|
19
|
+
params: {
|
|
20
|
+
language: 'English',
|
|
21
|
+
pattern: '[\\w.]+',
|
|
22
|
+
min: 2,
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
(0, vitest_1.describe)('filterStopWords', () => {
|
|
27
|
+
(0, vitest_1.it)('should remove only stopwords from the input string', () => {
|
|
28
|
+
const input = 'This is a test.';
|
|
29
|
+
const stopWords = ['is', 'a'];
|
|
30
|
+
const result = (0, tokenizer_1.filterStopWords)(input, stopWords);
|
|
31
|
+
(0, vitest_1.expect)(result).toBe('This test.');
|
|
32
|
+
});
|
|
33
|
+
(0, vitest_1.it)('should not alter words that are substrings of stopwords', () => {
|
|
34
|
+
const input = 'this is a testing example';
|
|
35
|
+
const stopWords = ['test'];
|
|
36
|
+
const result = (0, tokenizer_1.filterStopWords)(input, stopWords);
|
|
37
|
+
(0, vitest_1.expect)(result).toBe('this is a testing example');
|
|
38
|
+
});
|
|
39
|
+
(0, vitest_1.it)('should be case-insensitive', () => {
|
|
40
|
+
const input = 'This Is A Test.';
|
|
41
|
+
const stopWords = ['is', 'a'];
|
|
42
|
+
const result = (0, tokenizer_1.filterStopWords)(input, stopWords);
|
|
43
|
+
(0, vitest_1.expect)(result).toBe('This Test.');
|
|
44
|
+
});
|
|
45
|
+
(0, vitest_1.it)('should return the input string unchanged if stopWords is undefined', () => {
|
|
46
|
+
const input = 'This is a test.';
|
|
47
|
+
const result = (0, tokenizer_1.filterStopWords)(input);
|
|
48
|
+
(0, vitest_1.expect)(result).toBe(input);
|
|
49
|
+
});
|
|
50
|
+
(0, vitest_1.it)('should return the input string unchanged if stopWords is a empty array', () => {
|
|
51
|
+
const input = 'This is a test.';
|
|
52
|
+
const stopWords = [];
|
|
53
|
+
const result = (0, tokenizer_1.filterStopWords)(input, stopWords);
|
|
54
|
+
(0, vitest_1.expect)(result).toBe(input);
|
|
55
|
+
});
|
|
56
|
+
(0, vitest_1.it)('should return an empty string if all words are stopwords', () => {
|
|
57
|
+
const input = 'this is a test';
|
|
58
|
+
const stopWords = ['this', 'is', 'a', 'test'];
|
|
59
|
+
const result = (0, tokenizer_1.filterStopWords)(input, stopWords);
|
|
60
|
+
(0, vitest_1.expect)(result).toBe('');
|
|
61
|
+
});
|
|
62
|
+
(0, vitest_1.it)('should handle strings with multiple spaces correctly', () => {
|
|
63
|
+
const input = 'This is a test.';
|
|
64
|
+
const stopWords = ['is', 'a'];
|
|
65
|
+
const result = (0, tokenizer_1.filterStopWords)(input, stopWords);
|
|
66
|
+
(0, vitest_1.expect)(result).toBe('This test.');
|
|
67
|
+
});
|
|
68
|
+
(0, vitest_1.it)('should handle empty input string', () => {
|
|
69
|
+
const input = '';
|
|
70
|
+
const stopWords = ['is', 'a'];
|
|
71
|
+
const result = (0, tokenizer_1.filterStopWords)(input, stopWords);
|
|
72
|
+
(0, vitest_1.expect)(result).toBe('');
|
|
73
|
+
});
|
|
74
|
+
(0, vitest_1.it)('should handle punctuation correctly', () => {
|
|
75
|
+
const input = 'Hello, world! This is a test.';
|
|
76
|
+
const stopWords = ['is', 'a'];
|
|
77
|
+
const result = (0, tokenizer_1.filterStopWords)(input, stopWords);
|
|
78
|
+
(0, vitest_1.expect)(result).toBe('Hello, world! This test.');
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
(0, vitest_1.describe)('tokenizeQuery', () => {
|
|
82
|
+
(0, vitest_1.it)('should tokenize based on soft type', () => {
|
|
83
|
+
const queryParser = { type: 'soft' };
|
|
84
|
+
const result = (0, tokenizer_1.tokenizeQuery)('This is a test!', queryParser);
|
|
85
|
+
(0, vitest_1.expect)(result).toEqual(['this', 'is', 'a', 'test']);
|
|
86
|
+
});
|
|
87
|
+
(0, vitest_1.it)('should tokenize with a custom regex and a min', () => {
|
|
88
|
+
const queryParser = {
|
|
89
|
+
type: 'tokenized',
|
|
90
|
+
params: { pattern: '[\\w.]+', min: 3 },
|
|
91
|
+
};
|
|
92
|
+
const result = (0, tokenizer_1.tokenizeQuery)('This is a test !', queryParser);
|
|
93
|
+
(0, vitest_1.expect)(result).toEqual(['this', 'test']);
|
|
94
|
+
});
|
|
95
|
+
(0, vitest_1.it)('should normalize the input', () => {
|
|
96
|
+
const queryParser = {
|
|
97
|
+
type: 'tokenized',
|
|
98
|
+
params: { pattern: '\\w+', min: 1 },
|
|
99
|
+
};
|
|
100
|
+
const result = (0, tokenizer_1.tokenizeQuery)('Élève Étudiant!', queryParser);
|
|
101
|
+
(0, vitest_1.expect)(result).toEqual(['eleve', 'etudiant']);
|
|
102
|
+
});
|
|
103
|
+
(0, vitest_1.it)('should return an empty array for unmatched patterns', () => {
|
|
104
|
+
const queryParser = {
|
|
105
|
+
type: 'tokenized',
|
|
106
|
+
params: { language: 'French', pattern: '[\\d.]+', min: 1 }, // only digits
|
|
107
|
+
};
|
|
108
|
+
const result = (0, tokenizer_1.tokenizeQuery)('No numbers here!', queryParser);
|
|
109
|
+
(0, vitest_1.expect)(result).toEqual([]);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
(0, vitest_1.describe)('tokenizeIndex', () => {
|
|
113
|
+
(0, vitest_1.it)('should filter out words shorter than the required minimum length', () => {
|
|
114
|
+
const fieldInfo = mockSearchInfo.fields[0];
|
|
115
|
+
const result = (0, tokenizer_1.tokenizeIndex)('The bus is so slow', fieldInfo);
|
|
116
|
+
(0, vitest_1.expect)(result).toEqual(['the', 'bus', 'slow']);
|
|
117
|
+
});
|
|
118
|
+
(0, vitest_1.it)('should tokenize and apply synonyms', () => {
|
|
119
|
+
const fieldInfo = mockSearchInfo.fields[0];
|
|
120
|
+
const result = (0, tokenizer_1.tokenizeIndex)('The car is fast', fieldInfo);
|
|
121
|
+
(0, vitest_1.expect)(result).toEqual(['the', 'car', 'vehicle', 'automobile', 'fast']);
|
|
122
|
+
});
|
|
123
|
+
(0, vitest_1.it)('should normalize the input', () => {
|
|
124
|
+
const fieldInfo = mockSearchInfo.fields[0];
|
|
125
|
+
const result = (0, tokenizer_1.tokenizeIndex)('Élève Étudiant!', fieldInfo);
|
|
126
|
+
(0, vitest_1.expect)(result).toEqual(['eleve', 'etudiant']);
|
|
127
|
+
});
|
|
128
|
+
(0, vitest_1.it)('should filter out stopWords', () => {
|
|
129
|
+
const fieldInfo = { ...mockSearchInfo.fields[0], min: 1 };
|
|
130
|
+
const stopWords = ['is', 'the', 'of', 'this', 'a'];
|
|
131
|
+
const result = (0, tokenizer_1.tokenizeIndex)('This is a test of stopWords !', fieldInfo, stopWords);
|
|
132
|
+
(0, vitest_1.expect)(result).toEqual(['test', 'stopwords']);
|
|
133
|
+
});
|
|
134
|
+
(0, vitest_1.it)('should return an empty array for unmatched patterns', () => {
|
|
135
|
+
const fieldInfo = { ...mockSearchInfo.fields[0], rules: ['\\d+'] }; // Only numbers
|
|
136
|
+
const result = (0, tokenizer_1.tokenizeIndex)('No numbers here', fieldInfo);
|
|
137
|
+
(0, vitest_1.expect)(result).toEqual([]);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
(0, vitest_1.describe)('tokenizer', () => {
|
|
141
|
+
(0, vitest_1.it)('should tokenize using field rules', () => {
|
|
142
|
+
const tokenize = (0, tokenizer_1.tokenizer)(mockSearchInfo);
|
|
143
|
+
const result = tokenize('The car is fast', 'title');
|
|
144
|
+
(0, vitest_1.expect)(result).toEqual(['the', 'car', 'vehicle', 'automobile', 'fast']);
|
|
145
|
+
});
|
|
146
|
+
(0, vitest_1.it)('should tokenize using query parser when field is not found', () => {
|
|
147
|
+
const tokenize = (0, tokenizer_1.tokenizer)(mockSearchInfo);
|
|
148
|
+
const result = tokenize('This is a test!');
|
|
149
|
+
(0, vitest_1.expect)(result).toEqual(['this', 'is', 'test']);
|
|
150
|
+
});
|
|
151
|
+
(0, vitest_1.it)('should normalize the input', () => {
|
|
152
|
+
const tokenize = (0, tokenizer_1.tokenizer)(mockSearchInfo);
|
|
153
|
+
const result = tokenize('Élève Étudiant!');
|
|
154
|
+
(0, vitest_1.expect)(result).toEqual(['eleve', 'etudiant']);
|
|
155
|
+
});
|
|
156
|
+
(0, vitest_1.it)('should handle empty strings', () => {
|
|
157
|
+
const tokenize = (0, tokenizer_1.tokenizer)(mockSearchInfo);
|
|
158
|
+
(0, vitest_1.expect)(tokenize('', 'title')).toEqual([]);
|
|
159
|
+
(0, vitest_1.expect)(tokenize('')).toEqual([]);
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
//# sourceMappingURL=tokenizer.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.spec.js","sourceRoot":"","sources":["../../src/utils/search/tokenizer.spec.ts"],"names":[],"mappings":"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"}
|