@cyanheads/zenodo-mcp-server 0.1.2 → 0.1.3

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 (56) hide show
  1. package/AGENTS.md +22 -15
  2. package/CLAUDE.md +22 -15
  3. package/Dockerfile +3 -3
  4. package/README.md +6 -4
  5. package/changelog/0.1.x/0.1.3.md +35 -0
  6. package/dist/mcp-server/tools/definitions/get-record.tool.d.ts +106 -2
  7. package/dist/mcp-server/tools/definitions/get-record.tool.d.ts.map +1 -1
  8. package/dist/mcp-server/tools/definitions/get-record.tool.js +452 -106
  9. package/dist/mcp-server/tools/definitions/get-record.tool.js.map +1 -1
  10. package/dist/mcp-server/tools/definitions/index.d.ts +283 -180
  11. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
  12. package/dist/mcp-server/tools/definitions/list-files.tool.d.ts.map +1 -1
  13. package/dist/mcp-server/tools/definitions/list-files.tool.js +21 -15
  14. package/dist/mcp-server/tools/definitions/list-files.tool.js.map +1 -1
  15. package/dist/mcp-server/tools/definitions/list-versions.tool.d.ts +1 -1
  16. package/dist/mcp-server/tools/definitions/list-versions.tool.d.ts.map +1 -1
  17. package/dist/mcp-server/tools/definitions/list-versions.tool.js +29 -20
  18. package/dist/mcp-server/tools/definitions/list-versions.tool.js.map +1 -1
  19. package/dist/mcp-server/tools/definitions/lookup-vocabulary.tool.d.ts +2 -1
  20. package/dist/mcp-server/tools/definitions/lookup-vocabulary.tool.d.ts.map +1 -1
  21. package/dist/mcp-server/tools/definitions/lookup-vocabulary.tool.js +39 -22
  22. package/dist/mcp-server/tools/definitions/lookup-vocabulary.tool.js.map +1 -1
  23. package/dist/mcp-server/tools/definitions/read-file.tool.d.ts.map +1 -1
  24. package/dist/mcp-server/tools/definitions/read-file.tool.js +16 -14
  25. package/dist/mcp-server/tools/definitions/read-file.tool.js.map +1 -1
  26. package/dist/mcp-server/tools/definitions/search-records.tool.d.ts +3 -3
  27. package/dist/mcp-server/tools/definitions/search-records.tool.d.ts.map +1 -1
  28. package/dist/mcp-server/tools/definitions/search-records.tool.js +138 -29
  29. package/dist/mcp-server/tools/definitions/search-records.tool.js.map +1 -1
  30. package/dist/mcp-server/tools/paging.d.ts +42 -0
  31. package/dist/mcp-server/tools/paging.d.ts.map +1 -0
  32. package/dist/mcp-server/tools/paging.js +44 -0
  33. package/dist/mcp-server/tools/paging.js.map +1 -0
  34. package/dist/mcp-server/tools/record-miss.d.ts +5 -1
  35. package/dist/mcp-server/tools/record-miss.d.ts.map +1 -1
  36. package/dist/mcp-server/tools/record-miss.js +6 -2
  37. package/dist/mcp-server/tools/record-miss.js.map +1 -1
  38. package/dist/services/zenodo/html-to-text.d.ts +19 -8
  39. package/dist/services/zenodo/html-to-text.d.ts.map +1 -1
  40. package/dist/services/zenodo/html-to-text.js +175 -48
  41. package/dist/services/zenodo/html-to-text.js.map +1 -1
  42. package/dist/services/zenodo/http.js +1 -1
  43. package/dist/services/zenodo/http.js.map +1 -1
  44. package/dist/services/zenodo/normalize.d.ts.map +1 -1
  45. package/dist/services/zenodo/normalize.js +5 -2
  46. package/dist/services/zenodo/normalize.js.map +1 -1
  47. package/dist/services/zenodo/query-builder.d.ts +84 -8
  48. package/dist/services/zenodo/query-builder.d.ts.map +1 -1
  49. package/dist/services/zenodo/query-builder.js +484 -21
  50. package/dist/services/zenodo/query-builder.js.map +1 -1
  51. package/dist/services/zenodo/text-preview.d.ts +1 -1
  52. package/dist/services/zenodo/text-preview.d.ts.map +1 -1
  53. package/dist/services/zenodo/text-preview.js +38 -38
  54. package/dist/services/zenodo/text-preview.js.map +1 -1
  55. package/package.json +7 -7
  56. package/server.json +3 -3
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * @fileoverview Composes the Zenodo search request from validated filters. Only
3
3
  * allowlisted query parameters are ever emitted; every other filter composes into
