From 178c1f1b8f7b9206907de90c997758e6479b154a Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Sat, 16 May 2026 16:32:20 -0600 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=9A=B8=20api:=20drop=20redundant=20.o?= =?UTF-8?q?ptional().default()=20from=20POST=20body=20schemas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Eden Treaty types `.optional().default(N)` as required-with-default, forcing typed clients to pass these fields. Same UX problem T1 fixed for query schemas in PR #2433; same treatment now for body schemas. schemas/imageDetection: matchLimit (handler uses service default = 3) schemas/packs: isPublic (handler now `?? false`), consumable / worn on CreatePackItemRequestSchema (handler already used `data.foo || false`) schemas/packTemplates: quantity, consumable, worn on CreatePackTemplateItemRequestSchema (handler now applies `?? false` for consumable/worn; quantity already had `|| 1`); isAppTemplate on GenerateFromOnlineContentRequestSchema (handler already uses `isAppTemplate ?? true`) routes/trailConditions/reports: hazards, waterCrossings, photos — handler already uses `?? []` / `?? 0` `localCreatedAt` / `localUpdatedAt` defaults stay required (offline-first sync semantics). Follow-up to PR #2433. Co-Authored-By: Claude Opus 4.7 (1M context) --- packages/api/src/routes/packTemplates/index.ts | 4 ++-- packages/api/src/routes/packs/index.ts | 2 +- packages/api/src/routes/trailConditions/reports.ts | 6 +++--- packages/api/src/schemas/imageDetection.ts | 2 +- packages/api/src/schemas/packTemplates.ts | 8 ++++---- packages/api/src/schemas/packs.ts | 6 +++--- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/api/src/routes/packTemplates/index.ts b/packages/api/src/routes/packTemplates/index.ts index 56fbab9342..f352b0fcbb 100644 --- a/packages/api/src/routes/packTemplates/index.ts +++ b/packages/api/src/routes/packTemplates/index.ts @@ -698,8 +698,8 @@ export const packTemplatesRoutes = new Elysia({ prefix: '/pack-templates' }) weightUnit: data.weightUnit, quantity: data.quantity || 1, category: data.category, - consumable: data.consumable, - worn: data.worn, + consumable: data.consumable ?? false, + worn: data.worn ?? false, image: data.image, notes: data.notes, userId: user.userId, diff --git a/packages/api/src/routes/packs/index.ts b/packages/api/src/routes/packs/index.ts index 1bdf287ca5..09582ddfbc 100644 --- a/packages/api/src/routes/packs/index.ts +++ b/packages/api/src/routes/packs/index.ts @@ -103,7 +103,7 @@ export const packsRoutes = new Elysia({ prefix: '/packs' }) name: data.name, description: data.description, category: data.category, - isPublic: data.isPublic, + isPublic: data.isPublic ?? false, image: data.image, tags: data.tags, localCreatedAt: new Date(data.localCreatedAt as string), diff --git a/packages/api/src/routes/trailConditions/reports.ts b/packages/api/src/routes/trailConditions/reports.ts index 47b854582c..1a61bf5ce2 100644 --- a/packages/api/src/routes/trailConditions/reports.ts +++ b/packages/api/src/routes/trailConditions/reports.ts @@ -17,11 +17,11 @@ const CreateReportRequestSchema = z.object({ trailRegion: z.string().optional().nullable(), surface: z.enum(['paved', 'gravel', 'dirt', 'rocky', 'snow', 'mud']), overallCondition: z.enum(['excellent', 'good', 'fair', 'poor']), - hazards: z.array(z.string()).optional().default([]), - waterCrossings: z.number().int().min(0).max(20).optional().default(0), + hazards: z.array(z.string()).optional(), + waterCrossings: z.number().int().min(0).max(20).optional(), waterCrossingDifficulty: z.enum(['easy', 'moderate', 'difficult']).optional().nullable(), notes: z.string().optional().nullable(), - photos: z.array(z.string()).optional().default([]), + photos: z.array(z.string()).optional(), tripId: z.string().optional().nullable(), localCreatedAt: z.string().datetime(), localUpdatedAt: z.string().datetime(), diff --git a/packages/api/src/schemas/imageDetection.ts b/packages/api/src/schemas/imageDetection.ts index 4d4b399256..ff5e335b28 100644 --- a/packages/api/src/schemas/imageDetection.ts +++ b/packages/api/src/schemas/imageDetection.ts @@ -19,7 +19,7 @@ export const DetectedItemWithMatchesSchema = z.object({ export const AnalyzeImageRequestSchema = z.object({ image: z.string(), - matchLimit: z.number().int().min(1).max(10).optional().default(3), + matchLimit: z.number().int().min(1).max(10).optional(), }); export const AnalyzeImageResponseSchema = z.array(DetectedItemWithMatchesSchema); diff --git a/packages/api/src/schemas/packTemplates.ts b/packages/api/src/schemas/packTemplates.ts index 6ffe2de886..6f611d4ab7 100644 --- a/packages/api/src/schemas/packTemplates.ts +++ b/packages/api/src/schemas/packTemplates.ts @@ -82,10 +82,10 @@ export const CreatePackTemplateItemRequestSchema = z.object({ description: z.string().optional(), weight: z.number().min(0), weightUnit: z.enum(['g', 'kg', 'lb', 'oz']), - quantity: z.number().int().min(1).optional().default(1), + quantity: z.number().int().min(1).optional(), category: z.string().optional(), - consumable: z.boolean().optional().default(false), - worn: z.boolean().optional().default(false), + consumable: z.boolean().optional(), + worn: z.boolean().optional(), image: z.string().nullish(), notes: z.string().optional(), }); @@ -110,7 +110,7 @@ export const SuccessResponseSchema = z.object({ export const GenerateFromOnlineContentRequestSchema = z.object({ contentUrl: z.string().url(), - isAppTemplate: z.boolean().optional().default(true), + isAppTemplate: z.boolean().optional(), }); export const GenerateFromOnlineContentResponseSchema = PackTemplateWithItemsSchema; diff --git a/packages/api/src/schemas/packs.ts b/packages/api/src/schemas/packs.ts index 3414d227da..e832403f12 100644 --- a/packages/api/src/schemas/packs.ts +++ b/packages/api/src/schemas/packs.ts @@ -56,7 +56,7 @@ export const CreatePackRequestSchema = z.object({ name: z.string().min(1).max(255), description: z.string().optional(), category: z.string().optional(), - isPublic: z.boolean().optional().default(false), + isPublic: z.boolean().optional(), image: z.string().nullish(), tags: z.array(z.string()).optional(), }); @@ -78,8 +78,8 @@ export const CreatePackItemRequestSchema = z.object({ weightUnit: z.enum(WEIGHT_UNITS).default('g'), quantity: z.number().int().min(1).default(1), category: z.string().optional(), - consumable: z.boolean().optional().default(false), - worn: z.boolean().optional().default(false), + consumable: z.boolean().optional(), + worn: z.boolean().optional(), image: z.string().nullish(), notes: z.string().nullish(), catalogItemId: z.number().int().nullish(), From a57a4ce700a75eafffdb9d21873802f87b8b1562 Mon Sep 17 00:00:00 2001 From: Andrew Bierman Date: Sat, 16 May 2026 23:22:22 -0600 Subject: [PATCH 2/2] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20chore:=20pin=20bun=201?= =?UTF-8?q?.3.14=20via=20.bun-version=20+=20packageManager=20+=20engines?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CF Pages' default bun didn't interpolate $PACKRAT_NATIVEWIND_UI_GITHUB_TOKEN in bunfig.toml scopes, causing a 403 on @packrat-ai/nativewindui during the preinstall. Pinning bun to a version that supports env-var interpolation. Co-Authored-By: Claude Opus 4.7 (1M context) --- .bun-version | 1 + package.json | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 .bun-version diff --git a/.bun-version b/.bun-version new file mode 100644 index 0000000000..085c0f2666 --- /dev/null +++ b/.bun-version @@ -0,0 +1 @@ +1.3.14 diff --git a/package.json b/package.json index b2ef00dc44..317ab9388f 100644 --- a/package.json +++ b/package.json @@ -71,9 +71,9 @@ "semver": "catalog:", "sort-package-json": "^3.6.1" }, - "packageManager": "bun@1.3.10", + "packageManager": "bun@1.3.14", "engines": { - "bun": ">=1.3.10", + "bun": ">=1.3.14", "node": ">=24.0.0" }, "catalog": {