@deeplx/core 0.1.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/README.md ADDED
@@ -0,0 +1,124 @@
1
+ # @deeplx/core
2
+
3
+ [![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/un-ts/deeplx/ci.yml?branch=master)](https://github.com/un-ts/deeplx/actions/workflows/ci.yml?query=branch%3Amaster)
4
+ [![Codecov](https://img.shields.io/codecov/c/github/un-ts/deeplx.svg)](https://codecov.io/gh/un-ts/deeplx)
5
+ [![Codacy Grade](https://img.shields.io/codacy/grade/e3d752491a664d889c5bdfb6ffeb6cbb)](https://app.codacy.com/gh/un-ts/deeplx)
6
+ [![type-coverage](https://img.shields.io/badge/dynamic/json.svg?label=type-coverage&prefix=%E2%89%A5&suffix=%&query=$.typeCoverage.atLeast&uri=https%3A%2F%2Fraw.githubusercontent.com%2Frx-ts%2Fdeeplx%2Fmaster%2Fpackage.json)](https://github.com/plantain-00/type-coverage)
7
+ [![CodeRabbit Pull Request Reviews](https://img.shields.io/coderabbit/prs/github/un-ts/deeplx)](https://coderabbit.ai)
8
+ [![npm](https://img.shields.io/npm/v/@deeplx/core.svg)](https://www.npmjs.com/package/@deeplx/core)
9
+ [![GitHub Release](https://img.shields.io/github/release/un-ts/deeplx)](https://github.com/un-ts/deeplx/releases)
10
+
11
+ [![Conventional Commits](https://img.shields.io/badge/conventional%20commits-1.0.0-yellow.svg)](https://conventionalcommits.org)
12
+ [![Renovate enabled](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://renovatebot.com)
13
+ [![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)
14
+ [![Code Style: Prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier)
15
+ [![changesets](https://img.shields.io/badge/maintained%20with-changesets-176de3.svg)](https://github.com/atlassian/changesets)
16
+
17
+ An unofficial Node package to translate text using [DeepL](https://www.deepl.com) by porting [OwO-Network/DeepLX](https://github.com/OwO-Network/DeepLX).
18
+
19
+ ## Online Service
20
+
21
+ <https://deeplx.vercel.app/translate>
22
+
23
+ ## Installation
24
+
25
+ ```sh
26
+ # npm
27
+ npm i @deeplx/core
28
+
29
+ # pnpm
30
+ pnpm add @deeplx/core
31
+
32
+ # yarn
33
+ yarn add @deeplx/core
34
+ ```
35
+
36
+ ## Usage
37
+
38
+ ### Supported languages
39
+
40
+ Currently the following languages are supported:
41
+
42
+ | Abbreviation | Language | Writing in own language |
43
+ | ------------ | ---------- | ----------------------- |
44
+ | BG | Bulgarian | Български |
45
+ | ZH | Chinese | 中文 |
46
+ | CS | Czech | Česky |
47
+ | DA | Danish | Dansk |
48
+ | NL | Dutch | Nederlands |
49
+ | EN | English | English |
50
+ | ET | Estonian | Eesti |
51
+ | FI | Finnish | Suomi |
52
+ | FR | French | Français |
53
+ | DE | German | Deutsch |
54
+ | EL | Greek | Ελληνικά |
55
+ | HU | Hungarian | Magyar |
56
+ | IT | Italian | Italiano |
57
+ | JA | Japanese | 日本語 |
58
+ | LV | Latvian | Latviešu |
59
+ | LT | Lithuanian | Lietuvių |
60
+ | PL | Polish | Polski |
61
+ | PT | Portuguese | Português |
62
+ | RO | Romanian | Română |
63
+ | RU | Russian | Русский |
64
+ | SK | Slovak | Slovenčina |
65
+ | SL | Slovenian | Slovenščina |
66
+ | ES | Spanish | Español |
67
+ | SV | Swedish | Svenska |
68
+ | UK | Ukrainian | Українська Мова |
69
+
70
+ You can either input the abbreviation or the language written in english.
71
+
72
+ ### Example 1
73
+
74
+ This will translate a Chinese (`ZH`) text into Dutch (`NL`):
75
+
76
+ ```js
77
+ import { translate } from '@deeplx/core'
78
+
79
+ await translate('你好', 'NL')
80
+ ```
81
+
82
+ ```log
83
+ 'Hallo'
84
+ ```
85
+
86
+ ### Example 2
87
+
88
+ This will translate a `danish` text into `german` in informal tone:
89
+
90
+ ```js
91
+ import { translate } from '@deeplx/core'
92
+
93
+ await translate('Ring til mig!', 'german', 'danish', false)
94
+ ```
95
+
96
+ ```log
97
+ 'Ruf mich an!'
98
+ ```
99
+
100
+ [![Sponsors](https://raw.githubusercontent.com/1stG/static/master/sponsors.svg)](https://github.com/sponsors/JounQin)
101
+
102
+ ## Sponsors
103
+
104
+ | 1stG | RxTS | UnTS |
105
+ | ---------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
106
+ | [![1stG Open Collective sponsors](https://opencollective.com/1stG/organizations.svg)](https://opencollective.com/1stG) | [![RxTS Open Collective sponsors](https://opencollective.com/rxts/organizations.svg)](https://opencollective.com/rxts) | [![UnTS Open Collective sponsors](https://opencollective.com/unts/organizations.svg)](https://opencollective.com/unts) |
107
+
108
+ ## Backers
109
+
110
+ | 1stG | RxTS | UnTS |
111
+ | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
112
+ | [![1stG Open Collective backers](https://opencollective.com/1stG/individuals.svg)](https://opencollective.com/1stG) | [![RxTS Open Collective backers](https://opencollective.com/rxts/individuals.svg)](https://opencollective.com/rxts) | [![UnTS Open Collective backers](https://opencollective.com/unts/individuals.svg)](https://opencollective.com/unts) |
113
+
114
+ ## Changelog
115
+
116
+ Detailed changes for each release are documented in [CHANGELOG.md](./CHANGELOG.md).
117
+
118
+ ## License
119
+
120
+ [MIT][] © [JounQin][]@[1stG.me][]
121
+
122
+ [1stG.me]: https://www.1stG.me
123
+ [JounQin]: https://github.com/JounQin
124
+ [MIT]: http://opensource.org/licenses/MIT
package/index.d.cts ADDED
@@ -0,0 +1,3 @@
1
+ import * as core from './lib/index.js'
2
+
3
+ export = core
package/lib/api.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import type { SourceLanguage, TargetLanguage } from './constants.ts';
2
+ export declare const translate: (text: string, targetLang: TargetLanguage, sourceLang?: SourceLanguage, formal?: boolean) => Promise<string>;
package/lib/api.js ADDED
@@ -0,0 +1,9 @@
1
+ import { translateByDeepLX } from "./translate.js";
2
+ export const translate = async (text, targetLang, sourceLang, formal) => {
3
+ const result = await translateByDeepLX(sourceLang, targetLang, text, formal);
4
+ if ('message' in result) {
5
+ throw new Error(result.message, { cause: result });
6
+ }
7
+ return result.data;
8
+ };
9
+ //# sourceMappingURL=api.js.map
package/lib/api.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAElD,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAC5B,IAAY,EACZ,UAA0B,EAC1B,UAA2B,EAC3B,MAAgB,EAChB,EAAE;IACF,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IAC5E,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAA;AACpB,CAAC,CAAA"}
@@ -0,0 +1,98 @@
1
+ import type { ValueOf } from './types.ts';
2
+ export declare const SUPPORTED_LANGUAGES: readonly [{
3
+ readonly code: "BG";
4
+ readonly language: "Bulgarian";
5
+ }, {
6
+ readonly code: "ZH";
7
+ readonly language: "Chinese";
8
+ }, {
9
+ readonly code: "CS";
10
+ readonly language: "Czech";
11
+ }, {
12
+ readonly code: "DA";
13
+ readonly language: "Danish";
14
+ }, {
15
+ readonly code: "NL";
16
+ readonly language: "Dutch";
17
+ }, {
18
+ readonly code: "EN";
19
+ readonly language: "English";
20
+ }, {
21
+ readonly code: "ET";
22
+ readonly language: "Estonian";
23
+ }, {
24
+ readonly code: "FI";
25
+ readonly language: "Finnish";
26
+ }, {
27
+ readonly code: "FR";
28
+ readonly language: "French";
29
+ }, {
30
+ readonly code: "DE";
31
+ readonly language: "German";
32
+ }, {
33
+ readonly code: "EL";
34
+ readonly language: "Greek";
35
+ }, {
36
+ readonly code: "HU";
37
+ readonly language: "Hungarian";
38
+ }, {
39
+ readonly code: "IT";
40
+ readonly language: "Italian";
41
+ }, {
42
+ readonly code: "JA";
43
+ readonly language: "Japanese";
44
+ }, {
45
+ readonly code: "LV";
46
+ readonly language: "Latvian";
47
+ }, {
48
+ readonly code: "LT";
49
+ readonly language: "Lithuanian";
50
+ }, {
51
+ readonly code: "PL";
52
+ readonly language: "Polish";
53
+ }, {
54
+ readonly code: "PT";
55
+ readonly language: "Portuguese";
56
+ }, {
57
+ readonly code: "RO";
58
+ readonly language: "Romanian";
59
+ }, {
60
+ readonly code: "RU";
61
+ readonly language: "Russian";
62
+ }, {
63
+ readonly code: "SK";
64
+ readonly language: "Slovak";
65
+ }, {
66
+ readonly code: "SL";
67
+ readonly language: "Slovenian";
68
+ }, {
69
+ readonly code: "ES";
70
+ readonly language: "Spanish";
71
+ }, {
72
+ readonly code: "SV";
73
+ readonly language: "Swedish";
74
+ }, {
75
+ readonly code: "TR";
76
+ readonly language: "Turkish";
77
+ }, {
78
+ readonly code: "ID";
79
+ readonly language: "Indonesian";
80
+ }, {
81
+ readonly code: "UK";
82
+ readonly language: "Ukrainian";
83
+ }];
84
+ export type SupportedLanguage = ValueOf<typeof SUPPORTED_LANGUAGES>;
85
+ export type SupportedCode = SupportedLanguage['code'];
86
+ export type Language = SupportedCode | SupportedLanguage['language'] | `${SupportedCode}-${string}`;
87
+ export type TargetLanguage = Language | Lowercase<Language> | Uppercase<Language>;
88
+ export type SourceLanguage = TargetLanguage | 'auto';
89
+ export declare const FORMALITY_TONES: Set<"undefined" | "formal" | "informal">;
90
+ export type FormalityTone = ValueOf<typeof FORMALITY_TONES>;
91
+ export declare const API_URL = "https://www2.deepl.com/jsonrpc";
92
+ export declare const HTTP_STATUS_OK = 200;
93
+ export declare const HTTP_STATUS_BAD_REQUEST = 400;
94
+ export declare const HTTP_STATUS_NOT_FOUND = 404;
95
+ export declare const HTTP_STATUS_NOT_ALLOWED = 405;
96
+ export declare const HTTP_STATUS_INTERNAL_ERROR = 500;
97
+ export declare const HTTP_STATUS_SERVICE_UNAVAILABLE = 503;
98
+ export declare const COMMON_HEADERS: HeadersInit;
@@ -0,0 +1,56 @@
1
+ export const SUPPORTED_LANGUAGES = [
2
+ { code: 'BG', language: 'Bulgarian' },
3
+ { code: 'ZH', language: 'Chinese' },
4
+ { code: 'CS', language: 'Czech' },
5
+ { code: 'DA', language: 'Danish' },
6
+ { code: 'NL', language: 'Dutch' },
7
+ { code: 'EN', language: 'English' },
8
+ { code: 'ET', language: 'Estonian' },
9
+ { code: 'FI', language: 'Finnish' },
10
+ { code: 'FR', language: 'French' },
11
+ { code: 'DE', language: 'German' },
12
+ { code: 'EL', language: 'Greek' },
13
+ { code: 'HU', language: 'Hungarian' },
14
+ { code: 'IT', language: 'Italian' },
15
+ { code: 'JA', language: 'Japanese' },
16
+ { code: 'LV', language: 'Latvian' },
17
+ { code: 'LT', language: 'Lithuanian' },
18
+ { code: 'PL', language: 'Polish' },
19
+ { code: 'PT', language: 'Portuguese' },
20
+ { code: 'RO', language: 'Romanian' },
21
+ { code: 'RU', language: 'Russian' },
22
+ { code: 'SK', language: 'Slovak' },
23
+ { code: 'SL', language: 'Slovenian' },
24
+ { code: 'ES', language: 'Spanish' },
25
+ { code: 'SV', language: 'Swedish' },
26
+ { code: 'TR', language: 'Turkish' },
27
+ { code: 'ID', language: 'Indonesian' },
28
+ { code: 'UK', language: 'Ukrainian' },
29
+ ];
30
+ export const FORMALITY_TONES = new Set([
31
+ 'formal',
32
+ 'informal',
33
+ 'undefined',
34
+ ]);
35
+ export const API_URL = 'https://www2.deepl.com/jsonrpc';
36
+ export const HTTP_STATUS_OK = 200;
37
+ export const HTTP_STATUS_BAD_REQUEST = 400;
38
+ export const HTTP_STATUS_NOT_FOUND = 404;
39
+ export const HTTP_STATUS_NOT_ALLOWED = 405;
40
+ export const HTTP_STATUS_INTERNAL_ERROR = 500;
41
+ export const HTTP_STATUS_SERVICE_UNAVAILABLE = 503;
42
+ export const COMMON_HEADERS = {
43
+ 'Content-Type': 'application/json',
44
+ 'User-Agent': 'DeepL/1627620 CFNetwork/3826.500.62.2.1 Darwin/24.4.0',
45
+ Accept: '*/*',
46
+ 'X-App-Os-Name': 'iOS',
47
+ 'X-App-Os-Version': '18.4.0',
48
+ 'Accept-Language': 'en-US,en;q=0.9',
49
+ 'Accept-Encoding': 'gzip, deflate, br',
50
+ 'X-App-Device': 'iPhone16,2',
51
+ Referer: 'https://www.deepl.com/',
52
+ 'X-Product': 'translator',
53
+ 'X-App-Build': '1627620',
54
+ 'X-App-Version': '25.1',
55
+ };
56
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
package/lib/index.cjs ADDED
@@ -0,0 +1,328 @@
1
+ 'use strict';
2
+
3
+ var whatlangNode = require('whatlang-node');
4
+ var xFetch = require('x-fetch');
5
+
6
+ const SUPPORTED_LANGUAGES = [
7
+ { code: "BG", language: "Bulgarian" },
8
+ { code: "ZH", language: "Chinese" },
9
+ { code: "CS", language: "Czech" },
10
+ { code: "DA", language: "Danish" },
11
+ { code: "NL", language: "Dutch" },
12
+ { code: "EN", language: "English" },
13
+ { code: "ET", language: "Estonian" },
14
+ { code: "FI", language: "Finnish" },
15
+ { code: "FR", language: "French" },
16
+ { code: "DE", language: "German" },
17
+ { code: "EL", language: "Greek" },
18
+ { code: "HU", language: "Hungarian" },
19
+ { code: "IT", language: "Italian" },
20
+ { code: "JA", language: "Japanese" },
21
+ { code: "LV", language: "Latvian" },
22
+ { code: "LT", language: "Lithuanian" },
23
+ { code: "PL", language: "Polish" },
24
+ { code: "PT", language: "Portuguese" },
25
+ { code: "RO", language: "Romanian" },
26
+ { code: "RU", language: "Russian" },
27
+ { code: "SK", language: "Slovak" },
28
+ { code: "SL", language: "Slovenian" },
29
+ { code: "ES", language: "Spanish" },
30
+ { code: "SV", language: "Swedish" },
31
+ { code: "TR", language: "Turkish" },
32
+ { code: "ID", language: "Indonesian" },
33
+ { code: "UK", language: "Ukrainian" }
34
+ ];
35
+ const FORMALITY_TONES = /* @__PURE__ */ new Set([
36
+ "formal",
37
+ "informal",
38
+ "undefined"
39
+ ]);
40
+ const API_URL = "https://www2.deepl.com/jsonrpc";
41
+ const HTTP_STATUS_OK = 200;
42
+ const HTTP_STATUS_BAD_REQUEST = 400;
43
+ const HTTP_STATUS_NOT_FOUND = 404;
44
+ const HTTP_STATUS_NOT_ALLOWED = 405;
45
+ const HTTP_STATUS_INTERNAL_ERROR = 500;
46
+ const HTTP_STATUS_SERVICE_UNAVAILABLE = 503;
47
+ const COMMON_HEADERS = {
48
+ "Content-Type": "application/json",
49
+ "User-Agent": "DeepL/1627620 CFNetwork/3826.500.62.2.1 Darwin/24.4.0",
50
+ Accept: "*/*",
51
+ "X-App-Os-Name": "iOS",
52
+ "X-App-Os-Version": "18.4.0",
53
+ "Accept-Language": "en-US,en;q=0.9",
54
+ "Accept-Encoding": "gzip, deflate, br",
55
+ // Keep this!
56
+ "X-App-Device": "iPhone16,2",
57
+ Referer: "https://www.deepl.com/",
58
+ "X-Product": "translator",
59
+ "X-App-Build": "1627620",
60
+ "X-App-Version": "25.1"
61
+ };
62
+
63
+ const getICount = (translateText) => {
64
+ return (translateText.match(/i/g) || []).length;
65
+ };
66
+ const getRandomNumber = () => {
67
+ const base = Math.floor(Math.random() * 99999) + 83e5;
68
+ return base * 1e3;
69
+ };
70
+ const getTimeStamp = (iCount) => {
71
+ const ts = Date.now();
72
+ if (iCount !== 0) {
73
+ const adjustedCount = iCount + 1;
74
+ return ts - ts % adjustedCount + adjustedCount;
75
+ }
76
+ return ts;
77
+ };
78
+ const formatPostString = (postData) => {
79
+ const postStr = JSON.stringify(postData);
80
+ const shouldAddSpace = (
81
+ // eslint-disable-next-line @typescript-eslint/no-magic-numbers
82
+ (postData.id + 5) % 29 === 0 || (postData.id + 3) % 13 === 0
83
+ );
84
+ return postStr.replaceAll(
85
+ '"method":"',
86
+ shouldAddSpace ? `"method" : "` : `"method": "`
87
+ );
88
+ };
89
+ let abbreviateLanguageDictionary;
90
+ function getAbbreviateLanguages() {
91
+ return abbreviateLanguageDictionary != null ? abbreviateLanguageDictionary : abbreviateLanguageDictionary = SUPPORTED_LANGUAGES.reduce(
92
+ (acc, lang) => {
93
+ acc[lang.code.toLowerCase()] = lang.code;
94
+ acc[lang.language.toLowerCase()] = lang.code;
95
+ return acc;
96
+ },
97
+ {}
98
+ );
99
+ }
100
+ function abbreviateLanguage(language) {
101
+ return getAbbreviateLanguages()[language.split("-")[0].toLowerCase()];
102
+ }
103
+
104
+ var __defProp = Object.defineProperty;
105
+ var __defProps = Object.defineProperties;
106
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
107
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
108
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
109
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
110
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
111
+ var __spreadValues = (a, b) => {
112
+ for (var prop in b || (b = {}))
113
+ if (__hasOwnProp.call(b, prop))
114
+ __defNormalProp(a, prop, b[prop]);
115
+ if (__getOwnPropSymbols)
116
+ for (var prop of __getOwnPropSymbols(b)) {
117
+ if (__propIsEnum.call(b, prop))
118
+ __defNormalProp(a, prop, b[prop]);
119
+ }
120
+ return a;
121
+ };
122
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
123
+ var __async$1 = (__this, __arguments, generator) => {
124
+ return new Promise((resolve, reject) => {
125
+ var fulfilled = (value) => {
126
+ try {
127
+ step(generator.next(value));
128
+ } catch (e) {
129
+ reject(e);
130
+ }
131
+ };
132
+ var rejected = (value) => {
133
+ try {
134
+ step(generator.throw(value));
135
+ } catch (e) {
136
+ reject(e);
137
+ }
138
+ };
139
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
140
+ step((generator = generator.apply(__this, __arguments)).next());
141
+ });
142
+ };
143
+ const makeRequest = (postData, _proxyUrl, dlSession) => __async$1(void 0, null, function* () {
144
+ return xFetch.fetchApi(API_URL, {
145
+ method: "POST",
146
+ body: formatPostString(postData),
147
+ headers: dlSession ? __spreadProps(__spreadValues({}, COMMON_HEADERS), { Cookie: `dl_session=${dlSession}` }) : COMMON_HEADERS
148
+ });
149
+ });
150
+ const splitAndProcess = (text) => text.split("\n").map((line) => line.trim() === "" ? "\n" : line);
151
+ const translateByDeepLX = (sourceLang, targetLang, text, formal, tagHandling = "plaintext", proxyUrl, dlSession) => __async$1(void 0, null, function* () {
152
+ var _a, _b;
153
+ if (!text) {
154
+ return { code: HTTP_STATUS_NOT_FOUND, message: "No text to translate" };
155
+ }
156
+ const textParts = splitAndProcess(text);
157
+ const translatedParts = [];
158
+ const allAlternatives = [];
159
+ for (const part of textParts) {
160
+ if (!part.trim()) {
161
+ translatedParts.push("");
162
+ allAlternatives.push([""]);
163
+ continue;
164
+ }
165
+ if (!sourceLang || sourceLang === "auto") {
166
+ sourceLang = whatlangNode.detectLang(part, true);
167
+ }
168
+ const sourceLangCode = (_a = abbreviateLanguage(sourceLang)) != null ? _a : sourceLang.toUpperCase();
169
+ const jobs = [
170
+ {
171
+ kind: "default",
172
+ preferred_num_beams: 4,
173
+ raw_en_context_before: [],
174
+ raw_en_context_after: [],
175
+ sentences: [{ prefix: "", text: part, id: 0 }]
176
+ }
177
+ ];
178
+ let hasRegionalVariant = false;
179
+ let targetLangCode = (_b = abbreviateLanguage(targetLang)) != null ? _b : targetLang.toUpperCase();
180
+ const targetLangParts = targetLang.split("-");
181
+ if (targetLangParts.length > 1) {
182
+ targetLangCode = targetLangParts[0];
183
+ hasRegionalVariant = true;
184
+ }
185
+ const id = getRandomNumber();
186
+ const postData = {
187
+ jsonrpc: "2.0",
188
+ method: "LMT_handle_jobs",
189
+ id,
190
+ params: {
191
+ commonJobParams: __spreadValues({
192
+ mode: "translate",
193
+ formality: (
194
+ // eslint-disable-next-line sonarjs/no-nested-conditional
195
+ formal == null ? "undefined" : formal ? "formal" : "informal"
196
+ ),
197
+ transcribe_as: "romanize",
198
+ advancedMode: false,
199
+ textType: tagHandling,
200
+ wasSpoken: false
201
+ }, hasRegionalVariant && { regionalVariant: targetLang }),
202
+ lang: {
203
+ source_lang_user_selected: "auto",
204
+ target_lang: targetLangCode,
205
+ source_lang_computed: sourceLangCode
206
+ },
207
+ jobs,
208
+ timestamp: getTimeStamp(getICount(part))
209
+ }
210
+ };
211
+ let translations;
212
+ try {
213
+ const { result } = yield makeRequest(postData, proxyUrl, dlSession);
214
+ translations = result.translations;
215
+ } catch (error) {
216
+ return {
217
+ code: HTTP_STATUS_SERVICE_UNAVAILABLE,
218
+ message: String(error)
219
+ };
220
+ }
221
+ let partTranslation = "";
222
+ const partAlternatives = [];
223
+ if (translations.length > 0) {
224
+ for (const translation of translations) {
225
+ partTranslation += translation.beams[0].sentences[0].text + " ";
226
+ }
227
+ partTranslation = partTranslation.trim();
228
+ const numBeams = translations[0].beams.length;
229
+ for (let i = 1; i < numBeams; i++) {
230
+ let altText = "";
231
+ for (const translation of translations) {
232
+ const beams = translation.beams;
233
+ if (i < beams.length) {
234
+ altText += beams[i].sentences[0].text + " ";
235
+ }
236
+ }
237
+ if (altText) {
238
+ partAlternatives.push(altText.trim());
239
+ }
240
+ }
241
+ }
242
+ if (!partTranslation) {
243
+ return {
244
+ code: HTTP_STATUS_SERVICE_UNAVAILABLE,
245
+ message: "Translation failed"
246
+ };
247
+ }
248
+ translatedParts.push(partTranslation);
249
+ allAlternatives.push(partAlternatives);
250
+ }
251
+ const translatedText = translatedParts.join("\n");
252
+ const combinedAlternatives = [];
253
+ let maxAlts = 0;
254
+ for (const alts of allAlternatives) {
255
+ if (alts.length > maxAlts) {
256
+ maxAlts = alts.length;
257
+ }
258
+ }
259
+ for (let i = 0; i < maxAlts; i++) {
260
+ const altParts = [];
261
+ for (const [j, alts] of allAlternatives.entries()) {
262
+ if (i < alts.length) {
263
+ altParts.push(alts[i]);
264
+ } else if (translatedParts[j].length === 0) {
265
+ altParts.push("");
266
+ } else {
267
+ altParts.push(translatedParts[j]);
268
+ }
269
+ }
270
+ combinedAlternatives.push(altParts.join("\n"));
271
+ }
272
+ return {
273
+ code: HTTP_STATUS_OK,
274
+ id: getRandomNumber(),
275
+ // Using new ID for the complete translation
276
+ data: translatedText,
277
+ alternatives: combinedAlternatives,
278
+ sourceLang,
279
+ targetLang,
280
+ method: dlSession ? "Pro" : "Free"
281
+ };
282
+ });
283
+
284
+ var __async = (__this, __arguments, generator) => {
285
+ return new Promise((resolve, reject) => {
286
+ var fulfilled = (value) => {
287
+ try {
288
+ step(generator.next(value));
289
+ } catch (e) {
290
+ reject(e);
291
+ }
292
+ };
293
+ var rejected = (value) => {
294
+ try {
295
+ step(generator.throw(value));
296
+ } catch (e) {
297
+ reject(e);
298
+ }
299
+ };
300
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
301
+ step((generator = generator.apply(__this, __arguments)).next());
302
+ });
303
+ };
304
+ const translate = (text, targetLang, sourceLang, formal) => __async(void 0, null, function* () {
305
+ const result = yield translateByDeepLX(sourceLang, targetLang, text, formal);
306
+ if ("message" in result) {
307
+ throw new Error(result.message, { cause: result });
308
+ }
309
+ return result.data;
310
+ });
311
+
312
+ exports.API_URL = API_URL;
313
+ exports.COMMON_HEADERS = COMMON_HEADERS;
314
+ exports.FORMALITY_TONES = FORMALITY_TONES;
315
+ exports.HTTP_STATUS_BAD_REQUEST = HTTP_STATUS_BAD_REQUEST;
316
+ exports.HTTP_STATUS_INTERNAL_ERROR = HTTP_STATUS_INTERNAL_ERROR;
317
+ exports.HTTP_STATUS_NOT_ALLOWED = HTTP_STATUS_NOT_ALLOWED;
318
+ exports.HTTP_STATUS_NOT_FOUND = HTTP_STATUS_NOT_FOUND;
319
+ exports.HTTP_STATUS_OK = HTTP_STATUS_OK;
320
+ exports.HTTP_STATUS_SERVICE_UNAVAILABLE = HTTP_STATUS_SERVICE_UNAVAILABLE;
321
+ exports.SUPPORTED_LANGUAGES = SUPPORTED_LANGUAGES;
322
+ exports.abbreviateLanguage = abbreviateLanguage;
323
+ exports.formatPostString = formatPostString;
324
+ exports.getICount = getICount;
325
+ exports.getRandomNumber = getRandomNumber;
326
+ exports.getTimeStamp = getTimeStamp;
327
+ exports.translate = translate;
328
+ exports.translateByDeepLX = translateByDeepLX;
package/lib/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export * from './api.ts';
2
+ export * from './constants.ts';
3
+ export * from './translate.ts';
4
+ export type * from './types.ts';
5
+ export * from './utils.ts';
package/lib/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export * from "./api.js";
2
+ export * from "./constants.js";
3
+ export * from "./translate.js";
4
+ export * from "./utils.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAE9B,cAAc,YAAY,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { type SourceLanguage, type TargetLanguage } from './constants.ts';
2
+ import type { DeepLXTranslationResult } from './types.ts';
3
+ export declare const translateByDeepLX: (sourceLang: SourceLanguage | undefined, targetLang: TargetLanguage, text: string, formal?: boolean, tagHandling?: string, proxyUrl?: string, dlSession?: string) => Promise<DeepLXTranslationResult>;
@@ -0,0 +1,148 @@
1
+ import { detectLang } from 'whatlang-node';
2
+ import { fetchApi } from 'x-fetch';
3
+ import { API_URL, COMMON_HEADERS, HTTP_STATUS_NOT_FOUND, HTTP_STATUS_OK, HTTP_STATUS_SERVICE_UNAVAILABLE, } from "./constants.js";
4
+ import { abbreviateLanguage, formatPostString, getICount, getRandomNumber, getTimeStamp, } from "./utils.js";
5
+ const makeRequest = async (postData, _proxyUrl, dlSession) => {
6
+ return fetchApi(API_URL, {
7
+ method: 'POST',
8
+ body: formatPostString(postData),
9
+ headers: dlSession
10
+ ? { ...COMMON_HEADERS, Cookie: `dl_session=${dlSession}` }
11
+ : COMMON_HEADERS,
12
+ });
13
+ };
14
+ const splitAndProcess = (text) => text.split('\n').map(line => (line.trim() === '' ? '\n' : line));
15
+ export const translateByDeepLX = async (sourceLang, targetLang, text, formal, tagHandling = 'plaintext', proxyUrl, dlSession) => {
16
+ if (!text) {
17
+ return { code: HTTP_STATUS_NOT_FOUND, message: 'No text to translate' };
18
+ }
19
+ const textParts = splitAndProcess(text);
20
+ const translatedParts = [];
21
+ const allAlternatives = [];
22
+ for (const part of textParts) {
23
+ if (!part.trim()) {
24
+ translatedParts.push('');
25
+ allAlternatives.push(['']);
26
+ continue;
27
+ }
28
+ if (!sourceLang || sourceLang === 'auto') {
29
+ sourceLang = detectLang(part, true);
30
+ }
31
+ const sourceLangCode = abbreviateLanguage(sourceLang) ??
32
+ sourceLang.toUpperCase();
33
+ const jobs = [
34
+ {
35
+ kind: 'default',
36
+ preferred_num_beams: 4,
37
+ raw_en_context_before: [],
38
+ raw_en_context_after: [],
39
+ sentences: [{ prefix: '', text: part, id: 0 }],
40
+ },
41
+ ];
42
+ let hasRegionalVariant = false;
43
+ let targetLangCode = abbreviateLanguage(targetLang) ??
44
+ targetLang.toUpperCase();
45
+ const targetLangParts = targetLang.split('-');
46
+ if (targetLangParts.length > 1) {
47
+ targetLangCode = targetLangParts[0];
48
+ hasRegionalVariant = true;
49
+ }
50
+ const id = getRandomNumber();
51
+ const postData = {
52
+ jsonrpc: '2.0',
53
+ method: 'LMT_handle_jobs',
54
+ id,
55
+ params: {
56
+ commonJobParams: {
57
+ mode: 'translate',
58
+ formality: formal == null ? 'undefined' : formal ? 'formal' : 'informal',
59
+ transcribe_as: 'romanize',
60
+ advancedMode: false,
61
+ textType: tagHandling,
62
+ wasSpoken: false,
63
+ ...(hasRegionalVariant && { regionalVariant: targetLang }),
64
+ },
65
+ lang: {
66
+ source_lang_user_selected: 'auto',
67
+ target_lang: targetLangCode,
68
+ source_lang_computed: sourceLangCode,
69
+ },
70
+ jobs,
71
+ timestamp: getTimeStamp(getICount(part)),
72
+ },
73
+ };
74
+ let translations;
75
+ try {
76
+ const { result } = await makeRequest(postData, proxyUrl, dlSession);
77
+ translations = result.translations;
78
+ }
79
+ catch (error) {
80
+ return {
81
+ code: HTTP_STATUS_SERVICE_UNAVAILABLE,
82
+ message: String(error),
83
+ };
84
+ }
85
+ let partTranslation = '';
86
+ const partAlternatives = [];
87
+ if (translations.length > 0) {
88
+ for (const translation of translations) {
89
+ partTranslation += translation.beams[0].sentences[0].text + ' ';
90
+ }
91
+ partTranslation = partTranslation.trim();
92
+ const numBeams = translations[0].beams.length;
93
+ for (let i = 1; i < numBeams; i++) {
94
+ let altText = '';
95
+ for (const translation of translations) {
96
+ const beams = translation.beams;
97
+ if (i < beams.length) {
98
+ altText += beams[i].sentences[0].text + ' ';
99
+ }
100
+ }
101
+ if (altText) {
102
+ partAlternatives.push(altText.trim());
103
+ }
104
+ }
105
+ }
106
+ if (!partTranslation) {
107
+ return {
108
+ code: HTTP_STATUS_SERVICE_UNAVAILABLE,
109
+ message: 'Translation failed',
110
+ };
111
+ }
112
+ translatedParts.push(partTranslation);
113
+ allAlternatives.push(partAlternatives);
114
+ }
115
+ const translatedText = translatedParts.join('\n');
116
+ const combinedAlternatives = [];
117
+ let maxAlts = 0;
118
+ for (const alts of allAlternatives) {
119
+ if (alts.length > maxAlts) {
120
+ maxAlts = alts.length;
121
+ }
122
+ }
123
+ for (let i = 0; i < maxAlts; i++) {
124
+ const altParts = [];
125
+ for (const [j, alts] of allAlternatives.entries()) {
126
+ if (i < alts.length) {
127
+ altParts.push(alts[i]);
128
+ }
129
+ else if (translatedParts[j].length === 0) {
130
+ altParts.push('');
131
+ }
132
+ else {
133
+ altParts.push(translatedParts[j]);
134
+ }
135
+ }
136
+ combinedAlternatives.push(altParts.join('\n'));
137
+ }
138
+ return {
139
+ code: HTTP_STATUS_OK,
140
+ id: getRandomNumber(),
141
+ data: translatedText,
142
+ alternatives: combinedAlternatives,
143
+ sourceLang: sourceLang,
144
+ targetLang,
145
+ method: dlSession ? 'Pro' : 'Free',
146
+ };
147
+ };
148
+ //# sourceMappingURL=translate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translate.js","sourceRoot":"","sources":["../src/translate.ts"],"names":[],"mappings":"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"}
package/lib/types.d.ts ADDED
@@ -0,0 +1,80 @@
1
+ import type { FormalityTone, SourceLanguage, TargetLanguage } from './constants.ts';
2
+ export type ValueOf<T> = T extends ReadonlyArray<infer R> ? R : T extends Set<infer R> ? R : T[keyof T];
3
+ export interface Lang {
4
+ source_lang_user_selected: string;
5
+ target_lang: string;
6
+ source_lang_computed?: string;
7
+ }
8
+ export interface CommonJobParams {
9
+ formality: FormalityTone;
10
+ transcribe_as: string;
11
+ mode: string;
12
+ wasSpoken: boolean;
13
+ advancedMode: boolean;
14
+ textType: string;
15
+ regionalVariant?: string;
16
+ }
17
+ export interface Sentence {
18
+ prefix: string;
19
+ text: string;
20
+ id: number;
21
+ }
22
+ export interface Job {
23
+ kind: string;
24
+ preferred_num_beams: number;
25
+ raw_en_context_before: string[];
26
+ raw_en_context_after: string[];
27
+ sentences: Sentence[];
28
+ }
29
+ export interface Params {
30
+ commonJobParams: CommonJobParams;
31
+ lang: Lang;
32
+ jobs: Job[];
33
+ timestamp: number;
34
+ }
35
+ export interface PostData {
36
+ jsonrpc: string;
37
+ method: string;
38
+ id: number;
39
+ params: Params;
40
+ }
41
+ export interface TranslationBeam {
42
+ sentences: SentenceResponse[];
43
+ num_symbols: number;
44
+ rephrase_variant: {
45
+ name: string;
46
+ };
47
+ }
48
+ export interface Translation {
49
+ beams: TranslationBeam[];
50
+ quality: string;
51
+ }
52
+ export interface TranslationResponse {
53
+ jsonrpc: string;
54
+ id: number;
55
+ result: {
56
+ translations: Translation[];
57
+ target_lang: string;
58
+ source_lang: string;
59
+ source_lang_is_confident: boolean;
60
+ detectedLanguages: Record<string, string>;
61
+ };
62
+ }
63
+ export interface SentenceResponse {
64
+ text: string;
65
+ ids: number[];
66
+ }
67
+ export interface DeepLXTranslationErrorResult {
68
+ code: number;
69
+ message: string;
70
+ }
71
+ export interface DeepLXTranslationSuccessResult {
72
+ code: number;
73
+ id: number;
74
+ data: string;
75
+ alternatives: string[];
76
+ sourceLang: SourceLanguage;
77
+ targetLang: TargetLanguage;
78
+ method: 'Free' | 'Pro';
79
+ }
80
+ export type DeepLXTranslationResult = DeepLXTranslationErrorResult | DeepLXTranslationSuccessResult;
package/lib/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/lib/utils.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import { type SupportedCode } from './constants.ts';
2
+ import type { PostData } from './types.ts';
3
+ export declare const getICount: (translateText: string) => number;
4
+ export declare const getRandomNumber: () => number;
5
+ export declare const getTimeStamp: (iCount: number) => number;
6
+ export declare const formatPostString: (postData: PostData) => string;
7
+ export declare function abbreviateLanguage(language: string): SupportedCode | undefined;
package/lib/utils.js ADDED
@@ -0,0 +1,33 @@
1
+ import { SUPPORTED_LANGUAGES, } from "./constants.js";
2
+ export const getICount = (translateText) => {
3
+ return (translateText.match(/i/g) || []).length;
4
+ };
5
+ export const getRandomNumber = () => {
6
+ const base = Math.floor(Math.random() * 99_999) + 8_300_000;
7
+ return base * 1000;
8
+ };
9
+ export const getTimeStamp = (iCount) => {
10
+ const ts = Date.now();
11
+ if (iCount !== 0) {
12
+ const adjustedCount = iCount + 1;
13
+ return ts - (ts % adjustedCount) + adjustedCount;
14
+ }
15
+ return ts;
16
+ };
17
+ export const formatPostString = (postData) => {
18
+ const postStr = JSON.stringify(postData);
19
+ const shouldAddSpace = (postData.id + 5) % 29 === 0 || (postData.id + 3) % 13 === 0;
20
+ return postStr.replaceAll('"method":"', shouldAddSpace ? `"method" : "` : `"method": "`);
21
+ };
22
+ let abbreviateLanguageDictionary;
23
+ function getAbbreviateLanguages() {
24
+ return (abbreviateLanguageDictionary ??= SUPPORTED_LANGUAGES.reduce((acc, lang) => {
25
+ acc[lang.code.toLowerCase()] = lang.code;
26
+ acc[lang.language.toLowerCase()] = lang.code;
27
+ return acc;
28
+ }, {}));
29
+ }
30
+ export function abbreviateLanguage(language) {
31
+ return getAbbreviateLanguages()[language.split('-')[0].toLowerCase()];
32
+ }
33
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,GAGpB,MAAM,gBAAgB,CAAA;AAIvB,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,aAAqB,EAAU,EAAE;IACzD,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAA;AACjD,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,eAAe,GAAG,GAAW,EAAE;IAE1C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,SAAS,CAAA;IAC3D,OAAO,IAAI,GAAG,IAAI,CAAA;AACpB,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAc,EAAU,EAAE;IACrD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACrB,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,CAAA;QAChC,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,aAAa,CAAC,GAAG,aAAa,CAAA;IAClD,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAkB,EAAU,EAAE;IAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;IACxC,MAAM,cAAc,GAElB,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAC9D,OAAO,OAAO,CAAC,UAAU,CACvB,YAAY,EACZ,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAChD,CAAA;AACH,CAAC,CAAA;AAED,IAAI,4BAES,CAAA;AAEb,SAAS,sBAAsB;IAE7B,OAAO,CAAC,4BAA4B,KAAK,mBAAmB,CAAC,MAAM,CACjE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACZ,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAyB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAA;QAC/D,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAyB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAA;QACnE,OAAO,GAAG,CAAA;IACZ,CAAC,EACD,EAAgD,CACjD,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,QAAgB;IAEhB,OAAO,sBAAsB,EAAE,CAC7B,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAyB,CAC5D,CAAA;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@deeplx/core",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "An unofficial Node package to translate text using [DeepL](https://www.deepl.com) by porting [OwO-Network/DeepLX](https://github.com/OwO-Network/DeepLX).",
6
+ "repository": "git+https://github.com/un-ts/deeplx.git",
7
+ "homepage": "https://github.com/un-ts/deeplx/blob/master/packages/@deeplx/core",
8
+ "author": "JounQin <admin@1stg.me> (https://www.1stG.me)",
9
+ "funding": "https://opencollective.com/deeplx",
10
+ "license": "MIT",
11
+ "engines": {
12
+ "node": "^12.20 || ^14.18.0 || >=16.0.0"
13
+ },
14
+ "bin": "./lib/cli.js",
15
+ "main": "./lib/index.cjs",
16
+ "types": "./index.d.cts",
17
+ "module": "./lib/index.js",
18
+ "exports": {
19
+ ".": {
20
+ "import": {
21
+ "types": "./lib/index.d.ts",
22
+ "default": "./lib/index.js"
23
+ },
24
+ "module-sync": {
25
+ "types": "./lib/index.d.ts",
26
+ "default": "./lib/index.js"
27
+ },
28
+ "require": {
29
+ "types": "./index.d.cts",
30
+ "default": "./lib/index.cjs"
31
+ }
32
+ },
33
+ "./package.json": "./package.json"
34
+ },
35
+ "files": [
36
+ "index.d.cts",
37
+ "lib"
38
+ ],
39
+ "keywords": [
40
+ "deepl",
41
+ "deepl-api",
42
+ "deepl-free",
43
+ "deeplx",
44
+ "deepl-translate",
45
+ "deepl-translation",
46
+ "deepl-translator",
47
+ "translate",
48
+ "translate-api",
49
+ "translator"
50
+ ],
51
+ "dependencies": {
52
+ "whatlang-node": "^0.1.0",
53
+ "x-fetch": "^0.2.5"
54
+ },
55
+ "publishConfig": {
56
+ "access": "public"
57
+ }
58
+ }