4
- * `q` as a quoted field clause. Also holds the local query pre-checks and the
5
- * partial-date expansion search needs.
4
+ * `q` as a quoted field clause. Also holds the local query pre-checks (including a
5
+ * recognizer of the query grammar Zenodo parses `q` with) and the partial-date
6
+ * expansion search needs.
6
7
  * @module services/zenodo/query-builder
7
8
  */
8
9
  import { getResourceType } from './resource-types.js';
@@ -45,14 +46,19 @@ function trimOperators(query) {
45
46
  * with no open group is escaped as `\)`, and each group left open is closed.
46
47
  * Zenodo matches a query it cannot parse as plain text, which turns the filter
47
48
  * clauses into optional terms (an unterminated quote matched the whole corpus
48
- * instead of the filtered set), and a stray `)` lets the query widen them. A
49
- * well-formed query comes back unchanged.
49
+ * instead of the filtered set), and a stray `)` lets the query widen them. Inside a
50
+ * range, as Zenodo's search engine lexes it ({@link rangeSpan}), a `/` and a `"` that
51
+ * does not close within the range are literal, so they leave nothing open
52
+ * (`[a"b TO c]`). A well-formed query comes back unchanged.
50
53
  */
51
54
  export function balanceQuery(raw) {
52
55
  const query = trimOperators(raw);
53
56
  let out = '';
54
57
  let depth = 0;
55
58
  let mode = 'text';
59
+ /** End of the range the scan is inside; once one never closes, none after it can. */
60
+ let rangeStop = 0;
61
+ let rangesClose = true;
56
62
  for (let i = 0; i < query.length; i++) {
57
63
  const ch = query[i];
58
64
  if (ch === '\\') {
@@ -68,11 +74,15 @@ export function balanceQuery(raw) {
68
74
  if (ch === '/')
69
75
  mode = 'text';
70
76
  }
71
- else if (ch === '"') {
72
- mode = 'quote';
77
+ else if ((ch === '"' || ch === '/') && !boundCharacter(query, i, rangeStop)) {
78
+ mode = ch === '"' ? 'quote' : 'regex';
73
79
  }
74
- else if (ch === '/') {
75
- mode = 'regex';
80
+ else if ((ch === '[' || ch === '{') && i >= rangeStop && rangesClose) {
81
+ const { end } = rangeSpan(query, i);
82
+ if (end < 0)
83
+ rangesClose = false;
84
+ else
85
+ rangeStop = end;
76
86
  }
77
87
  else if (ch === '(') {
78
88
  depth++;
@@ -92,6 +102,311 @@ export function balanceQuery(raw) {
92
102
  out += '/';
93
103
  return out + ')'.repeat(depth);
94
104
  }
105
+ /**
106
+ * The caller's query as it sits in `q`: balanced ({@link balanceQuery}) when filter
107
+ * clauses compose with it, otherwise trimmed and sent as written. `''` when nothing
108
+ * of it remains, in which case `q` carries no query part.
109
+ */
110
+ export function queryAsSent(query, withClauses) {
111
+ return withClauses ? balanceQuery(query ?? '') : (query?.trim() ?? '');
112
+ }
113
+ const CONVERSIONS = new Set(['boost', 'fuzzy', 'proximity']);
114
+ /**
115
+ * True when `error` is a value luqum cannot convert. Zenodo answers that with HTTP
116
+ * 500 rather than its plain-text fallback, so it fails with or without filters.
117
+ */
118
+ export const isConversionError = (error) => CONVERSIONS.has(error.problem);
119
+ /** Characters (besides whitespace) that cannot start a term. */
120
+ const TERM_START_EXCLUDED = ':^~(){}[]/"\'+-\\<>';
121
+ /** Characters (besides whitespace) that end a term. */
122
+ const TERM_CONTINUE_EXCLUDED = ':^\\~(){}[]';
123
+ const KEYWORDS = new Map([
124
+ ['AND', 'AND'],
125
+ ['OR', 'OR'],
126
+ ['NOT', 'NOT'],
127
+ ['TO', 'TO'],
128
+ ]);
129
+ const SINGLE_CHAR = new Map([
130
+ ['+', 'PLUS'],
131
+ ['-', 'MINUS'],
132
+ [':', 'COLUMN'],
133
+ ['(', 'LPAREN'],
134
+ [')', 'RPAREN'],
135
+ ['[', 'LBRACKET'],
136
+ ['{', 'LBRACKET'],
137
+ [']', 'RBRACKET'],
138
+ ['}', 'RBRACKET'],
139
+ ]);
140
+ /** Kinds that can open a unary expression. */
141
+ const UNARY_START = new Set([
142
+ 'PLUS',
143
+ 'MINUS',
144
+ 'NOT',
145
+ 'LPAREN',
146
+ 'LBRACKET',
147
+ 'CMP',
148
+ 'TERM',
149
+ 'PHRASE',
150
+ 'REGEX',
151
+ 'TO',
152
+ ]);
153
+ /**
154
+ * A time part inside a term (`2020-01-01T12:30:00`): a `:` right after `T` and two
155
+ * digits, then two digits and an optional `:` with two more. Run sticky on a short
156
+ * window around the `:` ({@link timePartEnd}), never on the whole query.
157
+ */
158
+ const TIME_PART = /(?<=T\p{Nd}{2}):\p{Nd}{2}(?::\p{Nd}{2})?/uy;
159
+ /**
160
+ * End of the time part whose `:` is at `j`, or -1. The window holds the five code
161
+ * units the lookbehind can need (`T` and two astral digits) and the ten the match
162
+ * can span.
163
+ */
164
+ function timePartEnd(q, j) {
165
+ const start = Math.max(0, j - 5);
166
+ TIME_PART.lastIndex = j - start;
167
+ return TIME_PART.test(q.slice(start, j + 11)) ? start + TIME_PART.lastIndex : -1;
168
+ }
169
+ /** Python's `str.isspace()`, which is what Zenodo's parser skips between tokens. */
170
+ function isSpace(code) {
171
+ return ((code >= 0x09 && code <= 0x0d) ||
172
+ (code >= 0x1c && code <= 0x20) ||
173
+ code === 0x85 ||
174
+ code === 0xa0 ||
175
+ code === 0x1680 ||
176
+ (code >= 0x2000 && code <= 0x200a) ||
177
+ code === 0x2028 ||
178
+ code === 0x2029 ||
179
+ code === 0x202f ||
180
+ code === 0x205f ||
181
+ code === 0x3000);
182
+ }
183
+ /** True when a `\` at `i` escapes the next character (anything but a line feed). */
184
+ const escapes = (q, i) => i + 1 < q.length && q[i + 1] !== '\n';
185
+ /** The `"…"` or `/…/` opened at `i`, or why it never closes. */
186
+ function closeDelimited(q, i, delim) {
187
+ for (let j = i + 1; j < q.length; j++) {
188
+ if (q[j] === delim)
189
+ return { kind: delim === '"' ? 'PHRASE' : 'REGEX', start: i, end: j + 1 };
190
+ if (q[j] !== '\\' || j + 1 >= q.length)
191
+ continue;
192
+ if (q[j + 1] === '\n')
193
+ return { kind: 'ILLEGAL', problem: 'escape', start: j, end: j + 1 };
194
+ j++;
195
+ }
196
+ return { kind: 'ILLEGAL', problem: delim === '"' ? 'phrase' : 'regex', start: i, end: q.length };
197
+ }
198
+ /** End of the run of digits and dots starting at `i`. */
199
+ function numberEnd(q, i) {
200
+ let j = i;
201
+ for (let c = q.charCodeAt(j); c === 0x2e || (c >= 0x30 && c <= 0x39); c = q.charCodeAt(j))
202
+ j++;
203
+ return j;
204
+ }
205
+ /**
206
+ * True when luqum converts the digits and dots after the `^` or `~` of `tok`. A
207
+ * boost (`^2`) or a term's fuzziness (`~0.5`) becomes a `Decimal`, so it takes one
208
+ * decimal number: at least one digit and at most one dot (`^.5`, `^1.`). A
209
+ * phrase's proximity (`"x y"~2`) becomes an `int`, so it takes digits alone. A bare
210
+ * `^` or `~` takes luqum's default.
211
+ */
212
+ function converts(q, tok, whole) {
213
+ let dots = 0;
214
+ for (let i = tok.start + 1; i < tok.end; i++)
215
+ if (q.charCodeAt(i) === 0x2e)
216
+ dots++;
217
+ const digits = tok.end - tok.start - 1 - dots;
218
+ return digits + dots === 0 || (digits > 0 && dots <= (whole ? 0 : 1));
219
+ }
220
+ /**
221
+ * Tokens after a `^` or `~` value on which luqum stops before converting it: its
222
+ * lexer fails first, or its parser rejects the token without reducing the value.
223
+ */
224
+ const CONVERSION_STOPS = new Set(['ILLEGAL', 'COLUMN', 'RBRACKET', 'APPROX']);
225
+ /** End of the term starting at `i` (its first character already accepted). */
226
+ function termEnd(q, i) {
227
+ let j = q[i] === '\\' ? i + 2 : i + 1;
228
+ while (j < q.length) {
229
+ const ch = q[j];
230
+ if (ch === '\\') {
231
+ if (!escapes(q, j))
232
+ break;
233
+ j += 2;
234
+ }
235
+ else if (ch === ':') {
236
+ const end = timePartEnd(q, j);
237
+ if (end < 0)
238
+ break;
239
+ j = end;
240
+ }
241
+ else if (isSpace(q.charCodeAt(j)) || TERM_CONTINUE_EXCLUDED.includes(ch)) {
242
+ break;
243
+ }
244
+ else {
245
+ j++;
246
+ }
247
+ }
248
+ return j;
249
+ }
250
+ /** The token at or after `from`, whitespace skipped. Mirrors luqum 1.0.0's lexer rules in their order. */
251
+ function nextToken(q, from) {
252
+ let i = from;
253
+ while (i < q.length && isSpace(q.charCodeAt(i)))
254
+ i++;
255
+ if (i >= q.length)
256
+ return { kind: 'EOF', start: q.length, end: q.length };
257
+ const ch = q[i];
258
+ if (ch === '\\' ? escapes(q, i) : !TERM_START_EXCLUDED.includes(ch)) {
259
+ const end = termEnd(q, i);
260
+ return { kind: (end - i <= 3 && KEYWORDS.get(q.slice(i, end))) || 'TERM', start: i, end };
261
+ }
262
+ const single = SINGLE_CHAR.get(ch);
263
+ if (single)
264
+ return { kind: single, start: i, end: i + 1 };
265
+ switch (ch) {
266
+ case '<':
267
+ case '>':
268
+ return { kind: 'CMP', start: i, end: q[i + 1] === '=' ? i + 2 : i + 1 };
269
+ case '"':
270
+ case '/':
271
+ return closeDelimited(q, i, ch);
272
+ case '~':
273
+ return { kind: 'APPROX', start: i, end: numberEnd(q, i + 1) };
274
+ case '^':
275
+ return { kind: 'BOOST', start: i, end: numberEnd(q, i + 1) };
276
+ case "'":
277
+ return { kind: 'ILLEGAL', problem: 'quote', start: i, end: i + 1 };
278
+ default:
279
+ return { kind: 'ILLEGAL', problem: 'escape', start: i, end: i + 1 };
280
+ }
281
+ }
282
+ /**
283
+ * Checks `query` against the grammar Zenodo parses `q` with (luqum 1.0.0, whose
284
+ * failures Zenodo answers by matching the whole `q` as plain text), returning the
285
+ * first problem in reading order, or `undefined` when it parses:
286
+ *
287
+ * ```text
288
+ * query := expr EOF
289
+ * expr := seq ((AND | OR) seq)*
290
+ * seq := unary+
291
+ * unary := (+ | - | NOT) unary | atom BOOST*
292
+ * atom := ( expr ) | [ bound TO bound ] | (< | <= | > | >=) (TERM | PHRASE)
293
+ * | TERM : unary | TERM APPROX? | PHRASE APPROX? | REGEX | TO
294
+ * bound := -? (TERM | PHRASE)
295
+ * ```
296
+ *
297
+ * One forward pass with no recursion: prefixes and `field:` chains are tail
298
+ * positions, and the only nesting, `( expr )`, needs nothing but a depth count, so
299
+ * any depth the parser accepts is accepted here too.
300
+ *
301
+ * A boost, fuzziness, or proximity value is converted when luqum reduces it, which
302
+ * it does on reading the next token unless that token stops it
303
+ * ({@link CONVERSION_STOPS}); a value it cannot convert is reported there, as
304
+ * `boost`, `fuzzy`, or `proximity`.
305
+ */
306
+ export function querySyntaxError(query) {
307
+ let tok = nextToken(query, 0);
308
+ const next = () => nextToken(query, tok.end);
309
+ const fail = () => {
310
+ if (tok.kind === 'ILLEGAL') {
311
+ return { problem: tok.problem, index: tok.start, token: query.slice(tok.start, tok.end) };
312
+ }
313
+ if (tok.kind === 'EOF')
314
+ return { problem: 'end', index: query.length, token: '' };
315
+ return { problem: 'unexpected', index: tok.start, token: query.slice(tok.start, tok.end) };
316
+ };
317
+ /** Steps past the `^` or `~` value at `tok`; its conversion failure, when luqum gets that far. */
318
+ const convert = (problem) => {
319
+ const value = tok;
320
+ tok = next();
321
+ return CONVERSION_STOPS.has(tok.kind) || converts(query, value, problem === 'proximity')
322
+ ? undefined
323
+ : { problem, index: value.start, token: query.slice(value.start, value.end) };
324
+ };
325
+ /** `-? (TERM | PHRASE)`, a range bound; false (nothing consumed past a `-`) when absent. */
326
+ const bound = () => {
327
+ if (tok.kind === 'MINUS')
328
+ tok = next();
329
+ if (tok.kind !== 'TERM' && tok.kind !== 'PHRASE')
330
+ return false;
331
+ tok = next();
332
+ return true;
333
+ };
334
+ let depth = 0;
335
+ for (;;) {
336
+ // One unary, through its prefixes and `field:` chain to the atom that ends it.
337
+ for (;;) {
338
+ if (tok.kind === 'PLUS' || tok.kind === 'MINUS' || tok.kind === 'NOT') {
339
+ tok = next();
340
+ }
341
+ else if (tok.kind === 'LPAREN') {
342
+ depth++;
343
+ tok = next();
344
+ }
345
+ else if (tok.kind === 'TERM') {
346
+ tok = next();
347
+ if (tok.kind !== 'COLUMN') {
348
+ const failed = tok.kind === 'APPROX' ? convert('fuzzy') : undefined;
349
+ if (failed)
350
+ return failed;
351
+ break;
352
+ }
353
+ tok = next();
354
+ }
355
+ else if (tok.kind === 'PHRASE') {
356
+ tok = next();
357
+ const failed = tok.kind === 'APPROX' ? convert('proximity') : undefined;
358
+ if (failed)
359
+ return failed;
360
+ break;
361
+ }
362
+ else if (tok.kind === 'REGEX' || tok.kind === 'TO') {
363
+ tok = next();
364
+ break;
365
+ }
366
+ else if (tok.kind === 'CMP') {
367
+ tok = next();
368
+ if (tok.kind !== 'TERM' && tok.kind !== 'PHRASE')
369
+ return fail();
370
+ tok = next();
371
+ break;
372
+ }
373
+ else if (tok.kind === 'LBRACKET') {
374
+ tok = next();
375
+ if (!bound() || tok.kind !== 'TO')
376
+ return fail();
377
+ tok = next();
378
+ if (!bound() || tok.kind !== 'RBRACKET')
379
+ return fail();
380
+ tok = next();
381
+ break;
382
+ }
383
+ else {
384
+ return fail();
385
+ }
386
+ }
387
+ // After an atom: its boosts, then each `)` that closes a group (boosts apply to it too).
388
+ for (;;) {
389
+ while (tok.kind === 'BOOST') {
390
+ const failed = convert('boost');
391
+ if (failed)
392
+ return failed;
393
+ }
394
+ if (tok.kind !== 'RPAREN' || depth === 0)
395
+ break;
396
+ depth--;
397
+ tok = next();
398
+ }
399
+ if (tok.kind === 'AND' || tok.kind === 'OR') {
400
+ tok = next();
401
+ }
402
+ else if (tok.kind === 'EOF' && depth === 0) {
403
+ return undefined;
404
+ }
405
+ else if (!UNARY_START.has(tok.kind)) {
406
+ return fail();
407
+ }
408
+ }
409
+ }
95
410
  /** One clause, or several OR-ed inside parentheses. */
96
411
  function anyOf(clauses) {
97
412
  return clauses.length === 1 ? clauses[0] : `(${clauses.join(' OR ')})`;
@@ -137,7 +452,7 @@ export function buildSearch(filters) {
137
452
  if (filters.publishedFrom || filters.publishedTo) {
138
453
  clauses.push(`metadata.publication_date:[${filters.publishedFrom ?? '*'} TO ${filters.publishedTo ?? '*'}]`);
139
454
  }
140
- const query = clauses.length > 0 ? balanceQuery(filters.query ?? '') : filters.query?.trim();
455
+ const query = queryAsSent(filters.query, clauses.length > 0);
141
456
  if (query)
142
457
  clauses.unshift(clauses.length > 0 ? `(${query})` : query);
143
458
  const q = clauses.length > 0 ? clauses.join(' AND ') : undefined;
@@ -161,25 +476,173 @@ export function escapeVocabularyQuery(query) {
161
476
  return query.replace(/[\\/:[\]{}()^~!?]/g, '\\$&');
162
477
  }
163
478
  /**
164
- * True when the query holds an odd number of `/` that are unescaped and outside
165
- * double quotes. Zenodo parses `/` as a regex delimiter and answers an
166
- * unterminated one with HTTP 500.
479
+ * Offset of the `"` in the regex body `q[from, to)` that opens a quoted string the
480
+ * body never closes, or -1. Zenodo's search engine compiles a regex body where `\`
481
+ * escapes the next character, `"…"` is a literal string with no escapes inside,
482
+ * and a `"` within a `[…]` character class is literal.
483
+ */
484
+ function unclosedRegexQuote(q, from, to) {
485
+ for (let i = from; i < to; i++) {
486
+ const ch = q[i];
487
+ if (ch === '\\') {
488
+ i++;
489
+ }
490
+ else if (ch === '"') {
491
+ const close = q.indexOf('"', i + 1);
492
+ if (close === -1 || close >= to)
493
+ return i;
494
+ i = close;
495
+ }
496
+ else if (ch === '[') {
497
+ // A class's first member is literal even when it is `]`.
498
+ let j = q[i + 1] === '^' ? i + 2 : i + 1;
499
+ j += q[j] === '\\' ? 2 : 1;
500
+ while (j < to && q[j] !== ']')
501
+ j += q[j] === '\\' ? 2 : 1;
502
+ i = j;
503
+ }
504
+ }
505
+ return -1;
506
+ }
507
+ /** What Zenodo's search engine skips between the tokens of a range. */
508
+ const isEngineSpace = (ch) => ch === ' ' || ch === '\t' || ch === '\n' || ch === '\r' || ch === ' ';
509
+ /** True when `q[from, to)` ends in an odd run of `\`. */
510
+ function endsInEscape(q, from, to) {
511
+ let j = to;
512
+ while (j > from && q[j - 1] === '\\')
513
+ j--;
514
+ return (to - j) % 2 === 1;
515
+ }
516
+ /**
517
+ * The range opened by the `[` or `{` at `i`, as Zenodo's search engine lexes it. A
518
+ * bound runs to the next space, `]`, or `}`, and a `"` opens a quoted bound only at a
519
+ * bound's start, when that is the longer token; a `"`, `/`, bracket, or `\` inside a
520
+ * bound is literal (`[a"b TO c/d]` runs), so a bound luqum reads past an escaped
521
+ * space, `]`, or `}` ends there, in a `\` the engine cannot unescape
522
+ * (`[a TO b\]]` → 500).
523
+ */
524
+ function rangeSpan(q, i) {
525
+ let escaped;
526
+ let j = i + 1;
527
+ for (;;) {
528
+ while (j < q.length && isEngineSpace(q[j]))
529
+ j++;
530
+ if (j >= q.length)
531
+ return { end: -1, escaped };
532
+ if (q[j] === ']' || q[j] === '}')
533
+ return { end: j + 1, escaped };
534
+ let end = j + 1;
535
+ while (end < q.length && q[end] !== ' ' && q[end] !== ']' && q[end] !== '}')
536
+ end++;
537
+ const quoted = q[j] === '"' ? closeDelimited(q, j, '"') : undefined;
538
+ if (quoted?.kind === 'PHRASE' && quoted.end >= end)
539
+ end = quoted.end;
540
+ else if (!escaped && endsInEscape(q, j, end))
541
+ escaped = [j, end];
542
+ j = end;
543
+ }
544
+ }
545
+ /**
546
+ * True when the `"` or `/` at `i` is a character of a range bound, inside the range
547
+ * ending at `stop`: a `/` always, a `"` unless its phrase closes inside the range.
167
548
  */
168
- export function hasUnpairedSlash(query) {
169
- let inQuotes = false;
170
- let slashes = 0;
549
+ function boundCharacter(q, i, stop) {
550
+ if (i >= stop)
551
+ return false;
552
+ if (q[i] === '/')
553
+ return true;
554
+ const phrase = closeDelimited(q, i, '"');
555
+ return phrase.kind !== 'PHRASE' || phrase.end > stop;
556
+ }
557
+ /** True when only engine whitespace stands between `i` and the query's end or a `)`. */
558
+ function nothingFollows(q, i) {
559
+ let j = i;
560
+ while (j < q.length && isEngineSpace(q[j]))
561
+ j++;
562
+ return j >= q.length || q[j] === ')';
563
+ }
564
+ /** True when luqum's lexer, reading `q` from the start, meets a phrase at `at` it never closes. */
565
+ function luqumLeavesPhraseOpenAt(q, at) {
566
+ let tok = nextToken(q, 0);
567
+ while (tok.start < at && tok.kind !== 'EOF')
568
+ tok = nextToken(q, tok.end);
569
+ return tok.start === at && tok.kind === 'ILLEGAL' && tok.problem === 'phrase';
570
+ }
571
+ /**
572
+ * The first query part Zenodo's search engine cannot run, read as that engine lexes
573
+ * `q` once luqum has parsed it. The engine opens a phrase at every unescaped `"` and a
574
+ * regex at every unescaped `/` outside a phrase, regex, or range, inside a word too,
575
+ * where luqum reads either as part of the word; phrases and regexes are delimited as
576
+ * luqum lexes them ({@link closeDelimited}). It reports:
577
+ *
578
+ * - `regex`: a regex never closed (`climate 10.5281/zenodo.591564`, HTTP 500);
579
+ * - `regex_quote`: a regex whose body opens a quoted string it never closes (`/a"/ b`, HTTP 400);
580
+ * - `word_quote`: a phrase never closed that luqum does not leave open itself
581
+ * (`climate a"b`, HTTP 500; `climate "model` is luqum's own and passes);
582
+ * - `word_span`: when luqum parses the query but the engine's phrases and regexes
583
+ * leave a `(`, `)`, `[`, `]`, `{`, or `}` unmatched, the first of them luqum does not
584
+ * read (`(a"b) c"`, HTTP 500);
585
+ * - `range_escape`: a range bound ending in an unpaired `\`, which the engine cannot
586
+ * unescape ({@link rangeSpan}; `[a TO b\]]`, `[a\ b TO c]`, HTTP 500);
587
+ * - `dangling_not`: a `!`, which the engine reads as NOT inside a word too, with
588
+ * nothing after it but a `)` or the end (`climate!`, `(climate!) model`, HTTP 500).
589
+ */
590
+ export function engineSyntaxError(query) {
591
+ const spans = [];
592
+ let depth = 0;
593
+ let unmatched = false;
171
594
  for (let i = 0; i < query.length; i++) {
172
595
  const ch = query[i];
173
596
  if (ch === '\\') {
174
597
  i++;
175
- continue;
176
598
  }
177
- if (ch === '"')
178
- inQuotes = !inQuotes;
179
- else if (ch === '/' && !inQuotes)
180
- slashes++;
599
+ else if (ch === '[' || ch === '{') {
600
+ const { end, escaped } = rangeSpan(query, i);
601
+ if (end < 0) {
602
+ unmatched = true;
603
+ break;
604
+ }
605
+ if (escaped)
606
+ return { problem: 'range_escape', index: escaped[0], token: query.slice(...escaped) };
607
+ i = end - 1;
608
+ }
609
+ else if (ch === '(') {
610
+ depth++;
611
+ }
612
+ else if (ch === ')' && depth > 0) {
613
+ depth--;
614
+ }
615
+ else if (ch === ')' || ch === ']' || ch === '}') {
616
+ unmatched = true;
617
+ }
618
+ else if (ch === '!' && nothingFollows(query, i + 1)) {
619
+ return { problem: 'dangling_not', index: i, token: '!' };
620
+ }
621
+ else if (ch === '"' || ch === '/') {
622
+ const span = closeDelimited(query, i, ch);
623
+ if (span.kind === 'ILLEGAL') {
624
+ if (span.problem === 'regex')
625
+ return { problem: 'regex', index: i, token: query.slice(i) };
626
+ return span.problem === 'phrase' && !luqumLeavesPhraseOpenAt(query, i)
627
+ ? { problem: 'word_quote', index: i, token: query.slice(i) }
628
+ : undefined;
629
+ }
630
+ if (ch === '/' && unclosedRegexQuote(query, i + 1, span.end - 1) !== -1) {
631
+ return { problem: 'regex_quote', index: i, token: query.slice(i, span.end) };
632
+ }
633
+ spans.push([i, span.end]);
634
+ i = span.end - 1;
635
+ }
636
+ }
637
+ if ((!unmatched && depth === 0) || querySyntaxError(query))
638
+ return undefined;
639
+ const luqumStarts = new Set();
640
+ for (let tok = nextToken(query, 0); tok.kind !== 'EOF'; tok = nextToken(query, tok.end)) {
641
+ if (tok.kind === 'PHRASE' || tok.kind === 'REGEX')
642
+ luqumStarts.add(tok.start);
181
643
  }
182
- return slashes % 2 === 1;
644
+ const moved = spans.find(([start]) => !luqumStarts.has(start));
645
+ return moved && { problem: 'word_span', index: moved[0], token: query.slice(...moved) };
183
646
  }
184
647
  const PARTIAL_DATE = /^(\d{4})(?:-(0[1-9]|1[0-2])(?:-(0[1-9]|[12]\d|3[01]))?)?$/;
185
648
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../../../src/services/zenodo/query-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../../../src/services/zenodo/query-builder.ts"],"names":[],"mappings":"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"}
@@ -31,7 +31,7 @@ export declare function previewMode(key: string, mimetype: string | undefined):
31
31
  export declare function looksLikeText(bytes: Uint8Array, atStart: boolean): boolean;
32
32
  /** True when the key names a ZIP archive by extension or mimetype. */
33
33
  export declare function isZip(key: string, mimetype: string | undefined): boolean;
34
- /** Code-fence language hint for a file key; `''` when none applies. */
34
+ /** Code-fence language hint for a file key; `''` for any extension the table does not list. */
35
35
  export declare function languageHint(key: string): string;
36
36
  /** Result of cutting a byte window into previewable text. */
37
37
  export interface PreviewCut {
@@ -1 +1 @@
1
- {"version":3,"file":"text-preview.d.ts","sourceRoot":"","sources":["../../../src/services/zenodo/text-preview.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqBH,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI/C;AAOD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAOhF;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEtD,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAMlF;AAKD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAY1E;AAED,sEAAsE;AACtE,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAExE;AAuCD,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,6DAA6D;AAC7D,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,MAAM,EAAE,OAAO,CAAC;IAChB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAeD;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,GAClD,UAAU,CAaZ"}
1
+ {"version":3,"file":"text-preview.d.ts","sourceRoot":"","sources":["../../../src/services/zenodo/text-preview.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqBH,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI/C;AAOD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAOhF;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEtD,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAMlF;AAKD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAY1E;AAED,sEAAsE;AACtE,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAExE;AAuCD,+FAA+F;AAC/F,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,6DAA6D;AAC7D,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,MAAM,EAAE,OAAO,CAAC;IAChB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAeD;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,GAClD,UAAU,CAaZ"}