All files / src/utils processed-query.ts

100% Statements 38/38
100% Branches 8/8
100% Functions 11/11
100% Lines 34/34

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57  15x 15x 15x 15x   15x   15x 147x 132x 15x   15x 15x 15x 28x 28x   15x   15x 28x 1x   27x 1x     26x     15x 1x   15x 1x 1x 2x 2x     15x 26x   15x 15x   15x   15x            
import querystring, {ParsedUrlQueryInput} from 'querystring';
 
export default class ProcessedQuery {
  static stringify(keyValuePairs?: {[key: string]: any}): string {
    if (!keyValuePairs || Object.keys(keyValuePairs).length === 0) return '';
 
    return new ProcessedQuery().putAll(keyValuePairs).stringify();
  }
 
  processedQuery: {
    [key: string]: string | number | (string | number)[];
  };
 
  constructor() {
    this.processedQuery = {};
  }
 
  putAll(keyValuePairs: {[key: string]: any}): ProcessedQuery {
    Object.entries(keyValuePairs).forEach(([key, value]: [string, any]) =>
      this.put(key, value),
    );
    return this;
  }
 
  put(key: string, value: any): void {
    if (Array.isArray(value)) {
      this.putArray(key, value);
    } else if (value.constructor === Object) {
      this.putObject(key, value);
    } else {
      this.putSimple(key, value);
    }
  }
 
  putArray(key: string, value: (string | number)[]): void {
    this.processedQuery[`${key}[]`] = value;
  }
 
  putObject(key: string, value: object): void {
    Object.entries(value).forEach(
      ([entry, entryValue]: [string, string | number]) => {
        this.processedQuery[`${key}[${entry}]`] = entryValue;
      },
    );
  }
 
  putSimple(key: string, value: string | number): void {
    this.processedQuery[key] = value;
  }
 
  stringify(): string {
    return `?${querystring.stringify(
      this.processedQuery as ParsedUrlQueryInput,
    )}`;
  }
}