UNPKG

@sm.ahmadi77/type-safe-url-s

Version:

A lightweight TypeScript library for writing URLs in a type-safe manner 👍.

59 lines (58 loc) 1.76 kB
// src/index.ts var PATH_SEGMENTS_KEY = Symbol("PATH_SEGMENTS_KEY"); var OPTIONS_KEY = Symbol("OPTIONS_KEY"); var QUERY_PARAMS_KEY = Symbol("QUERY_PARAMS_KEY"); function createRootPathObject(options = {}) { return createPathObject([], options); } function createPathObject(pathSegments, options) { return new Proxy( (...pathParams) => { return createPathObject( [...pathSegments, ...pathParams.map(String)], options ); }, { get(_target, key) { if (key === PATH_SEGMENTS_KEY) return pathSegments; if (key === OPTIONS_KEY) return options; return createPathObject( [...pathSegments, String(key).replace("_", "-")], options ); } } ); } function urlOf(pathObject, queryParams) { const { baseUrl = "", autoAddLeadingSlash = true, autoAddTrailingSlash = false } = pathObject[OPTIONS_KEY]; const path = (() => { const result = `${autoAddLeadingSlash ? "/" : ""}${pathObject[PATH_SEGMENTS_KEY].map(encodeURIComponent).join("/")}${autoAddTrailingSlash ? "/" : ""}`; if (result === "//") return "/"; return result; })(); const searchParams = new URLSearchParams(); for (const [key, value] of Object.entries(queryParams ?? {})) { if (value === void 0 || value === null) continue; if (Array.isArray(value)) { for (const item of value) { if (item === void 0 || item === null) continue; searchParams.append(key, String(item)); } } else { searchParams.append(key, String(value)); } } const queryString = searchParams.toString(); if (queryString === "") return `${baseUrl}${path}`; return `${baseUrl}${path}?${queryString}`; } export { createRootPathObject, urlOf };