phonic
Version:
[](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=https%3A%2F%2Fgithub.com%2FPhonic-Co%2Fphonic-node) [ • 2.05 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.join = join;
function join(base, ...segments) {
if (!base) {
return "";
}
if (segments.length === 0) {
return base;
}
if (base.includes("://")) {
let url;
try {
url = new URL(base);
}
catch (_a) {
// Fallback to path joining if URL is malformed
return joinPath(base, ...segments);
}
const lastSegment = segments[segments.length - 1];
const shouldPreserveTrailingSlash = lastSegment && lastSegment.endsWith("/");
for (const segment of segments) {
const cleanSegment = trimSlashes(segment);
if (cleanSegment) {
url.pathname = joinPathSegments(url.pathname, cleanSegment);
}
}
if (shouldPreserveTrailingSlash && !url.pathname.endsWith("/")) {
url.pathname += "/";
}
return url.toString();
}
return joinPath(base, ...segments);
}
function joinPath(base, ...segments) {
if (segments.length === 0) {
return base;
}
let result = base;
const lastSegment = segments[segments.length - 1];
const shouldPreserveTrailingSlash = lastSegment && lastSegment.endsWith("/");
for (const segment of segments) {
const cleanSegment = trimSlashes(segment);
if (cleanSegment) {
result = joinPathSegments(result, cleanSegment);
}
}
if (shouldPreserveTrailingSlash && !result.endsWith("/")) {
result += "/";
}
return result;
}
function joinPathSegments(left, right) {
if (left.endsWith("/")) {
return left + right;
}
return left + "/" + right;
}
function trimSlashes(str) {
if (!str)
return str;
let start = 0;
let end = str.length;
if (str.startsWith("/"))
start = 1;
if (str.endsWith("/"))
end = str.length - 1;
return start === 0 && end === str.length ? str : str.slice(start, end);
}