sanity-plugin-studio-smartling 4.0.1 → 4.0.2-beta.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/dist/index.esm.js +37 -20
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +37 -20
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/createTask.ts +31 -15
- package/src/adapter/getTranslation.ts +2 -2
- package/src/adapter/getTranslationTask.ts +1 -1
- package/src/adapter/helpers.ts +37 -18
- package/src/index.ts +2 -2
package/dist/index.esm.js
CHANGED
|
@@ -24,7 +24,7 @@ const getHeaders = (url, accessToken) => ({
|
|
|
24
24
|
Authorization: "Bearer ".concat(accessToken),
|
|
25
25
|
"X-URL": url
|
|
26
26
|
});
|
|
27
|
-
const findExistingJob = (documentId, secrets, accessToken) => {
|
|
27
|
+
const findExistingJob = async (documentId, secrets, accessToken) => {
|
|
28
28
|
const {
|
|
29
29
|
project,
|
|
30
30
|
proxy
|
|
@@ -33,19 +33,35 @@ const findExistingJob = (documentId, secrets, accessToken) => {
|
|
|
33
33
|
throw new Error("The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.");
|
|
34
34
|
}
|
|
35
35
|
const url = "https://api.smartling.com/jobs-api/v3/projects/".concat(project, "/jobs?jobName=").concat(documentId);
|
|
36
|
-
|
|
37
|
-
method: "POST",
|
|
36
|
+
let items = await fetch(proxy, {
|
|
38
37
|
headers: getHeaders(url, accessToken)
|
|
39
38
|
}).then(res => res.json()).then(res => {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
if (correctJob) {
|
|
43
|
-
return correctJob.translationJobUid;
|
|
44
|
-
}
|
|
45
|
-
return "";
|
|
46
|
-
}
|
|
47
|
-
return "";
|
|
39
|
+
var _a, _b;
|
|
40
|
+
return (_b = (_a = res == null ? void 0 : res.response) == null ? void 0 : _a.data) == null ? void 0 : _b.items;
|
|
48
41
|
});
|
|
42
|
+
if (!items || !items.length) {
|
|
43
|
+
const refUrl = "https://api.smartling.com/jobs-api/v3/projects/".concat(project, "/jobs/search");
|
|
44
|
+
items = await fetch(proxy, {
|
|
45
|
+
headers: {
|
|
46
|
+
...getHeaders(refUrl, accessToken),
|
|
47
|
+
"content-type": "application/json"
|
|
48
|
+
},
|
|
49
|
+
method: "POST",
|
|
50
|
+
body: JSON.stringify({
|
|
51
|
+
fileUris: [documentId]
|
|
52
|
+
})
|
|
53
|
+
}).then(res => res.json()).then(res => {
|
|
54
|
+
var _a, _b;
|
|
55
|
+
return (_b = (_a = res == null ? void 0 : res.response) == null ? void 0 : _a.data) == null ? void 0 : _b.items;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
if (items.length) {
|
|
59
|
+
const correctJob = items.find(item => item.jobName && item.jobName === documentId || item.referenceNumber && item.referenceNumber === documentId);
|
|
60
|
+
if (correctJob) {
|
|
61
|
+
return correctJob.translationJobUid;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return "";
|
|
49
65
|
};
|
|
50
66
|
const getLocales = async secrets => {
|
|
51
67
|
if (!(secrets == null ? void 0 : secrets.project) || !(secrets == null ? void 0 : secrets.secret) || !(secrets == null ? void 0 : secrets.proxy)) {
|
|
@@ -116,7 +132,7 @@ const getTranslationTask = async (documentId, secrets) => {
|
|
|
116
132
|
linkToVendorTask: "https://dashboard.smartling.com/app/projects/".concat(project, "/account-jobs/").concat(project, ":").concat(taskId)
|
|
117
133
|
};
|
|
118
134
|
};
|
|
119
|
-
const createJob = (jobName, secrets, localeIds, accessToken) => {
|
|
135
|
+
const createJob = (jobName, secrets, localeIds, accessToken, documentId) => {
|
|
120
136
|
const {
|
|
121
137
|
project,
|
|
122
138
|
proxy
|
|
@@ -133,11 +149,12 @@ const createJob = (jobName, secrets, localeIds, accessToken) => {
|
|
|
133
149
|
},
|
|
134
150
|
body: JSON.stringify({
|
|
135
151
|
jobName,
|
|
136
|
-
targetLocaleIds: localeIds
|
|
152
|
+
targetLocaleIds: localeIds,
|
|
153
|
+
referenceNumber: documentId
|
|
137
154
|
})
|
|
138
155
|
}).then(res => res.json()).then(res => res.response.data.translationJobUid);
|
|
139
156
|
};
|
|
140
|
-
const createJobBatch = (jobId, secrets,
|
|
157
|
+
const createJobBatch = (jobId, secrets, documentId, accessToken, localeIds, workflowUid) => {
|
|
141
158
|
const {
|
|
142
159
|
project,
|
|
143
160
|
proxy
|
|
@@ -149,7 +166,7 @@ const createJobBatch = (jobId, secrets, documentName, accessToken, localeIds, wo
|
|
|
149
166
|
const reqBody = {
|
|
150
167
|
authorize: true,
|
|
151
168
|
translationJobUid: jobId,
|
|
152
|
-
fileUris: [
|
|
169
|
+
fileUris: [documentId]
|
|
153
170
|
};
|
|
154
171
|
if (workflowUid) {
|
|
155
172
|
reqBody.localeWorkflows = localeIds.map(l => ({
|
|
@@ -166,7 +183,7 @@ const createJobBatch = (jobId, secrets, documentName, accessToken, localeIds, wo
|
|
|
166
183
|
body: JSON.stringify(reqBody)
|
|
167
184
|
}).then(res => res.json()).then(res => res.response.data.batchUid);
|
|
168
185
|
};
|
|
169
|
-
const uploadFileToBatch = (batchUid, document, secrets, localeIds, accessToken) => {
|
|
186
|
+
const uploadFileToBatch = (batchUid, documentId, document, secrets, localeIds, accessToken) => {
|
|
170
187
|
const {
|
|
171
188
|
project,
|
|
172
189
|
proxy
|
|
@@ -176,7 +193,7 @@ const uploadFileToBatch = (batchUid, document, secrets, localeIds, accessToken)
|
|
|
176
193
|
}
|
|
177
194
|
const url = "https://api.smartling.com/job-batches-api/v2/projects/".concat(project, "/batches/").concat(batchUid, "/file");
|
|
178
195
|
const formData = new FormData();
|
|
179
|
-
formData.append("fileUri",
|
|
196
|
+
formData.append("fileUri", documentId);
|
|
180
197
|
formData.append("fileType", "html");
|
|
181
198
|
const htmlBuffer = Buffer.from(document.content, "utf-8");
|
|
182
199
|
formData.append("file", new Blob([htmlBuffer]), "".concat(document.name, ".html"));
|
|
@@ -194,10 +211,10 @@ const createTask = async (documentId, document, localeIds, secrets, workflowUid)
|
|
|
194
211
|
const accessToken = await authenticate(secrets);
|
|
195
212
|
let taskId = await findExistingJob(document.name, secrets, accessToken);
|
|
196
213
|
if (!taskId) {
|
|
197
|
-
taskId = await createJob(document.name, secrets, localeIds, accessToken);
|
|
214
|
+
taskId = await createJob(document.name, secrets, localeIds, accessToken, documentId);
|
|
198
215
|
}
|
|
199
|
-
const batchUid = await createJobBatch(taskId, secrets,
|
|
200
|
-
const uploadFileRes = await uploadFileToBatch(batchUid, document, secrets, localeIds, accessToken);
|
|
216
|
+
const batchUid = await createJobBatch(taskId, secrets, documentId, accessToken, localeIds, workflowUid);
|
|
217
|
+
const uploadFileRes = await uploadFileToBatch(batchUid, documentId, document, secrets, localeIds, accessToken);
|
|
201
218
|
console.info("Upload status from Smartling: ", uploadFileRes);
|
|
202
219
|
return getTranslationTask(documentId, secrets);
|
|
203
220
|
};
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/adapter/helpers.ts","../src/adapter/getLocales.ts","../src/adapter/getTranslationTask.ts","../src/adapter/createTask.ts","../src/adapter/getTranslation.ts","../src/adapter/index.ts","../src/index.ts"],"sourcesContent":["import {Secrets} from 'sanity-translations-tab'\n\ninterface Headers {\n [key: string]: string\n}\n\nexport const authenticate = (secrets: Secrets): Promise<string> => {\n const url = 'https://api.smartling.com/auth-api/v2/authenticate'\n const headers = {\n 'content-type': 'application/json',\n 'X-URL': url,\n }\n const {secret, proxy} = secrets\n if (!secret || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a secret key and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'\n )\n }\n return fetch(proxy, {\n headers,\n method: 'POST',\n body: JSON.stringify(secret),\n })\n .then((res) => res.json())\n .then((res) => res.response.data.accessToken)\n}\n\nexport const getHeaders = (url: string, accessToken: string): Headers => ({\n Authorization: `Bearer ${accessToken}`,\n 'X-URL': url,\n})\n\nexport const findExistingJob = (\n documentId: string,\n secrets: Secrets,\n accessToken: string\n): Promise<string> => {\n const {project, proxy} = secrets\n if (!project || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'\n )\n }\n const url = `https://api.smartling.com/jobs-api/v3/projects/${project}/jobs?jobName=${documentId}`\n return fetch(proxy, {\n method: 'POST',\n headers: getHeaders(url, accessToken),\n })\n .then((res) => res.json())\n .then((res) => {\n if (res.response.data.items.length) {\n //smartling will fuzzy match job names. We need to be precise.\n const correctJob = res.response.data.items.find(\n (item: {jobName: string}) => item.jobName && item.jobName === documentId\n )\n if (correctJob) {\n return correctJob.translationJobUid\n }\n return ''\n }\n return ''\n })\n}\n","import {authenticate, getHeaders} from './helpers'\nimport {Secrets} from 'sanity-translations-tab'\nimport {Adapter} from 'sanity-translations-tab'\n\nexport const getLocales: Adapter['getLocales'] = async (secrets: Secrets | null) => {\n if (!secrets?.project || !secrets?.secret || !secrets?.proxy) {\n return []\n }\n const {project, proxy} = secrets\n const url = `https://api.smartling.com/projects-api/v2/projects/${project}`\n const accessToken = await authenticate(secrets)\n return fetch(proxy, {\n method: 'GET',\n headers: getHeaders(url, accessToken),\n })\n .then((res) => res.json())\n .then((res) => res.response.data.targetLocales)\n}\n","import {authenticate, getHeaders, findExistingJob} from './helpers'\nimport {Adapter, Secrets} from 'sanity-translations-tab'\n\ninterface WorkflowProgressItem {\n workflowStepSummaryReportItemList: {\n wordCount: number\n }[]\n}\n\ninterface SmartlingProgressItem {\n targetLocaleId: string\n progress: {\n percentComplete: number\n totalWordCount: number\n }\n workflowProgressReportList: WorkflowProgressItem[]\n}\n\nexport const getTranslationTask: Adapter['getTranslationTask'] = async (\n documentId: string,\n secrets: Secrets | null\n) => {\n if (!secrets?.project || !secrets?.secret || !secrets?.proxy) {\n return {\n documentId,\n taskId: documentId,\n locales: [],\n }\n }\n\n const {project, proxy} = secrets\n\n const accessToken = await authenticate(secrets)\n const taskId = await findExistingJob(documentId, secrets, accessToken)\n if (!taskId) {\n return {\n documentId,\n taskId: documentId,\n locales: [],\n }\n }\n\n const progressUrl = `https://api.smartling.com/jobs-api/v3/projects/${project}/jobs/${taskId}/progress`\n const smartlingTask = await fetch(proxy, {\n method: 'GET',\n headers: getHeaders(progressUrl, accessToken),\n })\n .then((res) => res.json())\n .then((res) => res.response.data)\n\n let locales = []\n if (smartlingTask && smartlingTask.contentProgressReport) {\n locales = smartlingTask.contentProgressReport.map((item: SmartlingProgressItem) => {\n let progress = item.progress ? item.progress.percentComplete : 0\n if (\n item.workflowProgressReportList &&\n item.workflowProgressReportList.length > 0 &&\n item.progress\n ) {\n //default to the first workflow -- it's likely what is being used\n const progressItem = item.workflowProgressReportList[0]\n //this is a list of the various steps in the workflow\n if (\n progressItem.workflowStepSummaryReportItemList &&\n progressItem.workflowStepSummaryReportItemList.length > 1\n ) {\n //get the last step in the workflow -- usually \"published\"\n const lastStep = progressItem.workflowStepSummaryReportItemList.at(-1)\n //get the percentage of how many words have reached the last step\n if (lastStep && lastStep.wordCount >= 0) {\n progress = Math.floor((lastStep.wordCount / item.progress.totalWordCount) * 100) ?? 0\n }\n }\n }\n return {\n localeId: item.targetLocaleId,\n progress,\n }\n })\n }\n\n return {\n documentId,\n locales,\n //since our download is tied to document id for smartling, keep track of it as a task\n taskId: documentId,\n linkToVendorTask: `https://dashboard.smartling.com/app/projects/${project}/account-jobs/${project}:${taskId}`,\n }\n}\n","import {authenticate, getHeaders, findExistingJob} from './helpers'\nimport {Adapter, Secrets} from 'sanity-translations-tab'\nimport {getTranslationTask} from './getTranslationTask'\nimport {Buffer} from 'buffer'\n\nconst createJob = (jobName: string, secrets: Secrets, localeIds: string[], accessToken: string) => {\n const {project, proxy} = secrets\n if (!project || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'\n )\n }\n\n const url = `https://api.smartling.com/jobs-api/v3/projects/${project}/jobs`\n return fetch(proxy, {\n method: 'POST',\n headers: {\n ...getHeaders(url, accessToken),\n 'content-type': 'application/json',\n },\n body: JSON.stringify({\n jobName,\n targetLocaleIds: localeIds,\n }),\n })\n .then((res) => res.json())\n .then((res) => res.response.data.translationJobUid)\n}\n\n/* we're using batches here because it eliminates some\n * new string authorization issues for updating existing jobs,\n * and is able to be used for new bulk\n * job functionality.\n */\n\nconst createJobBatch = (\n jobId: string,\n secrets: Secrets,\n documentName: string,\n accessToken: string,\n localeIds: string[],\n workflowUid?: string\n //eslint-disable-next-line max-params\n) => {\n const {project, proxy} = secrets\n if (!project || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'\n )\n }\n const url = `https://api.smartling.com/job-batches-api/v2/projects/${project}/batches`\n const reqBody: {\n authorize: boolean\n translationJobUid: string\n fileUris: string[]\n localeWorkflows?: {targetLocaleId: string; workflowUid: string}[]\n } = {\n authorize: true,\n translationJobUid: jobId,\n fileUris: [documentName],\n }\n\n if (workflowUid) {\n reqBody.localeWorkflows = localeIds.map((l) => ({\n targetLocaleId: l,\n workflowUid,\n }))\n }\n\n return fetch(proxy, {\n method: 'POST',\n headers: {\n ...getHeaders(url, accessToken),\n 'content-type': 'application/json',\n },\n body: JSON.stringify(reqBody),\n })\n .then((res) => res.json())\n .then((res) => res.response.data.batchUid)\n}\n\nconst uploadFileToBatch = (\n batchUid: string,\n document: Record<string, any>,\n secrets: Secrets,\n localeIds: string[],\n accessToken: string\n) => {\n const {project, proxy} = secrets\n if (!project || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'\n )\n }\n const url = `https://api.smartling.com/job-batches-api/v2/projects/${project}/batches/${batchUid}/file`\n const formData = new FormData()\n formData.append('fileUri', document.name)\n formData.append('fileType', 'html')\n const htmlBuffer = Buffer.from(document.content, 'utf-8')\n formData.append('file', new Blob([htmlBuffer]), `${document.name}.html`)\n localeIds.forEach((localeId) => formData.append('localeIdsToAuthorize[]', localeId))\n\n return fetch(proxy, {\n method: 'POST',\n headers: getHeaders(url, accessToken),\n body: formData,\n }).then((res) => res.json())\n}\n\nexport const createTask: Adapter['createTask'] = async (\n documentId: string,\n document: Record<string, any>,\n localeIds: string[],\n secrets: Secrets | null,\n workflowUid?: string\n) => {\n if (!secrets?.project || !secrets?.secret || !secrets?.proxy) {\n throw new Error(\n 'The Smartling adapter requires a project ID, a secret key, and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'\n )\n }\n\n const accessToken = await authenticate(secrets)\n\n let taskId = await findExistingJob(document.name, secrets, accessToken)\n if (!taskId) {\n taskId = await createJob(document.name, secrets, localeIds, accessToken)\n }\n\n const batchUid = await createJobBatch(\n taskId,\n secrets,\n document.name,\n accessToken,\n localeIds,\n workflowUid\n )\n const uploadFileRes = await uploadFileToBatch(batchUid, document, secrets, localeIds, accessToken)\n //eslint-disable-next-line no-console -- for developer debugging\n console.info('Upload status from Smartling: ', uploadFileRes)\n\n return getTranslationTask(documentId, secrets)\n}\n","import {authenticate, getHeaders} from './helpers'\nimport {Adapter, Secrets} from 'sanity-translations-tab'\n\nexport const getTranslation: Adapter['getTranslation'] = async (\n taskId: string,\n localeId: string,\n secrets: Secrets | null\n) => {\n if (!secrets?.project || !secrets?.secret || !secrets?.proxy) {\n throw new Error(\n 'The Smartling adapter requires a project ID, a secret key, and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'\n )\n }\n\n const {project, proxy} = secrets\n\n const url = `https://api.smartling.com/files-api/v2/projects/${project}/locales/${localeId}/file?fileUri=${taskId}&retrievalType=pending`\n const accessToken = await authenticate(secrets)\n const translatedHTML = await fetch(proxy, {\n method: 'GET',\n headers: getHeaders(url, accessToken),\n })\n .then((res) => res.json())\n .then((res) => {\n if (res.body) {\n return res.body\n } else if (res.response.errors) {\n const errMsg =\n res.response.errors[0]?.message || 'Error retrieving translation from Smartling'\n throw new Error(errMsg)\n }\n return ''\n })\n\n return translatedHTML\n}\n","import {Adapter} from 'sanity-translations-tab'\nimport {getLocales} from './getLocales'\nimport {getTranslationTask} from './getTranslationTask'\nimport {createTask} from './createTask'\nimport {getTranslation} from './getTranslation'\n\nexport const SmartlingAdapter: Adapter = {\n getLocales,\n getTranslationTask,\n createTask,\n getTranslation,\n}\n","import {SerializedDocument} from 'sanity-naive-html-serializer'\nimport {\n TranslationsTab,\n baseDocumentLevelConfig,\n legacyDocumentLevelConfig as baseLegacyDocumentLevelConfig,\n baseFieldLevelConfig,\n findLatestDraft,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n Adapter,\n legacyDocumentLevelPatch,\n documentLevelPatch,\n fieldLevelPatch,\n TranslationFunctionContext,\n} from 'sanity-translations-tab'\nimport {SmartlingAdapter} from './adapter'\n\ninterface ConfigOptions {\n adapter: Adapter\n secretsNamespace: string | null\n exportForTranslation: (\n id: string,\n context: TranslationFunctionContext\n ) => Promise<SerializedDocument>\n importTranslation: (\n id: string,\n localeId: string,\n doc: string,\n context: TranslationFunctionContext\n ) => Promise<void>\n}\nconst defaultDocumentLevelConfig: ConfigOptions = {\n ...baseDocumentLevelConfig,\n adapter: SmartlingAdapter,\n}\n\nconst legacyDocumentLevelConfig: ConfigOptions = {\n ...baseLegacyDocumentLevelConfig,\n adapter: SmartlingAdapter,\n}\n\nconst defaultFieldLevelConfig: ConfigOptions = {\n ...baseFieldLevelConfig,\n adapter: SmartlingAdapter,\n}\n\nexport {\n TranslationsTab,\n findLatestDraft,\n legacyDocumentLevelPatch,\n documentLevelPatch,\n fieldLevelPatch,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n SmartlingAdapter,\n legacyDocumentLevelConfig,\n defaultDocumentLevelConfig,\n defaultFieldLevelConfig,\n}\n"],"names":["authenticate","secrets","url","headers","secret","proxy","Error","fetch","method","body","JSON","stringify","then","res","json","response","data","accessToken","getHeaders","Authorization","concat","findExistingJob","documentId","project","items","length","correctJob","find","item","jobName","translationJobUid","getLocales","targetLocales","getTranslationTask","taskId","locales","progressUrl","smartlingTask","contentProgressReport","map","_a","progress","percentComplete","workflowProgressReportList","progressItem","workflowStepSummaryReportItemList","lastStep","at","wordCount","Math","floor","totalWordCount","localeId","targetLocaleId","linkToVendorTask","createJob","localeIds","targetLocaleIds","createJobBatch","jobId","documentName","workflowUid","reqBody","authorize","fileUris","localeWorkflows","l","batchUid","uploadFileToBatch","document","formData","FormData","append","name","htmlBuffer","Buffer","from","content","Blob","forEach","createTask","uploadFileRes","console","info","getTranslation","translatedHTML","errors","errMsg","message","SmartlingAdapter","defaultDocumentLevelConfig","baseDocumentLevelConfig","adapter","legacyDocumentLevelConfig","baseLegacyDocumentLevelConfig","defaultFieldLevelConfig","baseFieldLevelConfig"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/adapter/helpers.ts","../src/adapter/getLocales.ts","../src/adapter/getTranslationTask.ts","../src/adapter/createTask.ts","../src/adapter/getTranslation.ts","../src/adapter/index.ts","../src/index.ts"],"sourcesContent":["import {Secrets} from 'sanity-translations-tab'\n\ninterface Headers {\n [key: string]: string\n}\n\nexport const authenticate = (secrets: Secrets): Promise<string> => {\n const url = 'https://api.smartling.com/auth-api/v2/authenticate'\n const headers = {\n 'content-type': 'application/json',\n 'X-URL': url,\n }\n const {secret, proxy} = secrets\n if (!secret || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a secret key and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',\n )\n }\n return fetch(proxy, {\n headers,\n method: 'POST',\n body: JSON.stringify(secret),\n })\n .then((res) => res.json())\n .then((res) => res.response.data.accessToken)\n}\n\nexport const getHeaders = (url: string, accessToken: string): Headers => ({\n Authorization: `Bearer ${accessToken}`,\n 'X-URL': url,\n})\n\nexport const findExistingJob = async (\n documentId: string,\n secrets: Secrets,\n accessToken: string,\n): Promise<string> => {\n const {project, proxy} = secrets\n if (!project || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',\n )\n }\n const url = `https://api.smartling.com/jobs-api/v3/projects/${project}/jobs?jobName=${documentId}`\n //first, try fetching from name resolution\n let items = await fetch(proxy, {\n headers: getHeaders(url, accessToken),\n })\n .then((res) => res.json())\n .then((res) => res?.response?.data?.items)\n\n if (!items || !items.length) {\n //if that fails, try fetching by fileUri and check the referenceNumber\n const refUrl = `https://api.smartling.com/jobs-api/v3/projects/${project}/jobs/search`\n items = await fetch(proxy, {\n headers: {\n ...getHeaders(refUrl, accessToken),\n 'content-type': 'application/json',\n },\n method: 'POST',\n body: JSON.stringify({\n fileUris: [documentId],\n }),\n })\n .then((res) => res.json())\n .then((res) => res?.response?.data?.items)\n }\n\n if (items.length) {\n //smartling will fuzzy match job names. We need to be precise.\n const correctJob = items.find(\n (item: {jobName: string; referenceNumber: string}) =>\n (item.jobName && item.jobName === documentId) ||\n (item.referenceNumber && item.referenceNumber === documentId),\n )\n\n if (correctJob) {\n return correctJob.translationJobUid\n }\n }\n return ''\n}\n","import {authenticate, getHeaders} from './helpers'\nimport {Secrets} from 'sanity-translations-tab'\nimport {Adapter} from 'sanity-translations-tab'\n\nexport const getLocales: Adapter['getLocales'] = async (secrets: Secrets | null) => {\n if (!secrets?.project || !secrets?.secret || !secrets?.proxy) {\n return []\n }\n const {project, proxy} = secrets\n const url = `https://api.smartling.com/projects-api/v2/projects/${project}`\n const accessToken = await authenticate(secrets)\n return fetch(proxy, {\n method: 'GET',\n headers: getHeaders(url, accessToken),\n })\n .then((res) => res.json())\n .then((res) => res.response.data.targetLocales)\n}\n","import {authenticate, getHeaders, findExistingJob} from './helpers'\nimport {Adapter, Secrets} from 'sanity-translations-tab'\n\ninterface WorkflowProgressItem {\n workflowStepSummaryReportItemList: {\n wordCount: number\n }[]\n}\n\ninterface SmartlingProgressItem {\n targetLocaleId: string\n progress: {\n percentComplete: number\n totalWordCount: number\n }\n workflowProgressReportList: WorkflowProgressItem[]\n}\n\nexport const getTranslationTask: Adapter['getTranslationTask'] = async (\n documentId: string,\n secrets: Secrets | null,\n) => {\n if (!secrets?.project || !secrets?.secret || !secrets?.proxy) {\n return {\n documentId,\n taskId: documentId,\n locales: [],\n }\n }\n\n const {project, proxy} = secrets\n\n const accessToken = await authenticate(secrets)\n const taskId = await findExistingJob(documentId, secrets, accessToken)\n if (!taskId) {\n return {\n documentId,\n taskId: documentId,\n locales: [],\n }\n }\n\n const progressUrl = `https://api.smartling.com/jobs-api/v3/projects/${project}/jobs/${taskId}/progress`\n const smartlingTask = await fetch(proxy, {\n method: 'GET',\n headers: getHeaders(progressUrl, accessToken),\n })\n .then((res) => res.json())\n .then((res) => res.response.data)\n\n let locales = []\n if (smartlingTask && smartlingTask.contentProgressReport) {\n locales = smartlingTask.contentProgressReport.map((item: SmartlingProgressItem) => {\n let progress = item.progress ? item.progress.percentComplete : 0\n if (\n item.workflowProgressReportList &&\n item.workflowProgressReportList.length > 0 &&\n item.progress\n ) {\n //default to the first workflow -- it's likely what is being used\n const progressItem = item.workflowProgressReportList[0]\n //this is a list of the various steps in the workflow\n if (\n progressItem.workflowStepSummaryReportItemList &&\n progressItem.workflowStepSummaryReportItemList.length > 1\n ) {\n //get the last step in the workflow -- usually \"published\"\n const lastStep = progressItem.workflowStepSummaryReportItemList.at(-1)\n //get the percentage of how many words have reached the last step\n if (lastStep && lastStep.wordCount >= 0) {\n progress = Math.floor((lastStep.wordCount / item.progress.totalWordCount) * 100) ?? 0\n }\n }\n }\n return {\n localeId: item.targetLocaleId,\n progress,\n }\n })\n }\n\n return {\n documentId,\n locales,\n //since our download is tied to document id for smartling, keep track of it as a task\n taskId: documentId,\n linkToVendorTask: `https://dashboard.smartling.com/app/projects/${project}/account-jobs/${project}:${taskId}`,\n }\n}\n","import {authenticate, getHeaders, findExistingJob} from './helpers'\nimport {Adapter, Secrets} from 'sanity-translations-tab'\nimport {getTranslationTask} from './getTranslationTask'\nimport {Buffer} from 'buffer'\n\nconst createJob = (\n jobName: string,\n secrets: Secrets,\n localeIds: string[],\n accessToken: string,\n documentId: string,\n) => {\n const {project, proxy} = secrets\n if (!project || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',\n )\n }\n\n const url = `https://api.smartling.com/jobs-api/v3/projects/${project}/jobs`\n return fetch(proxy, {\n method: 'POST',\n headers: {\n ...getHeaders(url, accessToken),\n 'content-type': 'application/json',\n },\n body: JSON.stringify({\n jobName,\n targetLocaleIds: localeIds,\n referenceNumber: documentId,\n }),\n })\n .then((res) => res.json())\n .then((res) => res.response.data.translationJobUid)\n}\n\n/* we're using batches here because it eliminates some\n * new string authorization issues for updating existing jobs,\n * and is able to be used for new bulk\n * job functionality.\n */\n\nconst createJobBatch = (\n jobId: string,\n secrets: Secrets,\n documentId: string,\n accessToken: string,\n localeIds: string[],\n workflowUid?: string,\n //eslint-disable-next-line max-params\n) => {\n const {project, proxy} = secrets\n if (!project || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',\n )\n }\n const url = `https://api.smartling.com/job-batches-api/v2/projects/${project}/batches`\n const reqBody: {\n authorize: boolean\n translationJobUid: string\n fileUris: string[]\n localeWorkflows?: {targetLocaleId: string; workflowUid: string}[]\n } = {\n authorize: true,\n translationJobUid: jobId,\n fileUris: [documentId],\n }\n\n if (workflowUid) {\n reqBody.localeWorkflows = localeIds.map((l) => ({\n targetLocaleId: l,\n workflowUid,\n }))\n }\n\n return fetch(proxy, {\n method: 'POST',\n headers: {\n ...getHeaders(url, accessToken),\n 'content-type': 'application/json',\n },\n body: JSON.stringify(reqBody),\n })\n .then((res) => res.json())\n .then((res) => res.response.data.batchUid)\n}\n\nconst uploadFileToBatch = (\n batchUid: string,\n documentId: string,\n document: Record<string, any>,\n secrets: Secrets,\n localeIds: string[],\n accessToken: string,\n //eslint-disable-next-line max-params\n) => {\n const {project, proxy} = secrets\n if (!project || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',\n )\n }\n const url = `https://api.smartling.com/job-batches-api/v2/projects/${project}/batches/${batchUid}/file`\n const formData = new FormData()\n formData.append('fileUri', documentId)\n formData.append('fileType', 'html')\n const htmlBuffer = Buffer.from(document.content, 'utf-8')\n formData.append('file', new Blob([htmlBuffer]), `${document.name}.html`)\n localeIds.forEach((localeId) => formData.append('localeIdsToAuthorize[]', localeId))\n\n return fetch(proxy, {\n method: 'POST',\n headers: getHeaders(url, accessToken),\n body: formData,\n }).then((res) => res.json())\n}\n\nexport const createTask: Adapter['createTask'] = async (\n documentId: string,\n document: Record<string, any>,\n localeIds: string[],\n secrets: Secrets | null,\n workflowUid?: string,\n) => {\n if (!secrets?.project || !secrets?.secret || !secrets?.proxy) {\n throw new Error(\n 'The Smartling adapter requires a project ID, a secret key, and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',\n )\n }\n\n const accessToken = await authenticate(secrets)\n\n let taskId = await findExistingJob(document.name, secrets, accessToken)\n if (!taskId) {\n taskId = await createJob(document.name, secrets, localeIds, accessToken, documentId)\n }\n\n const batchUid = await createJobBatch(\n taskId,\n secrets,\n documentId,\n accessToken,\n localeIds,\n workflowUid,\n )\n const uploadFileRes = await uploadFileToBatch(\n batchUid,\n documentId,\n document,\n secrets,\n localeIds,\n accessToken,\n )\n //eslint-disable-next-line no-console -- for developer debugging\n console.info('Upload status from Smartling: ', uploadFileRes)\n\n return getTranslationTask(documentId, secrets)\n}\n","import {authenticate, getHeaders} from './helpers'\nimport {Adapter, Secrets} from 'sanity-translations-tab'\n\nexport const getTranslation: Adapter['getTranslation'] = async (\n taskId: string,\n localeId: string,\n secrets: Secrets | null,\n) => {\n if (!secrets?.project || !secrets?.secret || !secrets?.proxy) {\n throw new Error(\n 'The Smartling adapter requires a project ID, a secret key, and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',\n )\n }\n\n const {project, proxy} = secrets\n\n const url = `https://api.smartling.com/files-api/v2/projects/${project}/locales/${localeId}/file?fileUri=${taskId}&retrievalType=pending`\n const accessToken = await authenticate(secrets)\n const translatedHTML = await fetch(proxy, {\n method: 'GET',\n headers: getHeaders(url, accessToken),\n })\n .then((res) => res.json())\n .then((res) => {\n if (res.body) {\n return res.body\n } else if (res.response.errors) {\n const errMsg =\n res.response.errors[0]?.message || 'Error retrieving translation from Smartling'\n throw new Error(errMsg)\n }\n return ''\n })\n\n return translatedHTML\n}\n","import {Adapter} from 'sanity-translations-tab'\nimport {getLocales} from './getLocales'\nimport {getTranslationTask} from './getTranslationTask'\nimport {createTask} from './createTask'\nimport {getTranslation} from './getTranslation'\n\nexport const SmartlingAdapter: Adapter = {\n getLocales,\n getTranslationTask,\n createTask,\n getTranslation,\n}\n","import {SerializedDocument} from 'sanity-naive-html-serializer'\nimport {\n TranslationsTab,\n baseDocumentLevelConfig,\n legacyDocumentLevelConfig as baseLegacyDocumentLevelConfig,\n baseFieldLevelConfig,\n findLatestDraft,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n Adapter,\n legacyDocumentLevelPatch,\n documentLevelPatch,\n fieldLevelPatch,\n TranslationFunctionContext,\n} from 'sanity-translations-tab'\nimport {SmartlingAdapter} from './adapter'\n\ninterface ConfigOptions {\n adapter: Adapter\n secretsNamespace: string | null\n exportForTranslation: (\n id: string,\n context: TranslationFunctionContext,\n ) => Promise<SerializedDocument>\n importTranslation: (\n id: string,\n localeId: string,\n doc: string,\n context: TranslationFunctionContext,\n ) => Promise<void>\n}\nconst defaultDocumentLevelConfig: ConfigOptions = {\n ...baseDocumentLevelConfig,\n adapter: SmartlingAdapter,\n}\n\nconst legacyDocumentLevelConfig: ConfigOptions = {\n ...baseLegacyDocumentLevelConfig,\n adapter: SmartlingAdapter,\n}\n\nconst defaultFieldLevelConfig: ConfigOptions = {\n ...baseFieldLevelConfig,\n adapter: SmartlingAdapter,\n}\n\nexport {\n TranslationsTab,\n findLatestDraft,\n legacyDocumentLevelPatch,\n documentLevelPatch,\n fieldLevelPatch,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n SmartlingAdapter,\n legacyDocumentLevelConfig,\n defaultDocumentLevelConfig,\n defaultFieldLevelConfig,\n}\n"],"names":["authenticate","secrets","url","headers","secret","proxy","Error","fetch","method","body","JSON","stringify","then","res","json","response","data","accessToken","getHeaders","Authorization","concat","findExistingJob","documentId","project","items","_a","_b","length","refUrl","fileUris","correctJob","find","item","jobName","referenceNumber","translationJobUid","getLocales","targetLocales","getTranslationTask","taskId","locales","progressUrl","smartlingTask","contentProgressReport","map","progress","percentComplete","workflowProgressReportList","progressItem","workflowStepSummaryReportItemList","lastStep","at","wordCount","Math","floor","totalWordCount","localeId","targetLocaleId","linkToVendorTask","createJob","localeIds","targetLocaleIds","createJobBatch","jobId","workflowUid","reqBody","authorize","localeWorkflows","l","batchUid","uploadFileToBatch","document","formData","FormData","append","htmlBuffer","Buffer","from","content","Blob","name","forEach","createTask","uploadFileRes","console","info","getTranslation","translatedHTML","errors","errMsg","message","SmartlingAdapter","defaultDocumentLevelConfig","baseDocumentLevelConfig","adapter","legacyDocumentLevelConfig","baseLegacyDocumentLevelConfig","defaultFieldLevelConfig","baseFieldLevelConfig"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -28,7 +28,7 @@ const getHeaders = (url, accessToken) => ({
|
|
|
28
28
|
Authorization: "Bearer ".concat(accessToken),
|
|
29
29
|
"X-URL": url
|
|
30
30
|
});
|
|
31
|
-
const findExistingJob = (documentId, secrets, accessToken) => {
|
|
31
|
+
const findExistingJob = async (documentId, secrets, accessToken) => {
|
|
32
32
|
const {
|
|
33
33
|
project,
|
|
34
34
|
proxy
|
|
@@ -37,19 +37,35 @@ const findExistingJob = (documentId, secrets, accessToken) => {
|
|
|
37
37
|
throw new Error("The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.");
|
|
38
38
|
}
|
|
39
39
|
const url = "https://api.smartling.com/jobs-api/v3/projects/".concat(project, "/jobs?jobName=").concat(documentId);
|
|
40
|
-
|
|
41
|
-
method: "POST",
|
|
40
|
+
let items = await fetch(proxy, {
|
|
42
41
|
headers: getHeaders(url, accessToken)
|
|
43
42
|
}).then(res => res.json()).then(res => {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if (correctJob) {
|
|
47
|
-
return correctJob.translationJobUid;
|
|
48
|
-
}
|
|
49
|
-
return "";
|
|
50
|
-
}
|
|
51
|
-
return "";
|
|
43
|
+
var _a, _b;
|
|
44
|
+
return (_b = (_a = res == null ? void 0 : res.response) == null ? void 0 : _a.data) == null ? void 0 : _b.items;
|
|
52
45
|
});
|
|
46
|
+
if (!items || !items.length) {
|
|
47
|
+
const refUrl = "https://api.smartling.com/jobs-api/v3/projects/".concat(project, "/jobs/search");
|
|
48
|
+
items = await fetch(proxy, {
|
|
49
|
+
headers: {
|
|
50
|
+
...getHeaders(refUrl, accessToken),
|
|
51
|
+
"content-type": "application/json"
|
|
52
|
+
},
|
|
53
|
+
method: "POST",
|
|
54
|
+
body: JSON.stringify({
|
|
55
|
+
fileUris: [documentId]
|
|
56
|
+
})
|
|
57
|
+
}).then(res => res.json()).then(res => {
|
|
58
|
+
var _a, _b;
|
|
59
|
+
return (_b = (_a = res == null ? void 0 : res.response) == null ? void 0 : _a.data) == null ? void 0 : _b.items;
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
if (items.length) {
|
|
63
|
+
const correctJob = items.find(item => item.jobName && item.jobName === documentId || item.referenceNumber && item.referenceNumber === documentId);
|
|
64
|
+
if (correctJob) {
|
|
65
|
+
return correctJob.translationJobUid;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return "";
|
|
53
69
|
};
|
|
54
70
|
const getLocales = async secrets => {
|
|
55
71
|
if (!(secrets == null ? void 0 : secrets.project) || !(secrets == null ? void 0 : secrets.secret) || !(secrets == null ? void 0 : secrets.proxy)) {
|
|
@@ -120,7 +136,7 @@ const getTranslationTask = async (documentId, secrets) => {
|
|
|
120
136
|
linkToVendorTask: "https://dashboard.smartling.com/app/projects/".concat(project, "/account-jobs/").concat(project, ":").concat(taskId)
|
|
121
137
|
};
|
|
122
138
|
};
|
|
123
|
-
const createJob = (jobName, secrets, localeIds, accessToken) => {
|
|
139
|
+
const createJob = (jobName, secrets, localeIds, accessToken, documentId) => {
|
|
124
140
|
const {
|
|
125
141
|
project,
|
|
126
142
|
proxy
|
|
@@ -137,11 +153,12 @@ const createJob = (jobName, secrets, localeIds, accessToken) => {
|
|
|
137
153
|
},
|
|
138
154
|
body: JSON.stringify({
|
|
139
155
|
jobName,
|
|
140
|
-
targetLocaleIds: localeIds
|
|
156
|
+
targetLocaleIds: localeIds,
|
|
157
|
+
referenceNumber: documentId
|
|
141
158
|
})
|
|
142
159
|
}).then(res => res.json()).then(res => res.response.data.translationJobUid);
|
|
143
160
|
};
|
|
144
|
-
const createJobBatch = (jobId, secrets,
|
|
161
|
+
const createJobBatch = (jobId, secrets, documentId, accessToken, localeIds, workflowUid) => {
|
|
145
162
|
const {
|
|
146
163
|
project,
|
|
147
164
|
proxy
|
|
@@ -153,7 +170,7 @@ const createJobBatch = (jobId, secrets, documentName, accessToken, localeIds, wo
|
|
|
153
170
|
const reqBody = {
|
|
154
171
|
authorize: true,
|
|
155
172
|
translationJobUid: jobId,
|
|
156
|
-
fileUris: [
|
|
173
|
+
fileUris: [documentId]
|
|
157
174
|
};
|
|
158
175
|
if (workflowUid) {
|
|
159
176
|
reqBody.localeWorkflows = localeIds.map(l => ({
|
|
@@ -170,7 +187,7 @@ const createJobBatch = (jobId, secrets, documentName, accessToken, localeIds, wo
|
|
|
170
187
|
body: JSON.stringify(reqBody)
|
|
171
188
|
}).then(res => res.json()).then(res => res.response.data.batchUid);
|
|
172
189
|
};
|
|
173
|
-
const uploadFileToBatch = (batchUid, document, secrets, localeIds, accessToken) => {
|
|
190
|
+
const uploadFileToBatch = (batchUid, documentId, document, secrets, localeIds, accessToken) => {
|
|
174
191
|
const {
|
|
175
192
|
project,
|
|
176
193
|
proxy
|
|
@@ -180,7 +197,7 @@ const uploadFileToBatch = (batchUid, document, secrets, localeIds, accessToken)
|
|
|
180
197
|
}
|
|
181
198
|
const url = "https://api.smartling.com/job-batches-api/v2/projects/".concat(project, "/batches/").concat(batchUid, "/file");
|
|
182
199
|
const formData = new FormData();
|
|
183
|
-
formData.append("fileUri",
|
|
200
|
+
formData.append("fileUri", documentId);
|
|
184
201
|
formData.append("fileType", "html");
|
|
185
202
|
const htmlBuffer = buffer.Buffer.from(document.content, "utf-8");
|
|
186
203
|
formData.append("file", new Blob([htmlBuffer]), "".concat(document.name, ".html"));
|
|
@@ -198,10 +215,10 @@ const createTask = async (documentId, document, localeIds, secrets, workflowUid)
|
|
|
198
215
|
const accessToken = await authenticate(secrets);
|
|
199
216
|
let taskId = await findExistingJob(document.name, secrets, accessToken);
|
|
200
217
|
if (!taskId) {
|
|
201
|
-
taskId = await createJob(document.name, secrets, localeIds, accessToken);
|
|
218
|
+
taskId = await createJob(document.name, secrets, localeIds, accessToken, documentId);
|
|
202
219
|
}
|
|
203
|
-
const batchUid = await createJobBatch(taskId, secrets,
|
|
204
|
-
const uploadFileRes = await uploadFileToBatch(batchUid, document, secrets, localeIds, accessToken);
|
|
220
|
+
const batchUid = await createJobBatch(taskId, secrets, documentId, accessToken, localeIds, workflowUid);
|
|
221
|
+
const uploadFileRes = await uploadFileToBatch(batchUid, documentId, document, secrets, localeIds, accessToken);
|
|
205
222
|
console.info("Upload status from Smartling: ", uploadFileRes);
|
|
206
223
|
return getTranslationTask(documentId, secrets);
|
|
207
224
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/adapter/helpers.ts","../src/adapter/getLocales.ts","../src/adapter/getTranslationTask.ts","../src/adapter/createTask.ts","../src/adapter/getTranslation.ts","../src/adapter/index.ts","../src/index.ts"],"sourcesContent":["import {Secrets} from 'sanity-translations-tab'\n\ninterface Headers {\n [key: string]: string\n}\n\nexport const authenticate = (secrets: Secrets): Promise<string> => {\n const url = 'https://api.smartling.com/auth-api/v2/authenticate'\n const headers = {\n 'content-type': 'application/json',\n 'X-URL': url,\n }\n const {secret, proxy} = secrets\n if (!secret || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a secret key and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'\n )\n }\n return fetch(proxy, {\n headers,\n method: 'POST',\n body: JSON.stringify(secret),\n })\n .then((res) => res.json())\n .then((res) => res.response.data.accessToken)\n}\n\nexport const getHeaders = (url: string, accessToken: string): Headers => ({\n Authorization: `Bearer ${accessToken}`,\n 'X-URL': url,\n})\n\nexport const findExistingJob = (\n documentId: string,\n secrets: Secrets,\n accessToken: string\n): Promise<string> => {\n const {project, proxy} = secrets\n if (!project || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'\n )\n }\n const url = `https://api.smartling.com/jobs-api/v3/projects/${project}/jobs?jobName=${documentId}`\n return fetch(proxy, {\n method: 'POST',\n headers: getHeaders(url, accessToken),\n })\n .then((res) => res.json())\n .then((res) => {\n if (res.response.data.items.length) {\n //smartling will fuzzy match job names. We need to be precise.\n const correctJob = res.response.data.items.find(\n (item: {jobName: string}) => item.jobName && item.jobName === documentId\n )\n if (correctJob) {\n return correctJob.translationJobUid\n }\n return ''\n }\n return ''\n })\n}\n","import {authenticate, getHeaders} from './helpers'\nimport {Secrets} from 'sanity-translations-tab'\nimport {Adapter} from 'sanity-translations-tab'\n\nexport const getLocales: Adapter['getLocales'] = async (secrets: Secrets | null) => {\n if (!secrets?.project || !secrets?.secret || !secrets?.proxy) {\n return []\n }\n const {project, proxy} = secrets\n const url = `https://api.smartling.com/projects-api/v2/projects/${project}`\n const accessToken = await authenticate(secrets)\n return fetch(proxy, {\n method: 'GET',\n headers: getHeaders(url, accessToken),\n })\n .then((res) => res.json())\n .then((res) => res.response.data.targetLocales)\n}\n","import {authenticate, getHeaders, findExistingJob} from './helpers'\nimport {Adapter, Secrets} from 'sanity-translations-tab'\n\ninterface WorkflowProgressItem {\n workflowStepSummaryReportItemList: {\n wordCount: number\n }[]\n}\n\ninterface SmartlingProgressItem {\n targetLocaleId: string\n progress: {\n percentComplete: number\n totalWordCount: number\n }\n workflowProgressReportList: WorkflowProgressItem[]\n}\n\nexport const getTranslationTask: Adapter['getTranslationTask'] = async (\n documentId: string,\n secrets: Secrets | null\n) => {\n if (!secrets?.project || !secrets?.secret || !secrets?.proxy) {\n return {\n documentId,\n taskId: documentId,\n locales: [],\n }\n }\n\n const {project, proxy} = secrets\n\n const accessToken = await authenticate(secrets)\n const taskId = await findExistingJob(documentId, secrets, accessToken)\n if (!taskId) {\n return {\n documentId,\n taskId: documentId,\n locales: [],\n }\n }\n\n const progressUrl = `https://api.smartling.com/jobs-api/v3/projects/${project}/jobs/${taskId}/progress`\n const smartlingTask = await fetch(proxy, {\n method: 'GET',\n headers: getHeaders(progressUrl, accessToken),\n })\n .then((res) => res.json())\n .then((res) => res.response.data)\n\n let locales = []\n if (smartlingTask && smartlingTask.contentProgressReport) {\n locales = smartlingTask.contentProgressReport.map((item: SmartlingProgressItem) => {\n let progress = item.progress ? item.progress.percentComplete : 0\n if (\n item.workflowProgressReportList &&\n item.workflowProgressReportList.length > 0 &&\n item.progress\n ) {\n //default to the first workflow -- it's likely what is being used\n const progressItem = item.workflowProgressReportList[0]\n //this is a list of the various steps in the workflow\n if (\n progressItem.workflowStepSummaryReportItemList &&\n progressItem.workflowStepSummaryReportItemList.length > 1\n ) {\n //get the last step in the workflow -- usually \"published\"\n const lastStep = progressItem.workflowStepSummaryReportItemList.at(-1)\n //get the percentage of how many words have reached the last step\n if (lastStep && lastStep.wordCount >= 0) {\n progress = Math.floor((lastStep.wordCount / item.progress.totalWordCount) * 100) ?? 0\n }\n }\n }\n return {\n localeId: item.targetLocaleId,\n progress,\n }\n })\n }\n\n return {\n documentId,\n locales,\n //since our download is tied to document id for smartling, keep track of it as a task\n taskId: documentId,\n linkToVendorTask: `https://dashboard.smartling.com/app/projects/${project}/account-jobs/${project}:${taskId}`,\n }\n}\n","import {authenticate, getHeaders, findExistingJob} from './helpers'\nimport {Adapter, Secrets} from 'sanity-translations-tab'\nimport {getTranslationTask} from './getTranslationTask'\nimport {Buffer} from 'buffer'\n\nconst createJob = (jobName: string, secrets: Secrets, localeIds: string[], accessToken: string) => {\n const {project, proxy} = secrets\n if (!project || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'\n )\n }\n\n const url = `https://api.smartling.com/jobs-api/v3/projects/${project}/jobs`\n return fetch(proxy, {\n method: 'POST',\n headers: {\n ...getHeaders(url, accessToken),\n 'content-type': 'application/json',\n },\n body: JSON.stringify({\n jobName,\n targetLocaleIds: localeIds,\n }),\n })\n .then((res) => res.json())\n .then((res) => res.response.data.translationJobUid)\n}\n\n/* we're using batches here because it eliminates some\n * new string authorization issues for updating existing jobs,\n * and is able to be used for new bulk\n * job functionality.\n */\n\nconst createJobBatch = (\n jobId: string,\n secrets: Secrets,\n documentName: string,\n accessToken: string,\n localeIds: string[],\n workflowUid?: string\n //eslint-disable-next-line max-params\n) => {\n const {project, proxy} = secrets\n if (!project || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'\n )\n }\n const url = `https://api.smartling.com/job-batches-api/v2/projects/${project}/batches`\n const reqBody: {\n authorize: boolean\n translationJobUid: string\n fileUris: string[]\n localeWorkflows?: {targetLocaleId: string; workflowUid: string}[]\n } = {\n authorize: true,\n translationJobUid: jobId,\n fileUris: [documentName],\n }\n\n if (workflowUid) {\n reqBody.localeWorkflows = localeIds.map((l) => ({\n targetLocaleId: l,\n workflowUid,\n }))\n }\n\n return fetch(proxy, {\n method: 'POST',\n headers: {\n ...getHeaders(url, accessToken),\n 'content-type': 'application/json',\n },\n body: JSON.stringify(reqBody),\n })\n .then((res) => res.json())\n .then((res) => res.response.data.batchUid)\n}\n\nconst uploadFileToBatch = (\n batchUid: string,\n document: Record<string, any>,\n secrets: Secrets,\n localeIds: string[],\n accessToken: string\n) => {\n const {project, proxy} = secrets\n if (!project || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'\n )\n }\n const url = `https://api.smartling.com/job-batches-api/v2/projects/${project}/batches/${batchUid}/file`\n const formData = new FormData()\n formData.append('fileUri', document.name)\n formData.append('fileType', 'html')\n const htmlBuffer = Buffer.from(document.content, 'utf-8')\n formData.append('file', new Blob([htmlBuffer]), `${document.name}.html`)\n localeIds.forEach((localeId) => formData.append('localeIdsToAuthorize[]', localeId))\n\n return fetch(proxy, {\n method: 'POST',\n headers: getHeaders(url, accessToken),\n body: formData,\n }).then((res) => res.json())\n}\n\nexport const createTask: Adapter['createTask'] = async (\n documentId: string,\n document: Record<string, any>,\n localeIds: string[],\n secrets: Secrets | null,\n workflowUid?: string\n) => {\n if (!secrets?.project || !secrets?.secret || !secrets?.proxy) {\n throw new Error(\n 'The Smartling adapter requires a project ID, a secret key, and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'\n )\n }\n\n const accessToken = await authenticate(secrets)\n\n let taskId = await findExistingJob(document.name, secrets, accessToken)\n if (!taskId) {\n taskId = await createJob(document.name, secrets, localeIds, accessToken)\n }\n\n const batchUid = await createJobBatch(\n taskId,\n secrets,\n document.name,\n accessToken,\n localeIds,\n workflowUid\n )\n const uploadFileRes = await uploadFileToBatch(batchUid, document, secrets, localeIds, accessToken)\n //eslint-disable-next-line no-console -- for developer debugging\n console.info('Upload status from Smartling: ', uploadFileRes)\n\n return getTranslationTask(documentId, secrets)\n}\n","import {authenticate, getHeaders} from './helpers'\nimport {Adapter, Secrets} from 'sanity-translations-tab'\n\nexport const getTranslation: Adapter['getTranslation'] = async (\n taskId: string,\n localeId: string,\n secrets: Secrets | null\n) => {\n if (!secrets?.project || !secrets?.secret || !secrets?.proxy) {\n throw new Error(\n 'The Smartling adapter requires a project ID, a secret key, and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'\n )\n }\n\n const {project, proxy} = secrets\n\n const url = `https://api.smartling.com/files-api/v2/projects/${project}/locales/${localeId}/file?fileUri=${taskId}&retrievalType=pending`\n const accessToken = await authenticate(secrets)\n const translatedHTML = await fetch(proxy, {\n method: 'GET',\n headers: getHeaders(url, accessToken),\n })\n .then((res) => res.json())\n .then((res) => {\n if (res.body) {\n return res.body\n } else if (res.response.errors) {\n const errMsg =\n res.response.errors[0]?.message || 'Error retrieving translation from Smartling'\n throw new Error(errMsg)\n }\n return ''\n })\n\n return translatedHTML\n}\n","import {Adapter} from 'sanity-translations-tab'\nimport {getLocales} from './getLocales'\nimport {getTranslationTask} from './getTranslationTask'\nimport {createTask} from './createTask'\nimport {getTranslation} from './getTranslation'\n\nexport const SmartlingAdapter: Adapter = {\n getLocales,\n getTranslationTask,\n createTask,\n getTranslation,\n}\n","import {SerializedDocument} from 'sanity-naive-html-serializer'\nimport {\n TranslationsTab,\n baseDocumentLevelConfig,\n legacyDocumentLevelConfig as baseLegacyDocumentLevelConfig,\n baseFieldLevelConfig,\n findLatestDraft,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n Adapter,\n legacyDocumentLevelPatch,\n documentLevelPatch,\n fieldLevelPatch,\n TranslationFunctionContext,\n} from 'sanity-translations-tab'\nimport {SmartlingAdapter} from './adapter'\n\ninterface ConfigOptions {\n adapter: Adapter\n secretsNamespace: string | null\n exportForTranslation: (\n id: string,\n context: TranslationFunctionContext\n ) => Promise<SerializedDocument>\n importTranslation: (\n id: string,\n localeId: string,\n doc: string,\n context: TranslationFunctionContext\n ) => Promise<void>\n}\nconst defaultDocumentLevelConfig: ConfigOptions = {\n ...baseDocumentLevelConfig,\n adapter: SmartlingAdapter,\n}\n\nconst legacyDocumentLevelConfig: ConfigOptions = {\n ...baseLegacyDocumentLevelConfig,\n adapter: SmartlingAdapter,\n}\n\nconst defaultFieldLevelConfig: ConfigOptions = {\n ...baseFieldLevelConfig,\n adapter: SmartlingAdapter,\n}\n\nexport {\n TranslationsTab,\n findLatestDraft,\n legacyDocumentLevelPatch,\n documentLevelPatch,\n fieldLevelPatch,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n SmartlingAdapter,\n legacyDocumentLevelConfig,\n defaultDocumentLevelConfig,\n defaultFieldLevelConfig,\n}\n"],"names":["authenticate","secrets","url","headers","secret","proxy","Error","fetch","method","body","JSON","stringify","then","res","json","response","data","accessToken","getHeaders","Authorization","concat","findExistingJob","documentId","project","items","length","correctJob","find","item","jobName","translationJobUid","getLocales","targetLocales","getTranslationTask","taskId","locales","progressUrl","smartlingTask","contentProgressReport","map","_a","progress","percentComplete","workflowProgressReportList","progressItem","workflowStepSummaryReportItemList","lastStep","at","wordCount","Math","floor","totalWordCount","localeId","targetLocaleId","linkToVendorTask","createJob","localeIds","targetLocaleIds","createJobBatch","jobId","documentName","workflowUid","reqBody","authorize","fileUris","localeWorkflows","l","batchUid","uploadFileToBatch","document","formData","FormData","append","name","htmlBuffer","Buffer","from","content","Blob","forEach","createTask","uploadFileRes","console","info","getTranslation","translatedHTML","errors","errMsg","message","SmartlingAdapter","defaultDocumentLevelConfig","baseDocumentLevelConfig","adapter","legacyDocumentLevelConfig","baseLegacyDocumentLevelConfig","defaultFieldLevelConfig","baseFieldLevelConfig"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/adapter/helpers.ts","../src/adapter/getLocales.ts","../src/adapter/getTranslationTask.ts","../src/adapter/createTask.ts","../src/adapter/getTranslation.ts","../src/adapter/index.ts","../src/index.ts"],"sourcesContent":["import {Secrets} from 'sanity-translations-tab'\n\ninterface Headers {\n [key: string]: string\n}\n\nexport const authenticate = (secrets: Secrets): Promise<string> => {\n const url = 'https://api.smartling.com/auth-api/v2/authenticate'\n const headers = {\n 'content-type': 'application/json',\n 'X-URL': url,\n }\n const {secret, proxy} = secrets\n if (!secret || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a secret key and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',\n )\n }\n return fetch(proxy, {\n headers,\n method: 'POST',\n body: JSON.stringify(secret),\n })\n .then((res) => res.json())\n .then((res) => res.response.data.accessToken)\n}\n\nexport const getHeaders = (url: string, accessToken: string): Headers => ({\n Authorization: `Bearer ${accessToken}`,\n 'X-URL': url,\n})\n\nexport const findExistingJob = async (\n documentId: string,\n secrets: Secrets,\n accessToken: string,\n): Promise<string> => {\n const {project, proxy} = secrets\n if (!project || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',\n )\n }\n const url = `https://api.smartling.com/jobs-api/v3/projects/${project}/jobs?jobName=${documentId}`\n //first, try fetching from name resolution\n let items = await fetch(proxy, {\n headers: getHeaders(url, accessToken),\n })\n .then((res) => res.json())\n .then((res) => res?.response?.data?.items)\n\n if (!items || !items.length) {\n //if that fails, try fetching by fileUri and check the referenceNumber\n const refUrl = `https://api.smartling.com/jobs-api/v3/projects/${project}/jobs/search`\n items = await fetch(proxy, {\n headers: {\n ...getHeaders(refUrl, accessToken),\n 'content-type': 'application/json',\n },\n method: 'POST',\n body: JSON.stringify({\n fileUris: [documentId],\n }),\n })\n .then((res) => res.json())\n .then((res) => res?.response?.data?.items)\n }\n\n if (items.length) {\n //smartling will fuzzy match job names. We need to be precise.\n const correctJob = items.find(\n (item: {jobName: string; referenceNumber: string}) =>\n (item.jobName && item.jobName === documentId) ||\n (item.referenceNumber && item.referenceNumber === documentId),\n )\n\n if (correctJob) {\n return correctJob.translationJobUid\n }\n }\n return ''\n}\n","import {authenticate, getHeaders} from './helpers'\nimport {Secrets} from 'sanity-translations-tab'\nimport {Adapter} from 'sanity-translations-tab'\n\nexport const getLocales: Adapter['getLocales'] = async (secrets: Secrets | null) => {\n if (!secrets?.project || !secrets?.secret || !secrets?.proxy) {\n return []\n }\n const {project, proxy} = secrets\n const url = `https://api.smartling.com/projects-api/v2/projects/${project}`\n const accessToken = await authenticate(secrets)\n return fetch(proxy, {\n method: 'GET',\n headers: getHeaders(url, accessToken),\n })\n .then((res) => res.json())\n .then((res) => res.response.data.targetLocales)\n}\n","import {authenticate, getHeaders, findExistingJob} from './helpers'\nimport {Adapter, Secrets} from 'sanity-translations-tab'\n\ninterface WorkflowProgressItem {\n workflowStepSummaryReportItemList: {\n wordCount: number\n }[]\n}\n\ninterface SmartlingProgressItem {\n targetLocaleId: string\n progress: {\n percentComplete: number\n totalWordCount: number\n }\n workflowProgressReportList: WorkflowProgressItem[]\n}\n\nexport const getTranslationTask: Adapter['getTranslationTask'] = async (\n documentId: string,\n secrets: Secrets | null,\n) => {\n if (!secrets?.project || !secrets?.secret || !secrets?.proxy) {\n return {\n documentId,\n taskId: documentId,\n locales: [],\n }\n }\n\n const {project, proxy} = secrets\n\n const accessToken = await authenticate(secrets)\n const taskId = await findExistingJob(documentId, secrets, accessToken)\n if (!taskId) {\n return {\n documentId,\n taskId: documentId,\n locales: [],\n }\n }\n\n const progressUrl = `https://api.smartling.com/jobs-api/v3/projects/${project}/jobs/${taskId}/progress`\n const smartlingTask = await fetch(proxy, {\n method: 'GET',\n headers: getHeaders(progressUrl, accessToken),\n })\n .then((res) => res.json())\n .then((res) => res.response.data)\n\n let locales = []\n if (smartlingTask && smartlingTask.contentProgressReport) {\n locales = smartlingTask.contentProgressReport.map((item: SmartlingProgressItem) => {\n let progress = item.progress ? item.progress.percentComplete : 0\n if (\n item.workflowProgressReportList &&\n item.workflowProgressReportList.length > 0 &&\n item.progress\n ) {\n //default to the first workflow -- it's likely what is being used\n const progressItem = item.workflowProgressReportList[0]\n //this is a list of the various steps in the workflow\n if (\n progressItem.workflowStepSummaryReportItemList &&\n progressItem.workflowStepSummaryReportItemList.length > 1\n ) {\n //get the last step in the workflow -- usually \"published\"\n const lastStep = progressItem.workflowStepSummaryReportItemList.at(-1)\n //get the percentage of how many words have reached the last step\n if (lastStep && lastStep.wordCount >= 0) {\n progress = Math.floor((lastStep.wordCount / item.progress.totalWordCount) * 100) ?? 0\n }\n }\n }\n return {\n localeId: item.targetLocaleId,\n progress,\n }\n })\n }\n\n return {\n documentId,\n locales,\n //since our download is tied to document id for smartling, keep track of it as a task\n taskId: documentId,\n linkToVendorTask: `https://dashboard.smartling.com/app/projects/${project}/account-jobs/${project}:${taskId}`,\n }\n}\n","import {authenticate, getHeaders, findExistingJob} from './helpers'\nimport {Adapter, Secrets} from 'sanity-translations-tab'\nimport {getTranslationTask} from './getTranslationTask'\nimport {Buffer} from 'buffer'\n\nconst createJob = (\n jobName: string,\n secrets: Secrets,\n localeIds: string[],\n accessToken: string,\n documentId: string,\n) => {\n const {project, proxy} = secrets\n if (!project || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',\n )\n }\n\n const url = `https://api.smartling.com/jobs-api/v3/projects/${project}/jobs`\n return fetch(proxy, {\n method: 'POST',\n headers: {\n ...getHeaders(url, accessToken),\n 'content-type': 'application/json',\n },\n body: JSON.stringify({\n jobName,\n targetLocaleIds: localeIds,\n referenceNumber: documentId,\n }),\n })\n .then((res) => res.json())\n .then((res) => res.response.data.translationJobUid)\n}\n\n/* we're using batches here because it eliminates some\n * new string authorization issues for updating existing jobs,\n * and is able to be used for new bulk\n * job functionality.\n */\n\nconst createJobBatch = (\n jobId: string,\n secrets: Secrets,\n documentId: string,\n accessToken: string,\n localeIds: string[],\n workflowUid?: string,\n //eslint-disable-next-line max-params\n) => {\n const {project, proxy} = secrets\n if (!project || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',\n )\n }\n const url = `https://api.smartling.com/job-batches-api/v2/projects/${project}/batches`\n const reqBody: {\n authorize: boolean\n translationJobUid: string\n fileUris: string[]\n localeWorkflows?: {targetLocaleId: string; workflowUid: string}[]\n } = {\n authorize: true,\n translationJobUid: jobId,\n fileUris: [documentId],\n }\n\n if (workflowUid) {\n reqBody.localeWorkflows = localeIds.map((l) => ({\n targetLocaleId: l,\n workflowUid,\n }))\n }\n\n return fetch(proxy, {\n method: 'POST',\n headers: {\n ...getHeaders(url, accessToken),\n 'content-type': 'application/json',\n },\n body: JSON.stringify(reqBody),\n })\n .then((res) => res.json())\n .then((res) => res.response.data.batchUid)\n}\n\nconst uploadFileToBatch = (\n batchUid: string,\n documentId: string,\n document: Record<string, any>,\n secrets: Secrets,\n localeIds: string[],\n accessToken: string,\n //eslint-disable-next-line max-params\n) => {\n const {project, proxy} = secrets\n if (!project || !proxy) {\n throw new Error(\n 'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',\n )\n }\n const url = `https://api.smartling.com/job-batches-api/v2/projects/${project}/batches/${batchUid}/file`\n const formData = new FormData()\n formData.append('fileUri', documentId)\n formData.append('fileType', 'html')\n const htmlBuffer = Buffer.from(document.content, 'utf-8')\n formData.append('file', new Blob([htmlBuffer]), `${document.name}.html`)\n localeIds.forEach((localeId) => formData.append('localeIdsToAuthorize[]', localeId))\n\n return fetch(proxy, {\n method: 'POST',\n headers: getHeaders(url, accessToken),\n body: formData,\n }).then((res) => res.json())\n}\n\nexport const createTask: Adapter['createTask'] = async (\n documentId: string,\n document: Record<string, any>,\n localeIds: string[],\n secrets: Secrets | null,\n workflowUid?: string,\n) => {\n if (!secrets?.project || !secrets?.secret || !secrets?.proxy) {\n throw new Error(\n 'The Smartling adapter requires a project ID, a secret key, and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',\n )\n }\n\n const accessToken = await authenticate(secrets)\n\n let taskId = await findExistingJob(document.name, secrets, accessToken)\n if (!taskId) {\n taskId = await createJob(document.name, secrets, localeIds, accessToken, documentId)\n }\n\n const batchUid = await createJobBatch(\n taskId,\n secrets,\n documentId,\n accessToken,\n localeIds,\n workflowUid,\n )\n const uploadFileRes = await uploadFileToBatch(\n batchUid,\n documentId,\n document,\n secrets,\n localeIds,\n accessToken,\n )\n //eslint-disable-next-line no-console -- for developer debugging\n console.info('Upload status from Smartling: ', uploadFileRes)\n\n return getTranslationTask(documentId, secrets)\n}\n","import {authenticate, getHeaders} from './helpers'\nimport {Adapter, Secrets} from 'sanity-translations-tab'\n\nexport const getTranslation: Adapter['getTranslation'] = async (\n taskId: string,\n localeId: string,\n secrets: Secrets | null,\n) => {\n if (!secrets?.project || !secrets?.secret || !secrets?.proxy) {\n throw new Error(\n 'The Smartling adapter requires a project ID, a secret key, and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',\n )\n }\n\n const {project, proxy} = secrets\n\n const url = `https://api.smartling.com/files-api/v2/projects/${project}/locales/${localeId}/file?fileUri=${taskId}&retrievalType=pending`\n const accessToken = await authenticate(secrets)\n const translatedHTML = await fetch(proxy, {\n method: 'GET',\n headers: getHeaders(url, accessToken),\n })\n .then((res) => res.json())\n .then((res) => {\n if (res.body) {\n return res.body\n } else if (res.response.errors) {\n const errMsg =\n res.response.errors[0]?.message || 'Error retrieving translation from Smartling'\n throw new Error(errMsg)\n }\n return ''\n })\n\n return translatedHTML\n}\n","import {Adapter} from 'sanity-translations-tab'\nimport {getLocales} from './getLocales'\nimport {getTranslationTask} from './getTranslationTask'\nimport {createTask} from './createTask'\nimport {getTranslation} from './getTranslation'\n\nexport const SmartlingAdapter: Adapter = {\n getLocales,\n getTranslationTask,\n createTask,\n getTranslation,\n}\n","import {SerializedDocument} from 'sanity-naive-html-serializer'\nimport {\n TranslationsTab,\n baseDocumentLevelConfig,\n legacyDocumentLevelConfig as baseLegacyDocumentLevelConfig,\n baseFieldLevelConfig,\n findLatestDraft,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n Adapter,\n legacyDocumentLevelPatch,\n documentLevelPatch,\n fieldLevelPatch,\n TranslationFunctionContext,\n} from 'sanity-translations-tab'\nimport {SmartlingAdapter} from './adapter'\n\ninterface ConfigOptions {\n adapter: Adapter\n secretsNamespace: string | null\n exportForTranslation: (\n id: string,\n context: TranslationFunctionContext,\n ) => Promise<SerializedDocument>\n importTranslation: (\n id: string,\n localeId: string,\n doc: string,\n context: TranslationFunctionContext,\n ) => Promise<void>\n}\nconst defaultDocumentLevelConfig: ConfigOptions = {\n ...baseDocumentLevelConfig,\n adapter: SmartlingAdapter,\n}\n\nconst legacyDocumentLevelConfig: ConfigOptions = {\n ...baseLegacyDocumentLevelConfig,\n adapter: SmartlingAdapter,\n}\n\nconst defaultFieldLevelConfig: ConfigOptions = {\n ...baseFieldLevelConfig,\n adapter: SmartlingAdapter,\n}\n\nexport {\n TranslationsTab,\n findLatestDraft,\n legacyDocumentLevelPatch,\n documentLevelPatch,\n fieldLevelPatch,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n SmartlingAdapter,\n legacyDocumentLevelConfig,\n defaultDocumentLevelConfig,\n defaultFieldLevelConfig,\n}\n"],"names":["authenticate","secrets","url","headers","secret","proxy","Error","fetch","method","body","JSON","stringify","then","res","json","response","data","accessToken","getHeaders","Authorization","concat","findExistingJob","documentId","project","items","_a","_b","length","refUrl","fileUris","correctJob","find","item","jobName","referenceNumber","translationJobUid","getLocales","targetLocales","getTranslationTask","taskId","locales","progressUrl","smartlingTask","contentProgressReport","map","progress","percentComplete","workflowProgressReportList","progressItem","workflowStepSummaryReportItemList","lastStep","at","wordCount","Math","floor","totalWordCount","localeId","targetLocaleId","linkToVendorTask","createJob","localeIds","targetLocaleIds","createJobBatch","jobId","workflowUid","reqBody","authorize","localeWorkflows","l","batchUid","uploadFileToBatch","document","formData","FormData","append","htmlBuffer","Buffer","from","content","Blob","name","forEach","createTask","uploadFileRes","console","info","getTranslation","translatedHTML","errors","errMsg","message","SmartlingAdapter","defaultDocumentLevelConfig","baseDocumentLevelConfig","adapter","legacyDocumentLevelConfig","baseLegacyDocumentLevelConfig","defaultFieldLevelConfig","baseFieldLevelConfig"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -3,11 +3,17 @@ import {Adapter, Secrets} from 'sanity-translations-tab'
|
|
|
3
3
|
import {getTranslationTask} from './getTranslationTask'
|
|
4
4
|
import {Buffer} from 'buffer'
|
|
5
5
|
|
|
6
|
-
const createJob = (
|
|
6
|
+
const createJob = (
|
|
7
|
+
jobName: string,
|
|
8
|
+
secrets: Secrets,
|
|
9
|
+
localeIds: string[],
|
|
10
|
+
accessToken: string,
|
|
11
|
+
documentId: string,
|
|
12
|
+
) => {
|
|
7
13
|
const {project, proxy} = secrets
|
|
8
14
|
if (!project || !proxy) {
|
|
9
15
|
throw new Error(
|
|
10
|
-
'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'
|
|
16
|
+
'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',
|
|
11
17
|
)
|
|
12
18
|
}
|
|
13
19
|
|
|
@@ -21,6 +27,7 @@ const createJob = (jobName: string, secrets: Secrets, localeIds: string[], acces
|
|
|
21
27
|
body: JSON.stringify({
|
|
22
28
|
jobName,
|
|
23
29
|
targetLocaleIds: localeIds,
|
|
30
|
+
referenceNumber: documentId,
|
|
24
31
|
}),
|
|
25
32
|
})
|
|
26
33
|
.then((res) => res.json())
|
|
@@ -36,16 +43,16 @@ const createJob = (jobName: string, secrets: Secrets, localeIds: string[], acces
|
|
|
36
43
|
const createJobBatch = (
|
|
37
44
|
jobId: string,
|
|
38
45
|
secrets: Secrets,
|
|
39
|
-
|
|
46
|
+
documentId: string,
|
|
40
47
|
accessToken: string,
|
|
41
48
|
localeIds: string[],
|
|
42
|
-
workflowUid?: string
|
|
49
|
+
workflowUid?: string,
|
|
43
50
|
//eslint-disable-next-line max-params
|
|
44
51
|
) => {
|
|
45
52
|
const {project, proxy} = secrets
|
|
46
53
|
if (!project || !proxy) {
|
|
47
54
|
throw new Error(
|
|
48
|
-
'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'
|
|
55
|
+
'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',
|
|
49
56
|
)
|
|
50
57
|
}
|
|
51
58
|
const url = `https://api.smartling.com/job-batches-api/v2/projects/${project}/batches`
|
|
@@ -57,7 +64,7 @@ const createJobBatch = (
|
|
|
57
64
|
} = {
|
|
58
65
|
authorize: true,
|
|
59
66
|
translationJobUid: jobId,
|
|
60
|
-
fileUris: [
|
|
67
|
+
fileUris: [documentId],
|
|
61
68
|
}
|
|
62
69
|
|
|
63
70
|
if (workflowUid) {
|
|
@@ -81,20 +88,22 @@ const createJobBatch = (
|
|
|
81
88
|
|
|
82
89
|
const uploadFileToBatch = (
|
|
83
90
|
batchUid: string,
|
|
91
|
+
documentId: string,
|
|
84
92
|
document: Record<string, any>,
|
|
85
93
|
secrets: Secrets,
|
|
86
94
|
localeIds: string[],
|
|
87
|
-
accessToken: string
|
|
95
|
+
accessToken: string,
|
|
96
|
+
//eslint-disable-next-line max-params
|
|
88
97
|
) => {
|
|
89
98
|
const {project, proxy} = secrets
|
|
90
99
|
if (!project || !proxy) {
|
|
91
100
|
throw new Error(
|
|
92
|
-
'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'
|
|
101
|
+
'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',
|
|
93
102
|
)
|
|
94
103
|
}
|
|
95
104
|
const url = `https://api.smartling.com/job-batches-api/v2/projects/${project}/batches/${batchUid}/file`
|
|
96
105
|
const formData = new FormData()
|
|
97
|
-
formData.append('fileUri',
|
|
106
|
+
formData.append('fileUri', documentId)
|
|
98
107
|
formData.append('fileType', 'html')
|
|
99
108
|
const htmlBuffer = Buffer.from(document.content, 'utf-8')
|
|
100
109
|
formData.append('file', new Blob([htmlBuffer]), `${document.name}.html`)
|
|
@@ -112,11 +121,11 @@ export const createTask: Adapter['createTask'] = async (
|
|
|
112
121
|
document: Record<string, any>,
|
|
113
122
|
localeIds: string[],
|
|
114
123
|
secrets: Secrets | null,
|
|
115
|
-
workflowUid?: string
|
|
124
|
+
workflowUid?: string,
|
|
116
125
|
) => {
|
|
117
126
|
if (!secrets?.project || !secrets?.secret || !secrets?.proxy) {
|
|
118
127
|
throw new Error(
|
|
119
|
-
'The Smartling adapter requires a project ID, a secret key, and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'
|
|
128
|
+
'The Smartling adapter requires a project ID, a secret key, and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',
|
|
120
129
|
)
|
|
121
130
|
}
|
|
122
131
|
|
|
@@ -124,18 +133,25 @@ export const createTask: Adapter['createTask'] = async (
|
|
|
124
133
|
|
|
125
134
|
let taskId = await findExistingJob(document.name, secrets, accessToken)
|
|
126
135
|
if (!taskId) {
|
|
127
|
-
taskId = await createJob(document.name, secrets, localeIds, accessToken)
|
|
136
|
+
taskId = await createJob(document.name, secrets, localeIds, accessToken, documentId)
|
|
128
137
|
}
|
|
129
138
|
|
|
130
139
|
const batchUid = await createJobBatch(
|
|
131
140
|
taskId,
|
|
132
141
|
secrets,
|
|
133
|
-
|
|
142
|
+
documentId,
|
|
134
143
|
accessToken,
|
|
135
144
|
localeIds,
|
|
136
|
-
workflowUid
|
|
145
|
+
workflowUid,
|
|
146
|
+
)
|
|
147
|
+
const uploadFileRes = await uploadFileToBatch(
|
|
148
|
+
batchUid,
|
|
149
|
+
documentId,
|
|
150
|
+
document,
|
|
151
|
+
secrets,
|
|
152
|
+
localeIds,
|
|
153
|
+
accessToken,
|
|
137
154
|
)
|
|
138
|
-
const uploadFileRes = await uploadFileToBatch(batchUid, document, secrets, localeIds, accessToken)
|
|
139
155
|
//eslint-disable-next-line no-console -- for developer debugging
|
|
140
156
|
console.info('Upload status from Smartling: ', uploadFileRes)
|
|
141
157
|
|
|
@@ -4,11 +4,11 @@ import {Adapter, Secrets} from 'sanity-translations-tab'
|
|
|
4
4
|
export const getTranslation: Adapter['getTranslation'] = async (
|
|
5
5
|
taskId: string,
|
|
6
6
|
localeId: string,
|
|
7
|
-
secrets: Secrets | null
|
|
7
|
+
secrets: Secrets | null,
|
|
8
8
|
) => {
|
|
9
9
|
if (!secrets?.project || !secrets?.secret || !secrets?.proxy) {
|
|
10
10
|
throw new Error(
|
|
11
|
-
'The Smartling adapter requires a project ID, a secret key, and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'
|
|
11
|
+
'The Smartling adapter requires a project ID, a secret key, and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',
|
|
12
12
|
)
|
|
13
13
|
}
|
|
14
14
|
|
|
@@ -18,7 +18,7 @@ interface SmartlingProgressItem {
|
|
|
18
18
|
|
|
19
19
|
export const getTranslationTask: Adapter['getTranslationTask'] = async (
|
|
20
20
|
documentId: string,
|
|
21
|
-
secrets: Secrets | null
|
|
21
|
+
secrets: Secrets | null,
|
|
22
22
|
) => {
|
|
23
23
|
if (!secrets?.project || !secrets?.secret || !secrets?.proxy) {
|
|
24
24
|
return {
|
package/src/adapter/helpers.ts
CHANGED
|
@@ -13,7 +13,7 @@ export const authenticate = (secrets: Secrets): Promise<string> => {
|
|
|
13
13
|
const {secret, proxy} = secrets
|
|
14
14
|
if (!secret || !proxy) {
|
|
15
15
|
throw new Error(
|
|
16
|
-
'The Smartling adapter requires a secret key and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'
|
|
16
|
+
'The Smartling adapter requires a secret key and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',
|
|
17
17
|
)
|
|
18
18
|
}
|
|
19
19
|
return fetch(proxy, {
|
|
@@ -30,34 +30,53 @@ export const getHeaders = (url: string, accessToken: string): Headers => ({
|
|
|
30
30
|
'X-URL': url,
|
|
31
31
|
})
|
|
32
32
|
|
|
33
|
-
export const findExistingJob = (
|
|
33
|
+
export const findExistingJob = async (
|
|
34
34
|
documentId: string,
|
|
35
35
|
secrets: Secrets,
|
|
36
|
-
accessToken: string
|
|
36
|
+
accessToken: string,
|
|
37
37
|
): Promise<string> => {
|
|
38
38
|
const {project, proxy} = secrets
|
|
39
39
|
if (!project || !proxy) {
|
|
40
40
|
throw new Error(
|
|
41
|
-
'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.'
|
|
41
|
+
'The Smartling adapter requires a Smartling project identifier and a proxy URL. Please check your secrets document in this dataset, per the plugin documentation.',
|
|
42
42
|
)
|
|
43
43
|
}
|
|
44
44
|
const url = `https://api.smartling.com/jobs-api/v3/projects/${project}/jobs?jobName=${documentId}`
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
//first, try fetching from name resolution
|
|
46
|
+
let items = await fetch(proxy, {
|
|
47
47
|
headers: getHeaders(url, accessToken),
|
|
48
48
|
})
|
|
49
49
|
.then((res) => res.json())
|
|
50
|
-
.then((res) =>
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
50
|
+
.then((res) => res?.response?.data?.items)
|
|
51
|
+
|
|
52
|
+
if (!items || !items.length) {
|
|
53
|
+
//if that fails, try fetching by fileUri and check the referenceNumber
|
|
54
|
+
const refUrl = `https://api.smartling.com/jobs-api/v3/projects/${project}/jobs/search`
|
|
55
|
+
items = await fetch(proxy, {
|
|
56
|
+
headers: {
|
|
57
|
+
...getHeaders(refUrl, accessToken),
|
|
58
|
+
'content-type': 'application/json',
|
|
59
|
+
},
|
|
60
|
+
method: 'POST',
|
|
61
|
+
body: JSON.stringify({
|
|
62
|
+
fileUris: [documentId],
|
|
63
|
+
}),
|
|
62
64
|
})
|
|
65
|
+
.then((res) => res.json())
|
|
66
|
+
.then((res) => res?.response?.data?.items)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (items.length) {
|
|
70
|
+
//smartling will fuzzy match job names. We need to be precise.
|
|
71
|
+
const correctJob = items.find(
|
|
72
|
+
(item: {jobName: string; referenceNumber: string}) =>
|
|
73
|
+
(item.jobName && item.jobName === documentId) ||
|
|
74
|
+
(item.referenceNumber && item.referenceNumber === documentId),
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
if (correctJob) {
|
|
78
|
+
return correctJob.translationJobUid
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return ''
|
|
63
82
|
}
|
package/src/index.ts
CHANGED
|
@@ -23,13 +23,13 @@ interface ConfigOptions {
|
|
|
23
23
|
secretsNamespace: string | null
|
|
24
24
|
exportForTranslation: (
|
|
25
25
|
id: string,
|
|
26
|
-
context: TranslationFunctionContext
|
|
26
|
+
context: TranslationFunctionContext,
|
|
27
27
|
) => Promise<SerializedDocument>
|
|
28
28
|
importTranslation: (
|
|
29
29
|
id: string,
|
|
30
30
|
localeId: string,
|
|
31
31
|
doc: string,
|
|
32
|
-
context: TranslationFunctionContext
|
|
32
|
+
context: TranslationFunctionContext,
|
|
33
33
|
) => Promise<void>
|
|
34
34
|
}
|
|
35
35
|
const defaultDocumentLevelConfig: ConfigOptions = {
|