@percy/sdk-utils
Version:
Common JavaScript SDK utils
79 lines (75 loc) • 3.41 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
exports.request = request;
var _percyInfo = _interopRequireDefault(require("./percy-info.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
// Helper to send a request to the local CLI API
async function request(path, options = {}) {
let url = path.startsWith('http') ? path : `${_percyInfo.default.address}${path}`;
let response = await request.fetch(url, options);
// maybe parse response body as json
if (typeof response.body === 'string' && response.headers['content-type'] === 'application/json') {
try {
response.body = JSON.parse(response.body);
} catch (e) {}
}
// throw an error if status is not ok
if (!(response.status >= 200 && response.status < 300)) {
throw Object.assign(new Error(), {
message: response.body.error || /* istanbul ignore next: in tests, there's always an error message */
`${response.status} ${response.statusText}`,
response
});
}
return response;
}
request.post = function post(url, json) {
return request(url, {
method: 'POST',
body: JSON.stringify(json),
timeout: 600000
});
};
// environment specific implementation
if (process.env.__PERCY_BROWSERIFIED__) {
// use window.fetch in browsers
const winFetch = window.fetch;
request.fetch = async function fetch(url, options) {
let response = await winFetch(url, options);
return {
status: response.status,
statusText: response.statusText,
headers: Object.fromEntries(response.headers.entries()),
body: await response.text()
};
};
} else {
// use http.request in node
request.fetch = async function fetch(url, options) {
let {
protocol
} = new URL(url);
// rollup throws error for -> await import(protocol === 'https:' ? 'https' : 'http')
let {
default: http
} = protocol === 'https:' ? await Promise.resolve().then(() => _interopRequireWildcard(require('https'))) : await Promise.resolve().then(() => _interopRequireWildcard(require('http')));
return new Promise((resolve, reject) => {
http.request(url, options).on('response', response => {
let body = '';
response.on('data', chunk => body += chunk.toString());
response.on('end', () => resolve({
status: response.statusCode,
statusText: response.statusMessage,
headers: response.headers,
body
}));
}).on('error', reject).end(options.body);
});
};
}
var _default = exports.default = request;
;