From e3162f7a7e810b74ba417590657a53e00c3b2f76 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 1 Jan 2025 12:11:16 -0800 Subject: [PATCH] chore: joinSegments fix + tests --- quartz/util/path.test.ts | 19 +++++++++++++++++++ quartz/util/path.ts | 25 ++++++++++++++++++------- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/quartz/util/path.test.ts b/quartz/util/path.test.ts index 7e9c4c84a32ac..687e6935937c8 100644 --- a/quartz/util/path.test.ts +++ b/quartz/util/path.test.ts @@ -158,6 +158,25 @@ describe("transforms", () => { path.isRelativeURL, ) }) + + test("joinSegments", () => { + assert.strictEqual(path.joinSegments("a", "b"), "a/b") + assert.strictEqual(path.joinSegments("a/", "b"), "a/b") + assert.strictEqual(path.joinSegments("a", "b/"), "a/b/") + assert.strictEqual(path.joinSegments("a/", "b/"), "a/b/") + + // preserve leading and trailing slashes + assert.strictEqual(path.joinSegments("/a", "b"), "/a/b") + assert.strictEqual(path.joinSegments("/a/", "b"), "/a/b") + assert.strictEqual(path.joinSegments("/a", "b/"), "/a/b/") + assert.strictEqual(path.joinSegments("/a/", "b/"), "/a/b/") + + // works with protocol specifiers + assert.strictEqual(path.joinSegments("https://example.com", "a"), "https://example.com/a") + assert.strictEqual(path.joinSegments("https://example.com/", "a"), "https://example.com/a") + assert.strictEqual(path.joinSegments("https://example.com", "a/"), "https://example.com/a/") + assert.strictEqual(path.joinSegments("https://example.com/", "a/"), "https://example.com/a/") + }) }) describe("link strategies", () => { diff --git a/quartz/util/path.ts b/quartz/util/path.ts index d2409e1cdf54d..580707f2c8a6d 100644 --- a/quartz/util/path.ts +++ b/quartz/util/path.ts @@ -183,15 +183,26 @@ export function slugTag(tag: string) { } export function joinSegments(...args: string[]): string { - return args + if (args.length === 0) { + return "" + } + + let joined = args .filter((segment) => segment !== "") - .map((segment, index) => - index === 0 - ? // Deduplicate but not remove leading slashes for first segment - segment.replace(/\/+$/g, "").replace(/^\/\/+/g, "/") - : segment.replace(/^\/+|\/+$/g, ""), - ) + .map((segment) => stripSlashes(segment)) .join("/") + + // if the first segment starts with a slash, add it back + if (args[0].startsWith("/")) { + joined = "/" + joined + } + + // if the last segment is a folder, add a trailing slash + if (args[args.length - 1].endsWith("/")) { + joined = joined + "/" + } + + return joined } export function getAllSegmentPrefixes(tags: string): string[] {