const apiBaseUrl = 'https://www.transifex.com/api/2/project'; const resource = 'app-strings'; export function doTransifexUpload(contents, project, token, success, fail) { const url = `${apiBaseUrl}/${project}/resources/`; const updateUrl = `${apiBaseUrl}/${project}/resource/${resource}/content/`; const headers = { Authorization: `Basic ${Buffer.from(`api:${token}`).toString('base64')}`, 'Content-Type': 'application/json', }; const req = { accept_translations: true, i18n_type: 'KEYVALUEJSON', name: resource, slug: resource, content: contents, }; function handleResponse(text) { let json; try { // transifex api returns Python dicts for some reason. // Any way to get the api to return valid JSON? json = JSON.parse(text); } catch (e) { // ignore } if (success) { success(json || text); } } function handleError(err) { if (fail) { fail(err.message ? err.message : 'Could not upload strings resource to Transifex'); } } // check if the resource exists fetch(updateUrl, { headers }) .then(response => response.json()) .then(() => { // perform an update fetch(updateUrl, { method: 'PUT', headers, body: JSON.stringify({ content: contents }), }) .then(response => { if (response.status !== 200 && response.status !== 201) { throw new Error('failed to update transifex'); } return response.text(); }) .then(handleResponse) .catch(handleError); }) .catch(() => { // resource doesn't exist, create a fresh resource fetch(url, { method: 'POST', headers, body: JSON.stringify(req), }) .then(response => { if (response.status !== 200 && response.status !== 201) { throw new Error('failed to upload to transifex'); } return response.text(); }) .then(handleResponse) .catch(handleError); }); }