sanity-plugin-transifex 2.0.5 → 2.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -1,18 +1,50 @@
|
|
|
1
1
|
# Sanity + Transifex = 🌍
|
|
2
2
|
|
|
3
|
+
This is the Studio V2 version of the Transifex plugin.
|
|
3
4
|
|
|
4
|
-
This plugin provides an in-studio integration with [Transifex](https://transifex.com). 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
|
+
This plugin provides an in-studio integration with [Transifex](https://transifex.com). 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
6
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
# Table of Contents
|
|
8
|
+
- [Plugin features](#plugin-features)
|
|
9
|
+
- [Assumptions](#assumptions)
|
|
10
|
+
- [Quickstart](#quickstart)
|
|
11
|
+
- [Studio experience](#studio-experience)
|
|
12
|
+
- [Overriding defaults](#overriding-defaults)
|
|
13
|
+
- [v1 to v2 changes](#v1-to-v2-changes)
|
|
12
14
|
|
|
13
|
-
So let's get started!
|
|
14
15
|
|
|
15
|
-
|
|
16
|
+
## Plugin features
|
|
17
|
+
|
|
18
|
+
This plugin comes with (and exposes to the developer) the following items:
|
|
19
|
+
- An `Adapter` that connects to the Transifex API with methods to create a new translation job, upload and assign a file to that translation job, check the progress of an ongoing translation, and retrieve a translated file.
|
|
20
|
+
- A `Serializer` that transforms your content into HTML (we found this was the most efficient way to maintain your document structure, no matter how deeply nested, while remaining readable to translators in Transifex). The `Serializer` takes in optional arguments: `stopTypes`, which prevents certain types from being sent to your translatiors and `customSerializers`, which are rules you can use to have full control over how individual fields on your document get serialized.
|
|
21
|
+
- A `Deserializer` that deserializes translated text back to Sanity's format.
|
|
22
|
+
- A `Patcher` which determines how your content gets patched back into its destination document or field.
|
|
23
|
+
- A `TranslationsTab`, a React element that allows a non-technical user to import, export, and monitor Transifex progress.
|
|
24
|
+
|
|
25
|
+
To make life easier, we also include `defaultFieldLevelConfig` and `defaultDocumentLevelConfig`, which bundles all of the above up to get you up and running quickly.
|
|
26
|
+
|
|
27
|
+
## Assumptions
|
|
28
|
+
To use the default config mentioned above, we assume that you are following the conventions we outline in [our documentation on localization](https://www.sanity.io/docs/localization).
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
### Field-level translations
|
|
32
|
+
If you are using field-level translation, we assume any fields you want translated exist in the multi-locale object form we recommend.
|
|
33
|
+
For example, on a document you don't want to be translated, you may have a "title" field that's a flat string: `title: 'My title is here.'` For a field you want to include many languages for, your title may look like
|
|
34
|
+
```
|
|
35
|
+
{ title: {
|
|
36
|
+
en: 'My title is here.',
|
|
37
|
+
es: 'Mi título está aquí.',
|
|
38
|
+
etc...
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Document level translations
|
|
44
|
+
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 follow the pattern `{id-of-base-language-document}__i18n_{locale}`
|
|
45
|
+
|
|
46
|
+
### Final note
|
|
47
|
+
It's okay if your data doesn't follow these patterns and you don't want to change them! You will simply have to override how the plugin gets and patches back information from your documents. Please see [Overriding defaults](#overriding-defaults).
|
|
16
48
|
|
|
17
49
|
## Quickstart
|
|
18
50
|
|
|
@@ -64,197 +96,40 @@ export const getDefaultDocumentNode = (props) => {
|
|
|
64
96
|
|
|
65
97
|
And that should do it! Go into your studio, click around, and check the document in Transifex (it should be under its Sanity `_id`). Once it's translated, check the import by clicking the `Import` button on your Transifex tab!
|
|
66
98
|
|
|
67
|
-
|
|
68
|
-
|
|
99
|
+
## Studio experience
|
|
100
|
+
By adding the `TranslationsTab` to your desk structure, your users should now have an additional view. The boxes at the top of the tab can be used to send translations off to Transifex, and once those jobs are started, they should see progress bars monitoring the progress of the jobs. They can import a partial or complete job back.
|
|
69
101
|
|
|
70
|
-
|
|
102
|
+
## Overriding defaults
|
|
71
103
|
|
|
72
|
-
|
|
73
|
-
* `
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
* `defaultFieldLevelConfig`:
|
|
77
|
-
* Your base language is English.
|
|
78
|
-
* Any fields you want translated exist in the multi-locale object form we recommend.
|
|
79
|
-
For example, on a document you don't want to be translated, you may have a "title" field that's a flat string: `title: 'My title is here.'` For a field you want to include many languages for, your title may look like
|
|
80
|
-
```
|
|
81
|
-
{ title: {
|
|
82
|
-
en: 'My title is here.',
|
|
83
|
-
es: 'Mi título está aquí.',
|
|
84
|
-
etc...
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
```
|
|
88
|
-
This config will look for the English values on all fields that look like this, and place translated values into their appropriate fields.
|
|
89
|
-
|
|
90
|
-
If your content models don't look like this, you can still run the defaults as an experiment -- you'll just likely get some funky results on import!
|
|
91
|
-
|
|
92
|
-
<br />
|
|
93
|
-
<br />
|
|
104
|
+
To personalize this configuration it's useful to know what arguments go into `TranslationsTab` as options (the `defaultConfigs` are just wrappers for these):
|
|
105
|
+
* `exportForTranslation`: a function that takes your document id and returns an object with `name`: the field you want to use identify your doc in Transifex (by default this is `_id` and `content`: a serialized HTML string of all the fields in your document to be translated.
|
|
106
|
+
* `importTranslation`: a function that takes in `id` (your document id) `localeId` (the locale of the imported language) and `document` the translated HTML from Transifex. It will deserialize your document back into an object that can be patched into your Sanity data, and then executes that patch.
|
|
107
|
+
* `Adapter`: An interface with methods to send things over to Transifex. You likely don't want to override this!
|
|
94
108
|
|
|
95
|
-
|
|
109
|
+
There are a number of reasons to override these functions. More general cases are often around ensuring documents serialize and deserialize correctly. Since the serialization fucntions are used across all our translation plugins currently, you can find some frequently encountered scenarios at [their repository here](https://github.com/sanity-io/sanity-naive-html-serializer), along with code examples for new config.
|
|
96
110
|
|
|
97
|
-
|
|
98
|
-
<br />
|
|
99
|
-
<br />
|
|
111
|
+
## V1 to V2 changes
|
|
100
112
|
|
|
101
|
-
|
|
102
|
-
First: this is often caused by not declaring types at the top level of your schema. Serialization introspects your schema files and can get a much better sense of what to do when objects are not "anonymous" (this is similar to how our GraphQL functions work -- more info on "strict" schemas [here](https://www.sanity.io/docs/graphql#33ec7103289a)) You can save yourself some development time by trying this first.
|
|
103
|
-
|
|
104
|
-
If that's still not doing the trick, you can add on to the serializer to ensure you have complete say over how an object gets serialized and deserialized. Under the hood, serialization is using Sanity's [blocks-to-html](https://github.com/sanity-io/block-content-to-html), and the same principles apply here. We strongly recommend you check that documentation to understand how to use these serialization rules. Here's how you might declare and use some custom serialization.
|
|
105
|
-
|
|
106
|
-
First, write your serialization rules:
|
|
113
|
+
Most users will not encounter issues in upgrading to v2. The breaking changes are as follows:
|
|
107
114
|
|
|
115
|
+
1. **Change to document-level localization id structure.** Since the [Internationalization input plugin](https://www.sanity.io/plugins/sanity-plugin-intl-input) was deprecated, the default pattern `i18n.{id-of-base-language-document}.{locale}` was deprecated in favor of `{id-of-base-language-document}__i18n_{locale}`. If you would like to maintain that pattern, please add the `idStructure` param to your tab config, like:
|
|
108
116
|
```javascript
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
const myCustomSerializerTypes = {
|
|
113
|
-
...customSerializers.types,
|
|
114
|
-
myType: (props) => {
|
|
115
|
-
const innerElements = //do things with the props
|
|
116
|
-
//className and id is VERY important!! don't forget them!!
|
|
117
|
-
return h('div', { className: props.node._type, id: props.node._key }, innerElements)
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
const myCustomSerializers = customSerializers
|
|
122
|
-
myCustomSerializers.types = myCustomSerializerTypes
|
|
123
|
-
|
|
124
|
-
const myCustomDeserializer = {
|
|
125
|
-
types: {
|
|
126
|
-
myType: (htmlString) => {
|
|
127
|
-
//parse it back out!
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
117
|
+
S.view.component(TranslationsTab).title('Transifex').options(
|
|
118
|
+
{...defaultDocumentLevelConfig, idStructure: 'subpath'}
|
|
119
|
+
)
|
|
132
120
|
```
|
|
133
|
-
|
|
134
|
-
If your object is inline, then you may need to use the deserialization rules in Sanity's [block-tools](https://github.com/sanity-io/sanity/tree/next/packages/@sanity/block-tools) (also used in deserialzation. So you might declare something like this:
|
|
135
|
-
|
|
136
|
-
```javascript
|
|
137
|
-
const myBlockDeserializationRules = [
|
|
138
|
-
{
|
|
139
|
-
deserialize(el, next, block) {
|
|
140
|
-
if (el.className.toLowerCase() != myType.toLowerCase()) {
|
|
141
|
-
return undefined
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
//do stuff with the HTML string
|
|
145
|
-
return {
|
|
146
|
-
_type: 'myType',
|
|
147
|
-
//all my other fields
|
|
148
|
-
})
|
|
149
|
-
}
|
|
150
|
-
]
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
Now, to bring it all together:
|
|
154
|
-
|
|
155
|
-
```javascript
|
|
156
|
-
import { TranslationTab, defaultDocumentLevelConfig, BaseDocumentSerializer, BaseDocumentDeserializer, BaseDocumentPatcher, defaultStopTypes } from "sanity-plugin-transifex"
|
|
157
|
-
|
|
158
|
-
const myCustomConfig = {
|
|
159
|
-
...defaultDocumentLevelConfig,
|
|
160
|
-
exportForTranslation: (id) =>
|
|
161
|
-
BaseDocumentSerializer.serializeDocument(
|
|
162
|
-
id,
|
|
163
|
-
'document',
|
|
164
|
-
'en',
|
|
165
|
-
defaultStopTypes,
|
|
166
|
-
myCustomSerializers),
|
|
167
|
-
importTranslation: (id, localeId, document) => {
|
|
168
|
-
return BaseDocumentDeserializer.deserializeDocument(
|
|
169
|
-
id,
|
|
170
|
-
document,
|
|
171
|
-
myCustomDeserializer,
|
|
172
|
-
myBlockDeserializationRules).then(
|
|
173
|
-
deserialized =>
|
|
174
|
-
BaseDocumentPatcher.documentLevelPatch(deserialized, id, localeId)
|
|
175
|
-
)
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
Then, in your document structure, just feed the config into your `TranslationTab`.
|
|
182
|
-
|
|
183
|
-
```javascript
|
|
184
|
-
S.view.component(TranslationTab).title('Transifex').options(
|
|
185
|
-
myCustomConfig
|
|
186
|
-
)
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
<br />
|
|
190
|
-
<br />
|
|
191
|
-
|
|
192
|
-
### Scenario: I want to have more granular control over how my documents get patched back to my dataset.
|
|
193
|
-
|
|
194
|
-
If all the serialization is working to your liking, but you have a different setup for how your document works, you can overwrite that patching logic.
|
|
195
|
-
|
|
121
|
+
2. **Underlying changes in serializers.** Serializers were updated to a) take advantage of the newer [Portable Text to HTML package](https://github.com/portabletext/to-html) and allow for explicit schema closures. If you were overriding serialization methods, that means invocation of `BaseDocumentSerializer` will change from:
|
|
196
122
|
```javascript
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
const myCustomConfig = {
|
|
200
|
-
...defaultDocumentLevelConfig,
|
|
201
|
-
importTranslation: (id, localeId, document) => {
|
|
202
|
-
return BaseDocumentDeserializer.deserializeDocument(id,document).then(
|
|
203
|
-
deserialized =>
|
|
204
|
-
//you should have an object of translated values here. Do things with them!
|
|
205
|
-
)
|
|
206
|
-
}
|
|
207
|
-
}
|
|
123
|
+
BaseDocumentSerializer.serializeDocument(id, 'serialization-level')
|
|
208
124
|
```
|
|
209
125
|
|
|
210
|
-
|
|
211
|
-
<br />
|
|
212
|
-
|
|
213
|
-
### Scenario: I want to ensure certain fields never get sent to my translators.
|
|
214
|
-
The serializer actually introspects your schema files. You can set `localize: false` on a schema and that field should not be sent off. Example:
|
|
126
|
+
to:
|
|
215
127
|
```javascript
|
|
216
|
-
|
|
217
|
-
name: 'categories',
|
|
218
|
-
type: 'array',
|
|
219
|
-
localize: false,
|
|
220
|
-
...
|
|
221
|
-
}]
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
<br />
|
|
225
|
-
<br />
|
|
226
|
-
|
|
227
|
-
### Scenario: I want to ensure certain types of objects never get serialized or sent to my translators.
|
|
228
|
-
|
|
229
|
-
This plugin ships with a specification called `stopTypes`. By default it ignores fields that don't have useful linguistic information -- dates, numbers, etc. You can add to it easily.
|
|
230
|
-
|
|
231
|
-
```javascript
|
|
232
|
-
import { TranslationTab, defaultDocumentLevelConfig, defaultStopTypes, BaseDocumentSerializer } from "sanity-plugin-transifex"
|
|
233
|
-
|
|
234
|
-
const myCustomStopTypes = [
|
|
235
|
-
...defaultStopTypes,
|
|
236
|
-
'listItem'
|
|
237
|
-
]
|
|
238
|
-
|
|
239
|
-
const myCustomConfig = {
|
|
240
|
-
...defaultDocumentLevelConfig,
|
|
241
|
-
exportForTranslation: (id) => BaseDocumentSerializer.serializeDocument(
|
|
242
|
-
id, 'document', 'en', myCustomStopTypes)
|
|
243
|
-
}
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
As above, feed the config into your `TranslationTab`.
|
|
247
|
-
|
|
248
|
-
```javascript
|
|
249
|
-
|
|
250
|
-
S.view.component(TranslationTab).title('Transifex').options(
|
|
251
|
-
myCustomConfig
|
|
252
|
-
)
|
|
128
|
+
import schemas from 'part:@sanity/base/schema'
|
|
253
129
|
|
|
130
|
+
BaseDocumentSerializer(schemas).serializeDocument(id, 'serialization-level')
|
|
254
131
|
```
|
|
255
132
|
|
|
256
|
-
There's a number of further possibilities here. Pretty much every interface provided can be partially or fully overwritten. Do write an issue if something seems to never work how you expect, or if you'd like a more elegant way of doing things.
|
|
257
133
|
|
|
258
|
-
This plugin is in early stages. We plan on improving some of the user-facing
|
|
134
|
+
This plugin is in early stages. We plan on improving some of the user-facing chrome, sorting out some quiet bugs, figuring out where things don't fail elegantly, etc. Please be a part of our development process!
|
|
259
135
|
|
|
260
|
-
|
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ interface ConfigOptions {
|
|
|
4
4
|
adapter: Adapter;
|
|
5
5
|
secretsNamespace: string | null;
|
|
6
6
|
exportForTranslation: (id: string) => Promise<Record<string, any>>;
|
|
7
|
-
importTranslation: (id: string, localeId: string, doc: string) => Promise<void>;
|
|
7
|
+
importTranslation: (id: string, localeId: string, doc: string, _idStructure: undefined) => Promise<void>;
|
|
8
8
|
}
|
|
9
9
|
declare const defaultDocumentLevelConfig: ConfigOptions;
|
|
10
10
|
declare const defaultFieldLevelConfig: ConfigOptions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanity-plugin-transifex.cjs.development.js","sources":["../src/transifexAdapter/helpers.ts","../src/transifexAdapter/getLocales.ts","../src/transifexAdapter/getTranslationTask.ts","../src/transifexAdapter/getTranslation.ts","../src/transifexAdapter/createTask.ts","../src/transifexAdapter/index.ts","../src/index.ts"],"sourcesContent":["import { Secrets } from 'sanity-translations-tab'\n\nexport const baseTransifexUrl = 'https://rest.api.transifex.com'\n\nexport const getHeaders = (secrets: Secrets | null) => ({\n Authorization: `Bearer ${secrets?.token}`,\n 'Content-Type': 'application/vnd.api+json',\n})\n\nexport const projOrgSlug = (secrets: Secrets | null) =>\n `o:${secrets?.organization}:p:${secrets?.project}`\n","import { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, projOrgSlug, getHeaders } from './helpers'\n\nexport default async function getLocales(secrets: Secrets | null) {\n if (secrets) {\n return fetch(\n `${baseTransifexUrl}/projects/${projOrgSlug(secrets)}/languages`,\n { headers: getHeaders(secrets) }\n )\n .then(res => res.json())\n .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 } else {\n return []\n }\n}\n","import { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, projOrgSlug, getHeaders } from './helpers'\nimport getLocales from './getLocales'\n\nexport default async function getTranslationTask(\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(\n secrets\n )}: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 } else {\n throw Error(\n `Failed to retrieve tasks from Transifex. Status: ${res.status}`\n )\n }\n })\n .then(res => ({\n taskId: `${projOrgSlug(secrets)}:r:${documentId}`,\n documentId: documentId,\n locales: res.data.map((locale: Record<string, any>) => ({\n localeId: locale.relationships.language.data.id.split(':')[1],\n progress: Math.floor(\n 100 *\n (locale.attributes.reviewed_strings /\n parseFloat(locale.attributes.total_strings))\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 { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, getHeaders } from './helpers'\n\nexport default async function getTranslation(\n taskId: string,\n localeId: string,\n secrets: Secrets | null\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 translationDownloadId = await fetch(resourceDownloadUrl, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceDownloadBody),\n })\n .then(res => res.json())\n .then(res => res.data.id)\n\n const headers = getHeaders(secrets)\n const location = await pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers\n )\n return handleFileDownload(location)\n}\n\nconst pollForFileDownloadLocation = async (\n resourceDownloadUrl: string,\n translationDownloadId: string,\n headers: Record<string, any>\n): Promise<string> => {\n const response = await fetch(\n `${resourceDownloadUrl}/${translationDownloadId}`,\n {\n headers: headers,\n }\n )\n\n if (response.status === 500) {\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 )\n } else if (response.redirected) {\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 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 )\n } else {\n console.info(\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 )\n }\n}\n\nconst handleFileDownload = async (url: string) => {\n return fetch(url).then(res => res.text())\n}\n","import { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, projOrgSlug, getHeaders } from './helpers'\nimport getTranslationTask from './getTranslationTask'\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 return fetch(`${baseTransifexUrl}/resources`, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceCreateBody),\n })\n .then(res => res.json())\n .then(res => res.data.id)\n}\n\nexport default async function createTask(\n documentId: string,\n document: Record<string, any>,\n //unfortunately Transifex doesn't let you specify locales on creating a task\n //@ts-ignore\n localeIds: string[],\n secrets: Secrets | null\n) {\n let resourceId = await fetch(\n `${baseTransifexUrl}/resources/${projOrgSlug(secrets)}:r:${documentId}`,\n { headers: getHeaders(secrets) }\n )\n .then(res => res.json())\n .then(res => (res.data ? res.data.id : null))\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 return fetch(resourceUploadUrl, {\n method: 'POST',\n body: JSON.stringify(resourceUploadBody),\n headers: getHeaders(secrets),\n }).then(() => getTranslationTask(documentId, secrets))\n}\n","import { Adapter } from 'sanity-translations-tab'\n\nimport getLocales from './getLocales'\nimport getTranslationTask from './getTranslationTask'\nimport getTranslation from './getTranslation'\nimport createTask from './createTask'\n\nexport const TransifexAdapter: Adapter = {\n getLocales,\n getTranslationTask,\n createTask,\n getTranslation,\n}\n","import {\n TranslationsTab,\n baseDocumentLevelConfig,\n baseFieldLevelConfig,\n findLatestDraft,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n Adapter,\n documentLevelPatch,\n fieldLevelPatch,\n} from 'sanity-translations-tab'\nimport { TransifexAdapter } from './transifexAdapter'\n\ninterface ConfigOptions {\n adapter: Adapter\n secretsNamespace: string | null\n exportForTranslation: (id: string) => Promise<Record<string, any>>\n importTranslation: (\n id: string,\n localeId: string,\n doc: string\n ) => Promise<void>\n}\nconst defaultDocumentLevelConfig: ConfigOptions = {\n ...baseDocumentLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nconst defaultFieldLevelConfig: ConfigOptions = {\n ...baseFieldLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nexport {\n TranslationsTab,\n findLatestDraft,\n documentLevelPatch,\n fieldLevelPatch,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n TransifexAdapter,\n defaultDocumentLevelConfig,\n defaultFieldLevelConfig,\n}\n"],"names":["baseTransifexUrl","getHeaders","secrets","Authorization","token","projOrgSlug","organization","project","getLocales","fetch","headers","then","res","json","data","map","lang","enabled","description","attributes","name","localeId","code","getTranslationTask","documentId","taskId","locales","projectFilter","resourceFilter","ok","status","Error","locale","relationships","language","id","split","progress","Math","floor","reviewed_strings","parseFloat","total_strings","task","localeIds","l","validLocales","filter","find","getTranslation","resourceDownloadBody","content_encoding","type","resource","resourceDownloadUrl","method","body","JSON","stringify","translationDownloadId","pollForFileDownloadLocation","location","handleFileDownload","response","console","info","Promise","resolve","setTimeout","redirected","url","text","createResource","doc","resourceCreateBody","accept_translations","slug","i18n_format","createTask","document","resourceId","resourceUploadUrl","resourceUploadBody","content","TransifexAdapter","defaultDocumentLevelConfig","baseDocumentLevelConfig","adapter","secretsNamespace","defaultFieldLevelConfig","baseFieldLevelConfig"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sanity-plugin-transifex.cjs.development.js","sources":["../src/transifexAdapter/helpers.ts","../src/transifexAdapter/getLocales.ts","../src/transifexAdapter/getTranslationTask.ts","../src/transifexAdapter/getTranslation.ts","../src/transifexAdapter/createTask.ts","../src/transifexAdapter/index.ts","../src/index.ts"],"sourcesContent":["import { Secrets } from 'sanity-translations-tab'\n\nexport const baseTransifexUrl = 'https://rest.api.transifex.com'\n\nexport const getHeaders = (secrets: Secrets | null) => ({\n Authorization: `Bearer ${secrets?.token}`,\n 'Content-Type': 'application/vnd.api+json',\n})\n\nexport const projOrgSlug = (secrets: Secrets | null) =>\n `o:${secrets?.organization}:p:${secrets?.project}`\n","import { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, projOrgSlug, getHeaders } from './helpers'\n\nexport default async function getLocales(secrets: Secrets | null) {\n if (secrets) {\n return fetch(\n `${baseTransifexUrl}/projects/${projOrgSlug(secrets)}/languages`,\n { headers: getHeaders(secrets) }\n )\n .then(res => res.json())\n .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 } else {\n return []\n }\n}\n","import { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, projOrgSlug, getHeaders } from './helpers'\nimport getLocales from './getLocales'\n\nexport default async function getTranslationTask(\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(\n secrets\n )}: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 } else {\n throw Error(\n `Failed to retrieve tasks from Transifex. Status: ${res.status}`\n )\n }\n })\n .then(res => ({\n taskId: `${projOrgSlug(secrets)}:r:${documentId}`,\n documentId: documentId,\n locales: res.data.map((locale: Record<string, any>) => ({\n localeId: locale.relationships.language.data.id.split(':')[1],\n progress: Math.floor(\n 100 *\n (locale.attributes.reviewed_strings /\n parseFloat(locale.attributes.total_strings))\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 { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, getHeaders } from './helpers'\n\nexport default async function getTranslation(\n taskId: string,\n localeId: string,\n secrets: Secrets | null\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 translationDownloadId = await fetch(resourceDownloadUrl, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceDownloadBody),\n })\n .then(res => res.json())\n .then(res => res.data.id)\n\n const headers = getHeaders(secrets)\n const location = await pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers\n )\n return handleFileDownload(location)\n}\n\nconst pollForFileDownloadLocation = async (\n resourceDownloadUrl: string,\n translationDownloadId: string,\n headers: Record<string, any>\n): Promise<string> => {\n const response = await fetch(\n `${resourceDownloadUrl}/${translationDownloadId}`,\n {\n headers: headers,\n }\n )\n\n if (response.status === 500) {\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 )\n } else if (response.redirected) {\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 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 )\n } else {\n console.info(\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 )\n }\n}\n\nconst handleFileDownload = async (url: string) => {\n return fetch(url).then(res => res.text())\n}\n","import { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, projOrgSlug, getHeaders } from './helpers'\nimport getTranslationTask from './getTranslationTask'\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 return fetch(`${baseTransifexUrl}/resources`, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceCreateBody),\n })\n .then(res => res.json())\n .then(res => res.data.id)\n}\n\nexport default async function createTask(\n documentId: string,\n document: Record<string, any>,\n //unfortunately Transifex doesn't let you specify locales on creating a task\n //@ts-ignore\n localeIds: string[],\n secrets: Secrets | null\n) {\n let resourceId = await fetch(\n `${baseTransifexUrl}/resources/${projOrgSlug(secrets)}:r:${documentId}`,\n { headers: getHeaders(secrets) }\n )\n .then(res => res.json())\n .then(res => (res.data ? res.data.id : null))\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 return fetch(resourceUploadUrl, {\n method: 'POST',\n body: JSON.stringify(resourceUploadBody),\n headers: getHeaders(secrets),\n }).then(() => getTranslationTask(documentId, secrets))\n}\n","import { Adapter } from 'sanity-translations-tab'\n\nimport getLocales from './getLocales'\nimport getTranslationTask from './getTranslationTask'\nimport getTranslation from './getTranslation'\nimport createTask from './createTask'\n\nexport const TransifexAdapter: Adapter = {\n getLocales,\n getTranslationTask,\n createTask,\n getTranslation,\n}\n","import {\n TranslationsTab,\n baseDocumentLevelConfig,\n baseFieldLevelConfig,\n findLatestDraft,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n Adapter,\n documentLevelPatch,\n fieldLevelPatch,\n} from 'sanity-translations-tab'\nimport { TransifexAdapter } from './transifexAdapter'\n\ninterface ConfigOptions {\n adapter: Adapter\n secretsNamespace: string | null\n exportForTranslation: (id: string) => Promise<Record<string, any>>\n importTranslation: (\n id: string,\n localeId: string,\n doc: string,\n _idStructure: undefined\n ) => Promise<void>\n}\nconst defaultDocumentLevelConfig: ConfigOptions = {\n ...baseDocumentLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nconst defaultFieldLevelConfig: ConfigOptions = {\n ...baseFieldLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nexport {\n TranslationsTab,\n findLatestDraft,\n documentLevelPatch,\n fieldLevelPatch,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n TransifexAdapter,\n defaultDocumentLevelConfig,\n defaultFieldLevelConfig,\n}\n"],"names":["baseTransifexUrl","getHeaders","secrets","Authorization","token","projOrgSlug","organization","project","getLocales","fetch","headers","then","res","json","data","map","lang","enabled","description","attributes","name","localeId","code","getTranslationTask","documentId","taskId","locales","projectFilter","resourceFilter","ok","status","Error","locale","relationships","language","id","split","progress","Math","floor","reviewed_strings","parseFloat","total_strings","task","localeIds","l","validLocales","filter","find","getTranslation","resourceDownloadBody","content_encoding","type","resource","resourceDownloadUrl","method","body","JSON","stringify","translationDownloadId","pollForFileDownloadLocation","location","handleFileDownload","response","console","info","Promise","resolve","setTimeout","redirected","url","text","createResource","doc","resourceCreateBody","accept_translations","slug","i18n_format","createTask","document","resourceId","resourceUploadUrl","resourceUploadBody","content","TransifexAdapter","defaultDocumentLevelConfig","baseDocumentLevelConfig","adapter","secretsNamespace","defaultFieldLevelConfig","baseFieldLevelConfig"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanity-plugin-transifex.cjs.production.min.js","sources":["../src/transifexAdapter/helpers.ts","../src/transifexAdapter/getLocales.ts","../src/transifexAdapter/getTranslationTask.ts","../src/transifexAdapter/getTranslation.ts","../src/transifexAdapter/createTask.ts","../src/transifexAdapter/index.ts","../src/index.ts"],"sourcesContent":["import { Secrets } from 'sanity-translations-tab'\n\nexport const baseTransifexUrl = 'https://rest.api.transifex.com'\n\nexport const getHeaders = (secrets: Secrets | null) => ({\n Authorization: `Bearer ${secrets?.token}`,\n 'Content-Type': 'application/vnd.api+json',\n})\n\nexport const projOrgSlug = (secrets: Secrets | null) =>\n `o:${secrets?.organization}:p:${secrets?.project}`\n","import { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, projOrgSlug, getHeaders } from './helpers'\n\nexport default async function getLocales(secrets: Secrets | null) {\n if (secrets) {\n return fetch(\n `${baseTransifexUrl}/projects/${projOrgSlug(secrets)}/languages`,\n { headers: getHeaders(secrets) }\n )\n .then(res => res.json())\n .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 } else {\n return []\n }\n}\n","import { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, projOrgSlug, getHeaders } from './helpers'\nimport getLocales from './getLocales'\n\nexport default async function getTranslationTask(\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(\n secrets\n )}: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 } else {\n throw Error(\n `Failed to retrieve tasks from Transifex. Status: ${res.status}`\n )\n }\n })\n .then(res => ({\n taskId: `${projOrgSlug(secrets)}:r:${documentId}`,\n documentId: documentId,\n locales: res.data.map((locale: Record<string, any>) => ({\n localeId: locale.relationships.language.data.id.split(':')[1],\n progress: Math.floor(\n 100 *\n (locale.attributes.reviewed_strings /\n parseFloat(locale.attributes.total_strings))\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 { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, getHeaders } from './helpers'\n\nexport default async function getTranslation(\n taskId: string,\n localeId: string,\n secrets: Secrets | null\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 translationDownloadId = await fetch(resourceDownloadUrl, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceDownloadBody),\n })\n .then(res => res.json())\n .then(res => res.data.id)\n\n const headers = getHeaders(secrets)\n const location = await pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers\n )\n return handleFileDownload(location)\n}\n\nconst pollForFileDownloadLocation = async (\n resourceDownloadUrl: string,\n translationDownloadId: string,\n headers: Record<string, any>\n): Promise<string> => {\n const response = await fetch(\n `${resourceDownloadUrl}/${translationDownloadId}`,\n {\n headers: headers,\n }\n )\n\n if (response.status === 500) {\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 )\n } else if (response.redirected) {\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 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 )\n } else {\n console.info(\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 )\n }\n}\n\nconst handleFileDownload = async (url: string) => {\n return fetch(url).then(res => res.text())\n}\n","import { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, projOrgSlug, getHeaders } from './helpers'\nimport getTranslationTask from './getTranslationTask'\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 return fetch(`${baseTransifexUrl}/resources`, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceCreateBody),\n })\n .then(res => res.json())\n .then(res => res.data.id)\n}\n\nexport default async function createTask(\n documentId: string,\n document: Record<string, any>,\n //unfortunately Transifex doesn't let you specify locales on creating a task\n //@ts-ignore\n localeIds: string[],\n secrets: Secrets | null\n) {\n let resourceId = await fetch(\n `${baseTransifexUrl}/resources/${projOrgSlug(secrets)}:r:${documentId}`,\n { headers: getHeaders(secrets) }\n )\n .then(res => res.json())\n .then(res => (res.data ? res.data.id : null))\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 return fetch(resourceUploadUrl, {\n method: 'POST',\n body: JSON.stringify(resourceUploadBody),\n headers: getHeaders(secrets),\n }).then(() => getTranslationTask(documentId, secrets))\n}\n","import { Adapter } from 'sanity-translations-tab'\n\nimport getLocales from './getLocales'\nimport getTranslationTask from './getTranslationTask'\nimport getTranslation from './getTranslation'\nimport createTask from './createTask'\n\nexport const TransifexAdapter: Adapter = {\n getLocales,\n getTranslationTask,\n createTask,\n getTranslation,\n}\n","import {\n TranslationsTab,\n baseDocumentLevelConfig,\n baseFieldLevelConfig,\n findLatestDraft,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n Adapter,\n documentLevelPatch,\n fieldLevelPatch,\n} from 'sanity-translations-tab'\nimport { TransifexAdapter } from './transifexAdapter'\n\ninterface ConfigOptions {\n adapter: Adapter\n secretsNamespace: string | null\n exportForTranslation: (id: string) => Promise<Record<string, any>>\n importTranslation: (\n id: string,\n localeId: string,\n doc: string\n ) => Promise<void>\n}\nconst defaultDocumentLevelConfig: ConfigOptions = {\n ...baseDocumentLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nconst defaultFieldLevelConfig: ConfigOptions = {\n ...baseFieldLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nexport {\n TranslationsTab,\n findLatestDraft,\n documentLevelPatch,\n fieldLevelPatch,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n TransifexAdapter,\n defaultDocumentLevelConfig,\n defaultFieldLevelConfig,\n}\n"],"names":["baseTransifexUrl","getHeaders","secrets","Authorization","token","Content-Type","projOrgSlug","organization","project","getLocales","_context","fetch","headers","then","res","json","data","map","lang","enabled","description","attributes","name","localeId","code","getTranslationTask","documentId","taskId","locales","projectFilter","resourceFilter","ok","status","Error","locale","relationships","language","id","split","progress","Math","floor","reviewed_strings","parseFloat","total_strings","task","localeIds","l","validLocales","filter","find","resourceDownloadBody","content_encoding","type","resource","resourceDownloadUrl","_context3","method","body","JSON","stringify","translationDownloadId","pollForFileDownloadLocation","handleFileDownload","response","console","info","Promise","resolve","setTimeout","redirected","url","text","createResource","doc","resourceCreateBody","accept_translations","slug","i18n_format","document","_context2","resourceId","content","TransifexAdapter","createTask","getTranslation","defaultDocumentLevelConfig","baseDocumentLevelConfig","adapter","secretsNamespace","defaultFieldLevelConfig","baseFieldLevelConfig"],"mappings":"q8NAEO,IAAMA,EAAmB,iCAEnBC,EAAa,SAACC,GAAD,MAA8B,CACtDC,+BAAyBD,SAAAA,EAASE,OAClCC,eAAgB,6BAGLC,EAAc,SAACJ,GAAD,kBACpBA,SAAAA,EAASK,2BAAkBL,SAAAA,EAASM,mBCPbC,KAA9B,iEAAe,WAA0BP,GAA1B,6BAAA,OAAA,sBAAA,OAAA,IACTA,GADSQ,SAAA,MAAA,yBAEJC,MACFX,eAA6BM,EAAYJ,gBAC5C,CAAEU,QAASX,EAAWC,KAErBW,MAAK,SAAAC,GAAG,OAAIA,EAAIC,UAChBF,MAAK,SAAAC,GAAG,OACPA,EAAIE,KAAKC,KAAI,SAACC,GAAD,MAAgC,CAC3CC,SAAS,EACTC,YAAaF,EAAKG,WAAWC,KAC7BC,SAAUL,EAAKG,WAAWG,aAXrB,OAAA,yBAeJ,IAfI,OAAA,UAAA,0DCCeC,OAA9B,iEAAe,WACbC,EACAxB,GAFa,cAAA,6BAAA,OAAA,sBAAA,OAAA,GAIRwB,GAAexB,GAJPQ,SAAA,MAAA,yBAKJ,CACLiB,OAAQD,EACRA,WAAYA,EACZE,QAAS,KARA,OAAA,OAWPC,qBAAmCvB,EAAYJ,GAC/C4B,sBAAqCxB,EACzCJ,SACKwB,EAdMhB,SAeMC,MACdX,8BAA4C6B,MAAiBC,EAChE,CAAElB,QAASX,EAAWC,KAErBW,MAAK,SAAAC,GACJ,GAAIA,EAAIiB,GACN,OAAOjB,EAAIC,OAGR,GAAmB,MAAfD,EAAIkB,OACX,MAAO,CAAEhB,KAAM,IAEf,MAAMiB,0DACgDnB,EAAIkB,WAI7DnB,MAAK,SAAAC,GAAG,MAAK,CACZa,OAAWrB,EAAYJ,SAAcwB,EACrCA,WAAYA,EACZE,QAASd,EAAIE,KAAKC,KAAI,SAACiB,GAAD,MAAkC,CACtDX,SAAUW,EAAOC,cAAcC,SAASpB,KAAKqB,GAAGC,MAAM,KAAK,GAC3DC,SAAUC,KAAKC,MAEVP,EAAOb,WAAWqB,iBACjBC,WAAWT,EAAOb,WAAWuB,eAFjC,aAtCK,OAAA,OAePC,SAfOnC,SA6CSD,EAAWP,GA7CpB,OAAA,OA8CP4C,SAAoB7B,KAAI,SAAC8B,GAAD,OAA4BA,EAAExB,YACtDyB,EAAeH,EAAKjB,QAAQqB,QAAO,SAACf,GAAD,OACvCY,EAAUI,MAAK,SAACb,GAAD,OAAgBA,IAAOH,EAAOX,eAE/CsB,EAAKjB,QAAUoB,oBAERH,GApDM,QAAA,UAAA,mFCDA,WACblB,EACAJ,EACArB,GAHa,YAAA,6BAAA,OAAA,sBAAA,OAAA,OAKPiD,EAAuB,CAC3BnC,KAAM,CACJK,WAAY,CACV+B,iBAAkB,QAEpBjB,cAAe,CACbC,SAAU,CACRpB,KAAM,CACJqB,QAASd,EACT8B,KAAM,cAGVC,SAAU,CACRtC,KAAM,CACJqB,GAAIV,EACJ0B,KAAM,eAIZA,KAAM,0CAIJE,EAAyBvD,2CA5BlBwD,SA6BuB7C,MAAM4C,EAAqB,CAC7D3C,QAASX,EAAWC,GACpBuD,OAAQ,OACRC,KAAMC,KAAKC,UAAUT,KAEpBtC,MAAK,SAAAC,GAAG,OAAIA,EAAIC,UAChBF,MAAK,SAAAC,GAAG,OAAIA,EAAIE,KAAKqB,MAnCX,OAAA,OA6BPwB,SAQAjD,EAAUX,EAAWC,GArCdsD,SAsCUM,EACrBP,EACAM,EACAjD,GAzCW,OAAA,yBA2CNmD,WA3CM,QAAA,UAAA,iDA8Cf,IAAMD,aAA2B,kBAAG,WAClCP,EACAM,EACAjD,GAHkC,MAAA,6BAAA,OAAA,sBAAA,OAAA,OAAAF,SAKXC,MAClB4C,MAAuBM,EAC1B,CACEjD,QAASA,IARqB,OAAA,GAYV,OAPlBoD,UAOOhC,QAZqBtB,UAAA,MAAA,OAahCuD,QAAQC,2EACgEL,8BAdxCnD,SAgB1B,IAAIyD,SAAQ,SAAAC,GAAO,OAAIC,WAAWD,EAAS,QAhBjB,OAAA,yBAiBzBN,EACLP,EACAM,EACAjD,IApB8B,QAAA,IAsBvBoD,EAASM,YAtBc5D,UAAA,MAAA,OAuBhCuD,QAAQC,gFACqEL,mEAEtEG,EAASO,KA1BgB,QAAA,GA2BH,MAApBP,EAAShC,QA3BctB,UAAA,MAAA,OA4BhCuD,QAAQC,0FAC+EL,gDA7BvDnD,UA+B1B,IAAIyD,SAAQ,SAAAC,GAAO,OAAIC,WAAWD,EAAS,QA/BjB,QAAA,yBAgCzBN,EACLP,EACAM,EACAjD,IAnC8B,QAAA,OAsChCqD,QAAQC,0FAC+EL,8BAAiDG,EAAShC,sCAvCjHtB,UAyC1B,IAAIyD,SAAQ,SAAAC,GAAO,OAAIC,WAAWD,EAAS,QAzCjB,QAAA,yBA0CzBN,EACLP,EACAM,EACAjD,IA7C8B,QAAA,UAAA,0BAAH,uBAAA,mCAkD3BmD,aAAkB,kBAAG,WAAOQ,GAAP,6BAAA,OAAA,sBAAA,OAAA,yBAClB5D,MAAM4D,GAAK1D,MAAK,SAAAC,GAAG,OAAIA,EAAI0D,WADT,OAAA,UAAA,0BAAH,mBAAA,mCC/FlBC,aAAc,kBAAG,WACrBC,EACAhD,EACAxB,GAHqB,MAAA,6BAAA,OAAA,sBAAA,OAAA,OAKfyE,EAAqB,CACzB3D,KAAM,CACJK,WAAY,CACVuD,qBAAqB,EACrBtD,KAAMoD,EAAIpD,KACVuD,KAAMnD,GAERS,cAAe,CACb2C,YAAa,CACX9D,KAAM,CACJqB,GAAI,gBACJgB,KAAM,iBAGV7C,QAAS,CACPQ,KAAM,CACJqB,GAAI/B,EAAYJ,GAChBmD,KAAM,cAIZA,KAAM,gCAIH1C,MAASX,eAA8B,CAC5CY,QAASX,EAAWC,GACpBuD,OAAQ,OACRC,KAAMC,KAAKC,UAAUe,KAEpB9D,MAAK,SAAAC,GAAG,OAAIA,EAAIC,UAChBF,MAAK,SAAAC,GAAG,OAAIA,EAAIE,KAAKqB,OApCH,OAAA,UAAA,0BAAH,uBAAA,qEAuCL,WACbX,EACAqD,EAGAjC,EACA5C,GANa,MAAA,6BAAA,OAAA,sBAAA,OAAA,OAAA8E,SAQUrE,MAClBX,gBAA8BM,EAAYJ,SAAcwB,EAC3D,CAAEd,QAASX,EAAWC,KAErBW,MAAK,SAAAC,GAAG,OAAIA,EAAIC,UAChBF,MAAK,SAAAC,GAAG,OAAKA,EAAIE,KAAOF,EAAIE,KAAKqB,GAAK,QAb5B,OAAA,GAQT4C,UARSD,SAAA,MAAA,OAAAA,SAgBQP,EAAeM,EAAUrD,EAAYxB,GAhB7C,OAgBX+E,SAhBW,OAAA,yBAsCNtE,MAnBsBX,gEAmBG,CAC9ByD,OAAQ,OACRC,KAAMC,KAAKC,UApBc,CACzB5C,KAAM,CACJK,WAAY,CACV6D,QAASH,EAASG,QAClB9B,iBAAkB,QAEpBjB,cAAe,CACbmB,SAAU,CACRtC,KAAM,CACJqB,GAAI4C,EACJ5B,KAAM,eAIZA,KAAM,oCAORzC,QAASX,EAAWC,KACnBW,MAAK,WAAA,OAAMY,EAAmBC,EAAYxB,OA1ChC,QAAA,UAAA,qDCpCFiF,EAA4B,CACvC1E,WAAAA,EACAgB,mBAAAA,EACA2D,WDiCF,kBAAA,gCChCEC,+BFRF,iCGuBMC,OACDC,2BACHC,QAASL,EACTM,iBAAkB,cAGdC,OACDC,wBACHH,QAASL,EACTM,iBAAkB"}
|
|
1
|
+
{"version":3,"file":"sanity-plugin-transifex.cjs.production.min.js","sources":["../src/transifexAdapter/helpers.ts","../src/transifexAdapter/getLocales.ts","../src/transifexAdapter/getTranslationTask.ts","../src/transifexAdapter/getTranslation.ts","../src/transifexAdapter/createTask.ts","../src/transifexAdapter/index.ts","../src/index.ts"],"sourcesContent":["import { Secrets } from 'sanity-translations-tab'\n\nexport const baseTransifexUrl = 'https://rest.api.transifex.com'\n\nexport const getHeaders = (secrets: Secrets | null) => ({\n Authorization: `Bearer ${secrets?.token}`,\n 'Content-Type': 'application/vnd.api+json',\n})\n\nexport const projOrgSlug = (secrets: Secrets | null) =>\n `o:${secrets?.organization}:p:${secrets?.project}`\n","import { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, projOrgSlug, getHeaders } from './helpers'\n\nexport default async function getLocales(secrets: Secrets | null) {\n if (secrets) {\n return fetch(\n `${baseTransifexUrl}/projects/${projOrgSlug(secrets)}/languages`,\n { headers: getHeaders(secrets) }\n )\n .then(res => res.json())\n .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 } else {\n return []\n }\n}\n","import { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, projOrgSlug, getHeaders } from './helpers'\nimport getLocales from './getLocales'\n\nexport default async function getTranslationTask(\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(\n secrets\n )}: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 } else {\n throw Error(\n `Failed to retrieve tasks from Transifex. Status: ${res.status}`\n )\n }\n })\n .then(res => ({\n taskId: `${projOrgSlug(secrets)}:r:${documentId}`,\n documentId: documentId,\n locales: res.data.map((locale: Record<string, any>) => ({\n localeId: locale.relationships.language.data.id.split(':')[1],\n progress: Math.floor(\n 100 *\n (locale.attributes.reviewed_strings /\n parseFloat(locale.attributes.total_strings))\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 { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, getHeaders } from './helpers'\n\nexport default async function getTranslation(\n taskId: string,\n localeId: string,\n secrets: Secrets | null\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 translationDownloadId = await fetch(resourceDownloadUrl, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceDownloadBody),\n })\n .then(res => res.json())\n .then(res => res.data.id)\n\n const headers = getHeaders(secrets)\n const location = await pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers\n )\n return handleFileDownload(location)\n}\n\nconst pollForFileDownloadLocation = async (\n resourceDownloadUrl: string,\n translationDownloadId: string,\n headers: Record<string, any>\n): Promise<string> => {\n const response = await fetch(\n `${resourceDownloadUrl}/${translationDownloadId}`,\n {\n headers: headers,\n }\n )\n\n if (response.status === 500) {\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 )\n } else if (response.redirected) {\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 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 )\n } else {\n console.info(\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 )\n }\n}\n\nconst handleFileDownload = async (url: string) => {\n return fetch(url).then(res => res.text())\n}\n","import { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, projOrgSlug, getHeaders } from './helpers'\nimport getTranslationTask from './getTranslationTask'\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 return fetch(`${baseTransifexUrl}/resources`, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceCreateBody),\n })\n .then(res => res.json())\n .then(res => res.data.id)\n}\n\nexport default async function createTask(\n documentId: string,\n document: Record<string, any>,\n //unfortunately Transifex doesn't let you specify locales on creating a task\n //@ts-ignore\n localeIds: string[],\n secrets: Secrets | null\n) {\n let resourceId = await fetch(\n `${baseTransifexUrl}/resources/${projOrgSlug(secrets)}:r:${documentId}`,\n { headers: getHeaders(secrets) }\n )\n .then(res => res.json())\n .then(res => (res.data ? res.data.id : null))\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 return fetch(resourceUploadUrl, {\n method: 'POST',\n body: JSON.stringify(resourceUploadBody),\n headers: getHeaders(secrets),\n }).then(() => getTranslationTask(documentId, secrets))\n}\n","import { Adapter } from 'sanity-translations-tab'\n\nimport getLocales from './getLocales'\nimport getTranslationTask from './getTranslationTask'\nimport getTranslation from './getTranslation'\nimport createTask from './createTask'\n\nexport const TransifexAdapter: Adapter = {\n getLocales,\n getTranslationTask,\n createTask,\n getTranslation,\n}\n","import {\n TranslationsTab,\n baseDocumentLevelConfig,\n baseFieldLevelConfig,\n findLatestDraft,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n Adapter,\n documentLevelPatch,\n fieldLevelPatch,\n} from 'sanity-translations-tab'\nimport { TransifexAdapter } from './transifexAdapter'\n\ninterface ConfigOptions {\n adapter: Adapter\n secretsNamespace: string | null\n exportForTranslation: (id: string) => Promise<Record<string, any>>\n importTranslation: (\n id: string,\n localeId: string,\n doc: string,\n _idStructure: undefined\n ) => Promise<void>\n}\nconst defaultDocumentLevelConfig: ConfigOptions = {\n ...baseDocumentLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nconst defaultFieldLevelConfig: ConfigOptions = {\n ...baseFieldLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nexport {\n TranslationsTab,\n findLatestDraft,\n documentLevelPatch,\n fieldLevelPatch,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n TransifexAdapter,\n defaultDocumentLevelConfig,\n defaultFieldLevelConfig,\n}\n"],"names":["baseTransifexUrl","getHeaders","secrets","Authorization","token","Content-Type","projOrgSlug","organization","project","getLocales","_context","fetch","headers","then","res","json","data","map","lang","enabled","description","attributes","name","localeId","code","getTranslationTask","documentId","taskId","locales","projectFilter","resourceFilter","ok","status","Error","locale","relationships","language","id","split","progress","Math","floor","reviewed_strings","parseFloat","total_strings","task","localeIds","l","validLocales","filter","find","resourceDownloadBody","content_encoding","type","resource","resourceDownloadUrl","_context3","method","body","JSON","stringify","translationDownloadId","pollForFileDownloadLocation","handleFileDownload","response","console","info","Promise","resolve","setTimeout","redirected","url","text","createResource","doc","resourceCreateBody","accept_translations","slug","i18n_format","document","_context2","resourceId","content","TransifexAdapter","createTask","getTranslation","defaultDocumentLevelConfig","baseDocumentLevelConfig","adapter","secretsNamespace","defaultFieldLevelConfig","baseFieldLevelConfig"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanity-plugin-transifex.esm.js","sources":["../src/transifexAdapter/helpers.ts","../src/transifexAdapter/getLocales.ts","../src/transifexAdapter/getTranslationTask.ts","../src/transifexAdapter/getTranslation.ts","../src/transifexAdapter/createTask.ts","../src/transifexAdapter/index.ts","../src/index.ts"],"sourcesContent":["import { Secrets } from 'sanity-translations-tab'\n\nexport const baseTransifexUrl = 'https://rest.api.transifex.com'\n\nexport const getHeaders = (secrets: Secrets | null) => ({\n Authorization: `Bearer ${secrets?.token}`,\n 'Content-Type': 'application/vnd.api+json',\n})\n\nexport const projOrgSlug = (secrets: Secrets | null) =>\n `o:${secrets?.organization}:p:${secrets?.project}`\n","import { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, projOrgSlug, getHeaders } from './helpers'\n\nexport default async function getLocales(secrets: Secrets | null) {\n if (secrets) {\n return fetch(\n `${baseTransifexUrl}/projects/${projOrgSlug(secrets)}/languages`,\n { headers: getHeaders(secrets) }\n )\n .then(res => res.json())\n .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 } else {\n return []\n }\n}\n","import { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, projOrgSlug, getHeaders } from './helpers'\nimport getLocales from './getLocales'\n\nexport default async function getTranslationTask(\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(\n secrets\n )}: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 } else {\n throw Error(\n `Failed to retrieve tasks from Transifex. Status: ${res.status}`\n )\n }\n })\n .then(res => ({\n taskId: `${projOrgSlug(secrets)}:r:${documentId}`,\n documentId: documentId,\n locales: res.data.map((locale: Record<string, any>) => ({\n localeId: locale.relationships.language.data.id.split(':')[1],\n progress: Math.floor(\n 100 *\n (locale.attributes.reviewed_strings /\n parseFloat(locale.attributes.total_strings))\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 { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, getHeaders } from './helpers'\n\nexport default async function getTranslation(\n taskId: string,\n localeId: string,\n secrets: Secrets | null\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 translationDownloadId = await fetch(resourceDownloadUrl, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceDownloadBody),\n })\n .then(res => res.json())\n .then(res => res.data.id)\n\n const headers = getHeaders(secrets)\n const location = await pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers\n )\n return handleFileDownload(location)\n}\n\nconst pollForFileDownloadLocation = async (\n resourceDownloadUrl: string,\n translationDownloadId: string,\n headers: Record<string, any>\n): Promise<string> => {\n const response = await fetch(\n `${resourceDownloadUrl}/${translationDownloadId}`,\n {\n headers: headers,\n }\n )\n\n if (response.status === 500) {\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 )\n } else if (response.redirected) {\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 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 )\n } else {\n console.info(\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 )\n }\n}\n\nconst handleFileDownload = async (url: string) => {\n return fetch(url).then(res => res.text())\n}\n","import { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, projOrgSlug, getHeaders } from './helpers'\nimport getTranslationTask from './getTranslationTask'\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 return fetch(`${baseTransifexUrl}/resources`, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceCreateBody),\n })\n .then(res => res.json())\n .then(res => res.data.id)\n}\n\nexport default async function createTask(\n documentId: string,\n document: Record<string, any>,\n //unfortunately Transifex doesn't let you specify locales on creating a task\n //@ts-ignore\n localeIds: string[],\n secrets: Secrets | null\n) {\n let resourceId = await fetch(\n `${baseTransifexUrl}/resources/${projOrgSlug(secrets)}:r:${documentId}`,\n { headers: getHeaders(secrets) }\n )\n .then(res => res.json())\n .then(res => (res.data ? res.data.id : null))\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 return fetch(resourceUploadUrl, {\n method: 'POST',\n body: JSON.stringify(resourceUploadBody),\n headers: getHeaders(secrets),\n }).then(() => getTranslationTask(documentId, secrets))\n}\n","import { Adapter } from 'sanity-translations-tab'\n\nimport getLocales from './getLocales'\nimport getTranslationTask from './getTranslationTask'\nimport getTranslation from './getTranslation'\nimport createTask from './createTask'\n\nexport const TransifexAdapter: Adapter = {\n getLocales,\n getTranslationTask,\n createTask,\n getTranslation,\n}\n","import {\n TranslationsTab,\n baseDocumentLevelConfig,\n baseFieldLevelConfig,\n findLatestDraft,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n Adapter,\n documentLevelPatch,\n fieldLevelPatch,\n} from 'sanity-translations-tab'\nimport { TransifexAdapter } from './transifexAdapter'\n\ninterface ConfigOptions {\n adapter: Adapter\n secretsNamespace: string | null\n exportForTranslation: (id: string) => Promise<Record<string, any>>\n importTranslation: (\n id: string,\n localeId: string,\n doc: string\n ) => Promise<void>\n}\nconst defaultDocumentLevelConfig: ConfigOptions = {\n ...baseDocumentLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nconst defaultFieldLevelConfig: ConfigOptions = {\n ...baseFieldLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nexport {\n TranslationsTab,\n findLatestDraft,\n documentLevelPatch,\n fieldLevelPatch,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n TransifexAdapter,\n defaultDocumentLevelConfig,\n defaultFieldLevelConfig,\n}\n"],"names":["baseTransifexUrl","getHeaders","secrets","Authorization","token","projOrgSlug","organization","project","getLocales","fetch","headers","then","res","json","data","map","lang","enabled","description","attributes","name","localeId","code","getTranslationTask","documentId","taskId","locales","projectFilter","resourceFilter","ok","status","Error","locale","relationships","language","id","split","progress","Math","floor","reviewed_strings","parseFloat","total_strings","task","localeIds","l","validLocales","filter","find","getTranslation","resourceDownloadBody","content_encoding","type","resource","resourceDownloadUrl","method","body","JSON","stringify","translationDownloadId","pollForFileDownloadLocation","location","handleFileDownload","response","console","info","Promise","resolve","setTimeout","redirected","url","text","createResource","doc","resourceCreateBody","accept_translations","slug","i18n_format","createTask","document","resourceId","resourceUploadUrl","resourceUploadBody","content","TransifexAdapter","defaultDocumentLevelConfig","baseDocumentLevelConfig","adapter","secretsNamespace","defaultFieldLevelConfig","baseFieldLevelConfig"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,IAAMA,gBAAgB,GAAG,gCAAzB;AAEA,IAAMC,UAAU,GAAG,SAAbA,UAAa,CAACC,OAAD;EAAA,OAA8B;IACtDC,aAAa,eAAYD,OAAZ,oBAAYA,OAAO,CAAEE,KAArB,CADyC;IAEtD,gBAAgB;GAFQ;AAAA,CAAnB;AAKA,IAAMC,WAAW,GAAG,SAAdA,WAAc,CAACH,OAAD;EAAA,eACpBA,OADoB,oBACpBA,OAAO,CAAEI,YADW,aACOJ,OADP,oBACOA,OAAO,CAAEK,OADhB;AAAA,CAApB;;SCNuBC,UAA9B;EAAA;AAAA;;;2EAAe,iBAA0BN,OAA1B;IAAA;MAAA;QAAA;UAAA;YAAA,KACTA,OADS;cAAA;cAAA;;;YAAA,iCAEJO,KAAK,CACPT,gBADO,kBACsBK,WAAW,CAACH,OAAD,CADjC,iBAEV;cAAEQ,OAAO,EAAET,UAAU,CAACC,OAAD;aAFX,CAAL,CAIJS,IAJI,CAIC,UAAAC,GAAG;cAAA,OAAIA,GAAG,CAACC,IAAJ,EAAJ;aAJJ,EAKJF,IALI,CAKC,UAAAC,GAAG;cAAA,OACPA,GAAG,CAACE,IAAJ,CAASC,GAAT,CAAa,UAACC,IAAD;gBAAA,OAAgC;kBAC3CC,OAAO,EAAE,IADkC;kBAE3CC,WAAW,EAAEF,IAAI,CAACG,UAAL,CAAgBC,IAFc;kBAG3CC,QAAQ,EAAEL,IAAI,CAACG,UAAL,CAAgBG;iBAHf;eAAb,CADO;aALJ,CAFI;;UAAA;YAAA,iCAeJ,EAfI;;UAAA;UAAA;YAAA;;;;;;;;SCCeC,kBAA9B;EAAA;AAAA;;;mFAAe,iBACbC,UADa,EAEbtB,OAFa;IAAA;IAAA;MAAA;QAAA;UAAA;YAAA,MAIT,CAACsB,UAAD,IAAe,CAACtB,OAJP;cAAA;cAAA;;;YAAA,iCAKJ;cACLuB,MAAM,EAAED,UADH;cAELA,UAAU,EAAEA,UAFP;cAGLE,OAAO,EAAE;aARA;;UAAA;YAWPC,aAXO,wBAW4BtB,WAAW,CAACH,OAAD,CAXvC;YAYP0B,cAZO,yBAY8BvB,WAAW,CACpDH,OADoD,CAZzC,WAcNsB,UAdM;YAAA;YAAA,OAeMf,KAAK,CACnBT,gBADmB,iCACyB2B,aADzB,SAC0CC,cAD1C,EAEtB;cAAElB,OAAO,EAAET,UAAU,CAACC,OAAD;aAFC,CAAL,CAIhBS,IAJgB,CAIX,UAAAC,GAAG;cACP,IAAIA,GAAG,CAACiB,EAAR,EAAY;gBACV,OAAOjB,GAAG,CAACC,IAAJ,EAAP;eADF;mBAIK,IAAID,GAAG,CAACkB,MAAJ,KAAe,GAAnB,EAAwB;gBAC3B,OAAO;kBAAEhB,IAAI,EAAE;iBAAf;eADG,MAEE;gBACL,MAAMiB,KAAK,uDAC2CnB,GAAG,CAACkB,MAD/C,CAAX;;aAZa,EAiBhBnB,IAjBgB,CAiBX,UAAAC,GAAG;cAAA,OAAK;gBACZa,MAAM,EAAKpB,WAAW,CAACH,OAAD,CAAhB,WAA+BsB,UADzB;gBAEZA,UAAU,EAAEA,UAFA;gBAGZE,OAAO,EAAEd,GAAG,CAACE,IAAJ,CAASC,GAAT,CAAa,UAACiB,MAAD;kBAAA,OAAkC;oBACtDX,QAAQ,EAAEW,MAAM,CAACC,aAAP,CAAqBC,QAArB,CAA8BpB,IAA9B,CAAmCqB,EAAnC,CAAsCC,KAAtC,CAA4C,GAA5C,EAAiD,CAAjD,CAD4C;oBAEtDC,QAAQ,EAAEC,IAAI,CAACC,KAAL,CACR,OACGP,MAAM,CAACb,UAAP,CAAkBqB,gBAAlB,GACCC,UAAU,CAACT,MAAM,CAACb,UAAP,CAAkBuB,aAAnB,CAFd,CADQ;mBAFU;iBAAb;eAHF;aAjBQ,CAfN;;UAAA;YAePC,IAfO;YAAA;YAAA,OA6CSnC,UAAU,CAACN,OAAD,CA7CnB;;UAAA;YA6CPwB,OA7CO;YA8CPkB,SA9CO,GA8CKlB,OAAO,CAACX,GAAR,CAAY,UAAC8B,CAAD;cAAA,OAA4BA,CAAC,CAACxB,QAA9B;aAAZ,CA9CL;YA+CPyB,YA/CO,GA+CQH,IAAI,CAACjB,OAAL,CAAaqB,MAAb,CAAoB,UAACf,MAAD;cAAA,OACvCY,SAAS,CAACI,IAAV,CAAe,UAACb,EAAD;gBAAA,OAAgBA,EAAE,KAAKH,MAAM,CAACX,QAA9B;eAAf,CADuC;aAApB,CA/CR;YAkDbsB,IAAI,CAACjB,OAAL,GAAeoB,YAAf;YAlDa,iCAoDNH,IApDM;;UAAA;UAAA;YAAA;;;;;;;;SCDeM,cAA9B;EAAA;AAAA;;;+EAAe,kBACbxB,MADa,EAEbJ,QAFa,EAGbnB,OAHa;IAAA;IAAA;MAAA;QAAA;UAAA;YAKPgD,oBALO,GAKgB;cAC3BpC,IAAI,EAAE;gBACJK,UAAU,EAAE;kBACVgC,gBAAgB,EAAE;iBAFhB;gBAIJlB,aAAa,EAAE;kBACbC,QAAQ,EAAE;oBACRpB,IAAI,EAAE;sBACJqB,EAAE,SAAOd,QADL;sBAEJ+B,IAAI,EAAE;;mBAJG;kBAObC,QAAQ,EAAE;oBACRvC,IAAI,EAAE;sBACJqB,EAAE,EAAEV,MADA;sBAEJ2B,IAAI,EAAE;;;iBAdR;gBAkBJA,IAAI,EAAE;;aAxBG;YA4BPE,mBA5BO,GA4BkBtD,gBA5BlB;YAAA;YAAA,OA6BuBS,KAAK,CAAC6C,mBAAD,EAAsB;cAC7D5C,OAAO,EAAET,UAAU,CAACC,OAAD,CAD0C;cAE7DqD,MAAM,EAAE,MAFqD;cAG7DC,IAAI,EAAEC,IAAI,CAACC,SAAL,CAAeR,oBAAf;aAHiC,CAAL,CAKjCvC,IALiC,CAK5B,UAAAC,GAAG;cAAA,OAAIA,GAAG,CAACC,IAAJ,EAAJ;aALyB,EAMjCF,IANiC,CAM5B,UAAAC,GAAG;cAAA,OAAIA,GAAG,CAACE,IAAJ,CAASqB,EAAb;aANyB,CA7BvB;;UAAA;YA6BPwB,qBA7BO;YAqCPjD,OArCO,GAqCGT,UAAU,CAACC,OAAD,CArCb;YAAA;YAAA,OAsCU0D,2BAA2B,CAChDN,mBADgD,EAEhDK,qBAFgD,EAGhDjD,OAHgD,CAtCrC;;UAAA;YAsCPmD,QAtCO;YAAA,kCA2CNC,kBAAkB,CAACD,QAAD,CA3CZ;;UAAA;UAAA;YAAA;;;;;;;;AA8Cf,IAAMD,2BAA2B;EAAA,mFAAG,iBAClCN,mBADkC,EAElCK,qBAFkC,EAGlCjD,OAHkC;IAAA;IAAA;MAAA;QAAA;UAAA;YAAA;YAAA,OAKXD,KAAK,CACvB6C,mBADuB,SACAK,qBADA,EAE1B;cACEjD,OAAO,EAAEA;aAHe,CALM;;UAAA;YAK5BqD,QAL4B;;YAAA,MAY9BA,QAAQ,CAACjC,MAAT,KAAoB,GAZU;cAAA;cAAA;;;YAahCkC,OAAO,CAACC,IAAR,yEACwEN,qBADxE;YAbgC;YAAA,OAgB1B,IAAIO,OAAJ,CAAY,UAAAC,OAAO;cAAA,OAAIC,UAAU,CAACD,OAAD,EAAU,IAAV,CAAd;aAAnB,CAhB0B;;UAAA;YAAA,iCAiBzBP,2BAA2B,CAChCN,mBADgC,EAEhCK,qBAFgC,EAGhCjD,OAHgC,CAjBF;;UAAA;YAAA,KAsBvBqD,QAAQ,CAACM,UAtBc;cAAA;cAAA;;;YAuBhCL,OAAO,CAACC,IAAR,8EAC6EN,qBAD7E;YAvBgC,iCA0BzBI,QAAQ,CAACO,GA1BgB;;UAAA;YAAA,MA2BvBP,QAAQ,CAACjC,MAAT,KAAoB,GA3BG;cAAA;cAAA;;;YA4BhCkC,OAAO,CAACC,IAAR,wFACuFN,qBADvF;YA5BgC;YAAA,OA+B1B,IAAIO,OAAJ,CAAY,UAAAC,OAAO;cAAA,OAAIC,UAAU,CAACD,OAAD,EAAU,IAAV,CAAd;aAAnB,CA/B0B;;UAAA;YAAA,iCAgCzBP,2BAA2B,CAChCN,mBADgC,EAEhCK,qBAFgC,EAGhCjD,OAHgC,CAhCF;;UAAA;YAsChCsD,OAAO,CAACC,IAAR,wFACuFN,qBADvF,iCACwII,QAAQ,CAACjC,MADjJ;YAtCgC;YAAA,OAyC1B,IAAIoC,OAAJ,CAAY,UAAAC,OAAO;cAAA,OAAIC,UAAU,CAACD,OAAD,EAAU,IAAV,CAAd;aAAnB,CAzC0B;;UAAA;YAAA,iCA0CzBP,2BAA2B,CAChCN,mBADgC,EAEhCK,qBAFgC,EAGhCjD,OAHgC,CA1CF;;UAAA;UAAA;YAAA;;;;GAAH;;EAAA,gBAA3BkD,2BAA2B;IAAA;;AAAA,GAAjC;;AAkDA,IAAME,kBAAkB;EAAA,oFAAG,kBAAOQ,GAAP;IAAA;MAAA;QAAA;UAAA;YAAA,kCAClB7D,KAAK,CAAC6D,GAAD,CAAL,CAAW3D,IAAX,CAAgB,UAAAC,GAAG;cAAA,OAAIA,GAAG,CAAC2D,IAAJ,EAAJ;aAAnB,CADkB;;UAAA;UAAA;YAAA;;;;GAAH;;EAAA,gBAAlBT,kBAAkB;IAAA;;AAAA,GAAxB;;AC/FA,IAAMU,cAAc;EAAA,mFAAG,iBACrBC,GADqB,EAErBjD,UAFqB,EAGrBtB,OAHqB;IAAA;IAAA;MAAA;QAAA;UAAA;YAKfwE,kBALe,GAKM;cACzB5D,IAAI,EAAE;gBACJK,UAAU,EAAE;kBACVwD,mBAAmB,EAAE,IADX;kBAEVvD,IAAI,EAAEqD,GAAG,CAACrD,IAFA;kBAGVwD,IAAI,EAAEpD;iBAJJ;gBAMJS,aAAa,EAAE;kBACb4C,WAAW,EAAE;oBACX/D,IAAI,EAAE;sBACJqB,EAAE,EAAE,eADA;sBAEJiB,IAAI,EAAE;;mBAJG;kBAOb7C,OAAO,EAAE;oBACPO,IAAI,EAAE;sBACJqB,EAAE,EAAE9B,WAAW,CAACH,OAAD,CADX;sBAEJkD,IAAI,EAAE;;;iBAhBR;gBAoBJA,IAAI,EAAE;;aA1BW;YAAA,iCA8Bd3C,KAAK,CAAIT,gBAAJ,iBAAkC;cAC5CU,OAAO,EAAET,UAAU,CAACC,OAAD,CADyB;cAE5CqD,MAAM,EAAE,MAFoC;cAG5CC,IAAI,EAAEC,IAAI,CAACC,SAAL,CAAegB,kBAAf;aAHI,CAAL,CAKJ/D,IALI,CAKC,UAAAC,GAAG;cAAA,OAAIA,GAAG,CAACC,IAAJ,EAAJ;aALJ,EAMJF,IANI,CAMC,UAAAC,GAAG;cAAA,OAAIA,GAAG,CAACE,IAAJ,CAASqB,EAAb;aANJ,CA9Bc;;UAAA;UAAA;YAAA;;;;GAAH;;EAAA,gBAAdqC,cAAc;IAAA;;AAAA,GAApB;;AAuCA,SAA8BM,UAA9B;EAAA;AAAA;;;2EAAe,kBACbtD,UADa,EAEbuD,QAFa;;EAKbnC,SALa,EAMb1C,OANa;IAAA;IAAA;MAAA;QAAA;UAAA;YAAA;YAAA,OAQUO,KAAK,CACvBT,gBADuB,mBACOK,WAAW,CAACH,OAAD,CADlB,WACiCsB,UADjC,EAE1B;cAAEd,OAAO,EAAET,UAAU,CAACC,OAAD;aAFK,CAAL,CAIpBS,IAJoB,CAIf,UAAAC,GAAG;cAAA,OAAIA,GAAG,CAACC,IAAJ,EAAJ;aAJY,EAKpBF,IALoB,CAKf,UAAAC,GAAG;cAAA,OAAKA,GAAG,CAACE,IAAJ,GAAWF,GAAG,CAACE,IAAJ,CAASqB,EAApB,GAAyB,IAA9B;aALY,CARV;;UAAA;YAQT6C,UARS;;YAAA,IAeRA,UAfQ;cAAA;cAAA;;;YAAA;YAAA,OAgBQR,cAAc,CAACO,QAAD,EAAWvD,UAAX,EAAuBtB,OAAvB,CAhBtB;;UAAA;YAgBX8E,UAhBW;;UAAA;YAmBPC,iBAnBO,GAmBgBjF,gBAnBhB;YAoBPkF,kBApBO,GAoBc;cACzBpE,IAAI,EAAE;gBACJK,UAAU,EAAE;kBACVgE,OAAO,EAAEJ,QAAQ,CAACI,OADR;kBAEVhC,gBAAgB,EAAE;iBAHhB;gBAKJlB,aAAa,EAAE;kBACboB,QAAQ,EAAE;oBACRvC,IAAI,EAAE;sBACJqB,EAAE,EAAE6C,UADA;sBAEJ5B,IAAI,EAAE;;;iBATR;gBAaJA,IAAI,EAAE;;aAlCG;YAAA,kCAsCN3C,KAAK,CAACwE,iBAAD,EAAoB;cAC9B1B,MAAM,EAAE,MADsB;cAE9BC,IAAI,EAAEC,IAAI,CAACC,SAAL,CAAewB,kBAAf,CAFwB;cAG9BxE,OAAO,EAAET,UAAU,CAACC,OAAD;aAHT,CAAL,CAIJS,IAJI,CAIC;cAAA,OAAMY,kBAAkB,CAACC,UAAD,EAAatB,OAAb,CAAxB;aAJD,CAtCM;;UAAA;UAAA;YAAA;;;;;;;;ICpCFkF,gBAAgB,GAAY;EACvC5E,UAAU,EAAVA,UADuC;EAEvCe,kBAAkB,EAAlBA,kBAFuC;EAGvCuD,UAAU,EAAVA,UAHuC;EAIvC7B,cAAc,EAAdA;AAJuC,CAAlC;;ICmBDoC,0BAA0B,6BAC3BC,uBAD2B;EAE9BC,OAAO,EAAEH,gBAFqB;EAG9BI,gBAAgB,EAAE;AAHY,EAAhC;;AAMA,IAAMC,uBAAuB,6BACxBC,oBADwB;EAE3BH,OAAO,EAAEH,gBAFkB;EAG3BI,gBAAgB,EAAE;AAHS,EAA7B;;;;"}
|
|
1
|
+
{"version":3,"file":"sanity-plugin-transifex.esm.js","sources":["../src/transifexAdapter/helpers.ts","../src/transifexAdapter/getLocales.ts","../src/transifexAdapter/getTranslationTask.ts","../src/transifexAdapter/getTranslation.ts","../src/transifexAdapter/createTask.ts","../src/transifexAdapter/index.ts","../src/index.ts"],"sourcesContent":["import { Secrets } from 'sanity-translations-tab'\n\nexport const baseTransifexUrl = 'https://rest.api.transifex.com'\n\nexport const getHeaders = (secrets: Secrets | null) => ({\n Authorization: `Bearer ${secrets?.token}`,\n 'Content-Type': 'application/vnd.api+json',\n})\n\nexport const projOrgSlug = (secrets: Secrets | null) =>\n `o:${secrets?.organization}:p:${secrets?.project}`\n","import { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, projOrgSlug, getHeaders } from './helpers'\n\nexport default async function getLocales(secrets: Secrets | null) {\n if (secrets) {\n return fetch(\n `${baseTransifexUrl}/projects/${projOrgSlug(secrets)}/languages`,\n { headers: getHeaders(secrets) }\n )\n .then(res => res.json())\n .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 } else {\n return []\n }\n}\n","import { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, projOrgSlug, getHeaders } from './helpers'\nimport getLocales from './getLocales'\n\nexport default async function getTranslationTask(\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(\n secrets\n )}: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 } else {\n throw Error(\n `Failed to retrieve tasks from Transifex. Status: ${res.status}`\n )\n }\n })\n .then(res => ({\n taskId: `${projOrgSlug(secrets)}:r:${documentId}`,\n documentId: documentId,\n locales: res.data.map((locale: Record<string, any>) => ({\n localeId: locale.relationships.language.data.id.split(':')[1],\n progress: Math.floor(\n 100 *\n (locale.attributes.reviewed_strings /\n parseFloat(locale.attributes.total_strings))\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 { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, getHeaders } from './helpers'\n\nexport default async function getTranslation(\n taskId: string,\n localeId: string,\n secrets: Secrets | null\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 translationDownloadId = await fetch(resourceDownloadUrl, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceDownloadBody),\n })\n .then(res => res.json())\n .then(res => res.data.id)\n\n const headers = getHeaders(secrets)\n const location = await pollForFileDownloadLocation(\n resourceDownloadUrl,\n translationDownloadId,\n headers\n )\n return handleFileDownload(location)\n}\n\nconst pollForFileDownloadLocation = async (\n resourceDownloadUrl: string,\n translationDownloadId: string,\n headers: Record<string, any>\n): Promise<string> => {\n const response = await fetch(\n `${resourceDownloadUrl}/${translationDownloadId}`,\n {\n headers: headers,\n }\n )\n\n if (response.status === 500) {\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 )\n } else if (response.redirected) {\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 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 )\n } else {\n console.info(\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 )\n }\n}\n\nconst handleFileDownload = async (url: string) => {\n return fetch(url).then(res => res.text())\n}\n","import { Secrets } from 'sanity-translations-tab'\nimport { baseTransifexUrl, projOrgSlug, getHeaders } from './helpers'\nimport getTranslationTask from './getTranslationTask'\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 return fetch(`${baseTransifexUrl}/resources`, {\n headers: getHeaders(secrets),\n method: 'POST',\n body: JSON.stringify(resourceCreateBody),\n })\n .then(res => res.json())\n .then(res => res.data.id)\n}\n\nexport default async function createTask(\n documentId: string,\n document: Record<string, any>,\n //unfortunately Transifex doesn't let you specify locales on creating a task\n //@ts-ignore\n localeIds: string[],\n secrets: Secrets | null\n) {\n let resourceId = await fetch(\n `${baseTransifexUrl}/resources/${projOrgSlug(secrets)}:r:${documentId}`,\n { headers: getHeaders(secrets) }\n )\n .then(res => res.json())\n .then(res => (res.data ? res.data.id : null))\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 return fetch(resourceUploadUrl, {\n method: 'POST',\n body: JSON.stringify(resourceUploadBody),\n headers: getHeaders(secrets),\n }).then(() => getTranslationTask(documentId, secrets))\n}\n","import { Adapter } from 'sanity-translations-tab'\n\nimport getLocales from './getLocales'\nimport getTranslationTask from './getTranslationTask'\nimport getTranslation from './getTranslation'\nimport createTask from './createTask'\n\nexport const TransifexAdapter: Adapter = {\n getLocales,\n getTranslationTask,\n createTask,\n getTranslation,\n}\n","import {\n TranslationsTab,\n baseDocumentLevelConfig,\n baseFieldLevelConfig,\n findLatestDraft,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n Adapter,\n documentLevelPatch,\n fieldLevelPatch,\n} from 'sanity-translations-tab'\nimport { TransifexAdapter } from './transifexAdapter'\n\ninterface ConfigOptions {\n adapter: Adapter\n secretsNamespace: string | null\n exportForTranslation: (id: string) => Promise<Record<string, any>>\n importTranslation: (\n id: string,\n localeId: string,\n doc: string,\n _idStructure: undefined\n ) => Promise<void>\n}\nconst defaultDocumentLevelConfig: ConfigOptions = {\n ...baseDocumentLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nconst defaultFieldLevelConfig: ConfigOptions = {\n ...baseFieldLevelConfig,\n adapter: TransifexAdapter,\n secretsNamespace: 'transifex',\n}\n\nexport {\n TranslationsTab,\n findLatestDraft,\n documentLevelPatch,\n fieldLevelPatch,\n BaseDocumentDeserializer,\n BaseDocumentSerializer,\n BaseDocumentMerger,\n defaultStopTypes,\n customSerializers,\n TransifexAdapter,\n defaultDocumentLevelConfig,\n defaultFieldLevelConfig,\n}\n"],"names":["baseTransifexUrl","getHeaders","secrets","Authorization","token","projOrgSlug","organization","project","getLocales","fetch","headers","then","res","json","data","map","lang","enabled","description","attributes","name","localeId","code","getTranslationTask","documentId","taskId","locales","projectFilter","resourceFilter","ok","status","Error","locale","relationships","language","id","split","progress","Math","floor","reviewed_strings","parseFloat","total_strings","task","localeIds","l","validLocales","filter","find","getTranslation","resourceDownloadBody","content_encoding","type","resource","resourceDownloadUrl","method","body","JSON","stringify","translationDownloadId","pollForFileDownloadLocation","location","handleFileDownload","response","console","info","Promise","resolve","setTimeout","redirected","url","text","createResource","doc","resourceCreateBody","accept_translations","slug","i18n_format","createTask","document","resourceId","resourceUploadUrl","resourceUploadBody","content","TransifexAdapter","defaultDocumentLevelConfig","baseDocumentLevelConfig","adapter","secretsNamespace","defaultFieldLevelConfig","baseFieldLevelConfig"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "2.0.
|
|
2
|
+
"version": "2.0.7",
|
|
3
3
|
"license": "MIT",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"typings": "dist/index.d.ts",
|
|
@@ -56,6 +56,6 @@
|
|
|
56
56
|
"typescript": "^4.0.5"
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"sanity-translations-tab": "^2.0.
|
|
59
|
+
"sanity-translations-tab": "^2.0.10"
|
|
60
60
|
}
|
|
61
61
|
}
|