packages feed

espial-0.0.26: frontend/src/util.ts

export type QueryStringArray = Array<[string, string | null]>;

function unsafeDecode(str: string): string {
  return decodeURIComponent(str);
}

export function parseQueryString(searchOrHash: string): QueryStringArray {
  const first = searchOrHash.slice(0, 1);
  const qs = first === '#' || first === '?' ? searchOrHash.slice(1) : searchOrHash;
  const parts = qs.split('&').filter((x) => x !== '');

  const decode = (s: string) => unsafeDecode(s.replace(/\+/g, ' '));

  const out: QueryStringArray = [];
  for (const kv of parts) {
    const [k, ...rest] = kv.split('=');
    if (!k) continue;
    if (rest.length === 0) out.push([decode(k), null]);
    else if (rest.length === 1) out.push([decode(k), decode(rest[0] ?? '')]);
  }
  return out;
}

export function curQuerystring(): QueryStringArray {
  return parseQueryString(window.location.search);
}

export function lookupQueryStringValue(qs: QueryStringArray, k: string): string | null {
  for (const [key, val] of qs) {
    if (key === k) return val;
  }
  return null;
}

export function encodeTag(tag: string): string {
  return encodeURIComponent(tag.replace(/\+/g, '%2B'));
}

export function fromNullableStr(s: string | null | undefined): string {
  return s ?? '';
}

export function normalizeTags(tags: string): string {
  return tags.replace(/,/g, ' ').replace(/\s+/g, ' ').trim();
}