@cyanheads/zenodo-mcp-server 0.1.1

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 (97) hide show
  1. package/AGENTS.md +435 -0
  2. package/CLAUDE.md +435 -0
  3. package/Dockerfile +140 -0
  4. package/LICENSE +201 -0
  5. package/README.md +292 -0
  6. package/changelog/0.1.x/0.1.1.md +21 -0
  7. package/changelog/template.md +151 -0
  8. package/dist/config/server-config.d.ts +13 -0
  9. package/dist/config/server-config.d.ts.map +1 -0
  10. package/dist/config/server-config.js +19 -0
  11. package/dist/config/server-config.js.map +1 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +21 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/mcp-server/tools/definitions/get-record.tool.d.ts +186 -0
  17. package/dist/mcp-server/tools/definitions/get-record.tool.d.ts.map +1 -0
  18. package/dist/mcp-server/tools/definitions/get-record.tool.js +568 -0
  19. package/dist/mcp-server/tools/definitions/get-record.tool.js.map +1 -0
  20. package/dist/mcp-server/tools/definitions/index.d.ts +721 -0
  21. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
  22. package/dist/mcp-server/tools/definitions/index.js +21 -0
  23. package/dist/mcp-server/tools/definitions/index.js.map +1 -0
  24. package/dist/mcp-server/tools/definitions/list-files.tool.d.ts +108 -0
  25. package/dist/mcp-server/tools/definitions/list-files.tool.d.ts.map +1 -0
  26. package/dist/mcp-server/tools/definitions/list-files.tool.js +348 -0
  27. package/dist/mcp-server/tools/definitions/list-files.tool.js.map +1 -0
  28. package/dist/mcp-server/tools/definitions/list-versions.tool.d.ts +92 -0
  29. package/dist/mcp-server/tools/definitions/list-versions.tool.d.ts.map +1 -0
  30. package/dist/mcp-server/tools/definitions/list-versions.tool.js +268 -0
  31. package/dist/mcp-server/tools/definitions/list-versions.tool.js.map +1 -0
  32. package/dist/mcp-server/tools/definitions/lookup-vocabulary.tool.d.ts +99 -0
  33. package/dist/mcp-server/tools/definitions/lookup-vocabulary.tool.d.ts.map +1 -0
  34. package/dist/mcp-server/tools/definitions/lookup-vocabulary.tool.js +324 -0
  35. package/dist/mcp-server/tools/definitions/lookup-vocabulary.tool.js.map +1 -0
  36. package/dist/mcp-server/tools/definitions/read-file.tool.d.ts +104 -0
  37. package/dist/mcp-server/tools/definitions/read-file.tool.d.ts.map +1 -0
  38. package/dist/mcp-server/tools/definitions/read-file.tool.js +370 -0
  39. package/dist/mcp-server/tools/definitions/read-file.tool.js.map +1 -0
  40. package/dist/mcp-server/tools/definitions/search-records.tool.d.ts +181 -0
  41. package/dist/mcp-server/tools/definitions/search-records.tool.d.ts.map +1 -0
  42. package/dist/mcp-server/tools/definitions/search-records.tool.js +531 -0
  43. package/dist/mcp-server/tools/definitions/search-records.tool.js.map +1 -0
  44. package/dist/mcp-server/tools/record-miss.d.ts +37 -0
  45. package/dist/mcp-server/tools/record-miss.d.ts.map +1 -0
  46. package/dist/mcp-server/tools/record-miss.js +51 -0
  47. package/dist/mcp-server/tools/record-miss.js.map +1 -0
  48. package/dist/mcp-server/tools/render.d.ts +31 -0
  49. package/dist/mcp-server/tools/render.d.ts.map +1 -0
  50. package/dist/mcp-server/tools/render.js +53 -0
  51. package/dist/mcp-server/tools/render.js.map +1 -0
  52. package/dist/mcp-server/tools/schema-helpers.d.ts +20 -0
  53. package/dist/mcp-server/tools/schema-helpers.d.ts.map +1 -0
  54. package/dist/mcp-server/tools/schema-helpers.js +44 -0
  55. package/dist/mcp-server/tools/schema-helpers.js.map +1 -0
  56. package/dist/services/zenodo/cache.d.ts +25 -0
  57. package/dist/services/zenodo/cache.d.ts.map +1 -0
  58. package/dist/services/zenodo/cache.js +58 -0
  59. package/dist/services/zenodo/cache.js.map +1 -0
  60. package/dist/services/zenodo/html-to-text.d.ts +23 -0
  61. package/dist/services/zenodo/html-to-text.d.ts.map +1 -0
  62. package/dist/services/zenodo/html-to-text.js +148 -0
  63. package/dist/services/zenodo/html-to-text.js.map +1 -0
  64. package/dist/services/zenodo/http.d.ts +73 -0
  65. package/dist/services/zenodo/http.d.ts.map +1 -0
  66. package/dist/services/zenodo/http.js +378 -0
  67. package/dist/services/zenodo/http.js.map +1 -0
  68. package/dist/services/zenodo/identifiers.d.ts +104 -0
  69. package/dist/services/zenodo/identifiers.d.ts.map +1 -0
  70. package/dist/services/zenodo/identifiers.js +261 -0
  71. package/dist/services/zenodo/identifiers.js.map +1 -0
  72. package/dist/services/zenodo/normalize.d.ts +29 -0
  73. package/dist/services/zenodo/normalize.d.ts.map +1 -0
  74. package/dist/services/zenodo/normalize.js +324 -0
  75. package/dist/services/zenodo/normalize.js.map +1 -0
  76. package/dist/services/zenodo/query-builder.d.ts +87 -0
  77. package/dist/services/zenodo/query-builder.d.ts.map +1 -0
  78. package/dist/services/zenodo/query-builder.js +221 -0
  79. package/dist/services/zenodo/query-builder.js.map +1 -0
  80. package/dist/services/zenodo/resource-types.d.ts +34 -0
  81. package/dist/services/zenodo/resource-types.d.ts.map +1 -0
  82. package/dist/services/zenodo/resource-types.js +97 -0
  83. package/dist/services/zenodo/resource-types.js.map +1 -0
  84. package/dist/services/zenodo/text-preview.d.ts +56 -0
  85. package/dist/services/zenodo/text-preview.d.ts.map +1 -0
  86. package/dist/services/zenodo/text-preview.js +151 -0
  87. package/dist/services/zenodo/text-preview.js.map +1 -0
  88. package/dist/services/zenodo/types.d.ts +517 -0
  89. package/dist/services/zenodo/types.d.ts.map +1 -0
  90. package/dist/services/zenodo/types.js +8 -0
  91. package/dist/services/zenodo/types.js.map +1 -0
  92. package/dist/services/zenodo/zenodo-service.d.ts +98 -0
  93. package/dist/services/zenodo/zenodo-service.d.ts.map +1 -0
  94. package/dist/services/zenodo/zenodo-service.js +392 -0
  95. package/dist/services/zenodo/zenodo-service.js.map +1 -0
  96. package/package.json +110 -0
  97. package/server.json +113 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../src/services/zenodo/normalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * @fileoverview Composes the Zenodo search request from validated filters. Only
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.
6
+ * @module services/zenodo/query-builder
7
+ */
8
+ import type { AwardRef } from './identifiers.js';
9
+ /** Sort options Zenodo's record search accepts. */
10
+ export declare const SEARCH_SORTS: readonly ['bestmatch', 'newest', 'oldest', 'mostviewed', 'mostdownloaded', 'updated-desc', 'updated-asc'];
11
+ export type SearchSort = (typeof SEARCH_SORTS)[number];
12
+ /** Access-status filter values. */
13
+ export declare const ACCESS_STATUSES: readonly ['open', 'restricted', 'embargoed', 'metadata-only'];
14
+ export type AccessStatus = (typeof ACCESS_STATUSES)[number];
15
+ /** Filters in their resolved, upstream-ready form. */
16
+ export interface SearchFilters {
17
+ accessStatus?: AccessStatus;
18
+ allVersions: boolean;
19
+ award?: AwardRef;
20
+ /** Canonical community UUID. */
21
+ communityId?: string;
22
+ creatorOrcid?: string;
23
+ fileTypes?: string[];
24
+ /** Funder ROR id. */
25
+ funderRor?: string;
26
+ license?: string;
27
+ page: number;
28
+ /** Expanded full date, `YYYY-MM-DD`. */
29
+ publishedFrom?: string;
30
+ /** Expanded full date, `YYYY-MM-DD`. */
31
+ publishedTo?: string;
32
+ query?: string;
33
+ /** Resource type ids (`dataset`, `publication-article`), OR-ed. */
34
+ resourceTypes?: string[];
35
+ size: number;
36
+ sort: SearchSort;
37
+ }
38
+ /** A built search request: the composed `q` (when any) and the ordered param list. */
39
+ export interface BuiltSearch {
40
+ params: [string, string][];
41
+ q?: string;
42
+ }
43
+ /** Wraps a value in double quotes, escaping `\` and `"`. */
44
+ export declare function quoteValue(value: string): string;
45
+ /**
46
+ * Closes whatever a caller's query leaves open, so it stays inside the parentheses
47
+ * it is composed in: a leading or trailing boolean operator is dropped, a dangling
48
+ * `\` is completed as `\\`, an unterminated quote or `/…/` regex is closed, a `)`
49
+ * with no open group is escaped as `\)`, and each group left open is closed.
50
+ * Zenodo matches a query it cannot parse as plain text, which turns the filter
51
+ * clauses into optional terms (an unterminated quote matched the whole corpus
52
+ * instead of the filtered set), and a stray `)` lets the query widen them. A
53
+ * well-formed query comes back unchanged.
54
+ */
55
+ export declare function balanceQuery(raw: string): string;
56
+ /**
57
+ * Composes `q` and the allowlisted params from resolved filters. Resource type, file
58
+ * type, and access status compose into `q` rather than riding Zenodo's
59
+ * `resource_type` / `file_type` / `access_status` params: those params are
60
+ * post-filters, applied after the aggregations are computed, so the facet counts
61
+ * would ignore them and contradict `total`. As `q` clauses they narrow hits and
62
+ * facets alike, with the same totals. The query is balanced ({@link balanceQuery})
63
+ * before it is grouped with them, so it cannot drop or widen a filter clause.
64
+ */
65
+ export declare function buildSearch(filters: SearchFilters): BuiltSearch;
66
+ /**
67
+ * Escapes the query-syntax characters that make Zenodo's vocabulary endpoints
68
+ * answer HTTP 500 (`10.13039/100000002`, `a:b:c`), so a name, acronym, or DOI
69
+ * typed as a vocabulary query searches as text. Quotes, `*`, `+`, and `-` keep
70
+ * their meaning.
71
+ */
72
+ export declare function escapeVocabularyQuery(query: string): string;
73
+ /**
74
+ * True when the query holds an odd number of `/` that are unescaped and outside
75
+ * double quotes. Zenodo parses `/` as a regex delimiter and answers an
76
+ * unterminated one with HTTP 500.
77
+ */
78
+ export declare function hasUnpairedSlash(query: string): boolean;
79
+ /** True when `value` is `YYYY`, `YYYY-MM`, or a real calendar date `YYYY-MM-DD`. */
80
+ export declare function isValidPartialDate(value: string): boolean;
81
+ /**
82
+ * Expands a partial date to a full day: `from` takes the first day of the year or
83
+ * month, `to` the last. Upstream compares partial dates as instants, so
84
+ * `[2020 TO 2020]` would match only records dated exactly `2020`.
85
+ */
86
+ export declare function expandPartialDate(value: string, side: 'from' | 'to'): string;
87
+ //# sourceMappingURL=query-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../../../src/services/zenodo/query-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGjD,mDAAmD;AACnD,eAAO,MAAM,YAAY,YACvB,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,aAAa,CACL,CAAC;AACX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,mCAAmC;AACnC,eAAO,MAAM,eAAe,YAAI,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,CAAU,CAAC;AAC7F,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,sDAAsD;AACtD,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,gCAAgC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,sFAAsF;AACtF,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC3B,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,4DAA4D;AAC5D,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAkBD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAkChD;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,WAAW,CAyC/D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAavD;AAcD,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAKzD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAU5E"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * @fileoverview Composes the Zenodo search request from validated filters. Only
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.
6
+ * @module services/zenodo/query-builder
7
+ */
8
+ import { getResourceType } from './resource-types.js';
9
+ /** Sort options Zenodo's record search accepts. */
10
+ export const SEARCH_SORTS = [
11
+ 'bestmatch',
12
+ 'newest',
13
+ 'oldest',
14
+ 'mostviewed',
15
+ 'mostdownloaded',
16
+ 'updated-desc',
17
+ 'updated-asc',
18
+ ];
19
+ /** Access-status filter values. */
20
+ export const ACCESS_STATUSES = ['open', 'restricted', 'embargoed', 'metadata-only'];
21
+ /** Wraps a value in double quotes, escaping `\` and `"`. */
22
+ export function quoteValue(value) {
23
+ return `"${value.replaceAll('\\', '\\\\').replaceAll('"', '\\"')}"`;
24
+ }
25
+ /** Operator words that leave a query's first or last word with nothing on one side. */
26
+ const LEADING_OPERATORS = new Set(['AND', 'OR', '&&', '||']);
27
+ const TRAILING_OPERATORS = new Set([...LEADING_OPERATORS, 'NOT', '+', '-', '!']);
28
+ /** `query` without operator words at its start or end, spacing inside it kept. */
29
+ function trimOperators(query) {
30
+ const words = [...query.matchAll(/\S+/g)];
31
+ let first = 0;
32
+ let last = words.length - 1;
33
+ while (first <= last && LEADING_OPERATORS.has(words[first]?.[0] ?? ''))
34
+ first++;
35
+ while (last >= first && TRAILING_OPERATORS.has(words[last]?.[0] ?? ''))
36
+ last--;
37
+ const head = words[first];
38
+ const tail = words[last];
39
+ return head && tail && first <= last ? query.slice(head.index, tail.index + tail[0].length) : '';
40
+ }
41
+ /**
42
+ * Closes whatever a caller's query leaves open, so it stays inside the parentheses
43
+ * it is composed in: a leading or trailing boolean operator is dropped, a dangling
44
+ * `\` is completed as `\\`, an unterminated quote or `/…/` regex is closed, a `)`
45
+ * with no open group is escaped as `\)`, and each group left open is closed.
46
+ * Zenodo matches a query it cannot parse as plain text, which turns the filter
47
+ * 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.
50
+ */
51
+ export function balanceQuery(raw) {
52
+ const query = trimOperators(raw);
53
+ let out = '';
54
+ let depth = 0;
55
+ let mode = 'text';
56
+ for (let i = 0; i < query.length; i++) {
57
+ const ch = query[i];
58
+ if (ch === '\\') {
59
+ out += i + 1 < query.length ? query.slice(i, i + 2) : '\\\\';
60
+ i++;
61
+ continue;
62
+ }
63
+ if (mode === 'quote') {
64
+ if (ch === '"')
65
+ mode = 'text';
66
+ }
67
+ else if (mode === 'regex') {
68
+ if (ch === '/')
69
+ mode = 'text';
70
+ }
71
+ else if (ch === '"') {
72
+ mode = 'quote';
73
+ }
74
+ else if (ch === '/') {
75
+ mode = 'regex';
76
+ }
77
+ else if (ch === '(') {
78
+ depth++;
79
+ }
80
+ else if (ch === ')') {
81
+ if (depth === 0) {
82
+ out += '\\)';
83
+ continue;
84
+ }
85
+ depth--;
86
+ }
87
+ out += ch;
88
+ }
89
+ if (mode === 'quote')
90
+ out += '"';
91
+ if (mode === 'regex')
92
+ out += '/';
93
+ return out + ')'.repeat(depth);
94
+ }
95
+ /** One clause, or several OR-ed inside parentheses. */
96
+ function anyOf(clauses) {
97
+ return clauses.length === 1 ? clauses[0] : `(${clauses.join(' OR ')})`;
98
+ }
99
+ /**
100
+ * The `q` clause for one resource type id. A top-level type matches on
101
+ * `props.type`, which covers its subtypes (`image` includes `image-photo`); a
102
+ * subtype matches on its own id.
103
+ */
104
+ function resourceTypeClause(id) {
105
+ return getResourceType(id)?.parentType
106
+ ? `metadata.resource_type.id:${quoteValue(id)}`
107
+ : `metadata.resource_type.props.type:${quoteValue(id)}`;
108
+ }
109
+ /**
110
+ * Composes `q` and the allowlisted params from resolved filters. Resource type, file
111
+ * type, and access status compose into `q` rather than riding Zenodo's
112
+ * `resource_type` / `file_type` / `access_status` params: those params are
113
+ * post-filters, applied after the aggregations are computed, so the facet counts
114
+ * would ignore them and contradict `total`. As `q` clauses they narrow hits and
115
+ * facets alike, with the same totals. The query is balanced ({@link balanceQuery})
116
+ * before it is grouped with them, so it cannot drop or widen a filter clause.
117
+ */
118
+ export function buildSearch(filters) {
119
+ const clauses = [];
120
+ if (filters.funderRor)
121
+ clauses.push(`metadata.funding.funder.id:${quoteValue(filters.funderRor)}`);
122
+ if (filters.award) {
123
+ clauses.push(`metadata.funding.award.${filters.award.field}:${quoteValue(filters.award.value)}`);
124
+ }
125
+ if (filters.creatorOrcid) {
126
+ clauses.push(`metadata.creators.person_or_org.identifiers.identifier:${quoteValue(filters.creatorOrcid)}`);
127
+ }
128
+ if (filters.license)
129
+ clauses.push(`metadata.rights.id:${quoteValue(filters.license)}`);
130
+ if (filters.resourceTypes?.length)
131
+ clauses.push(anyOf(filters.resourceTypes.map(resourceTypeClause)));
132
+ if (filters.fileTypes?.length) {
133
+ clauses.push(anyOf(filters.fileTypes.map((t) => `files.types:${quoteValue(t)}`)));
134
+ }
135
+ if (filters.accessStatus)
136
+ clauses.push(`access.status:${quoteValue(filters.accessStatus)}`);
137
+ if (filters.publishedFrom || filters.publishedTo) {
138
+ clauses.push(`metadata.publication_date:[${filters.publishedFrom ?? '*'} TO ${filters.publishedTo ?? '*'}]`);
139
+ }
140
+ const query = clauses.length > 0 ? balanceQuery(filters.query ?? '') : filters.query?.trim();
141
+ if (query)
142
+ clauses.unshift(clauses.length > 0 ? `(${query})` : query);
143
+ const q = clauses.length > 0 ? clauses.join(' AND ') : undefined;
144
+ const params = [];
145
+ if (q)
146
+ params.push(['q', q]);
147
+ if (filters.communityId)
148
+ params.push(['communities', filters.communityId]);
149
+ if (filters.allVersions)
150
+ params.push(['all_versions', 'true']);
151
+ params.push(['sort', filters.sort], ['page', String(filters.page)], ['size', String(filters.size)]);
152
+ return q ? { q, params } : { params };
153
+ }
154
+ /**
155
+ * Escapes the query-syntax characters that make Zenodo's vocabulary endpoints
156
+ * answer HTTP 500 (`10.13039/100000002`, `a:b:c`), so a name, acronym, or DOI
157
+ * typed as a vocabulary query searches as text. Quotes, `*`, `+`, and `-` keep
158
+ * their meaning.
159
+ */
160
+ export function escapeVocabularyQuery(query) {
161
+ return query.replace(/[\\/:[\]{}()^~!?]/g, '\\$&');
162
+ }
163
+ /**
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.
167
+ */
168
+ export function hasUnpairedSlash(query) {
169
+ let inQuotes = false;
170
+ let slashes = 0;
171
+ for (let i = 0; i < query.length; i++) {
172
+ const ch = query[i];
173
+ if (ch === '\\') {
174
+ i++;
175
+ continue;
176
+ }
177
+ if (ch === '"')
178
+ inQuotes = !inQuotes;
179
+ else if (ch === '/' && !inQuotes)
180
+ slashes++;
181
+ }
182
+ return slashes % 2 === 1;
183
+ }
184
+ const PARTIAL_DATE = /^(\d{4})(?:-(0[1-9]|1[0-2])(?:-(0[1-9]|[12]\d|3[01]))?)?$/;
185
+ /**
186
+ * Days in a month (1-based), leap years included. `setUTCFullYear` takes the year
187
+ * literally; `Date.UTC` would map years 0–99 to 1900–1999.
188
+ */
189
+ function daysInMonth(year, month) {
190
+ const date = new Date(0);
191
+ date.setUTCFullYear(year, month, 0);
192
+ return date.getUTCDate();
193
+ }
194
+ /** True when `value` is `YYYY`, `YYYY-MM`, or a real calendar date `YYYY-MM-DD`. */
195
+ export function isValidPartialDate(value) {
196
+ const m = PARTIAL_DATE.exec(value);
197
+ if (!m)
198
+ return false;
199
+ if (!m[3])
200
+ return true;
201
+ return Number(m[3]) <= daysInMonth(Number(m[1]), Number(m[2]));
202
+ }
203
+ /**
204
+ * Expands a partial date to a full day: `from` takes the first day of the year or
205
+ * month, `to` the last. Upstream compares partial dates as instants, so
206
+ * `[2020 TO 2020]` would match only records dated exactly `2020`.
207
+ */
208
+ export function expandPartialDate(value, side) {
209
+ const m = PARTIAL_DATE.exec(value);
210
+ if (!m?.[1])
211
+ return value;
212
+ const year = m[1];
213
+ if (m[3] && m[2])
214
+ return value;
215
+ if (m[2]) {
216
+ const day = side === 'from' ? 1 : daysInMonth(Number(year), Number(m[2]));
217
+ return `${year}-${m[2]}-${String(day).padStart(2, '0')}`;
218
+ }
219
+ return side === 'from' ? `${year}-01-01` : `${year}-12-31`;
220
+ }
221
+ //# sourceMappingURL=query-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../../../src/services/zenodo/query-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @fileoverview Static table of Zenodo's 43 resource types (the entries of
3
+ * `/api/vocabularies/resourcetypes`, verified 2026-09-23). Source of the search
4
+ * `resource_type` enum, of the parent type a subtype's search clause needs, and of
5
+ * the `resource_types` vocabulary lookup.
6
+ * @module services/zenodo/resource-types
7
+ */
8
+ /** One resource type. `searchValue` is Zenodo's own spelling of it (`<type>::<id>` for a subtype). */
9
+ export interface ResourceType {
10
+ id: string;
11
+ label: string;
12
+ /** Parent type id for a subtype; absent for a top-level type. */
13
+ parentType?: string;
14
+ searchValue: string;
15
+ }
16
+ /** All 43 resource types, in id order. */
17
+ export declare const RESOURCE_TYPES: readonly ResourceType[];
18
+ /** The 43 ids as a non-empty tuple, for `z.enum`. */
19
+ export declare const RESOURCE_TYPE_IDS: [string, ...string[]];
20
+ /** Looks a resource type up by id. */
21
+ export declare function getResourceType(id: string): ResourceType | undefined;
22
+ /**
23
+ * Resolves a resource type as a caller may write it to its id: any case, and the
24
+ * `<type>::<id>` form Zenodo spells a subtype with (`publication::publication-article`
25
+ * → `publication-article`) when the prefix is that subtype's parent. Returns
26
+ * `undefined` when the value names no resource type.
27
+ */
28
+ export declare function resolveResourceTypeId(raw: string): string | undefined;
29
+ /**
30
+ * Filters the table by strict token match over id and label: every query token
31
+ * must appear. An empty query returns the whole table.
32
+ */
33
+ export declare function filterResourceTypes(query: string | undefined): ResourceType[];
34
+ //# sourceMappingURL=resource-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-types.d.ts","sourceRoot":"","sources":["../../../src/services/zenodo/resource-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,sGAAsG;AACtG,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAiDD,0CAA0C;AAC1C,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EAIjD,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,iBAAiB,EAAsC,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;AAI1F,sCAAsC;AACtC,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMrE;AASD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,EAAE,CAO7E"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * @fileoverview Static table of Zenodo's 43 resource types (the entries of
3
+ * `/api/vocabularies/resourcetypes`, verified 2026-09-23). Source of the search
4
+ * `resource_type` enum, of the parent type a subtype's search clause needs, and of
5
+ * the `resource_types` vocabulary lookup.
6
+ * @module services/zenodo/resource-types
7
+ */
8
+ /** `[id, label]` for top-level types, `[id, label, parent]` for subtypes. */
9
+ const ENTRIES = [
10
+ ['dataset', 'Dataset'],
11
+ ['event', 'Event'],
12
+ ['image', 'Image'],
13
+ ['image-diagram', 'Diagram', 'image'],
14
+ ['image-drawing', 'Drawing', 'image'],
15
+ ['image-figure', 'Figure', 'image'],
16
+ ['image-other', 'Other', 'image'],
17
+ ['image-photo', 'Photo', 'image'],
18
+ ['image-plot', 'Plot', 'image'],
19
+ ['lesson', 'Lesson'],
20
+ ['model', 'Model'],
21
+ ['other', 'Other'],
22
+ ['physicalobject', 'Physical object'],
23
+ ['poster', 'Poster'],
24
+ ['presentation', 'Presentation'],
25
+ ['publication', 'Publication'],
26
+ ['publication-annotationcollection', 'Annotation collection', 'publication'],
27
+ ['publication-article', 'Journal article', 'publication'],
28
+ ['publication-book', 'Book', 'publication'],
29
+ ['publication-conferencepaper', 'Conference paper', 'publication'],
30
+ ['publication-conferenceproceeding', 'Conference proceeding', 'publication'],
31
+ ['publication-datamanagementplan', 'Output management plan', 'publication'],
32
+ ['publication-datapaper', 'Data paper', 'publication'],
33
+ ['publication-deliverable', 'Project deliverable', 'publication'],
34
+ ['publication-dissertation', 'Thesis', 'publication'],
35
+ ['publication-journal', 'Journal', 'publication'],
36
+ ['publication-milestone', 'Project milestone', 'publication'],
37
+ ['publication-other', 'Other', 'publication'],
38
+ ['publication-patent', 'Patent', 'publication'],
39
+ ['publication-peerreview', 'Peer review', 'publication'],
40
+ ['publication-preprint', 'Preprint', 'publication'],
41
+ ['publication-proposal', 'Proposal', 'publication'],
42
+ ['publication-report', 'Report', 'publication'],
43
+ ['publication-section', 'Book chapter', 'publication'],
44
+ ['publication-softwaredocumentation', 'Software documentation', 'publication'],
45
+ ['publication-standard', 'Standard', 'publication'],
46
+ ['publication-taxonomictreatment', 'Taxonomic treatment', 'publication'],
47
+ ['publication-technicalnote', 'Technical note', 'publication'],
48
+ ['publication-workingpaper', 'Working paper', 'publication'],
49
+ ['software', 'Software'],
50
+ ['software-computationalnotebook', 'Computational notebook', 'software'],
51
+ ['video', 'Video/Audio'],
52
+ ['workflow', 'Workflow'],
53
+ ];
54
+ /** All 43 resource types, in id order. */
55
+ export const RESOURCE_TYPES = ENTRIES.map(([id, label, parentType]) => parentType
56
+ ? { id, label, parentType, searchValue: `${parentType}::${id}` }
57
+ : { id, label, searchValue: id });
58
+ /** The 43 ids as a non-empty tuple, for `z.enum`. */
59
+ export const RESOURCE_TYPE_IDS = RESOURCE_TYPES.map((t) => t.id);
60
+ const BY_ID = new Map(RESOURCE_TYPES.map((t) => [t.id, t]));
61
+ /** Looks a resource type up by id. */
62
+ export function getResourceType(id) {
63
+ return BY_ID.get(id);
64
+ }
65
+ /**
66
+ * Resolves a resource type as a caller may write it to its id: any case, and the
67
+ * `<type>::<id>` form Zenodo spells a subtype with (`publication::publication-article`
68
+ * → `publication-article`) when the prefix is that subtype's parent. Returns
69
+ * `undefined` when the value names no resource type.
70
+ */
71
+ export function resolveResourceTypeId(raw) {
72
+ const value = raw.trim().toLowerCase();
73
+ const sep = value.indexOf('::');
74
+ if (sep === -1)
75
+ return BY_ID.has(value) ? value : undefined;
76
+ const type = BY_ID.get(value.slice(sep + 2));
77
+ return type?.parentType === value.slice(0, sep) ? type.id : undefined;
78
+ }
79
+ const normalize = (s) => s
80
+ .toLowerCase()
81
+ .normalize('NFKD')
82
+ .replace(/[\u0300-\u036f]/g, '')
83
+ .replace(/[^a-z0-9\s]/g, ' ');
84
+ /**
85
+ * Filters the table by strict token match over id and label: every query token
86
+ * must appear. An empty query returns the whole table.
87
+ */
88
+ export function filterResourceTypes(query) {
89
+ const tokens = query ? normalize(query).split(/\s+/).filter(Boolean) : [];
90
+ if (tokens.length === 0)
91
+ return [...RESOURCE_TYPES];
92
+ return RESOURCE_TYPES.filter((t) => {
93
+ const hay = normalize(`${t.id} ${t.label}`);
94
+ return tokens.every((tok) => hay.includes(tok));
95
+ });
96
+ }
97
+ //# sourceMappingURL=resource-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-types.js","sourceRoot":"","sources":["../../../src/services/zenodo/resource-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @fileoverview Text-preview rules for file reads: which files are previewable,
3
+ * which are read and sniffed, the fence language hint, and the byte cut that keeps
4
+ * continuation windows on line or character boundaries.
5
+ * @module services/zenodo/text-preview
6
+ */
7
+ /** Lowercased extension of the last path segment, without the dot; `''` when none. */
8
+ export declare function extensionOf(key: string): string;
9
+ /**
10
+ * True when a file is worth previewing as text: a `text/*` mimetype, one of the
11
+ * listed structured-text mimetypes, or a known text extension (CITATION.cff
12
+ * arrives as `application/octet-stream`, so the extension list is needed).
13
+ */
14
+ export declare function isPreviewable(key: string, mimetype: string | undefined): boolean;
15
+ /**
16
+ * How a read treats a file before fetching it. `text`: previewable by mimetype or
17
+ * extension. `sniff`: an extensionless file Zenodo types `application/octet-stream`
18
+ * (or not at all) — LICENSE, COPYING, Makefile, Dockerfile, README — whose content
19
+ * decides ({@link looksLikeText}). `binary`: anything else, refused unread.
20
+ */
21
+ export type PreviewMode = 'text' | 'sniff' | 'binary';
22
+ /** The {@link PreviewMode} of a file or ZIP member. */
23
+ export declare function previewMode(key: string, mimetype: string | undefined): PreviewMode;
24
+ /**
25
+ * True when the head of a read window is UTF-8 text: its first {@link SNIFF_BYTES}
26
+ * bytes decode without error. A sequence cut by either edge of the window is
27
+ * allowed — at a positive offset the window may start mid-character, and the head
28
+ * ends wherever the sniff length falls. NUL bytes are checked separately
29
+ * ({@link cutPreview}).
30
+ */
31
+ export declare function looksLikeText(bytes: Uint8Array, atStart: boolean): boolean;
32
+ /** True when the key names a ZIP archive by extension or mimetype. */
33
+ export declare function isZip(key: string, mimetype: string | undefined): boolean;
34
+ /** Code-fence language hint for a file key; `''` when none applies. */
35
+ export declare function languageHint(key: string): string;
36
+ /** Result of cutting a byte window into previewable text. */
37
+ export interface PreviewCut {
38
+ /** True when the buffer holds a NUL byte — the file is binary, not text. */
39
+ binary: boolean;
40
+ /** Exact number of bytes kept (BOM included when one was dropped from the text). */
41
+ bytesKept: number;
42
+ /** Count of U+FFFD characters in the decoded text. */
43
+ replacementChars: number;
44
+ text: string;
45
+ }
46
+ /**
47
+ * Cuts a window of bytes for display. When more bytes remain past the window, the
48
+ * cut lands after the last `\n`, or — with no newline — after the last complete
49
+ * UTF-8 sequence. A NUL byte marks the buffer binary. A leading UTF-8 BOM is
50
+ * dropped from the text when the window starts at offset 0.
51
+ */
52
+ export declare function cutPreview(bytes: Uint8Array, options: {
53
+ atStart: boolean;
54
+ moreRemains: boolean;
55
+ }): PreviewCut;
56
+ //# sourceMappingURL=text-preview.d.ts.map
@@ -0,0 +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"}