@sanity/export 2.21.10-shopify.5 → 2.21.12-purple-unicorn.1302
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/jest.config.js +3 -2
- package/lib/AssetHandler.js +138 -199
- package/lib/export.js +160 -178
- package/lib/filterDocumentTypes.js +2 -2
- package/lib/filterDrafts.js +2 -2
- package/lib/filterSystemDocuments.js +3 -3
- package/lib/getDocumentsStream.js +10 -17
- package/lib/logFirstChunk.js +4 -4
- package/lib/rejectOnApiError.js +1 -1
- package/lib/requestStream.js +42 -85
- package/lib/stringifyStream.js +1 -1
- package/lib/tryParseJson.js +4 -4
- package/lib/validateOptions.js +7 -7
- package/package.json +12 -11
- package/src/export.js +18 -2
- package/src/requestStream.js +10 -34
package/jest.config.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
const
|
|
1
|
+
const {createJestConfig} = require('../../../test/config')
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
/** @type {import('@jest/types').Config.InitialOptions} */
|
|
4
|
+
module.exports = createJestConfig({
|
|
4
5
|
displayName: require('./package.json').name,
|
|
5
6
|
testEnvironment: 'node',
|
|
6
7
|
})
|
package/lib/AssetHandler.js
CHANGED
|
@@ -1,105 +1,64 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _excluded = ["asset"];
|
|
4
|
-
|
|
5
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
6
|
-
|
|
7
|
-
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
8
|
-
|
|
9
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
10
|
-
|
|
11
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
12
|
-
|
|
13
|
-
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
14
|
-
|
|
15
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
16
|
-
|
|
17
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
18
|
-
|
|
19
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
20
|
-
|
|
21
|
-
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
22
|
-
|
|
23
|
-
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
24
|
-
|
|
25
|
-
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
26
|
-
|
|
27
|
-
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
28
|
-
|
|
29
3
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
30
4
|
|
|
31
|
-
|
|
5
|
+
const path = require('path');
|
|
32
6
|
|
|
33
|
-
|
|
7
|
+
const crypto = require('crypto');
|
|
34
8
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
9
|
+
const {
|
|
10
|
+
parse: parseUrl,
|
|
11
|
+
format: formatUrl
|
|
12
|
+
} = require('url');
|
|
38
13
|
|
|
39
|
-
|
|
14
|
+
const fse = require('fs-extra');
|
|
40
15
|
|
|
41
|
-
|
|
16
|
+
const miss = require('mississippi');
|
|
42
17
|
|
|
43
|
-
|
|
18
|
+
const PQueue = require('p-queue');
|
|
44
19
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
20
|
+
const {
|
|
21
|
+
omit,
|
|
22
|
+
noop
|
|
23
|
+
} = require('lodash');
|
|
48
24
|
|
|
49
|
-
|
|
25
|
+
const pkg = require('../package.json');
|
|
50
26
|
|
|
51
|
-
|
|
27
|
+
const requestStream = require('./requestStream');
|
|
52
28
|
|
|
53
|
-
|
|
29
|
+
const debug = require('./debug');
|
|
54
30
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
31
|
+
const EXCLUDE_PROPS = ['_id', '_type', 'assetId', 'extension', 'mimeType', 'path', 'url'];
|
|
32
|
+
const ACTION_REMOVE = 'remove';
|
|
33
|
+
const ACTION_REWRITE = 'rewrite';
|
|
34
|
+
const ASSET_DOWNLOAD_CONCURRENCY = 8;
|
|
59
35
|
|
|
60
36
|
class AssetHandler {
|
|
61
37
|
constructor(options) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
_this.queueAssetDownload(doc, filePath, type);
|
|
73
|
-
|
|
74
|
-
callback();
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
callback(null, _this.findAndModify(doc, ACTION_REWRITE));
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
return function (_x, _x2, _x3) {
|
|
82
|
-
return _ref.apply(this, arguments);
|
|
83
|
-
};
|
|
84
|
-
}()));
|
|
38
|
+
_defineProperty(this, "rewriteAssets", miss.through.obj(async (doc, enc, callback) => {
|
|
39
|
+
if (['sanity.imageAsset', 'sanity.fileAsset'].includes(doc._type)) {
|
|
40
|
+
const type = doc._type === 'sanity.imageAsset' ? 'image' : 'file';
|
|
41
|
+
const filePath = "".concat(type, "s/").concat(generateFilename(doc._id));
|
|
42
|
+
this.assetsSeen.set(doc._id, type);
|
|
43
|
+
this.queueAssetDownload(doc, filePath, type);
|
|
44
|
+
callback();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
85
47
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
if (['sanity.imageAsset', 'sanity.fileAsset'].includes(doc._type)) {
|
|
89
|
-
callback();
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
48
|
+
callback(null, this.findAndModify(doc, ACTION_REWRITE));
|
|
49
|
+
}));
|
|
92
50
|
|
|
93
|
-
|
|
94
|
-
|
|
51
|
+
_defineProperty(this, "stripAssets", miss.through.obj(async (doc, enc, callback) => {
|
|
52
|
+
if (['sanity.imageAsset', 'sanity.fileAsset'].includes(doc._type)) {
|
|
53
|
+
callback();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
95
56
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
};
|
|
99
|
-
}()));
|
|
57
|
+
callback(null, this.findAndModify(doc, ACTION_REMOVE));
|
|
58
|
+
}));
|
|
100
59
|
|
|
101
60
|
_defineProperty(this, "skipAssets", miss.through.obj((doc, enc, callback) => {
|
|
102
|
-
|
|
61
|
+
const isAsset = ['sanity.imageAsset', 'sanity.fileAsset'].includes(doc._type);
|
|
103
62
|
|
|
104
63
|
if (isAsset) {
|
|
105
64
|
callback();
|
|
@@ -113,7 +72,7 @@ class AssetHandler {
|
|
|
113
72
|
|
|
114
73
|
_defineProperty(this, "findAndModify", (item, action) => {
|
|
115
74
|
if (Array.isArray(item)) {
|
|
116
|
-
|
|
75
|
+
const children = item.map(child => this.findAndModify(child, action));
|
|
117
76
|
return children.filter(Boolean);
|
|
118
77
|
}
|
|
119
78
|
|
|
@@ -121,30 +80,32 @@ class AssetHandler {
|
|
|
121
80
|
return item;
|
|
122
81
|
}
|
|
123
82
|
|
|
124
|
-
|
|
83
|
+
const isAsset = isAssetField(item);
|
|
125
84
|
|
|
126
85
|
if (isAsset && action === ACTION_REMOVE) {
|
|
127
86
|
return undefined;
|
|
128
87
|
}
|
|
129
88
|
|
|
130
89
|
if (isAsset && action === ACTION_REWRITE) {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
90
|
+
const {
|
|
91
|
+
asset,
|
|
92
|
+
...other
|
|
93
|
+
} = item;
|
|
94
|
+
const assetId = asset._ref;
|
|
95
|
+
const assetType = getAssetType(item);
|
|
96
|
+
const filePath = "".concat(assetType, "s/").concat(generateFilename(assetId));
|
|
97
|
+
return {
|
|
98
|
+
_sanityAsset: "".concat(assetType, "@file://./").concat(filePath),
|
|
99
|
+
...this.findAndModify(other, action)
|
|
100
|
+
};
|
|
140
101
|
}
|
|
141
102
|
|
|
142
|
-
|
|
143
|
-
|
|
103
|
+
const newItem = {};
|
|
104
|
+
const keys = Object.keys(item);
|
|
144
105
|
|
|
145
|
-
for (
|
|
146
|
-
|
|
147
|
-
|
|
106
|
+
for (let i = 0; i < keys.length; i++) {
|
|
107
|
+
const key = keys[i];
|
|
108
|
+
const value = item[key];
|
|
148
109
|
newItem[key] = this.findAndModify(value, action);
|
|
149
110
|
|
|
150
111
|
if (typeof newItem[key] === 'undefined') {
|
|
@@ -155,7 +116,7 @@ class AssetHandler {
|
|
|
155
116
|
return newItem;
|
|
156
117
|
});
|
|
157
118
|
|
|
158
|
-
|
|
119
|
+
const concurrency = options.concurrency || ASSET_DOWNLOAD_CONCURRENCY;
|
|
159
120
|
debug('Using asset download concurrency of %d', concurrency);
|
|
160
121
|
this.client = options.client;
|
|
161
122
|
this.tmpDir = options.tmpDir;
|
|
@@ -222,18 +183,18 @@ class AssetHandler {
|
|
|
222
183
|
}
|
|
223
184
|
|
|
224
185
|
getAssetRequestOptions(assetDoc) {
|
|
225
|
-
|
|
226
|
-
|
|
186
|
+
const token = this.client.config().token;
|
|
187
|
+
const headers = {
|
|
227
188
|
'User-Agent': "".concat(pkg.name, "@").concat(pkg.version)
|
|
228
189
|
};
|
|
229
|
-
|
|
230
|
-
|
|
190
|
+
const isImage = assetDoc._type === 'sanity.imageAsset';
|
|
191
|
+
const url = parseUrl(assetDoc.url, true);
|
|
231
192
|
|
|
232
193
|
if (isImage && ['cdn.sanity.io', 'cdn.sanity.work'].includes(url.hostname)) {
|
|
233
194
|
headers.Authorization = "Bearer ".concat(token);
|
|
234
|
-
url.query =
|
|
195
|
+
url.query = { ...(url.query || {}),
|
|
235
196
|
dlRaw: 'true'
|
|
236
|
-
}
|
|
197
|
+
};
|
|
237
198
|
}
|
|
238
199
|
|
|
239
200
|
return {
|
|
@@ -242,96 +203,81 @@ class AssetHandler {
|
|
|
242
203
|
};
|
|
243
204
|
}
|
|
244
205
|
|
|
245
|
-
downloadAsset(assetDoc, dstPath) {
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
} catch (err) {
|
|
260
|
-
_this2.reject(err);
|
|
261
|
-
|
|
262
|
-
return false;
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
if (stream.statusCode !== 200) {
|
|
266
|
-
_this2.queue.clear();
|
|
267
|
-
|
|
268
|
-
var err = yield tryGetErrorFromStream(stream);
|
|
269
|
-
var errMsg = "Referenced asset URL \"".concat(url, "\" returned HTTP ").concat(stream.statusCode);
|
|
270
|
-
|
|
271
|
-
if (err) {
|
|
272
|
-
errMsg = "".concat(errMsg, ":\n\n").concat(err);
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
_this2.reject(new Error(errMsg));
|
|
276
|
-
|
|
277
|
-
return false;
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
_this2.maybeCreateAssetDirs();
|
|
281
|
-
|
|
282
|
-
debug('Asset stream ready, writing to filesystem at %s', dstPath);
|
|
283
|
-
var tmpPath = path.join(_this2.tmpDir, dstPath);
|
|
284
|
-
|
|
285
|
-
var _yield$writeHashedStr = yield writeHashedStream(tmpPath, stream),
|
|
286
|
-
sha1 = _yield$writeHashedStr.sha1,
|
|
287
|
-
md5 = _yield$writeHashedStr.md5,
|
|
288
|
-
size = _yield$writeHashedStr.size; // Verify it against our downloaded stream to make sure we have the same copy
|
|
289
|
-
|
|
206
|
+
async downloadAsset(assetDoc, dstPath) {
|
|
207
|
+
let attemptNum = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
|
|
208
|
+
const {
|
|
209
|
+
url
|
|
210
|
+
} = assetDoc;
|
|
211
|
+
const options = this.getAssetRequestOptions(assetDoc);
|
|
212
|
+
let stream;
|
|
213
|
+
|
|
214
|
+
try {
|
|
215
|
+
stream = await requestStream(options);
|
|
216
|
+
} catch (err) {
|
|
217
|
+
this.reject(err);
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
290
220
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
var method = md5 ? 'md5' : 'sha1';
|
|
296
|
-
var differs = false;
|
|
221
|
+
if (stream.statusCode !== 200) {
|
|
222
|
+
this.queue.clear();
|
|
223
|
+
const err = await tryGetErrorFromStream(stream);
|
|
224
|
+
let errMsg = "Referenced asset URL \"".concat(url, "\" returned HTTP ").concat(stream.statusCode);
|
|
297
225
|
|
|
298
|
-
if (
|
|
299
|
-
|
|
300
|
-
} else if (remoteSha1 && sha1) {
|
|
301
|
-
differs = remoteSha1 !== sha1;
|
|
226
|
+
if (err) {
|
|
227
|
+
errMsg = "".concat(errMsg, ":\n\n").concat(err);
|
|
302
228
|
}
|
|
303
229
|
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
} else if (differs) {
|
|
308
|
-
var details = [hasHash && (method === 'md5' ? "md5 should be ".concat(remoteMd5, ", got ").concat(md5) : "sha1 should be ".concat(remoteSha1, ", got ").concat(sha1)), contentLength && parseInt(contentLength, 10) !== size && "Asset should be ".concat(contentLength, " bytes, got ").concat(size), "Did not succeed after ".concat(attemptNum, " attempts.")];
|
|
309
|
-
var detailsString = "Details:\n - ".concat(details.filter(Boolean).join('\n - '));
|
|
310
|
-
yield fse.unlink(tmpPath);
|
|
311
|
-
|
|
312
|
-
_this2.queue.clear();
|
|
313
|
-
|
|
314
|
-
var error = new Error("Failed to download asset at ".concat(assetDoc.url, ", giving up. ").concat(detailsString));
|
|
315
|
-
|
|
316
|
-
_this2.reject(error);
|
|
230
|
+
this.reject(new Error(errMsg));
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
317
233
|
|
|
318
|
-
|
|
319
|
-
|
|
234
|
+
this.maybeCreateAssetDirs();
|
|
235
|
+
debug('Asset stream ready, writing to filesystem at %s', dstPath);
|
|
236
|
+
const tmpPath = path.join(this.tmpDir, dstPath);
|
|
237
|
+
const {
|
|
238
|
+
sha1,
|
|
239
|
+
md5,
|
|
240
|
+
size
|
|
241
|
+
} = await writeHashedStream(tmpPath, stream); // Verify it against our downloaded stream to make sure we have the same copy
|
|
242
|
+
|
|
243
|
+
const contentLength = stream.headers['content-length'];
|
|
244
|
+
const remoteSha1 = stream.headers['x-sanity-sha1'];
|
|
245
|
+
const remoteMd5 = stream.headers['x-sanity-md5'];
|
|
246
|
+
const hasHash = Boolean(remoteSha1 || remoteMd5);
|
|
247
|
+
const method = md5 ? 'md5' : 'sha1';
|
|
248
|
+
let differs = false;
|
|
249
|
+
|
|
250
|
+
if (remoteMd5 && md5) {
|
|
251
|
+
differs = remoteMd5 !== md5;
|
|
252
|
+
} else if (remoteSha1 && sha1) {
|
|
253
|
+
differs = remoteSha1 !== sha1;
|
|
254
|
+
}
|
|
320
255
|
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
256
|
+
if (differs && attemptNum < 3) {
|
|
257
|
+
debug('%s does not match downloaded asset, retrying (#%d) [%s]', method, attemptNum + 1, url);
|
|
258
|
+
return this.downloadAsset(assetDoc, dstPath, attemptNum + 1);
|
|
259
|
+
} else if (differs) {
|
|
260
|
+
const details = [hasHash && (method === 'md5' ? "md5 should be ".concat(remoteMd5, ", got ").concat(md5) : "sha1 should be ".concat(remoteSha1, ", got ").concat(sha1)), contentLength && parseInt(contentLength, 10) !== size && "Asset should be ".concat(contentLength, " bytes, got ").concat(size), "Did not succeed after ".concat(attemptNum, " attempts.")];
|
|
261
|
+
const detailsString = "Details:\n - ".concat(details.filter(Boolean).join('\n - '));
|
|
262
|
+
await fse.unlink(tmpPath);
|
|
263
|
+
this.queue.clear();
|
|
264
|
+
const error = new Error("Failed to download asset at ".concat(assetDoc.url, ", giving up. ").concat(detailsString));
|
|
265
|
+
this.reject(error);
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
325
268
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
269
|
+
const isImage = assetDoc._type === 'sanity.imageAsset';
|
|
270
|
+
const type = isImage ? 'image' : 'file';
|
|
271
|
+
const id = "".concat(type, "-").concat(sha1);
|
|
272
|
+
const metaProps = omit(assetDoc, EXCLUDE_PROPS);
|
|
329
273
|
|
|
330
|
-
|
|
274
|
+
if (Object.keys(metaProps).length > 0) {
|
|
275
|
+
this.assetMap[id] = metaProps;
|
|
276
|
+
}
|
|
331
277
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
278
|
+
this.downloading.splice(this.downloading.findIndex(datUrl => datUrl === url), 1);
|
|
279
|
+
this.filesWritten++;
|
|
280
|
+
return true;
|
|
335
281
|
}
|
|
336
282
|
|
|
337
283
|
}
|
|
@@ -345,10 +291,7 @@ function getAssetType(item) {
|
|
|
345
291
|
return null;
|
|
346
292
|
}
|
|
347
293
|
|
|
348
|
-
|
|
349
|
-
_ref4 = _slicedToArray(_ref3, 2),
|
|
350
|
-
type = _ref4[1];
|
|
351
|
-
|
|
294
|
+
const [, type] = item.asset._ref.match(/^(image|file)-/) || [];
|
|
352
295
|
return type || null;
|
|
353
296
|
}
|
|
354
297
|
|
|
@@ -357,20 +300,16 @@ function isSanityAsset(assetId) {
|
|
|
357
300
|
}
|
|
358
301
|
|
|
359
302
|
function generateFilename(assetId) {
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
asset = _ref6[2],
|
|
363
|
-
ext = _ref6[3];
|
|
364
|
-
|
|
365
|
-
var extension = (ext || 'bin').replace(/^-/, '');
|
|
303
|
+
const [,, asset, ext] = assetId.match(/^(image|file)-(.*?)(-[a-z]+)?$/) || [];
|
|
304
|
+
const extension = (ext || 'bin').replace(/^-/, '');
|
|
366
305
|
return asset ? "".concat(asset, ".").concat(extension) : "".concat(assetId, ".bin");
|
|
367
306
|
}
|
|
368
307
|
|
|
369
308
|
function writeHashedStream(filePath, stream) {
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
309
|
+
let size = 0;
|
|
310
|
+
const md5 = crypto.createHash('md5');
|
|
311
|
+
const sha1 = crypto.createHash('sha1');
|
|
312
|
+
const hasher = miss.through((chunk, enc, cb) => {
|
|
374
313
|
size += chunk.length;
|
|
375
314
|
md5.update(chunk);
|
|
376
315
|
sha1.update(chunk);
|
|
@@ -396,7 +335,7 @@ function tryGetErrorFromStream(stream) {
|
|
|
396
335
|
|
|
397
336
|
function parse(body) {
|
|
398
337
|
try {
|
|
399
|
-
|
|
338
|
+
const parsed = JSON.parse(body.toString('utf8'));
|
|
400
339
|
resolve(parsed.message || parsed.error || null);
|
|
401
340
|
} catch (err) {
|
|
402
341
|
resolve(body.toString('utf8').slice(0, 16000));
|