From 8e7b13329c4110b3e8e3f5a02e4d82003e9f7937 Mon Sep 17 00:00:00 2001 From: Ahmad Aljabri Date: Fri, 4 Sep 2026 14:07:42 +0000 Subject: [PATCH] Refactor spreadItems collection handling --- packages/codemode/src/stdlib/collections.ts | 14 ++++++++++---- packages/codemode/test/stdlib.test.ts | 8 ++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/codemode/src/stdlib/collections.ts b/packages/codemode/src/stdlib/collections.ts index f4760ff7..d684b46b 100644 --- a/packages/codemode/src/stdlib/collections.ts +++ b/packages/codemode/src/stdlib/collections.ts @@ -40,12 +40,18 @@ export const mapMethods = new Set(["get", "set", "has", "delete", "clear", "forE export const setMethods = new Set(["add", "has", "delete", "clear", "forEach", "keys", "values", "entries"]) -export const spreadItems = (value: unknown): Array | undefined => { - if (Array.isArray(value)) return value - if (typeof value === "string") return Array.from(value) +const spreadSandboxItems = (value: unknown): Array | undefined => { if (value instanceof SandboxMap) return Array.from(value.map.entries(), ([key, item]) => [key, item]) if (value instanceof SandboxSet) return Array.from(value.set.values()) - if (value instanceof SandboxURLSearchParams) return Array.from(value.params.entries(), ([key, item]) => [key, item]) + if (value instanceof SandboxURLSearchParams) { + return Array.from(value.params as Iterable<[string, string]>, ([key, item]) => [key, item]) + } return undefined } + +export const spreadItems = (value: unknown): Array | undefined => { + if (Array.isArray(value)) return value + if (typeof value === "string") return Array.from(value) + return spreadSandboxItems(value) +} import { SandboxMap, SandboxSet, SandboxURLSearchParams } from "../values.js" diff --git a/packages/codemode/test/stdlib.test.ts b/packages/codemode/test/stdlib.test.ts index f7831a06..a15bcde0 100644 --- a/packages/codemode/test/stdlib.test.ts +++ b/packages/codemode/test/stdlib.test.ts @@ -366,6 +366,14 @@ describe("URL and URI helpers", () => { }) }) + test("URLSearchParams spread produces entry pairs", async () => { + expect(await value(`return [...new URLSearchParams("tag=a&tag=b&q=a+b")]`)).toEqual([ + ["tag", "a"], + ["tag", "b"], + ["q", "a b"], + ]) + }) + test("URL parsing failures are catchable and values use native JSON forms", async () => { expect( await value(`