tsense 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -0
- package/dist/tsense.d.ts +4 -2
- package/dist/tsense.js +17 -2
- package/dist/types/core.d.ts +17 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -38,6 +38,12 @@ export const UsersCollection = new TSense("users", {
|
|
|
38
38
|
type: "string",
|
|
39
39
|
sort: true,
|
|
40
40
|
},
|
|
41
|
+
company: {
|
|
42
|
+
type: "string",
|
|
43
|
+
override: {} as "netflix" | "google",
|
|
44
|
+
facet: true,
|
|
45
|
+
optional: true,
|
|
46
|
+
},
|
|
41
47
|
work_history: {
|
|
42
48
|
// object and object[] auto-infers enable_nested_fields
|
|
43
49
|
type: "object[]",
|
|
@@ -91,4 +97,25 @@ const results = await UsersCollection.searchDocuments({
|
|
|
91
97
|
],
|
|
92
98
|
},
|
|
93
99
|
});
|
|
100
|
+
|
|
101
|
+
/*
|
|
102
|
+
typed as
|
|
103
|
+
count: number;
|
|
104
|
+
data: {
|
|
105
|
+
id?: string | undefined;
|
|
106
|
+
phone?: string | null | undefined;
|
|
107
|
+
...
|
|
108
|
+
}[];
|
|
109
|
+
facet: {
|
|
110
|
+
netflix: number;
|
|
111
|
+
google: number;
|
|
112
|
+
// enabled by enable_facet_total
|
|
113
|
+
total: number;
|
|
114
|
+
};
|
|
115
|
+
*/
|
|
116
|
+
const faceted = await UsersCollection.searchDocuments({
|
|
117
|
+
search: "john",
|
|
118
|
+
facet_by: "company",
|
|
119
|
+
enable_facet_total: true,
|
|
120
|
+
});
|
|
94
121
|
```
|
package/dist/tsense.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Client } from "typesense";
|
|
2
|
-
import type { CustomCollectionField,
|
|
2
|
+
import type { CustomCollectionField, SearchFilters, InferCollectionTypes, InferFacetResponse } from "./types/core.js";
|
|
3
|
+
import type { Simplify } from "./types/helpers.js";
|
|
3
4
|
export declare class TSense<Options extends CustomCollectionField, Fields extends Record<string, Options>, Inferred = InferCollectionTypes<Fields>> {
|
|
4
5
|
private name;
|
|
5
6
|
private data;
|
|
@@ -19,9 +20,10 @@ export declare class TSense<Options extends CustomCollectionField, Fields extend
|
|
|
19
20
|
private maybeArray;
|
|
20
21
|
delete(): Promise<void>;
|
|
21
22
|
create(): Promise<this>;
|
|
22
|
-
searchDocuments(data:
|
|
23
|
+
searchDocuments<Filter extends SearchFilters<Inferred>>(data: Filter): Promise<{
|
|
23
24
|
count: number;
|
|
24
25
|
data: Inferred[];
|
|
26
|
+
facet: Simplify<InferFacetResponse<Inferred, Filter>>;
|
|
25
27
|
}>;
|
|
26
28
|
upsertDocuments(items: Inferred | Inferred[]): Promise<any[] | undefined>;
|
|
27
29
|
}
|
package/dist/tsense.js
CHANGED
|
@@ -149,7 +149,7 @@ export class TSense {
|
|
|
149
149
|
}
|
|
150
150
|
searchDocuments(data) {
|
|
151
151
|
return __awaiter(this, void 0, void 0, function* () {
|
|
152
|
-
var _a, _b, _c;
|
|
152
|
+
var _a, _b, _c, _d, _e;
|
|
153
153
|
const res = yield this.data.client
|
|
154
154
|
.collections(this.name)
|
|
155
155
|
.documents()
|
|
@@ -160,9 +160,23 @@ export class TSense {
|
|
|
160
160
|
filter_by: this.buildFilter(data).join("&&"),
|
|
161
161
|
page: data.page,
|
|
162
162
|
limit: data.limit,
|
|
163
|
+
facet_by: data === null || data === void 0 ? void 0 : data.facet_by,
|
|
163
164
|
});
|
|
165
|
+
const facet_result = (data === null || data === void 0 ? void 0 : data.facet_by)
|
|
166
|
+
? data.enable_facet_total
|
|
167
|
+
? { total: 0 }
|
|
168
|
+
: {}
|
|
169
|
+
: undefined;
|
|
170
|
+
if ((_d = (_c = res.facet_counts) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.counts) {
|
|
171
|
+
for (const iter of res.facet_counts[0].counts) {
|
|
172
|
+
facet_result[iter.value] = iter.count;
|
|
173
|
+
if (data === null || data === void 0 ? void 0 : data.enable_facet_total) {
|
|
174
|
+
facet_result.total += iter.count;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
164
178
|
const result = [];
|
|
165
|
-
for (const hit of (
|
|
179
|
+
for (const hit of (_e = res.hits) !== null && _e !== void 0 ? _e : []) {
|
|
166
180
|
if (data.highlight) {
|
|
167
181
|
for (const [key, value] of Object.entries(hit.highlight)) {
|
|
168
182
|
if (value) {
|
|
@@ -176,6 +190,7 @@ export class TSense {
|
|
|
176
190
|
return {
|
|
177
191
|
data: result,
|
|
178
192
|
count: res.found,
|
|
193
|
+
facet: facet_result,
|
|
179
194
|
};
|
|
180
195
|
});
|
|
181
196
|
}
|
package/dist/types/core.d.ts
CHANGED
|
@@ -28,20 +28,19 @@ type TypesenseToTS = {
|
|
|
28
28
|
"string*": unknown;
|
|
29
29
|
};
|
|
30
30
|
type ValidFieldType = keyof TypesenseToTS;
|
|
31
|
+
type MaybeOptional<Field, Result> = Field extends {
|
|
32
|
+
optional: true;
|
|
33
|
+
} ? Result | null | undefined : Result;
|
|
31
34
|
export type InferCollectionTypes<Fields> = Simplify<{
|
|
32
35
|
id?: string;
|
|
33
36
|
} & UndefinedToOptional<{
|
|
34
|
-
[K in keyof Fields]: Fields[K]
|
|
37
|
+
[K in keyof Fields]: MaybeOptional<Fields[K], Fields[K] extends {
|
|
35
38
|
override: infer Override;
|
|
36
|
-
} ? Fields[K] extends {
|
|
37
|
-
optional: true;
|
|
38
|
-
} ? Override | null | undefined : Override : Fields[K] extends {
|
|
39
|
+
} ? Override : Fields[K] extends ValidFieldType ? TypesenseToTS[Fields[K]] : Fields[K] extends {
|
|
39
40
|
type: infer T;
|
|
40
|
-
} ? T extends ValidFieldType ? Fields[K] extends {
|
|
41
|
-
optional: true;
|
|
42
|
-
} ? TypesenseToTS[T] | null | undefined : TypesenseToTS[T] : never : Fields[K] extends `${infer RealType}?` ? RealType extends ValidFieldType ? TypesenseToTS[RealType] | null | undefined : never : never;
|
|
41
|
+
} ? T extends ValidFieldType ? TypesenseToTS[T] : never : Fields[K] extends `${infer RealType}?` ? RealType extends ValidFieldType ? TypesenseToTS[RealType] | null | undefined : never : never>;
|
|
43
42
|
}>>;
|
|
44
|
-
type OrderBy<Inferred, Options = keyof Inferred | "score"> = Options | Options[] | (Options extends
|
|
43
|
+
type OrderBy<Inferred, Options = keyof Inferred | "score"> = Options | Options[] | (Options extends string ? `${Options} ${"asc" | "desc"}` : never)[];
|
|
45
44
|
type SingleFilter<Inferred> = Partial<{
|
|
46
45
|
[K in keyof Inferred]: BaseIfArray<Inferred[K]> | NonNullable<BaseIfArray<Inferred[K]>>[] | {
|
|
47
46
|
not?: string | string[] | boolean | null;
|
|
@@ -53,7 +52,7 @@ type SingleFilter<Inferred> = Partial<{
|
|
|
53
52
|
type RecursiveFilter<Inferred> = SingleFilter<Inferred> & {
|
|
54
53
|
OR?: RecursiveFilter<Inferred>[];
|
|
55
54
|
};
|
|
56
|
-
export type
|
|
55
|
+
export type SearchFilters<Inferred> = {
|
|
57
56
|
search?: string;
|
|
58
57
|
filter?: RecursiveFilter<Inferred>;
|
|
59
58
|
order_by?: OrderBy<Inferred> | undefined;
|
|
@@ -62,5 +61,14 @@ export type Filters<Inferred> = {
|
|
|
62
61
|
limit?: number;
|
|
63
62
|
search_keys?: (keyof Inferred)[];
|
|
64
63
|
highlight?: boolean;
|
|
64
|
+
facet_by?: NoInfer<keyof Inferred>;
|
|
65
|
+
enable_facet_total?: boolean;
|
|
65
66
|
};
|
|
67
|
+
export type InferFacetResponse<Inferred, Filter> = Filter extends {
|
|
68
|
+
facet_by: infer FacetBy;
|
|
69
|
+
} ? FacetBy extends keyof Inferred ? Record<NonNullable<Inferred[FacetBy]> extends string ? NonNullable<Inferred[FacetBy]> : never, number> & (Filter extends {
|
|
70
|
+
enable_facet_total: true;
|
|
71
|
+
} ? {
|
|
72
|
+
total: number;
|
|
73
|
+
} : {}) : never : never;
|
|
66
74
|
export {};
|