@ashdev/codex-plugin-metadata-mangabaka 1.18.1 → 1.19.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/index.js +130 -8
- package/dist/index.js.map +3 -3
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -77,6 +77,122 @@ var ConfigError = class extends PluginError {
|
|
|
77
77
|
code = PLUGIN_ERROR_CODES.CONFIG_ERROR;
|
|
78
78
|
};
|
|
79
79
|
|
|
80
|
+
// node_modules/@ashdev/codex-plugin-sdk/dist/request-context.js
|
|
81
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
82
|
+
var store = new AsyncLocalStorage();
|
|
83
|
+
function runWithParentRequestId(forwardRequestId, fn) {
|
|
84
|
+
return store.run(forwardRequestId, fn);
|
|
85
|
+
}
|
|
86
|
+
function currentParentRequestId() {
|
|
87
|
+
return store.getStore();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// node_modules/@ashdev/codex-plugin-sdk/dist/host-rpc.js
|
|
91
|
+
var HostRpcError = class extends Error {
|
|
92
|
+
code;
|
|
93
|
+
data;
|
|
94
|
+
constructor(message, code, data) {
|
|
95
|
+
super(message);
|
|
96
|
+
this.code = code;
|
|
97
|
+
this.data = data;
|
|
98
|
+
this.name = "HostRpcError";
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
var HostRpcClient = class {
|
|
102
|
+
// Start the counter high so it can't collide with PluginStorage's id space.
|
|
103
|
+
// `Number.MAX_SAFE_INTEGER` is far above this, so we have plenty of room
|
|
104
|
+
// before wrapping (and we never expect a single plugin lifetime to issue
|
|
105
|
+
// more than ~9 quintillion calls).
|
|
106
|
+
nextId = 1e9;
|
|
107
|
+
pendingRequests = /* @__PURE__ */ new Map();
|
|
108
|
+
writeFn;
|
|
109
|
+
/**
|
|
110
|
+
* @param writeFn - Optional custom write function (defaults to
|
|
111
|
+
* `process.stdout.write`). Useful for testing.
|
|
112
|
+
*/
|
|
113
|
+
constructor(writeFn) {
|
|
114
|
+
this.writeFn = writeFn ?? ((line) => {
|
|
115
|
+
process.stdout.write(line);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Send a JSON-RPC request to the host and resolve with the result.
|
|
120
|
+
*
|
|
121
|
+
* @param method - JSON-RPC method name (e.g. `"releases/list_tracked"`).
|
|
122
|
+
* @param params - Method-specific params. Pass `undefined` when the method
|
|
123
|
+
* takes no params.
|
|
124
|
+
*/
|
|
125
|
+
async call(method, params) {
|
|
126
|
+
const id = this.nextId++;
|
|
127
|
+
const parent = currentParentRequestId();
|
|
128
|
+
const request = {
|
|
129
|
+
jsonrpc: "2.0",
|
|
130
|
+
id,
|
|
131
|
+
method,
|
|
132
|
+
params,
|
|
133
|
+
...parent !== void 0 ? { parentRequestId: parent } : {}
|
|
134
|
+
};
|
|
135
|
+
return new Promise((resolve, reject) => {
|
|
136
|
+
this.pendingRequests.set(id, {
|
|
137
|
+
resolve: (v) => resolve(v),
|
|
138
|
+
reject
|
|
139
|
+
});
|
|
140
|
+
try {
|
|
141
|
+
this.writeFn(`${JSON.stringify(request)}
|
|
142
|
+
`);
|
|
143
|
+
} catch (err) {
|
|
144
|
+
this.pendingRequests.delete(id);
|
|
145
|
+
const message = err instanceof Error ? err.message : "Unknown write error";
|
|
146
|
+
reject(new HostRpcError(`Failed to send request: ${message}`, -1));
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Process an incoming JSON-RPC response line. Returns `true` if this
|
|
152
|
+
* client owned the response id and resolved it, `false` otherwise (so
|
|
153
|
+
* other clients can try).
|
|
154
|
+
*
|
|
155
|
+
* Called by the plugin server's main loop on every response.
|
|
156
|
+
*/
|
|
157
|
+
handleResponse(line) {
|
|
158
|
+
const trimmed = line.trim();
|
|
159
|
+
if (!trimmed)
|
|
160
|
+
return false;
|
|
161
|
+
let parsed;
|
|
162
|
+
try {
|
|
163
|
+
parsed = JSON.parse(trimmed);
|
|
164
|
+
} catch {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
const obj = parsed;
|
|
168
|
+
if (obj.method !== void 0)
|
|
169
|
+
return false;
|
|
170
|
+
const rawId = obj.id;
|
|
171
|
+
if (typeof rawId !== "number")
|
|
172
|
+
return false;
|
|
173
|
+
if (!this.pendingRequests.has(rawId))
|
|
174
|
+
return false;
|
|
175
|
+
const pending = this.pendingRequests.get(rawId);
|
|
176
|
+
if (!pending)
|
|
177
|
+
return false;
|
|
178
|
+
this.pendingRequests.delete(rawId);
|
|
179
|
+
if ("error" in obj && obj.error) {
|
|
180
|
+
const err = obj.error;
|
|
181
|
+
pending.reject(new HostRpcError(err.message, err.code, err.data));
|
|
182
|
+
} else {
|
|
183
|
+
pending.resolve(obj.result);
|
|
184
|
+
}
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
/** Reject all pending requests (e.g. on shutdown). */
|
|
188
|
+
cancelAll() {
|
|
189
|
+
for (const [, pending] of this.pendingRequests) {
|
|
190
|
+
pending.reject(new HostRpcError("Host RPC client stopped", -1));
|
|
191
|
+
}
|
|
192
|
+
this.pendingRequests.clear();
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
|
|
80
196
|
// node_modules/@ashdev/codex-plugin-sdk/dist/logger.js
|
|
81
197
|
var LOG_LEVELS = {
|
|
82
198
|
debug: 0,
|
|
@@ -354,17 +470,19 @@ function createPluginServer(options) {
|
|
|
354
470
|
const logger5 = createLogger({ name: manifest2.name, level: logLevel });
|
|
355
471
|
const prefix = label ? `${label} plugin` : "plugin";
|
|
356
472
|
const storage = new PluginStorage();
|
|
473
|
+
const hostRpc = new HostRpcClient();
|
|
357
474
|
logger5.info(`Starting ${prefix}: ${manifest2.displayName} v${manifest2.version}`);
|
|
358
475
|
const rl = createInterface({
|
|
359
476
|
input: process.stdin,
|
|
360
477
|
terminal: false
|
|
361
478
|
});
|
|
362
479
|
rl.on("line", (line) => {
|
|
363
|
-
void handleLine(line, manifest2, onInitialize, router, logger5, storage);
|
|
480
|
+
void handleLine(line, manifest2, onInitialize, router, logger5, storage, hostRpc);
|
|
364
481
|
});
|
|
365
482
|
rl.on("close", () => {
|
|
366
483
|
logger5.info("stdin closed, shutting down");
|
|
367
484
|
storage.cancelAll();
|
|
485
|
+
hostRpc.cancelAll();
|
|
368
486
|
process.exit(0);
|
|
369
487
|
});
|
|
370
488
|
process.on("uncaughtException", (error) => {
|
|
@@ -382,7 +500,7 @@ function isJsonRpcResponse(obj) {
|
|
|
382
500
|
return false;
|
|
383
501
|
return "result" in obj || "error" in obj;
|
|
384
502
|
}
|
|
385
|
-
async function handleLine(line, manifest2, onInitialize, router, logger5, storage) {
|
|
503
|
+
async function handleLine(line, manifest2, onInitialize, router, logger5, storage, hostRpc) {
|
|
386
504
|
const trimmed = line.trim();
|
|
387
505
|
if (!trimmed)
|
|
388
506
|
return;
|
|
@@ -392,8 +510,10 @@ async function handleLine(line, manifest2, onInitialize, router, logger5, storag
|
|
|
392
510
|
} catch {
|
|
393
511
|
}
|
|
394
512
|
if (parsed && isJsonRpcResponse(parsed)) {
|
|
395
|
-
logger5.debug("Routing
|
|
396
|
-
|
|
513
|
+
logger5.debug("Routing reverse-RPC response", { id: parsed.id });
|
|
514
|
+
if (!hostRpc.handleResponse(trimmed)) {
|
|
515
|
+
storage.handleResponse(trimmed);
|
|
516
|
+
}
|
|
397
517
|
return;
|
|
398
518
|
}
|
|
399
519
|
let id = null;
|
|
@@ -401,7 +521,7 @@ async function handleLine(line, manifest2, onInitialize, router, logger5, storag
|
|
|
401
521
|
const request = parsed ?? JSON.parse(trimmed);
|
|
402
522
|
id = request.id;
|
|
403
523
|
logger5.debug(`Received request: ${request.method}`, { id: request.id });
|
|
404
|
-
const response = await handleRequest(request, manifest2, onInitialize, router, logger5, storage);
|
|
524
|
+
const response = await runWithParentRequestId(request.id, () => handleRequest(request, manifest2, onInitialize, router, logger5, storage, hostRpc));
|
|
405
525
|
if (response !== null) {
|
|
406
526
|
writeResponse(response);
|
|
407
527
|
}
|
|
@@ -435,12 +555,13 @@ async function handleLine(line, manifest2, onInitialize, router, logger5, storag
|
|
|
435
555
|
}
|
|
436
556
|
}
|
|
437
557
|
}
|
|
438
|
-
async function handleRequest(request, manifest2, onInitialize, router, logger5, storage) {
|
|
558
|
+
async function handleRequest(request, manifest2, onInitialize, router, logger5, storage, hostRpc) {
|
|
439
559
|
const { method, params, id } = request;
|
|
440
560
|
switch (method) {
|
|
441
561
|
case "initialize": {
|
|
442
562
|
const initParams = params ?? {};
|
|
443
563
|
initParams.storage = storage;
|
|
564
|
+
initParams.hostRpc = hostRpc;
|
|
444
565
|
if (onInitialize) {
|
|
445
566
|
await onInitialize(initParams);
|
|
446
567
|
}
|
|
@@ -451,6 +572,7 @@ async function handleRequest(request, manifest2, onInitialize, router, logger5,
|
|
|
451
572
|
case "shutdown": {
|
|
452
573
|
logger5.info("Shutdown requested");
|
|
453
574
|
storage.cancelAll();
|
|
575
|
+
hostRpc.cancelAll();
|
|
454
576
|
const response2 = { jsonrpc: "2.0", id, result: null };
|
|
455
577
|
process.stdout.write(`${JSON.stringify(response2)}
|
|
456
578
|
`, () => {
|
|
@@ -1047,7 +1169,7 @@ async function handleSearch(params, client2) {
|
|
|
1047
1169
|
// package.json
|
|
1048
1170
|
var package_default = {
|
|
1049
1171
|
name: "@ashdev/codex-plugin-metadata-mangabaka",
|
|
1050
|
-
version: "1.
|
|
1172
|
+
version: "1.19.0",
|
|
1051
1173
|
description: "MangaBaka metadata provider plugin for Codex",
|
|
1052
1174
|
main: "dist/index.js",
|
|
1053
1175
|
bin: "dist/index.js",
|
|
@@ -1086,7 +1208,7 @@ var package_default = {
|
|
|
1086
1208
|
node: ">=22.0.0"
|
|
1087
1209
|
},
|
|
1088
1210
|
dependencies: {
|
|
1089
|
-
"@ashdev/codex-plugin-sdk": "^1.
|
|
1211
|
+
"@ashdev/codex-plugin-sdk": "^1.19.0"
|
|
1090
1212
|
},
|
|
1091
1213
|
devDependencies: {
|
|
1092
1214
|
"@biomejs/biome": "^2.4.4",
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../node_modules/@ashdev/codex-plugin-sdk/src/types/rpc.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/errors.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/logger.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/server.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/storage.ts", "../src/api.ts", "../src/mappers.ts", "../src/handlers/get.ts", "../src/similarity.ts", "../src/handlers/match.ts", "../src/handlers/search.ts", "../package.json", "../src/manifest.ts", "../src/index.ts"],
|
|
4
|
-
"sourcesContent": [null, null, null, null, null, "/**\n * MangaBaka API client\n * API docs: https://mangabaka.org/api\n */\n\nimport {\n ApiError,\n AuthError,\n createLogger,\n NotFoundError,\n RateLimitError,\n} from \"@ashdev/codex-plugin-sdk\";\nimport type { MbGetSeriesResponse, MbSearchResponse, MbSeries } from \"./types.js\";\n\nconst BASE_URL = \"https://api.mangabaka.dev\";\nconst DEFAULT_TIMEOUT_SECONDS = 60;\nconst logger = createLogger({ name: \"mangabaka-api\", level: \"debug\" });\n\nexport interface MangaBakaClientOptions {\n /** Request timeout in seconds (default: 60) */\n timeout?: number;\n /** Sort order for search results (passed as sort_by to the API) */\n sortBy?: string;\n}\n\nexport class MangaBakaClient {\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n private readonly sortBy: string | undefined;\n\n constructor(apiKey: string, options?: MangaBakaClientOptions) {\n if (!apiKey) {\n throw new AuthError(\"API key is required\");\n }\n this.apiKey = apiKey;\n this.timeoutMs = (options?.timeout ?? DEFAULT_TIMEOUT_SECONDS) * 1000;\n this.sortBy = options?.sortBy;\n logger.debug(\n `MangaBakaClient initialized with timeout: ${this.timeoutMs}ms, sortBy: ${this.sortBy ?? \"default\"}`,\n );\n }\n\n /**\n * Search for series by query\n */\n async search(\n query: string,\n page = 1,\n perPage = 20,\n ): Promise<{ data: MbSeries[]; total: number; page: number; totalPages: number }> {\n logger.debug(`Searching for: \"${query}\" (page ${page})`);\n\n const params = new URLSearchParams({\n q: query,\n page: String(page),\n limit: String(perPage),\n });\n\n if (this.sortBy) {\n params.set(\"sort_by\", this.sortBy);\n }\n\n const response = await this.request<MbSearchResponse>(`/v1/series/search?${params.toString()}`);\n\n return {\n data: response.data,\n total: response.pagination?.total ?? response.data.length,\n page: response.pagination?.page ?? page,\n totalPages: response.pagination?.total_pages ?? 1,\n };\n }\n\n /**\n * Get full series details by ID\n */\n async getSeries(id: number): Promise<MbSeries> {\n logger.debug(`Getting series: ${id}`);\n\n const response = await this.request<MbGetSeriesResponse>(`/v1/series/${id}`);\n\n return response.data;\n }\n\n /**\n * Make an authenticated request to the MangaBaka API\n */\n private async request<T>(path: string): Promise<T> {\n const url = `${BASE_URL}${path}`;\n const headers: Record<string, string> = {\n \"x-api-key\": this.apiKey,\n Accept: \"application/json\",\n };\n\n // Set up timeout using AbortController\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n logger.debug(`Request: ${path} (timeout: ${this.timeoutMs}ms)`);\n const response = await fetch(url, {\n method: \"GET\",\n headers,\n signal: controller.signal,\n });\n\n // Handle rate limiting\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"Retry-After\");\n const seconds = retryAfter ? Number.parseInt(retryAfter, 10) : 60;\n throw new RateLimitError(seconds);\n }\n\n // Handle auth errors\n if (response.status === 401 || response.status === 403) {\n throw new AuthError(\"Invalid API key\");\n }\n\n // Handle not found\n if (response.status === 404) {\n throw new NotFoundError(`Resource not found: ${path}`);\n }\n\n // Handle other errors\n if (!response.ok) {\n const text = await response.text();\n logger.error(`API error: ${response.status}`, { body: text });\n throw new ApiError(`API error: ${response.status} ${response.statusText}`, response.status);\n }\n\n return response.json() as Promise<T>;\n } catch (error) {\n // Handle timeout (abort)\n if (error instanceof Error && error.name === \"AbortError\") {\n logger.error(`Request timed out after ${this.timeoutMs}ms: ${path}`);\n throw new ApiError(`Request timed out after ${this.timeoutMs / 1000}s`);\n }\n\n // Re-throw plugin errors\n if (\n error instanceof RateLimitError ||\n error instanceof AuthError ||\n error instanceof NotFoundError ||\n error instanceof ApiError\n ) {\n throw error;\n }\n\n // Wrap other errors\n const message = error instanceof Error ? error.message : \"Unknown error\";\n logger.error(\"Request failed\", error);\n throw new ApiError(`Request failed: ${message}`);\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n", "/**\n * Mappers to convert MangaBaka API responses to Codex plugin protocol types\n */\n\nimport type {\n AlternateTitle,\n BookAuthor,\n ExternalId,\n ExternalLink,\n ExternalRating,\n PluginSeriesMetadata,\n ReadingDirection,\n SearchResult,\n SeriesStatus,\n} from \"@ashdev/codex-plugin-sdk\";\nimport type { MbContentRating, MbSeries, MbSeriesType, MbStatus } from \"./types.js\";\n\n/**\n * Parse MangaBaka's volume count strings (e.g. \"40\") into a positive integer.\n * Returns undefined for null/empty/non-numeric/non-positive inputs.\n */\nfunction parseVolumeCount(value: string | null | undefined): number | undefined {\n if (value == null) return undefined;\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) return undefined;\n return parsed;\n}\n\n/**\n * Parse MangaBaka's chapter count strings (e.g. \"109\", \"47.5\") into a positive\n * float. Returns undefined for null/empty/non-numeric/non-positive inputs.\n */\nfunction parseChapterCount(value: string | null | undefined): number | undefined {\n if (value == null) return undefined;\n const parsed = Number.parseFloat(value);\n if (!Number.isFinite(parsed) || parsed <= 0) return undefined;\n return parsed;\n}\n\n/**\n * Strip HTML tags from text, converting <br> to newlines\n */\nfunction stripHtml(html: string | undefined | null): string | undefined {\n if (!html) return undefined;\n return html\n .replace(/<br\\s*\\/?>/gi, \"\\n\") // Convert <br> to newlines\n .replace(/<[^>]*>/g, \"\") // Strip remaining HTML tags\n .trim();\n}\n\n/**\n * Map MangaBaka status to protocol SeriesStatus\n * MangaBaka uses: cancelled, completed, hiatus, releasing, unknown, upcoming\n * Codex uses: ongoing, ended, hiatus, abandoned, unknown\n */\nfunction mapStatus(mbStatus: MbStatus): SeriesStatus {\n switch (mbStatus) {\n case \"completed\":\n return \"ended\";\n case \"releasing\":\n case \"upcoming\":\n return \"ongoing\";\n case \"hiatus\":\n return \"hiatus\";\n case \"cancelled\":\n return \"abandoned\";\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Format genre from snake_case to Title Case\n */\nfunction formatGenre(genre: string): string {\n return genre\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\n/**\n * Detect language code from country of origin\n */\nfunction detectLanguageFromCountry(country: string | null | undefined): string | undefined {\n if (!country) return undefined;\n\n const countryLower = country.toLowerCase();\n if (countryLower === \"jp\" || countryLower === \"japan\") return \"ja\";\n if (countryLower === \"kr\" || countryLower === \"korea\" || countryLower === \"south korea\")\n return \"ko\";\n if (countryLower === \"cn\" || countryLower === \"china\") return \"zh\";\n if (countryLower === \"tw\" || countryLower === \"taiwan\") return \"zh-TW\";\n\n return undefined;\n}\n\n/**\n * Map MangaBaka content rating to numeric age rating\n */\nfunction mapContentRating(rating: MbContentRating | null | undefined): number | undefined {\n if (!rating) return undefined;\n\n switch (rating) {\n case \"safe\":\n return 0; // All ages\n case \"suggestive\":\n return 13; // Teen\n case \"erotica\":\n return 16; // Mature\n case \"pornographic\":\n return 18; // Adults only\n default:\n return undefined;\n }\n}\n\n/**\n * Extract rating value from either a number or an object with bayesian/average\n */\nfunction extractRating(\n rating: number | { bayesian?: number | null; average?: number | null } | null | undefined,\n): number | undefined {\n if (rating == null) return undefined;\n if (typeof rating === \"number\") return rating;\n return rating.bayesian ?? rating.average ?? undefined;\n}\n\n/**\n * Infer reading direction from series type and country\n */\nfunction inferReadingDirection(\n seriesType: MbSeriesType,\n country: string | null | undefined,\n): ReadingDirection | undefined {\n // Manhwa (Korean) and Manhua (Chinese) are typically left-to-right\n if (seriesType === \"manhwa\" || seriesType === \"manhua\") {\n return \"ltr\";\n }\n\n // Manga (Japanese) is typically right-to-left\n if (seriesType === \"manga\") {\n return \"rtl\";\n }\n\n // OEL (Original English Language) is left-to-right\n if (seriesType === \"oel\") {\n return \"ltr\";\n }\n\n // Fall back to country-based detection\n if (country) {\n const countryLower = country.toLowerCase();\n if (countryLower === \"jp\" || countryLower === \"japan\") return \"rtl\";\n if (countryLower === \"kr\" || countryLower === \"korea\" || countryLower === \"south korea\")\n return \"ltr\";\n if (countryLower === \"cn\" || countryLower === \"china\") return \"ltr\";\n if (countryLower === \"tw\" || countryLower === \"taiwan\") return \"ltr\";\n }\n\n return undefined;\n}\n\n/**\n * Map a MangaBaka series to a protocol SearchResult\n */\nexport function mapSearchResult(series: MbSeries): SearchResult {\n // Get cover URL - prefer x250 for search results\n const coverUrl = series.cover?.x250?.x1 ?? series.cover?.raw?.url ?? undefined;\n\n // Build alternate titles array\n const alternateTitles: string[] = [];\n if (series.native_title && series.native_title !== series.title) {\n alternateTitles.push(series.native_title);\n }\n if (series.romanized_title && series.romanized_title !== series.title) {\n alternateTitles.push(series.romanized_title);\n }\n\n // Note: relevanceScore is omitted - the API already returns results in relevance order\n const previewAuthors = [...new Set([...(series.authors ?? []), ...(series.artists ?? [])])].slice(\n 0,\n 3,\n );\n\n return {\n externalId: String(series.id),\n title: series.title,\n alternateTitles,\n year: series.year ?? undefined,\n coverUrl: coverUrl ?? undefined,\n preview: {\n status: mapStatus(series.status),\n genres: (series.genres ?? []).slice(0, 3).map(formatGenre),\n rating: extractRating(series.rating),\n description: stripHtml(series.description)?.slice(0, 200) ?? undefined,\n bookCount: parseVolumeCount(series.final_volume),\n authors: previewAuthors.length > 0 ? previewAuthors : undefined,\n format: series.type ?? undefined,\n },\n };\n}\n\n/**\n * Map full series response to protocol PluginSeriesMetadata\n */\nexport function mapSeriesMetadata(series: MbSeries): PluginSeriesMetadata {\n // Build alternate titles array with language info\n const alternateTitles: AlternateTitle[] = [];\n\n // Add native title\n if (series.native_title && series.native_title !== series.title) {\n alternateTitles.push({\n title: series.native_title,\n language: detectLanguageFromCountry(series.country_of_origin),\n titleType: \"native\",\n });\n }\n\n // Add romanized title\n if (series.romanized_title && series.romanized_title !== series.title) {\n alternateTitles.push({\n title: series.romanized_title,\n language: \"en\",\n titleType: \"romaji\",\n });\n }\n\n // Add secondary titles from all languages\n if (series.secondary_titles) {\n for (const [langCode, titleList] of Object.entries(series.secondary_titles)) {\n if (titleList) {\n for (const titleEntry of titleList) {\n if (titleEntry.title !== series.title) {\n alternateTitles.push({\n title: titleEntry.title,\n language: langCode,\n });\n }\n }\n }\n }\n }\n\n // Extract authors and artists \u2014 merge into unified BookAuthor array\n // Authors get \"author\" role (generic default), artists get \"illustrator\" role\n // Deduplicate: if someone is both author and artist, keep them as \"author\"\n const authorNames = new Set((series.authors ?? []).map((n) => n));\n const authors: BookAuthor[] = (series.authors ?? []).map((name) => ({\n name,\n role: \"author\" as const,\n }));\n for (const name of series.artists ?? []) {\n if (!authorNames.has(name)) {\n authors.push({ name, role: \"illustrator\" as const });\n }\n }\n\n // Format genres\n const genres = (series.genres ?? []).map(formatGenre);\n\n // Get cover URL - prefer raw for full metadata\n const coverUrl = series.cover?.raw?.url ?? series.cover?.x350?.x1 ?? undefined;\n\n // Build external links from sources\n // Always include MangaBaka link first\n const externalLinks: ExternalLink[] = [\n {\n url: `https://mangabaka.org/${series.id}`,\n label: \"MangaBaka\",\n linkType: \"provider\",\n },\n ];\n\n // Source configuration: display name, rating key, and URL pattern\n // URL pattern uses {id} as placeholder for the source ID\n const sourceConfig: Record<string, { label: string; ratingKey: string; urlPattern?: string }> = {\n anilist: {\n label: \"AniList\",\n ratingKey: \"anilist\",\n urlPattern: \"https://anilist.co/manga/{id}\",\n },\n my_anime_list: {\n label: \"MyAnimeList\",\n ratingKey: \"myanimelist\",\n urlPattern: \"https://myanimelist.net/manga/{id}\",\n },\n mangadex: {\n label: \"MangaDex\",\n ratingKey: \"mangadex\",\n urlPattern: \"https://mangadex.org/title/{id}\",\n },\n manga_updates: {\n label: \"MangaUpdates\",\n ratingKey: \"mangaupdates\",\n urlPattern: \"https://www.mangaupdates.com/series/{id}\",\n },\n kitsu: { label: \"Kitsu\", ratingKey: \"kitsu\", urlPattern: \"https://kitsu.app/manga/{id}\" },\n anime_planet: {\n label: \"Anime-Planet\",\n ratingKey: \"animeplanet\",\n urlPattern: \"https://www.anime-planet.com/manga/{id}\",\n },\n anime_news_network: { label: \"Anime News Network\", ratingKey: \"animenewsnetwork\" },\n shikimori: {\n label: \"Shikimori\",\n ratingKey: \"shikimori\",\n urlPattern: \"https://shikimori.one/mangas/{id}\",\n },\n };\n\n // Build external links, ratings, and cross-reference IDs from sources in a single pass\n const externalRatings: ExternalRating[] = [];\n const externalIds: ExternalId[] = [\n // Always include the plugin's own API ID so other plugins can cross-reference\n { source: \"api:mangabaka\", externalId: String(series.id) },\n ];\n\n if (series.source) {\n for (const [key, info] of Object.entries(series.source)) {\n if (!info) continue;\n\n const config = sourceConfig[key];\n // Use config if available, otherwise generate defaults from key\n const ratingKey = config?.ratingKey ?? key.replace(/_/g, \"\");\n\n // Add cross-reference external ID with api: prefix\n if (info.id != null) {\n externalIds.push({\n source: `api:${ratingKey}`,\n externalId: String(info.id),\n });\n }\n\n // Add external link if source has an ID and URL pattern\n if (info.id != null && config?.urlPattern) {\n externalLinks.push({\n url: config.urlPattern.replace(\"{id}\", String(info.id)),\n label: config.label,\n linkType: \"provider\",\n });\n }\n\n // Add external rating if source has a normalized rating\n if (info.rating_normalized != null) {\n externalRatings.push({ score: info.rating_normalized, source: ratingKey });\n }\n }\n }\n\n // Get publisher name (pick first one if available)\n const publisher = series.publishers?.[0]?.name ?? undefined;\n\n const totalVolumeCount = parseVolumeCount(series.final_volume);\n const totalChapterCount = parseChapterCount(series.total_chapters);\n\n return {\n externalId: String(series.id),\n externalUrl: `https://mangabaka.org/${series.id}`,\n title: series.title,\n alternateTitles,\n summary: stripHtml(series.description),\n status: mapStatus(series.status),\n year: series.year ?? undefined,\n // Extended metadata\n publisher,\n totalVolumeCount,\n totalChapterCount,\n ageRating: mapContentRating(series.content_rating),\n readingDirection: inferReadingDirection(series.type, series.country_of_origin),\n // Taxonomy\n genres,\n tags: series.tags ?? [],\n authors,\n artists: [],\n coverUrl: coverUrl ?? undefined,\n rating: (() => {\n const r = extractRating(series.rating);\n return r != null ? { score: r, source: \"mangabaka\" } : undefined;\n })(),\n externalRatings: externalRatings.length > 0 ? externalRatings : undefined,\n externalLinks,\n externalIds,\n };\n}\n", "import {\n type MetadataGetParams,\n NotFoundError,\n type PluginSeriesMetadata,\n} from \"@ashdev/codex-plugin-sdk\";\nimport type { MangaBakaClient } from \"../api.js\";\nimport { mapSeriesMetadata } from \"../mappers.js\";\n\nexport async function handleGet(\n params: MetadataGetParams,\n client: MangaBakaClient,\n): Promise<PluginSeriesMetadata> {\n const seriesId = Number.parseInt(params.externalId, 10);\n\n if (Number.isNaN(seriesId)) {\n throw new NotFoundError(`Invalid external ID: ${params.externalId}`);\n }\n\n const response = await client.getSeries(seriesId);\n\n return mapSeriesMetadata(response);\n}\n", "/**\n * Calculate string similarity using word overlap and containment scoring\n * Returns a value between 0 and 1\n */\nexport function similarity(a: string, b: string): number {\n const aLower = a.toLowerCase().trim();\n const bLower = b.toLowerCase().trim();\n\n if (aLower === bLower) return 1.0;\n if (aLower.length === 0 || bLower.length === 0) return 0;\n\n let score = 0;\n\n // Containment check with length-ratio penalty\n // Prevents short queries like \"Air\" from matching \"Air Gear\" too strongly\n const shorter = aLower.length <= bLower.length ? aLower : bLower;\n const longer = aLower.length <= bLower.length ? bLower : aLower;\n\n if (longer.includes(shorter)) {\n const lengthRatio = shorter.length / longer.length;\n score = Math.max(score, 0.8 * lengthRatio);\n }\n\n // Word overlap scoring (Jaccard similarity)\n const aWords = new Set(aLower.split(/\\s+/));\n const bWords = new Set(bLower.split(/\\s+/));\n const intersection = [...aWords].filter((w) => bWords.has(w));\n const union = new Set([...aWords, ...bWords]);\n\n if (union.size > 0) {\n score = Math.max(score, intersection.length / union.size);\n }\n\n return score;\n}\n", "import {\n createLogger,\n type MetadataMatchParams,\n type MetadataMatchResponse,\n type SearchResult,\n} from \"@ashdev/codex-plugin-sdk\";\nimport type { MangaBakaClient } from \"../api.js\";\nimport { mapSearchResult } from \"../mappers.js\";\nimport { similarity } from \"../similarity.js\";\n\nconst logger = createLogger({ name: \"mangabaka-match\", level: \"info\" });\n\n/**\n * Score a search result against the match parameters\n * Returns a value between 0 and 1\n */\nexport function scoreResult(result: SearchResult, params: MetadataMatchParams): number {\n let score = 0;\n\n // Find best title similarity across primary and alternate titles\n let bestTitleSimilarity = similarity(result.title, params.title);\n for (const alt of result.alternateTitles) {\n bestTitleSimilarity = Math.max(bestTitleSimilarity, similarity(alt, params.title));\n }\n\n // Title similarity (up to 0.6)\n score += bestTitleSimilarity * 0.6;\n\n // Year match (up to 0.2)\n if (params.year && result.year) {\n if (result.year === params.year) {\n score += 0.2;\n } else if (Math.abs(result.year - params.year) <= 1) {\n score += 0.1;\n }\n }\n\n // Boost for exact title match across primary and alternate titles (up to 0.2)\n const searchLower = params.title.toLowerCase();\n const hasExactMatch =\n result.title.toLowerCase() === searchLower ||\n result.alternateTitles.some((alt) => alt.toLowerCase() === searchLower);\n\n if (hasExactMatch) {\n score += 0.2;\n }\n\n return Math.min(1.0, score);\n}\n\nexport async function handleMatch(\n params: MetadataMatchParams,\n client: MangaBakaClient,\n): Promise<MetadataMatchResponse> {\n logger.debug(`Matching: \"${params.title}\"`);\n\n // Search for the title\n const response = await client.search(params.title, 1, 10);\n\n if (response.data.length === 0) {\n return {\n match: null,\n confidence: 0,\n };\n }\n\n // Map and score results\n const scoredResults = response.data\n .map((series) => {\n const result = mapSearchResult(series);\n const score = scoreResult(result, params);\n return { result, score };\n })\n .sort((a, b) => b.score - a.score);\n\n const best = scoredResults[0];\n\n if (!best) {\n return {\n match: null,\n confidence: 0,\n };\n }\n\n // If confidence is low, include alternatives\n const alternatives =\n best.score < 0.8\n ? scoredResults.slice(1, 4).map((s) => ({\n ...s.result,\n relevanceScore: s.score,\n }))\n : undefined;\n\n return {\n match: {\n ...best.result,\n relevanceScore: best.score,\n },\n confidence: best.score,\n alternatives,\n };\n}\n", "import {\n createLogger,\n type MetadataSearchParams,\n type MetadataSearchResponse,\n type SearchResult,\n} from \"@ashdev/codex-plugin-sdk\";\nimport type { MangaBakaClient } from \"../api.js\";\nimport { mapSearchResult } from \"../mappers.js\";\nimport { similarity } from \"../similarity.js\";\n\nconst logger = createLogger({ name: \"mangabaka-search\", level: \"debug\" });\n\n/** MangaBaka API enforces a maximum of 50 results per request */\nconst MAX_LIMIT = 50;\n\n/**\n * Score a search result against the query using title similarity.\n * Checks both primary title and alternate titles, returning the best score.\n */\nexport function scoreSearchResult(result: SearchResult, query: string): number {\n let best = similarity(result.title, query);\n for (const alt of result.alternateTitles) {\n best = Math.max(best, similarity(alt, query));\n }\n return best;\n}\n\nexport async function handleSearch(\n params: MetadataSearchParams,\n client: MangaBakaClient,\n): Promise<MetadataSearchResponse> {\n logger.debug(\"Search params received:\", params);\n\n const limit = Math.min(params.limit ?? 20, MAX_LIMIT);\n\n // Parse cursor as page number (default to 1)\n const page = params.cursor ? Number.parseInt(params.cursor, 10) : 1;\n\n logger.debug(`Searching for: \"${params.query}\" (page ${page}, limit ${limit})`);\n\n const response = await client.search(params.query, page, limit);\n\n // Map results and score by similarity to the search query\n const results = response.data\n .map((series) => {\n const result = mapSearchResult(series);\n result.relevanceScore = scoreSearchResult(result, params.query);\n return result;\n })\n .sort((a, b) => (b.relevanceScore ?? 0) - (a.relevanceScore ?? 0));\n\n // Calculate next cursor (next page number) if there are more results\n const hasNextPage = response.page < response.totalPages;\n const nextCursor = hasNextPage ? String(response.page + 1) : undefined;\n\n return {\n results,\n nextCursor,\n };\n}\n", "{\n \"name\": \"@ashdev/codex-plugin-metadata-mangabaka\",\n \"version\": \"1.18.1\",\n \"description\": \"MangaBaka metadata provider plugin for Codex\",\n \"main\": \"dist/index.js\",\n \"bin\": \"dist/index.js\",\n \"type\": \"module\",\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/AshDevFr/codex.git\",\n \"directory\": \"plugins/metadata-mangabaka\"\n },\n \"scripts\": {\n \"build\": \"esbuild src/index.ts --bundle --platform=node --target=node22 --format=esm --outfile=dist/index.js --sourcemap --banner:js='#!/usr/bin/env node'\",\n \"dev\": \"npm run build -- --watch\",\n \"clean\": \"rm -rf dist\",\n \"start\": \"node dist/index.js\",\n \"lint\": \"biome check .\",\n \"lint:fix\": \"biome check --write .\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"prepublishOnly\": \"npm run lint && npm run build\"\n },\n \"keywords\": [\n \"codex\",\n \"plugin\",\n \"mangabaka\",\n \"manga\",\n \"metadata\"\n ],\n \"author\": \"Codex\",\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"dependencies\": {\n \"@ashdev/codex-plugin-sdk\": \"^1.18.1\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.4.4\",\n \"@types/node\": \"^22.0.0\",\n \"esbuild\": \"^0.27.3\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.0.18\"\n }\n}\n", "import type { MetadataContentType, PluginManifest } from \"@ashdev/codex-plugin-sdk\";\nimport packageJson from \"../package.json\" with { type: \"json\" };\n\nexport const manifest = {\n name: \"metadata-mangabaka\",\n displayName: \"MangaBaka Metadata\",\n version: packageJson.version,\n description: \"Fetch manga metadata from MangaBaka - aggregated data from multiple sources\",\n author: \"Codex\",\n homepage: \"https://mangabaka.org\",\n protocolVersion: \"1.1\",\n capabilities: {\n metadataProvider: [\"series\"] as MetadataContentType[],\n },\n requiredCredentials: [\n {\n key: \"api_key\",\n label: \"API Key\",\n description: \"Get your API key at https://mangabaka.org/settings/api (requires account)\",\n required: true,\n sensitive: true,\n type: \"password\",\n placeholder: \"mb-...\",\n },\n ],\n searchURITemplate: \"https://mangabaka.org/search?sort_by=popularity_asc&q=<title>\",\n configSchema: {\n description: \"Optional configuration for the MangaBaka plugin\",\n fields: [\n {\n key: \"timeout\",\n label: \"Request Timeout\",\n description: \"HTTP request timeout in seconds for API calls to MangaBaka\",\n type: \"number\",\n required: false,\n default: 60,\n example: 30,\n },\n {\n key: \"sort_by\",\n label: \"Search Sort Order\",\n description:\n \"How the MangaBaka API sorts search results. Valid values: relevance_desc (default), popularity_asc (recommended - surfaces well-known series), popularity_desc, title_asc, title_desc, created_at_desc, created_at_asc\",\n type: \"string\",\n required: false,\n default: \"relevance_desc\",\n example: \"popularity_asc\",\n },\n ],\n },\n} as const satisfies PluginManifest & {\n capabilities: { metadataProvider: MetadataContentType[] };\n};\n", "/**\n * MangaBaka Plugin - Fetch manga metadata from MangaBaka\n *\n * MangaBaka aggregates metadata from multiple sources (AniList, MAL, MangaDex, etc.)\n * and provides a unified API for manga/novel metadata.\n *\n * API docs: https://mangabaka.org/api\n *\n * Credentials are provided by Codex via the initialize message.\n * Required credential: api_key (get one at https://mangabaka.org/settings/api)\n */\n\nimport {\n ConfigError,\n createLogger,\n createMetadataPlugin,\n type InitializeParams,\n type MetadataProvider,\n} from \"@ashdev/codex-plugin-sdk\";\nimport { MangaBakaClient } from \"./api.js\";\nimport { handleGet } from \"./handlers/get.js\";\nimport { handleMatch } from \"./handlers/match.js\";\nimport { handleSearch } from \"./handlers/search.js\";\nimport { manifest } from \"./manifest.js\";\n\nconst logger = createLogger({ name: \"mangabaka\", level: \"info\" });\n\n// Client is initialized when we receive credentials from Codex\nlet client: MangaBakaClient | null = null;\n\nfunction getClient(): MangaBakaClient {\n if (!client) {\n throw new ConfigError(\"Plugin not initialized - missing API key\");\n }\n return client;\n}\n\n// Create the MetadataProvider implementation\nconst provider: MetadataProvider = {\n async search(params) {\n return handleSearch(params, getClient());\n },\n\n async get(params) {\n return handleGet(params, getClient());\n },\n\n async match(params) {\n return handleMatch(params, getClient());\n },\n};\n\n// Start the plugin server\ncreateMetadataPlugin({\n manifest,\n provider,\n logLevel: \"info\",\n onInitialize(params: InitializeParams) {\n const apiKey = params.credentials?.api_key;\n if (!apiKey) {\n throw new ConfigError(\"api_key credential is required\");\n }\n\n // Get optional config from admin settings\n const timeout = params.adminConfig?.timeout as number | undefined;\n const sortBy = params.adminConfig?.sort_by as string | undefined;\n\n client = new MangaBakaClient(apiKey, { timeout, sortBy });\n logger.info(\n `MangaBaka client initialized (timeout: ${timeout ?? \"default\"}s, sortBy: ${sortBy ?? \"default\"})`,\n );\n },\n});\n\nlogger.info(\"MangaBaka plugin started\");\n"],
|
|
5
|
-
"mappings": "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",
|
|
3
|
+
"sources": ["../node_modules/@ashdev/codex-plugin-sdk/src/types/rpc.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/errors.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/request-context.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/host-rpc.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/logger.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/server.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/storage.ts", "../src/api.ts", "../src/mappers.ts", "../src/handlers/get.ts", "../src/similarity.ts", "../src/handlers/match.ts", "../src/handlers/search.ts", "../package.json", "../src/manifest.ts", "../src/index.ts"],
|
|
4
|
+
"sourcesContent": [null, null, null, null, null, null, null, "/**\n * MangaBaka API client\n * API docs: https://mangabaka.org/api\n */\n\nimport {\n ApiError,\n AuthError,\n createLogger,\n NotFoundError,\n RateLimitError,\n} from \"@ashdev/codex-plugin-sdk\";\nimport type { MbGetSeriesResponse, MbSearchResponse, MbSeries } from \"./types.js\";\n\nconst BASE_URL = \"https://api.mangabaka.dev\";\nconst DEFAULT_TIMEOUT_SECONDS = 60;\nconst logger = createLogger({ name: \"mangabaka-api\", level: \"debug\" });\n\nexport interface MangaBakaClientOptions {\n /** Request timeout in seconds (default: 60) */\n timeout?: number;\n /** Sort order for search results (passed as sort_by to the API) */\n sortBy?: string;\n}\n\nexport class MangaBakaClient {\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n private readonly sortBy: string | undefined;\n\n constructor(apiKey: string, options?: MangaBakaClientOptions) {\n if (!apiKey) {\n throw new AuthError(\"API key is required\");\n }\n this.apiKey = apiKey;\n this.timeoutMs = (options?.timeout ?? DEFAULT_TIMEOUT_SECONDS) * 1000;\n this.sortBy = options?.sortBy;\n logger.debug(\n `MangaBakaClient initialized with timeout: ${this.timeoutMs}ms, sortBy: ${this.sortBy ?? \"default\"}`,\n );\n }\n\n /**\n * Search for series by query\n */\n async search(\n query: string,\n page = 1,\n perPage = 20,\n ): Promise<{ data: MbSeries[]; total: number; page: number; totalPages: number }> {\n logger.debug(`Searching for: \"${query}\" (page ${page})`);\n\n const params = new URLSearchParams({\n q: query,\n page: String(page),\n limit: String(perPage),\n });\n\n if (this.sortBy) {\n params.set(\"sort_by\", this.sortBy);\n }\n\n const response = await this.request<MbSearchResponse>(`/v1/series/search?${params.toString()}`);\n\n return {\n data: response.data,\n total: response.pagination?.total ?? response.data.length,\n page: response.pagination?.page ?? page,\n totalPages: response.pagination?.total_pages ?? 1,\n };\n }\n\n /**\n * Get full series details by ID\n */\n async getSeries(id: number): Promise<MbSeries> {\n logger.debug(`Getting series: ${id}`);\n\n const response = await this.request<MbGetSeriesResponse>(`/v1/series/${id}`);\n\n return response.data;\n }\n\n /**\n * Make an authenticated request to the MangaBaka API\n */\n private async request<T>(path: string): Promise<T> {\n const url = `${BASE_URL}${path}`;\n const headers: Record<string, string> = {\n \"x-api-key\": this.apiKey,\n Accept: \"application/json\",\n };\n\n // Set up timeout using AbortController\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n logger.debug(`Request: ${path} (timeout: ${this.timeoutMs}ms)`);\n const response = await fetch(url, {\n method: \"GET\",\n headers,\n signal: controller.signal,\n });\n\n // Handle rate limiting\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"Retry-After\");\n const seconds = retryAfter ? Number.parseInt(retryAfter, 10) : 60;\n throw new RateLimitError(seconds);\n }\n\n // Handle auth errors\n if (response.status === 401 || response.status === 403) {\n throw new AuthError(\"Invalid API key\");\n }\n\n // Handle not found\n if (response.status === 404) {\n throw new NotFoundError(`Resource not found: ${path}`);\n }\n\n // Handle other errors\n if (!response.ok) {\n const text = await response.text();\n logger.error(`API error: ${response.status}`, { body: text });\n throw new ApiError(`API error: ${response.status} ${response.statusText}`, response.status);\n }\n\n return response.json() as Promise<T>;\n } catch (error) {\n // Handle timeout (abort)\n if (error instanceof Error && error.name === \"AbortError\") {\n logger.error(`Request timed out after ${this.timeoutMs}ms: ${path}`);\n throw new ApiError(`Request timed out after ${this.timeoutMs / 1000}s`);\n }\n\n // Re-throw plugin errors\n if (\n error instanceof RateLimitError ||\n error instanceof AuthError ||\n error instanceof NotFoundError ||\n error instanceof ApiError\n ) {\n throw error;\n }\n\n // Wrap other errors\n const message = error instanceof Error ? error.message : \"Unknown error\";\n logger.error(\"Request failed\", error);\n throw new ApiError(`Request failed: ${message}`);\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n", "/**\n * Mappers to convert MangaBaka API responses to Codex plugin protocol types\n */\n\nimport type {\n AlternateTitle,\n BookAuthor,\n ExternalId,\n ExternalLink,\n ExternalRating,\n PluginSeriesMetadata,\n ReadingDirection,\n SearchResult,\n SeriesStatus,\n} from \"@ashdev/codex-plugin-sdk\";\nimport type { MbContentRating, MbSeries, MbSeriesType, MbStatus } from \"./types.js\";\n\n/**\n * Parse MangaBaka's volume count strings (e.g. \"40\") into a positive integer.\n * Returns undefined for null/empty/non-numeric/non-positive inputs.\n */\nfunction parseVolumeCount(value: string | null | undefined): number | undefined {\n if (value == null) return undefined;\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) return undefined;\n return parsed;\n}\n\n/**\n * Parse MangaBaka's chapter count strings (e.g. \"109\", \"47.5\") into a positive\n * float. Returns undefined for null/empty/non-numeric/non-positive inputs.\n */\nfunction parseChapterCount(value: string | null | undefined): number | undefined {\n if (value == null) return undefined;\n const parsed = Number.parseFloat(value);\n if (!Number.isFinite(parsed) || parsed <= 0) return undefined;\n return parsed;\n}\n\n/**\n * Strip HTML tags from text, converting <br> to newlines\n */\nfunction stripHtml(html: string | undefined | null): string | undefined {\n if (!html) return undefined;\n return html\n .replace(/<br\\s*\\/?>/gi, \"\\n\") // Convert <br> to newlines\n .replace(/<[^>]*>/g, \"\") // Strip remaining HTML tags\n .trim();\n}\n\n/**\n * Map MangaBaka status to protocol SeriesStatus\n * MangaBaka uses: cancelled, completed, hiatus, releasing, unknown, upcoming\n * Codex uses: ongoing, ended, hiatus, abandoned, unknown\n */\nfunction mapStatus(mbStatus: MbStatus): SeriesStatus {\n switch (mbStatus) {\n case \"completed\":\n return \"ended\";\n case \"releasing\":\n case \"upcoming\":\n return \"ongoing\";\n case \"hiatus\":\n return \"hiatus\";\n case \"cancelled\":\n return \"abandoned\";\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Format genre from snake_case to Title Case\n */\nfunction formatGenre(genre: string): string {\n return genre\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\n/**\n * Detect language code from country of origin\n */\nfunction detectLanguageFromCountry(country: string | null | undefined): string | undefined {\n if (!country) return undefined;\n\n const countryLower = country.toLowerCase();\n if (countryLower === \"jp\" || countryLower === \"japan\") return \"ja\";\n if (countryLower === \"kr\" || countryLower === \"korea\" || countryLower === \"south korea\")\n return \"ko\";\n if (countryLower === \"cn\" || countryLower === \"china\") return \"zh\";\n if (countryLower === \"tw\" || countryLower === \"taiwan\") return \"zh-TW\";\n\n return undefined;\n}\n\n/**\n * Map MangaBaka content rating to numeric age rating\n */\nfunction mapContentRating(rating: MbContentRating | null | undefined): number | undefined {\n if (!rating) return undefined;\n\n switch (rating) {\n case \"safe\":\n return 0; // All ages\n case \"suggestive\":\n return 13; // Teen\n case \"erotica\":\n return 16; // Mature\n case \"pornographic\":\n return 18; // Adults only\n default:\n return undefined;\n }\n}\n\n/**\n * Extract rating value from either a number or an object with bayesian/average\n */\nfunction extractRating(\n rating: number | { bayesian?: number | null; average?: number | null } | null | undefined,\n): number | undefined {\n if (rating == null) return undefined;\n if (typeof rating === \"number\") return rating;\n return rating.bayesian ?? rating.average ?? undefined;\n}\n\n/**\n * Infer reading direction from series type and country\n */\nfunction inferReadingDirection(\n seriesType: MbSeriesType,\n country: string | null | undefined,\n): ReadingDirection | undefined {\n // Manhwa (Korean) and Manhua (Chinese) are typically left-to-right\n if (seriesType === \"manhwa\" || seriesType === \"manhua\") {\n return \"ltr\";\n }\n\n // Manga (Japanese) is typically right-to-left\n if (seriesType === \"manga\") {\n return \"rtl\";\n }\n\n // OEL (Original English Language) is left-to-right\n if (seriesType === \"oel\") {\n return \"ltr\";\n }\n\n // Fall back to country-based detection\n if (country) {\n const countryLower = country.toLowerCase();\n if (countryLower === \"jp\" || countryLower === \"japan\") return \"rtl\";\n if (countryLower === \"kr\" || countryLower === \"korea\" || countryLower === \"south korea\")\n return \"ltr\";\n if (countryLower === \"cn\" || countryLower === \"china\") return \"ltr\";\n if (countryLower === \"tw\" || countryLower === \"taiwan\") return \"ltr\";\n }\n\n return undefined;\n}\n\n/**\n * Map a MangaBaka series to a protocol SearchResult\n */\nexport function mapSearchResult(series: MbSeries): SearchResult {\n // Get cover URL - prefer x250 for search results\n const coverUrl = series.cover?.x250?.x1 ?? series.cover?.raw?.url ?? undefined;\n\n // Build alternate titles array\n const alternateTitles: string[] = [];\n if (series.native_title && series.native_title !== series.title) {\n alternateTitles.push(series.native_title);\n }\n if (series.romanized_title && series.romanized_title !== series.title) {\n alternateTitles.push(series.romanized_title);\n }\n\n // Note: relevanceScore is omitted - the API already returns results in relevance order\n const previewAuthors = [...new Set([...(series.authors ?? []), ...(series.artists ?? [])])].slice(\n 0,\n 3,\n );\n\n return {\n externalId: String(series.id),\n title: series.title,\n alternateTitles,\n year: series.year ?? undefined,\n coverUrl: coverUrl ?? undefined,\n preview: {\n status: mapStatus(series.status),\n genres: (series.genres ?? []).slice(0, 3).map(formatGenre),\n rating: extractRating(series.rating),\n description: stripHtml(series.description)?.slice(0, 200) ?? undefined,\n bookCount: parseVolumeCount(series.final_volume),\n authors: previewAuthors.length > 0 ? previewAuthors : undefined,\n format: series.type ?? undefined,\n },\n };\n}\n\n/**\n * Map full series response to protocol PluginSeriesMetadata\n */\nexport function mapSeriesMetadata(series: MbSeries): PluginSeriesMetadata {\n // Build alternate titles array with language info\n const alternateTitles: AlternateTitle[] = [];\n\n // Add native title\n if (series.native_title && series.native_title !== series.title) {\n alternateTitles.push({\n title: series.native_title,\n language: detectLanguageFromCountry(series.country_of_origin),\n titleType: \"native\",\n });\n }\n\n // Add romanized title\n if (series.romanized_title && series.romanized_title !== series.title) {\n alternateTitles.push({\n title: series.romanized_title,\n language: \"en\",\n titleType: \"romaji\",\n });\n }\n\n // Add secondary titles from all languages\n if (series.secondary_titles) {\n for (const [langCode, titleList] of Object.entries(series.secondary_titles)) {\n if (titleList) {\n for (const titleEntry of titleList) {\n if (titleEntry.title !== series.title) {\n alternateTitles.push({\n title: titleEntry.title,\n language: langCode,\n });\n }\n }\n }\n }\n }\n\n // Extract authors and artists \u2014 merge into unified BookAuthor array\n // Authors get \"author\" role (generic default), artists get \"illustrator\" role\n // Deduplicate: if someone is both author and artist, keep them as \"author\"\n const authorNames = new Set((series.authors ?? []).map((n) => n));\n const authors: BookAuthor[] = (series.authors ?? []).map((name) => ({\n name,\n role: \"author\" as const,\n }));\n for (const name of series.artists ?? []) {\n if (!authorNames.has(name)) {\n authors.push({ name, role: \"illustrator\" as const });\n }\n }\n\n // Format genres\n const genres = (series.genres ?? []).map(formatGenre);\n\n // Get cover URL - prefer raw for full metadata\n const coverUrl = series.cover?.raw?.url ?? series.cover?.x350?.x1 ?? undefined;\n\n // Build external links from sources\n // Always include MangaBaka link first\n const externalLinks: ExternalLink[] = [\n {\n url: `https://mangabaka.org/${series.id}`,\n label: \"MangaBaka\",\n linkType: \"provider\",\n },\n ];\n\n // Source configuration: display name, rating key, and URL pattern\n // URL pattern uses {id} as placeholder for the source ID\n const sourceConfig: Record<string, { label: string; ratingKey: string; urlPattern?: string }> = {\n anilist: {\n label: \"AniList\",\n ratingKey: \"anilist\",\n urlPattern: \"https://anilist.co/manga/{id}\",\n },\n my_anime_list: {\n label: \"MyAnimeList\",\n ratingKey: \"myanimelist\",\n urlPattern: \"https://myanimelist.net/manga/{id}\",\n },\n mangadex: {\n label: \"MangaDex\",\n ratingKey: \"mangadex\",\n urlPattern: \"https://mangadex.org/title/{id}\",\n },\n manga_updates: {\n label: \"MangaUpdates\",\n ratingKey: \"mangaupdates\",\n urlPattern: \"https://www.mangaupdates.com/series/{id}\",\n },\n kitsu: { label: \"Kitsu\", ratingKey: \"kitsu\", urlPattern: \"https://kitsu.app/manga/{id}\" },\n anime_planet: {\n label: \"Anime-Planet\",\n ratingKey: \"animeplanet\",\n urlPattern: \"https://www.anime-planet.com/manga/{id}\",\n },\n anime_news_network: { label: \"Anime News Network\", ratingKey: \"animenewsnetwork\" },\n shikimori: {\n label: \"Shikimori\",\n ratingKey: \"shikimori\",\n urlPattern: \"https://shikimori.one/mangas/{id}\",\n },\n };\n\n // Build external links, ratings, and cross-reference IDs from sources in a single pass\n const externalRatings: ExternalRating[] = [];\n const externalIds: ExternalId[] = [\n // Always include the plugin's own API ID so other plugins can cross-reference\n { source: \"api:mangabaka\", externalId: String(series.id) },\n ];\n\n if (series.source) {\n for (const [key, info] of Object.entries(series.source)) {\n if (!info) continue;\n\n const config = sourceConfig[key];\n // Use config if available, otherwise generate defaults from key\n const ratingKey = config?.ratingKey ?? key.replace(/_/g, \"\");\n\n // Add cross-reference external ID with api: prefix\n if (info.id != null) {\n externalIds.push({\n source: `api:${ratingKey}`,\n externalId: String(info.id),\n });\n }\n\n // Add external link if source has an ID and URL pattern\n if (info.id != null && config?.urlPattern) {\n externalLinks.push({\n url: config.urlPattern.replace(\"{id}\", String(info.id)),\n label: config.label,\n linkType: \"provider\",\n });\n }\n\n // Add external rating if source has a normalized rating\n if (info.rating_normalized != null) {\n externalRatings.push({ score: info.rating_normalized, source: ratingKey });\n }\n }\n }\n\n // Get publisher name (pick first one if available)\n const publisher = series.publishers?.[0]?.name ?? undefined;\n\n const totalVolumeCount = parseVolumeCount(series.final_volume);\n const totalChapterCount = parseChapterCount(series.total_chapters);\n\n return {\n externalId: String(series.id),\n externalUrl: `https://mangabaka.org/${series.id}`,\n title: series.title,\n alternateTitles,\n summary: stripHtml(series.description),\n status: mapStatus(series.status),\n year: series.year ?? undefined,\n // Extended metadata\n publisher,\n totalVolumeCount,\n totalChapterCount,\n ageRating: mapContentRating(series.content_rating),\n readingDirection: inferReadingDirection(series.type, series.country_of_origin),\n // Taxonomy\n genres,\n tags: series.tags ?? [],\n authors,\n artists: [],\n coverUrl: coverUrl ?? undefined,\n rating: (() => {\n const r = extractRating(series.rating);\n return r != null ? { score: r, source: \"mangabaka\" } : undefined;\n })(),\n externalRatings: externalRatings.length > 0 ? externalRatings : undefined,\n externalLinks,\n externalIds,\n };\n}\n", "import {\n type MetadataGetParams,\n NotFoundError,\n type PluginSeriesMetadata,\n} from \"@ashdev/codex-plugin-sdk\";\nimport type { MangaBakaClient } from \"../api.js\";\nimport { mapSeriesMetadata } from \"../mappers.js\";\n\nexport async function handleGet(\n params: MetadataGetParams,\n client: MangaBakaClient,\n): Promise<PluginSeriesMetadata> {\n const seriesId = Number.parseInt(params.externalId, 10);\n\n if (Number.isNaN(seriesId)) {\n throw new NotFoundError(`Invalid external ID: ${params.externalId}`);\n }\n\n const response = await client.getSeries(seriesId);\n\n return mapSeriesMetadata(response);\n}\n", "/**\n * Calculate string similarity using word overlap and containment scoring\n * Returns a value between 0 and 1\n */\nexport function similarity(a: string, b: string): number {\n const aLower = a.toLowerCase().trim();\n const bLower = b.toLowerCase().trim();\n\n if (aLower === bLower) return 1.0;\n if (aLower.length === 0 || bLower.length === 0) return 0;\n\n let score = 0;\n\n // Containment check with length-ratio penalty\n // Prevents short queries like \"Air\" from matching \"Air Gear\" too strongly\n const shorter = aLower.length <= bLower.length ? aLower : bLower;\n const longer = aLower.length <= bLower.length ? bLower : aLower;\n\n if (longer.includes(shorter)) {\n const lengthRatio = shorter.length / longer.length;\n score = Math.max(score, 0.8 * lengthRatio);\n }\n\n // Word overlap scoring (Jaccard similarity)\n const aWords = new Set(aLower.split(/\\s+/));\n const bWords = new Set(bLower.split(/\\s+/));\n const intersection = [...aWords].filter((w) => bWords.has(w));\n const union = new Set([...aWords, ...bWords]);\n\n if (union.size > 0) {\n score = Math.max(score, intersection.length / union.size);\n }\n\n return score;\n}\n", "import {\n createLogger,\n type MetadataMatchParams,\n type MetadataMatchResponse,\n type SearchResult,\n} from \"@ashdev/codex-plugin-sdk\";\nimport type { MangaBakaClient } from \"../api.js\";\nimport { mapSearchResult } from \"../mappers.js\";\nimport { similarity } from \"../similarity.js\";\n\nconst logger = createLogger({ name: \"mangabaka-match\", level: \"info\" });\n\n/**\n * Score a search result against the match parameters\n * Returns a value between 0 and 1\n */\nexport function scoreResult(result: SearchResult, params: MetadataMatchParams): number {\n let score = 0;\n\n // Find best title similarity across primary and alternate titles\n let bestTitleSimilarity = similarity(result.title, params.title);\n for (const alt of result.alternateTitles) {\n bestTitleSimilarity = Math.max(bestTitleSimilarity, similarity(alt, params.title));\n }\n\n // Title similarity (up to 0.6)\n score += bestTitleSimilarity * 0.6;\n\n // Year match (up to 0.2)\n if (params.year && result.year) {\n if (result.year === params.year) {\n score += 0.2;\n } else if (Math.abs(result.year - params.year) <= 1) {\n score += 0.1;\n }\n }\n\n // Boost for exact title match across primary and alternate titles (up to 0.2)\n const searchLower = params.title.toLowerCase();\n const hasExactMatch =\n result.title.toLowerCase() === searchLower ||\n result.alternateTitles.some((alt) => alt.toLowerCase() === searchLower);\n\n if (hasExactMatch) {\n score += 0.2;\n }\n\n return Math.min(1.0, score);\n}\n\nexport async function handleMatch(\n params: MetadataMatchParams,\n client: MangaBakaClient,\n): Promise<MetadataMatchResponse> {\n logger.debug(`Matching: \"${params.title}\"`);\n\n // Search for the title\n const response = await client.search(params.title, 1, 10);\n\n if (response.data.length === 0) {\n return {\n match: null,\n confidence: 0,\n };\n }\n\n // Map and score results\n const scoredResults = response.data\n .map((series) => {\n const result = mapSearchResult(series);\n const score = scoreResult(result, params);\n return { result, score };\n })\n .sort((a, b) => b.score - a.score);\n\n const best = scoredResults[0];\n\n if (!best) {\n return {\n match: null,\n confidence: 0,\n };\n }\n\n // If confidence is low, include alternatives\n const alternatives =\n best.score < 0.8\n ? scoredResults.slice(1, 4).map((s) => ({\n ...s.result,\n relevanceScore: s.score,\n }))\n : undefined;\n\n return {\n match: {\n ...best.result,\n relevanceScore: best.score,\n },\n confidence: best.score,\n alternatives,\n };\n}\n", "import {\n createLogger,\n type MetadataSearchParams,\n type MetadataSearchResponse,\n type SearchResult,\n} from \"@ashdev/codex-plugin-sdk\";\nimport type { MangaBakaClient } from \"../api.js\";\nimport { mapSearchResult } from \"../mappers.js\";\nimport { similarity } from \"../similarity.js\";\n\nconst logger = createLogger({ name: \"mangabaka-search\", level: \"debug\" });\n\n/** MangaBaka API enforces a maximum of 50 results per request */\nconst MAX_LIMIT = 50;\n\n/**\n * Score a search result against the query using title similarity.\n * Checks both primary title and alternate titles, returning the best score.\n */\nexport function scoreSearchResult(result: SearchResult, query: string): number {\n let best = similarity(result.title, query);\n for (const alt of result.alternateTitles) {\n best = Math.max(best, similarity(alt, query));\n }\n return best;\n}\n\nexport async function handleSearch(\n params: MetadataSearchParams,\n client: MangaBakaClient,\n): Promise<MetadataSearchResponse> {\n logger.debug(\"Search params received:\", params);\n\n const limit = Math.min(params.limit ?? 20, MAX_LIMIT);\n\n // Parse cursor as page number (default to 1)\n const page = params.cursor ? Number.parseInt(params.cursor, 10) : 1;\n\n logger.debug(`Searching for: \"${params.query}\" (page ${page}, limit ${limit})`);\n\n const response = await client.search(params.query, page, limit);\n\n // Map results and score by similarity to the search query\n const results = response.data\n .map((series) => {\n const result = mapSearchResult(series);\n result.relevanceScore = scoreSearchResult(result, params.query);\n return result;\n })\n .sort((a, b) => (b.relevanceScore ?? 0) - (a.relevanceScore ?? 0));\n\n // Calculate next cursor (next page number) if there are more results\n const hasNextPage = response.page < response.totalPages;\n const nextCursor = hasNextPage ? String(response.page + 1) : undefined;\n\n return {\n results,\n nextCursor,\n };\n}\n", "{\n \"name\": \"@ashdev/codex-plugin-metadata-mangabaka\",\n \"version\": \"1.19.0\",\n \"description\": \"MangaBaka metadata provider plugin for Codex\",\n \"main\": \"dist/index.js\",\n \"bin\": \"dist/index.js\",\n \"type\": \"module\",\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/AshDevFr/codex.git\",\n \"directory\": \"plugins/metadata-mangabaka\"\n },\n \"scripts\": {\n \"build\": \"esbuild src/index.ts --bundle --platform=node --target=node22 --format=esm --outfile=dist/index.js --sourcemap --banner:js='#!/usr/bin/env node'\",\n \"dev\": \"npm run build -- --watch\",\n \"clean\": \"rm -rf dist\",\n \"start\": \"node dist/index.js\",\n \"lint\": \"biome check .\",\n \"lint:fix\": \"biome check --write .\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"prepublishOnly\": \"npm run lint && npm run build\"\n },\n \"keywords\": [\n \"codex\",\n \"plugin\",\n \"mangabaka\",\n \"manga\",\n \"metadata\"\n ],\n \"author\": \"Codex\",\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"dependencies\": {\n \"@ashdev/codex-plugin-sdk\": \"^1.19.0\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.4.4\",\n \"@types/node\": \"^22.0.0\",\n \"esbuild\": \"^0.27.3\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.0.18\"\n }\n}\n", "import type { MetadataContentType, PluginManifest } from \"@ashdev/codex-plugin-sdk\";\nimport packageJson from \"../package.json\" with { type: \"json\" };\n\nexport const manifest = {\n name: \"metadata-mangabaka\",\n displayName: \"MangaBaka Metadata\",\n version: packageJson.version,\n description: \"Fetch manga metadata from MangaBaka - aggregated data from multiple sources\",\n author: \"Codex\",\n homepage: \"https://mangabaka.org\",\n protocolVersion: \"1.1\",\n capabilities: {\n metadataProvider: [\"series\"] as MetadataContentType[],\n },\n requiredCredentials: [\n {\n key: \"api_key\",\n label: \"API Key\",\n description: \"Get your API key at https://mangabaka.org/settings/api (requires account)\",\n required: true,\n sensitive: true,\n type: \"password\",\n placeholder: \"mb-...\",\n },\n ],\n searchURITemplate: \"https://mangabaka.org/search?sort_by=popularity_asc&q=<title>\",\n configSchema: {\n description: \"Optional configuration for the MangaBaka plugin\",\n fields: [\n {\n key: \"timeout\",\n label: \"Request Timeout\",\n description: \"HTTP request timeout in seconds for API calls to MangaBaka\",\n type: \"number\",\n required: false,\n default: 60,\n example: 30,\n },\n {\n key: \"sort_by\",\n label: \"Search Sort Order\",\n description:\n \"How the MangaBaka API sorts search results. Valid values: relevance_desc (default), popularity_asc (recommended - surfaces well-known series), popularity_desc, title_asc, title_desc, created_at_desc, created_at_asc\",\n type: \"string\",\n required: false,\n default: \"relevance_desc\",\n example: \"popularity_asc\",\n },\n ],\n },\n} as const satisfies PluginManifest & {\n capabilities: { metadataProvider: MetadataContentType[] };\n};\n", "/**\n * MangaBaka Plugin - Fetch manga metadata from MangaBaka\n *\n * MangaBaka aggregates metadata from multiple sources (AniList, MAL, MangaDex, etc.)\n * and provides a unified API for manga/novel metadata.\n *\n * API docs: https://mangabaka.org/api\n *\n * Credentials are provided by Codex via the initialize message.\n * Required credential: api_key (get one at https://mangabaka.org/settings/api)\n */\n\nimport {\n ConfigError,\n createLogger,\n createMetadataPlugin,\n type InitializeParams,\n type MetadataProvider,\n} from \"@ashdev/codex-plugin-sdk\";\nimport { MangaBakaClient } from \"./api.js\";\nimport { handleGet } from \"./handlers/get.js\";\nimport { handleMatch } from \"./handlers/match.js\";\nimport { handleSearch } from \"./handlers/search.js\";\nimport { manifest } from \"./manifest.js\";\n\nconst logger = createLogger({ name: \"mangabaka\", level: \"info\" });\n\n// Client is initialized when we receive credentials from Codex\nlet client: MangaBakaClient | null = null;\n\nfunction getClient(): MangaBakaClient {\n if (!client) {\n throw new ConfigError(\"Plugin not initialized - missing API key\");\n }\n return client;\n}\n\n// Create the MetadataProvider implementation\nconst provider: MetadataProvider = {\n async search(params) {\n return handleSearch(params, getClient());\n },\n\n async get(params) {\n return handleGet(params, getClient());\n },\n\n async match(params) {\n return handleMatch(params, getClient());\n },\n};\n\n// Start the plugin server\ncreateMetadataPlugin({\n manifest,\n provider,\n logLevel: \"info\",\n onInitialize(params: InitializeParams) {\n const apiKey = params.credentials?.api_key;\n if (!apiKey) {\n throw new ConfigError(\"api_key credential is required\");\n }\n\n // Get optional config from admin settings\n const timeout = params.adminConfig?.timeout as number | undefined;\n const sortBy = params.adminConfig?.sort_by as string | undefined;\n\n client = new MangaBakaClient(apiKey, { timeout, sortBy });\n logger.info(\n `MangaBaka client initialized (timeout: ${timeout ?? \"default\"}s, sortBy: ${sortBy ?? \"default\"})`,\n );\n },\n});\n\nlogger.info(\"MangaBaka plugin started\");\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["manifest", "logger", "response", "provider", "client", "logger", "client", "logger", "client", "logger"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ashdev/codex-plugin-metadata-mangabaka",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.19.0",
|
|
4
4
|
"description": "MangaBaka metadata provider plugin for Codex",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": "dist/index.js",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"node": ">=22.0.0"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@ashdev/codex-plugin-sdk": "^1.
|
|
42
|
+
"@ashdev/codex-plugin-sdk": "^1.19.0"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@biomejs/biome": "^2.4.4",
|