From 93402643f4b2c3499a79786e256baa83f887e577 Mon Sep 17 00:00:00 2001 From: Mikael Hugo Date: Tue, 28 Apr 2026 05:25:21 +0200 Subject: [PATCH] cherry-pick(sf-db): tolerate corrupt task arrays in milestone rows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cherry-pick of gsd-build/gsd-2 851507913 (#4056) — defensive parsing so a corrupt or non-array tasks blob in a milestone row doesn't crash sf-db reads. Test hunk skipped (sf-db.test.ts has drifted). Co-Authored-By: Claude Sonnet 4.6 --- src/resources/extensions/sf/sf-db.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/resources/extensions/sf/sf-db.ts b/src/resources/extensions/sf/sf-db.ts index 8c42ca7e7..c28ab9154 100644 --- a/src/resources/extensions/sf/sf-db.ts +++ b/src/resources/extensions/sf/sf-db.ts @@ -1960,6 +1960,23 @@ function parseTaskArrayColumn(raw: unknown): string[] { } } +function parseTaskArrayColumn(raw: unknown): string[] { + if (typeof raw !== "string" || raw.trim() === "") return []; + + try { + const parsed = JSON.parse(raw); + if (Array.isArray(parsed)) return parsed.map((value) => String(value)); + if (parsed === null || parsed === undefined || parsed === "") return []; + return [String(parsed)]; + } catch { + // Older/corrupt rows may contain comma-separated strings instead of JSON. + return raw + .split(",") + .map((value) => value.trim()) + .filter(Boolean); + } +} + function rowToTask(row: Record): TaskRow { const parseTaskArray = (value: unknown): string[] => { if (Array.isArray(value)) {