From e0fdf5ab6d8c661fdc72ccc937138d5aec01aa6d Mon Sep 17 00:00:00 2001 From: Norman Xu Date: Fri, 22 Nov 2024 14:33:26 +0000 Subject: [PATCH 1/2] fix: a "complete" URLObject in `target` should be left as it is --- .changeset/mighty-mugs-refuse.md | 5 +++++ packages/frames.js/src/core/utils.test.ts | 12 ++++++++++++ packages/frames.js/src/core/utils.ts | 11 +++++++++++ 3 files changed, 28 insertions(+) create mode 100644 .changeset/mighty-mugs-refuse.md diff --git a/.changeset/mighty-mugs-refuse.md b/.changeset/mighty-mugs-refuse.md new file mode 100644 index 000000000..806b7775c --- /dev/null +++ b/.changeset/mighty-mugs-refuse.md @@ -0,0 +1,5 @@ +--- +"frames.js": patch +--- + +fix: a "complete" URLObject in `target` should be left as it is diff --git a/packages/frames.js/src/core/utils.test.ts b/packages/frames.js/src/core/utils.test.ts index 20ee959ab..057dd4fcc 100644 --- a/packages/frames.js/src/core/utils.test.ts +++ b/packages/frames.js/src/core/utils.test.ts @@ -41,6 +41,18 @@ describe("generateTargetURL", () => { "http://test.com/test?test=test" ); }); + + it("generates a correct URL if target is an URL object with every compulsory property", () => { + // If the user passing in a URL object with all props required to + // construct a full URL, that means they want to go straight to + // there without modification. + const baseUrl = new URL("http://test.com"); + const target = new URL("http://another.com/test"); + + expect(generateTargetURL({ baseUrl, target }).toString()).toBe( + target.toString() + ); + }); }); describe("resolveBaseUrl", () => { diff --git a/packages/frames.js/src/core/utils.ts b/packages/frames.js/src/core/utils.ts index 2c1c1da49..e472f924a 100644 --- a/packages/frames.js/src/core/utils.ts +++ b/packages/frames.js/src/core/utils.ts @@ -47,6 +47,14 @@ function isValidButtonAction(action: unknown): action is ButtonActions { return typeof action === "string" && action in buttonActionToCode; } +function isUrlObjectComplete(urlObject: UrlObject): boolean { + return ( + "host" in urlObject && + "protocol" in urlObject && + "pathname" in urlObject + ); +} + export function generateTargetURL({ baseUrl, target, @@ -59,6 +67,9 @@ export function generateTargetURL({ } if (typeof target === "object") { + if (isUrlObjectComplete(target)) { + return new URL(formatUrl(target)); + } return new URL( formatUrl({ host: baseUrl.host, From 7260bb9e0ccd4dbe244707ab13c25f39d2cbd17f Mon Sep 17 00:00:00 2001 From: Norman Xu Date: Mon, 25 Nov 2024 09:57:19 +0000 Subject: [PATCH 2/2] fix: cover empty string and undefined --- packages/frames.js/src/core/utils.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/frames.js/src/core/utils.ts b/packages/frames.js/src/core/utils.ts index e472f924a..d06a0b938 100644 --- a/packages/frames.js/src/core/utils.ts +++ b/packages/frames.js/src/core/utils.ts @@ -49,9 +49,9 @@ function isValidButtonAction(action: unknown): action is ButtonActions { function isUrlObjectComplete(urlObject: UrlObject): boolean { return ( - "host" in urlObject && - "protocol" in urlObject && - "pathname" in urlObject + !!urlObject.host && + !!urlObject.protocol && + !!urlObject.pathname ); }