ilsanchez/simple-query-params

View on GitHub
src/url.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { QueryParam, QueryParamType } from './query-params';
import { URL_SPLIT_TOKEN, PARAMETER_SPLIT_TOKEN } from './constants';

export class Url {
  private _baseUrl!: string;
  private _originalUrl: string;
  private _params!: QueryParam[];

  constructor(url: string) {
    this._originalUrl = url;
    this._initialize(url);
  }

  get builtUrl(): string {
    return `${this._baseUrl}${URL_SPLIT_TOKEN}${this.hash}`;
  }

  get hash(): string {
    return this._params
      .map((param: QueryParam) => param.stringified)
      .join(PARAMETER_SPLIT_TOKEN);
  }

  get baseUrl(): string {
    return this._baseUrl;
  }

  set baseUrl(bsUrl: string) {
    this._baseUrl = bsUrl;
  }

  get originalUrl(): string {
    return this._originalUrl;
  }

  public setValue(
    name: string,
    value: QueryParamType,
    mode?: 'append' | 'replace'
  ): this {
    const param = this._params.find((p: QueryParam) => p.name === name);
    if (param) {
      param.setValue(value, mode);
    } else {
      this._params = this._params.concat(new QueryParam(name, value));
    }
    return this;
  }

  public getParam(name: string): QueryParam | undefined {
    return this._params.find((p: QueryParam) => p.name === name);
  }

  private _initialize(url: string): void {
    const [baseUrl, rawParams] = this._extractUrlParts(url);
    this._baseUrl = baseUrl;
    this._params =
      rawParams !== ''
        ? (this._params = this._extractQueryParams(rawParams))
        : (this._params = []);
  }

  private _extractUrlParts(url: string): [string, string] {
    const splitted = url.split(URL_SPLIT_TOKEN);
    return splitted.length === 2
      ? [splitted[0], splitted[1]]
      : [splitted[0], ''];
  }

  private _extractQueryParams(rawParams: string): QueryParam[] {
    const splittedQP = rawParams.split(PARAMETER_SPLIT_TOKEN);
    return splittedQP.map((param: string) => {
      const [name, value] = param.split('=');
      return new QueryParam(name, value);
    });
  }
}