ztechno_core 0.0.5 → 0.0.7
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.js +22 -165
- package/lib/translate_service.d.ts +4 -2
- package/lib/translate_service.js +177 -382
- package/package.json +3 -2
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.js
CHANGED
|
@@ -39,185 +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
|
-
|
|
49
|
+
class ZSqlService {
|
|
50
|
+
constructor(credentials) {
|
|
174
51
|
this.credentials = credentials;
|
|
175
52
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
con.connect(function (err) {
|
|
53
|
+
connect() {
|
|
54
|
+
return new Promise((resolve, reject) => {
|
|
55
|
+
const con = mysql.createConnection(this.credentials);
|
|
56
|
+
con.connect((err) => {
|
|
181
57
|
if (err) return reject(err);
|
|
182
58
|
resolve(con);
|
|
183
59
|
});
|
|
184
60
|
});
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
return __generator(this, function (_a) {
|
|
193
|
-
switch (_a.label) {
|
|
194
|
-
case 0:
|
|
195
|
-
return [4 /*yield*/, this.connect()];
|
|
196
|
-
case 1:
|
|
197
|
-
con = _a.sent();
|
|
198
|
-
return [
|
|
199
|
-
4 /*yield*/,
|
|
200
|
-
new Promise(function (resolve, reject) {
|
|
201
|
-
con.query(sql, escaped, function (err, result) {
|
|
202
|
-
if (err) return reject(err);
|
|
203
|
-
resolve(result);
|
|
204
|
-
});
|
|
205
|
-
}),
|
|
206
|
-
];
|
|
207
|
-
case 2:
|
|
208
|
-
output = _a.sent();
|
|
209
|
-
con.end(logError);
|
|
210
|
-
return [2 /*return*/, output];
|
|
211
|
-
}
|
|
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);
|
|
212
68
|
});
|
|
213
69
|
});
|
|
214
|
-
|
|
215
|
-
|
|
70
|
+
con.end(logError);
|
|
71
|
+
return output;
|
|
72
|
+
}
|
|
73
|
+
static get(credentials) {
|
|
216
74
|
if (instance == null) {
|
|
217
75
|
instance = new ZSqlService(credentials);
|
|
218
76
|
}
|
|
219
77
|
return instance;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
})();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
223
80
|
exports.ZSqlService = ZSqlService;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ZSqlService } from './sql_service';
|
|
1
2
|
type TranslateData = {
|
|
2
3
|
value: string;
|
|
3
4
|
meta?: {
|
|
@@ -11,12 +12,13 @@ type dbTranslationRow = {
|
|
|
11
12
|
value: string;
|
|
12
13
|
};
|
|
13
14
|
export declare class ZTranslateService {
|
|
15
|
+
private sql;
|
|
14
16
|
private localCache;
|
|
15
17
|
surpressErrors: boolean;
|
|
16
18
|
getLanguages(): string[];
|
|
17
19
|
getSourceLang(): string;
|
|
18
20
|
getDefaultLang(): string;
|
|
19
|
-
constructor();
|
|
21
|
+
constructor(sql: ZSqlService);
|
|
20
22
|
static init(opt: { key: string }): void;
|
|
21
23
|
private codes;
|
|
22
24
|
getLang(cookies: { [key: string]: string }): string;
|
|
@@ -40,6 +42,6 @@ export declare class ZTranslateService {
|
|
|
40
42
|
[key: string]: dbTranslationRow[];
|
|
41
43
|
}>;
|
|
42
44
|
private fetchAll;
|
|
43
|
-
static get(): ZTranslateService;
|
|
45
|
+
static get(sqlService: ZSqlService): ZTranslateService;
|
|
44
46
|
}
|
|
45
47
|
export {};
|
package/lib/translate_service.js
CHANGED
|
@@ -1,303 +1,134 @@
|
|
|
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
|
-
var ZTranslateService = /** @class */ (function () {
|
|
134
|
-
function ZTranslateService() {
|
|
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 DomParser = require('dom-parser');
|
|
5
|
+
const translate = require('translate');
|
|
6
|
+
const htmlParser = new DomParser();
|
|
7
|
+
let instance = null;
|
|
8
|
+
class ZTranslateService {
|
|
9
|
+
getLanguages() {
|
|
159
10
|
return ['en', 'nl'];
|
|
160
|
-
}
|
|
161
|
-
|
|
11
|
+
}
|
|
12
|
+
getSourceLang() {
|
|
162
13
|
return 'nl';
|
|
163
|
-
}
|
|
164
|
-
|
|
14
|
+
}
|
|
15
|
+
getDefaultLang() {
|
|
165
16
|
return 'nl';
|
|
166
|
-
}
|
|
167
|
-
|
|
17
|
+
}
|
|
18
|
+
constructor(sql) {
|
|
19
|
+
this.sql = sql;
|
|
20
|
+
this.localCache = {};
|
|
21
|
+
this.surpressErrors = true;
|
|
22
|
+
this.codes = {
|
|
23
|
+
[`'`]: `'`,
|
|
24
|
+
[`"`]: `"`,
|
|
25
|
+
[`“`]: `“`,
|
|
26
|
+
[`”`]: `”`,
|
|
27
|
+
[`©`]: `©`,
|
|
28
|
+
[`®`]: `®`,
|
|
29
|
+
[`€`]: `€`,
|
|
30
|
+
[`£`]: `£`,
|
|
31
|
+
[`™`]: `™`,
|
|
32
|
+
};
|
|
33
|
+
this.getLanguages().map((lang) => (this.localCache[lang] = {}));
|
|
34
|
+
setInterval(() => this.clearLocalCache(), 1000 * 60 * 60); // Every Hour
|
|
35
|
+
}
|
|
36
|
+
static init(opt) {
|
|
168
37
|
translate.key = opt.key;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
38
|
+
}
|
|
39
|
+
getLang(cookies) {
|
|
40
|
+
const defaultLang = this.getDefaultLang();
|
|
41
|
+
const langKey = (cookies.lang || defaultLang).toLowerCase();
|
|
42
|
+
const langs = this.getLanguages();
|
|
174
43
|
if (!langs.includes(langKey)) {
|
|
175
44
|
return defaultLang;
|
|
176
45
|
}
|
|
177
46
|
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
|
-
}
|
|
47
|
+
}
|
|
48
|
+
async translateText(langOrReq, text) {
|
|
49
|
+
const lang = typeof langOrReq === 'string' ? langOrReq : this.getLang(langOrReq.cookies);
|
|
50
|
+
text = text.trim();
|
|
51
|
+
if (text.length === 1) {
|
|
52
|
+
return text;
|
|
53
|
+
}
|
|
54
|
+
let replaceCount = 0;
|
|
55
|
+
while (text.includes('&#')) {
|
|
56
|
+
const codeIndexStart = text.indexOf('&#');
|
|
57
|
+
const first = text.substring(codeIndexStart);
|
|
58
|
+
const codeLength = first.indexOf('') + 1;
|
|
59
|
+
const code = first.substring(0, codeLength);
|
|
60
|
+
if (this.codes[code] === undefined) {
|
|
61
|
+
throw new Error(`Cant recognize character code="${code}"\n for text=${text}\n\n`);
|
|
62
|
+
// return text
|
|
63
|
+
}
|
|
64
|
+
text = text.substring(0, codeIndexStart) + this.codes[text] + text.substring(codeIndexStart + codeLength);
|
|
65
|
+
// text = text.replace(code, codes[text])
|
|
66
|
+
if (replaceCount++ > 1000) {
|
|
67
|
+
throw new Error(`Replace Count > 1000!!! character code="${code}"\n for text=${text}\n\n`);
|
|
68
|
+
// return text
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const localCached = this.checkLocalCache(text, lang);
|
|
72
|
+
if (localCached !== false) {
|
|
73
|
+
return localCached.value;
|
|
74
|
+
}
|
|
75
|
+
const remoteCached = await this.fetch(text, lang);
|
|
76
|
+
if (remoteCached !== false) {
|
|
77
|
+
return remoteCached.value;
|
|
78
|
+
}
|
|
79
|
+
let result;
|
|
80
|
+
try {
|
|
81
|
+
result = await translate(text, {
|
|
82
|
+
from: this.getSourceLang(),
|
|
83
|
+
to: lang,
|
|
270
84
|
});
|
|
271
|
-
})
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
85
|
+
} catch (err) {
|
|
86
|
+
result = '?';
|
|
87
|
+
}
|
|
88
|
+
await this.insert(text, lang, { value: result });
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
async translateHtml(html, cookies) {
|
|
92
|
+
const lang = this.getLang(cookies);
|
|
93
|
+
const defaultLang = this.getDefaultLang();
|
|
94
|
+
const dom = htmlParser.parseFromString(html);
|
|
95
|
+
const htmlNodes = dom.getElementsByTagName('html');
|
|
96
|
+
const mainNodes = dom.getElementsByTagName('main');
|
|
97
|
+
const isView = htmlNodes.length === 0;
|
|
98
|
+
const domNode = isView ? mainNodes[0] : htmlNodes[0];
|
|
99
|
+
if (lang !== defaultLang) {
|
|
100
|
+
const node = isView ? domNode : domNode.getElementsByTagName('body')[0];
|
|
101
|
+
const promises = [];
|
|
102
|
+
this.translateHtmlRec(lang, node, promises);
|
|
103
|
+
await Promise.all(promises);
|
|
277
104
|
}
|
|
105
|
+
const output = domNode ? domNode.outerHTML : html;
|
|
106
|
+
return output.startsWith(`<!DOCTYPE html>`) ? output : `<!DOCTYPE html>\r\n${output}`;
|
|
107
|
+
}
|
|
108
|
+
translateHtmlRec(lang, node, promises, skipTranslate = false) {
|
|
278
109
|
if (node.getAttribute('notranslate') != null) {
|
|
279
110
|
skipTranslate = true;
|
|
280
111
|
}
|
|
281
112
|
if (node.nodeName === '#text') {
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
prefix: genSpaces(
|
|
287
|
-
suffix: genSpaces(
|
|
113
|
+
const nodeText = node;
|
|
114
|
+
const text = nodeText.text.replace(/[\r|\n|\r\n]+/g, ' ').replace(/\s\s+/g, ' ');
|
|
115
|
+
const value = text.trim();
|
|
116
|
+
const meta = {
|
|
117
|
+
prefix: genSpaces(text.length - text.trimStart().length),
|
|
118
|
+
suffix: genSpaces(text.length - text.trimEnd().length),
|
|
288
119
|
};
|
|
289
|
-
if (skipTranslate === true ||
|
|
290
|
-
node.text =
|
|
120
|
+
if (skipTranslate === true || text.length === 0 || !strContainsLetters(text)) {
|
|
121
|
+
node.text = meta.prefix + text + meta.suffix;
|
|
291
122
|
return;
|
|
292
123
|
}
|
|
293
124
|
promises.push(
|
|
294
125
|
this.translateText(lang, value)
|
|
295
|
-
.then(
|
|
296
|
-
node.text =
|
|
126
|
+
.then((translatedText) => {
|
|
127
|
+
node.text = meta.prefix + translatedText + meta.suffix;
|
|
297
128
|
})
|
|
298
|
-
.catch(
|
|
299
|
-
node.text =
|
|
300
|
-
if (!
|
|
129
|
+
.catch((err) => {
|
|
130
|
+
node.text = text;
|
|
131
|
+
if (!this.surpressErrors) {
|
|
301
132
|
throw err; // TODO: Find out if surpressing is better
|
|
302
133
|
}
|
|
303
134
|
}),
|
|
@@ -305,131 +136,95 @@ var ZTranslateService = /** @class */ (function () {
|
|
|
305
136
|
return;
|
|
306
137
|
}
|
|
307
138
|
// const hasChildren = node.childNodes !== undefined
|
|
308
|
-
for (
|
|
309
|
-
var child = _a[_i];
|
|
139
|
+
for (const child of node.childNodes || []) {
|
|
310
140
|
this.translateHtmlRec(lang, child, promises, skipTranslate);
|
|
311
141
|
}
|
|
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);
|
|
142
|
+
}
|
|
143
|
+
async update(key, lang, data) {
|
|
144
|
+
return await this.sql.query(
|
|
145
|
+
`
|
|
146
|
+
INSERT INTO translations
|
|
147
|
+
(\`key\`, \`lang\`, \`value\`)
|
|
148
|
+
VALUES
|
|
149
|
+
(?, ?, ?)
|
|
150
|
+
ON DUPLICATE KEY UPDATE value=?
|
|
151
|
+
`,
|
|
152
|
+
[key, lang, data.value, data.value],
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
checkLocalCache(key, lang) {
|
|
156
|
+
const hasLocal = !this.localCache[lang].hasOwnProperty(key);
|
|
333
157
|
return hasLocal ? false : this.localCache[lang][key];
|
|
334
|
-
}
|
|
335
|
-
|
|
158
|
+
}
|
|
159
|
+
insertLocalCache(key, lang, data) {
|
|
336
160
|
if (this.localCache[lang].hasOwnProperty(key)) {
|
|
337
161
|
// console.warn(`Translations already cached!`, { key, lang, data})
|
|
338
162
|
return;
|
|
339
163
|
}
|
|
340
164
|
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
|
-
});
|
|
165
|
+
}
|
|
166
|
+
clearLocalCache() {
|
|
167
|
+
Object.keys(this.localCache).map((k) => {
|
|
168
|
+
this.localCache[k] = {};
|
|
385
169
|
});
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
|
|
170
|
+
}
|
|
171
|
+
async fetch(key, lang) {
|
|
172
|
+
const results = await this.sql.query(`SELECT \`value\` FROM translations WHERE \`lang\`=? AND \`key\`=?`, [
|
|
389
173
|
lang,
|
|
174
|
+
key,
|
|
390
175
|
]);
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
176
|
+
if (results.length > 0) {
|
|
177
|
+
// api.query(`UPDATE translations SET last_used=CURRENT_TIMESTAMP WHERE \`lang\`=? AND \`key\`=?`, [lang, key])
|
|
178
|
+
// .catch(err => console.error(err))
|
|
179
|
+
const { value } = results[0];
|
|
180
|
+
this.insertLocalCache(key, lang, { value });
|
|
181
|
+
return { value };
|
|
182
|
+
}
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
async insert(key, lang, data) {
|
|
186
|
+
await this.sql.query(`INSERT IGNORE INTO translations (\`key\`, \`lang\`, \`value\`) VALUES (?, ?, ?)`, [
|
|
187
|
+
key,
|
|
188
|
+
lang,
|
|
189
|
+
data.value,
|
|
190
|
+
]);
|
|
191
|
+
}
|
|
192
|
+
fetchLang(lang) {
|
|
193
|
+
return this.sql.query(
|
|
194
|
+
`SELECT \`key\`, \`lang\`, \`value\`, \`verified\`, \`created_at\` FROM translations WHERE \`lang\`=?`,
|
|
195
|
+
[lang],
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
async fetchAllGrouped() {
|
|
199
|
+
const output = {};
|
|
200
|
+
const allTranslations = await this.fetchAll();
|
|
201
|
+
allTranslations.map((translation) => {
|
|
202
|
+
const { key } = translation;
|
|
203
|
+
if (!output.hasOwnProperty(key)) {
|
|
204
|
+
output[key] = [];
|
|
205
|
+
}
|
|
206
|
+
output[key].push(translation);
|
|
412
207
|
});
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
208
|
+
return output;
|
|
209
|
+
}
|
|
210
|
+
fetchAll() {
|
|
211
|
+
return this.sql.query(`SELECT \`key\`, \`lang\`, \`value\`, \`verified\`, \`created_at\` FROM translations`);
|
|
212
|
+
}
|
|
213
|
+
static get(sqlService) {
|
|
418
214
|
if (instance == null) {
|
|
419
|
-
instance = new ZTranslateService();
|
|
215
|
+
instance = new ZTranslateService(sqlService);
|
|
420
216
|
}
|
|
421
217
|
return instance;
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
})();
|
|
218
|
+
}
|
|
219
|
+
}
|
|
425
220
|
exports.ZTranslateService = ZTranslateService;
|
|
426
221
|
function strContainsLetters(text) {
|
|
427
|
-
|
|
222
|
+
const regExp = /[a-zA-Z]/g;
|
|
428
223
|
return regExp.test(text);
|
|
429
224
|
}
|
|
430
225
|
function genSpaces(length) {
|
|
431
|
-
|
|
432
|
-
for (
|
|
226
|
+
let output = '';
|
|
227
|
+
for (let i = 0; i < length; i++) {
|
|
433
228
|
output += ' ';
|
|
434
229
|
}
|
|
435
230
|
return output;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ztechno_core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"description": "Core files for ztechno framework",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "lib/index.d.ts",
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
"lint": "tslint -p tsconfig.json",
|
|
18
18
|
"preversion": "npm run lint",
|
|
19
19
|
"version": "npm run format && git add -A src",
|
|
20
|
-
"postversion": "git push && git push --tags"
|
|
20
|
+
"postversion": "git push && git push --tags",
|
|
21
|
+
"update": "npm run build && npm version patch && npm publish"
|
|
21
22
|
},
|
|
22
23
|
"keywords": [
|
|
23
24
|
"ztechno",
|