ztechno_core 0.0.4 → 0.0.6
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/lib/crypto_service.js +20 -22
- package/lib/index.js +4 -4
- package/lib/mail_service.js +12 -13
- package/lib/sql_service.d.ts +3 -2
- package/lib/sql_service.js +25 -169
- package/lib/translate_service.js +174 -381
- package/package.json +1 -1
package/lib/crypto_service.js
CHANGED
|
@@ -41,37 +41,35 @@ var __importStar =
|
|
|
41
41
|
};
|
|
42
42
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
43
43
|
exports.ZCryptoService = void 0;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
const crypto = __importStar(require('crypto'));
|
|
45
|
+
const algorithm = 'aes-256-cbc';
|
|
46
|
+
const key = Buffer.from([
|
|
47
47
|
253, 144, 73, 128, 71, 94, 34, 3, 28, 128, 194, 166, 132, 154, 14, 87, 221, 202, 92, 56, 139, 10, 38, 122, 120, 7,
|
|
48
48
|
149, 40, 211, 218, 217, 3,
|
|
49
49
|
]);
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
var encrypted = cipher.update(text);
|
|
50
|
+
const iv = Buffer.from([0, 209, 223, 20, 147, 45, 14, 107, 93, 6, 76, 206, 176, 55, 245, 134]);
|
|
51
|
+
class ZCryptoService {
|
|
52
|
+
static encrypt(text) {
|
|
53
|
+
const cipher = crypto.createCipheriv(algorithm, Buffer.from(key), iv);
|
|
54
|
+
let encrypted = cipher.update(text);
|
|
56
55
|
encrypted = Buffer.concat([encrypted, cipher.final()]);
|
|
57
56
|
return { iv: iv.toString('hex'), encryptedData: encrypted.toString('hex') };
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
57
|
+
}
|
|
58
|
+
static decrypt(data) {
|
|
59
|
+
const niv = Buffer.from(data.iv, 'hex');
|
|
60
|
+
const encryptedText = Buffer.from(data.encryptedData, 'hex');
|
|
61
|
+
const decipher = crypto.createDecipheriv(algorithm, Buffer.from(key), niv);
|
|
62
|
+
let decrypted = decipher.update(encryptedText);
|
|
64
63
|
decrypted = Buffer.concat([decrypted, decipher.final()]);
|
|
65
64
|
return decrypted.toString();
|
|
66
|
-
}
|
|
67
|
-
|
|
65
|
+
}
|
|
66
|
+
static decryptJSON(data) {
|
|
68
67
|
try {
|
|
69
|
-
|
|
68
|
+
const decrypted = ZCryptoService.decrypt(data);
|
|
70
69
|
return JSON.parse(decrypted);
|
|
71
70
|
} catch (err) {
|
|
72
|
-
throw new Error(
|
|
71
|
+
throw new Error(`Couldn't decrypt JSON ${JSON.stringify(data)}`);
|
|
73
72
|
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
})();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
77
75
|
exports.ZCryptoService = ZCryptoService;
|
package/lib/index.js
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
3
3
|
exports.ZTranslateService = exports.ZSqlService = exports.ZMailService = exports.ZCryptoService = void 0;
|
|
4
|
-
|
|
4
|
+
const crypto_service_1 = require('./crypto_service');
|
|
5
5
|
Object.defineProperty(exports, 'ZCryptoService', {
|
|
6
6
|
enumerable: true,
|
|
7
7
|
get: function () {
|
|
8
8
|
return crypto_service_1.ZCryptoService;
|
|
9
9
|
},
|
|
10
10
|
});
|
|
11
|
-
|
|
11
|
+
const mail_service_1 = require('./mail_service');
|
|
12
12
|
Object.defineProperty(exports, 'ZMailService', {
|
|
13
13
|
enumerable: true,
|
|
14
14
|
get: function () {
|
|
15
15
|
return mail_service_1.ZMailService;
|
|
16
16
|
},
|
|
17
17
|
});
|
|
18
|
-
|
|
18
|
+
const sql_service_1 = require('./sql_service');
|
|
19
19
|
Object.defineProperty(exports, 'ZSqlService', {
|
|
20
20
|
enumerable: true,
|
|
21
21
|
get: function () {
|
|
22
22
|
return sql_service_1.ZSqlService;
|
|
23
23
|
},
|
|
24
24
|
});
|
|
25
|
-
|
|
25
|
+
const translate_service_1 = require('./translate_service');
|
|
26
26
|
Object.defineProperty(exports, 'ZTranslateService', {
|
|
27
27
|
enumerable: true,
|
|
28
28
|
get: function () {
|
package/lib/mail_service.js
CHANGED
|
@@ -1,35 +1,34 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
3
3
|
exports.ZMailService = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
const nodemailer = require('nodemailer');
|
|
5
|
+
let instance = null;
|
|
6
|
+
class ZMailService {
|
|
7
|
+
constructor(opt) {
|
|
8
8
|
this.opt = opt;
|
|
9
9
|
}
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
send(mailOpts) {
|
|
11
|
+
const mailTransporter = nodemailer.createTransport({
|
|
12
12
|
service: 'gmail',
|
|
13
13
|
auth: this.opt.auth,
|
|
14
14
|
});
|
|
15
|
-
|
|
15
|
+
const mailDetails = {
|
|
16
16
|
from: this.opt.mailSender,
|
|
17
17
|
to: mailOpts.recipient,
|
|
18
18
|
subject: mailOpts.subject,
|
|
19
19
|
text: mailOpts.body,
|
|
20
20
|
};
|
|
21
|
-
return new Promise(
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
22
|
mailTransporter.sendMail(mailDetails, function (err, data) {
|
|
23
23
|
return err ? reject(err) : resolve('success'); // data)
|
|
24
24
|
});
|
|
25
25
|
});
|
|
26
|
-
}
|
|
27
|
-
|
|
26
|
+
}
|
|
27
|
+
static get(opt) {
|
|
28
28
|
if (instance == null) {
|
|
29
29
|
instance = new ZMailService(opt);
|
|
30
30
|
}
|
|
31
31
|
return instance;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
})();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
35
34
|
exports.ZMailService = ZMailService;
|
package/lib/sql_service.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import * as mysql from 'mysql';
|
|
2
2
|
export declare class ZSqlService {
|
|
3
|
-
|
|
3
|
+
private credentials;
|
|
4
|
+
constructor(credentials: mysql.ConnectionConfig);
|
|
4
5
|
connect(): Promise<mysql.Connection>;
|
|
5
6
|
query(sql: string, escaped?: any[]): Promise<any>;
|
|
6
|
-
static get(): ZSqlService;
|
|
7
|
+
static get(credentials?: mysql.ConnectionConfig): ZSqlService;
|
|
7
8
|
}
|
package/lib/sql_service.js
CHANGED
|
@@ -39,186 +39,42 @@ var __importStar =
|
|
|
39
39
|
__setModuleDefault(result, mod);
|
|
40
40
|
return result;
|
|
41
41
|
};
|
|
42
|
-
var __awaiter =
|
|
43
|
-
(this && this.__awaiter) ||
|
|
44
|
-
function (thisArg, _arguments, P, generator) {
|
|
45
|
-
function adopt(value) {
|
|
46
|
-
return value instanceof P
|
|
47
|
-
? value
|
|
48
|
-
: new P(function (resolve) {
|
|
49
|
-
resolve(value);
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
53
|
-
function fulfilled(value) {
|
|
54
|
-
try {
|
|
55
|
-
step(generator.next(value));
|
|
56
|
-
} catch (e) {
|
|
57
|
-
reject(e);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
function rejected(value) {
|
|
61
|
-
try {
|
|
62
|
-
step(generator['throw'](value));
|
|
63
|
-
} catch (e) {
|
|
64
|
-
reject(e);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
function step(result) {
|
|
68
|
-
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
|
|
69
|
-
}
|
|
70
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
71
|
-
});
|
|
72
|
-
};
|
|
73
|
-
var __generator =
|
|
74
|
-
(this && this.__generator) ||
|
|
75
|
-
function (thisArg, body) {
|
|
76
|
-
var _ = {
|
|
77
|
-
label: 0,
|
|
78
|
-
sent: function () {
|
|
79
|
-
if (t[0] & 1) throw t[1];
|
|
80
|
-
return t[1];
|
|
81
|
-
},
|
|
82
|
-
trys: [],
|
|
83
|
-
ops: [],
|
|
84
|
-
},
|
|
85
|
-
f,
|
|
86
|
-
y,
|
|
87
|
-
t,
|
|
88
|
-
g;
|
|
89
|
-
return (
|
|
90
|
-
(g = { next: verb(0), throw: verb(1), return: verb(2) }),
|
|
91
|
-
typeof Symbol === 'function' &&
|
|
92
|
-
(g[Symbol.iterator] = function () {
|
|
93
|
-
return this;
|
|
94
|
-
}),
|
|
95
|
-
g
|
|
96
|
-
);
|
|
97
|
-
function verb(n) {
|
|
98
|
-
return function (v) {
|
|
99
|
-
return step([n, v]);
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
function step(op) {
|
|
103
|
-
if (f) throw new TypeError('Generator is already executing.');
|
|
104
|
-
while ((g && ((g = 0), op[0] && (_ = 0)), _))
|
|
105
|
-
try {
|
|
106
|
-
if (
|
|
107
|
-
((f = 1),
|
|
108
|
-
y &&
|
|
109
|
-
(t = op[0] & 2 ? y['return'] : op[0] ? y['throw'] || ((t = y['return']) && t.call(y), 0) : y.next) &&
|
|
110
|
-
!(t = t.call(y, op[1])).done)
|
|
111
|
-
)
|
|
112
|
-
return t;
|
|
113
|
-
if (((y = 0), t)) op = [op[0] & 2, t.value];
|
|
114
|
-
switch (op[0]) {
|
|
115
|
-
case 0:
|
|
116
|
-
case 1:
|
|
117
|
-
t = op;
|
|
118
|
-
break;
|
|
119
|
-
case 4:
|
|
120
|
-
_.label++;
|
|
121
|
-
return { value: op[1], done: false };
|
|
122
|
-
case 5:
|
|
123
|
-
_.label++;
|
|
124
|
-
y = op[1];
|
|
125
|
-
op = [0];
|
|
126
|
-
continue;
|
|
127
|
-
case 7:
|
|
128
|
-
op = _.ops.pop();
|
|
129
|
-
_.trys.pop();
|
|
130
|
-
continue;
|
|
131
|
-
default:
|
|
132
|
-
if (!((t = _.trys), (t = t.length > 0 && t[t.length - 1])) && (op[0] === 6 || op[0] === 2)) {
|
|
133
|
-
_ = 0;
|
|
134
|
-
continue;
|
|
135
|
-
}
|
|
136
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
|
|
137
|
-
_.label = op[1];
|
|
138
|
-
break;
|
|
139
|
-
}
|
|
140
|
-
if (op[0] === 6 && _.label < t[1]) {
|
|
141
|
-
_.label = t[1];
|
|
142
|
-
t = op;
|
|
143
|
-
break;
|
|
144
|
-
}
|
|
145
|
-
if (t && _.label < t[2]) {
|
|
146
|
-
_.label = t[2];
|
|
147
|
-
_.ops.push(op);
|
|
148
|
-
break;
|
|
149
|
-
}
|
|
150
|
-
if (t[2]) _.ops.pop();
|
|
151
|
-
_.trys.pop();
|
|
152
|
-
continue;
|
|
153
|
-
}
|
|
154
|
-
op = body.call(thisArg, _);
|
|
155
|
-
} catch (e) {
|
|
156
|
-
op = [6, e];
|
|
157
|
-
y = 0;
|
|
158
|
-
} finally {
|
|
159
|
-
f = t = 0;
|
|
160
|
-
}
|
|
161
|
-
if (op[0] & 5) throw op[1];
|
|
162
|
-
return { value: op[0] ? op[1] : void 0, done: true };
|
|
163
|
-
}
|
|
164
|
-
};
|
|
165
42
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
166
43
|
exports.ZSqlService = void 0;
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
44
|
+
const mysql = __importStar(require('mysql'));
|
|
45
|
+
let instance = null;
|
|
46
|
+
const logError = (err) => {
|
|
170
47
|
if (err) throw err;
|
|
171
48
|
};
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
var con = mysql.createConnection(creds);
|
|
181
|
-
con.connect(function (err) {
|
|
49
|
+
class ZSqlService {
|
|
50
|
+
constructor(credentials) {
|
|
51
|
+
this.credentials = credentials;
|
|
52
|
+
}
|
|
53
|
+
connect() {
|
|
54
|
+
return new Promise((resolve, reject) => {
|
|
55
|
+
const con = mysql.createConnection(this.credentials);
|
|
56
|
+
con.connect((err) => {
|
|
182
57
|
if (err) return reject(err);
|
|
183
58
|
resolve(con);
|
|
184
59
|
});
|
|
185
60
|
});
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
return __generator(this, function (_a) {
|
|
194
|
-
switch (_a.label) {
|
|
195
|
-
case 0:
|
|
196
|
-
return [4 /*yield*/, this.connect()];
|
|
197
|
-
case 1:
|
|
198
|
-
con = _a.sent();
|
|
199
|
-
return [
|
|
200
|
-
4 /*yield*/,
|
|
201
|
-
new Promise(function (resolve, reject) {
|
|
202
|
-
con.query(sql, escaped, function (err, result) {
|
|
203
|
-
if (err) return reject(err);
|
|
204
|
-
resolve(result);
|
|
205
|
-
});
|
|
206
|
-
}),
|
|
207
|
-
];
|
|
208
|
-
case 2:
|
|
209
|
-
output = _a.sent();
|
|
210
|
-
con.end(logError);
|
|
211
|
-
return [2 /*return*/, output];
|
|
212
|
-
}
|
|
61
|
+
}
|
|
62
|
+
async query(sql, escaped = []) {
|
|
63
|
+
const con = await this.connect();
|
|
64
|
+
const output = await new Promise((resolve, reject) => {
|
|
65
|
+
con.query(sql, escaped, (err, result) => {
|
|
66
|
+
if (err) return reject(err);
|
|
67
|
+
resolve(result);
|
|
213
68
|
});
|
|
214
69
|
});
|
|
215
|
-
|
|
216
|
-
|
|
70
|
+
con.end(logError);
|
|
71
|
+
return output;
|
|
72
|
+
}
|
|
73
|
+
static get(credentials) {
|
|
217
74
|
if (instance == null) {
|
|
218
|
-
instance = new ZSqlService();
|
|
75
|
+
instance = new ZSqlService(credentials);
|
|
219
76
|
}
|
|
220
77
|
return instance;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
})();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
224
80
|
exports.ZSqlService = ZSqlService;
|
package/lib/translate_service.js
CHANGED
|
@@ -1,303 +1,135 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
-
var __awaiter =
|
|
3
|
-
(this && this.__awaiter) ||
|
|
4
|
-
function (thisArg, _arguments, P, generator) {
|
|
5
|
-
function adopt(value) {
|
|
6
|
-
return value instanceof P
|
|
7
|
-
? value
|
|
8
|
-
: new P(function (resolve) {
|
|
9
|
-
resolve(value);
|
|
10
|
-
});
|
|
11
|
-
}
|
|
12
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
13
|
-
function fulfilled(value) {
|
|
14
|
-
try {
|
|
15
|
-
step(generator.next(value));
|
|
16
|
-
} catch (e) {
|
|
17
|
-
reject(e);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
function rejected(value) {
|
|
21
|
-
try {
|
|
22
|
-
step(generator['throw'](value));
|
|
23
|
-
} catch (e) {
|
|
24
|
-
reject(e);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
function step(result) {
|
|
28
|
-
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
|
|
29
|
-
}
|
|
30
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
31
|
-
});
|
|
32
|
-
};
|
|
33
|
-
var __generator =
|
|
34
|
-
(this && this.__generator) ||
|
|
35
|
-
function (thisArg, body) {
|
|
36
|
-
var _ = {
|
|
37
|
-
label: 0,
|
|
38
|
-
sent: function () {
|
|
39
|
-
if (t[0] & 1) throw t[1];
|
|
40
|
-
return t[1];
|
|
41
|
-
},
|
|
42
|
-
trys: [],
|
|
43
|
-
ops: [],
|
|
44
|
-
},
|
|
45
|
-
f,
|
|
46
|
-
y,
|
|
47
|
-
t,
|
|
48
|
-
g;
|
|
49
|
-
return (
|
|
50
|
-
(g = { next: verb(0), throw: verb(1), return: verb(2) }),
|
|
51
|
-
typeof Symbol === 'function' &&
|
|
52
|
-
(g[Symbol.iterator] = function () {
|
|
53
|
-
return this;
|
|
54
|
-
}),
|
|
55
|
-
g
|
|
56
|
-
);
|
|
57
|
-
function verb(n) {
|
|
58
|
-
return function (v) {
|
|
59
|
-
return step([n, v]);
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
function step(op) {
|
|
63
|
-
if (f) throw new TypeError('Generator is already executing.');
|
|
64
|
-
while ((g && ((g = 0), op[0] && (_ = 0)), _))
|
|
65
|
-
try {
|
|
66
|
-
if (
|
|
67
|
-
((f = 1),
|
|
68
|
-
y &&
|
|
69
|
-
(t = op[0] & 2 ? y['return'] : op[0] ? y['throw'] || ((t = y['return']) && t.call(y), 0) : y.next) &&
|
|
70
|
-
!(t = t.call(y, op[1])).done)
|
|
71
|
-
)
|
|
72
|
-
return t;
|
|
73
|
-
if (((y = 0), t)) op = [op[0] & 2, t.value];
|
|
74
|
-
switch (op[0]) {
|
|
75
|
-
case 0:
|
|
76
|
-
case 1:
|
|
77
|
-
t = op;
|
|
78
|
-
break;
|
|
79
|
-
case 4:
|
|
80
|
-
_.label++;
|
|
81
|
-
return { value: op[1], done: false };
|
|
82
|
-
case 5:
|
|
83
|
-
_.label++;
|
|
84
|
-
y = op[1];
|
|
85
|
-
op = [0];
|
|
86
|
-
continue;
|
|
87
|
-
case 7:
|
|
88
|
-
op = _.ops.pop();
|
|
89
|
-
_.trys.pop();
|
|
90
|
-
continue;
|
|
91
|
-
default:
|
|
92
|
-
if (!((t = _.trys), (t = t.length > 0 && t[t.length - 1])) && (op[0] === 6 || op[0] === 2)) {
|
|
93
|
-
_ = 0;
|
|
94
|
-
continue;
|
|
95
|
-
}
|
|
96
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
|
|
97
|
-
_.label = op[1];
|
|
98
|
-
break;
|
|
99
|
-
}
|
|
100
|
-
if (op[0] === 6 && _.label < t[1]) {
|
|
101
|
-
_.label = t[1];
|
|
102
|
-
t = op;
|
|
103
|
-
break;
|
|
104
|
-
}
|
|
105
|
-
if (t && _.label < t[2]) {
|
|
106
|
-
_.label = t[2];
|
|
107
|
-
_.ops.push(op);
|
|
108
|
-
break;
|
|
109
|
-
}
|
|
110
|
-
if (t[2]) _.ops.pop();
|
|
111
|
-
_.trys.pop();
|
|
112
|
-
continue;
|
|
113
|
-
}
|
|
114
|
-
op = body.call(thisArg, _);
|
|
115
|
-
} catch (e) {
|
|
116
|
-
op = [6, e];
|
|
117
|
-
y = 0;
|
|
118
|
-
} finally {
|
|
119
|
-
f = t = 0;
|
|
120
|
-
}
|
|
121
|
-
if (op[0] & 5) throw op[1];
|
|
122
|
-
return { value: op[0] ? op[1] : void 0, done: true };
|
|
123
|
-
}
|
|
124
|
-
};
|
|
125
2
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
126
3
|
exports.ZTranslateService = void 0;
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
var _a;
|
|
136
|
-
var _this = this;
|
|
137
|
-
this.localCache = {};
|
|
138
|
-
this.surpressErrors = true;
|
|
139
|
-
this.codes =
|
|
140
|
-
((_a = {}),
|
|
141
|
-
(_a['''] = "'"),
|
|
142
|
-
(_a['"'] = '"'),
|
|
143
|
-
(_a['“'] = '\u201C'),
|
|
144
|
-
(_a['”'] = '\u201D'),
|
|
145
|
-
(_a['©'] = '\u00A9'),
|
|
146
|
-
(_a['®'] = '\u00AE'),
|
|
147
|
-
(_a['€'] = '\u20AC'),
|
|
148
|
-
(_a['£'] = '\u00A3'),
|
|
149
|
-
(_a['™'] = '\u2122'),
|
|
150
|
-
_a);
|
|
151
|
-
this.getLanguages().map(function (lang) {
|
|
152
|
-
return (_this.localCache[lang] = {});
|
|
153
|
-
});
|
|
154
|
-
setInterval(function () {
|
|
155
|
-
return _this.clearLocalCache();
|
|
156
|
-
}, 1000 * 60 * 60); // Every Hour
|
|
157
|
-
}
|
|
158
|
-
ZTranslateService.prototype.getLanguages = function () {
|
|
4
|
+
const sql_service_1 = require('./sql_service');
|
|
5
|
+
const DomParser = require('dom-parser');
|
|
6
|
+
const translate = require('translate');
|
|
7
|
+
const htmlParser = new DomParser();
|
|
8
|
+
const sql = sql_service_1.ZSqlService.get();
|
|
9
|
+
let instance = null;
|
|
10
|
+
class ZTranslateService {
|
|
11
|
+
getLanguages() {
|
|
159
12
|
return ['en', 'nl'];
|
|
160
|
-
}
|
|
161
|
-
|
|
13
|
+
}
|
|
14
|
+
getSourceLang() {
|
|
162
15
|
return 'nl';
|
|
163
|
-
}
|
|
164
|
-
|
|
16
|
+
}
|
|
17
|
+
getDefaultLang() {
|
|
165
18
|
return 'nl';
|
|
166
|
-
}
|
|
167
|
-
|
|
19
|
+
}
|
|
20
|
+
constructor() {
|
|
21
|
+
this.localCache = {};
|
|
22
|
+
this.surpressErrors = true;
|
|
23
|
+
this.codes = {
|
|
24
|
+
[`'`]: `'`,
|
|
25
|
+
[`"`]: `"`,
|
|
26
|
+
[`“`]: `“`,
|
|
27
|
+
[`”`]: `”`,
|
|
28
|
+
[`©`]: `©`,
|
|
29
|
+
[`®`]: `®`,
|
|
30
|
+
[`€`]: `€`,
|
|
31
|
+
[`£`]: `£`,
|
|
32
|
+
[`™`]: `™`,
|
|
33
|
+
};
|
|
34
|
+
this.getLanguages().map((lang) => (this.localCache[lang] = {}));
|
|
35
|
+
setInterval(() => this.clearLocalCache(), 1000 * 60 * 60); // Every Hour
|
|
36
|
+
}
|
|
37
|
+
static init(opt) {
|
|
168
38
|
translate.key = opt.key;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
39
|
+
}
|
|
40
|
+
getLang(cookies) {
|
|
41
|
+
const defaultLang = this.getDefaultLang();
|
|
42
|
+
const langKey = (cookies.lang || defaultLang).toLowerCase();
|
|
43
|
+
const langs = this.getLanguages();
|
|
174
44
|
if (!langs.includes(langKey)) {
|
|
175
45
|
return defaultLang;
|
|
176
46
|
}
|
|
177
47
|
return langKey;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
remoteCached = _a.sent();
|
|
216
|
-
if (remoteCached !== false) {
|
|
217
|
-
return [2 /*return*/, remoteCached.value];
|
|
218
|
-
}
|
|
219
|
-
_a.label = 2;
|
|
220
|
-
case 2:
|
|
221
|
-
_a.trys.push([2, 4, , 5]);
|
|
222
|
-
return [
|
|
223
|
-
4 /*yield*/,
|
|
224
|
-
translate(text, {
|
|
225
|
-
from: this.getSourceLang(),
|
|
226
|
-
to: lang,
|
|
227
|
-
}),
|
|
228
|
-
];
|
|
229
|
-
case 3:
|
|
230
|
-
result = _a.sent();
|
|
231
|
-
return [3 /*break*/, 5];
|
|
232
|
-
case 4:
|
|
233
|
-
err_1 = _a.sent();
|
|
234
|
-
result = '?';
|
|
235
|
-
return [3 /*break*/, 5];
|
|
236
|
-
case 5:
|
|
237
|
-
return [4 /*yield*/, this.insert(text, lang, { value: result })];
|
|
238
|
-
case 6:
|
|
239
|
-
_a.sent();
|
|
240
|
-
return [2 /*return*/, result];
|
|
241
|
-
}
|
|
242
|
-
});
|
|
243
|
-
});
|
|
244
|
-
};
|
|
245
|
-
ZTranslateService.prototype.translateHtml = function (html, cookies) {
|
|
246
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
247
|
-
var lang, defaultLang, dom, htmlNodes, mainNodes, isView, domNode, node, promises, output;
|
|
248
|
-
return __generator(this, function (_a) {
|
|
249
|
-
switch (_a.label) {
|
|
250
|
-
case 0:
|
|
251
|
-
lang = this.getLang(cookies);
|
|
252
|
-
defaultLang = this.getDefaultLang();
|
|
253
|
-
dom = htmlParser.parseFromString(html);
|
|
254
|
-
htmlNodes = dom.getElementsByTagName('html');
|
|
255
|
-
mainNodes = dom.getElementsByTagName('main');
|
|
256
|
-
isView = htmlNodes.length === 0;
|
|
257
|
-
domNode = isView ? mainNodes[0] : htmlNodes[0];
|
|
258
|
-
if (!(lang !== defaultLang)) return [3 /*break*/, 2];
|
|
259
|
-
node = isView ? domNode : domNode.getElementsByTagName('body')[0];
|
|
260
|
-
promises = [];
|
|
261
|
-
this.translateHtmlRec(lang, node, promises);
|
|
262
|
-
return [4 /*yield*/, Promise.all(promises)];
|
|
263
|
-
case 1:
|
|
264
|
-
_a.sent();
|
|
265
|
-
_a.label = 2;
|
|
266
|
-
case 2:
|
|
267
|
-
output = domNode ? domNode.outerHTML : html;
|
|
268
|
-
return [2 /*return*/, output.startsWith('<!DOCTYPE html>') ? output : '<!DOCTYPE html>\r\n'.concat(output)];
|
|
269
|
-
}
|
|
48
|
+
}
|
|
49
|
+
async translateText(langOrReq, text) {
|
|
50
|
+
const lang = typeof langOrReq === 'string' ? langOrReq : this.getLang(langOrReq.cookies);
|
|
51
|
+
text = text.trim();
|
|
52
|
+
if (text.length === 1) {
|
|
53
|
+
return text;
|
|
54
|
+
}
|
|
55
|
+
let replaceCount = 0;
|
|
56
|
+
while (text.includes('&#')) {
|
|
57
|
+
const codeIndexStart = text.indexOf('&#');
|
|
58
|
+
const first = text.substring(codeIndexStart);
|
|
59
|
+
const codeLength = first.indexOf('') + 1;
|
|
60
|
+
const code = first.substring(0, codeLength);
|
|
61
|
+
if (this.codes[code] === undefined) {
|
|
62
|
+
throw new Error(`Cant recognize character code="${code}"\n for text=${text}\n\n`);
|
|
63
|
+
// return text
|
|
64
|
+
}
|
|
65
|
+
text = text.substring(0, codeIndexStart) + this.codes[text] + text.substring(codeIndexStart + codeLength);
|
|
66
|
+
// text = text.replace(code, codes[text])
|
|
67
|
+
if (replaceCount++ > 1000) {
|
|
68
|
+
throw new Error(`Replace Count > 1000!!! character code="${code}"\n for text=${text}\n\n`);
|
|
69
|
+
// return text
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const localCached = this.checkLocalCache(text, lang);
|
|
73
|
+
if (localCached !== false) {
|
|
74
|
+
return localCached.value;
|
|
75
|
+
}
|
|
76
|
+
const remoteCached = await this.fetch(text, lang);
|
|
77
|
+
if (remoteCached !== false) {
|
|
78
|
+
return remoteCached.value;
|
|
79
|
+
}
|
|
80
|
+
let result;
|
|
81
|
+
try {
|
|
82
|
+
result = await translate(text, {
|
|
83
|
+
from: this.getSourceLang(),
|
|
84
|
+
to: lang,
|
|
270
85
|
});
|
|
271
|
-
})
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
86
|
+
} catch (err) {
|
|
87
|
+
result = '?';
|
|
88
|
+
}
|
|
89
|
+
await this.insert(text, lang, { value: result });
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
async translateHtml(html, cookies) {
|
|
93
|
+
const lang = this.getLang(cookies);
|
|
94
|
+
const defaultLang = this.getDefaultLang();
|
|
95
|
+
const dom = htmlParser.parseFromString(html);
|
|
96
|
+
const htmlNodes = dom.getElementsByTagName('html');
|
|
97
|
+
const mainNodes = dom.getElementsByTagName('main');
|
|
98
|
+
const isView = htmlNodes.length === 0;
|
|
99
|
+
const domNode = isView ? mainNodes[0] : htmlNodes[0];
|
|
100
|
+
if (lang !== defaultLang) {
|
|
101
|
+
const node = isView ? domNode : domNode.getElementsByTagName('body')[0];
|
|
102
|
+
const promises = [];
|
|
103
|
+
this.translateHtmlRec(lang, node, promises);
|
|
104
|
+
await Promise.all(promises);
|
|
277
105
|
}
|
|
106
|
+
const output = domNode ? domNode.outerHTML : html;
|
|
107
|
+
return output.startsWith(`<!DOCTYPE html>`) ? output : `<!DOCTYPE html>\r\n${output}`;
|
|
108
|
+
}
|
|
109
|
+
translateHtmlRec(lang, node, promises, skipTranslate = false) {
|
|
278
110
|
if (node.getAttribute('notranslate') != null) {
|
|
279
111
|
skipTranslate = true;
|
|
280
112
|
}
|
|
281
113
|
if (node.nodeName === '#text') {
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
prefix: genSpaces(
|
|
287
|
-
suffix: genSpaces(
|
|
114
|
+
const nodeText = node;
|
|
115
|
+
const text = nodeText.text.replace(/[\r|\n|\r\n]+/g, ' ').replace(/\s\s+/g, ' ');
|
|
116
|
+
const value = text.trim();
|
|
117
|
+
const meta = {
|
|
118
|
+
prefix: genSpaces(text.length - text.trimStart().length),
|
|
119
|
+
suffix: genSpaces(text.length - text.trimEnd().length),
|
|
288
120
|
};
|
|
289
|
-
if (skipTranslate === true ||
|
|
290
|
-
node.text =
|
|
121
|
+
if (skipTranslate === true || text.length === 0 || !strContainsLetters(text)) {
|
|
122
|
+
node.text = meta.prefix + text + meta.suffix;
|
|
291
123
|
return;
|
|
292
124
|
}
|
|
293
125
|
promises.push(
|
|
294
126
|
this.translateText(lang, value)
|
|
295
|
-
.then(
|
|
296
|
-
node.text =
|
|
127
|
+
.then((translatedText) => {
|
|
128
|
+
node.text = meta.prefix + translatedText + meta.suffix;
|
|
297
129
|
})
|
|
298
|
-
.catch(
|
|
299
|
-
node.text =
|
|
300
|
-
if (!
|
|
130
|
+
.catch((err) => {
|
|
131
|
+
node.text = text;
|
|
132
|
+
if (!this.surpressErrors) {
|
|
301
133
|
throw err; // TODO: Find out if surpressing is better
|
|
302
134
|
}
|
|
303
135
|
}),
|
|
@@ -305,131 +137,92 @@ var ZTranslateService = /** @class */ (function () {
|
|
|
305
137
|
return;
|
|
306
138
|
}
|
|
307
139
|
// const hasChildren = node.childNodes !== undefined
|
|
308
|
-
for (
|
|
309
|
-
var child = _a[_i];
|
|
140
|
+
for (const child of node.childNodes || []) {
|
|
310
141
|
this.translateHtmlRec(lang, child, promises, skipTranslate);
|
|
311
142
|
}
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
return
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
}
|
|
328
|
-
});
|
|
329
|
-
});
|
|
330
|
-
};
|
|
331
|
-
ZTranslateService.prototype.checkLocalCache = function (key, lang) {
|
|
332
|
-
var hasLocal = !this.localCache[lang].hasOwnProperty(key);
|
|
143
|
+
}
|
|
144
|
+
async update(key, lang, data) {
|
|
145
|
+
return await sql.query(
|
|
146
|
+
`
|
|
147
|
+
INSERT INTO translations
|
|
148
|
+
(\`key\`, \`lang\`, \`value\`)
|
|
149
|
+
VALUES
|
|
150
|
+
(?, ?, ?)
|
|
151
|
+
ON DUPLICATE KEY UPDATE value=?
|
|
152
|
+
`,
|
|
153
|
+
[key, lang, data.value, data.value],
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
checkLocalCache(key, lang) {
|
|
157
|
+
const hasLocal = !this.localCache[lang].hasOwnProperty(key);
|
|
333
158
|
return hasLocal ? false : this.localCache[lang][key];
|
|
334
|
-
}
|
|
335
|
-
|
|
159
|
+
}
|
|
160
|
+
insertLocalCache(key, lang, data) {
|
|
336
161
|
if (this.localCache[lang].hasOwnProperty(key)) {
|
|
337
162
|
// console.warn(`Translations already cached!`, { key, lang, data})
|
|
338
163
|
return;
|
|
339
164
|
}
|
|
340
165
|
this.localCache[lang][key] = data;
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
_this.localCache[k] = {};
|
|
346
|
-
});
|
|
347
|
-
};
|
|
348
|
-
ZTranslateService.prototype.fetch = function (key, lang) {
|
|
349
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
350
|
-
var results, value;
|
|
351
|
-
return __generator(this, function (_a) {
|
|
352
|
-
switch (_a.label) {
|
|
353
|
-
case 0:
|
|
354
|
-
return [4 /*yield*/, sql.query('SELECT `value` FROM translations WHERE `lang`=? AND `key`=?', [lang, key])];
|
|
355
|
-
case 1:
|
|
356
|
-
results = _a.sent();
|
|
357
|
-
if (results.length > 0) {
|
|
358
|
-
value = results[0].value;
|
|
359
|
-
this.insertLocalCache(key, lang, { value: value });
|
|
360
|
-
return [2 /*return*/, { value: value }];
|
|
361
|
-
}
|
|
362
|
-
return [2 /*return*/, false];
|
|
363
|
-
}
|
|
364
|
-
});
|
|
365
|
-
});
|
|
366
|
-
};
|
|
367
|
-
ZTranslateService.prototype.insert = function (key, lang, data) {
|
|
368
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
369
|
-
return __generator(this, function (_a) {
|
|
370
|
-
switch (_a.label) {
|
|
371
|
-
case 0:
|
|
372
|
-
return [
|
|
373
|
-
4 /*yield*/,
|
|
374
|
-
sql.query('INSERT IGNORE INTO translations (`key`, `lang`, `value`) VALUES (?, ?, ?)', [
|
|
375
|
-
key,
|
|
376
|
-
lang,
|
|
377
|
-
data.value,
|
|
378
|
-
]),
|
|
379
|
-
];
|
|
380
|
-
case 1:
|
|
381
|
-
_a.sent();
|
|
382
|
-
return [2 /*return*/];
|
|
383
|
-
}
|
|
384
|
-
});
|
|
166
|
+
}
|
|
167
|
+
clearLocalCache() {
|
|
168
|
+
Object.keys(this.localCache).map((k) => {
|
|
169
|
+
this.localCache[k] = {};
|
|
385
170
|
});
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
|
|
171
|
+
}
|
|
172
|
+
async fetch(key, lang) {
|
|
173
|
+
const results = await sql.query(`SELECT \`value\` FROM translations WHERE \`lang\`=? AND \`key\`=?`, [lang, key]);
|
|
174
|
+
if (results.length > 0) {
|
|
175
|
+
// api.query(`UPDATE translations SET last_used=CURRENT_TIMESTAMP WHERE \`lang\`=? AND \`key\`=?`, [lang, key])
|
|
176
|
+
// .catch(err => console.error(err))
|
|
177
|
+
const { value } = results[0];
|
|
178
|
+
this.insertLocalCache(key, lang, { value });
|
|
179
|
+
return { value };
|
|
180
|
+
}
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
async insert(key, lang, data) {
|
|
184
|
+
await sql.query(`INSERT IGNORE INTO translations (\`key\`, \`lang\`, \`value\`) VALUES (?, ?, ?)`, [
|
|
185
|
+
key,
|
|
389
186
|
lang,
|
|
187
|
+
data.value,
|
|
390
188
|
]);
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
return
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
output[key].push(translation);
|
|
408
|
-
});
|
|
409
|
-
return [2 /*return*/, output];
|
|
410
|
-
}
|
|
411
|
-
});
|
|
189
|
+
}
|
|
190
|
+
fetchLang(lang) {
|
|
191
|
+
return sql.query(
|
|
192
|
+
`SELECT \`key\`, \`lang\`, \`value\`, \`verified\`, \`created_at\` FROM translations WHERE \`lang\`=?`,
|
|
193
|
+
[lang],
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
async fetchAllGrouped() {
|
|
197
|
+
const output = {};
|
|
198
|
+
const allTranslations = await this.fetchAll();
|
|
199
|
+
allTranslations.map((translation) => {
|
|
200
|
+
const { key } = translation;
|
|
201
|
+
if (!output.hasOwnProperty(key)) {
|
|
202
|
+
output[key] = [];
|
|
203
|
+
}
|
|
204
|
+
output[key].push(translation);
|
|
412
205
|
});
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
206
|
+
return output;
|
|
207
|
+
}
|
|
208
|
+
fetchAll() {
|
|
209
|
+
return sql.query(`SELECT \`key\`, \`lang\`, \`value\`, \`verified\`, \`created_at\` FROM translations`);
|
|
210
|
+
}
|
|
211
|
+
static get() {
|
|
418
212
|
if (instance == null) {
|
|
419
213
|
instance = new ZTranslateService();
|
|
420
214
|
}
|
|
421
215
|
return instance;
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
})();
|
|
216
|
+
}
|
|
217
|
+
}
|
|
425
218
|
exports.ZTranslateService = ZTranslateService;
|
|
426
219
|
function strContainsLetters(text) {
|
|
427
|
-
|
|
220
|
+
const regExp = /[a-zA-Z]/g;
|
|
428
221
|
return regExp.test(text);
|
|
429
222
|
}
|
|
430
223
|
function genSpaces(length) {
|
|
431
|
-
|
|
432
|
-
for (
|
|
224
|
+
let output = '';
|
|
225
|
+
for (let i = 0; i < length; i++) {
|
|
433
226
|
output += ' ';
|
|
434
227
|
}
|
|
435
228
|
return output;
|