dsh-locator 0.8.2 → 0.9.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.
- package/CHANGELOG.md +13 -0
- package/README-es.md +21 -5
- package/README-hi.md +22 -5
- package/README-pt.md +22 -5
- package/README.en.md +22 -5
- package/README.md +22 -5
- package/client.js +931 -41
- package/lib/combined.d.ts +20 -3
- package/lib/combined.d.ts.map +1 -1
- package/lib/combined.js +72 -12
- package/lib/combined.js.map +1 -1
- package/lib/content-search-worker.d.ts +3 -3
- package/lib/content-search-worker.js +11 -6
- package/lib/content-search-worker.js.map +1 -1
- package/lib/content-search.d.ts +81 -7
- package/lib/content-search.d.ts.map +1 -1
- package/lib/content-search.js +454 -36
- package/lib/content-search.js.map +1 -1
- package/lib/content.d.ts +20 -0
- package/lib/content.d.ts.map +1 -1
- package/lib/content.js +71 -21
- package/lib/content.js.map +1 -1
- package/lib/find.d.ts.map +1 -1
- package/lib/find.js +2 -1
- package/lib/find.js.map +1 -1
- package/lib/http.d.ts.map +1 -1
- package/lib/http.js +9 -2
- package/lib/http.js.map +1 -1
- package/package.json +1 -1
- package/src/combined.ts +95 -14
- package/src/content-search-worker.ts +15 -8
- package/src/content-search.ts +559 -36
- package/src/content.ts +81 -18
- package/src/find.ts +3 -2
- package/src/http.ts +11 -2
package/lib/combined.d.ts
CHANGED
|
@@ -4,11 +4,13 @@
|
|
|
4
4
|
*
|
|
5
5
|
* The name index and the content index live in different stores, so this module
|
|
6
6
|
* owns the orchestration and the merge rules as pure, injectable functions:
|
|
7
|
-
* scope gating, the lazy-build guard for empty queries, per-group degradation
|
|
8
|
-
*
|
|
7
|
+
* scope gating, the lazy-build guard for empty queries, per-group degradation,
|
|
8
|
+
* match-option routing (content vs name engine), page counts and de-duplication
|
|
9
|
+
* of a path that appears both as a body hit and a name hit.
|
|
9
10
|
* @module dsh-locator/combined
|
|
10
11
|
*/
|
|
11
12
|
import type { ContentHit, ContentState } from './content.ts';
|
|
13
|
+
import type { ContentCount, ContentCountMode, ContentMatchMode, ContentSearchOptions, ContentSearchResult } from './content-search.ts';
|
|
12
14
|
import type { SearchArgs, SearchHit, SearchResult } from './runtime.ts';
|
|
13
15
|
/** Which groups a combined request asked for; every scope is on by default. */
|
|
14
16
|
export interface CombinedScopes {
|
|
@@ -24,6 +26,15 @@ export interface CombinedRequest {
|
|
|
24
26
|
sort: string;
|
|
25
27
|
desc: boolean;
|
|
26
28
|
scopes: CombinedScopes;
|
|
29
|
+
/** How the query text is interpreted (`normal` by default). */
|
|
30
|
+
matchMode: ContentMatchMode;
|
|
31
|
+
caseSensitive: boolean;
|
|
32
|
+
wholeWord: boolean;
|
|
33
|
+
/** Restrict the content group to one session (null means every document). */
|
|
34
|
+
sessionId: string | null;
|
|
35
|
+
/** How much counting work the groups may spend. */
|
|
36
|
+
count: ContentCountMode;
|
|
37
|
+
countLimit: number;
|
|
27
38
|
}
|
|
28
39
|
/** One name-index group: files or directories. */
|
|
29
40
|
export interface NameGroup {
|
|
@@ -33,7 +44,10 @@ export interface NameGroup {
|
|
|
33
44
|
truncated: boolean;
|
|
34
45
|
/** Rows dropped because the same path already appears in the content group. */
|
|
35
46
|
deduped: number;
|
|
47
|
+
/** The name engine always returns an exact total. */
|
|
48
|
+
count: ContentCount;
|
|
36
49
|
tookMs: number;
|
|
50
|
+
warnings?: string[];
|
|
37
51
|
error?: string;
|
|
38
52
|
}
|
|
39
53
|
/** The content group: body/session hits plus the index state at query time. */
|
|
@@ -42,6 +56,9 @@ export interface ContentGroup {
|
|
|
42
56
|
returned: number;
|
|
43
57
|
/** True when the group was cut off by its page limit. */
|
|
44
58
|
capped: boolean;
|
|
59
|
+
/** Exact or bounded match count; `unknown` when counting was skipped. */
|
|
60
|
+
count: ContentCount;
|
|
61
|
+
warnings: string[];
|
|
45
62
|
building: boolean;
|
|
46
63
|
files: number;
|
|
47
64
|
sessions: number;
|
|
@@ -64,7 +81,7 @@ export interface CombinedResponse {
|
|
|
64
81
|
/** Dependencies required to run a combined search; the HTTP layer supplies them. */
|
|
65
82
|
export interface CombinedDeps {
|
|
66
83
|
search(args: SearchArgs): Promise<SearchResult>;
|
|
67
|
-
contentSearch?: (query: string, limit: number) => Promise<
|
|
84
|
+
contentSearch?: (query: string, limit: number, options: ContentSearchOptions) => Promise<ContentSearchResult>;
|
|
68
85
|
contentStatus?: () => ContentState;
|
|
69
86
|
ensure?: () => void;
|
|
70
87
|
maxResults: number;
|
package/lib/combined.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combined.d.ts","sourceRoot":"","sources":["../src/combined.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"combined.d.ts","sourceRoot":"","sources":["../src/combined.ts"],"names":[],"mappings":"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"}
|
package/lib/combined.js
CHANGED
|
@@ -4,10 +4,12 @@
|
|
|
4
4
|
*
|
|
5
5
|
* The name index and the content index live in different stores, so this module
|
|
6
6
|
* owns the orchestration and the merge rules as pure, injectable functions:
|
|
7
|
-
* scope gating, the lazy-build guard for empty queries, per-group degradation
|
|
8
|
-
*
|
|
7
|
+
* scope gating, the lazy-build guard for empty queries, per-group degradation,
|
|
8
|
+
* match-option routing (content vs name engine), page counts and de-duplication
|
|
9
|
+
* of a path that appears both as a body hit and a name hit.
|
|
9
10
|
* @module dsh-locator/combined
|
|
10
11
|
*/
|
|
12
|
+
import { decodeExtendedForNames } from "./content-search.js";
|
|
11
13
|
/**
|
|
12
14
|
* Read the three scope flags from a request body. Anything that is not an
|
|
13
15
|
* explicit `false` counts as enabled, so a panel that only sends `{ content:
|
|
@@ -39,6 +41,12 @@ export function readCombinedRequest(body, maxResults) {
|
|
|
39
41
|
sort: sortKey(body.sort),
|
|
40
42
|
desc: body.desc === true,
|
|
41
43
|
scopes: readScopes(body),
|
|
44
|
+
matchMode: matchMode(body.matchMode),
|
|
45
|
+
caseSensitive: body.caseSensitive === true,
|
|
46
|
+
wholeWord: body.wholeWord === true,
|
|
47
|
+
sessionId: typeof body.sessionId === 'string' && body.sessionId.trim() !== '' ? body.sessionId : null,
|
|
48
|
+
count: countMode(body.count),
|
|
49
|
+
countLimit: clamp(body.countLimit, 1, 5000, 1000),
|
|
42
50
|
};
|
|
43
51
|
}
|
|
44
52
|
/**
|
|
@@ -111,16 +119,42 @@ export async function runCombinedSearch(deps, request) {
|
|
|
111
119
|
/** Page through a directory-shaped name query. */
|
|
112
120
|
async function nameGroup(deps, request, files) {
|
|
113
121
|
const started = Date.now();
|
|
122
|
+
const empty = (error, warnings) => ({
|
|
123
|
+
hits: [],
|
|
124
|
+
returned: 0,
|
|
125
|
+
total: 0,
|
|
126
|
+
truncated: false,
|
|
127
|
+
deduped: 0,
|
|
128
|
+
count: { value: 0, kind: 'exact' },
|
|
129
|
+
tookMs: Date.now() - started,
|
|
130
|
+
...(warnings === undefined || warnings.length === 0 ? {} : { warnings }),
|
|
131
|
+
...(error === undefined ? {} : { error }),
|
|
132
|
+
});
|
|
133
|
+
// The name engine understands everything except Notepad++-style escapes:
|
|
134
|
+
// decode them here and drop control characters (file names cannot contain
|
|
135
|
+
// them) instead of searching for a literal backslash sequence.
|
|
136
|
+
let nameQuery = request.query;
|
|
137
|
+
let warnings = [];
|
|
138
|
+
if (request.matchMode === 'extended') {
|
|
139
|
+
const decoded = decodeExtendedForNames(request.query);
|
|
140
|
+
warnings = decoded.warnings;
|
|
141
|
+
if (!decoded.ok)
|
|
142
|
+
return empty(decoded.error ?? 'invalid-escape', warnings);
|
|
143
|
+
nameQuery = decoded.text;
|
|
144
|
+
// An all-control-escape query must not degrade into "match everything".
|
|
145
|
+
if (nameQuery.trim() === '')
|
|
146
|
+
return empty(undefined, [...new Set([...warnings, 'name-extended-empty'])]);
|
|
147
|
+
}
|
|
114
148
|
try {
|
|
115
149
|
const result = await deps.search({
|
|
116
|
-
query:
|
|
150
|
+
query: nameQuery,
|
|
117
151
|
limit: request.limit,
|
|
118
152
|
offset: 0,
|
|
119
153
|
sort: request.sort,
|
|
120
154
|
desc: request.desc,
|
|
121
|
-
regex:
|
|
122
|
-
caseSensitive:
|
|
123
|
-
wholeWord:
|
|
155
|
+
regex: request.matchMode === 'regex',
|
|
156
|
+
caseSensitive: request.caseSensitive,
|
|
157
|
+
wholeWord: request.wholeWord,
|
|
124
158
|
filesOnly: files,
|
|
125
159
|
dirsOnly: !files,
|
|
126
160
|
});
|
|
@@ -130,17 +164,19 @@ async function nameGroup(deps, request, files) {
|
|
|
130
164
|
total: result.total,
|
|
131
165
|
truncated: result.truncated,
|
|
132
166
|
deduped: 0,
|
|
167
|
+
count: { value: result.total, kind: 'exact' },
|
|
133
168
|
tookMs: result.tookNs / 1e6,
|
|
169
|
+
...(warnings.length === 0 ? {} : { warnings: [...new Set(warnings)] }),
|
|
134
170
|
};
|
|
135
171
|
}
|
|
136
172
|
catch (error) {
|
|
137
|
-
return {
|
|
173
|
+
return { ...empty(messageOf(error)), tookMs: Date.now() - started };
|
|
138
174
|
}
|
|
139
175
|
}
|
|
140
176
|
/** Query the content store, or report its state without starting a build. */
|
|
141
177
|
async function contentGroup(deps, request, ask) {
|
|
142
178
|
const started = Date.now();
|
|
143
|
-
const empty = () => {
|
|
179
|
+
const empty = (warnings = []) => {
|
|
144
180
|
let state;
|
|
145
181
|
try {
|
|
146
182
|
state = deps.contentStatus?.();
|
|
@@ -152,6 +188,8 @@ async function contentGroup(deps, request, ask) {
|
|
|
152
188
|
hits: [],
|
|
153
189
|
returned: 0,
|
|
154
190
|
capped: false,
|
|
191
|
+
count: { value: 0, kind: 'unknown' },
|
|
192
|
+
warnings,
|
|
155
193
|
building: state?.building ?? false,
|
|
156
194
|
files: state?.files ?? 0,
|
|
157
195
|
sessions: state?.sessions ?? 0,
|
|
@@ -160,22 +198,38 @@ async function contentGroup(deps, request, ask) {
|
|
|
160
198
|
tookMs: 0,
|
|
161
199
|
};
|
|
162
200
|
};
|
|
201
|
+
// 0.9.0 never scans the whole corpus from a panel keystroke: the content
|
|
202
|
+
// group pauses itself in regex mode while the name groups still run.
|
|
203
|
+
if (request.matchMode === 'regex') {
|
|
204
|
+
return { ...empty(['content-regex-paused']), error: 'content-regex-not-supported' };
|
|
205
|
+
}
|
|
163
206
|
if (!ask || deps.contentSearch === undefined)
|
|
164
207
|
return empty();
|
|
208
|
+
const options = {
|
|
209
|
+
matchMode: request.matchMode,
|
|
210
|
+
caseSensitive: request.caseSensitive,
|
|
211
|
+
wholeWord: request.wholeWord,
|
|
212
|
+
count: request.count,
|
|
213
|
+
countLimit: request.countLimit,
|
|
214
|
+
...(request.sessionId === null ? {} : { sessionId: request.sessionId }),
|
|
215
|
+
};
|
|
165
216
|
try {
|
|
166
217
|
deps.ensure?.();
|
|
167
|
-
const
|
|
218
|
+
const result = await deps.contentSearch(request.query, request.contentLimit, options);
|
|
168
219
|
const state = deps.contentStatus?.();
|
|
169
220
|
return {
|
|
170
|
-
hits,
|
|
171
|
-
returned: hits.length,
|
|
172
|
-
capped: hits.length >= request.contentLimit,
|
|
221
|
+
hits: result.hits,
|
|
222
|
+
returned: result.hits.length,
|
|
223
|
+
capped: result.hits.length >= request.contentLimit,
|
|
224
|
+
count: result.count,
|
|
225
|
+
warnings: result.warnings,
|
|
173
226
|
building: state?.building ?? false,
|
|
174
227
|
files: state?.files ?? 0,
|
|
175
228
|
sessions: state?.sessions ?? 0,
|
|
176
229
|
messages: state?.messages ?? 0,
|
|
177
230
|
truncated: state?.truncated ?? false,
|
|
178
231
|
tookMs: Date.now() - started,
|
|
232
|
+
...(result.error === undefined ? {} : { error: result.error }),
|
|
179
233
|
};
|
|
180
234
|
}
|
|
181
235
|
catch (error) {
|
|
@@ -187,6 +241,12 @@ function clamp(value, min, max, fallback) {
|
|
|
187
241
|
return fallback;
|
|
188
242
|
return Math.min(max, Math.max(min, Math.trunc(value)));
|
|
189
243
|
}
|
|
244
|
+
function matchMode(value) {
|
|
245
|
+
return value === 'extended' || value === 'regex' ? value : 'normal';
|
|
246
|
+
}
|
|
247
|
+
function countMode(value) {
|
|
248
|
+
return value === 'bounded' || value === 'none' ? value : 'exact';
|
|
249
|
+
}
|
|
190
250
|
function sortKey(value) {
|
|
191
251
|
return value === 'name' || value === 'path' || value === 'size' || value === 'mtime' || value === 'ext' ? value : 'mtime';
|
|
192
252
|
}
|
package/lib/combined.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combined.js","sourceRoot":"","sources":["../src/combined.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"combined.js","sourceRoot":"","sources":["../src/combined.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Search worker:
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Search worker: content queries run here so a slow query can never stall the
|
|
3
|
+
* DSH host's event loop. A read-only connection makes the build's writes in the
|
|
4
|
+
* main thread safe to observe concurrently (WAL).
|
|
5
5
|
* @module dsh-locator/content-search-worker
|
|
6
6
|
*/
|
|
7
7
|
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Search worker:
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Search worker: content queries run here so a slow query can never stall the
|
|
3
|
+
* DSH host's event loop. A read-only connection makes the build's writes in the
|
|
4
|
+
* main thread safe to observe concurrently (WAL).
|
|
5
5
|
* @module dsh-locator/content-search-worker
|
|
6
6
|
*/
|
|
7
7
|
import { parentPort, workerData } from 'node:worker_threads';
|
|
@@ -39,16 +39,21 @@ parentPort?.on('message', (request) => {
|
|
|
39
39
|
parentPort?.postMessage({ id: request.id, ok: true });
|
|
40
40
|
return;
|
|
41
41
|
}
|
|
42
|
-
let
|
|
42
|
+
let result = {
|
|
43
|
+
hits: [],
|
|
44
|
+
count: { value: 0, kind: 'unknown' },
|
|
45
|
+
warnings: [],
|
|
46
|
+
error: 'content-index-unavailable',
|
|
47
|
+
};
|
|
43
48
|
let error = '';
|
|
44
49
|
if (db !== null) {
|
|
45
50
|
try {
|
|
46
|
-
|
|
51
|
+
result = searchContent(db, request.query ?? '', request.limit ?? 30, request.options ?? {});
|
|
47
52
|
}
|
|
48
53
|
catch (cause) {
|
|
49
54
|
error = cause instanceof Error ? cause.message : String(cause);
|
|
50
55
|
}
|
|
51
56
|
}
|
|
52
|
-
parentPort?.postMessage({ id: request.id,
|
|
57
|
+
parentPort?.postMessage({ id: request.id, result, error });
|
|
53
58
|
});
|
|
54
59
|
//# sourceMappingURL=content-search-worker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-search-worker.js","sourceRoot":"","sources":["../src/content-search-worker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"content-search-worker.js","sourceRoot":"","sources":["../src/content-search-worker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAuD,MAAM,qBAAqB,CAAA;AAWxG,IAAI,EAAE,GAAwB,IAAI,CAAA;AAElC,SAAS,IAAI,CAAC,IAAY;IACxB,IAAI,CAAC;QAAC,EAAE,EAAE,KAAK,EAAE,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1C,EAAE,GAAG,IAAI,CAAA;IACT,IAAI,CAAC;QAAC,EAAE,GAAG,IAAI,YAAY,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,EAAE,GAAG,IAAI,CAAA;IAAC,CAAC;AAC7E,CAAC;AAED,MAAM,OAAO,GAAI,UAA8C,EAAE,MAAM,CAAA;AACvE,IAAI,OAAO,KAAK,SAAS;IAAE,IAAI,CAAC,OAAO,CAAC,CAAA;AAExC,UAAU,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,OAAgB,EAAE,EAAE;IAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAClB,UAAU,EAAE,WAAW,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;QACrD,OAAM;IACR,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC;YAAC,EAAE,EAAE,KAAK,EAAE,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC1C,EAAE,GAAG,IAAI,CAAA;QACT,UAAU,EAAE,WAAW,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;QACrD,OAAM;IACR,CAAC;IACD,IAAI,MAAM,GAAwB;QAChC,IAAI,EAAE,EAAE;QACR,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE;QACpC,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,2BAA2B;KACnC,CAAA;IACD,IAAI,KAAK,GAAG,EAAE,CAAA;IACd,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;QAC7F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IACD,UAAU,EAAE,WAAW,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;AAC5D,CAAC,CAAC,CAAA"}
|
package/lib/content-search.d.ts
CHANGED
|
@@ -1,15 +1,89 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Content FTS5 query
|
|
2
|
+
* Content FTS5 query engine: normal substring search, Notepad++-style extended
|
|
3
|
+
* escaping, case-sensitive GLOB matching and whole-word post-filtering, with
|
|
4
|
+
* exact or bounded counts.
|
|
5
|
+
*
|
|
6
|
+
* Shared by the host thread, the search worker and the combined panel search.
|
|
7
|
+
* The page path is deliberately two-phase: rank the rowids first, then read the
|
|
8
|
+
* few bodies and build the snippet in JS. Putting `snippet()` in the same
|
|
9
|
+
* `ORDER BY rank` statement made a SQLite sorter evaluate it for every match
|
|
10
|
+
* (measured 2.7 s for "the" on a 1 GB corpus; 60 ms with this split).
|
|
3
11
|
* @module dsh-locator/content-search
|
|
4
12
|
*/
|
|
5
13
|
import type { DatabaseSync } from 'node:sqlite';
|
|
6
14
|
import type { ContentHit } from './content.ts';
|
|
15
|
+
/** How the query text is interpreted. */
|
|
16
|
+
export type ContentMatchMode = 'normal' | 'extended' | 'regex';
|
|
17
|
+
/** How much work the caller wants the count to spend. */
|
|
18
|
+
export type ContentCountMode = 'exact' | 'bounded' | 'none';
|
|
19
|
+
/** A match count, with its confidence. `bounded` means "at least value". */
|
|
20
|
+
export interface ContentCount {
|
|
21
|
+
value: number;
|
|
22
|
+
kind: 'exact' | 'bounded' | 'unknown';
|
|
23
|
+
limit?: number;
|
|
24
|
+
}
|
|
25
|
+
/** Options accepted by {@link searchContent} and the content search worker. */
|
|
26
|
+
export interface ContentSearchOptions {
|
|
27
|
+
matchMode?: ContentMatchMode;
|
|
28
|
+
caseSensitive?: boolean;
|
|
29
|
+
wholeWord?: boolean;
|
|
30
|
+
/** Resolved by ContentIndex from the request's sessionId. */
|
|
31
|
+
sessionId?: string;
|
|
32
|
+
/** Session log path; set by ContentIndex after resolving sessionId. */
|
|
33
|
+
sessionPath?: string | null;
|
|
34
|
+
count?: ContentCountMode;
|
|
35
|
+
countLimit?: number;
|
|
36
|
+
}
|
|
37
|
+
/** Result of one content query. */
|
|
38
|
+
export interface ContentSearchResult {
|
|
39
|
+
hits: ContentHit[];
|
|
40
|
+
count: ContentCount;
|
|
41
|
+
warnings: string[];
|
|
42
|
+
error?: string;
|
|
43
|
+
}
|
|
44
|
+
/** Text escaped for an FTS5 quoted phrase (`"` doubled). */
|
|
45
|
+
export declare function quoteFts(text: string): string;
|
|
46
|
+
/** Escape a literal for SQLite GLOB (`*`, `?`, `[`, `]`). */
|
|
47
|
+
export declare function escapeGlob(text: string): string;
|
|
48
|
+
/** Escape a literal for SQL LIKE with `ESCAPE '\'`. */
|
|
49
|
+
export declare function escapeLike(text: string): string;
|
|
50
|
+
/** Decoded extended-mode query text. */
|
|
51
|
+
export interface DecodedExtended {
|
|
52
|
+
ok: boolean;
|
|
53
|
+
text: string;
|
|
54
|
+
warnings: string[];
|
|
55
|
+
/** `invalid-escape` when `\\xNN` is malformed. */
|
|
56
|
+
error?: string;
|
|
57
|
+
}
|
|
7
58
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* @param query - user query; shorter than three characters falls back to LIKE.
|
|
11
|
-
* @param limit - maximum hits.
|
|
12
|
-
* @returns hits, ordered by relevance.
|
|
59
|
+
* Decode Notepad++-style extended escapes: `\n`, `\r`, `\t`, `\0`, `\\`,
|
|
60
|
+
* `\xNN`. Unknown escapes are kept literally with a warning.
|
|
13
61
|
*/
|
|
14
|
-
export declare function
|
|
62
|
+
export declare function decodeExtended(input: string): DecodedExtended;
|
|
63
|
+
/**
|
|
64
|
+
* Extended decoding for file names: names cannot contain control characters, so
|
|
65
|
+
* they are dropped from the pattern and reported instead of silently matching
|
|
66
|
+
* nothing.
|
|
67
|
+
*/
|
|
68
|
+
export declare function decodeExtendedForNames(input: string): DecodedExtended;
|
|
69
|
+
/** Whether `index` starts a whole-word occurrence of `length` bytes. */
|
|
70
|
+
export declare function isWholeWord(hay: string, index: number, length: number): boolean;
|
|
71
|
+
/** One located match: byte offset and length. */
|
|
72
|
+
interface Located {
|
|
73
|
+
index: number;
|
|
74
|
+
length: number;
|
|
75
|
+
}
|
|
76
|
+
/** First whole-word (or plain) occurrence of any term, or null. */
|
|
77
|
+
export declare function locateMatch(body: string, terms: readonly string[], caseSensitive: boolean, wholeWord: boolean): Located | null;
|
|
78
|
+
/** 1-based line number of a byte offset. */
|
|
79
|
+
export declare function lineOf(body: string, index: number): number;
|
|
80
|
+
/**
|
|
81
|
+
* Run one content query.
|
|
82
|
+
*
|
|
83
|
+
* Modes: `normal` (whitespace-separated substring terms), `extended`
|
|
84
|
+
* (Notepad++ escapes, one literal phrase), `regex` (not executed server-side in
|
|
85
|
+
* 0.9.0: returns `content-regex-not-supported`).
|
|
86
|
+
*/
|
|
87
|
+
export declare function searchContent(db: DatabaseSync, query: string, limit: number, options?: ContentSearchOptions): ContentSearchResult;
|
|
88
|
+
export {};
|
|
15
89
|
//# sourceMappingURL=content-search.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-search.d.ts","sourceRoot":"","sources":["../src/content-search.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"content-search.d.ts","sourceRoot":"","sources":["../src/content-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAE9C,yCAAyC;AACzC,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAA;AAE9D,yDAAyD;AACzD,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;AAE3D,4EAA4E;AAC5E,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAA;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,+EAA+E;AAC/E,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,gBAAgB,CAAA;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,KAAK,CAAC,EAAE,gBAAgB,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,mCAAmC;AACnC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,EAAE,CAAA;IAClB,KAAK,EAAE,YAAY,CAAA;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAeD,4DAA4D;AAC5D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,6DAA6D;AAC7D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,uDAAuD;AACvD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wCAAwC;AACxC,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAuD7D;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAMrE;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAK/E;AAED,iDAAiD;AACjD,UAAU,OAAO;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,mEAAmE;AACnE,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,aAAa,EAAE,OAAO,EACtB,SAAS,EAAE,OAAO,GACjB,OAAO,GAAG,IAAI,CAkBhB;AAYD,4CAA4C;AAC5C,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAS1D;AA+QD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,YAAY,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CAkErB"}
|