@transifex/native 3.1.0 → 3.2.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 +81 -0
- package/dist/browser.native.js +2 -2
- package/dist/browser.native.js.map +1 -1
- package/dist/node.native.js +2 -2
- package/dist/node.native.js.map +1 -1
- package/package.json +1 -1
- package/src/TxNative.js +116 -1
- package/src/utils.js +14 -0
package/package.json
CHANGED
package/src/TxNative.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/* globals __VERSION__, __PLATFORM__ */
|
|
2
|
+
|
|
2
3
|
import axios from 'axios';
|
|
3
4
|
|
|
4
5
|
import MemoryCache from './cache/MemoryCache';
|
|
@@ -6,7 +7,7 @@ import SourceErrorPolicy from './policies/SourceErrorPolicy';
|
|
|
6
7
|
import SourceStringPolicy from './policies/SourceStringPolicy';
|
|
7
8
|
import MessageFormatRenderer from './renderers/MessageFormatRenderer';
|
|
8
9
|
import {
|
|
9
|
-
generateKey, isString, isPluralized, escape, generateHashedKey,
|
|
10
|
+
generateKey, isString, isPluralized, escape, generateHashedKey, sleep,
|
|
10
11
|
} from './utils';
|
|
11
12
|
import {
|
|
12
13
|
sendEvent,
|
|
@@ -223,6 +224,120 @@ export default class TxNative {
|
|
|
223
224
|
}
|
|
224
225
|
}
|
|
225
226
|
|
|
227
|
+
/**
|
|
228
|
+
* Invalidate CDS cache
|
|
229
|
+
*
|
|
230
|
+
* @param {Object} params
|
|
231
|
+
* @param {Boolean} params.purge
|
|
232
|
+
* @returns {Object} Data
|
|
233
|
+
* @returns {Number} Data.count
|
|
234
|
+
* @returns {Number} Data.status
|
|
235
|
+
* @returns {Number} Data.token
|
|
236
|
+
*/
|
|
237
|
+
async invalidateCDS(params = {}) {
|
|
238
|
+
if (!this.token) throw new Error('token is not defined');
|
|
239
|
+
if (!this.secret) throw new Error('secret is not defined');
|
|
240
|
+
|
|
241
|
+
const action = params.purge ? 'purge' : 'invalidate';
|
|
242
|
+
const res = await axios.post(`${this.cdsHost}/${action}`, {
|
|
243
|
+
}, {
|
|
244
|
+
headers: {
|
|
245
|
+
Authorization: `Bearer ${this.token}:${this.secret}`,
|
|
246
|
+
'Accept-version': 'v2',
|
|
247
|
+
'Content-Type': 'application/json;charset=utf-8',
|
|
248
|
+
'X-NATIVE-SDK': `txjs/${__PLATFORM__}/${__VERSION__}`,
|
|
249
|
+
},
|
|
250
|
+
});
|
|
251
|
+
return res.data;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Push source content to CDS.
|
|
256
|
+
*
|
|
257
|
+
* Payload is in the following format:
|
|
258
|
+
* {
|
|
259
|
+
* <key>: {
|
|
260
|
+
* string: <string>,
|
|
261
|
+
* meta: {
|
|
262
|
+
* context: <string>
|
|
263
|
+
* developer_comment: <string>,
|
|
264
|
+
* character_limit: <number>,
|
|
265
|
+
* tags: <array>,
|
|
266
|
+
* occurrences: <array>,
|
|
267
|
+
* }
|
|
268
|
+
* },
|
|
269
|
+
* <key>: { .. }
|
|
270
|
+
* }
|
|
271
|
+
*
|
|
272
|
+
* @param {Object} payload
|
|
273
|
+
* @param {Object} params
|
|
274
|
+
* @param {Boolean} params.purge
|
|
275
|
+
* @param {Boolean} params.overrideTags
|
|
276
|
+
* @param {Boolean} params.noWait - do not wait for upload results
|
|
277
|
+
* @returns {Object} Data
|
|
278
|
+
* @returns {String} Data.jobUrl
|
|
279
|
+
* @returns {Number} Data.created
|
|
280
|
+
* @returns {Number} Data.updated
|
|
281
|
+
* @returns {Number} Data.skipped
|
|
282
|
+
* @returns {Number} Data.deleted
|
|
283
|
+
* @returns {Number} Data.failed
|
|
284
|
+
* @returns {String[]} Data.errors
|
|
285
|
+
* @returns {String} Data.status
|
|
286
|
+
*/
|
|
287
|
+
async pushSource(payload, params = {}) {
|
|
288
|
+
if (!this.token) throw new Error('token is not defined');
|
|
289
|
+
if (!this.secret) throw new Error('secret is not defined');
|
|
290
|
+
|
|
291
|
+
const headers = {
|
|
292
|
+
Authorization: `Bearer ${this.token}:${this.secret}`,
|
|
293
|
+
'Accept-version': 'v2',
|
|
294
|
+
'Content-Type': 'application/json;charset=utf-8',
|
|
295
|
+
'X-NATIVE-SDK': `txjs/${__PLATFORM__}/${__VERSION__}`,
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
const res = await axios.post(`${this.cdsHost}/content`, {
|
|
299
|
+
data: payload,
|
|
300
|
+
meta: {
|
|
301
|
+
purge: !!params.purge,
|
|
302
|
+
override_tags: !!params.overrideTags,
|
|
303
|
+
},
|
|
304
|
+
}, {
|
|
305
|
+
headers,
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
const jobUrl = `${this.cdsHost}${res.data.data.links.job}`;
|
|
309
|
+
|
|
310
|
+
if (params.noWait) {
|
|
311
|
+
return {
|
|
312
|
+
jobUrl,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
let pollStatus = {
|
|
317
|
+
status: '',
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
do {
|
|
321
|
+
// eslint-disable-next-line no-await-in-loop
|
|
322
|
+
await sleep(1500);
|
|
323
|
+
// eslint-disable-next-line no-await-in-loop
|
|
324
|
+
const pollRes = await axios.get(jobUrl, {
|
|
325
|
+
headers,
|
|
326
|
+
});
|
|
327
|
+
const { data } = pollRes.data;
|
|
328
|
+
pollStatus = {
|
|
329
|
+
...(data.details || {}),
|
|
330
|
+
errors: data.errors || [],
|
|
331
|
+
status: data.status,
|
|
332
|
+
};
|
|
333
|
+
} while (pollStatus.status === 'pending' || pollStatus.status === 'processing');
|
|
334
|
+
|
|
335
|
+
return {
|
|
336
|
+
jobUrl,
|
|
337
|
+
...pollStatus,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
|
|
226
341
|
/**
|
|
227
342
|
* Get remote project locales from CDS
|
|
228
343
|
*
|
package/src/utils.js
CHANGED
|
@@ -215,3 +215,17 @@ export function isPluralized(string) {
|
|
|
215
215
|
|
|
216
216
|
return true;
|
|
217
217
|
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Sleep in msec
|
|
221
|
+
*
|
|
222
|
+
* @export
|
|
223
|
+
* @param {Number} msec
|
|
224
|
+
*/
|
|
225
|
+
export function sleep(msec) {
|
|
226
|
+
return new Promise((resolve) => {
|
|
227
|
+
setTimeout(() => {
|
|
228
|
+
resolve();
|
|
229
|
+
}, msec);
|
|
230
|
+
});
|
|
231
|
+
}
|