gt-sanity 4.0.15 → 4.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/package.json +2 -2
- package/src/adapter/__tests__/api.test.ts +152 -88
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gt-sanity",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.16",
|
|
4
4
|
"description": "General Translation integration with Sanity",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sanity",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"jsonpointer": "^5.0.1",
|
|
49
49
|
"lodash.merge": "^4.6.2",
|
|
50
50
|
"sanity-plugin-internationalized-array": "^5.1.27",
|
|
51
|
-
"generaltranslation": "9.4.
|
|
51
|
+
"generaltranslation": "9.4.1"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@portabletext/types": "^2.0.15",
|
|
@@ -63,117 +63,181 @@ describe('Sanity API adapter', () => {
|
|
|
63
63
|
});
|
|
64
64
|
});
|
|
65
65
|
|
|
66
|
-
it(
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
66
|
+
it.each([
|
|
67
|
+
['source', 'target'],
|
|
68
|
+
['en-us', 'es-es'],
|
|
69
|
+
])(
|
|
70
|
+
'canonicalizes enqueue locales %s / %s',
|
|
71
|
+
async (sourceLocale, targetLocale) => {
|
|
72
|
+
fetchMock.mockImplementation(async (request) => {
|
|
73
|
+
const body = JSON.parse(await new Request(request).text()) as {
|
|
74
|
+
sourceLocale?: string;
|
|
75
|
+
targetLocales: string[];
|
|
76
|
+
};
|
|
77
|
+
expect(body.sourceLocale).toBe('en-US');
|
|
78
|
+
expect(body.targetLocales).toEqual(['es-ES']);
|
|
79
|
+
return Response.json({
|
|
80
|
+
jobData: {},
|
|
81
|
+
locales: [],
|
|
82
|
+
message: 'Enqueued files',
|
|
83
|
+
});
|
|
78
84
|
});
|
|
79
|
-
});
|
|
80
85
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
86
|
+
await api.enqueueFiles([{ fileId: 'file-id', versionId: 'version-id' }], {
|
|
87
|
+
sourceLocale,
|
|
88
|
+
targetLocales: [targetLocale],
|
|
89
|
+
});
|
|
85
90
|
|
|
86
|
-
|
|
87
|
-
|
|
91
|
+
expect(fetchMock).toHaveBeenCalledOnce();
|
|
92
|
+
}
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
it.each([
|
|
96
|
+
['source', 'target'],
|
|
97
|
+
['en-us', 'es-es'],
|
|
98
|
+
])(
|
|
99
|
+
'canonicalizes upload locales %s / %s',
|
|
100
|
+
async (sourceLocale, targetLocale) => {
|
|
101
|
+
fetchMock.mockImplementation(async (request) => {
|
|
102
|
+
const body = JSON.parse(await new Request(request).text()) as {
|
|
103
|
+
sourceLocale: string;
|
|
104
|
+
data: Array<{
|
|
105
|
+
source: { locale: string };
|
|
106
|
+
translations: Array<{ locale: string }>;
|
|
107
|
+
}>;
|
|
108
|
+
};
|
|
109
|
+
expect(body.sourceLocale).toBe('en-US');
|
|
110
|
+
expect(body.data[0].source.locale).toBe('en-US');
|
|
111
|
+
expect(body.data[0].translations[0].locale).toBe('es-ES');
|
|
112
|
+
return Response.json({
|
|
113
|
+
uploadedFiles: [],
|
|
114
|
+
count: 0,
|
|
115
|
+
message: 'Uploaded files',
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
await api.uploadTranslations(
|
|
120
|
+
[
|
|
121
|
+
{
|
|
122
|
+
source: {
|
|
123
|
+
content: 'source',
|
|
124
|
+
fileName: 'document.html',
|
|
125
|
+
fileFormat: 'HTML',
|
|
126
|
+
locale: sourceLocale,
|
|
127
|
+
},
|
|
128
|
+
translations: [
|
|
129
|
+
{
|
|
130
|
+
content: 'translation',
|
|
131
|
+
fileName: 'document.html',
|
|
132
|
+
fileFormat: 'HTML',
|
|
133
|
+
locale: targetLocale,
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
{ sourceLocale }
|
|
139
|
+
);
|
|
88
140
|
|
|
89
|
-
|
|
141
|
+
expect(fetchMock).toHaveBeenCalledOnce();
|
|
142
|
+
}
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
it('canonicalizes source upload locales without mutating input', async () => {
|
|
90
146
|
fetchMock.mockImplementation(async (request) => {
|
|
91
|
-
const body = JSON.parse(await new Request(request).text())
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
expect(body.data[0].translations[0].locale).toBe('es-ES');
|
|
147
|
+
const body = JSON.parse(await new Request(request).text());
|
|
148
|
+
expect(body).toMatchObject({
|
|
149
|
+
sourceLocale: 'en-US',
|
|
150
|
+
data: [{ source: { locale: 'en-US' } }],
|
|
151
|
+
});
|
|
97
152
|
return Response.json({
|
|
98
153
|
uploadedFiles: [],
|
|
99
154
|
count: 0,
|
|
100
155
|
message: 'Uploaded files',
|
|
101
156
|
});
|
|
102
157
|
});
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
fileFormat: 'HTML',
|
|
111
|
-
locale: 'source',
|
|
112
|
-
},
|
|
113
|
-
translations: [
|
|
114
|
-
{
|
|
115
|
-
content: 'translation',
|
|
116
|
-
fileName: 'document.html',
|
|
117
|
-
fileFormat: 'HTML',
|
|
118
|
-
locale: 'target',
|
|
119
|
-
},
|
|
120
|
-
],
|
|
158
|
+
const files = [
|
|
159
|
+
{
|
|
160
|
+
source: {
|
|
161
|
+
content: 'source',
|
|
162
|
+
fileName: 'document.html',
|
|
163
|
+
fileFormat: 'HTML' as const,
|
|
164
|
+
locale: 'en-us',
|
|
121
165
|
},
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
);
|
|
166
|
+
},
|
|
167
|
+
];
|
|
125
168
|
|
|
126
|
-
|
|
127
|
-
});
|
|
169
|
+
await api.uploadSourceFiles(files, { sourceLocale: 'en-us' });
|
|
128
170
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
result({ data: Buffer.from('translated').toString('base64') })
|
|
132
|
-
);
|
|
133
|
-
|
|
134
|
-
await expect(
|
|
135
|
-
api.downloadFile({ fileId: 'file-id', locale: 'target' })
|
|
136
|
-
).resolves.toBe('translated');
|
|
137
|
-
expect(downloadFile).toHaveBeenCalledWith(
|
|
138
|
-
expect.objectContaining({
|
|
139
|
-
query: expect.objectContaining({ locale: 'es-ES' }),
|
|
140
|
-
})
|
|
141
|
-
);
|
|
171
|
+
expect(fetchMock).toHaveBeenCalledOnce();
|
|
172
|
+
expect(files[0].source.locale).toBe('en-us');
|
|
142
173
|
});
|
|
143
174
|
|
|
144
|
-
it('
|
|
175
|
+
it('canonicalizes project setup locales', async () => {
|
|
145
176
|
fetchMock.mockImplementation(async (request) => {
|
|
146
|
-
const body = JSON.parse(await new Request(request).text())
|
|
147
|
-
|
|
148
|
-
}
|
|
149
|
-
expect(body).toEqual([{ fileId: 'file-id', locale: 'es-ES' }]);
|
|
150
|
-
return Response.json({
|
|
151
|
-
files: [
|
|
152
|
-
{
|
|
153
|
-
id: 'id',
|
|
154
|
-
branchId: 'branch-id',
|
|
155
|
-
fileId: 'file-id',
|
|
156
|
-
locale: 'es-ES',
|
|
157
|
-
versionId: 'version-id',
|
|
158
|
-
fileName: 'document.html',
|
|
159
|
-
data: Buffer.from('translated').toString('base64'),
|
|
160
|
-
metadata: {},
|
|
161
|
-
fileFormat: 'HTML',
|
|
162
|
-
},
|
|
163
|
-
],
|
|
164
|
-
count: 1,
|
|
165
|
-
pending: [],
|
|
166
|
-
});
|
|
177
|
+
const body = JSON.parse(await new Request(request).text());
|
|
178
|
+
expect(body.locales).toEqual(['en-US', 'es-ES']);
|
|
179
|
+
return Response.json({ status: 'completed' });
|
|
167
180
|
});
|
|
168
181
|
|
|
169
|
-
|
|
170
|
-
{ fileId: 'file-id', locale: 'target' },
|
|
171
|
-
]);
|
|
182
|
+
await api.setupProject([], { locales: ['source', 'es-es'] });
|
|
172
183
|
|
|
173
184
|
expect(fetchMock).toHaveBeenCalledOnce();
|
|
174
|
-
expect(response.files[0].locale).toBe('target');
|
|
175
185
|
});
|
|
176
186
|
|
|
187
|
+
it.each(['target', 'es-es'])(
|
|
188
|
+
'canonicalizes single download locale %s',
|
|
189
|
+
async (locale) => {
|
|
190
|
+
vi.mocked(downloadFile).mockResolvedValue(
|
|
191
|
+
result({ data: Buffer.from('translated').toString('base64') })
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
await expect(
|
|
195
|
+
api.downloadFile({ fileId: 'file-id', locale })
|
|
196
|
+
).resolves.toBe('translated');
|
|
197
|
+
expect(downloadFile).toHaveBeenCalledWith(
|
|
198
|
+
expect.objectContaining({
|
|
199
|
+
query: expect.objectContaining({ locale: 'es-ES' }),
|
|
200
|
+
})
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
it.each(['target', 'es-es'])(
|
|
206
|
+
'maps batch-download locale %s in both directions',
|
|
207
|
+
async (locale) => {
|
|
208
|
+
fetchMock.mockImplementation(async (request) => {
|
|
209
|
+
const body = JSON.parse(await new Request(request).text()) as Array<{
|
|
210
|
+
locale?: string;
|
|
211
|
+
}>;
|
|
212
|
+
expect(body).toEqual([{ fileId: 'file-id', locale: 'es-ES' }]);
|
|
213
|
+
return Response.json({
|
|
214
|
+
files: [
|
|
215
|
+
{
|
|
216
|
+
id: 'id',
|
|
217
|
+
branchId: 'branch-id',
|
|
218
|
+
fileId: 'file-id',
|
|
219
|
+
locale: 'es-ES',
|
|
220
|
+
versionId: 'version-id',
|
|
221
|
+
fileName: 'document.html',
|
|
222
|
+
data: Buffer.from('translated').toString('base64'),
|
|
223
|
+
metadata: {},
|
|
224
|
+
fileFormat: 'HTML',
|
|
225
|
+
},
|
|
226
|
+
],
|
|
227
|
+
count: 1,
|
|
228
|
+
pending: [],
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
const response = await api.downloadFileBatch([
|
|
233
|
+
{ fileId: 'file-id', locale },
|
|
234
|
+
]);
|
|
235
|
+
|
|
236
|
+
expect(fetchMock).toHaveBeenCalledOnce();
|
|
237
|
+
expect(response.files[0].locale).toBe('target');
|
|
238
|
+
}
|
|
239
|
+
);
|
|
240
|
+
|
|
177
241
|
it('does not request an empty batch download', async () => {
|
|
178
242
|
await expect(api.downloadFileBatch([])).resolves.toEqual({
|
|
179
243
|
files: [],
|