Files
coopgo/node_modules/decap-cms-lib-util/dist/esm/backendUtil.js
sgauthier 6e64e138e2
All checks were successful
Publish To Prod / deploy_and_publish (push) Successful in 35s
planning
2024-10-14 09:15:30 +02:00

98 lines
3.7 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.filterByExtension = filterByExtension;
exports.getAllResponses = getAllResponses;
exports.getPathDepth = getPathDepth;
exports.parseLinkHeader = parseLinkHeader;
exports.parseResponse = parseResponse;
exports.responseParser = responseParser;
var _map2 = _interopRequireDefault(require("lodash/fp/map"));
var _fromPairs2 = _interopRequireDefault(require("lodash/fromPairs"));
var _flow2 = _interopRequireDefault(require("lodash/flow"));
var _immutable = require("immutable");
var _unsentRequest = _interopRequireDefault(require("./unsentRequest"));
var _APIError = _interopRequireDefault(require("./APIError"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function filterByExtension(file, extension) {
const path = (file === null || file === void 0 ? void 0 : file.path) || '';
return path.endsWith(extension.startsWith('.') ? extension : `.${extension}`);
}
function catchFormatErrors(format, formatter) {
return res => {
try {
return formatter(res);
} catch (err) {
throw new Error(`Response cannot be parsed into the expected format (${format}): ${err.message}`);
}
};
}
const responseFormatters = (0, _immutable.fromJS)({
json: async res => {
const contentType = res.headers.get('Content-Type') || '';
if (!contentType.startsWith('application/json') && !contentType.startsWith('text/json')) {
throw new Error(`${contentType} is not a valid JSON Content-Type`);
}
return res.json();
},
text: async res => res.text(),
blob: async res => res.blob()
}).mapEntries(([format, formatter]) => [format, catchFormatErrors(format, formatter)]);
async function parseResponse(res, {
expectingOk = true,
format = 'text',
apiName = ''
}) {
let body;
try {
const formatter = responseFormatters.get(format, false);
if (!formatter) {
throw new Error(`${format} is not a supported response format.`);
}
body = await formatter(res);
} catch (err) {
throw new _APIError.default(err.message, res.status, apiName);
}
if (expectingOk && !res.ok) {
var _body$error;
const isJSON = format === 'json';
const message = isJSON ? body.message || body.msg || ((_body$error = body.error) === null || _body$error === void 0 ? void 0 : _body$error.message) : body;
throw new _APIError.default(isJSON && message ? message : body, res.status, apiName);
}
return body;
}
function responseParser(options) {
return res => parseResponse(res, options);
}
function parseLinkHeader(header) {
if (!header) {
return {};
}
return (0, _flow2.default)([linksString => linksString.split(','), (0, _map2.default)(str => str.trim().split(';')), (0, _map2.default)(([linkStr, keyStr]) => [keyStr.match(/rel="(.*?)"/)[1], linkStr.trim().match(/<(.*?)>/)[1].replace(/\+/g, '%20')]), _fromPairs2.default])(header);
}
async function getAllResponses(url, options = {}, linkHeaderRelName, nextUrlProcessor) {
const maxResponses = 30;
let responseCount = 1;
let req = _unsentRequest.default.fromFetchArguments(url, options);
const pageResponses = [];
while (req && responseCount < maxResponses) {
const pageResponse = await _unsentRequest.default.performRequest(req);
const linkHeader = pageResponse.headers.get('Link');
const nextURL = linkHeader && parseLinkHeader(linkHeader)[linkHeaderRelName];
const {
headers = {}
} = options;
req = nextURL && _unsentRequest.default.fromFetchArguments(nextUrlProcessor(nextURL), {
headers
});
pageResponses.push(pageResponse);
responseCount++;
}
return pageResponses;
}
function getPathDepth(path) {
const depth = path.split('/').length;
return depth;
}