elastiq-ts 0.1.0-beta

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 (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1157 -0
  3. package/dist/__tests__/elastic.helpers.d.ts +17 -0
  4. package/dist/__tests__/elastic.helpers.d.ts.map +1 -0
  5. package/dist/__tests__/elastic.helpers.js +46 -0
  6. package/dist/aggregation-builder.d.ts +4 -0
  7. package/dist/aggregation-builder.d.ts.map +1 -0
  8. package/dist/aggregation-builder.js +153 -0
  9. package/dist/aggregation-types.d.ts +234 -0
  10. package/dist/aggregation-types.d.ts.map +1 -0
  11. package/dist/aggregation-types.js +6 -0
  12. package/dist/bulk-types.d.ts +67 -0
  13. package/dist/bulk-types.d.ts.map +1 -0
  14. package/dist/bulk-types.js +6 -0
  15. package/dist/bulk.d.ts +22 -0
  16. package/dist/bulk.d.ts.map +1 -0
  17. package/dist/bulk.js +55 -0
  18. package/dist/index-management.d.ts +30 -0
  19. package/dist/index-management.d.ts.map +1 -0
  20. package/dist/index-management.js +48 -0
  21. package/dist/index-types.d.ts +87 -0
  22. package/dist/index-types.d.ts.map +1 -0
  23. package/dist/index-types.js +6 -0
  24. package/dist/index.d.ts +12 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +25 -0
  27. package/dist/multi-search-types.d.ts +41 -0
  28. package/dist/multi-search-types.d.ts.map +1 -0
  29. package/dist/multi-search-types.js +6 -0
  30. package/dist/multi-search.d.ts +20 -0
  31. package/dist/multi-search.d.ts.map +1 -0
  32. package/dist/multi-search.js +42 -0
  33. package/dist/query-builder.d.ts +12 -0
  34. package/dist/query-builder.d.ts.map +1 -0
  35. package/dist/query-builder.js +396 -0
  36. package/dist/suggester-types.d.ts +130 -0
  37. package/dist/suggester-types.d.ts.map +1 -0
  38. package/dist/suggester-types.js +6 -0
  39. package/dist/suggester.d.ts +21 -0
  40. package/dist/suggester.d.ts.map +1 -0
  41. package/dist/suggester.js +55 -0
  42. package/dist/types.d.ts +378 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +6 -0
  45. package/dist/vector-types.d.ts +42 -0
  46. package/dist/vector-types.d.ts.map +1 -0
  47. package/dist/vector-types.js +6 -0
  48. package/package.json +69 -0
@@ -0,0 +1,396 @@
1
+ "use strict";
2
+ /**
3
+ * Query builder implementation
4
+ * Builds type-safe Elasticsearch queries with a fluent API
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.createQueryBuilder = void 0;
8
+ const aggregation_builder_1 = require("./aggregation-builder");
9
+ const suggester_1 = require("./suggester");
10
+ /**
11
+ * Creates a clause builder for constructing query clauses
12
+ * Used within bool query contexts (must, should, filter, must_not)
13
+ */
14
+ const createClauseBuilder = () => ({
15
+ matchAll: () => ({ match_all: {} }),
16
+ match: (field, value, options) => {
17
+ if (!options || Object.keys(options).length === 0) {
18
+ return { match: { [field]: value } };
19
+ }
20
+ return { match: { [field]: { query: value, ...options } } };
21
+ },
22
+ multiMatch: (fields, query, options) => {
23
+ if (!options || Object.keys(options).length === 0) {
24
+ return { multi_match: { fields, query } };
25
+ }
26
+ return { multi_match: { fields, query, ...options } };
27
+ },
28
+ matchPhrase: (field, query) => ({ match_phrase: { [field]: query } }),
29
+ matchPhrasePrefix: (field, value, options) => {
30
+ if (!options || Object.keys(options).length === 0) {
31
+ return { match_phrase_prefix: { [field]: value } };
32
+ }
33
+ return { match_phrase_prefix: { [field]: { query: value, ...options } } };
34
+ },
35
+ term: (field, value) => ({ term: { [field]: value } }),
36
+ terms: (field, value) => ({ terms: { [field]: value } }),
37
+ range: (field, conditions) => ({ range: { [field]: conditions } }),
38
+ exists: (field) => ({ exists: { field } }),
39
+ prefix: (field, value) => ({ prefix: { [field]: value } }),
40
+ wildcard: (field, value) => ({ wildcard: { [field]: value } }),
41
+ fuzzy: (field, value, options) => {
42
+ if (!options || Object.keys(options).length === 0) {
43
+ return { fuzzy: { [field]: { value } } };
44
+ }
45
+ return { fuzzy: { [field]: { value, ...options } } };
46
+ },
47
+ ids: (values) => ({ ids: { values } }),
48
+ knn: (field, queryVector, options) => {
49
+ const { k, num_candidates, filter, boost, similarity } = options;
50
+ return {
51
+ knn: {
52
+ field: String(field),
53
+ query_vector: queryVector,
54
+ k,
55
+ num_candidates,
56
+ ...(filter ? { filter } : {}),
57
+ ...(boost ? { boost } : {}),
58
+ ...(similarity !== undefined ? { similarity } : {})
59
+ }
60
+ };
61
+ },
62
+ script: (options) => {
63
+ const { source, lang = 'painless', params, boost } = options;
64
+ return {
65
+ script: {
66
+ script: {
67
+ source,
68
+ lang,
69
+ ...(params ? { params } : {})
70
+ },
71
+ ...(boost ? { boost } : {})
72
+ }
73
+ };
74
+ },
75
+ when: (condition, thenFn, elseFn) => {
76
+ if (condition) {
77
+ return thenFn(createClauseBuilder());
78
+ }
79
+ return elseFn ? elseFn(createClauseBuilder()) : undefined;
80
+ }
81
+ });
82
+ /** Shared clause builder instance */
83
+ const clauseBuilder = createClauseBuilder();
84
+ /**
85
+ * Creates a query builder with immutable state
86
+ * @param state - Current query state (optional)
87
+ * @returns QueryBuilder instance with fluent API
88
+ */
89
+ const createQueryBuilder = (state = {}) => ({
90
+ // Boolean query methods
91
+ bool: () => (0, exports.createQueryBuilder)({ ...state, query: { bool: {} } }),
92
+ must: (builderFn) => {
93
+ const clause = builderFn(clauseBuilder);
94
+ const existing = state.query?.bool?.must || [];
95
+ return (0, exports.createQueryBuilder)({
96
+ ...state,
97
+ query: { bool: { ...state.query.bool, must: [...existing, clause] } }
98
+ });
99
+ },
100
+ mustNot: (builderFn) => {
101
+ const clause = builderFn(clauseBuilder);
102
+ const existing = state.query?.bool?.must_not || [];
103
+ return (0, exports.createQueryBuilder)({
104
+ ...state,
105
+ query: { bool: { ...state.query.bool, must_not: [...existing, clause] } }
106
+ });
107
+ },
108
+ should: (builderFn) => {
109
+ const clause = builderFn(clauseBuilder);
110
+ const existing = state.query?.bool?.should || [];
111
+ return (0, exports.createQueryBuilder)({
112
+ ...state,
113
+ query: { bool: { ...state.query.bool, should: [...existing, clause] } }
114
+ });
115
+ },
116
+ filter: (builderFn) => {
117
+ const clause = builderFn(clauseBuilder);
118
+ const existing = state.query?.bool?.filter || [];
119
+ return (0, exports.createQueryBuilder)({
120
+ ...state,
121
+ query: { bool: { ...state.query.bool, filter: [...existing, clause] } }
122
+ });
123
+ },
124
+ minimumShouldMatch: (value) => {
125
+ return (0, exports.createQueryBuilder)({
126
+ ...state,
127
+ query: { bool: { ...state.query.bool, minimum_should_match: value } }
128
+ });
129
+ },
130
+ // Full-text query methods
131
+ matchAll: () => (0, exports.createQueryBuilder)({ ...state, query: { match_all: {} } }),
132
+ match: (field, value, options) => {
133
+ if (!options || Object.keys(options).length === 0) {
134
+ return (0, exports.createQueryBuilder)({
135
+ ...state,
136
+ query: { match: { [field]: value } }
137
+ });
138
+ }
139
+ return (0, exports.createQueryBuilder)({
140
+ ...state,
141
+ query: { match: { [field]: { query: value, ...options } } }
142
+ });
143
+ },
144
+ multiMatch: (fields, query, options) => {
145
+ if (!options || Object.keys(options).length === 0) {
146
+ return (0, exports.createQueryBuilder)({
147
+ ...state,
148
+ query: { multi_match: { fields, query } }
149
+ });
150
+ }
151
+ return (0, exports.createQueryBuilder)({
152
+ ...state,
153
+ query: { multi_match: { fields, query, ...options } }
154
+ });
155
+ },
156
+ // Term-level query methods
157
+ term: (field, value) => (0, exports.createQueryBuilder)({ ...state, query: { term: { [field]: value } } }),
158
+ matchPhrase: (field, value) => (0, exports.createQueryBuilder)({
159
+ ...state,
160
+ query: { match_phrase: { [field]: value } }
161
+ }),
162
+ matchPhrasePrefix: (field, value, options) => {
163
+ if (!options || Object.keys(options).length === 0) {
164
+ return (0, exports.createQueryBuilder)({
165
+ ...state,
166
+ query: { match_phrase_prefix: { [field]: value } }
167
+ });
168
+ }
169
+ return (0, exports.createQueryBuilder)({
170
+ ...state,
171
+ query: { match_phrase_prefix: { [field]: { query: value, ...options } } }
172
+ });
173
+ },
174
+ terms: (field, value) => (0, exports.createQueryBuilder)({ ...state, query: { terms: { [field]: value } } }),
175
+ exists: (field) => (0, exports.createQueryBuilder)({ ...state, query: { exists: { field } } }),
176
+ prefix: (field, value) => (0, exports.createQueryBuilder)({ ...state, query: { prefix: { [field]: value } } }),
177
+ wildcard: (field, value) => (0, exports.createQueryBuilder)({
178
+ ...state,
179
+ query: { wildcard: { [field]: value } }
180
+ }),
181
+ fuzzy: (field, value, options) => {
182
+ if (!options || Object.keys(options).length === 0) {
183
+ return (0, exports.createQueryBuilder)({
184
+ ...state,
185
+ query: { fuzzy: { [field]: { value } } }
186
+ });
187
+ }
188
+ return (0, exports.createQueryBuilder)({
189
+ ...state,
190
+ query: { fuzzy: { [field]: { value, ...options } } }
191
+ });
192
+ },
193
+ ids: (values) => (0, exports.createQueryBuilder)({
194
+ ...state,
195
+ query: { ids: { values } }
196
+ }),
197
+ // Nested query
198
+ nested: (path, fn, options) => {
199
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
200
+ const nestedQuery = fn(createClauseBuilder());
201
+ return (0, exports.createQueryBuilder)({
202
+ ...state,
203
+ query: {
204
+ nested: {
205
+ path,
206
+ query: nestedQuery,
207
+ ...(options && Object.keys(options).length > 0 ? options : {})
208
+ }
209
+ }
210
+ });
211
+ },
212
+ // Vector search
213
+ knn: (field, queryVector, options) => {
214
+ const { k, num_candidates, filter, boost, similarity } = options;
215
+ return (0, exports.createQueryBuilder)({
216
+ ...state,
217
+ knn: {
218
+ field: String(field),
219
+ query_vector: queryVector,
220
+ k,
221
+ num_candidates,
222
+ ...(filter ? { filter } : {}),
223
+ ...(boost ? { boost } : {}),
224
+ ...(similarity !== undefined ? { similarity } : {})
225
+ }
226
+ });
227
+ },
228
+ // Script queries
229
+ script: (options) => {
230
+ const { source, lang = 'painless', params, boost } = options;
231
+ return (0, exports.createQueryBuilder)({
232
+ ...state,
233
+ query: {
234
+ script: {
235
+ script: {
236
+ source,
237
+ lang,
238
+ ...(params ? { params } : {})
239
+ },
240
+ ...(boost ? { boost } : {})
241
+ }
242
+ }
243
+ });
244
+ },
245
+ scriptScore: (queryFn, script, options) => {
246
+ const innerQuery = queryFn(clauseBuilder);
247
+ const { source, lang = 'painless', params } = script;
248
+ return (0, exports.createQueryBuilder)({
249
+ ...state,
250
+ query: {
251
+ script_score: {
252
+ query: innerQuery,
253
+ script: {
254
+ source,
255
+ lang,
256
+ ...(params ? { params } : {})
257
+ },
258
+ ...(options?.min_score !== undefined
259
+ ? { min_score: options.min_score }
260
+ : {}),
261
+ ...(options?.boost ? { boost: options.boost } : {})
262
+ }
263
+ }
264
+ });
265
+ },
266
+ percolate: (options) => {
267
+ return (0, exports.createQueryBuilder)({
268
+ ...state,
269
+ query: {
270
+ percolate: {
271
+ ...options
272
+ }
273
+ }
274
+ });
275
+ },
276
+ // Conditional building
277
+ when: (condition, thenFn, elseFn) => {
278
+ if (condition) {
279
+ return thenFn((0, exports.createQueryBuilder)(state));
280
+ }
281
+ return elseFn ? elseFn((0, exports.createQueryBuilder)(state)) : undefined;
282
+ },
283
+ range: (field, conditions) => (0, exports.createQueryBuilder)({ ...state, query: { range: { [field]: conditions } } }),
284
+ // Sorting
285
+ sort: (field, direction = 'asc') => {
286
+ const existing = state.sort || [];
287
+ return (0, exports.createQueryBuilder)({
288
+ ...state,
289
+ sort: [
290
+ ...existing,
291
+ { [field]: direction }
292
+ ]
293
+ });
294
+ },
295
+ // Pagination and source filtering
296
+ from: (from) => (0, exports.createQueryBuilder)({ ...state, from }),
297
+ to: (to) => (0, exports.createQueryBuilder)({ ...state, to }),
298
+ size: (size) => (0, exports.createQueryBuilder)({ ...state, size }),
299
+ _source: (_source) => (0, exports.createQueryBuilder)({ ...state, _source }),
300
+ // Query parameters
301
+ timeout: (timeout) => (0, exports.createQueryBuilder)({ ...state, timeout }),
302
+ trackScores: (track_scores) => (0, exports.createQueryBuilder)({ ...state, track_scores }),
303
+ explain: (explain) => (0, exports.createQueryBuilder)({ ...state, explain }),
304
+ minScore: (min_score) => (0, exports.createQueryBuilder)({ ...state, min_score }),
305
+ version: (version) => (0, exports.createQueryBuilder)({ ...state, version }),
306
+ seqNoPrimaryTerm: (seq_no_primary_term) => (0, exports.createQueryBuilder)({ ...state, seq_no_primary_term }),
307
+ trackTotalHits: (track_total_hits) => (0, exports.createQueryBuilder)({ ...state, track_total_hits }),
308
+ highlight: (fields, options) => {
309
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
310
+ const highlightFields = {};
311
+ for (const field of fields) {
312
+ highlightFields[field] = options || {};
313
+ }
314
+ return (0, exports.createQueryBuilder)({
315
+ ...state,
316
+ highlight: {
317
+ fields: highlightFields,
318
+ ...(options?.pre_tags && { pre_tags: options.pre_tags }),
319
+ ...(options?.post_tags && { post_tags: options.post_tags })
320
+ }
321
+ });
322
+ },
323
+ // Geo queries
324
+ geoDistance: (field, center, options) => (0, exports.createQueryBuilder)({
325
+ ...state,
326
+ query: {
327
+ geo_distance: {
328
+ [String(field)]: center,
329
+ ...options
330
+ }
331
+ }
332
+ }),
333
+ geoBoundingBox: (field, options) => (0, exports.createQueryBuilder)({
334
+ ...state,
335
+ query: {
336
+ geo_bounding_box: {
337
+ [String(field)]: options
338
+ }
339
+ }
340
+ }),
341
+ geoPolygon: (field, options) => (0, exports.createQueryBuilder)({
342
+ ...state,
343
+ query: {
344
+ geo_polygon: {
345
+ [String(field)]: options
346
+ }
347
+ }
348
+ }),
349
+ // Pattern and scoring queries
350
+ regexp: (field, value, options) => {
351
+ if (!options || Object.keys(options).length === 0) {
352
+ return (0, exports.createQueryBuilder)({
353
+ ...state,
354
+ query: { regexp: { [String(field)]: value } }
355
+ });
356
+ }
357
+ return (0, exports.createQueryBuilder)({
358
+ ...state,
359
+ query: { regexp: { [String(field)]: { value, ...options } } }
360
+ });
361
+ },
362
+ constantScore: (fn, options) => {
363
+ const clause = fn(clauseBuilder);
364
+ return (0, exports.createQueryBuilder)({
365
+ ...state,
366
+ query: {
367
+ constant_score: {
368
+ filter: clause,
369
+ ...(options && Object.keys(options).length > 0 ? options : {})
370
+ }
371
+ }
372
+ });
373
+ },
374
+ // Aggregations
375
+ aggs: (fn) => {
376
+ const aggBuilder = (0, aggregation_builder_1.createAggregationBuilder)();
377
+ const builtAggs = fn(aggBuilder).build();
378
+ return (0, exports.createQueryBuilder)({ ...state, aggs: builtAggs });
379
+ },
380
+ // Suggestions
381
+ suggest: (fn) => {
382
+ const suggesterBuilder = (0, suggester_1.createSuggesterBuilder)();
383
+ const builtSuggestions = fn(suggesterBuilder).build();
384
+ return (0, exports.createQueryBuilder)({ ...state, suggest: builtSuggestions.suggest });
385
+ },
386
+ // Build final query
387
+ build: () => {
388
+ const { _includeQuery, ...rest } = state;
389
+ if (_includeQuery === false) {
390
+ const { query: _q, ...noQuery } = rest;
391
+ return noQuery;
392
+ }
393
+ return rest;
394
+ }
395
+ });
396
+ exports.createQueryBuilder = createQueryBuilder;
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Type definitions for Elasticsearch Suggesters
3
+ * @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html
4
+ */
5
+ /**
6
+ * Options for term suggester
7
+ */
8
+ export type TermSuggesterOptions = {
9
+ /** The field to fetch candidate suggestions from */
10
+ field: string;
11
+ /** Text analyzer to use */
12
+ analyzer?: string;
13
+ /** Maximum number of suggestions to return */
14
+ size?: number;
15
+ /** Sort order for suggestions */
16
+ sort?: 'score' | 'frequency';
17
+ /** Suggest mode */
18
+ suggest_mode?: 'missing' | 'popular' | 'always';
19
+ /** String distance algorithm */
20
+ string_distance?: 'internal' | 'damerau_levenshtein' | 'levenshtein' | 'jaro_winkler' | 'ngram';
21
+ /** Maximum edit distance */
22
+ max_edits?: number;
23
+ /** Maximum number of inspected documents */
24
+ max_inspections?: number;
25
+ /** Maximum term frequency threshold */
26
+ max_term_freq?: number;
27
+ /** Prefix length */
28
+ prefix_length?: number;
29
+ /** Minimum word length */
30
+ min_word_length?: number;
31
+ /** Minimum document frequency */
32
+ min_doc_freq?: number;
33
+ };
34
+ /**
35
+ * Options for phrase suggester
36
+ */
37
+ export type PhraseSuggesterOptions = {
38
+ /** The field to fetch candidate suggestions from */
39
+ field: string;
40
+ /** Text analyzer to use */
41
+ analyzer?: string;
42
+ /** Maximum number of suggestions to return */
43
+ size?: number;
44
+ /** Real word error likelihood */
45
+ real_word_error_likelihood?: number;
46
+ /** Confidence threshold */
47
+ confidence?: number;
48
+ /** Maximum errors per term */
49
+ max_errors?: number;
50
+ /** Separator between terms */
51
+ separator?: string;
52
+ /** Gram size for shingle generation */
53
+ gram_size?: number;
54
+ /** Direct generators for candidate terms */
55
+ direct_generator?: Array<{
56
+ field: string;
57
+ suggest_mode?: 'missing' | 'popular' | 'always';
58
+ min_word_length?: number;
59
+ max_edits?: number;
60
+ max_inspections?: number;
61
+ min_doc_freq?: number;
62
+ max_term_freq?: number;
63
+ prefix_length?: number;
64
+ size?: number;
65
+ }>;
66
+ /** Highlight pre-tag */
67
+ pre_tag?: string;
68
+ /** Highlight post-tag */
69
+ post_tag?: string;
70
+ /** Collate query to verify suggestions */
71
+ collate?: {
72
+ query: any;
73
+ params?: Record<string, any>;
74
+ prune?: boolean;
75
+ };
76
+ };
77
+ /**
78
+ * Options for completion suggester
79
+ */
80
+ export type CompletionSuggesterOptions = {
81
+ /** The field to fetch completions from (must be type: completion) */
82
+ field: string;
83
+ /** Maximum number of suggestions to return */
84
+ size?: number;
85
+ /** Skip duplicates */
86
+ skip_duplicates?: boolean;
87
+ /** Fuzzy matching options */
88
+ fuzzy?: {
89
+ /** Enable fuzzy matching */
90
+ fuzziness?: string | number;
91
+ /** Whether transpositions should be treated as one change */
92
+ transpositions?: boolean;
93
+ /** Minimum length before fuzzy matching is used */
94
+ min_length?: number;
95
+ /** Prefix length */
96
+ prefix_length?: number;
97
+ /** Whether all measurements should be in Unicode code points */
98
+ unicode_aware?: boolean;
99
+ };
100
+ /** Context filtering */
101
+ contexts?: Record<string, string | string[]>;
102
+ };
103
+ /**
104
+ * Suggester state for build output
105
+ */
106
+ export type SuggesterState = {
107
+ [suggesterName: string]: {
108
+ text?: string;
109
+ prefix?: string;
110
+ term?: TermSuggesterOptions;
111
+ phrase?: PhraseSuggesterOptions;
112
+ completion?: CompletionSuggesterOptions;
113
+ };
114
+ };
115
+ /**
116
+ * Suggester builder interface
117
+ */
118
+ export type SuggesterBuilder<T> = {
119
+ /** Term suggester - suggests corrections for individual terms */
120
+ term: (name: string, text: string, options: TermSuggesterOptions) => SuggesterBuilder<T>;
121
+ /** Phrase suggester - suggests corrections for entire phrases */
122
+ phrase: (name: string, text: string, options: PhraseSuggesterOptions) => SuggesterBuilder<T>;
123
+ /** Completion suggester - autocomplete functionality */
124
+ completion: (name: string, prefix: string, options: CompletionSuggesterOptions) => SuggesterBuilder<T>;
125
+ /** Build suggester DSL */
126
+ build: () => {
127
+ suggest: SuggesterState;
128
+ };
129
+ };
130
+ //# sourceMappingURL=suggester-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggester-types.d.ts","sourceRoot":"","sources":["../src/suggester-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Type definitions for Elasticsearch Suggesters
4
+ * @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Suggester builder
3
+ * Provides query suggestions, phrase corrections, and autocomplete functionality
4
+ */
5
+ import { SuggesterBuilder, SuggesterState } from './suggester-types';
6
+ /**
7
+ * Creates a suggester builder
8
+ * @returns SuggesterBuilder instance
9
+ */
10
+ export declare const createSuggesterBuilder: <T>(state?: SuggesterState) => SuggesterBuilder<T>;
11
+ /**
12
+ * Factory function to create a new suggester builder
13
+ * @example
14
+ * ```typescript
15
+ * const suggestions = suggest<Product>()
16
+ * .term('name-suggestions', 'laptop', { field: 'name', size: 5 })
17
+ * .build();
18
+ * ```
19
+ */
20
+ export declare const suggest: <T>() => SuggesterBuilder<T>;
21
+ //# sourceMappingURL=suggester.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggester.d.ts","sourceRoot":"","sources":["../src/suggester.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAErE;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,CAAC,EACtC,QAAO,cAAmB,KACzB,gBAAgB,CAAC,CAAC,CAkCnB,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,0BAAkC,CAAC"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ /**
3
+ * Suggester builder
4
+ * Provides query suggestions, phrase corrections, and autocomplete functionality
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.suggest = exports.createSuggesterBuilder = void 0;
8
+ /**
9
+ * Creates a suggester builder
10
+ * @returns SuggesterBuilder instance
11
+ */
12
+ const createSuggesterBuilder = (state = {}) => ({
13
+ term: (name, text, options) => {
14
+ return (0, exports.createSuggesterBuilder)({
15
+ ...state,
16
+ [name]: {
17
+ text,
18
+ term: options
19
+ }
20
+ });
21
+ },
22
+ phrase: (name, text, options) => {
23
+ return (0, exports.createSuggesterBuilder)({
24
+ ...state,
25
+ [name]: {
26
+ text,
27
+ phrase: options
28
+ }
29
+ });
30
+ },
31
+ completion: (name, prefix, options) => {
32
+ return (0, exports.createSuggesterBuilder)({
33
+ ...state,
34
+ [name]: {
35
+ prefix,
36
+ completion: options
37
+ }
38
+ });
39
+ },
40
+ build: () => ({
41
+ suggest: state
42
+ })
43
+ });
44
+ exports.createSuggesterBuilder = createSuggesterBuilder;
45
+ /**
46
+ * Factory function to create a new suggester builder
47
+ * @example
48
+ * ```typescript
49
+ * const suggestions = suggest<Product>()
50
+ * .term('name-suggestions', 'laptop', { field: 'name', size: 5 })
51
+ * .build();
52
+ * ```
53
+ */
54
+ const suggest = () => (0, exports.createSuggesterBuilder)();
55
+ exports.suggest = suggest;