@refkit/provider-brave 0.2.0 → 0.2.2
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/index.js +5 -15
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
package/dist/index.js
CHANGED
|
@@ -1,26 +1,16 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
import {
|
|
3
3
|
defineProvider,
|
|
4
|
-
referenceId
|
|
4
|
+
referenceId,
|
|
5
|
+
setIfString,
|
|
6
|
+
setIfPositiveInt,
|
|
7
|
+
setIfBoolean
|
|
5
8
|
} from "@refkit/core";
|
|
6
9
|
function braveSafeSearch(control, fallback) {
|
|
7
10
|
if (control === "off") return "off";
|
|
8
11
|
if (control === "strict" || control === "moderate") return "strict";
|
|
9
12
|
return fallback ?? "strict";
|
|
10
13
|
}
|
|
11
|
-
function setIfString(url, key, value, allowed) {
|
|
12
|
-
if (typeof value !== "string" || !value) return;
|
|
13
|
-
if (allowed && !allowed.includes(value)) return;
|
|
14
|
-
url.searchParams.set(key, value);
|
|
15
|
-
}
|
|
16
|
-
function setIfPositiveInt(url, key, value, max) {
|
|
17
|
-
if (typeof value !== "number" || !Number.isInteger(value) || value < 1) return;
|
|
18
|
-
url.searchParams.set(key, String(max ? Math.min(value, max) : value));
|
|
19
|
-
}
|
|
20
|
-
function setIfBoolean(url, key, value) {
|
|
21
|
-
if (typeof value !== "boolean") return;
|
|
22
|
-
url.searchParams.set(key, String(value));
|
|
23
|
-
}
|
|
24
14
|
function toReference(r) {
|
|
25
15
|
const rights = {
|
|
26
16
|
// open web → no license metadata → evaluateUse returns needs-review (never auto-allowed)
|
|
@@ -58,7 +48,7 @@ function brave(config) {
|
|
|
58
48
|
const opts = q.providerOptions;
|
|
59
49
|
setIfString(url, "country", opts?.country);
|
|
60
50
|
setIfString(url, "search_lang", opts?.searchLang);
|
|
61
|
-
setIfPositiveInt(url, "count", opts?.count, 200);
|
|
51
|
+
setIfPositiveInt(url, "count", opts?.count, { max: 200, clamp: true });
|
|
62
52
|
setIfString(url, "safesearch", opts?.safesearch, ["strict", "off"]);
|
|
63
53
|
setIfBoolean(url, "spellcheck", opts?.spellcheck);
|
|
64
54
|
const res = await ctx.fetch(url.toString(), {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n defineProvider, referenceId,\n type Reference, type RightsRecord, type NormalizedQuery, type ProviderContext, type SearchSafety,\n} from '@refkit/core'\n\nexport interface BraveConfig {\n token: string\n /** Brave safesearch: 'strict' (default) or 'off'. */\n safesearch?: 'strict' | 'off'\n}\n\nexport interface BraveImageSearchOptions {\n country?: string\n searchLang?: string\n count?: number\n safesearch?: 'strict' | 'off'\n spellcheck?: boolean\n}\n\ninterface BraveImageResult {\n title: string\n url: string // the source webpage (canonical link)\n source: string // domain\n thumbnail: { src: string } // Brave-proxied thumbnail (safe to display)\n properties: { url: string; placeholder?: string } // origin/CDN full image (do NOT rehost)\n}\ninterface BraveResponse { results: BraveImageResult[] }\n\nfunction braveSafeSearch(control: SearchSafety | undefined, fallback: BraveConfig['safesearch']): 'strict' | 'off' {\n if (control === 'off') return 'off'\n if (control === 'strict' || control === 'moderate') return 'strict'\n return fallback ?? 'strict'\n}\n\nfunction
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n defineProvider, referenceId,\n setIfString, setIfPositiveInt, setIfBoolean,\n type Reference, type RightsRecord, type NormalizedQuery, type ProviderContext, type SearchSafety,\n} from '@refkit/core'\n\nexport interface BraveConfig {\n token: string\n /** Brave safesearch: 'strict' (default) or 'off'. */\n safesearch?: 'strict' | 'off'\n}\n\nexport interface BraveImageSearchOptions {\n country?: string\n searchLang?: string\n count?: number\n safesearch?: 'strict' | 'off'\n spellcheck?: boolean\n}\n\ninterface BraveImageResult {\n title: string\n url: string // the source webpage (canonical link)\n source: string // domain\n thumbnail: { src: string } // Brave-proxied thumbnail (safe to display)\n properties: { url: string; placeholder?: string } // origin/CDN full image (do NOT rehost)\n}\ninterface BraveResponse { results: BraveImageResult[] }\n\nfunction braveSafeSearch(control: SearchSafety | undefined, fallback: BraveConfig['safesearch']): 'strict' | 'off' {\n if (control === 'off') return 'off'\n if (control === 'strict' || control === 'moderate') return 'strict'\n return fallback ?? 'strict'\n}\n\nfunction toReference(r: BraveImageResult): Reference {\n const rights: RightsRecord = {\n // open web → no license metadata → evaluateUse returns needs-review (never auto-allowed)\n license: 'unknown',\n // only the Brave-proxied thumbnail is safe to show; never rehost properties.url (origin image)\n rehostPolicy: 'thumbnail-only',\n raw: { sourceTerms: '', sourceUrl: r.url },\n }\n return {\n id: referenceId('brave', r.properties.url), // origin image URL is the most stable identifier\n modality: 'image',\n title: r.title,\n source: { providerId: 'brave', sourceUrl: r.url },\n canonicalUrl: r.url, // the source webpage, not the raw image bytes\n rights,\n verifiedAt: new Date().toISOString(),\n thumbnail: { url: r.thumbnail.src },\n relevance: 0,\n raw: r,\n }\n}\n\nexport function brave(config: BraveConfig) {\n return defineProvider({\n id: 'brave',\n modalities: ['image'],\n queryFeatures: ['keyword'],\n capabilities: { controls: ['safety'] },\n async search(q: NormalizedQuery, ctx: ProviderContext): Promise<Reference[]> {\n const url = new URL('https://api.search.brave.com/res/v1/images/search')\n url.searchParams.set('q', q.text)\n url.searchParams.set('count', String(Math.min(q.limit ?? 50, 200)))\n url.searchParams.set('safesearch', braveSafeSearch(q.controls?.safety, config.safesearch))\n const opts = q.providerOptions as BraveImageSearchOptions | undefined\n setIfString(url, 'country', opts?.country)\n setIfString(url, 'search_lang', opts?.searchLang)\n setIfPositiveInt(url, 'count', opts?.count, { max: 200, clamp: true })\n setIfString(url, 'safesearch', opts?.safesearch, ['strict', 'off'])\n setIfBoolean(url, 'spellcheck', opts?.spellcheck)\n const res = await ctx.fetch(url.toString(), {\n headers: { 'X-Subscription-Token': config.token, Accept: 'application/json' },\n signal: ctx.signal,\n })\n if (!res.ok) throw new Error(`brave search failed: ${res.status}`)\n const json = (await res.json()) as BraveResponse\n return json.results.map(toReference)\n },\n })\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EAAgB;AAAA,EAChB;AAAA,EAAa;AAAA,EAAkB;AAAA,OAE1B;AAyBP,SAAS,gBAAgB,SAAmC,UAAuD;AACjH,MAAI,YAAY,MAAO,QAAO;AAC9B,MAAI,YAAY,YAAY,YAAY,WAAY,QAAO;AAC3D,SAAO,YAAY;AACrB;AAEA,SAAS,YAAY,GAAgC;AACnD,QAAM,SAAuB;AAAA;AAAA,IAE3B,SAAS;AAAA;AAAA,IAET,cAAc;AAAA,IACd,KAAK,EAAE,aAAa,IAAI,WAAW,EAAE,IAAI;AAAA,EAC3C;AACA,SAAO;AAAA,IACL,IAAI,YAAY,SAAS,EAAE,WAAW,GAAG;AAAA;AAAA,IACzC,UAAU;AAAA,IACV,OAAO,EAAE;AAAA,IACT,QAAQ,EAAE,YAAY,SAAS,WAAW,EAAE,IAAI;AAAA,IAChD,cAAc,EAAE;AAAA;AAAA,IAChB;AAAA,IACA,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IACnC,WAAW,EAAE,KAAK,EAAE,UAAU,IAAI;AAAA,IAClC,WAAW;AAAA,IACX,KAAK;AAAA,EACP;AACF;AAEO,SAAS,MAAM,QAAqB;AACzC,SAAO,eAAe;AAAA,IACpB,IAAI;AAAA,IACJ,YAAY,CAAC,OAAO;AAAA,IACpB,eAAe,CAAC,SAAS;AAAA,IACzB,cAAc,EAAE,UAAU,CAAC,QAAQ,EAAE;AAAA,IACrC,MAAM,OAAO,GAAoB,KAA4C;AAC3E,YAAM,MAAM,IAAI,IAAI,mDAAmD;AACvE,UAAI,aAAa,IAAI,KAAK,EAAE,IAAI;AAChC,UAAI,aAAa,IAAI,SAAS,OAAO,KAAK,IAAI,EAAE,SAAS,IAAI,GAAG,CAAC,CAAC;AAClE,UAAI,aAAa,IAAI,cAAc,gBAAgB,EAAE,UAAU,QAAQ,OAAO,UAAU,CAAC;AACzF,YAAM,OAAO,EAAE;AACf,kBAAY,KAAK,WAAW,MAAM,OAAO;AACzC,kBAAY,KAAK,eAAe,MAAM,UAAU;AAChD,uBAAiB,KAAK,SAAS,MAAM,OAAO,EAAE,KAAK,KAAK,OAAO,KAAK,CAAC;AACrE,kBAAY,KAAK,cAAc,MAAM,YAAY,CAAC,UAAU,KAAK,CAAC;AAClE,mBAAa,KAAK,cAAc,MAAM,UAAU;AAChD,YAAM,MAAM,MAAM,IAAI,MAAM,IAAI,SAAS,GAAG;AAAA,QAC1C,SAAS,EAAE,wBAAwB,OAAO,OAAO,QAAQ,mBAAmB;AAAA,QAC5E,QAAQ,IAAI;AAAA,MACd,CAAC;AACD,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,wBAAwB,IAAI,MAAM,EAAE;AACjE,YAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,aAAO,KAAK,QAAQ,IAAI,WAAW;AAAA,IACrC;AAAA,EACF,CAAC;AACH;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@refkit/provider-brave",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Brave Search web-discovery provider satellite for refkit — open-web image breadth, license:unknown (use-gated to needs-review).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -24,10 +24,11 @@
|
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@refkit/core": "0.
|
|
27
|
+
"@refkit/core": "0.6.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@refkit/provider-openverse": "0.
|
|
30
|
+
"@refkit/provider-openverse": "0.3.0",
|
|
31
|
+
"@refkit/provider-testkit": "0.0.1"
|
|
31
32
|
},
|
|
32
33
|
"files": [
|
|
33
34
|
"dist",
|