From 9469fff6ac4cd95bdb99a0c37b763c6c32af392f Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Thu, 10 Oct 2024 13:48:50 -0500 Subject: [PATCH] Rename translation variables from _ENDPOINT to _BASE_URL --- src/config.ts | 12 +++--- src/middleware/translatorMiddleware.ts | 37 +++++++------------ src/translators/DeepLTranslator.test.ts | 19 ++++++---- src/translators/DeepLTranslator.ts | 37 +++++++++---------- .../LibreTranslateTranslator.test.ts | 19 ++++++---- src/translators/LibreTranslateTranslator.ts | 16 +++----- src/translators/translator.ts | 3 +- 7 files changed, 66 insertions(+), 77 deletions(-) diff --git a/src/config.ts b/src/config.ts index 0e4fc816..806fe196 100644 --- a/src/config.ts +++ b/src/config.ts @@ -276,19 +276,19 @@ class Conf { return Deno.env.get('TRANSLATION_PROVIDER'); } /** DeepL URL endpoint. */ - static get deepLendpoint(): string | undefined { - return Deno.env.get('DEEPL_ENDPOINT'); + static get deeplBaseUrl(): string | undefined { + return Deno.env.get('DEEPL_BASE_URL'); } /** DeepL API KEY. */ - static get deepLapiKey(): string | undefined { + static get deeplApiKey(): string | undefined { return Deno.env.get('DEEPL_API_KEY'); } /** LibreTranslate URL endpoint. */ - static get libreTranslateEndpoint(): string | undefined { - return Deno.env.get('LIBRETRANSLATE_ENDPOINT'); + static get libretranslateBaseUrl(): string | undefined { + return Deno.env.get('LIBRETRANSLATE_BASE_URL'); } /** LibreTranslate API KEY. */ - static get libreTranslateApiKey(): string | undefined { + static get libretranslateApiKey(): string | undefined { return Deno.env.get('LIBRETRANSLATE_API_KEY'); } /** Cache settings. */ diff --git a/src/middleware/translatorMiddleware.ts b/src/middleware/translatorMiddleware.ts index b8a07686..f5a6baa2 100644 --- a/src/middleware/translatorMiddleware.ts +++ b/src/middleware/translatorMiddleware.ts @@ -6,33 +6,22 @@ import { LibreTranslateTranslator } from '@/translators/LibreTranslateTranslator /** Set the translator used for translating posts. */ export const translatorMiddleware: AppMiddleware = async (c, next) => { - const deepLendpoint = Conf.deepLendpoint; - const deepLapiKey = Conf.deepLapiKey; - const libreTranslateEndpoint = Conf.libreTranslateEndpoint; - const libreTranslateApiKey = Conf.libreTranslateApiKey; - const translationProvider = Conf.translationProvider; + switch (Conf.translationProvider) { + case 'deepl': { + const { deeplApiKey: apiKey, deeplBaseUrl: baseUrl } = Conf; + if (apiKey) { + c.set('translator', new DeepLTranslator({ baseUrl, apiKey, fetch: fetchWorker })); + } + break; + } - switch (translationProvider) { - case 'deepl': - if (deepLapiKey) { - c.set( - 'translator', - new DeepLTranslator({ endpoint: deepLendpoint, apiKey: deepLapiKey, fetch: fetchWorker }), - ); - } - break; - case 'libretranslate': - if (libreTranslateApiKey) { - c.set( - 'translator', - new LibreTranslateTranslator({ - endpoint: libreTranslateEndpoint, - apiKey: libreTranslateApiKey, - fetch: fetchWorker, - }), - ); + case 'libretranslate': { + const { libretranslateApiKey: apiKey, libretranslateBaseUrl: baseUrl } = Conf; + if (apiKey) { + c.set('translator', new LibreTranslateTranslator({ baseUrl, apiKey, fetch: fetchWorker })); } break; + } } await next(); diff --git a/src/translators/DeepLTranslator.test.ts b/src/translators/DeepLTranslator.test.ts index 385c10fc..d78c0a0a 100644 --- a/src/translators/DeepLTranslator.test.ts +++ b/src/translators/DeepLTranslator.test.ts @@ -4,15 +4,18 @@ import { Conf } from '@/config.ts'; import { DeepLTranslator } from '@/translators/DeepLTranslator.ts'; import { getLanguage } from '@/test.ts'; -const endpoint = Conf.deepLendpoint; -const apiKey = Conf.deepLapiKey; -const translationProvider = Conf.translationProvider; -const deepL = 'deepl'; +const { + deeplBaseUrl: baseUrl, + deeplApiKey: apiKey, + translationProvider, +} = Conf; + +const deepl = 'deepl'; Deno.test('DeepL translation with source language omitted', { - ignore: !(translationProvider === deepL && apiKey), + ignore: !(translationProvider === deepl && apiKey), }, async () => { - const translator = new DeepLTranslator({ fetch: fetch, endpoint, apiKey: apiKey as string }); + const translator = new DeepLTranslator({ fetch: fetch, baseUrl, apiKey: apiKey! }); const data = await translator.translate( [ @@ -31,9 +34,9 @@ Deno.test('DeepL translation with source language omitted', { }); Deno.test('DeepL translation with source language set', { - ignore: !(translationProvider === deepL && apiKey), + ignore: !(translationProvider === deepl && apiKey), }, async () => { - const translator = new DeepLTranslator({ fetch: fetch, endpoint, apiKey: apiKey as string }); + const translator = new DeepLTranslator({ fetch: fetch, baseUrl, apiKey: apiKey as string }); const data = await translator.translate( [ diff --git a/src/translators/DeepLTranslator.ts b/src/translators/DeepLTranslator.ts index f30d414a..2b4da175 100644 --- a/src/translators/DeepLTranslator.ts +++ b/src/translators/DeepLTranslator.ts @@ -5,8 +5,8 @@ import { DittoTranslator, SourceLanguage, TargetLanguage } from '@/translators/t import { languageSchema } from '@/schema.ts'; interface DeepLTranslatorOpts { - /** DeepL endpoint to use. Default: 'https://api.deepl.com' */ - endpoint?: string; + /** DeepL base URL to use. Default: 'https://api.deepl.com' */ + baseUrl?: string; /** DeepL API key. */ apiKey: string; /** Custom fetch implementation. */ @@ -14,13 +14,14 @@ interface DeepLTranslatorOpts { } export class DeepLTranslator implements DittoTranslator { - private readonly endpoint: string; + private readonly baseUrl: string; private readonly apiKey: string; private readonly fetch: typeof fetch; - private static provider = 'DeepL.com'; + + readonly provider = 'DeepL.com'; constructor(opts: DeepLTranslatorOpts) { - this.endpoint = opts.endpoint ?? 'https://api.deepl.com'; + this.baseUrl = opts.baseUrl ?? 'https://api.deepl.com'; this.fetch = opts.fetch ?? globalThis.fetch; this.apiKey = opts.apiKey; } @@ -31,11 +32,11 @@ export class DeepLTranslator implements DittoTranslator { dest: TargetLanguage, opts?: { signal?: AbortSignal }, ) { - const data = (await this.translateMany(texts, source, dest, opts)).translations; + const { translations } = await this.translateMany(texts, source, dest, opts); return { - results: data.map((value) => value.text), - source_lang: data[0].detected_source_language as LanguageCode, + results: translations.map((value) => value.text), + source_lang: translations[0]?.detected_source_language as LanguageCode, }; } @@ -56,25 +57,26 @@ export class DeepLTranslator implements DittoTranslator { body.source_lang = source.toUpperCase(); } - const headers = new Headers(); - headers.append('Authorization', 'DeepL-Auth-Key' + ' ' + this.apiKey); - headers.append('Content-Type', 'application/json'); + const url = new URL('/v2/translate', this.baseUrl); - const request = new Request(this.endpoint + '/v2/translate', { + const request = new Request(url, { method: 'POST', body: JSON.stringify(body), - headers, + headers: { + 'Authorization': `DeepL-Auth-Key ${this.apiKey}`, + 'Content-Type': 'application/json', + }, signal: opts?.signal, }); const response = await this.fetch(request); const json = await response.json(); + if (!response.ok) { throw new Error(json['message']); } - const data = DeepLTranslator.schema().parse(json); - return data; + return DeepLTranslator.schema().parse(json); } /** DeepL response schema. @@ -89,9 +91,4 @@ export class DeepLTranslator implements DittoTranslator { ), }); } - - /** DeepL provider. */ - getProvider(): string { - return DeepLTranslator.provider; - } } diff --git a/src/translators/LibreTranslateTranslator.test.ts b/src/translators/LibreTranslateTranslator.test.ts index 6b87cc91..edda3039 100644 --- a/src/translators/LibreTranslateTranslator.test.ts +++ b/src/translators/LibreTranslateTranslator.test.ts @@ -4,15 +4,18 @@ import { Conf } from '@/config.ts'; import { LibreTranslateTranslator } from '@/translators/LibreTranslateTranslator.ts'; import { getLanguage } from '@/test.ts'; -const endpoint = Conf.libreTranslateEndpoint; -const apiKey = Conf.libreTranslateApiKey; -const translationProvider = Conf.translationProvider; -const libreTranslate = 'libretranslate'; +const { + libretranslateBaseUrl: baseUrl, + libretranslateApiKey: apiKey, + translationProvider, +} = Conf; + +const libretranslate = 'libretranslate'; Deno.test('LibreTranslate translation with source language omitted', { - ignore: !(translationProvider === libreTranslate && apiKey), + ignore: !(translationProvider === libretranslate && apiKey), }, async () => { - const translator = new LibreTranslateTranslator({ fetch: fetch, endpoint, apiKey: apiKey as string }); + const translator = new LibreTranslateTranslator({ fetch: fetch, baseUrl, apiKey: apiKey! }); const data = await translator.translate( [ @@ -31,9 +34,9 @@ Deno.test('LibreTranslate translation with source language omitted', { }); Deno.test('LibreTranslate translation with source language set', { - ignore: !(translationProvider === libreTranslate && apiKey), + ignore: !(translationProvider === libretranslate && apiKey), }, async () => { - const translator = new LibreTranslateTranslator({ fetch: fetch, endpoint, apiKey: apiKey as string }); + const translator = new LibreTranslateTranslator({ fetch: fetch, baseUrl, apiKey: apiKey! }); const data = await translator.translate( [ diff --git a/src/translators/LibreTranslateTranslator.ts b/src/translators/LibreTranslateTranslator.ts index 2c201575..bd2850ff 100644 --- a/src/translators/LibreTranslateTranslator.ts +++ b/src/translators/LibreTranslateTranslator.ts @@ -6,7 +6,7 @@ import { languageSchema } from '@/schema.ts'; interface LibreTranslateTranslatorOpts { /** Libretranslate endpoint to use. Default: 'https://libretranslate.com' */ - endpoint?: string; + baseUrl?: string; /** Libretranslate API key. */ apiKey: string; /** Custom fetch implementation. */ @@ -14,13 +14,14 @@ interface LibreTranslateTranslatorOpts { } export class LibreTranslateTranslator implements DittoTranslator { - private readonly endpoint: string; + private readonly baseUrl: string; private readonly apiKey: string; private readonly fetch: typeof fetch; - private static provider = 'libretranslate.com'; + + readonly provider = 'libretranslate.com'; constructor(opts: LibreTranslateTranslatorOpts) { - this.endpoint = opts.endpoint ?? 'https://libretranslate.com'; + this.baseUrl = opts.baseUrl ?? 'https://libretranslate.com'; this.fetch = opts.fetch ?? globalThis.fetch; this.apiKey = opts.apiKey; } @@ -59,7 +60,7 @@ export class LibreTranslateTranslator implements DittoTranslator { const headers = new Headers(); headers.append('Content-Type', 'application/json'); - const request = new Request(this.endpoint + '/translate', { + const request = new Request(new URL('/translate', this.baseUrl), { method: 'POST', body: JSON.stringify(body), headers, @@ -87,9 +88,4 @@ export class LibreTranslateTranslator implements DittoTranslator { }).optional(), }); } - - /** LibreTranslate provider. */ - getProvider(): string { - return LibreTranslateTranslator.provider; - } } diff --git a/src/translators/translator.ts b/src/translators/translator.ts index 98adf5ee..df3c7929 100644 --- a/src/translators/translator.ts +++ b/src/translators/translator.ts @@ -41,7 +41,8 @@ export interface DittoTranslator { /** Custom options. */ opts?: { signal?: AbortSignal }, ): Promise<{ results: string[]; source_lang: SourceLanguage }>; - getProvider(): string; + /** Provider name, eg `DeepL.com` */ + provider: string; } /** Includes the TARGET language and the status id.