From 4d6a293534e9cf90687aa574d5a7231bff68e95c Mon Sep 17 00:00:00 2001 From: Matt Date: Sat, 9 May 2026 04:10:04 +0200 Subject: [PATCH] fix(berths): natural-sort SQL ordering for mooring numbers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drizzle SQL template was running `\d+$` through JS string-literal escape rules, eating the backslash and matching every character class \d alias instead of digits. Berths sorted lexically (A1, A10, A11, A2, …) instead of by trailing number. Switch to `[0-9]+$` POSIX form which survives the escape pass intact. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/lib/services/berths.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/services/berths.service.ts b/src/lib/services/berths.service.ts index 80fb7fec..9ca18c85 100644 --- a/src/lib/services/berths.service.ts +++ b/src/lib/services/berths.service.ts @@ -67,7 +67,7 @@ export async function listBerths(portId: string, query: ListBerthsQuery) { // map. The mooring format is locked at `^[A-Z]+\d+$` so the regexp // splits are safe. const NATURAL_MOORING_SORT = [ - sql`regexp_replace(${berths.mooringNumber}, '\d+$', '') ASC`, + sql`regexp_replace(${berths.mooringNumber}, '[0-9]+$', '') ASC`, sql`(regexp_replace(${berths.mooringNumber}, '^[A-Z]+', ''))::int ASC`, ];