@galaxy-tool-util/search 1.10.1 → 1.12.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/dist/client/toolshed.d.ts.map +1 -1
- package/dist/client/toolshed.js +12 -8
- package/dist/client/toolshed.js.map +1 -1
- package/dist/tool-search.d.ts +17 -2
- package/dist/tool-search.d.ts.map +1 -1
- package/dist/tool-search.js +63 -17
- package/dist/tool-search.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolshed.d.ts","sourceRoot":"","sources":["../../src/client/toolshed.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAKjF,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"toolshed.d.ts","sourceRoot":"","sources":["../../src/client/toolshed.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAKjF,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CA0DvC;AAED;;;GAGG;AACH,wBAAuB,sBAAsB,CAC3C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,kBAAuB,GAC5B,cAAc,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAS1D"}
|
package/dist/client/toolshed.js
CHANGED
|
@@ -29,14 +29,18 @@ export async function searchTools(toolshedUrl, query, opts = {}) {
|
|
|
29
29
|
throw new ToolFetchError(`Tool Shed search request to ${url} failed: ${err.message}`, url);
|
|
30
30
|
}
|
|
31
31
|
if (response.status === 404) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
32
|
+
const body = await response.text().catch(() => "");
|
|
33
|
+
const page = opts.page ?? 1;
|
|
34
|
+
if (page > 1 && body.includes("ObjectNotFound")) {
|
|
35
|
+
return {
|
|
36
|
+
total_results: 0,
|
|
37
|
+
page,
|
|
38
|
+
page_size: opts.pageSize ?? 0,
|
|
39
|
+
hostname: toolshedUrl,
|
|
40
|
+
hits: [],
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
throw new ToolFetchError(`Tool Shed search request to ${url} failed: 404 ${body.slice(0, 200)}`, url, response.status);
|
|
40
44
|
}
|
|
41
45
|
if (!response.ok) {
|
|
42
46
|
const body = await response.text().catch(() => "");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolshed.js","sourceRoot":"","sources":["../../src/client/toolshed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAQlC;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,WAAmB,EACnB,KAAa,EACb,OAA2B,EAAE;IAE7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACjD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;QAAE,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEhF,MAAM,GAAG,GAAG,GAAG,WAAW,cAAc,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC5D,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;YAC5B,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;YACvC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,kBAAkB,CAAC;SAChD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,cAAc,CACtB,+BAA+B,GAAG,YAAa,GAAa,CAAC,OAAO,EAAE,EACtE,GAAG,CACJ,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,
|
|
1
|
+
{"version":3,"file":"toolshed.js","sourceRoot":"","sources":["../../src/client/toolshed.ts"],"names":[],"mappings":"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"}
|
package/dist/tool-search.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ToolInfoService, ToolSource } from "@galaxy-tool-util/core";
|
|
1
|
+
import type { DiagnosticSink, ToolInfoService, ToolSource } from "@galaxy-tool-util/core";
|
|
2
2
|
import type { ParsedTool } from "@galaxy-tool-util/schema";
|
|
3
3
|
import type { ToolSearchHit } from "./models/toolshed-search.js";
|
|
4
4
|
/**
|
|
@@ -32,10 +32,16 @@ export interface NormalizedToolHit {
|
|
|
32
32
|
parsedTool?: ParsedTool;
|
|
33
33
|
}
|
|
34
34
|
export interface SearchToolsServiceOptions {
|
|
35
|
+
/** Starting result page requested from each Tool Shed. Defaults to 1. */
|
|
36
|
+
page?: number;
|
|
35
37
|
/** Server-side page size. Defaults to 20. */
|
|
36
38
|
pageSize?: number;
|
|
37
39
|
/** Hard cap on hits returned (after dedup). Defaults to 50. */
|
|
38
40
|
maxResults?: number;
|
|
41
|
+
/** Keep only hits owned by this Tool Shed user (case-insensitive). */
|
|
42
|
+
owner?: string;
|
|
43
|
+
/** Keep only hits whose tool name contains at least one complete query token. */
|
|
44
|
+
matchName?: boolean;
|
|
39
45
|
/** When true, resolve each hit's `ParsedTool` via the info service (and cache). */
|
|
40
46
|
enrich?: boolean;
|
|
41
47
|
}
|
|
@@ -48,17 +54,26 @@ export interface ToolSearchServiceOptions {
|
|
|
48
54
|
/** Shared with `ToolInfoService` so enriched hits reuse its cache. */
|
|
49
55
|
info: ToolInfoService;
|
|
50
56
|
fetcher?: typeof fetch;
|
|
57
|
+
/**
|
|
58
|
+
* Receives recoverable search-source and enrichment-callback diagnostics.
|
|
59
|
+
* Diagnostics produced inside `info` use that service's own sink.
|
|
60
|
+
*/
|
|
61
|
+
onDiagnostic?: DiagnosticSink;
|
|
51
62
|
}
|
|
52
63
|
/**
|
|
53
64
|
* High-level tool discovery service. Fans a query out across configured
|
|
54
65
|
* Tool Shed sources, dedupes hits that describe the same `(owner, repo,
|
|
55
66
|
* toolId)` across mirrors (first source wins), sorts by server score, and
|
|
56
|
-
* optionally enriches each hit with a full `ParsedTool`.
|
|
67
|
+
* optionally enriches each hit with a full `ParsedTool`. A failed source is
|
|
68
|
+
* tolerated when another source completes; if every searchable source fails,
|
|
69
|
+
* the first source error is rethrown so callers can distinguish failure from
|
|
70
|
+
* an empty result set.
|
|
57
71
|
*/
|
|
58
72
|
export declare class ToolSearchService {
|
|
59
73
|
private readonly sources;
|
|
60
74
|
private readonly info;
|
|
61
75
|
private readonly fetcher;
|
|
76
|
+
private readonly onDiagnostic;
|
|
62
77
|
constructor(opts: ToolSearchServiceOptions);
|
|
63
78
|
searchTools(query: string, opts?: SearchToolsServiceOptions): Promise<NormalizedToolHit[]>;
|
|
64
79
|
getToolVersions(toolshedUrl: string, trsToolId: string): Promise<string[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-search.d.ts","sourceRoot":"","sources":["../src/tool-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-search.d.ts","sourceRoot":"","sources":["../src/tool-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAO1F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAGjE;;;;;;;;;GASG;AACH,MAAM,WAAW,iBAAiB;IAChC,gCAAgC;IAChC,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,UAAU,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,yBAAyB;IACxC,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mFAAmF;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAcD,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,sEAAsE;IACtE,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB;;;OAGG;IACH,YAAY,CAAC,EAAE,cAAc,CAAC;CAC/B;AAED;;;;;;;;GAQG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiB;gBAElC,IAAI,EAAE,wBAAwB;IAOpC,WAAW,CACf,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,yBAA8B,GACnC,OAAO,CAAC,iBAAiB,EAAE,CAAC;IA+CzB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK1E,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YAIjF,iBAAiB;YAqBjB,MAAM;CASrB;AAsBD,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,GAAG,iBAAiB,CAoBtF"}
|
package/dist/tool-search.js
CHANGED
|
@@ -1,28 +1,51 @@
|
|
|
1
|
-
import { getLatestTRSToolVersion, getTRSToolVersions, toolIdFromTrs } from "@galaxy-tool-util/core";
|
|
1
|
+
import { getLatestTRSToolVersion, getTRSToolVersions, ignoreDiagnostic, toolIdFromTrs, } from "@galaxy-tool-util/core";
|
|
2
2
|
import { iterateToolSearchPages } from "./client/toolshed.js";
|
|
3
3
|
/**
|
|
4
4
|
* High-level tool discovery service. Fans a query out across configured
|
|
5
5
|
* Tool Shed sources, dedupes hits that describe the same `(owner, repo,
|
|
6
6
|
* toolId)` across mirrors (first source wins), sorts by server score, and
|
|
7
|
-
* optionally enriches each hit with a full `ParsedTool`.
|
|
7
|
+
* optionally enriches each hit with a full `ParsedTool`. A failed source is
|
|
8
|
+
* tolerated when another source completes; if every searchable source fails,
|
|
9
|
+
* the first source error is rethrown so callers can distinguish failure from
|
|
10
|
+
* an empty result set.
|
|
8
11
|
*/
|
|
9
12
|
export class ToolSearchService {
|
|
10
13
|
sources;
|
|
11
14
|
info;
|
|
12
15
|
fetcher;
|
|
16
|
+
onDiagnostic;
|
|
13
17
|
constructor(opts) {
|
|
14
18
|
this.sources = opts.sources.filter((s) => s.type === "toolshed");
|
|
15
19
|
this.info = opts.info;
|
|
16
20
|
this.fetcher = opts.fetcher ?? globalThis.fetch;
|
|
21
|
+
this.onDiagnostic = opts.onDiagnostic ?? ignoreDiagnostic;
|
|
17
22
|
}
|
|
18
23
|
async searchTools(query, opts = {}) {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
24
|
+
const resolvedOpts = {
|
|
25
|
+
page: opts.page ?? 1,
|
|
26
|
+
pageSize: opts.pageSize ?? 20,
|
|
27
|
+
maxResults: opts.maxResults ?? 50,
|
|
28
|
+
owner: opts.owner?.toLowerCase(),
|
|
29
|
+
nameTokens: opts.matchName ? tokenize(query) : undefined,
|
|
30
|
+
};
|
|
31
|
+
const sourceResults = await Promise.all(this.sources.map(async (source) => {
|
|
32
|
+
try {
|
|
33
|
+
const hits = await this.collectFromSource(source, query, resolvedOpts);
|
|
34
|
+
return { ok: true, hits };
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
return { ok: false, source, error };
|
|
38
|
+
}
|
|
39
|
+
}));
|
|
40
|
+
const failures = sourceResults.filter((result) => !result.ok);
|
|
41
|
+
if (sourceResults.length > 0 && failures.length === sourceResults.length) {
|
|
42
|
+
throw failures[0].error;
|
|
43
|
+
}
|
|
44
|
+
for (const failure of failures) {
|
|
45
|
+
const msg = failure.error instanceof Error ? failure.error.message : String(failure.error);
|
|
46
|
+
this.onDiagnostic(`Tool Shed search failed for ${failure.source.url}: ${msg}`);
|
|
47
|
+
}
|
|
48
|
+
const perSource = sourceResults.map((result) => (result.ok ? result.hits : []));
|
|
26
49
|
const dedupKey = (h) => `${h.repoOwnerUsername}~${h.repoName}~${h.toolId}`;
|
|
27
50
|
const seen = new Map();
|
|
28
51
|
for (let i = 0; i < this.sources.length; i++) {
|
|
@@ -33,7 +56,7 @@ export class ToolSearchService {
|
|
|
33
56
|
}
|
|
34
57
|
}
|
|
35
58
|
const merged = Array.from(seen.values()).sort((a, b) => b.score - a.score);
|
|
36
|
-
const truncated = merged.slice(0, maxResults);
|
|
59
|
+
const truncated = merged.slice(0, resolvedOpts.maxResults);
|
|
37
60
|
if (opts.enrich) {
|
|
38
61
|
await Promise.all(truncated.map((hit) => this.enrich(hit)));
|
|
39
62
|
}
|
|
@@ -46,17 +69,21 @@ export class ToolSearchService {
|
|
|
46
69
|
async getLatestVersionForToolId(toolshedUrl, trsToolId) {
|
|
47
70
|
return getLatestTRSToolVersion(toolshedUrl, trsToolId, this.fetcher);
|
|
48
71
|
}
|
|
49
|
-
async collectFromSource(source, query,
|
|
72
|
+
async collectFromSource(source, query, opts) {
|
|
50
73
|
const out = [];
|
|
51
74
|
for await (const page of iterateToolSearchPages(source.url, query, {
|
|
52
|
-
|
|
75
|
+
page: opts.page,
|
|
76
|
+
pageSize: opts.pageSize,
|
|
53
77
|
fetcher: this.fetcher,
|
|
54
78
|
})) {
|
|
55
|
-
for (const
|
|
56
|
-
|
|
79
|
+
for (const rawHit of page.hits) {
|
|
80
|
+
const hit = normalizeHit(rawHit, source);
|
|
81
|
+
if (!matchesFilters(hit, opts))
|
|
82
|
+
continue;
|
|
83
|
+
out.push(hit);
|
|
84
|
+
if (out.length >= opts.maxResults)
|
|
85
|
+
return out;
|
|
57
86
|
}
|
|
58
|
-
if (out.length >= maxResults)
|
|
59
|
-
return out;
|
|
60
87
|
}
|
|
61
88
|
return out;
|
|
62
89
|
}
|
|
@@ -68,10 +95,29 @@ export class ToolSearchService {
|
|
|
68
95
|
}
|
|
69
96
|
catch (err) {
|
|
70
97
|
const msg = err instanceof Error ? err.message : String(err);
|
|
71
|
-
|
|
98
|
+
this.onDiagnostic(`Enrichment failed for ${hit.trsToolId}: ${msg}`);
|
|
72
99
|
}
|
|
73
100
|
}
|
|
74
101
|
}
|
|
102
|
+
function matchesFilters(hit, opts) {
|
|
103
|
+
if (opts.owner !== undefined && hit.repoOwnerUsername.toLowerCase() !== opts.owner)
|
|
104
|
+
return false;
|
|
105
|
+
if (opts.nameTokens !== undefined && !nameMatchesQuery(hit.toolName, opts.nameTokens))
|
|
106
|
+
return false;
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
function tokenize(value) {
|
|
110
|
+
return value
|
|
111
|
+
.toLowerCase()
|
|
112
|
+
.split(/[^a-z0-9+]+/)
|
|
113
|
+
.filter((token) => token.length > 0);
|
|
114
|
+
}
|
|
115
|
+
function nameMatchesQuery(name, queryTokens) {
|
|
116
|
+
if (queryTokens.length === 0)
|
|
117
|
+
return true;
|
|
118
|
+
const nameTokens = new Set(tokenize(name));
|
|
119
|
+
return queryTokens.some((token) => nameTokens.has(token));
|
|
120
|
+
}
|
|
75
121
|
export function normalizeHit(hit, source) {
|
|
76
122
|
const { id, name, description, repo_name, repo_owner_username, version, changeset_revision } = hit.tool;
|
|
77
123
|
const trsToolId = `${repo_owner_username}~${repo_name}~${id}`;
|
package/dist/tool-search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-search.js","sourceRoot":"","sources":["../src/tool-search.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"tool-search.js","sourceRoot":"","sources":["../src/tool-search.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@galaxy-tool-util/search",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.12.0",
|
|
4
4
|
"description": "Tool discovery — Tool Shed search client, result normalization, and ranking",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
"@types/node": "^25.5.0"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@galaxy-tool-util/core": "1.
|
|
35
|
-
"@galaxy-tool-util/schema": "1.
|
|
34
|
+
"@galaxy-tool-util/core": "1.12.0",
|
|
35
|
+
"@galaxy-tool-util/schema": "1.12.0"
|
|
36
36
|
},
|
|
37
37
|
"scripts": {
|
|
38
38
|
"build": "tsc",
|