sanity-plugin-transifex 5.0.0 → 5.1.1

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 CHANGED
@@ -75,6 +75,8 @@ import {DefaultDocumentNodeResolver} from 'sanity/desk'
75
75
  import {TranslationsTab, defaultDocumentLevelConfig} from 'sanity-plugin-transifex'
76
76
  //if you are using field-level translations, you can import the field-level config instead:
77
77
  //import {TranslationsTab, defaultFieldLevelConfig} from 'sanity-plugin-transifex'
78
+ //if your fields use sanity-plugin-internationalized-array, use the internationalized array config:
79
+ //import {TranslationsTab, defaultI18nArrayConfig} from 'sanity-plugin-transifex'
78
80
  //if you're not sure which, please look at the document-level and field-level sections below
79
81
 
80
82
  export const defaultDocumentNode: DefaultDocumentNodeResolver = (S, {schemaType}) => {
@@ -112,9 +114,45 @@ For example, on a document you don't want to be translated, you may have a "titl
112
114
  }
113
115
  ```
114
116
 
117
+ If your fields use [sanity-plugin-internationalized-array](https://github.com/sanity-io/plugins/tree/main/plugins/sanity-plugin-internationalized-array), use the `defaultI18nArrayConfig` configuration instead. Both data formats of that plugin are supported -- v4 and below, where the language lives in the item's `_key`:
118
+
119
+ ```javascript
120
+ {
121
+ //...other document fields,
122
+ title: [
123
+ {_key: 'en', _type: 'internationalizedArrayStringValue', value: 'My title is here.'},
124
+ {_key: 'es', _type: 'internationalizedArrayStringValue', value: 'Mi título está aquí.'},
125
+ ]
126
+ }
127
+ ```
128
+
129
+ and v5 and above, where the language lives in a dedicated `language` field:
130
+
131
+ ```javascript
132
+ {
133
+ //...other document fields,
134
+ title: [
135
+ {
136
+ _key: 'abc123',
137
+ _type: 'internationalizedArrayStringValue',
138
+ language: 'en',
139
+ value: 'My title is here.',
140
+ },
141
+ {
142
+ _key: 'def456',
143
+ _type: 'internationalizedArrayStringValue',
144
+ language: 'es',
145
+ value: 'Mi título está aquí.',
146
+ },
147
+ ]
148
+ }
149
+ ```
150
+
151
+ Imported translations will be written back in whichever format the document already uses.
152
+
115
153
  ### Document level translations
116
154
 
117
- Since we often find users want to use the [Document internationalization plugin](https://www.sanity.io/plugins/document-internationalization) if they're using document-level translations, we assume that any documents you want in different languages will be present in a `translation.metadata` document.
155
+ Since we often find users want to use the [Document internationalization plugin](https://www.sanity.io/plugins/document-internationalization) if they're using document-level translations, we assume that any documents you want in different languages will be present in a `translation.metadata` document. Both metadata formats are read transparently: version 5 and below of that plugin, where the language lives in the `_key` of each entry in the `translations` array, and version 6 and above, where the language lives in a dedicated `language` field. Existing metadata documents keep their detected format when written to; brand-new metadata documents default to the v6 format, configurable via the `newMetadataFormat` option (set it to `'legacy'` if you are still on v5 or below).
118
156
 
119
157
  _Important_: The above is true if you are using the Document Internationalization Plugin at version 2 or above. If you are using version 1 please use the `legacyDocumentLevelConfig` configuration exported from this plugin. This configuration assumes your translations follow the pattern `{id-of-base-language-document}__i18n_{locale}`
120
158
 
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Adapter, BaseDocumentDeserializer, BaseDocumentMerger, BaseDocumentSerializer, TranslationFunctionContext, TranslationsTab, customSerializers, defaultStopTypes, documentLevelPatch, fieldLevelPatch, findLatestDraft, legacyDocumentLevelPatch } from "sanity-translations-tab";
1
+ import { Adapter, BaseDocumentDeserializer, BaseDocumentMerger, BaseDocumentSerializer, TranslationFunctionContext, TranslationsTab, customSerializers, defaultStopTypes, documentLevelPatch, fieldLevelPatch, findLatestDraft, i18nArrayPatch, legacyDocumentLevelPatch } from "sanity-translations-tab";
2
2
  declare const TransifexAdapter: Adapter;
3
3
  interface ConfigOptions {
4
4
  adapter: Adapter;
@@ -9,5 +9,6 @@ interface ConfigOptions {
9
9
  declare const defaultDocumentLevelConfig: ConfigOptions;
10
10
  declare const legacyDocumentLevelConfig: ConfigOptions;
11
11
  declare const defaultFieldLevelConfig: ConfigOptions;
12
- export { BaseDocumentDeserializer, BaseDocumentMerger, BaseDocumentSerializer, TransifexAdapter, TranslationsTab, customSerializers, defaultDocumentLevelConfig, defaultFieldLevelConfig, defaultStopTypes, documentLevelPatch, fieldLevelPatch, findLatestDraft, legacyDocumentLevelConfig, legacyDocumentLevelPatch };
12
+ declare const defaultI18nArrayConfig: ConfigOptions;
13
+ export { BaseDocumentDeserializer, BaseDocumentMerger, BaseDocumentSerializer, TransifexAdapter, TranslationsTab, customSerializers, defaultDocumentLevelConfig, defaultFieldLevelConfig, defaultI18nArrayConfig, defaultStopTypes, documentLevelPatch, fieldLevelPatch, findLatestDraft, i18nArrayPatch, legacyDocumentLevelConfig, legacyDocumentLevelPatch };
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/transifexAdapter/index.ts","../src/index.ts"],"mappings":";cAOa,gBAAA,EAAkB,OAAA;AAAA,UCerB,aAAA;EACR,OAAA,EAAS,OAAA;EACT,gBAAA;EACA,oBAAA,GACE,EAAA,UACA,OAAA,EAAS,0BAAA,KACN,OAAA,CAAQ,MAAA;EACb,iBAAA,GACE,EAAA,UACA,QAAA,UACA,GAAA,UACA,OAAA,EAAS,0BAAA,KACN,OAAA;AAAA;AAAA,cAED,0BAAA,EAA4B,aAAA;AAAA,cAM5B,yBAAA,EAA2B,aAAA;AAAA,cAM3B,uBAAA,EAAyB,aAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/transifexAdapter/index.ts","../src/index.ts"],"mappings":";cAOa,gBAAA,EAAkB,OAAA;AAAA,UCiBrB,aAAA;EACR,OAAA,EAAS,OAAA;EACT,gBAAA;EACA,oBAAA,GACE,EAAA,UACA,OAAA,EAAS,0BAAA,KACN,OAAA,CAAQ,MAAA;EACb,iBAAA,GACE,EAAA,UACA,QAAA,UACA,GAAA,UACA,OAAA,EAAS,0BAAA,KACN,OAAA;AAAA;AAAA,cAED,0BAAA,EAA4B,aAAA;AAAA,cAM5B,yBAAA,EAA2B,aAAA;AAAA,cAM3B,uBAAA,EAAyB,aAAA;AAAA,cAOzB,sBAAA,EAAwB,aAAA"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { baseDocumentLevelConfig, baseFieldLevelConfig, legacyDocumentLevelConfig as legacyDocumentLevelConfig$1 } from "sanity-translations-tab";
2
- import { BaseDocumentDeserializer, BaseDocumentMerger, BaseDocumentSerializer, TranslationsTab, customSerializers, defaultStopTypes, documentLevelPatch, fieldLevelPatch, findLatestDraft, legacyDocumentLevelPatch } from "sanity-translations-tab";
1
+ import { baseDocumentLevelConfig, baseFieldLevelConfig, baseI18nArrayConfig, legacyDocumentLevelConfig as legacyDocumentLevelConfig$1 } from "sanity-translations-tab";
2
+ import { BaseDocumentDeserializer, BaseDocumentMerger, BaseDocumentSerializer, TranslationsTab, customSerializers, defaultStopTypes, documentLevelPatch, fieldLevelPatch, findLatestDraft, i18nArrayPatch, legacyDocumentLevelPatch } from "sanity-translations-tab";
3
3
  const baseTransifexUrl = "https://rest.api.transifex.com", getHeaders = (secrets) => ({
4
4
  Authorization: `Bearer ${secrets?.token}`,
5
5
  "Content-Type": "application/vnd.api+json"
@@ -189,6 +189,10 @@ const baseTransifexUrl = "https://rest.api.transifex.com", getHeaders = (secrets
189
189
  ...baseFieldLevelConfig,
190
190
  adapter: TransifexAdapter,
191
191
  secretsNamespace: "transifex"
192
+ }, defaultI18nArrayConfig = {
193
+ ...baseI18nArrayConfig,
194
+ adapter: TransifexAdapter,
195
+ secretsNamespace: "transifex"
192
196
  };
193
197
  export {
194
198
  BaseDocumentDeserializer,
@@ -199,10 +203,12 @@ export {
199
203
  customSerializers,
200
204
  defaultDocumentLevelConfig,
201
205
  defaultFieldLevelConfig,
206
+ defaultI18nArrayConfig,
202
207
  defaultStopTypes,
203
208
  documentLevelPatch,
204
209
  fieldLevelPatch,
205
210
  findLatestDraft,
211
+ i18nArrayPatch,
206
212
  legacyDocumentLevelConfig,
207
213
  legacyDocumentLevelPatch
208
214
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/transifexAdapter/helpers.ts","../src/transifexAdapter/getLocales.ts","../src/transifexAdapter/getTranslationTask.ts","../src/transifexAdapter/createTask.ts","../src/transifexAdapter/getTranslation.ts","../src/transifexAdapter/index.ts","../src/index.ts"],"sourcesContent":["import type {Secrets} from 'sanity-translations-tab'\n\nexport const baseTransifexUrl = 'https://rest.api.transifex.com'\n\nexport const getHeaders = (secrets: Secrets | null): Record<string, string> => ({\n 'Authorization': `Bearer ${secrets?.token}`,\n 'Content-Type': 'application/vnd.api+json',\n})\n\nexport const projOrgSlug = (secrets: Secrets | null): string =>\n `o:${secrets?.organization}:p:${secrets?.project}`\n","import type {Adapter, Secrets} from 'sanity-translations-tab'\n\nimport {baseTransifexUrl, projOrgSlug, getHeaders} from './helpers'\n\nexport const getLocales: Adapter['getLocales'] = async (secrets: Secrets | null) => {\n let locales = []\n if (secrets) {\n const response = await fetch(`${baseTransifexUrl}/projects/${projOrgSlug(secrets)}/languages`, {\n headers: getHeaders(secrets),\n })\n\n if (!response.ok) {\n throw Error(`Failed to retrieve locales from Transifex. Status: ${response.status}`)\n }\n\n locales = await response.json().then((res) =>\n res.data.map((lang: Record<string, any>) => ({\n enabled: true,\n description: lang['attributes']['name'],\n localeId: lang['attributes']['code'],\n })),\n )\n }\n return locales\n}\n","import type {Adapter, Secrets} from 'sanity-translations-tab'\n\nimport {getLocales} from './getLocales'\nimport {baseTransifexUrl, projOrgSlug, getHeaders} from './helpers'\n\nexport const getTranslationTask: Adapter['getTranslationTask'] = async (\n documentId: string,\n secrets: Secrets | null,\n) => {\n if (!documentId || !secrets) {\n return {\n taskId: documentId,\n documentId: documentId,\n locales: [],\n }\n }\n const projectFilter = `filter[project]=${projOrgSlug(secrets)}`\n const resourceFilter = `filter[resource]=${projOrgSlug(secrets)}:r:${documentId}`\n const task = await fetch(\n `${baseTransifexUrl}/resource_language_stats?${projectFilter}&${resourceFilter}`,\n {headers: getHeaders(secrets)},\n )\n .then((res) => {\n if (res.ok) {\n return res.json()\n }\n //normal -- just means that this task doesn't exist yet.\n else if (res.status === 404) {\n return {data: []}\n }\n throw Error(`Failed to retrieve tasks from Transifex. Status: ${res.status}`)\n })\n .then((res) => ({\n taskId: `${projOrgSlug(secrets)}:r:${documentId}`,\n documentId: documentId,\n locales: res.data.map((locale: Record<string, any>) => {\n const reviewedStrings = Number(locale['attributes']['reviewed_strings'])\n const totalStrings = Number(locale['attributes']['total_strings'])\n\n return {\n localeId: locale['relationships']['language']['data']['id'].split(':')[1],\n progress:\n Number.isFinite(reviewedStrings) && Number.isFinite(totalStrings) && totalStrings > 0\n ? Math.floor((100 * reviewedStrings) / totalStrings)\n : 0,\n }\n }),\n }))\n\n const locales = await getLocales(secrets)\n const localeIds = locales.map((l: Record<string, any>) => l['localeId'])\n const validLocales = task.locales.filter((locale: Record<string, any>) =>\n localeIds.find((id: string) => id === locale['localeId']),\n )\n task.locales = validLocales\n\n return task\n}\n","import type {Adapter, Secrets} from 'sanity-translations-tab'\n\nimport {getTranslationTask} from './getTranslationTask'\nimport {baseTransifexUrl, projOrgSlug, getHeaders} from './helpers'\n\nconst createResource = async (\n doc: Record<string, any>,\n documentId: string,\n secrets: Secrets | null,\n) => {\n const resourceCreateBody = {\n data: {\n attributes: {\n accept_translations: true,\n name: doc['name'],\n slug: documentId,\n },\n relationships: {\n i18n_format: {\n data: {\n id: 'HTML_FRAGMENT',\n type: 'i18n_formats',\n },\n },\n project: {\n data: {\n id: projOrgSlug(secrets),\n type: 'projects',\n },\n },\n },\n type: 'resources',\n },\n }\n\n const response = await fetch(`${baseTransifexUrl}/resources`, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceCreateBody),\n })\n\n if (!response.ok) {\n throw Error(`Failed to create Transifex resource. Status: ${response.status}`)\n }\n\n const res = await response.json()\n const resourceId = res?.data?.id\n\n if (!resourceId) {\n throw Error('Failed to create Transifex resource. Missing resource id in response.')\n }\n\n return resourceId\n}\n\nexport const createTask: Adapter['createTask'] = async (\n documentId: string,\n document: Record<string, any>,\n _localeIds: string[],\n secrets: Secrets | null,\n) => {\n if (!documentId || !secrets) {\n throw Error('Missing documentId or Transifex secrets.')\n }\n\n const resourceResponse = await fetch(\n `${baseTransifexUrl}/resources/${projOrgSlug(secrets)}:r:${documentId}`,\n {headers: getHeaders(secrets)},\n )\n let resourceId: string | null = null\n\n if (resourceResponse.status === 404) {\n resourceId = null\n } else if (!resourceResponse.ok) {\n throw Error(`Failed to retrieve Transifex resource. Status: ${resourceResponse.status}`)\n } else {\n const resource = await resourceResponse.json()\n resourceId = resource.data ? resource.data.id : null\n }\n\n if (!resourceId) {\n resourceId = await createResource(document, documentId, secrets)\n }\n\n const resourceUploadUrl = `${baseTransifexUrl}/resource_strings_async_uploads`\n const resourceUploadBody = {\n data: {\n attributes: {\n content: document['content'],\n content_encoding: 'text',\n },\n relationships: {\n resource: {\n data: {\n id: resourceId,\n type: 'resources',\n },\n },\n },\n type: 'resource_strings_async_uploads',\n },\n }\n\n const uploadResponse = await fetch(resourceUploadUrl, {\n method: 'POST',\n body: JSON.stringify(resourceUploadBody),\n headers: getHeaders(secrets),\n })\n\n if (!uploadResponse.ok) {\n throw Error(`Failed to upload resource strings to Transifex. Status: ${uploadResponse.status}`)\n }\n\n return getTranslationTask(documentId, secrets)\n}\n","import type {Adapter, Secrets} from 'sanity-translations-tab'\n\nimport {baseTransifexUrl, getHeaders} from './helpers'\n\nconst pollForFileDownloadLocation = async (\n resourceDownloadUrl: string,\n translationDownloadId: string,\n headers: Record<string, any>,\n retryCount = 0,\n maxRetries = 20,\n): Promise<string> => {\n const response = await fetch(`${resourceDownloadUrl}/${translationDownloadId}`, {\n headers: headers,\n })\n\n if (retryCount >= maxRetries) {\n throw Error(\n `Failed to retrieve download location for translation download ID ${translationDownloadId} after ${maxRetries} retries.`,\n )\n }\n\n if (response.status === 500) {\n //eslint-disable-next-line no-console -- this is for developer feedback/debugging\n console.info(\n `Transifex plugin message: Received 500 for translation download ID ${translationDownloadId}. Trying to reconnect...`,\n )\n await new Promise((resolve) => setTimeout(resolve, 3000))\n return pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers,\n retryCount + 1,\n maxRetries,\n )\n } else if (response.redirected) {\n //eslint-disable-next-line no-console -- this is for developer feedback/debugging\n console.info(\n `Transifex plugin message: Received redirect for translation download ID ${translationDownloadId}. Following redirect now for file download.`,\n )\n return response.url\n } else if (response.status === 200) {\n //eslint-disable-next-line no-console -- this is for developer feedback/debugging\n console.info(\n `Transifex plugin message: Requested download location for translation download ID ${translationDownloadId}. Location is still pending, trying again.`,\n )\n await new Promise((resolve) => setTimeout(resolve, 3000))\n return pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers,\n retryCount + 1,\n maxRetries,\n )\n } else if (response.status === 401 || response.status === 403) {\n throw Error(\n `Failed to retrieve download location for translation download ID ${translationDownloadId}. Status: ${response.status}`,\n )\n }\n console.error(\n `Transifex plugin message: Requested download location for translation download ID ${translationDownloadId} but received error code ${response.status}. Waiting and trying again.`,\n )\n await new Promise((resolve) => setTimeout(resolve, 3000))\n return pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers,\n retryCount + 1,\n maxRetries,\n )\n}\n\nconst handleFileDownload = (url: string) => {\n return fetch(url).then((res) => res.text())\n}\n\nexport const getTranslation: Adapter['getTranslation'] = async (\n taskId: string,\n localeId: string,\n secrets: Secrets | null,\n) => {\n if (!secrets) {\n throw Error('Missing Transifex secrets.')\n }\n\n const resourceDownloadBody = {\n data: {\n attributes: {\n content_encoding: 'text',\n },\n relationships: {\n language: {\n data: {\n id: `l:${localeId}`,\n type: 'languages',\n },\n },\n resource: {\n data: {\n id: taskId,\n type: 'resources',\n },\n },\n },\n type: 'resource_translations_async_downloads',\n },\n }\n\n const resourceDownloadUrl = `${baseTransifexUrl}/resource_translations_async_downloads`\n const downloadResponse = await fetch(resourceDownloadUrl, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceDownloadBody),\n })\n\n if (!downloadResponse.ok) {\n throw Error(\n `Failed to create translation download request in Transifex. Status: ${downloadResponse.status}`,\n )\n }\n\n const download = await downloadResponse.json()\n const translationDownloadId = download?.data?.id\n\n if (!translationDownloadId) {\n throw Error('Failed to create translation download request in Transifex. Missing download id.')\n }\n\n const headers = getHeaders(secrets)\n const location = await pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers,\n )\n return handleFileDownload(location)\n}\n","import type {Adapter} from 'sanity-translations-tab'\n\nimport {createTask} from './createTask'\nimport {getLocales} from './getLocales'\nimport {getTranslation} from './getTranslation'\nimport {getTranslationTask} from './getTranslationTask'\n\nexport const TransifexAdapter: Adapter = {\n getLocales,\n getTranslationTask,\n createTask,\n getTranslation,\n}\n","import {\n baseDocumentLevelConfig,\n legacyDocumentLevelConfig as baseLegacyDocumentLevelConfig,\n baseFieldLevelConfig,\n} from 'sanity-translations-tab'\nimport type {Adapter, TranslationFunctionContext} from 'sanity-translations-tab'\n\nimport {TransifexAdapter} from './transifexAdapter'\n\nexport {\n findLatestDraft,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n legacyDocumentLevelPatch,\n documentLevelPatch,\n fieldLevelPatch,\n TranslationsTab,\n} from 'sanity-translations-tab'\n\ninterface ConfigOptions {\n adapter: Adapter\n secretsNamespace: string | null\n exportForTranslation: (\n id: string,\n context: TranslationFunctionContext,\n ) => Promise<Record<string, any>>\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: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nconst legacyDocumentLevelConfig: ConfigOptions = {\n ...baseLegacyDocumentLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nconst defaultFieldLevelConfig: ConfigOptions = {\n ...baseFieldLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nexport {\n TransifexAdapter,\n defaultDocumentLevelConfig,\n defaultFieldLevelConfig,\n legacyDocumentLevelConfig,\n}\n"],"names":["baseTransifexUrl","getHeaders","secrets","token","projOrgSlug","organization","project","getLocales","locales","response","fetch","headers","ok","Error","status","json","then","res","data","map","lang","enabled","description","localeId","getTranslationTask","documentId","taskId","projectFilter","resourceFilter","task","locale","reviewedStrings","Number","totalStrings","split","progress","isFinite","Math","floor","localeIds","l","validLocales","filter","find","id","createResource","doc","resourceCreateBody","attributes","accept_translations","name","slug","relationships","i18n_format","type","method","body","JSON","stringify","resourceId","createTask","document","_localeIds","resourceResponse","resource","resourceUploadUrl","resourceUploadBody","content","content_encoding","uploadResponse","pollForFileDownloadLocation","resourceDownloadUrl","translationDownloadId","retryCount","maxRetries","console","info","Promise","resolve","setTimeout","redirected","url","error","handleFileDownload","text","getTranslation","resourceDownloadBody","language","downloadResponse","location","TransifexAdapter","defaultDocumentLevelConfig","baseDocumentLevelConfig","adapter","secretsNamespace","legacyDocumentLevelConfig","baseLegacyDocumentLevelConfig","defaultFieldLevelConfig","baseFieldLevelConfig"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/transifexAdapter/helpers.ts","../src/transifexAdapter/getLocales.ts","../src/transifexAdapter/getTranslationTask.ts","../src/transifexAdapter/createTask.ts","../src/transifexAdapter/getTranslation.ts","../src/transifexAdapter/index.ts","../src/index.ts"],"sourcesContent":["import type {Secrets} from 'sanity-translations-tab'\n\nexport const baseTransifexUrl = 'https://rest.api.transifex.com'\n\nexport const getHeaders = (secrets: Secrets | null): Record<string, string> => ({\n 'Authorization': `Bearer ${secrets?.token}`,\n 'Content-Type': 'application/vnd.api+json',\n})\n\nexport const projOrgSlug = (secrets: Secrets | null): string =>\n `o:${secrets?.organization}:p:${secrets?.project}`\n","import type {Adapter, Secrets} from 'sanity-translations-tab'\n\nimport {baseTransifexUrl, projOrgSlug, getHeaders} from './helpers'\n\nexport const getLocales: Adapter['getLocales'] = async (secrets: Secrets | null) => {\n let locales = []\n if (secrets) {\n const response = await fetch(`${baseTransifexUrl}/projects/${projOrgSlug(secrets)}/languages`, {\n headers: getHeaders(secrets),\n })\n\n if (!response.ok) {\n throw Error(`Failed to retrieve locales from Transifex. Status: ${response.status}`)\n }\n\n locales = await response.json().then((res) =>\n res.data.map((lang: Record<string, any>) => ({\n enabled: true,\n description: lang['attributes']['name'],\n localeId: lang['attributes']['code'],\n })),\n )\n }\n return locales\n}\n","import type {Adapter, Secrets} from 'sanity-translations-tab'\n\nimport {getLocales} from './getLocales'\nimport {baseTransifexUrl, projOrgSlug, getHeaders} from './helpers'\n\nexport const getTranslationTask: Adapter['getTranslationTask'] = async (\n documentId: string,\n secrets: Secrets | null,\n) => {\n if (!documentId || !secrets) {\n return {\n taskId: documentId,\n documentId: documentId,\n locales: [],\n }\n }\n const projectFilter = `filter[project]=${projOrgSlug(secrets)}`\n const resourceFilter = `filter[resource]=${projOrgSlug(secrets)}:r:${documentId}`\n const task = await fetch(\n `${baseTransifexUrl}/resource_language_stats?${projectFilter}&${resourceFilter}`,\n {headers: getHeaders(secrets)},\n )\n .then((res) => {\n if (res.ok) {\n return res.json()\n }\n //normal -- just means that this task doesn't exist yet.\n else if (res.status === 404) {\n return {data: []}\n }\n throw Error(`Failed to retrieve tasks from Transifex. Status: ${res.status}`)\n })\n .then((res) => ({\n taskId: `${projOrgSlug(secrets)}:r:${documentId}`,\n documentId: documentId,\n locales: res.data.map((locale: Record<string, any>) => {\n const reviewedStrings = Number(locale['attributes']['reviewed_strings'])\n const totalStrings = Number(locale['attributes']['total_strings'])\n\n return {\n localeId: locale['relationships']['language']['data']['id'].split(':')[1],\n progress:\n Number.isFinite(reviewedStrings) && Number.isFinite(totalStrings) && totalStrings > 0\n ? Math.floor((100 * reviewedStrings) / totalStrings)\n : 0,\n }\n }),\n }))\n\n const locales = await getLocales(secrets)\n const localeIds = locales.map((l: Record<string, any>) => l['localeId'])\n const validLocales = task.locales.filter((locale: Record<string, any>) =>\n localeIds.find((id: string) => id === locale['localeId']),\n )\n task.locales = validLocales\n\n return task\n}\n","import type {Adapter, Secrets} from 'sanity-translations-tab'\n\nimport {getTranslationTask} from './getTranslationTask'\nimport {baseTransifexUrl, projOrgSlug, getHeaders} from './helpers'\n\nconst createResource = async (\n doc: Record<string, any>,\n documentId: string,\n secrets: Secrets | null,\n) => {\n const resourceCreateBody = {\n data: {\n attributes: {\n accept_translations: true,\n name: doc['name'],\n slug: documentId,\n },\n relationships: {\n i18n_format: {\n data: {\n id: 'HTML_FRAGMENT',\n type: 'i18n_formats',\n },\n },\n project: {\n data: {\n id: projOrgSlug(secrets),\n type: 'projects',\n },\n },\n },\n type: 'resources',\n },\n }\n\n const response = await fetch(`${baseTransifexUrl}/resources`, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceCreateBody),\n })\n\n if (!response.ok) {\n throw Error(`Failed to create Transifex resource. Status: ${response.status}`)\n }\n\n const res = await response.json()\n const resourceId = res?.data?.id\n\n if (!resourceId) {\n throw Error('Failed to create Transifex resource. Missing resource id in response.')\n }\n\n return resourceId\n}\n\nexport const createTask: Adapter['createTask'] = async (\n documentId: string,\n document: Record<string, any>,\n _localeIds: string[],\n secrets: Secrets | null,\n) => {\n if (!documentId || !secrets) {\n throw Error('Missing documentId or Transifex secrets.')\n }\n\n const resourceResponse = await fetch(\n `${baseTransifexUrl}/resources/${projOrgSlug(secrets)}:r:${documentId}`,\n {headers: getHeaders(secrets)},\n )\n let resourceId: string | null = null\n\n if (resourceResponse.status === 404) {\n resourceId = null\n } else if (!resourceResponse.ok) {\n throw Error(`Failed to retrieve Transifex resource. Status: ${resourceResponse.status}`)\n } else {\n const resource = await resourceResponse.json()\n resourceId = resource.data ? resource.data.id : null\n }\n\n if (!resourceId) {\n resourceId = await createResource(document, documentId, secrets)\n }\n\n const resourceUploadUrl = `${baseTransifexUrl}/resource_strings_async_uploads`\n const resourceUploadBody = {\n data: {\n attributes: {\n content: document['content'],\n content_encoding: 'text',\n },\n relationships: {\n resource: {\n data: {\n id: resourceId,\n type: 'resources',\n },\n },\n },\n type: 'resource_strings_async_uploads',\n },\n }\n\n const uploadResponse = await fetch(resourceUploadUrl, {\n method: 'POST',\n body: JSON.stringify(resourceUploadBody),\n headers: getHeaders(secrets),\n })\n\n if (!uploadResponse.ok) {\n throw Error(`Failed to upload resource strings to Transifex. Status: ${uploadResponse.status}`)\n }\n\n return getTranslationTask(documentId, secrets)\n}\n","import type {Adapter, Secrets} from 'sanity-translations-tab'\n\nimport {baseTransifexUrl, getHeaders} from './helpers'\n\nconst pollForFileDownloadLocation = async (\n resourceDownloadUrl: string,\n translationDownloadId: string,\n headers: Record<string, any>,\n retryCount = 0,\n maxRetries = 20,\n): Promise<string> => {\n const response = await fetch(`${resourceDownloadUrl}/${translationDownloadId}`, {\n headers: headers,\n })\n\n if (retryCount >= maxRetries) {\n throw Error(\n `Failed to retrieve download location for translation download ID ${translationDownloadId} after ${maxRetries} retries.`,\n )\n }\n\n if (response.status === 500) {\n //eslint-disable-next-line no-console -- this is for developer feedback/debugging\n console.info(\n `Transifex plugin message: Received 500 for translation download ID ${translationDownloadId}. Trying to reconnect...`,\n )\n await new Promise((resolve) => setTimeout(resolve, 3000))\n return pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers,\n retryCount + 1,\n maxRetries,\n )\n } else if (response.redirected) {\n //eslint-disable-next-line no-console -- this is for developer feedback/debugging\n console.info(\n `Transifex plugin message: Received redirect for translation download ID ${translationDownloadId}. Following redirect now for file download.`,\n )\n return response.url\n } else if (response.status === 200) {\n //eslint-disable-next-line no-console -- this is for developer feedback/debugging\n console.info(\n `Transifex plugin message: Requested download location for translation download ID ${translationDownloadId}. Location is still pending, trying again.`,\n )\n await new Promise((resolve) => setTimeout(resolve, 3000))\n return pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers,\n retryCount + 1,\n maxRetries,\n )\n } else if (response.status === 401 || response.status === 403) {\n throw Error(\n `Failed to retrieve download location for translation download ID ${translationDownloadId}. Status: ${response.status}`,\n )\n }\n console.error(\n `Transifex plugin message: Requested download location for translation download ID ${translationDownloadId} but received error code ${response.status}. Waiting and trying again.`,\n )\n await new Promise((resolve) => setTimeout(resolve, 3000))\n return pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers,\n retryCount + 1,\n maxRetries,\n )\n}\n\nconst handleFileDownload = (url: string) => {\n return fetch(url).then((res) => res.text())\n}\n\nexport const getTranslation: Adapter['getTranslation'] = async (\n taskId: string,\n localeId: string,\n secrets: Secrets | null,\n) => {\n if (!secrets) {\n throw Error('Missing Transifex secrets.')\n }\n\n const resourceDownloadBody = {\n data: {\n attributes: {\n content_encoding: 'text',\n },\n relationships: {\n language: {\n data: {\n id: `l:${localeId}`,\n type: 'languages',\n },\n },\n resource: {\n data: {\n id: taskId,\n type: 'resources',\n },\n },\n },\n type: 'resource_translations_async_downloads',\n },\n }\n\n const resourceDownloadUrl = `${baseTransifexUrl}/resource_translations_async_downloads`\n const downloadResponse = await fetch(resourceDownloadUrl, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceDownloadBody),\n })\n\n if (!downloadResponse.ok) {\n throw Error(\n `Failed to create translation download request in Transifex. Status: ${downloadResponse.status}`,\n )\n }\n\n const download = await downloadResponse.json()\n const translationDownloadId = download?.data?.id\n\n if (!translationDownloadId) {\n throw Error('Failed to create translation download request in Transifex. Missing download id.')\n }\n\n const headers = getHeaders(secrets)\n const location = await pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers,\n )\n return handleFileDownload(location)\n}\n","import type {Adapter} from 'sanity-translations-tab'\n\nimport {createTask} from './createTask'\nimport {getLocales} from './getLocales'\nimport {getTranslation} from './getTranslation'\nimport {getTranslationTask} from './getTranslationTask'\n\nexport const TransifexAdapter: Adapter = {\n getLocales,\n getTranslationTask,\n createTask,\n getTranslation,\n}\n","import {\n baseDocumentLevelConfig,\n legacyDocumentLevelConfig as baseLegacyDocumentLevelConfig,\n baseFieldLevelConfig,\n baseI18nArrayConfig,\n} from 'sanity-translations-tab'\nimport type {Adapter, TranslationFunctionContext} from 'sanity-translations-tab'\n\nimport {TransifexAdapter} from './transifexAdapter'\n\nexport {\n findLatestDraft,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n legacyDocumentLevelPatch,\n documentLevelPatch,\n fieldLevelPatch,\n i18nArrayPatch,\n TranslationsTab,\n} from 'sanity-translations-tab'\n\ninterface ConfigOptions {\n adapter: Adapter\n secretsNamespace: string | null\n exportForTranslation: (\n id: string,\n context: TranslationFunctionContext,\n ) => Promise<Record<string, any>>\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: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nconst legacyDocumentLevelConfig: ConfigOptions = {\n ...baseLegacyDocumentLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nconst defaultFieldLevelConfig: ConfigOptions = {\n ...baseFieldLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\n//for documents using sanity-plugin-internationalized-array fields\nconst defaultI18nArrayConfig: ConfigOptions = {\n ...baseI18nArrayConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nexport {\n TransifexAdapter,\n defaultDocumentLevelConfig,\n defaultFieldLevelConfig,\n defaultI18nArrayConfig,\n legacyDocumentLevelConfig,\n}\n"],"names":["baseTransifexUrl","getHeaders","secrets","token","projOrgSlug","organization","project","getLocales","locales","response","fetch","headers","ok","Error","status","json","then","res","data","map","lang","enabled","description","localeId","getTranslationTask","documentId","taskId","projectFilter","resourceFilter","task","locale","reviewedStrings","Number","totalStrings","split","progress","isFinite","Math","floor","localeIds","l","validLocales","filter","find","id","createResource","doc","resourceCreateBody","attributes","accept_translations","name","slug","relationships","i18n_format","type","method","body","JSON","stringify","resourceId","createTask","document","_localeIds","resourceResponse","resource","resourceUploadUrl","resourceUploadBody","content","content_encoding","uploadResponse","pollForFileDownloadLocation","resourceDownloadUrl","translationDownloadId","retryCount","maxRetries","console","info","Promise","resolve","setTimeout","redirected","url","error","handleFileDownload","text","getTranslation","resourceDownloadBody","language","downloadResponse","location","TransifexAdapter","defaultDocumentLevelConfig","baseDocumentLevelConfig","adapter","secretsNamespace","legacyDocumentLevelConfig","baseLegacyDocumentLevelConfig","defaultFieldLevelConfig","baseFieldLevelConfig","defaultI18nArrayConfig","baseI18nArrayConfig"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sanity-plugin-transifex",
3
- "version": "5.0.0",
3
+ "version": "5.1.1",
4
4
  "description": "This plugin provides an in-studio integration with Transifex. It allows your editors to send any document to Transifex with the click of a button, monitor ongoing translations, and import partial or complete translations back into the studio.",
5
5
  "keywords": [
6
6
  "sanity",
@@ -27,7 +27,7 @@
27
27
  "./package.json": "./package.json"
28
28
  },
29
29
  "dependencies": {
30
- "sanity-translations-tab": "6.0.0"
30
+ "sanity-translations-tab": "6.1.1"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@sanity/pkg-utils": "^10.5.0",
@@ -37,7 +37,7 @@
37
37
  "babel-plugin-styled-components": "^2.3.0",
38
38
  "react": "^19.2.5",
39
39
  "react-dom": "^19.2.5",
40
- "sanity": "^5.21.0",
40
+ "sanity": "^6.0.0",
41
41
  "styled-components": "^6.4.2",
42
42
  "@repo/package.config": "0.0.0",
43
43
  "@repo/tsconfig": "0.0.0"