dsh-locator 0.8.1 → 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 +25 -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 +968 -54
- package/lib/combined.d.ts +20 -3
- package/lib/combined.d.ts.map +1 -1
- package/lib/combined.js +79 -13
- 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 +97 -15
- 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,22 +164,32 @@ 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 = () => {
|
|
144
|
-
|
|
179
|
+
const empty = (warnings = []) => {
|
|
180
|
+
let state;
|
|
181
|
+
try {
|
|
182
|
+
state = deps.contentStatus?.();
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
state = undefined;
|
|
186
|
+
}
|
|
145
187
|
return {
|
|
146
188
|
hits: [],
|
|
147
189
|
returned: 0,
|
|
148
190
|
capped: false,
|
|
191
|
+
count: { value: 0, kind: 'unknown' },
|
|
192
|
+
warnings,
|
|
149
193
|
building: state?.building ?? false,
|
|
150
194
|
files: state?.files ?? 0,
|
|
151
195
|
sessions: state?.sessions ?? 0,
|
|
@@ -154,22 +198,38 @@ async function contentGroup(deps, request, ask) {
|
|
|
154
198
|
tookMs: 0,
|
|
155
199
|
};
|
|
156
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
|
+
}
|
|
157
206
|
if (!ask || deps.contentSearch === undefined)
|
|
158
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
|
+
};
|
|
159
216
|
try {
|
|
160
217
|
deps.ensure?.();
|
|
161
|
-
const
|
|
218
|
+
const result = await deps.contentSearch(request.query, request.contentLimit, options);
|
|
162
219
|
const state = deps.contentStatus?.();
|
|
163
220
|
return {
|
|
164
|
-
hits,
|
|
165
|
-
returned: hits.length,
|
|
166
|
-
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,
|
|
167
226
|
building: state?.building ?? false,
|
|
168
227
|
files: state?.files ?? 0,
|
|
169
228
|
sessions: state?.sessions ?? 0,
|
|
170
229
|
messages: state?.messages ?? 0,
|
|
171
230
|
truncated: state?.truncated ?? false,
|
|
172
231
|
tookMs: Date.now() - started,
|
|
232
|
+
...(result.error === undefined ? {} : { error: result.error }),
|
|
173
233
|
};
|
|
174
234
|
}
|
|
175
235
|
catch (error) {
|
|
@@ -181,6 +241,12 @@ function clamp(value, min, max, fallback) {
|
|
|
181
241
|
return fallback;
|
|
182
242
|
return Math.min(max, Math.max(min, Math.trunc(value)));
|
|
183
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
|
+
}
|
|
184
250
|
function sortKey(value) {
|
|
185
251
|
return value === 'name' || value === 'path' || value === 'size' || value === 'mtime' || value === 'ext' ? value : 'mtime';
|
|
186
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"}
|