achievements-app/psn-api

View on GitHub
src/utils/buildRequestUrl.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import type { AllCallOptions } from "../models";

export const buildRequestUrl = (
  baseUrl: string,
  endpointUrl: string,
  options: Partial<AllCallOptions> = {},
  args: Record<string, string | number> = {}
) => {
  // eslint-disable-next-line @typescript-eslint/no-unused-vars -- This is an intentional pick.
  const { headerOverrides, ...pickedOptions } = options;

  const concatenated = `${baseUrl}/${endpointUrl}`;
  const withoutDoubleSlashes = concatenated.replace(/([^:]\/)\/+/g, "$1");

  let withArgs = withoutDoubleSlashes;
  const queryParamValues: Record<string, string> = {};

  for (const [argKey, argValue] of Object.entries({
    ...args,
    ...pickedOptions
  })) {
    if (withArgs.includes(`:${argKey}`)) {
      withArgs = withArgs.replace(`:${argKey}`, String(argValue));
    } else if (argValue !== undefined) {
      queryParamValues[argKey] = String(argValue);
    }
  }

  const queryString = new URLSearchParams(queryParamValues).toString();
  return queryString.length > 0 ? `${withArgs}?${queryString}` : withArgs;
};