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  14x 14x 14x 14x   15x   14x 124x 109x 15x   14x 15x 15x 28x 28x   15x   14x 28x 1x   27x 1x     26x     14x 1x   14x 1x 1x 2x 2x     14x 26x   14x 15x   14x   14x            
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,
    )}`;
  }
}