| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- export function assign(target, source) {
- for (const key in source) {
- if (source.hasOwnProperty(key)) {
- target[key] = source[key];
- }
- }
- }
- export function chunk(iterable, length) {
- const results = [];
- const lengthOfIterable = iterable.length;
- for (let i = 0; i < lengthOfIterable; i += length) {
- const chunked = [];
- for (let ci = i; ci < i + length; ci++) {
- chunked.push(iterable[ci]);
- }
- results.push(chunked);
- }
- return results;
- }
- export function endsWith(string, expectedEnding) {
- if (string.length < expectedEnding.length) {
- return false;
- }
- const actualEnding = string.substr(string.length - expectedEnding.length);
- return actualEnding === expectedEnding;
- }
- export function forEach(iterable, func) {
- const { length } = iterable;
- for (let i = 0; i < length; i++) {
- func(iterable[i], i);
- }
- }
- export function invert(oldObj) {
- const newObj = {};
- for (const key in oldObj) {
- if (oldObj.hasOwnProperty(key)) {
- const value = oldObj[key];
- newObj[value] = key;
- }
- }
- return newObj;
- }
- export function range(n) {
- const results = [];
- for (let i = 0; i < n; i++) {
- results.push(i);
- }
- return results;
- }
- export function times(numTimes, func) {
- const results = [];
- for (let i = 0; i < numTimes; i++) {
- results.push(func(i));
- }
- return results;
- }
- export function toArray(iterable) {
- const results = [];
- const { length } = iterable;
- for (let i = 0; i < length; i++) {
- results.push(iterable[i]);
- }
- return results;
- }
- export function toArrayRecursively(input) {
- if (input.length) {
- return toArray(input).map(toArrayRecursively);
- }
- return input;
- }
- // copied from https://github.com/academia-de-codigo/parse-content-range-header/blob/master/index.js
- export function parseContentRange(headerValue) {
- if (!headerValue) {
- return null;
- }
- if (typeof headerValue !== 'string') {
- throw new Error('invalid argument');
- }
- const parseInt = (number) => Number.parseInt(number, 10);
- // Check for presence of unit
- let matches = headerValue.match(/^(\w*) /);
- const unit = matches && matches[1];
- // check for start-end/size header format
- matches = headerValue.match(/(\d+)-(\d+)\/(\d+|\*)/);
- if (matches) {
- return {
- unit,
- first: parseInt(matches[1]),
- last: parseInt(matches[2]),
- length: matches[3] === '*' ? null : parseInt(matches[3]),
- };
- }
- // check for size header format
- matches = headerValue.match(/(\d+|\*)/);
- if (matches) {
- return {
- unit,
- first: null,
- last: null,
- length: matches[1] === '*' ? null : parseInt(matches[1]),
- };
- }
- return null;
- }
- /*
- * Promisified wrapper around 'setTimeout' to allow 'await'
- */
- export async function wait(milliseconds) {
- return new Promise((resolve) => setTimeout(resolve, milliseconds));
- }
- export function zip(a, b) {
- const A = Array.isArray(a) ? a : Array.from(a);
- const B = Array.isArray(b) ? b : Array.from(b);
- return A.map((k, i) => [k, B[i]]);
- }
- // Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error
- export class AbortError extends Error {
- constructor(params) {
- // Pass remaining arguments (including vendor specific ones) to parent constructor
- super(params);
- // Maintains proper stack trace for where our error was thrown (only available on V8)
- if (Error.captureStackTrace) {
- Error.captureStackTrace(this, AbortError);
- }
- this.name = 'AbortError';
- }
- }
- export class CustomAggregateError extends Error {
- constructor(errors, message) {
- super(message);
- this.errors = errors;
- this.message = message;
- this.name = 'AggregateError';
- }
- }
- export const AggregateError = CustomAggregateError;
|