@superbright/indexeddb-orm 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/errors.ts","../src/schema.ts","../src/adapters/dexie.ts","../src/validation.ts","../src/db.ts","../src/api/users.ts","../src/debug.ts","../src/storage.ts","../src/api/favorites.ts","../src/api/properties.ts","../src/stores/store.ts","../src/adapters/zustand-store.ts","../src/adapters/structured-store.ts","../src/units/favorites.ts","../src/features/units/transformers.ts"],"sourcesContent":["export class SchemaMismatchError extends Error {\n constructor(message: string, public detail?: unknown) {\n super(message);\n this.name = \"SchemaMismatchError\";\n }\n}\n\nexport class OpenDBError extends Error {\n constructor(message: string, public detail?: unknown) {\n super(message);\n this.name = \"OpenDBError\";\n }\n}\n","import { z } from \"zod\";\n\nexport const SCHEMA_VERSION = 1 as const;\n\n// Entities\nexport const UserSchema = z.object({\n uuid: z.string().uuid(),\n // stored as ISO string; include to match ensureUser()\n createdAt: z.string().datetime().optional(),\n});\nexport type User = z.infer<typeof UserSchema>;\n\n// User-specific Unit state\nexport const UserUnitDataSchema = z.object({\n isFavorite: z.boolean().optional(),\n viewedDate: z.string().optional(),\n});\n// Back-compat alias (to be deprecated): keep existing name\nexport const UnitDataSchema = UserUnitDataSchema;\nexport type UnitData = z.infer<typeof UserUnitDataSchema>;\n\n// Filters and query params\nconst FilterOptionValueSchema = z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.record(z.unknown()),\n]);\n\nconst FilterCollectionSchema = z.union([\n FilterOptionValueSchema,\n z.array(FilterOptionValueSchema),\n]);\n\nexport const FiltersSchema = z.object({\n availability: FilterCollectionSchema.nullable().optional(),\n bedrooms: z.union([z.array(FilterOptionValueSchema), z.null()]).optional(),\n cost: z.number().nullable().optional(),\n highlights: z.array(FilterOptionValueSchema).optional(),\n});\nexport type Filters = z.infer<typeof FiltersSchema>;\n\nexport const QueryParamsSchema = z.object({\n limit: z.number().default(10),\n page: z.number().default(1),\n availability: z.array(z.string()).optional(),\n bedrooms: z.array(z.number()).optional(),\n cost: z.number().nullable().optional(),\n highlights: z.array(z.string()).optional(),\n});\nexport type QueryParams = z.infer<typeof QueryParamsSchema>;\n\nexport const ResultsModeEnum = z.enum([\"all\", \"bestFit\", \"closestMatch\", \"favorites\", \"loading\"]);\nexport type ResultsMode = z.infer<typeof ResultsModeEnum>;\nexport const SortByEnum = z.enum([\"relevance\", \"newest\", \"priceLowToHigh\", \"priceHighToLow\"]);\nexport type SortBy = z.infer<typeof SortByEnum>;\n\n// App (standalone) persisted state\nexport const AppStoreDataSchema = z.object({\n data: z.record(UnitDataSchema),\n filters: FiltersSchema,\n tempFilters: FiltersSchema,\n apiFilters: QueryParamsSchema,\n resultsMode: ResultsModeEnum,\n propertySlug: z.string().nullable(),\n resolvedQuestionnaireValues: z.record(z.array(z.string())),\n sortBy: SortByEnum,\n});\nexport type AppStoreData = z.infer<typeof AppStoreDataSchema>;\n\n// Domain models (optional fields to mirror API shape without breaking)\n// Mirrors the backend Unit model with relaxed optional fields\nexport const UnitSchema = z.object({\n id: z.union([z.number().int(), z.string()]).optional(),\n title: z.string(),\n slug: z.string().nullable().optional(),\n bedrooms: z.coerce.number().nullable().optional(),\n bathrooms: z.coerce.number().nullable().optional(),\n cost: z.coerce.number().nullable().optional(),\n totalSqFt: z.coerce.number().nullable().optional(),\n propertyId: z.union([z.number().int(), z.string()]).optional(),\n isAvailable: z.boolean().optional(),\n createdAt: z.string().datetime().optional(),\n updatedAt: z.string().datetime().optional(),\n availability: z.string().datetime().nullable().optional(),\n unitSetAvailableOn: z.string().datetime().nullable().optional(),\n floorPlanId: z.union([z.number().int(), z.string()]).nullable().optional(),\n // Relations and nested structures kept loose to avoid coupling\n property: z.unknown().optional(),\n amenities: z.array(z.unknown()).optional(),\n highlights: z.array(z.unknown()).optional(),\n floorPlan: z.unknown().nullable().optional(),\n renderedStyle: z.array(z.unknown()).optional(),\n video: z.unknown().nullable().optional(),\n videoThumbnail: z.unknown().nullable().optional(),\n embedGif: z.unknown().nullable().optional(),\n userId: z.union([z.number().int(), z.string()]).optional(),\n user: z.unknown().optional(),\n status: z.string().optional(),\n externalId: z.string().nullable().optional(),\n unitRenderedStyles: z.array(z.unknown()).optional(),\n});\nexport type Unit = z.infer<typeof UnitSchema>;\n\n// Mirrors the backend Property model with relaxed optional fields\nexport const PropertySchema = z.object({\n id: z.union([z.number().int(), z.string()]),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n title: z.string(),\n slug: z.string().nullable().optional(),\n description: z.string(),\n contactName: z.string().nullable().optional(),\n contactEmail: z.string().optional(),\n contactPhone: z.string().nullable().optional(),\n notificationEmail: z.string().nullable().optional(),\n logo: z.unknown().nullable().optional(),\n leadMedia: z.unknown().nullable().optional(),\n overviewImages: z.array(z.unknown()).optional(),\n amenityImages: z.array(z.unknown()).optional(),\n street: z.string().optional(),\n city: z.string().optional(),\n state: z.string().nullable().optional(),\n ingestionFileName: z.string().nullable().optional(),\n zip: z.string().optional(),\n country: z.string().optional(),\n units: z.array(UnitSchema).optional(),\n amenities: z.array(z.unknown()).optional(),\n highlights: z.array(z.unknown()).optional(),\n externalServices: z.array(z.unknown()).optional(),\n userId: z.union([z.number().int(), z.string()]).optional(),\n user: z.unknown().optional(),\n status: z.string().optional(),\n floorPlans: z.array(z.unknown()).optional(),\n});\nexport type Property = z.infer<typeof PropertySchema>;\n\n// Mirrors the backend User model with relaxed optional fields\n// Named ApiUserSchema to avoid conflict with local UserSchema (uuid-only)\nexport const ApiUserSchema = z.object({\n id: z.union([z.number().int(), z.string()]).optional(),\n email: z.string().email().optional(),\n firstName: z.string().optional(),\n lastName: z.string().optional(),\n password: z.string().optional(),\n salt: z.string().optional(),\n role: z.string().optional(),\n Property: z.array(PropertySchema).optional(),\n Unit: z.array(UnitSchema).optional(),\n floorPlans: z.array(z.unknown()).optional(),\n createdAt: z.string().datetime().optional(),\n updatedAt: z.string().datetime().optional(),\n});\nexport type ApiUser = z.infer<typeof ApiUserSchema>;\n\n// Property-related schemas used by the PropertyStore and UnifiedStore\nexport const ViewedUnitSchema = z.object({\n unitId: z.string(),\n viewedDate: z.string(),\n});\nexport type ViewedUnit = z.infer<typeof ViewedUnitSchema>;\n\nexport const TourContactDataSchema = z.object({\n timezone: z.string().optional(),\n favouriteUnits: z.array(z.coerce.string()).optional(),\n preferences: z.record(z.unknown()).optional(),\n});\nexport type TourContactData = z.infer<typeof TourContactDataSchema>;\n\nexport const UserPropertyStateSchema = z.object({\n id: z.coerce.string(),\n slug: z.string(),\n favoritedUnits: z.array(z.string()),\n tourContactedOn: z.string().nullable(),\n viewedUnits: z.array(ViewedUnitSchema),\n questionnaireResults: z.unknown().nullable().optional(),\n tourContactData: TourContactDataSchema.nullable().optional(),\n // Full property payload persisted alongside per-property state\n data: PropertySchema.optional(),\n});\nexport type UserPropertyState = z.infer<typeof UserPropertyStateSchema>;\n\nexport const PropertyStoreDataSchema = z.object({\n data: z.record(UserPropertyStateSchema),\n propertySlug: z.string().nullable(),\n propertyId: z.string().nullable(),\n hasPreviouslySearched: z.array(z.string()),\n});\nexport type PropertyStoreData = z.infer<typeof PropertyStoreDataSchema>;\n\n// favorites\nexport const UnitFavoriteSchema = z.object({\n id: z.number().int(),\n userId: z.number().int(),\n unitId: z.number().int(),\n createdAt: z.string().datetime(),\n});\nexport type UnitFavorite = z.infer<typeof UnitFavoriteSchema>;\n\nexport const FavoritesSchema = z.object({\n // per-property favorites are stored under a KV key, so propertyId is implicit\n unitIds: z.array(z.string()),\n updatedAt: z.string().datetime(),\n});\nexport type Favorites = z.infer<typeof FavoritesSchema>;\n\n// Unified store schema (combines property + app persistent bits)\nexport const UnifiedStoreDataSchema = z.object({\n // Property-related data\n properties: z.record(UserPropertyStateSchema),\n currentPropertyId: z.string().nullable(),\n currentPropertySlug: z.string().nullable(),\n hasPreviouslySearched: z.array(z.string()),\n\n // App-level data\n unitResults: z.array(UnitSchema),\n filters: FiltersSchema,\n tempFilters: FiltersSchema,\n apiFilters: QueryParamsSchema,\n resultsMode: ResultsModeEnum,\n resolvedQuestionnaireValues: z.record(z.array(z.string())),\n sortBy: SortByEnum,\n});\nexport type UnifiedStoreData = z.infer<typeof UnifiedStoreDataSchema>;\n","import Dexie, { type Table } from \"dexie\";\nimport { SCHEMA_VERSION } from \"../schema\";\n\nexport interface KV {\n key: string;\n value: unknown;\n}\n\nexport interface OrmDexieTables {\n users: Table<any, string>;\n kv: Table<KV, string>;\n}\n\nexport class OrmDexie extends Dexie {\n users!: OrmDexieTables[\"users\"];\n kv!: OrmDexieTables[\"kv\"];\n\n constructor(name = \"inresi-orm\") {\n super(name);\n this.version(SCHEMA_VERSION).stores({\n users: \"uuid\",\n kv: \"key\",\n });\n\n this.users = this.table(\"users\");\n this.kv = this.table(\"kv\");\n }\n}\n","// src/validation.ts\nimport type { z } from \"zod\";\nimport { SchemaMismatchError } from \"./errors\";\n\nexport type ValidationMode = \"strict\" | \"warn\" | \"silent\";\nlet mode: ValidationMode = \"strict\";\nlet onIssue: ((ctx: string, details: unknown) => void) | undefined;\n\nexport function configureValidation(opts: {\n mode?: ValidationMode;\n onIssue?: (ctx: string, details: unknown) => void;\n}) {\n if (opts.mode) mode = opts.mode;\n onIssue = opts.onIssue;\n}\n\nexport function validate<T>(\n schema: z.ZodType<T>,\n value: unknown,\n ctx: string,\n): T | null {\n const res = schema.safeParse(value);\n if (res.success) return res.data;\n\n const details = res.error.flatten();\n onIssue?.(ctx, details);\n\n if (mode === \"strict\")\n throw new SchemaMismatchError(`ORM schema mismatch in ${ctx}`, details);\n if (mode === \"warn\") console.warn(`ORM schema mismatch in ${ctx}`, details); // eslint-disable-line no-console\n return null; // silent/warn → let caller decide how to proceed\n}\n","// src/db.ts\nimport { OrmDexie } from \"./adapters/dexie\";\nimport { OpenDBError } from \"./errors\";\nimport { SCHEMA_VERSION, UserSchema } from \"./schema\";\nimport {\n validate,\n configureValidation,\n type ValidationMode,\n} from \"./validation\";\nimport type { Table } from \"dexie\";\nimport { z } from \"zod\";\n\nconst MANIFEST_KEY = \"manifest\";\nconst ManifestSchema = z.object({ schemaVersion: z.number().int() });\ntype Manifest = z.infer<typeof ManifestSchema>;\n\nexport type OrmOptions = {\n dbName?: string;\n onReset?: (reason: \"incompatible\" | \"versionchange\" | \"blocked\") => void;\n onError?: (err: unknown) => void;\n validation?: {\n mode?: ValidationMode; // 'strict' | 'warn' | 'silent'\n onIssue?: (ctx: string, details: unknown) => void;\n validateReads?: boolean; // default: true\n dropInvalidOnRead?: boolean; // default: true (when validateReads)\n };\n};\n\nlet db: OrmDexie | null = null;\nlet openPromise: Promise<OrmDexie> | null = null;\n\n// Prevent double-installing hooks on the same instance\nconst VALIDATION_INSTALLED = Symbol(\"validationInstalled\");\n\nfunction installValidationHooks(\n instance: OrmDexie,\n vopts: OrmOptions[\"validation\"] | undefined,\n) {\n const anyDb = instance as any;\n if (anyDb[VALIDATION_INSTALLED]) return;\n anyDb[VALIDATION_INSTALLED] = true;\n\n const writeHook = <T>(table: Table<T, any>, schema: any, name: string) => {\n table.hook(\"creating\", (_pk, obj) => {\n const v = validate(schema, obj, `${name}.creating`);\n if (!v) throw new Error(`Rejected invalid ${name} on create`);\n return v as T; // allow coercion/stripping\n });\n table.hook(\"updating\", (mods, _pk, obj) => {\n const next = { ...(obj as any), ...(mods as any) };\n const v = validate(schema, next, `${name}.updating`);\n if (!v) return {}; // cancel update in warn/silent\n return mods;\n });\n };\n\n writeHook(instance.users, UserSchema, \"users\");\n\n const shouldValidateReads = vopts?.validateReads ?? true;\n if (shouldValidateReads) {\n const dropInvalid = vopts?.dropInvalidOnRead ?? true;\n const readHook = <T>(table: Table<T, any>, schema: any, name: string) => {\n table.hook(\"reading\", (obj) => {\n const v = validate(schema, obj, `${name}.reading`);\n if (v) return v;\n return dropInvalid ? undefined : obj; // pass-through if you prefer\n });\n };\n readHook(instance.users, UserSchema, \"users\");\n }\n}\n\nfunction isProbablyDev(): boolean {\n try {\n // @ts-ignore\n if (typeof import.meta !== \"undefined\" && import.meta.env)\n // @ts-ignore\n return !!import.meta.env.DEV;\n } catch {}\n try {\n if (typeof process !== \"undefined\" && process.env)\n return process.env.NODE_ENV !== \"production\";\n } catch {}\n return false;\n}\n\nexport async function getDB(opts: OrmOptions = {}): Promise<OrmDexie> {\n if (db) return db;\n if (openPromise) return openPromise;\n\n const name = opts.dbName ?? \"inresi-orm\";\n\n openPromise = (async () => {\n try {\n // Configure validation once per open\n const defaultMode: ValidationMode = isProbablyDev() ? \"warn\" : \"strict\";\n configureValidation({\n mode: opts.validation?.mode ?? defaultMode,\n onIssue: opts.validation?.onIssue,\n });\n\n const instance = new OrmDexie(name);\n\n // Multi-tab friendliness\n instance.on(\"versionchange\", () => {\n try {\n instance.close();\n } finally {\n opts.onReset?.(\"versionchange\");\n }\n });\n instance.on(\"blocked\", () => {\n opts.onReset?.(\"blocked\");\n });\n\n await instance.open();\n\n // Validate/initialize manifest\n const row = await instance.kv.get(MANIFEST_KEY);\n const saved = (row?.value ?? null) as unknown;\n\n if (!saved) {\n await instance.transaction(\"rw\", instance.kv, async () => {\n await instance.kv.put({\n key: MANIFEST_KEY,\n value: { schemaVersion: SCHEMA_VERSION },\n });\n });\n installValidationHooks(instance, opts.validation);\n db = instance;\n return instance;\n }\n\n const parsed = ManifestSchema.safeParse(saved as Manifest);\n if (!parsed.success || parsed.data.schemaVersion !== SCHEMA_VERSION) {\n await instance.delete();\n const fresh = new OrmDexie(name);\n fresh.on(\"versionchange\", () => {\n try {\n fresh.close();\n } finally {\n opts.onReset?.(\"versionchange\");\n }\n });\n fresh.on(\"blocked\", () => {\n opts.onReset?.(\"blocked\");\n });\n await fresh.open();\n await fresh.kv.put({\n key: MANIFEST_KEY,\n value: { schemaVersion: SCHEMA_VERSION },\n });\n installValidationHooks(fresh, opts.validation);\n opts.onReset?.(\"incompatible\");\n db = fresh;\n return fresh;\n }\n\n installValidationHooks(instance, opts.validation);\n db = instance;\n return instance;\n } catch (e) {\n opts.onError?.(e);\n throw new OpenDBError(\"Failed to open IndexedDB\", e);\n } finally {\n openPromise = null; // allow future reuse/retry\n }\n })();\n\n return openPromise;\n}\n\nexport async function resetDB(dbName?: string) {\n const name = dbName ?? \"inresi-orm\";\n if (db) {\n try {\n await db.close();\n } catch {\n /* ignore */\n }\n }\n const instance = new OrmDexie(name);\n await instance.delete();\n db = null;\n}\n","import { getDB } from \"../db\";\nimport { UserSchema, type User } from \"../schema\";\n\nconst USER_POINTER_KEY = \"user\";\n\nexport type IdGenerator = () => string;\nexport const defaultIdGenerator: IdGenerator = () =>\n typeof globalThis.crypto?.randomUUID === \"function\"\n ? globalThis.crypto.randomUUID()\n : (() => {\n const b =\n globalThis.crypto?.getRandomValues?.(new Uint8Array(16)) ??\n Uint8Array.from({ length: 16 }, () => (Math.random() * 256) | 0);\n b[6] = (b[6] & 0x0f) | 0x40; // v4\n b[8] = (b[8] & 0x3f) | 0x80; // variant\n const h = [...b].map((x) => x.toString(16).padStart(2, \"0\")).join(\"\");\n return `${h.slice(0, 8)}-${h.slice(8, 12)}-${h.slice(12, 16)}-${h.slice(16, 20)}-${h.slice(20)}`;\n })();\n\nconst getPointerUuid = (row: any) => row?.value?.useruuid ?? row?.value?.uuid;\n\nexport async function ensureUser(\n gen: IdGenerator = defaultIdGenerator,\n): Promise<User> {\n const db = await getDB();\n\n // Fast path\n const ptrUuid = getPointerUuid(await db.kv.get(USER_POINTER_KEY));\n if (ptrUuid) {\n const existing = await db.users.get(ptrUuid);\n if (existing) return UserSchema.parse(existing);\n }\n\n // Race-safe creation\n try {\n return await db.transaction(\"rw\", db.kv, db.users, async () => {\n const insideUuid = getPointerUuid(await db.kv.get(USER_POINTER_KEY));\n if (insideUuid) {\n const existing = await db.users.get(insideUuid);\n if (existing) return UserSchema.parse(existing);\n }\n\n const uuid = gen();\n await db.kv.add({ key: USER_POINTER_KEY, value: { useruuid: uuid } }); // claim pointer\n const newUser: User = UserSchema.parse({\n uuid,\n createdAt: new Date().toISOString(),\n });\n await db.users.add(newUser);\n return newUser;\n });\n } catch (e: any) {\n if (e?.name === \"ConstraintError\") {\n // Lost the race → read winner\n const uuid = getPointerUuid(await db.kv.get(USER_POINTER_KEY));\n if (uuid) {\n const winner = await db.users.get(uuid);\n if (winner) return UserSchema.parse(winner);\n }\n }\n throw e;\n }\n}\n\nexport const getUserUUID = async (gen?: IdGenerator) =>\n (await ensureUser(gen)).uuid;\n","import { getDB } from \"./db\";\n\nexport async function debugDump(): Promise<Record<string, unknown[]>> {\n const db = await getDB();\n const out: Record<string, unknown[]> = {};\n for (const t of db.tables) {\n out[t.name] = await t.toArray();\n }\n return out;\n}\n\nexport async function exportJSON(filename = \"inresi-orm-export.json\"): Promise<void> {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n throw new Error(\"exportJSON can only run in a browser.\");\n }\n const snapshot = await debugDump();\n const blob = new Blob([JSON.stringify(snapshot, null, 2)], { type: \"application/json\" });\n const a = document.createElement(\"a\");\n a.href = URL.createObjectURL(blob);\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(a.href);\n}\n","import { getDB } from \"./db\";\n\nexport interface AsyncStringStorage {\n getItem(name: string): Promise<string | null>;\n setItem(name: string, value: string): Promise<void>;\n removeItem(name: string): Promise<void>;\n}\n\ntype storeKeys = \"property\" | \"user\" | \"app\";\n\n// Generic typed KV helpers (store raw objects in the ORM's kv table)\nexport async function kvGet<T>(key: storeKeys): Promise<T | null> {\n const db = await getDB();\n const row = await db.kv.get(key);\n return (row?.value as T | undefined) ?? null;\n}\nexport async function kvSet<T>(key: storeKeys, value: T): Promise<void> {\n const db = await getDB();\n await db.kv.put({ key, value });\n}\nexport async function kvRemove(key: storeKeys): Promise<void> {\n const db = await getDB();\n await db.kv.delete(key);\n}\n\nexport function createORMStringStorage(opts?: {\n prefix?: string;\n fallbackToMemory?: boolean;\n}): AsyncStringStorage {\n const mem = new Map<string, string>(); // optional fallback\n const prefix = opts?.prefix ?? \"\";\n\n const toKey = (name: string) => `${prefix}${name}`;\n\n return {\n async getItem(name) {\n try {\n const db = await getDB();\n const row = await db.kv.get(toKey(name));\n return row ? JSON.stringify(row.value) : null;\n } catch (e) {\n if (opts?.fallbackToMemory) return mem.get(toKey(name)) ?? null;\n throw e;\n }\n },\n async setItem(name, value) {\n try {\n const db = await getDB();\n await db.kv.put({ key: toKey(name), value: JSON.parse(value) });\n } catch (e) {\n if (opts?.fallbackToMemory) {\n mem.set(toKey(name), value);\n return;\n }\n throw e;\n }\n },\n async removeItem(name) {\n try {\n const db = await getDB();\n await db.kv.delete(toKey(name));\n } catch (e) {\n if (opts?.fallbackToMemory) {\n mem.delete(toKey(name));\n return;\n }\n throw e;\n }\n },\n };\n}\n","// src/api/favourites.ts\nimport { getDB } from \"../db\";\nimport { ensureUser } from \"./users\";\nimport { FavoritesSchema } from \"../schema\";\n\nconst keyFor = (userId: string, propertyId: string) =>\n `favorites:${userId}:${propertyId}`;\n\nexport async function getFavoritedUnitsForProperty(\n propertyId: string | number,\n): Promise<string[]> {\n const db = await getDB();\n const { uuid } = await ensureUser();\n const key = keyFor(uuid, String(propertyId));\n const row = await db.kv.get(key);\n const parsed = row ? FavoritesSchema.safeParse(row.value) : null;\n return parsed?.success ? parsed.data.unitIds : [];\n}\n\nexport async function setFavoriteUnit(\n propertyId: string | number,\n unitId: string,\n on: boolean,\n): Promise<string[]> {\n const db = await getDB();\n const { uuid } = await ensureUser();\n const key = keyFor(uuid, String(propertyId));\n\n return db.transaction(\"rw\", db.kv, async () => {\n const row = await db.kv.get(key);\n const current =\n row && FavoritesSchema.safeParse(row.value).success\n ? (row!.value as any)\n : { unitIds: [] as string[], updatedAt: new Date().toISOString() };\n\n const nextSet = new Set<string>(current.unitIds);\n on ? nextSet.add(unitId) : nextSet.delete(unitId);\n\n const next = {\n unitIds: [...nextSet],\n updatedAt: new Date().toISOString(),\n };\n const validated = FavoritesSchema.parse(next);\n await db.kv.put({ key, value: validated });\n return validated.unitIds;\n });\n}\n\nexport async function toggleFavoriteUnit(\n propertyId: string | number,\n unitId: string,\n): Promise<string[]> {\n const current = await getFavoritedUnitsForProperty(propertyId);\n const on = !current.includes(unitId);\n return setFavoriteUnit(propertyId, unitId, on);\n}\n\nexport async function isUnitFavorited(\n propertyId: string | number,\n unitId: string,\n): Promise<boolean> {\n const list = await getFavoritedUnitsForProperty(propertyId);\n return list.includes(unitId);\n}\n","import { kvGet, kvSet } from \"../storage\";\nimport {\n ViewedUnitSchema,\n TourContactDataSchema,\n UserPropertyStateSchema,\n PropertyStoreDataSchema,\n type ViewedUnit,\n type TourContactData,\n type UserPropertyState,\n type PropertyStoreData,\n} from \"../schema\";\n\n// Re-export types for legacy import paths\nexport type { ViewedUnit, TourContactData, UserPropertyState, PropertyStoreData } from \"../schema\";\n\n// Default state\nconst defaultPropertyStoreData: PropertyStoreData = {\n data: {},\n propertySlug: null,\n propertyId: null,\n hasPreviouslySearched: [],\n};\n\n// Core property store API\nexport class PropertyStore {\n private async getState(): Promise<PropertyStoreData> {\n const state = await kvGet<PropertyStoreData>(\"property\");\n if (!state) return defaultPropertyStoreData;\n\n const normalized = {\n ...state,\n propertyId: state.propertyId == null ? null : String(state.propertyId),\n propertySlug: state.propertySlug ?? null,\n hasPreviouslySearched: Array.isArray(state.hasPreviouslySearched)\n ? state.hasPreviouslySearched.map(String)\n : [],\n };\n\n const parsed = PropertyStoreDataSchema.safeParse(normalized);\n if (parsed.success) return parsed.data;\n\n const sanitizedData = Object.entries(normalized.data ?? {}).reduce<\n Record<string, UserPropertyState>\n >((acc, [key, value]) => {\n const entry = UserPropertyStateSchema.safeParse(value);\n if (entry.success) acc[key] = entry.data;\n return acc;\n }, {});\n\n const fallbackState = {\n ...defaultPropertyStoreData,\n ...normalized,\n data: sanitizedData,\n };\n\n const fallbackParsed = PropertyStoreDataSchema.safeParse(fallbackState);\n return fallbackParsed.success ? fallbackParsed.data : defaultPropertyStoreData;\n }\n\n private async setState(updater: (state: PropertyStoreData) => PropertyStoreData): Promise<void> {\n const currentState = await this.getState();\n const newState = updater(currentState);\n const validatedState = PropertyStoreDataSchema.parse(newState);\n await kvSet(\"property\", validatedState);\n }\n\n // Basic state operations\n async setData(value: Record<string, UserPropertyState>): Promise<void> {\n await this.setState(state => ({ ...state, data: value }));\n }\n\n async setPropertySlug(slug: string): Promise<void> {\n await this.setState(state => ({ ...state, propertySlug: slug }));\n }\n\n async setPropertyId(id: string | number): Promise<void> {\n await this.setState(state => ({ ...state, propertyId: String(id) }));\n }\n\n async removeData(key: string | number): Promise<void> {\n const id = String(key);\n await this.setState(state => ({\n ...state,\n data: Object.entries(state.data)\n .filter(([k]) => k !== id)\n .reduce((acc, [k, v]) => ({ ...acc, [k]: v }), {}),\n }));\n }\n\n async clearData(): Promise<void> {\n await this.setState(state => ({ ...state, data: {} }));\n }\n\n async setHasPreviouslySearched(slug: string): Promise<void> {\n await this.setState(state => ({\n ...state,\n hasPreviouslySearched: Array.from(\n new Set([...state.hasPreviouslySearched, slug])\n ),\n }));\n }\n\n // Property-specific operations\n async setTourContactedOn(): Promise<void> {\n await this.setState(state => {\n const propertyId = state.propertyId;\n if (!propertyId) return state;\n\n const property = state.data[propertyId];\n if (!property) return state;\n\n return {\n ...state,\n data: {\n ...state.data,\n [propertyId]: {\n ...property,\n tourContactedOn: new Date().toISOString(),\n },\n },\n };\n });\n }\n\n async getTourContactedOn(): Promise<string | null> {\n const state = await this.getState();\n const propertyId = state.propertyId;\n if (!propertyId) return null;\n\n return state.data[propertyId]?.tourContactedOn ?? null;\n }\n\n async setQuestionnaireResults(results: unknown): Promise<void> {\n await this.setState(state => {\n const propertyId = state.propertyId;\n if (!propertyId) return state;\n\n const property = state.data[propertyId];\n if (!property) return state;\n\n return {\n ...state,\n data: {\n ...state.data,\n [propertyId]: {\n ...property,\n questionnaireResults: results,\n },\n },\n };\n });\n }\n\n async setTourContactData(data: TourContactData): Promise<void> {\n await this.setState(state => {\n const propertyId = state.propertyId;\n if (!propertyId) return state;\n\n const property = state.data[propertyId];\n if (!property) return state;\n\n return {\n ...state,\n data: {\n ...state.data,\n [propertyId]: {\n ...property,\n tourContactData: data,\n },\n },\n };\n });\n }\n\n async toggleFavorite(unitId: string): Promise<void> {\n await this.setState(state => {\n const propertyId = state.propertyId;\n if (!propertyId) return state;\n\n const property = state.data[propertyId];\n if (!property) return state;\n\n const isFavorited = property.favoritedUnits.includes(unitId);\n const updatedFavoritedUnits = isFavorited\n ? property.favoritedUnits.filter((id) => id !== unitId)\n : [...property.favoritedUnits, unitId];\n\n return {\n ...state,\n data: {\n ...state.data,\n [propertyId]: {\n ...property,\n favoritedUnits: updatedFavoritedUnits,\n },\n },\n };\n });\n }\n\n async markUnitAsViewed(unitId: string, slug: string): Promise<void> {\n const today = new Date();\n const formattedDate = `${String(today.getMonth() + 1).padStart(\n 2,\n \"0\"\n )}/${String(today.getDate()).padStart(2, \"0\")}`;\n\n await this.setState(state => {\n const propertyId = state.propertyId;\n if (!propertyId) return state;\n\n const property = state.data[propertyId];\n if (!property) return state;\n\n const updatedViewedUnits = [\n // Remove existing entry if it exists\n ...property.viewedUnits.filter((u) => u.unitId !== unitId),\n // Add updated one\n {\n unitId,\n viewedDate: formattedDate,\n },\n ];\n\n return {\n ...state,\n data: {\n ...state.data,\n [propertyId]: {\n ...property,\n viewedUnits: updatedViewedUnits,\n },\n },\n };\n });\n\n // Note: This opens a new window - you might want to handle this in the consuming app\n if (typeof window !== 'undefined') {\n window.open(`//${slug}`, \"_blank\");\n }\n }\n\n // Utility methods for getting specific data\n async getUnitState(unitId: string): Promise<{\n isFavorite: boolean;\n viewedDate: string;\n }> {\n const state = await this.getState();\n const property = state.propertyId ? state.data[state.propertyId] : null;\n\n return {\n isFavorite: property?.favoritedUnits.includes(unitId) ?? false,\n viewedDate:\n property?.viewedUnits.find((u) => u.unitId === unitId)?.viewedDate ?? \"\",\n };\n }\n\n async getPropertyData(propertyId?: string | number): Promise<UserPropertyState | null> {\n const state = await this.getState();\n const id = propertyId == null ? state.propertyId : String(propertyId);\n return id ? state.data[id] ?? null : null;\n }\n\n async getCurrentProperty(): Promise<UserPropertyState | null> {\n const state = await this.getState();\n return state.propertyId ? state.data[state.propertyId] ?? null : null;\n }\n\n async getFullState(): Promise<PropertyStoreData> {\n return this.getState();\n }\n\n // Initialize property if it doesn't exist\n async initializeProperty(propertyId: string | number, slug: string): Promise<void> {\n const id = String(propertyId);\n await this.setState(state => {\n if (state.data[id]) {\n return { ...state, propertyId: id, propertySlug: slug };\n }\n\n return {\n ...state,\n propertyId: id,\n propertySlug: slug,\n data: {\n ...state.data,\n [id]: {\n id,\n slug,\n favoritedUnits: [],\n tourContactedOn: null,\n viewedUnits: [],\n questionnaireResults: null,\n tourContactData: null,\n },\n },\n };\n });\n }\n}\n\n// Export singleton instance\nexport const propertyStore = new PropertyStore();\n","import { kvGet, kvSet } from \"../storage\";\nimport type { ZodObject, ZodType, ZodTypeAny } from \"zod\";\nimport {\n UnifiedStoreDataSchema,\n UserPropertyStateSchema,\n type UnifiedStoreData,\n type UserPropertyState,\n type Property,\n type Filters,\n type QueryParams,\n type ResultsMode,\n type SortBy,\n type TourContactData,\n type Unit,\n PropertySchema,\n TourContactDataSchema,\n UnitSchema,\n} from \"../schema\";\nimport { validate } from \"../validation\";\n\n// Default values\nconst defaultFilters: Filters = {\n availability: undefined,\n bedrooms: undefined,\n cost: undefined,\n highlights: undefined,\n};\n\nconst defaultUnifiedStoreData: UnifiedStoreData = {\n // Property data\n properties: {},\n currentPropertyId: null,\n currentPropertySlug: null,\n hasPreviouslySearched: [],\n\n // App data\n unitResults: [],\n filters: defaultFilters,\n tempFilters: defaultFilters,\n apiFilters: {\n limit: 10,\n page: 1,\n },\n resultsMode: \"all\",\n resolvedQuestionnaireValues: {},\n sortBy: \"relevance\",\n};\n\nconst toArray = (input: unknown): unknown[] => {\n if (input == null) return [];\n return Array.isArray(input) ? input : [input];\n};\n\nconst extractFilterValues = (value: unknown): unknown[] => {\n return toArray(value).flatMap(item => {\n if (item == null) return [];\n if (Array.isArray(item)) return item;\n if (typeof item === \"object\" && \"value\" in (item as any)) {\n const v = (item as any).value;\n return Array.isArray(v) ? v : v != null ? [v] : [];\n }\n return [item];\n });\n};\n\nconst toStringArray = (value: unknown): string[] =>\n extractFilterValues(value)\n .flatMap(v => (Array.isArray(v) ? v : [v]))\n .map(v => String(v))\n .map(v => v.trim())\n .filter(v => v.length > 0);\n\nconst toNumberArray = (value: unknown): number[] =>\n extractFilterValues(value)\n .map(v => {\n if (typeof v === \"number\" && Number.isFinite(v)) return v;\n const num = Number(v);\n return Number.isFinite(num) ? num : null;\n })\n .filter((v): v is number => v !== null);\n\nconst toNumberValue = (value: unknown): number | null => {\n if (value == null) return null;\n if (typeof value === \"number\") return Number.isFinite(value) ? value : null;\n if (typeof value === \"object\" && \"value\" in (value as any)) {\n return toNumberValue((value as any).value);\n }\n const num = Number(value);\n return Number.isFinite(num) ? num : null;\n};\n\n// Unified store class\nexport class UnifiedStore {\n private async getState(): Promise<UnifiedStoreData> {\n const state = await kvGet<UnifiedStoreData>(\"app\");\n if (!state) {\n return defaultUnifiedStoreData;\n }\n\n const merged = {\n ...defaultUnifiedStoreData,\n ...state,\n properties: state.properties ?? {},\n unitResults: state.unitResults ?? [],\n currentPropertyId:\n state.currentPropertyId == null ? null : String(state.currentPropertyId),\n currentPropertySlug: state.currentPropertySlug ?? null,\n hasPreviouslySearched: Array.isArray(state.hasPreviouslySearched)\n ? state.hasPreviouslySearched.map(String)\n : [],\n };\n\n const parsed = UnifiedStoreDataSchema.safeParse(merged);\n if (parsed.success) return parsed.data;\n\n // Sanitize by dropping invalid property entries and unit results\n const sanitizedProperties = Object.entries(merged.properties ?? {}).reduce<\n Record<string, UserPropertyState>\n >((acc, [key, value]) => {\n const entry = UserPropertyStateSchema.safeParse(value);\n if (entry.success) acc[key] = entry.data;\n return acc;\n }, {});\n\n const rawUnitResults = Array.isArray(merged.unitResults)\n ? merged.unitResults\n : merged.unitResults && typeof merged.unitResults === \"object\"\n ? Object.values(merged.unitResults as Record<string, unknown>)\n : [];\n\n const sanitizedUnitResults = rawUnitResults.reduce<Unit[]>((acc, value) => {\n const entry = UnitSchema.safeParse(value);\n if (entry.success) acc.push(entry.data);\n return acc;\n }, []);\n\n const fallback = {\n ...merged,\n properties: sanitizedProperties,\n unitResults: sanitizedUnitResults,\n };\n\n const fallbackParsed = UnifiedStoreDataSchema.safeParse(fallback);\n return fallbackParsed.success ? fallbackParsed.data : defaultUnifiedStoreData;\n }\n\n private async setState(updater: (state: UnifiedStoreData) => UnifiedStoreData): Promise<void> {\n const currentState = await this.getState();\n const newState = updater(currentState);\n const validatedState = UnifiedStoreDataSchema.parse(newState);\n await kvSet(\"app\", validatedState);\n }\n\n // === PROPERTY OPERATIONS ===\n\n async initializeProperty(propertyId: string | number, slug: string): Promise<void> {\n const id = String(propertyId);\n await this.setState(state => {\n if (state.properties && state.properties[id]) {\n return {\n ...state,\n currentPropertyId: id,\n currentPropertySlug: slug\n };\n }\n\n return {\n ...state,\n currentPropertyId: id,\n currentPropertySlug: slug,\n properties: {\n ...state.properties,\n [id]: {\n id,\n slug,\n favoritedUnits: [],\n tourContactedOn: null,\n viewedUnits: [],\n questionnaireResults: null,\n tourContactData: null,\n },\n },\n };\n });\n }\n\n // === UNIT RESULTS CACHE ===\n async setUnitResults(\n units: unknown,\n schema?: ZodTypeAny,\n ): Promise<void> {\n console.log(units)\n const baseSchema = (schema ?? UnitSchema) as ZodType<Unit>;\n const validatedUnits: Unit[] = [];\n const collection = Array.isArray(units)\n ? units\n : units && typeof units === \"object\"\n ? Object.values(units as Record<string, unknown>)\n : [];\n\n collection.forEach((unit, index) => {\n const parsed = validate(baseSchema, unit, `unitResults[${index}]`);\n if (parsed) validatedUnits.push(parsed);\n });\n await this.setState(state => ({\n ...state,\n unitResults: validatedUnits,\n }));\n }\n\n async clearUnitResults(): Promise<void> {\n await this.setState(state => ({\n ...state,\n unitResults: [],\n }));\n }\n\n // === PROPERTY DATA BAG (full property payloads & custom data) ===\n async setPropertyData(\n propertyId: string | number,\n data: unknown,\n schema?: ZodObject<any, any, any, any, any>,\n ): Promise<void> {\n const id = String(propertyId);\n const baseSchema = (schema ?? PropertySchema) as ZodObject<any, any, any, any, any>;\n await this.setState(state => {\n const property = state.properties[id];\n if (!property) return state;\n const validated = validate(baseSchema, data, `properties.${id}.data`) as Property | null;\n if (!validated) return state;\n return {\n ...state,\n properties: {\n ...state.properties,\n [id]: {\n ...property,\n data: validated,\n },\n },\n };\n });\n }\n\n async mergePropertyData(\n propertyId: string | number,\n partial: unknown,\n schema?: ZodObject<any, any, any, any, any>,\n ): Promise<void> {\n const id = String(propertyId);\n const baseSchema = (schema ?? PropertySchema) as ZodObject<any, any, any, any, any>;\n await this.setState(state => {\n const property = state.properties[id];\n if (!property) return state;\n const current = property.data;\n if (!current) {\n const full = validate(baseSchema, partial, `properties.${id}.data`) as Property | null;\n if (!full) return state;\n return {\n ...state,\n properties: {\n ...state.properties,\n [id]: {\n ...property,\n data: full,\n },\n },\n };\n }\n\n const partialSchema = baseSchema.partial();\n const validatedPartial = validate(\n partialSchema,\n partial,\n `properties.${id}.data.partial`,\n ) as Partial<Property> | null;\n if (!validatedPartial) return state;\n const merged = validate(\n baseSchema,\n { ...current, ...validatedPartial },\n `properties.${id}.data`,\n ) as Property | null;\n if (!merged) return state;\n return {\n ...state,\n properties: {\n ...state.properties,\n [id]: {\n ...property,\n data: merged,\n },\n },\n };\n });\n }\n\n // Accepts a full API property object, validates, and stores it into the\n // per-property `data` bag. Ensures the property entry exists/updated.\n async upsertPropertyFromApi(\n apiProperty: unknown,\n schema?: ZodTypeAny,\n ): Promise<void> {\n const s = schema ?? PropertySchema;\n const parsed: any = s.parse(apiProperty);\n const id = parsed.id ?? parsed.propertyId;\n if (id === undefined || id === null) {\n throw new Error(\"upsertPropertyFromApi: property id is required\");\n }\n const propertyId = String(id);\n const slug: string | undefined = parsed.slug ?? undefined;\n\n await this.setState(state => {\n const existing = state.properties[propertyId];\n const next: UserPropertyState = existing\n ? {\n ...existing,\n ...(slug ? { slug } : {}),\n data: parsed,\n }\n : {\n id: propertyId,\n slug: slug ?? \"\",\n favoritedUnits: [],\n tourContactedOn: null,\n viewedUnits: [],\n questionnaireResults: null,\n tourContactData: null,\n data: parsed,\n };\n\n return {\n ...state,\n properties: {\n ...state.properties,\n [propertyId]: next,\n },\n };\n });\n }\n\n async setCurrentProperty(propertyId: string | number, slug?: string): Promise<void> {\n const id = String(propertyId);\n await this.setState(state => ({\n ...state,\n currentPropertyId: id,\n currentPropertySlug: slug || state.currentPropertySlug,\n }));\n }\n\n async setCurrentPropertySlug(slug: string): Promise<void> {\n await this.setState(state => ({\n ...state,\n currentPropertySlug: slug\n }));\n }\n\n async setHasPreviouslySearched(slug: string): Promise<void> {\n await this.setState(state => ({\n ...state,\n hasPreviouslySearched: Array.from(\n new Set([...state.hasPreviouslySearched, slug])\n ),\n }));\n }\n\n async toggleFavorite(unitId: string): Promise<void> {\n await this.setState(state => {\n const propertyId = state.currentPropertyId;\n if (!propertyId) return state;\n\n const property = state.properties[propertyId];\n if (!property) return state;\n\n const isFavorited = property.favoritedUnits.includes(unitId);\n const updatedFavoritedUnits = isFavorited\n ? property.favoritedUnits.filter((id) => id !== unitId)\n : [...property.favoritedUnits, unitId];\n\n return {\n ...state,\n properties: {\n ...state.properties,\n [propertyId]: {\n ...property,\n favoritedUnits: updatedFavoritedUnits,\n },\n },\n };\n });\n }\n\n async markUnitAsViewed(unitId: string, slug: string): Promise<void> {\n const today = new Date();\n const formattedDate = `${String(today.getMonth() + 1).padStart(\n 2,\n \"0\"\n )}/${String(today.getDate()).padStart(2, \"0\")}`;\n\n await this.setState(state => {\n const propertyId = state.currentPropertyId;\n if (!propertyId) return state;\n\n const property = state.properties[propertyId];\n if (!property) return state;\n\n const updatedViewedUnits = [\n ...property.viewedUnits.filter((u) => u.unitId !== unitId),\n { unitId, viewedDate: formattedDate },\n ];\n\n return {\n ...state,\n properties: {\n ...state.properties,\n [propertyId]: {\n ...property,\n viewedUnits: updatedViewedUnits,\n },\n },\n };\n });\n\n if (typeof window !== 'undefined') {\n window.open(`//${slug}`, \"_blank\");\n }\n }\n\n async setTourContactedOn(): Promise<void> {\n await this.setState(state => {\n const propertyId = state.currentPropertyId;\n if (!propertyId) return state;\n\n const property = state.properties[propertyId];\n if (!property) return state;\n\n return {\n ...state,\n properties: {\n ...state.properties,\n [propertyId]: {\n ...property,\n tourContactedOn: new Date().toISOString(),\n },\n },\n };\n });\n }\n\n async getTourContactedOn(): Promise<string | null> {\n const state = await this.getState();\n const propertyId = state.currentPropertyId;\n if (!propertyId) return null;\n\n return state.properties[propertyId]?.tourContactedOn ?? null;\n }\n\n async setQuestionnaireResults(results: unknown): Promise<void> {\n await this.setState(state => {\n const propertyId = state.currentPropertyId;\n if (!propertyId) return state;\n\n const property = state.properties[propertyId];\n if (!property) return state;\n\n return {\n ...state,\n properties: {\n ...state.properties,\n [propertyId]: {\n ...property,\n questionnaireResults: results,\n },\n },\n };\n });\n }\n\n async setTourContactData(data: TourContactData): Promise<void> {\n await this.setState(state => {\n const propertyId = state.currentPropertyId;\n if (!propertyId) return state;\n\n const property = state.properties[propertyId];\n if (!property) return state;\n\n return {\n ...state,\n properties: {\n ...state.properties,\n [propertyId]: {\n ...property,\n tourContactData: data,\n },\n },\n };\n });\n }\n\n\n\n\n\n\n\n // === FILTER OPERATIONS ===\n\n async setFilters(filters: Partial<Filters>): Promise<void> {\n await this.setState(state => ({\n ...state,\n filters: { ...state.filters, ...filters }\n }));\n }\n\n async setTempFilters(filters: Partial<Filters>): Promise<void> {\n await this.setState(state => ({\n ...state,\n tempFilters: { ...state.tempFilters, ...filters }\n }));\n }\n\n async setFiltersToDefault(): Promise<void> {\n await this.setState(state => ({ ...state, filters: defaultFilters }));\n }\n\n async setApiFilters(filters: Partial<QueryParams>): Promise<void> {\n await this.setState(state => ({\n ...state,\n apiFilters: { ...state.apiFilters, ...filters }\n }));\n }\n\n async handleTempFilterChange<K extends keyof Filters>(\n key: K,\n value: Filters[K]\n ): Promise<void> {\n await this.setState(state => ({\n ...state,\n tempFilters: { ...state.tempFilters, [key]: value }\n }));\n }\n\n async commitTempFilterChange<K extends keyof Filters>(\n key: K,\n defaultValue: Filters[K]\n ): Promise<void> {\n const state = await this.getState();\n const value = state.tempFilters[key] ?? defaultValue;\n\n await this.handleTempFilterChange(key, value);\n await this.submitFilterUpdate();\n }\n\n async handleFilterCommitIndexDB(newFilters: Partial<Filters>): Promise<void> {\n await this.setState(state => {\n const apiParams: QueryParams = {\n ...state.apiFilters,\n availability: toStringArray(newFilters.availability),\n bedrooms: toNumberArray(newFilters.bedrooms),\n cost: toNumberValue(newFilters.cost),\n highlights: toStringArray(newFilters.highlights),\n };\n return {\n ...state,\n filters: { ...state.filters, ...newFilters },\n apiFilters: apiParams,\n };\n });\n }\n\n async commitAvailabilityChange(): Promise<void> {\n await this.submitFilterUpdate();\n }\n\n async submitFilterUpdate(): Promise<void> {\n await this.setState(state => {\n const apiParams: QueryParams = {\n ...state.apiFilters,\n availability: toStringArray(state.filters.availability),\n bedrooms: toNumberArray(state.filters.bedrooms),\n cost: toNumberValue(state.filters.cost),\n highlights: toStringArray(state.filters.highlights),\n };\n\n return {\n ...state,\n apiFilters: apiParams,\n };\n });\n }\n\n // === RESULTS AND SORTING ===\n\n async setResultsMode(mode: ResultsMode): Promise<void> {\n await this.setState(state => ({ ...state, resultsMode: mode }));\n }\n\n async setSortBy(sortBy: SortBy): Promise<void> {\n await this.setState(state => ({ ...state, sortBy }));\n }\n\n // === QUESTIONNAIRE ===\n\n async setResolvedQuestionnaireValues(name: string, values: string[]): Promise<void> {\n await this.setState(state => ({\n ...state,\n resolvedQuestionnaireValues: {\n ...state.resolvedQuestionnaireValues,\n [name]: values\n }\n }));\n }\n\n // === UTILITY METHODS ===\n\n async getUnitState(unitId: string): Promise<{\n isFavorite: boolean;\n viewedDate: string;\n }> {\n const state = await this.getState();\n const property = state.currentPropertyId ? state.properties[state.currentPropertyId] : null;\n\n return {\n isFavorite: property?.favoritedUnits.includes(unitId) ?? false,\n viewedDate:\n property?.viewedUnits.find((u) => u.unitId === unitId)?.viewedDate ?? \"\",\n };\n }\n\n async getResultsUrl(): Promise<string | null> {\n const state = await this.getState();\n return state.currentPropertySlug ? `/${state.currentPropertySlug}/results` : null;\n }\n\n async getCurrentProperty(): Promise<UserPropertyState | null> {\n const state = await this.getState();\n return state.currentPropertyId ? state.properties[state.currentPropertyId] ?? null : null;\n }\n\n async getPropertyData(propertyId?: string | number): Promise<UserPropertyState | null> {\n const state = await this.getState();\n const id = propertyId == null ? state.currentPropertyId : String(propertyId);\n return id ? state.properties[id] ?? null : null;\n }\n\n async getFullState(): Promise<UnifiedStoreData> {\n return this.getState();\n }\n\n async initialize(): Promise<void> {\n // Ensure default shape is present; no-op if already initialized\n await this.setState(state => ({ ...defaultUnifiedStoreData, ...state }));\n }\n\n async loadPersistedFilters(): Promise<void> {\n // No-op; filtersLoaded is UI-only and not persisted\n }\n\n // === LEGACY COMPATIBILITY METHODS ===\n\n // Property store compatibility\n async setData(value: Record<string, UserPropertyState>): Promise<void> {\n await this.setState(state => ({ ...state, properties: value }));\n }\n\n async setPropertySlug(slug: string): Promise<void> {\n await this.setCurrentPropertySlug(slug);\n }\n\n async setPropertyId(id: string | number): Promise<void> {\n await this.setCurrentProperty(id);\n }\n\n async removeData(key: string | number): Promise<void> {\n const id = String(key);\n await this.setState(state => {\n const { [id]: removed, ...rest } = state.properties;\n return { ...state, properties: rest };\n });\n }\n\n async clearData(): Promise<void> {\n await this.setState(state => ({ ...state, properties: {} }));\n }\n}\n\n// Export singleton instance\nexport const store = new UnifiedStore();\n// Alias to prefer neutral naming going forward\nexport { UnifiedStore as Store };\n// Re-export types for convenience (tests import from this module)\nexport type { UserPropertyState, Filters } from \"../schema\";\n","import { store } from \"../stores/store\";\nimport type { UnifiedStoreData, UserPropertyState, Filters, QueryParams, ResultsMode, SortBy, TourContactData, Unit } from \"../schema\";\n\n// Unified Zustand store interface\nexport interface ZustandUnifiedStoreState {\n // Property data\n properties: Record<string, UserPropertyState>;\n currentPropertyId: string | null;\n currentPropertySlug: string | null;\n hasPreviouslySearched: string[];\n\n // App data\n unitResults: Unit[];\n filters: Filters;\n tempFilters: Filters;\n apiFilters: QueryParams;\n resultsMode: ResultsMode;\n resolvedQuestionnaireValues: Record<string, string[]>;\n sortBy: SortBy;\n filtersLoaded: boolean;\n\n // === PROPERTY OPERATIONS ===\n initializeProperty: (propertyId: string, slug: string) => Promise<void>;\n setCurrentProperty: (propertyId: string, slug?: string) => Promise<void>;\n setCurrentPropertySlug: (slug: string) => Promise<void>;\n setHasPreviouslySearched: (slug: string) => Promise<void>;\n toggleFavorite: (unitId: string) => Promise<void>;\n markUnitAsViewed: (unitId: string, slug: string) => Promise<void>;\n setTourContactedOn: () => Promise<void>;\n getTourContactedOn: () => Promise<string | null>;\n setQuestionnaireResults: (results: unknown) => Promise<void>;\n setTourContactData: (data: TourContactData) => Promise<void>;\n setUnitResults: (units: unknown) => Promise<void>;\n clearUnitResults: () => Promise<void>;\n\n\n // === FILTER OPERATIONS ===\n setFilters: (filters: Partial<Filters>) => Promise<void>;\n setTempFilters: (filters: Partial<Filters>) => Promise<void>;\n setFiltersToDefault: () => Promise<void>;\n setApiFilters: (filters: Partial<QueryParams>) => Promise<void>;\n handleTempFilterChange: <K extends keyof Filters>(key: K, value: Filters[K]) => Promise<void>;\n commitTempFilterChange: <K extends keyof Filters>(key: K, defaultValue: Filters[K]) => Promise<void>;\n handleFilterCommitIndexDB: (newFilters: Partial<Filters>) => Promise<void>;\n commitAvailabilityChange: () => Promise<void>;\n submitFilterUpdate: () => Promise<void>;\n\n // === RESULTS AND SORTING ===\n setResultsMode: (mode: ResultsMode) => Promise<void>;\n setSortBy: (sortBy: SortBy) => Promise<void>;\n\n // === QUESTIONNAIRE ===\n setResolvedQuestionnaireValues: (name: string, values: string[]) => Promise<void>;\n\n // === UTILITY METHODS ===\n getUnitState: (unitId: string) => {\n isFavorite: boolean;\n viewedDate: string;\n };\n getResultsUrl: () => Promise<string | null>;\n getCurrentProperty: () => Promise<UserPropertyState | null>;\n getPropertyData: (propertyId?: string) => Promise<UserPropertyState | null>;\n\n // === LEGACY COMPATIBILITY ===\n setData: (value: Record<string, UserPropertyState>) => Promise<void>;\n setPropertySlug: (slug: string) => Promise<void>;\n setPropertyId: (id: string) => Promise<void>;\n removeData: (key: string) => Promise<void>;\n clearData: () => Promise<void>;\n loadPersistedFilters: () => Promise<void>;\n\n // === INTERNAL ===\n _hydrate: () => Promise<void>;\n _initialize: () => Promise<void>;\n}\n\nexport function createZustandUnifiedStore(options?: {\n onFilterUpdate?: (apiParams: QueryParams) => void;\n}) {\n return (set: any, get: any): ZustandUnifiedStoreState => {\n // Helper to update local state after ORM operations\n const syncState = async () => {\n const ormState = await store.getFullState();\n set({\n properties: ormState.properties,\n currentPropertyId: ormState.currentPropertyId,\n currentPropertySlug: ormState.currentPropertySlug,\n hasPreviouslySearched: ormState.hasPreviouslySearched,\n unitResults: ormState.unitResults,\n filters: ormState.filters,\n tempFilters: ormState.tempFilters,\n apiFilters: ormState.apiFilters,\n resultsMode: ormState.resultsMode,\n resolvedQuestionnaireValues: ormState.resolvedQuestionnaireValues,\n sortBy: ormState.sortBy,\n });\n };\n\n // Helper to notify of filter updates\n const notifyFilterUpdate = async () => {\n if (options?.onFilterUpdate) {\n const apiFilters = (await store.getFullState()).apiFilters;\n options.onFilterUpdate(apiFilters);\n }\n };\n\n return {\n // Initial state\n properties: {},\n currentPropertyId: null,\n currentPropertySlug: null,\n hasPreviouslySearched: [],\n unitResults: [],\n filters: {\n availability: undefined,\n bedrooms: undefined,\n cost: undefined,\n highlights: undefined,\n },\n tempFilters: {\n availability: undefined,\n bedrooms: undefined,\n cost: undefined,\n highlights: undefined,\n },\n apiFilters: {\n limit: 10,\n page: 1,\n },\n resultsMode: \"all\",\n resolvedQuestionnaireValues: {},\n sortBy: \"relevance\",\n filtersLoaded: false,\n\n // === PROPERTY OPERATIONS ===\n async initializeProperty(propertyId, slug) {\n await store.initializeProperty(propertyId, slug);\n await syncState();\n },\n\n async setCurrentProperty(propertyId, slug) {\n await store.setCurrentProperty(propertyId, slug);\n set({\n currentPropertyId: propertyId,\n ...(slug && { currentPropertySlug: slug })\n });\n },\n\n async setCurrentPropertySlug(slug) {\n await store.setCurrentPropertySlug(slug);\n set({ currentPropertySlug: slug });\n },\n\n async setHasPreviouslySearched(slug) {\n await store.setHasPreviouslySearched(slug);\n await syncState();\n },\n\n async toggleFavorite(unitId) {\n await store.toggleFavorite(unitId);\n await syncState();\n },\n\n async markUnitAsViewed(unitId, slug) {\n await store.markUnitAsViewed(unitId, slug);\n await syncState();\n },\n\n async setTourContactedOn() {\n await store.setTourContactedOn();\n await syncState();\n },\n\n getTourContactedOn: store.getTourContactedOn.bind(store),\n\n async setQuestionnaireResults(results) {\n await store.setQuestionnaireResults(results);\n await syncState();\n },\n\n async setTourContactData(data) {\n await store.setTourContactData(data);\n await syncState();\n },\n\n async setUnitResults(units) {\n await store.setUnitResults(units);\n await syncState();\n },\n\n async clearUnitResults() {\n await store.clearUnitResults();\n await syncState();\n },\n\n\n // === FILTER OPERATIONS ===\n async setFilters(filters) {\n await store.setFilters(filters);\n const state = get();\n set({ filters: { ...state.filters, ...filters } });\n },\n\n async setTempFilters(filters) {\n await store.setTempFilters(filters);\n const state = get();\n set({ tempFilters: { ...state.tempFilters, ...filters } });\n },\n\n async setFiltersToDefault() {\n await store.setFiltersToDefault();\n const defaultFilters = {\n availability: undefined,\n bedrooms: undefined,\n cost: undefined,\n highlights: undefined,\n };\n set({ filters: defaultFilters });\n },\n\n async setApiFilters(filters) {\n await store.setApiFilters(filters);\n const state = get();\n set({ apiFilters: { ...state.apiFilters, ...filters } });\n },\n\n async handleTempFilterChange(key, value) {\n await store.handleTempFilterChange(key, value);\n const state = get();\n set({ tempFilters: { ...state.tempFilters, [key]: value } });\n },\n\n async commitTempFilterChange(key, defaultValue) {\n await store.commitTempFilterChange(key, defaultValue);\n await syncState();\n await notifyFilterUpdate();\n },\n\n async handleFilterCommitIndexDB(newFilters) {\n await store.handleFilterCommitIndexDB(newFilters);\n await syncState();\n await notifyFilterUpdate();\n },\n\n async commitAvailabilityChange() {\n await store.commitAvailabilityChange();\n await syncState();\n await notifyFilterUpdate();\n },\n\n async submitFilterUpdate() {\n await store.submitFilterUpdate();\n await syncState();\n await notifyFilterUpdate();\n },\n\n // === RESULTS AND SORTING ===\n async setResultsMode(mode) {\n await store.setResultsMode(mode);\n set({ resultsMode: mode });\n },\n\n async setSortBy(sortBy) {\n await store.setSortBy(sortBy);\n set({ sortBy });\n },\n\n // === QUESTIONNAIRE ===\n async setResolvedQuestionnaireValues(name, values) {\n await store.setResolvedQuestionnaireValues(name, values);\n const state = get();\n set({\n resolvedQuestionnaireValues: {\n ...state.resolvedQuestionnaireValues,\n [name]: values,\n }\n });\n },\n\n // === UTILITY METHODS ===\n getUnitState(unitId: string) {\n const state = get();\n const property = state.currentPropertyId ? state.properties[state.currentPropertyId] : null;\n\n return {\n isFavorite: property?.favoritedUnits.includes(unitId) ?? false,\n viewedDate:\n property?.viewedUnits.find((u: any) => u.unitId === unitId)?.viewedDate ?? \"\",\n };\n },\n\n getResultsUrl: store.getResultsUrl.bind(store),\n getCurrentProperty: store.getCurrentProperty.bind(store),\n getPropertyData: store.getPropertyData.bind(store),\n\n // === LEGACY COMPATIBILITY ===\n async setData(value) {\n await store.setData(value);\n set({ properties: value });\n },\n\n async setPropertySlug(slug) {\n await store.setPropertySlug(slug);\n set({ currentPropertySlug: slug });\n },\n\n async setPropertyId(id) {\n await store.setPropertyId(id);\n set({ currentPropertyId: id });\n },\n\n async removeData(key) {\n await store.removeData(key);\n await syncState();\n },\n\n async clearData() {\n await store.clearData();\n set({ properties: {} });\n },\n\n async loadPersistedFilters() {\n await store.loadPersistedFilters();\n set({ filtersLoaded: true });\n },\n\n // === INTERNAL ===\n async _hydrate() {\n await syncState();\n },\n\n async _initialize() {\n await store.initialize();\n await syncState();\n set({ filtersLoaded: true });\n },\n };\n };\n}\n\n// Helper hook factory for unit state\nexport function createUseUnitState() {\n return (useStore: any) => (unitId: string) =>\n useStore((state: ZustandUnifiedStoreState) => state.getUnitState(unitId));\n}\n\n// Export types for consuming apps\nexport type { UnitData, UserPropertyState, Filters, QueryParams, ResultsMode, SortBy, TourContactData, Unit } from \"../schema\";\n\n// Neutral naming aliases (preferred going forward)\nexport { createZustandUnifiedStore as createZustandStore };\nexport type ZustandStoreState = ZustandUnifiedStoreState;\n","import {\n type ZustandUnifiedStoreState,\n createZustandUnifiedStore,\n type Filters,\n type UnitData,\n type TourContactData,\n type QueryParams\n} from \"./zustand-store\";\n\nexport interface StructuredStoreActions {\n property: {\n unit: {\n favorites: {\n toggle: (unitId: string) => Promise<void>;\n };\n viewed: {\n mark: (unitId: string, slug: string) => Promise<void>;\n };\n };\n questionnaire: {\n setResults: (results: unknown) => Promise<void>;\n };\n tour: {\n setContactedOn: () => Promise<void>;\n getContactedOn: () => Promise<string | null>;\n setContactData: (data: TourContactData) => Promise<void>;\n };\n };\n\n filters: {\n set: (filters: Partial<Filters>) => Promise<void>;\n setTemp: (filters: Partial<Filters>) => Promise<void>;\n setToDefault: () => Promise<void>;\n commitTemp: <K extends keyof Filters>(key: K, defaultValue: Filters[K]) => Promise<void>;\n commitAvailability: () => Promise<void>;\n submit: () => Promise<void>;\n };\n}\n\nexport function createStructuredStoreActions(store: ZustandUnifiedStoreState): StructuredStoreActions {\n return {\n property: {\n unit: {\n favorites: {\n toggle: store.toggleFavorite.bind(store),\n },\n viewed: {\n mark: store.markUnitAsViewed.bind(store),\n },\n },\n questionnaire: {\n setResults: store.setQuestionnaireResults.bind(store),\n },\n tour: {\n setContactedOn: store.setTourContactedOn.bind(store),\n getContactedOn: store.getTourContactedOn.bind(store),\n setContactData: store.setTourContactData.bind(store),\n },\n },\n filters: {\n set: store.setFilters.bind(store),\n setTemp: store.setTempFilters.bind(store),\n setToDefault: store.setFiltersToDefault.bind(store),\n commitTemp: store.commitTempFilterChange.bind(store),\n commitAvailability: store.commitAvailabilityChange.bind(store),\n submit: store.submitFilterUpdate.bind(store),\n },\n };\n}\n\nexport type StructuredStore = ZustandUnifiedStoreState & StructuredStoreActions;\n\nexport function createStructuredStore(options?: {\n onFilterUpdate?: (apiParams: QueryParams) => void;\n}) {\n return (set: any, get: any): StructuredStore => {\n const baseStore = createZustandUnifiedStore(options)(set, get);\n const actions = createStructuredStoreActions(baseStore);\n\n return {\n ...baseStore,\n ...actions,\n };\n };\n}","// src/units/favorites.ts\nimport * as api from \"../api/favorites\";\n\nconst favorites = {\n async isFavorite(propertyId: string | number, unitId: string): Promise<boolean> {\n return api.isUnitFavorited(propertyId, unitId);\n },\n async toggle(propertyId: string | number, unitId: string): Promise<string[]> {\n return api.toggleFavoriteUnit(propertyId, unitId);\n },\n async set(propertyId: string | number, unitId: string, on: boolean): Promise<string[]> {\n return api.setFavoriteUnit(propertyId, unitId, on);\n },\n async getAll(propertyId: string | number): Promise<string[]> {\n return api.getFavoritedUnitsForProperty(propertyId);\n },\n};\n\nexport {favorites}\n","export const DEFAULT_WEB_ORIGIN = \"https://web.inresiapp.com\";\nexport const DEFAULT_PLACEHOLDER_IMAGE = \"/placeholder.jpg\";\n\nexport interface UnitImageApiResponse {\n CFURL?: string;\n name?: string;\n signature?: string;\n}\n\nexport interface UnitSourceApiResponse extends Record<string, unknown> {\n id?: number | string;\n name?: string;\n title?: string;\n slug?: string;\n cost?: number;\n bedrooms?: number;\n bathrooms?: number;\n totalSqFt?: number;\n amenities?: unknown;\n highlights?: unknown;\n availability?: string | Date | null;\n image?: UnitImageApiResponse;\n additionalImages?: UnitImageApiResponse[];\n}\n\nexport interface UnitHitApiResponse<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> {\n _index?: string;\n _id?: string;\n _score?: number;\n _source?: Source;\n}\n\nexport interface UnitsTotalInfo {\n value: number;\n relation?: string;\n}\n\nexport interface UnitsDataApiResponse<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> {\n total?: UnitsTotalInfo;\n max_score?: number | null;\n hits?: UnitHitApiResponse<Source>[];\n type?: string;\n}\n\nexport interface UnitsApiResponse<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> {\n data: UnitsDataApiResponse<Source>;\n}\n\nexport type TransformedUnit<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> = Source & {\n title: string;\n slug: string;\n imageUrl: string;\n secondaryImageUrl?: string;\n tertiaryImageUrl?: string;\n};\n\nexport interface UnitsClientList<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> {\n total: number;\n maxScore: number | null;\n type: string;\n hits: TransformedUnit<Source>[];\n}\n\nexport interface TransformUnitsOptions {\n origin?: string;\n placeholderImage?: string;\n}\n\nconst normalizeSignature = (signature?: string): string => {\n if (!signature) return \"\";\n return signature.startsWith(\"?\") ? signature : `?${signature}`;\n};\n\nexport const buildExploreUrl = (\n unitSlug: string,\n propertySlug: string,\n origin = DEFAULT_WEB_ORIGIN,\n): string => `${origin}/${propertySlug}/unit/${unitSlug}/explore`;\n\nexport const buildImageUrl = (\n image?: UnitImageApiResponse,\n placeholder = DEFAULT_PLACEHOLDER_IMAGE,\n): string => {\n if (!image?.CFURL || !image?.name || !image?.signature) return placeholder;\n return `${image.CFURL}${image.name}${normalizeSignature(image.signature)}`;\n};\n\nexport function transformUnitsApiResponse<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n>(apiResponse: UnitsDataApiResponse<Source>): UnitsApiResponse<Source> {\n return { data: apiResponse };\n}\n\nexport function transformUnitsApiResponseToClient<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n>(\n apiResponse: UnitsDataApiResponse<Source>,\n propertySlug: string,\n options?: TransformUnitsOptions,\n): UnitsClientList<Source> {\n const origin = options?.origin ?? DEFAULT_WEB_ORIGIN;\n const placeholderImage = options?.placeholderImage ?? DEFAULT_PLACEHOLDER_IMAGE;\n\n const hits =\n apiResponse.hits?.map((hit) => {\n const source = (hit._source ?? {}) as Source & UnitSourceApiResponse;\n const title =\n typeof source.name === \"string\"\n ? source.name\n : typeof source.title === \"string\"\n ? source.title\n : \"\";\n\n const normalized: TransformedUnit<Source> = {\n ...(source as Source),\n title,\n slug: buildExploreUrl(String(source.slug ?? \"\"), propertySlug, origin),\n imageUrl: buildImageUrl(source.image, placeholderImage),\n secondaryImageUrl: buildImageUrl(source.additionalImages?.[0], placeholderImage),\n tertiaryImageUrl: buildImageUrl(source.additionalImages?.[1], placeholderImage),\n };\n\n return normalized;\n }) ?? [];\n\n return {\n total: apiResponse.total?.value ?? hits.length,\n maxScore: apiResponse.max_score ?? null,\n type: apiResponse.type ?? \"units\",\n hits,\n };\n}\n\nexport interface UnitsFilterParams {\n availability?: string[];\n bedrooms?: (number | string)[];\n cost?: number | null;\n highlights?: string[];\n}\n\nexport interface UnitsClientFilters {\n availability?: string[];\n bedrooms?: string[];\n cost?: number;\n highlights: string[];\n}\n\nconst reverseAvailabilityMap: Record<string, string> = {\n asap: \"ASAP\",\n next_month: \"Next Month\",\n \"2_3_months\": \"2-3 Months\",\n all: \"Just Browsing\",\n};\n\nconst reverseBedroomMap: Record<number, string> = {\n 0: \"Studio\",\n 1: \"1 Bed\",\n 2: \"2 Bed\",\n 3: \"3+ Bed\",\n};\n\nconst bedroomLabels = new Set(Object.values(reverseBedroomMap));\n\nconst normalizeBedrooms = (\n bedrooms?: (number | string)[],\n): string[] | undefined => {\n if (!bedrooms || bedrooms.length === 0) return undefined;\n\n const result = new Set<string>();\n\n for (const bedroom of bedrooms) {\n if (typeof bedroom === \"number\") {\n const label = reverseBedroomMap[bedroom];\n if (label) result.add(label);\n continue;\n }\n\n const values = bedroom.split(\",\").map((v) => v.trim());\n\n for (const value of values) {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isNaN(parsed) && reverseBedroomMap[parsed]) {\n result.add(reverseBedroomMap[parsed]);\n } else if (bedroomLabels.has(value)) {\n result.add(value);\n }\n }\n }\n\n return result.size > 0 ? Array.from(result) : undefined;\n};\n\nexport const transformUnitsApiResponseToClientFilters = (\n params: UnitsFilterParams,\n): UnitsClientFilters => {\n const availability =\n params.availability && params.availability.length > 0\n ? params.availability.map(\n (value) => reverseAvailabilityMap[value] ?? value,\n )\n : undefined;\n\n return {\n availability,\n bedrooms: normalizeBedrooms(params.bedrooms),\n cost: params.cost ?? undefined,\n highlights: params.highlights ?? [],\n };\n};\n"],"names":["SchemaMismatchError","message","detail","OpenDBError","SCHEMA_VERSION","UserSchema","z","UserUnitDataSchema","UnitDataSchema","FilterOptionValueSchema","FilterCollectionSchema","FiltersSchema","QueryParamsSchema","ResultsModeEnum","SortByEnum","AppStoreDataSchema","UnitSchema","PropertySchema","ApiUserSchema","ViewedUnitSchema","TourContactDataSchema","UserPropertyStateSchema","PropertyStoreDataSchema","UnitFavoriteSchema","FavoritesSchema","UnifiedStoreDataSchema","OrmDexie","Dexie","name","mode","onIssue","configureValidation","opts","validate","schema","value","ctx","res","details","MANIFEST_KEY","ManifestSchema","db","openPromise","VALIDATION_INSTALLED","installValidationHooks","instance","vopts","anyDb","table","_pk","obj","v","mods","next","dropInvalid","isProbablyDev","__vite_import_meta_env__","getDB","defaultMode","_a","_b","row","saved","parsed","fresh","_c","e","_d","resetDB","dbName","USER_POINTER_KEY","defaultIdGenerator","b","h","x","getPointerUuid","ensureUser","gen","ptrUuid","existing","insideUuid","uuid","newUser","winner","getUserUUID","debugDump","out","t","exportJSON","filename","snapshot","blob","kvGet","key","kvSet","kvRemove","createORMStringStorage","mem","prefix","toKey","keyFor","userId","propertyId","getFavoritedUnitsForProperty","setFavoriteUnit","unitId","on","current","nextSet","validated","toggleFavoriteUnit","isUnitFavorited","defaultPropertyStoreData","PropertyStore","state","normalized","sanitizedData","acc","entry","fallbackState","fallbackParsed","updater","currentState","newState","validatedState","slug","id","k","property","results","data","updatedFavoritedUnits","today","formattedDate","updatedViewedUnits","u","propertyStore","defaultFilters","defaultUnifiedStoreData","toArray","input","extractFilterValues","item","toStringArray","toNumberArray","num","toNumberValue","UnifiedStore","merged","sanitizedProperties","sanitizedUnitResults","fallback","units","baseSchema","validatedUnits","unit","index","partial","full","partialSchema","validatedPartial","apiProperty","filters","defaultValue","newFilters","apiParams","sortBy","values","removed","rest","store","createZustandUnifiedStore","options","set","get","syncState","ormState","notifyFilterUpdate","apiFilters","createUseUnitState","useStore","createStructuredStoreActions","createStructuredStore","baseStore","actions","favorites","api.isUnitFavorited","api.toggleFavoriteUnit","api.setFavoriteUnit","api.getFavoritedUnitsForProperty","DEFAULT_WEB_ORIGIN","DEFAULT_PLACEHOLDER_IMAGE","normalizeSignature","signature","buildExploreUrl","unitSlug","propertySlug","origin","buildImageUrl","image","placeholder","transformUnitsApiResponse","apiResponse","transformUnitsApiResponseToClient","placeholderImage","hits","hit","source","title","reverseAvailabilityMap","reverseBedroomMap","bedroomLabels","normalizeBedrooms","bedrooms","result","bedroom","label","transformUnitsApiResponseToClientFilters","params"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/errors.ts","../src/schema.ts","../src/adapters/dexie.ts","../src/validation.ts","../src/db.ts","../src/api/users.ts","../src/debug.ts","../src/storage.ts","../src/api/favorites.ts","../src/api/properties.ts","../src/stores/store.ts","../src/adapters/zustand-store.ts","../src/adapters/structured-store.ts","../src/units/favorites.ts","../src/features/units/transformers.ts"],"sourcesContent":["export class SchemaMismatchError extends Error {\n constructor(message: string, public detail?: unknown) {\n super(message);\n this.name = \"SchemaMismatchError\";\n }\n}\n\nexport class OpenDBError extends Error {\n constructor(message: string, public detail?: unknown) {\n super(message);\n this.name = \"OpenDBError\";\n }\n}\n","import { z } from \"zod\";\n\nexport const SCHEMA_VERSION = 1 as const;\n\n// Entities\nexport const UserSchema = z.object({\n uuid: z.string().uuid(),\n // stored as ISO string; include to match ensureUser()\n createdAt: z.string().datetime().optional(),\n});\nexport type User = z.infer<typeof UserSchema>;\n\n// User-specific Unit state\nexport const UserUnitDataSchema = z.object({\n isFavorite: z.boolean().optional(),\n viewedDate: z.string().optional(),\n});\n// Back-compat alias (to be deprecated): keep existing name\nexport const UnitDataSchema = UserUnitDataSchema;\nexport type UnitData = z.infer<typeof UserUnitDataSchema>;\n\n// Filters and query params\nconst FilterOptionValueSchema = z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.record(z.unknown()),\n]);\n\nconst FilterCollectionSchema = z.union([\n FilterOptionValueSchema,\n z.array(FilterOptionValueSchema),\n]);\n\nexport const FiltersSchema = z.object({\n availability: FilterCollectionSchema.nullable().optional(),\n bedrooms: z.union([z.array(FilterOptionValueSchema), z.null()]).optional(),\n cost: z.number().nullable().optional(),\n highlights: z.array(FilterOptionValueSchema).optional(),\n});\nexport type Filters = z.infer<typeof FiltersSchema>;\n\nexport const QueryParamsSchema = z.object({\n limit: z.number().default(10),\n page: z.number().default(1),\n availability: z.array(z.string()).optional(),\n bedrooms: z.array(z.number()).optional(),\n cost: z.number().nullable().optional(),\n highlights: z.array(z.string()).optional(),\n});\nexport type QueryParams = z.infer<typeof QueryParamsSchema>;\n\nexport const ResultsModeEnum = z.enum([\"all\", \"bestFit\", \"closestMatch\", \"favorites\", \"loading\"]);\nexport type ResultsMode = z.infer<typeof ResultsModeEnum>;\nexport const SortByEnum = z.enum([\"relevance\", \"newest\", \"priceLowToHigh\", \"priceHighToLow\"]);\nexport type SortBy = z.infer<typeof SortByEnum>;\n\n// App (standalone) persisted state\nexport const AppStoreDataSchema = z.object({\n data: z.record(UnitDataSchema),\n filters: FiltersSchema,\n tempFilters: FiltersSchema,\n apiFilters: QueryParamsSchema,\n resultsMode: ResultsModeEnum,\n propertySlug: z.string().nullable(),\n resolvedQuestionnaireValues: z.record(z.array(z.string())),\n sortBy: SortByEnum,\n});\nexport type AppStoreData = z.infer<typeof AppStoreDataSchema>;\n\n// Domain models (optional fields to mirror API shape without breaking)\n// Mirrors the backend Unit model with relaxed optional fields\nexport const UnitSchema = z.object({\n id: z.union([z.number().int(), z.string()]).optional(),\n title: z.string(),\n slug: z.string().nullable().optional(),\n bedrooms: z.coerce.number().nullable().optional(),\n bathrooms: z.coerce.number().nullable().optional(),\n cost: z.coerce.number().nullable().optional(),\n totalSqFt: z.coerce.number().nullable().optional(),\n propertyId: z.union([z.number().int(), z.string()]).optional(),\n isAvailable: z.boolean().optional(),\n createdAt: z.string().datetime().optional(),\n updatedAt: z.string().datetime().optional(),\n availability: z.string().datetime().nullable().optional(),\n unitSetAvailableOn: z.string().datetime().nullable().optional(),\n floorPlanId: z.union([z.number().int(), z.string()]).nullable().optional(),\n // Relations and nested structures kept loose to avoid coupling\n property: z.unknown().optional(),\n amenities: z.array(z.unknown()).optional(),\n highlights: z.array(z.unknown()).optional(),\n floorPlan: z.unknown().nullable().optional(),\n renderedStyle: z.array(z.unknown()).optional(),\n video: z.unknown().nullable().optional(),\n videoThumbnail: z.unknown().nullable().optional(),\n embedGif: z.unknown().nullable().optional(),\n userId: z.union([z.number().int(), z.string()]).optional(),\n user: z.unknown().optional(),\n status: z.string().optional(),\n externalId: z.string().nullable().optional(),\n unitRenderedStyles: z.array(z.unknown()).optional(),\n});\nexport type Unit = z.infer<typeof UnitSchema>;\n\n// Mirrors the backend Property model with relaxed optional fields\nexport const PropertySchema = z.object({\n id: z.union([z.number().int(), z.string()]),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n title: z.string(),\n slug: z.string().nullable().optional(),\n description: z.string(),\n contactName: z.string().nullable().optional(),\n contactEmail: z.string().optional(),\n contactPhone: z.string().nullable().optional(),\n notificationEmail: z.string().nullable().optional(),\n logo: z.unknown().nullable().optional(),\n leadMedia: z.unknown().nullable().optional(),\n overviewImages: z.array(z.unknown()).optional(),\n amenityImages: z.array(z.unknown()).optional(),\n street: z.string().optional(),\n city: z.string().optional(),\n state: z.string().nullable().optional(),\n ingestionFileName: z.string().nullable().optional(),\n zip: z.string().optional(),\n country: z.string().optional(),\n units: z.array(UnitSchema).optional(),\n amenities: z.array(z.unknown()).optional(),\n highlights: z.array(z.unknown()).optional(),\n externalServices: z.array(z.unknown()).optional(),\n userId: z.union([z.number().int(), z.string()]).optional(),\n user: z.unknown().optional(),\n status: z.string().optional(),\n floorPlans: z.array(z.unknown()).optional(),\n});\nexport type Property = z.infer<typeof PropertySchema>;\n\n// Mirrors the backend User model with relaxed optional fields\n// Named ApiUserSchema to avoid conflict with local UserSchema (uuid-only)\nexport const ApiUserSchema = z.object({\n id: z.union([z.number().int(), z.string()]).optional(),\n email: z.string().email().optional(),\n firstName: z.string().optional(),\n lastName: z.string().optional(),\n password: z.string().optional(),\n salt: z.string().optional(),\n role: z.string().optional(),\n Property: z.array(PropertySchema).optional(),\n Unit: z.array(UnitSchema).optional(),\n floorPlans: z.array(z.unknown()).optional(),\n createdAt: z.string().datetime().optional(),\n updatedAt: z.string().datetime().optional(),\n});\nexport type ApiUser = z.infer<typeof ApiUserSchema>;\n\n// Property-related schemas used by the PropertyStore and UnifiedStore\nexport const ViewedUnitSchema = z.object({\n unitId: z.string(),\n viewedDate: z.string(),\n});\nexport type ViewedUnit = z.infer<typeof ViewedUnitSchema>;\n\nexport const TourContactDataSchema = z.object({\n timezone: z.string().optional(),\n favouriteUnits: z.array(z.coerce.string()).optional(),\n preferences: z.record(z.unknown()).optional(),\n});\nexport type TourContactData = z.infer<typeof TourContactDataSchema>;\n\nexport const UserPropertyStateSchema = z.object({\n id: z.coerce.string(),\n slug: z.string(),\n favoritedUnits: z.array(z.string()),\n tourContactedOn: z.string().nullable(),\n viewedUnits: z.array(ViewedUnitSchema),\n questionnaireResults: z.unknown().nullable().optional(),\n tourContactData: TourContactDataSchema.nullable().optional(),\n // Full property payload persisted alongside per-property state\n data: PropertySchema.optional(),\n});\nexport type UserPropertyState = z.infer<typeof UserPropertyStateSchema>;\n\nexport const PropertyStoreDataSchema = z.object({\n data: z.record(UserPropertyStateSchema),\n propertySlug: z.string().nullable(),\n propertyId: z.string().nullable(),\n hasPreviouslySearched: z.array(z.string()),\n});\nexport type PropertyStoreData = z.infer<typeof PropertyStoreDataSchema>;\n\n// favorites\nexport const UnitFavoriteSchema = z.object({\n id: z.number().int(),\n userId: z.number().int(),\n unitId: z.number().int(),\n createdAt: z.string().datetime(),\n});\nexport type UnitFavorite = z.infer<typeof UnitFavoriteSchema>;\n\nexport const FavoritesSchema = z.object({\n // per-property favorites are stored under a KV key, so propertyId is implicit\n unitIds: z.array(z.string()),\n updatedAt: z.string().datetime(),\n});\nexport type Favorites = z.infer<typeof FavoritesSchema>;\n\n// Unified store schema (combines property + app persistent bits)\nexport const UnifiedStoreDataSchema = z.object({\n // Property-related data\n properties: z.record(UserPropertyStateSchema),\n currentPropertyId: z.string().nullable(),\n currentPropertySlug: z.string().nullable(),\n hasPreviouslySearched: z.array(z.string()),\n\n // App-level data\n unitResults: z.array(UnitSchema),\n filters: FiltersSchema,\n tempFilters: FiltersSchema,\n apiFilters: QueryParamsSchema,\n resultsMode: ResultsModeEnum,\n resolvedQuestionnaireValues: z.record(z.array(z.string())),\n sortBy: SortByEnum,\n});\nexport type UnifiedStoreData = z.infer<typeof UnifiedStoreDataSchema>;\n","import Dexie, { type Table } from \"dexie\";\nimport { SCHEMA_VERSION } from \"../schema\";\n\nexport interface KV {\n key: string;\n value: unknown;\n}\n\nexport interface OrmDexieTables {\n users: Table<any, string>;\n kv: Table<KV, string>;\n}\n\nexport class OrmDexie extends Dexie {\n users!: OrmDexieTables[\"users\"];\n kv!: OrmDexieTables[\"kv\"];\n\n constructor(name = \"inresi-orm\") {\n super(name);\n this.version(SCHEMA_VERSION).stores({\n users: \"uuid\",\n kv: \"key\",\n });\n\n this.users = this.table(\"users\");\n this.kv = this.table(\"kv\");\n }\n}\n","// src/validation.ts\nimport type { z } from \"zod\";\nimport { SchemaMismatchError } from \"./errors\";\n\nexport type ValidationMode = \"strict\" | \"warn\" | \"silent\";\nlet mode: ValidationMode = \"strict\";\nlet onIssue: ((ctx: string, details: unknown) => void) | undefined;\n\nexport function configureValidation(opts: {\n mode?: ValidationMode;\n onIssue?: (ctx: string, details: unknown) => void;\n}) {\n if (opts.mode) mode = opts.mode;\n onIssue = opts.onIssue;\n}\n\nexport function validate<T>(\n schema: z.ZodType<T>,\n value: unknown,\n ctx: string,\n): T | null {\n const res = schema.safeParse(value);\n if (res.success) return res.data;\n\n const details = res.error.flatten();\n onIssue?.(ctx, details);\n\n if (mode === \"strict\")\n throw new SchemaMismatchError(`ORM schema mismatch in ${ctx}`, details);\n if (mode === \"warn\") console.warn(`ORM schema mismatch in ${ctx}`, details); // eslint-disable-line no-console\n return null; // silent/warn → let caller decide how to proceed\n}\n","// src/db.ts\nimport { OrmDexie } from \"./adapters/dexie\";\nimport { OpenDBError } from \"./errors\";\nimport { SCHEMA_VERSION, UserSchema } from \"./schema\";\nimport {\n validate,\n configureValidation,\n type ValidationMode,\n} from \"./validation\";\nimport type { Table } from \"dexie\";\nimport { z } from \"zod\";\n\nconst MANIFEST_KEY = \"manifest\";\nconst ManifestSchema = z.object({ schemaVersion: z.number().int() });\ntype Manifest = z.infer<typeof ManifestSchema>;\n\nexport type OrmOptions = {\n dbName?: string;\n onReset?: (reason: \"incompatible\" | \"versionchange\" | \"blocked\") => void;\n onError?: (err: unknown) => void;\n validation?: {\n mode?: ValidationMode; // 'strict' | 'warn' | 'silent'\n onIssue?: (ctx: string, details: unknown) => void;\n validateReads?: boolean; // default: true\n dropInvalidOnRead?: boolean; // default: true (when validateReads)\n };\n};\n\nlet db: OrmDexie | null = null;\nlet openPromise: Promise<OrmDexie> | null = null;\n\n// Prevent double-installing hooks on the same instance\nconst VALIDATION_INSTALLED = Symbol(\"validationInstalled\");\n\nfunction installValidationHooks(\n instance: OrmDexie,\n vopts: OrmOptions[\"validation\"] | undefined,\n) {\n const anyDb = instance as any;\n if (anyDb[VALIDATION_INSTALLED]) return;\n anyDb[VALIDATION_INSTALLED] = true;\n\n const writeHook = <T>(table: Table<T, any>, schema: any, name: string) => {\n table.hook(\"creating\", (_pk, obj) => {\n const v = validate(schema, obj, `${name}.creating`);\n if (!v) throw new Error(`Rejected invalid ${name} on create`);\n return v as T; // allow coercion/stripping\n });\n table.hook(\"updating\", (mods, _pk, obj) => {\n const next = { ...(obj as any), ...(mods as any) };\n const v = validate(schema, next, `${name}.updating`);\n if (!v) return {}; // cancel update in warn/silent\n return mods;\n });\n };\n\n writeHook(instance.users, UserSchema, \"users\");\n\n const shouldValidateReads = vopts?.validateReads ?? true;\n if (shouldValidateReads) {\n const dropInvalid = vopts?.dropInvalidOnRead ?? true;\n const readHook = <T>(table: Table<T, any>, schema: any, name: string) => {\n table.hook(\"reading\", (obj) => {\n const v = validate(schema, obj, `${name}.reading`);\n if (v) return v;\n return dropInvalid ? undefined : obj; // pass-through if you prefer\n });\n };\n readHook(instance.users, UserSchema, \"users\");\n }\n}\n\nfunction isProbablyDev(): boolean {\n try {\n // @ts-ignore\n if (typeof import.meta !== \"undefined\" && import.meta.env)\n // @ts-ignore\n return !!import.meta.env.DEV;\n } catch {}\n try {\n if (typeof process !== \"undefined\" && process.env)\n return process.env.NODE_ENV !== \"production\";\n } catch {}\n return false;\n}\n\nexport async function getDB(opts: OrmOptions = {}): Promise<OrmDexie> {\n if (db) return db;\n if (openPromise) return openPromise;\n\n const name = opts.dbName ?? \"inresi-orm\";\n\n openPromise = (async () => {\n try {\n // Configure validation once per open\n const defaultMode: ValidationMode = isProbablyDev() ? \"warn\" : \"strict\";\n configureValidation({\n mode: opts.validation?.mode ?? defaultMode,\n onIssue: opts.validation?.onIssue,\n });\n\n const instance = new OrmDexie(name);\n\n // Multi-tab friendliness\n instance.on(\"versionchange\", () => {\n try {\n instance.close();\n } finally {\n opts.onReset?.(\"versionchange\");\n }\n });\n instance.on(\"blocked\", () => {\n opts.onReset?.(\"blocked\");\n });\n\n await instance.open();\n\n // Validate/initialize manifest\n const row = await instance.kv.get(MANIFEST_KEY);\n const saved = (row?.value ?? null) as unknown;\n\n if (!saved) {\n await instance.transaction(\"rw\", instance.kv, async () => {\n await instance.kv.put({\n key: MANIFEST_KEY,\n value: { schemaVersion: SCHEMA_VERSION },\n });\n });\n installValidationHooks(instance, opts.validation);\n db = instance;\n return instance;\n }\n\n const parsed = ManifestSchema.safeParse(saved as Manifest);\n if (!parsed.success || parsed.data.schemaVersion !== SCHEMA_VERSION) {\n await instance.delete();\n const fresh = new OrmDexie(name);\n fresh.on(\"versionchange\", () => {\n try {\n fresh.close();\n } finally {\n opts.onReset?.(\"versionchange\");\n }\n });\n fresh.on(\"blocked\", () => {\n opts.onReset?.(\"blocked\");\n });\n await fresh.open();\n await fresh.kv.put({\n key: MANIFEST_KEY,\n value: { schemaVersion: SCHEMA_VERSION },\n });\n installValidationHooks(fresh, opts.validation);\n opts.onReset?.(\"incompatible\");\n db = fresh;\n return fresh;\n }\n\n installValidationHooks(instance, opts.validation);\n db = instance;\n return instance;\n } catch (e) {\n opts.onError?.(e);\n throw new OpenDBError(\"Failed to open IndexedDB\", e);\n } finally {\n openPromise = null; // allow future reuse/retry\n }\n })();\n\n return openPromise;\n}\n\nexport async function resetDB(dbName?: string) {\n const name = dbName ?? \"inresi-orm\";\n if (db) {\n try {\n await db.close();\n } catch {\n /* ignore */\n }\n }\n const instance = new OrmDexie(name);\n await instance.delete();\n db = null;\n}\n","import { getDB } from \"../db\";\nimport { UserSchema, type User } from \"../schema\";\n\nconst USER_POINTER_KEY = \"user\";\n\nexport type IdGenerator = () => string;\nexport const defaultIdGenerator: IdGenerator = () =>\n typeof globalThis.crypto?.randomUUID === \"function\"\n ? globalThis.crypto.randomUUID()\n : (() => {\n const b =\n globalThis.crypto?.getRandomValues?.(new Uint8Array(16)) ??\n Uint8Array.from({ length: 16 }, () => (Math.random() * 256) | 0);\n b[6] = (b[6] & 0x0f) | 0x40; // v4\n b[8] = (b[8] & 0x3f) | 0x80; // variant\n const h = [...b].map((x) => x.toString(16).padStart(2, \"0\")).join(\"\");\n return `${h.slice(0, 8)}-${h.slice(8, 12)}-${h.slice(12, 16)}-${h.slice(16, 20)}-${h.slice(20)}`;\n })();\n\nconst getPointerUuid = (row: any) => row?.value?.useruuid ?? row?.value?.uuid;\n\nexport async function ensureUser(\n gen: IdGenerator = defaultIdGenerator,\n): Promise<User> {\n const db = await getDB();\n\n // Fast path\n const ptrUuid = getPointerUuid(await db.kv.get(USER_POINTER_KEY));\n if (ptrUuid) {\n const existing = await db.users.get(ptrUuid);\n if (existing) return UserSchema.parse(existing);\n }\n\n // Race-safe creation\n try {\n return await db.transaction(\"rw\", db.kv, db.users, async () => {\n const insideUuid = getPointerUuid(await db.kv.get(USER_POINTER_KEY));\n if (insideUuid) {\n const existing = await db.users.get(insideUuid);\n if (existing) return UserSchema.parse(existing);\n }\n\n const uuid = gen();\n await db.kv.add({ key: USER_POINTER_KEY, value: { useruuid: uuid } }); // claim pointer\n const newUser: User = UserSchema.parse({\n uuid,\n createdAt: new Date().toISOString(),\n });\n await db.users.add(newUser);\n return newUser;\n });\n } catch (e: any) {\n if (e?.name === \"ConstraintError\") {\n // Lost the race → read winner\n const uuid = getPointerUuid(await db.kv.get(USER_POINTER_KEY));\n if (uuid) {\n const winner = await db.users.get(uuid);\n if (winner) return UserSchema.parse(winner);\n }\n }\n throw e;\n }\n}\n\nexport const getUserUUID = async (gen?: IdGenerator) =>\n (await ensureUser(gen)).uuid;\n","import { getDB } from \"./db\";\n\nexport async function debugDump(): Promise<Record<string, unknown[]>> {\n const db = await getDB();\n const out: Record<string, unknown[]> = {};\n for (const t of db.tables) {\n out[t.name] = await t.toArray();\n }\n return out;\n}\n\nexport async function exportJSON(filename = \"inresi-orm-export.json\"): Promise<void> {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n throw new Error(\"exportJSON can only run in a browser.\");\n }\n const snapshot = await debugDump();\n const blob = new Blob([JSON.stringify(snapshot, null, 2)], { type: \"application/json\" });\n const a = document.createElement(\"a\");\n a.href = URL.createObjectURL(blob);\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(a.href);\n}\n","import { getDB } from \"./db\";\n\nexport interface AsyncStringStorage {\n getItem(name: string): Promise<string | null>;\n setItem(name: string, value: string): Promise<void>;\n removeItem(name: string): Promise<void>;\n}\n\ntype storeKeys = \"property\" | \"user\" | \"app\";\n\n// Generic typed KV helpers (store raw objects in the ORM's kv table)\nexport async function kvGet<T>(key: storeKeys): Promise<T | null> {\n const db = await getDB();\n const row = await db.kv.get(key);\n return (row?.value as T | undefined) ?? null;\n}\nexport async function kvSet<T>(key: storeKeys, value: T): Promise<void> {\n const db = await getDB();\n await db.kv.put({ key, value });\n}\nexport async function kvRemove(key: storeKeys): Promise<void> {\n const db = await getDB();\n await db.kv.delete(key);\n}\n\nexport function createORMStringStorage(opts?: {\n prefix?: string;\n fallbackToMemory?: boolean;\n}): AsyncStringStorage {\n const mem = new Map<string, string>(); // optional fallback\n const prefix = opts?.prefix ?? \"\";\n\n const toKey = (name: string) => `${prefix}${name}`;\n\n return {\n async getItem(name) {\n try {\n const db = await getDB();\n const row = await db.kv.get(toKey(name));\n return row ? JSON.stringify(row.value) : null;\n } catch (e) {\n if (opts?.fallbackToMemory) return mem.get(toKey(name)) ?? null;\n throw e;\n }\n },\n async setItem(name, value) {\n try {\n const db = await getDB();\n await db.kv.put({ key: toKey(name), value: JSON.parse(value) });\n } catch (e) {\n if (opts?.fallbackToMemory) {\n mem.set(toKey(name), value);\n return;\n }\n throw e;\n }\n },\n async removeItem(name) {\n try {\n const db = await getDB();\n await db.kv.delete(toKey(name));\n } catch (e) {\n if (opts?.fallbackToMemory) {\n mem.delete(toKey(name));\n return;\n }\n throw e;\n }\n },\n };\n}\n","// src/api/favourites.ts\nimport { getDB } from \"../db\";\nimport { ensureUser } from \"./users\";\nimport { FavoritesSchema } from \"../schema\";\n\nconst keyFor = (userId: string, propertyId: string) =>\n `favorites:${userId}:${propertyId}`;\n\nexport async function getFavoritedUnitsForProperty(\n propertyId: string | number,\n): Promise<string[]> {\n const db = await getDB();\n const { uuid } = await ensureUser();\n const key = keyFor(uuid, String(propertyId));\n const row = await db.kv.get(key);\n const parsed = row ? FavoritesSchema.safeParse(row.value) : null;\n return parsed?.success ? parsed.data.unitIds : [];\n}\n\nexport async function setFavoriteUnit(\n propertyId: string | number,\n unitId: string,\n on: boolean,\n): Promise<string[]> {\n const db = await getDB();\n const { uuid } = await ensureUser();\n const key = keyFor(uuid, String(propertyId));\n\n return db.transaction(\"rw\", db.kv, async () => {\n const row = await db.kv.get(key);\n const current =\n row && FavoritesSchema.safeParse(row.value).success\n ? (row!.value as any)\n : { unitIds: [] as string[], updatedAt: new Date().toISOString() };\n\n const nextSet = new Set<string>(current.unitIds);\n on ? nextSet.add(unitId) : nextSet.delete(unitId);\n\n const next = {\n unitIds: [...nextSet],\n updatedAt: new Date().toISOString(),\n };\n const validated = FavoritesSchema.parse(next);\n await db.kv.put({ key, value: validated });\n return validated.unitIds;\n });\n}\n\nexport async function toggleFavoriteUnit(\n propertyId: string | number,\n unitId: string,\n): Promise<string[]> {\n const current = await getFavoritedUnitsForProperty(propertyId);\n const on = !current.includes(unitId);\n return setFavoriteUnit(propertyId, unitId, on);\n}\n\nexport async function isUnitFavorited(\n propertyId: string | number,\n unitId: string,\n): Promise<boolean> {\n const list = await getFavoritedUnitsForProperty(propertyId);\n return list.includes(unitId);\n}\n","import { kvGet, kvSet } from \"../storage\";\nimport {\n ViewedUnitSchema,\n TourContactDataSchema,\n UserPropertyStateSchema,\n PropertyStoreDataSchema,\n type ViewedUnit,\n type TourContactData,\n type UserPropertyState,\n type PropertyStoreData,\n} from \"../schema\";\n\n// Re-export types for legacy import paths\nexport type { ViewedUnit, TourContactData, UserPropertyState, PropertyStoreData } from \"../schema\";\n\n// Default state\nconst defaultPropertyStoreData: PropertyStoreData = {\n data: {},\n propertySlug: null,\n propertyId: null,\n hasPreviouslySearched: [],\n};\n\n// Core property store API\nexport class PropertyStore {\n private async getState(): Promise<PropertyStoreData> {\n const state = await kvGet<PropertyStoreData>(\"property\");\n if (!state) return defaultPropertyStoreData;\n\n const normalized = {\n ...state,\n propertyId: state.propertyId == null ? null : String(state.propertyId),\n propertySlug: state.propertySlug ?? null,\n hasPreviouslySearched: Array.isArray(state.hasPreviouslySearched)\n ? state.hasPreviouslySearched.map(String)\n : [],\n };\n\n const parsed = PropertyStoreDataSchema.safeParse(normalized);\n if (parsed.success) return parsed.data;\n\n const sanitizedData = Object.entries(normalized.data ?? {}).reduce<\n Record<string, UserPropertyState>\n >((acc, [key, value]) => {\n const entry = UserPropertyStateSchema.safeParse(value);\n if (entry.success) acc[key] = entry.data;\n return acc;\n }, {});\n\n const fallbackState = {\n ...defaultPropertyStoreData,\n ...normalized,\n data: sanitizedData,\n };\n\n const fallbackParsed = PropertyStoreDataSchema.safeParse(fallbackState);\n return fallbackParsed.success ? fallbackParsed.data : defaultPropertyStoreData;\n }\n\n private async setState(updater: (state: PropertyStoreData) => PropertyStoreData): Promise<void> {\n const currentState = await this.getState();\n const newState = updater(currentState);\n const validatedState = PropertyStoreDataSchema.parse(newState);\n await kvSet(\"property\", validatedState);\n }\n\n // Basic state operations (legacy direct setters removed in vNext)\n\n async setHasPreviouslySearched(slug: string): Promise<void> {\n await this.setState(state => ({\n ...state,\n hasPreviouslySearched: Array.from(\n new Set([...state.hasPreviouslySearched, slug])\n ),\n }));\n }\n\n // Property-specific operations\n async setTourContactedOn(): Promise<void> {\n await this.setState(state => {\n const propertyId = state.propertyId;\n if (!propertyId) return state;\n\n const property = state.data[propertyId];\n if (!property) return state;\n\n return {\n ...state,\n data: {\n ...state.data,\n [propertyId]: {\n ...property,\n tourContactedOn: new Date().toISOString(),\n },\n },\n };\n });\n }\n\n async getTourContactedOn(): Promise<string | null> {\n const state = await this.getState();\n const propertyId = state.propertyId;\n if (!propertyId) return null;\n\n return state.data[propertyId]?.tourContactedOn ?? null;\n }\n\n async setQuestionnaireResults(results: unknown): Promise<void> {\n await this.setState(state => {\n const propertyId = state.propertyId;\n if (!propertyId) return state;\n\n const property = state.data[propertyId];\n if (!property) return state;\n\n return {\n ...state,\n data: {\n ...state.data,\n [propertyId]: {\n ...property,\n questionnaireResults: results,\n },\n },\n };\n });\n }\n\n async setTourContactData(data: TourContactData): Promise<void> {\n await this.setState(state => {\n const propertyId = state.propertyId;\n if (!propertyId) return state;\n\n const property = state.data[propertyId];\n if (!property) return state;\n\n return {\n ...state,\n data: {\n ...state.data,\n [propertyId]: {\n ...property,\n tourContactData: data,\n },\n },\n };\n });\n }\n\n async toggleFavorite(unitId: string): Promise<void> {\n await this.setState(state => {\n const propertyId = state.propertyId;\n if (!propertyId) return state;\n\n const property = state.data[propertyId];\n if (!property) return state;\n\n const isFavorited = property.favoritedUnits.includes(unitId);\n const updatedFavoritedUnits = isFavorited\n ? property.favoritedUnits.filter((id) => id !== unitId)\n : [...property.favoritedUnits, unitId];\n\n return {\n ...state,\n data: {\n ...state.data,\n [propertyId]: {\n ...property,\n favoritedUnits: updatedFavoritedUnits,\n },\n },\n };\n });\n }\n\n async markUnitAsViewed(unitId: string, slug: string): Promise<void> {\n const today = new Date();\n const formattedDate = `${String(today.getMonth() + 1).padStart(\n 2,\n \"0\"\n )}/${String(today.getDate()).padStart(2, \"0\")}`;\n\n await this.setState(state => {\n const propertyId = state.propertyId;\n if (!propertyId) return state;\n\n const property = state.data[propertyId];\n if (!property) return state;\n\n const updatedViewedUnits = [\n // Remove existing entry if it exists\n ...property.viewedUnits.filter((u) => u.unitId !== unitId),\n // Add updated one\n {\n unitId,\n viewedDate: formattedDate,\n },\n ];\n\n return {\n ...state,\n data: {\n ...state.data,\n [propertyId]: {\n ...property,\n viewedUnits: updatedViewedUnits,\n },\n },\n };\n });\n\n // Note: This opens a new window - you might want to handle this in the consuming app\n if (typeof window !== 'undefined') {\n window.open(`//${slug}`, \"_blank\");\n }\n }\n\n // Utility methods for getting specific data\n async getUnitState(unitId: string): Promise<{\n isFavorite: boolean;\n viewedDate: string;\n }> {\n const state = await this.getState();\n const property = state.propertyId ? state.data[state.propertyId] : null;\n\n return {\n isFavorite: property?.favoritedUnits.includes(unitId) ?? false,\n viewedDate:\n property?.viewedUnits.find((u) => u.unitId === unitId)?.viewedDate ?? \"\",\n };\n }\n\n async getPropertyData(propertyId?: string | number): Promise<UserPropertyState | null> {\n const state = await this.getState();\n const id = propertyId == null ? state.propertyId : String(propertyId);\n return id ? state.data[id] ?? null : null;\n }\n\n async getCurrentProperty(): Promise<UserPropertyState | null> {\n const state = await this.getState();\n return state.propertyId ? state.data[state.propertyId] ?? null : null;\n }\n\n async getFullState(): Promise<PropertyStoreData> {\n return this.getState();\n }\n\n // Initialize property if it doesn't exist\n async initializeProperty(propertyId: string | number, slug: string): Promise<void> {\n const id = String(propertyId);\n await this.setState(state => {\n if (state.data[id]) {\n return { ...state, propertyId: id, propertySlug: slug };\n }\n\n return {\n ...state,\n propertyId: id,\n propertySlug: slug,\n data: {\n ...state.data,\n [id]: {\n id,\n slug,\n favoritedUnits: [],\n tourContactedOn: null,\n viewedUnits: [],\n questionnaireResults: null,\n tourContactData: null,\n },\n },\n };\n });\n }\n}\n\n// Export singleton instance\nexport const propertyStore = new PropertyStore();\n","import { kvGet, kvSet } from \"../storage\";\nimport type { ZodObject, ZodType, ZodTypeAny } from \"zod\";\nimport {\n UnifiedStoreDataSchema,\n UserPropertyStateSchema,\n type UnifiedStoreData,\n type UserPropertyState,\n type Property,\n type Filters,\n type QueryParams,\n type ResultsMode,\n type SortBy,\n type TourContactData,\n type Unit,\n PropertySchema,\n TourContactDataSchema,\n UnitSchema,\n} from \"../schema\";\nimport { validate } from \"../validation\";\n\n// Default values\nconst defaultFilters: Filters = {\n availability: undefined,\n bedrooms: undefined,\n cost: undefined,\n highlights: undefined,\n};\n\nconst defaultUnifiedStoreData: UnifiedStoreData = {\n // Property data\n properties: {},\n currentPropertyId: null,\n currentPropertySlug: null,\n hasPreviouslySearched: [],\n\n // App data\n unitResults: [],\n filters: defaultFilters,\n tempFilters: defaultFilters,\n apiFilters: {\n limit: 10,\n page: 1,\n },\n resultsMode: \"all\",\n resolvedQuestionnaireValues: {},\n sortBy: \"relevance\",\n};\n\nconst toArray = (input: unknown): unknown[] => {\n if (input == null) return [];\n return Array.isArray(input) ? input : [input];\n};\n\nconst extractFilterValues = (value: unknown): unknown[] => {\n return toArray(value).flatMap(item => {\n if (item == null) return [];\n if (Array.isArray(item)) return item;\n if (typeof item === \"object\" && \"value\" in (item as any)) {\n const v = (item as any).value;\n return Array.isArray(v) ? v : v != null ? [v] : [];\n }\n return [item];\n });\n};\n\nconst toStringArray = (value: unknown): string[] =>\n extractFilterValues(value)\n .flatMap(v => (Array.isArray(v) ? v : [v]))\n .map(v => String(v))\n .map(v => v.trim())\n .filter(v => v.length > 0);\n\nconst toNumberArray = (value: unknown): number[] =>\n extractFilterValues(value)\n .map(v => {\n if (typeof v === \"number\" && Number.isFinite(v)) return v;\n const num = Number(v);\n return Number.isFinite(num) ? num : null;\n })\n .filter((v): v is number => v !== null);\n\nconst toNumberValue = (value: unknown): number | null => {\n if (value == null) return null;\n if (typeof value === \"number\") return Number.isFinite(value) ? value : null;\n if (typeof value === \"object\" && \"value\" in (value as any)) {\n return toNumberValue((value as any).value);\n }\n const num = Number(value);\n return Number.isFinite(num) ? num : null;\n};\n\n// Unified store class\nexport class UnifiedStore {\n private async getState(): Promise<UnifiedStoreData> {\n const state = await kvGet<UnifiedStoreData>(\"app\");\n if (!state) {\n return defaultUnifiedStoreData;\n }\n\n const merged = {\n ...defaultUnifiedStoreData,\n ...state,\n properties: state.properties ?? {},\n unitResults: state.unitResults ?? [],\n currentPropertyId:\n state.currentPropertyId == null ? null : String(state.currentPropertyId),\n currentPropertySlug: state.currentPropertySlug ?? null,\n hasPreviouslySearched: Array.isArray(state.hasPreviouslySearched)\n ? state.hasPreviouslySearched.map(String)\n : [],\n };\n\n const parsed = UnifiedStoreDataSchema.safeParse(merged);\n if (parsed.success) return parsed.data;\n\n // Sanitize by dropping invalid property entries and unit results\n const sanitizedProperties = Object.entries(merged.properties ?? {}).reduce<\n Record<string, UserPropertyState>\n >((acc, [key, value]) => {\n const entry = UserPropertyStateSchema.safeParse(value);\n if (entry.success) acc[key] = entry.data;\n return acc;\n }, {});\n\n const rawUnitResults = Array.isArray(merged.unitResults)\n ? merged.unitResults\n : merged.unitResults && typeof merged.unitResults === \"object\"\n ? Object.values(merged.unitResults as Record<string, unknown>)\n : [];\n\n const sanitizedUnitResults = rawUnitResults.reduce<Unit[]>((acc, value) => {\n const entry = UnitSchema.safeParse(value);\n if (entry.success) acc.push(entry.data);\n return acc;\n }, []);\n\n const fallback = {\n ...merged,\n properties: sanitizedProperties,\n unitResults: sanitizedUnitResults,\n };\n\n const fallbackParsed = UnifiedStoreDataSchema.safeParse(fallback);\n return fallbackParsed.success ? fallbackParsed.data : defaultUnifiedStoreData;\n }\n\n private async setState(updater: (state: UnifiedStoreData) => UnifiedStoreData): Promise<void> {\n const currentState = await this.getState();\n const newState = updater(currentState);\n const validatedState = UnifiedStoreDataSchema.parse(newState);\n await kvSet(\"app\", validatedState);\n }\n\n // === PROPERTY OPERATIONS ===\n\n async initializeProperty(propertyId: string | number, slug: string): Promise<void> {\n const id = String(propertyId);\n await this.setState(state => {\n if (state.properties && state.properties[id]) {\n return {\n ...state,\n currentPropertyId: id,\n currentPropertySlug: slug\n };\n }\n\n return {\n ...state,\n currentPropertyId: id,\n currentPropertySlug: slug,\n properties: {\n ...state.properties,\n [id]: {\n id,\n slug,\n favoritedUnits: [],\n tourContactedOn: null,\n viewedUnits: [],\n questionnaireResults: null,\n tourContactData: null,\n },\n },\n };\n });\n }\n\n // === UNIT RESULTS CACHE ===\n async setUnitResults(\n units: unknown,\n schema?: ZodTypeAny,\n ): Promise<void> {\n const baseSchema = (schema ?? UnitSchema) as ZodType<Unit>;\n const validatedUnits: Unit[] = [];\n const collection = Array.isArray(units)\n ? units\n : units && typeof units === \"object\"\n ? Object.values(units as Record<string, unknown>)\n : [];\n\n collection.forEach((unit, index) => {\n const parsed = validate(baseSchema, unit, `unitResults[${index}]`);\n if (parsed) validatedUnits.push(parsed);\n });\n await this.setState(state => ({\n ...state,\n unitResults: validatedUnits,\n }));\n }\n\n async clearUnitResults(): Promise<void> {\n await this.setState(state => ({\n ...state,\n unitResults: [],\n }));\n }\n\n // === PROPERTY DATA BAG (full property payloads & custom data) ===\n async setPropertyData(\n propertyId: string | number,\n data: unknown,\n schema?: ZodObject<any, any, any, any, any>,\n ): Promise<void> {\n const id = String(propertyId);\n const baseSchema = (schema ?? PropertySchema) as ZodObject<any, any, any, any, any>;\n await this.setState(state => {\n const property = state.properties[id];\n if (!property) return state;\n const validated = validate(baseSchema, data, `properties.${id}.data`) as Property | null;\n if (!validated) return state;\n return {\n ...state,\n properties: {\n ...state.properties,\n [id]: {\n ...property,\n data: validated,\n },\n },\n };\n });\n }\n\n async mergePropertyData(\n propertyId: string | number,\n partial: unknown,\n schema?: ZodObject<any, any, any, any, any>,\n ): Promise<void> {\n const id = String(propertyId);\n const baseSchema = (schema ?? PropertySchema) as ZodObject<any, any, any, any, any>;\n await this.setState(state => {\n const property = state.properties[id];\n if (!property) return state;\n const current = property.data;\n if (!current) {\n const full = validate(baseSchema, partial, `properties.${id}.data`) as Property | null;\n if (!full) return state;\n return {\n ...state,\n properties: {\n ...state.properties,\n [id]: {\n ...property,\n data: full,\n },\n },\n };\n }\n\n const partialSchema = baseSchema.partial();\n const validatedPartial = validate(\n partialSchema,\n partial,\n `properties.${id}.data.partial`,\n ) as Partial<Property> | null;\n if (!validatedPartial) return state;\n const merged = validate(\n baseSchema,\n { ...current, ...validatedPartial },\n `properties.${id}.data`,\n ) as Property | null;\n if (!merged) return state;\n return {\n ...state,\n properties: {\n ...state.properties,\n [id]: {\n ...property,\n data: merged,\n },\n },\n };\n });\n }\n\n // Accepts a full API property object, validates, and stores it into the\n // per-property `data` bag. Ensures the property entry exists/updated.\n async upsertPropertyFromApi(\n apiProperty: unknown,\n schema?: ZodTypeAny,\n ): Promise<void> {\n const s = schema ?? PropertySchema;\n const parsed: any = s.parse(apiProperty);\n const id = parsed.id ?? parsed.propertyId;\n if (id === undefined || id === null) {\n throw new Error(\"upsertPropertyFromApi: property id is required\");\n }\n const propertyId = String(id);\n const slug: string | undefined = parsed.slug ?? undefined;\n\n await this.setState(state => {\n const existing = state.properties[propertyId];\n const next: UserPropertyState = existing\n ? {\n ...existing,\n ...(slug ? { slug } : {}),\n data: parsed,\n }\n : {\n id: propertyId,\n slug: slug ?? \"\",\n favoritedUnits: [],\n tourContactedOn: null,\n viewedUnits: [],\n questionnaireResults: null,\n tourContactData: null,\n data: parsed,\n };\n\n return {\n ...state,\n properties: {\n ...state.properties,\n [propertyId]: next,\n },\n };\n });\n }\n\n async setCurrentProperty(propertyId: string | number, slug?: string): Promise<void> {\n const id = String(propertyId);\n await this.setState(state => ({\n ...state,\n currentPropertyId: id,\n currentPropertySlug: slug || state.currentPropertySlug,\n }));\n }\n\n async setCurrentPropertySlug(slug: string): Promise<void> {\n await this.setState(state => ({\n ...state,\n currentPropertySlug: slug\n }));\n }\n\n async setHasPreviouslySearched(slug: string): Promise<void> {\n await this.setState(state => ({\n ...state,\n hasPreviouslySearched: Array.from(\n new Set([...state.hasPreviouslySearched, slug])\n ),\n }));\n }\n\n async toggleFavorite(unitId: string): Promise<void> {\n await this.setState(state => {\n const propertyId = state.currentPropertyId;\n if (!propertyId) return state;\n\n const property = state.properties[propertyId];\n if (!property) return state;\n\n const isFavorited = property.favoritedUnits.includes(unitId);\n const updatedFavoritedUnits = isFavorited\n ? property.favoritedUnits.filter((id) => id !== unitId)\n : [...property.favoritedUnits, unitId];\n\n return {\n ...state,\n properties: {\n ...state.properties,\n [propertyId]: {\n ...property,\n favoritedUnits: updatedFavoritedUnits,\n },\n },\n };\n });\n }\n\n async markUnitAsViewed(unitId: string, slug: string): Promise<void> {\n const today = new Date();\n const formattedDate = `${String(today.getMonth() + 1).padStart(\n 2,\n \"0\"\n )}/${String(today.getDate()).padStart(2, \"0\")}`;\n\n await this.setState(state => {\n const propertyId = state.currentPropertyId;\n if (!propertyId) return state;\n\n const property = state.properties[propertyId];\n if (!property) return state;\n\n const updatedViewedUnits = [\n ...property.viewedUnits.filter((u) => u.unitId !== unitId),\n { unitId, viewedDate: formattedDate },\n ];\n\n return {\n ...state,\n properties: {\n ...state.properties,\n [propertyId]: {\n ...property,\n viewedUnits: updatedViewedUnits,\n },\n },\n };\n });\n\n if (typeof window !== 'undefined') {\n window.open(`//${slug}`, \"_blank\");\n }\n }\n\n async setTourContactedOn(): Promise<void> {\n await this.setState(state => {\n const propertyId = state.currentPropertyId;\n if (!propertyId) return state;\n\n const property = state.properties[propertyId];\n if (!property) return state;\n\n return {\n ...state,\n properties: {\n ...state.properties,\n [propertyId]: {\n ...property,\n tourContactedOn: new Date().toISOString(),\n },\n },\n };\n });\n }\n\n async getTourContactedOn(): Promise<string | null> {\n const state = await this.getState();\n const propertyId = state.currentPropertyId;\n if (!propertyId) return null;\n\n return state.properties[propertyId]?.tourContactedOn ?? null;\n }\n\n async setQuestionnaireResults(results: unknown): Promise<void> {\n await this.setState(state => {\n const propertyId = state.currentPropertyId;\n if (!propertyId) return state;\n\n const property = state.properties[propertyId];\n if (!property) return state;\n\n return {\n ...state,\n properties: {\n ...state.properties,\n [propertyId]: {\n ...property,\n questionnaireResults: results,\n },\n },\n };\n });\n }\n\n async setTourContactData(data: TourContactData): Promise<void> {\n await this.setState(state => {\n const propertyId = state.currentPropertyId;\n if (!propertyId) return state;\n\n const property = state.properties[propertyId];\n if (!property) return state;\n\n return {\n ...state,\n properties: {\n ...state.properties,\n [propertyId]: {\n ...property,\n tourContactData: data,\n },\n },\n };\n });\n }\n\n\n\n\n\n\n\n // === FILTER OPERATIONS ===\n\n async setFilters(filters: Partial<Filters>): Promise<void> {\n await this.setState(state => ({\n ...state,\n filters: { ...state.filters, ...filters }\n }));\n }\n\n async setTempFilters(filters: Partial<Filters>): Promise<void> {\n await this.setState(state => ({\n ...state,\n tempFilters: { ...state.tempFilters, ...filters }\n }));\n }\n\n async setFiltersToDefault(): Promise<void> {\n await this.setState(state => ({ ...state, filters: defaultFilters }));\n }\n\n async setApiFilters(filters: Partial<QueryParams>): Promise<void> {\n await this.setState(state => ({\n ...state,\n apiFilters: { ...state.apiFilters, ...filters }\n }));\n }\n\n async handleTempFilterChange<K extends keyof Filters>(\n key: K,\n value: Filters[K]\n ): Promise<void> {\n await this.setState(state => ({\n ...state,\n tempFilters: { ...state.tempFilters, [key]: value }\n }));\n }\n\n async submitFilterUpdate(): Promise<void> {\n await this.setState(state => {\n const apiParams: QueryParams = {\n ...state.apiFilters,\n availability: toStringArray(state.filters.availability),\n bedrooms: toNumberArray(state.filters.bedrooms),\n cost: toNumberValue(state.filters.cost),\n highlights: toStringArray(state.filters.highlights),\n };\n\n return {\n ...state,\n apiFilters: apiParams,\n };\n });\n }\n\n // === RESULTS AND SORTING ===\n\n async setResultsMode(mode: ResultsMode): Promise<void> {\n await this.setState(state => ({ ...state, resultsMode: mode }));\n }\n\n async setSortBy(sortBy: SortBy): Promise<void> {\n await this.setState(state => ({ ...state, sortBy }));\n }\n\n // === QUESTIONNAIRE ===\n\n async setResolvedQuestionnaireValues(name: string, values: string[]): Promise<void> {\n await this.setState(state => ({\n ...state,\n resolvedQuestionnaireValues: {\n ...state.resolvedQuestionnaireValues,\n [name]: values\n }\n }));\n }\n\n // === UTILITY METHODS ===\n\n async getUnitState(unitId: string): Promise<{\n isFavorite: boolean;\n viewedDate: string;\n }> {\n const state = await this.getState();\n const property = state.currentPropertyId ? state.properties[state.currentPropertyId] : null;\n\n return {\n isFavorite: property?.favoritedUnits.includes(unitId) ?? false,\n viewedDate:\n property?.viewedUnits.find((u) => u.unitId === unitId)?.viewedDate ?? \"\",\n };\n }\n\n async getResultsUrl(): Promise<string | null> {\n const state = await this.getState();\n return state.currentPropertySlug ? `/${state.currentPropertySlug}/results` : null;\n }\n\n async getCurrentProperty(): Promise<UserPropertyState | null> {\n const state = await this.getState();\n return state.currentPropertyId ? state.properties[state.currentPropertyId] ?? null : null;\n }\n\n async getPropertyData(propertyId?: string | number): Promise<UserPropertyState | null> {\n const state = await this.getState();\n const id = propertyId == null ? state.currentPropertyId : String(propertyId);\n return id ? state.properties[id] ?? null : null;\n }\n\n async getFullState(): Promise<UnifiedStoreData> {\n return this.getState();\n }\n\n async initialize(): Promise<void> {\n // Ensure default shape is present; no-op if already initialized\n await this.setState(state => ({ ...defaultUnifiedStoreData, ...state }));\n }\n\n}\n\n// Export singleton instance\nexport const store = new UnifiedStore();\n// Alias to prefer neutral naming going forward\nexport { UnifiedStore as Store };\n// Re-export types for convenience (tests import from this module)\nexport type { UserPropertyState, Filters } from \"../schema\";\n","/**\n * Zustand adapter (flat API)\n *\n * This file exposes a flat, unified Zustand store that mirrors the underlying\n * ORM store and keeps React state in sync. It is the low-level bridge.\n *\n * For a friendlier, domain-grouped API, use `createStructuredStore` from\n * `./structured-store`, which wraps this adapter and exposes nested actions\n * like `property.unit.favorites.toggle`, `filters.set`, etc.\n */\nimport { store } from \"../stores/store\";\nimport type { UnifiedStoreData, UserPropertyState, Filters, QueryParams, ResultsMode, SortBy, TourContactData, Unit } from \"../schema\";\n\n// Unified Zustand store interface\nexport interface ZustandUnifiedStoreState {\n // Property data\n properties: Record<string, UserPropertyState>;\n currentPropertyId: string | null;\n currentPropertySlug: string | null;\n hasPreviouslySearched: string[];\n\n // App data\n unitResults: Unit[];\n filters: Filters;\n tempFilters: Filters;\n apiFilters: QueryParams;\n resultsMode: ResultsMode;\n resolvedQuestionnaireValues: Record<string, string[]>;\n sortBy: SortBy;\n filtersLoaded: boolean;\n\n // === PROPERTY OPERATIONS ===\n initializeProperty: (propertyId: string, slug: string) => Promise<void>;\n setCurrentProperty: (propertyId: string, slug?: string) => Promise<void>;\n setCurrentPropertySlug: (slug: string) => Promise<void>;\n setHasPreviouslySearched: (slug: string) => Promise<void>;\n toggleFavorite: (unitId: string) => Promise<void>;\n markUnitAsViewed: (unitId: string, slug: string) => Promise<void>;\n setTourContactedOn: () => Promise<void>;\n getTourContactedOn: () => Promise<string | null>;\n setQuestionnaireResults: (results: unknown) => Promise<void>;\n setTourContactData: (data: TourContactData) => Promise<void>;\n setUnitResults: (units: unknown) => Promise<void>;\n clearUnitResults: () => Promise<void>;\n\n\n // === FILTER OPERATIONS ===\n setFilters: (filters: Partial<Filters>) => Promise<void>;\n setTempFilters: (filters: Partial<Filters>) => Promise<void>;\n setFiltersToDefault: () => Promise<void>;\n setApiFilters: (filters: Partial<QueryParams>) => Promise<void>;\n handleTempFilterChange: <K extends keyof Filters>(key: K, value: Filters[K]) => Promise<void>;\n submitFilterUpdate: () => Promise<void>;\n\n // === RESULTS AND SORTING ===\n setResultsMode: (mode: ResultsMode) => Promise<void>;\n setSortBy: (sortBy: SortBy) => Promise<void>;\n\n // === QUESTIONNAIRE ===\n setResolvedQuestionnaireValues: (name: string, values: string[]) => Promise<void>;\n\n // === UTILITY METHODS ===\n getUnitState: (unitId: string) => {\n isFavorite: boolean;\n viewedDate: string;\n };\n getResultsUrl: () => Promise<string | null>;\n getCurrentProperty: () => Promise<UserPropertyState | null>;\n getPropertyData: (propertyId?: string) => Promise<UserPropertyState | null>;\n\n // === INTERNAL ===\n _hydrate: () => Promise<void>;\n _initialize: () => Promise<void>;\n}\n\n/**\n * @deprecated For new apps, use `createStructuredStore` from `./structured-store`.\n * This flat adapter remains for migration/advanced cases.\n */\nexport function createZustandUnifiedStore(options?: {\n onFilterUpdate?: (apiParams: QueryParams) => void;\n}) {\n return (set: any, get: any): ZustandUnifiedStoreState => {\n // Helper to update local state after ORM operations\n const syncState = async () => {\n const ormState = await store.getFullState();\n set({\n properties: ormState.properties,\n currentPropertyId: ormState.currentPropertyId,\n currentPropertySlug: ormState.currentPropertySlug,\n hasPreviouslySearched: ormState.hasPreviouslySearched,\n unitResults: ormState.unitResults,\n filters: ormState.filters,\n tempFilters: ormState.tempFilters,\n apiFilters: ormState.apiFilters,\n resultsMode: ormState.resultsMode,\n resolvedQuestionnaireValues: ormState.resolvedQuestionnaireValues,\n sortBy: ormState.sortBy,\n });\n };\n\n // Helper to notify of filter updates\n const notifyFilterUpdate = async () => {\n if (options?.onFilterUpdate) {\n const apiFilters = (await store.getFullState()).apiFilters;\n options.onFilterUpdate(apiFilters);\n }\n };\n\n return {\n // Initial state\n properties: {},\n currentPropertyId: null,\n currentPropertySlug: null,\n hasPreviouslySearched: [],\n unitResults: [],\n filters: {\n availability: undefined,\n bedrooms: undefined,\n cost: undefined,\n highlights: undefined,\n },\n tempFilters: {\n availability: undefined,\n bedrooms: undefined,\n cost: undefined,\n highlights: undefined,\n },\n apiFilters: {\n limit: 10,\n page: 1,\n },\n resultsMode: \"all\",\n resolvedQuestionnaireValues: {},\n sortBy: \"relevance\",\n filtersLoaded: false,\n\n // === PROPERTY OPERATIONS ===\n async initializeProperty(propertyId, slug) {\n await store.initializeProperty(propertyId, slug);\n await syncState();\n },\n\n async setCurrentProperty(propertyId, slug) {\n await store.setCurrentProperty(propertyId, slug);\n set({\n currentPropertyId: propertyId,\n ...(slug && { currentPropertySlug: slug })\n });\n },\n\n async setCurrentPropertySlug(slug) {\n await store.setCurrentPropertySlug(slug);\n set({ currentPropertySlug: slug });\n },\n\n async setHasPreviouslySearched(slug) {\n await store.setHasPreviouslySearched(slug);\n await syncState();\n },\n\n async toggleFavorite(unitId) {\n await store.toggleFavorite(unitId);\n await syncState();\n },\n\n async markUnitAsViewed(unitId, slug) {\n await store.markUnitAsViewed(unitId, slug);\n await syncState();\n },\n\n async setTourContactedOn() {\n await store.setTourContactedOn();\n await syncState();\n },\n\n getTourContactedOn: store.getTourContactedOn.bind(store),\n\n async setQuestionnaireResults(results) {\n await store.setQuestionnaireResults(results);\n await syncState();\n },\n\n async setTourContactData(data) {\n await store.setTourContactData(data);\n await syncState();\n },\n\n async setUnitResults(units) {\n await store.setUnitResults(units);\n await syncState();\n },\n\n async clearUnitResults() {\n await store.clearUnitResults();\n await syncState();\n },\n\n\n // === FILTER OPERATIONS ===\n async setFilters(filters) {\n await store.setFilters(filters);\n const state = get();\n set({ filters: { ...state.filters, ...filters } });\n },\n\n async setTempFilters(filters) {\n await store.setTempFilters(filters);\n const state = get();\n set({ tempFilters: { ...state.tempFilters, ...filters } });\n },\n\n async setFiltersToDefault() {\n await store.setFiltersToDefault();\n const defaultFilters = {\n availability: undefined,\n bedrooms: undefined,\n cost: undefined,\n highlights: undefined,\n };\n set({ filters: defaultFilters });\n },\n\n async setApiFilters(filters) {\n await store.setApiFilters(filters);\n const state = get();\n set({ apiFilters: { ...state.apiFilters, ...filters } });\n },\n\n async handleTempFilterChange(key, value) {\n await store.handleTempFilterChange(key, value);\n const state = get();\n set({ tempFilters: { ...state.tempFilters, [key]: value } });\n },\n\n async submitFilterUpdate() {\n await store.submitFilterUpdate();\n await syncState();\n await notifyFilterUpdate();\n },\n\n // === RESULTS AND SORTING ===\n async setResultsMode(mode) {\n await store.setResultsMode(mode);\n set({ resultsMode: mode });\n },\n\n async setSortBy(sortBy) {\n await store.setSortBy(sortBy);\n set({ sortBy });\n },\n\n // === QUESTIONNAIRE ===\n async setResolvedQuestionnaireValues(name, values) {\n await store.setResolvedQuestionnaireValues(name, values);\n const state = get();\n set({\n resolvedQuestionnaireValues: {\n ...state.resolvedQuestionnaireValues,\n [name]: values,\n }\n });\n },\n\n // === UTILITY METHODS ===\n getUnitState(unitId: string) {\n const state = get();\n const property = state.currentPropertyId ? state.properties[state.currentPropertyId] : null;\n\n return {\n isFavorite: property?.favoritedUnits.includes(unitId) ?? false,\n viewedDate:\n property?.viewedUnits.find((u: any) => u.unitId === unitId)?.viewedDate ?? \"\",\n };\n },\n\n getResultsUrl: store.getResultsUrl.bind(store),\n getCurrentProperty: store.getCurrentProperty.bind(store),\n getPropertyData: store.getPropertyData.bind(store),\n\n // === INTERNAL ===\n async _hydrate() {\n await syncState();\n },\n\n async _initialize() {\n await store.initialize();\n await syncState();\n set({ filtersLoaded: true });\n },\n };\n };\n}\n\n// Helper hook factory for unit state\nexport function createUseUnitState() {\n return (useStore: any) => (unitId: string) =>\n useStore((state: ZustandUnifiedStoreState) => state.getUnitState(unitId));\n}\n\n// Export types for consuming apps\nexport type { UnitData, UserPropertyState, Filters, QueryParams, ResultsMode, SortBy, TourContactData, Unit } from \"../schema\";\n\n// Intentionally no alias exports in vNext; use `createStructuredStore` or `createZustandUnifiedStore` explicitly.\n","/**\n * Structured store wrapper (preferred DX)\n *\n * This layer wraps the flat Zustand adapter with domain‑grouped actions\n * for a more discoverable API in apps. It does not add new behavior —\n * it simply organizes calls like:\n * - `property.unit.favorites.toggle` → `toggleFavorite`\n * - `property.unit.viewed.mark` → `markUnitAsViewed`\n * - `filters.set/submit/...` → filter methods\n */\nimport {\n type ZustandUnifiedStoreState,\n createZustandUnifiedStore,\n type Filters,\n type UnitData,\n type TourContactData,\n type QueryParams\n} from \"./zustand-store\";\n\nexport interface StructuredStoreActions {\n property: {\n unit: {\n favorites: {\n toggle: (unitId: string) => Promise<void>;\n };\n viewed: {\n mark: (unitId: string, slug: string) => Promise<void>;\n };\n };\n questionnaire: {\n setResults: (results: unknown) => Promise<void>;\n };\n tour: {\n setContactedOn: () => Promise<void>;\n getContactedOn: () => Promise<string | null>;\n setContactData: (data: TourContactData) => Promise<void>;\n };\n };\n\n filters: {\n set: (filters: Partial<Filters>) => Promise<void>;\n setTemp: (filters: Partial<Filters>) => Promise<void>;\n setToDefault: () => Promise<void>;\n commitTemp: <K extends keyof Filters>(key: K, defaultValue: Filters[K]) => Promise<void>;\n commitAvailability: () => Promise<void>;\n submit: () => Promise<void>;\n };\n}\n\nexport function createStructuredStoreActions(store: ZustandUnifiedStoreState, get?: () => ZustandUnifiedStoreState): StructuredStoreActions {\n return {\n property: {\n unit: {\n favorites: {\n toggle: store.toggleFavorite.bind(store),\n },\n viewed: {\n mark: store.markUnitAsViewed.bind(store),\n },\n },\n questionnaire: {\n setResults: store.setQuestionnaireResults.bind(store),\n },\n tour: {\n setContactedOn: store.setTourContactedOn.bind(store),\n getContactedOn: store.getTourContactedOn.bind(store),\n setContactData: store.setTourContactData.bind(store),\n },\n },\n filters: {\n set: store.setFilters.bind(store),\n setTemp: store.setTempFilters.bind(store),\n setToDefault: store.setFiltersToDefault.bind(store),\n commitTemp: async (key, defaultValue) => {\n const state = get ? get() : (store as unknown as ZustandUnifiedStoreState);\n const value = (state.tempFilters as Filters)[key] ?? defaultValue;\n await store.handleTempFilterChange(key, value as any);\n await store.submitFilterUpdate();\n },\n commitAvailability: async () => {\n await store.submitFilterUpdate();\n },\n submit: store.submitFilterUpdate.bind(store),\n },\n };\n}\n\nexport type StructuredStore = ZustandUnifiedStoreState & StructuredStoreActions;\n\nexport function createStructuredStore(options?: {\n onFilterUpdate?: (apiParams: QueryParams) => void;\n}) {\n return (set: any, get: any): StructuredStore => {\n const baseStore = createZustandUnifiedStore(options)(set, get);\n const actions = createStructuredStoreActions(baseStore, get);\n\n return {\n ...baseStore,\n ...actions,\n };\n };\n}\n","// src/units/favorites.ts\nimport * as api from \"../api/favorites\";\n\nconst favorites = {\n async isFavorite(propertyId: string | number, unitId: string): Promise<boolean> {\n return api.isUnitFavorited(propertyId, unitId);\n },\n async toggle(propertyId: string | number, unitId: string): Promise<string[]> {\n return api.toggleFavoriteUnit(propertyId, unitId);\n },\n async set(propertyId: string | number, unitId: string, on: boolean): Promise<string[]> {\n return api.setFavoriteUnit(propertyId, unitId, on);\n },\n async getAll(propertyId: string | number): Promise<string[]> {\n return api.getFavoritedUnitsForProperty(propertyId);\n },\n};\n\nexport {favorites}\n","export const DEFAULT_WEB_ORIGIN = \"//web.inresiapp.com\";\nexport const DEFAULT_PLACEHOLDER_IMAGE = \"/placeholder.jpg\";\n\nexport interface UnitImageApiResponse {\n CFURL?: string;\n name?: string;\n signature?: string;\n}\n\nexport interface UnitSourceApiResponse extends Record<string, unknown> {\n id?: number | string;\n name?: string;\n title?: string;\n slug?: string;\n cost?: number;\n bedrooms?: number;\n bathrooms?: number;\n totalSqFt?: number;\n amenities?: unknown;\n highlights?: unknown;\n availability?: string | Date | null;\n image?: UnitImageApiResponse;\n additionalImages?: UnitImageApiResponse[];\n}\n\nexport interface UnitHitApiResponse<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> {\n _index?: string;\n _id?: string;\n _score?: number;\n _source?: Source;\n}\n\nexport interface UnitsTotalInfo {\n value: number;\n relation?: string;\n}\n\nexport interface UnitsDataApiResponse<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> {\n total?: UnitsTotalInfo;\n max_score?: number | null;\n hits?: UnitHitApiResponse<Source>[];\n type?: string;\n}\n\nexport interface UnitsApiResponse<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> {\n data: UnitsDataApiResponse<Source>;\n}\n\nexport type TransformedUnit<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> = Source & {\n title: string;\n slug: string;\n imageUrl: string;\n secondaryImageUrl?: string;\n tertiaryImageUrl?: string;\n};\n\nexport interface UnitsClientList<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> {\n total: number;\n maxScore: number | null;\n type: string;\n hits: TransformedUnit<Source>[];\n}\n\nexport interface TransformUnitsOptions {\n origin?: string;\n placeholderImage?: string;\n}\n\nconst normalizeSignature = (signature?: string): string => {\n if (!signature) return \"\";\n return signature.startsWith(\"?\") ? signature : `?${signature}`;\n};\n\nexport const buildExploreUrl = (\n unitSlug: string,\n propertySlug: string,\n origin = DEFAULT_WEB_ORIGIN,\n): string => `${origin}/${propertySlug}/unit/${unitSlug}/explore`;\n\nexport const buildImageUrl = (\n image?: UnitImageApiResponse,\n placeholder = DEFAULT_PLACEHOLDER_IMAGE,\n): string => {\n if (!image?.CFURL || !image?.name || !image?.signature) return placeholder;\n return `${image.CFURL}${image.name}${normalizeSignature(image.signature)}`;\n};\n\nexport function transformUnitsApiResponse<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n>(apiResponse: UnitsDataApiResponse<Source>): UnitsApiResponse<Source> {\n return { data: apiResponse };\n}\n\nexport function transformUnitsApiResponseToClient<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n>(\n apiResponse: UnitsDataApiResponse<Source>,\n propertySlug: string,\n options?: TransformUnitsOptions,\n): UnitsClientList<Source> {\n const origin = options?.origin ?? DEFAULT_WEB_ORIGIN;\n const placeholderImage = options?.placeholderImage ?? DEFAULT_PLACEHOLDER_IMAGE;\n\n const hits =\n apiResponse.hits?.map((hit) => {\n const source = (hit._source ?? {}) as Source & UnitSourceApiResponse;\n const title =\n typeof source.name === \"string\"\n ? source.name\n : typeof source.title === \"string\"\n ? source.title\n : \"\";\n\n const normalized: TransformedUnit<Source> = {\n ...(source as Source),\n title,\n slug: buildExploreUrl(String(source.slug ?? \"\"), propertySlug, origin),\n imageUrl: buildImageUrl(source.image, placeholderImage),\n secondaryImageUrl: buildImageUrl(source.additionalImages?.[0], placeholderImage),\n tertiaryImageUrl: buildImageUrl(source.additionalImages?.[1], placeholderImage),\n };\n\n return normalized;\n }) ?? [];\n\n return {\n total: apiResponse.total?.value ?? hits.length,\n maxScore: apiResponse.max_score ?? null,\n type: apiResponse.type ?? \"units\",\n hits,\n };\n}\n\nexport interface UnitsFilterParams {\n availability?: string[];\n bedrooms?: (number | string)[];\n cost?: number | null;\n highlights?: string[];\n}\n\nexport interface UnitsClientFilters {\n availability?: string[];\n bedrooms?: string[];\n cost?: number;\n highlights: string[];\n}\n\nconst reverseAvailabilityMap: Record<string, string> = {\n asap: \"ASAP\",\n next_month: \"Next Month\",\n \"2_3_months\": \"2-3 Months\",\n all: \"Just Browsing\",\n};\n\nconst reverseBedroomMap: Record<number, string> = {\n 0: \"Studio\",\n 1: \"1 Bed\",\n 2: \"2 Bed\",\n 3: \"3+ Bed\",\n};\n\nconst bedroomLabels = new Set(Object.values(reverseBedroomMap));\n\nconst normalizeBedrooms = (\n bedrooms?: (number | string)[],\n): string[] | undefined => {\n if (!bedrooms || bedrooms.length === 0) return undefined;\n\n const result = new Set<string>();\n\n for (const bedroom of bedrooms) {\n if (typeof bedroom === \"number\") {\n const label = reverseBedroomMap[bedroom];\n if (label) result.add(label);\n continue;\n }\n\n const values = bedroom.split(\",\").map((v) => v.trim());\n\n for (const value of values) {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isNaN(parsed) && reverseBedroomMap[parsed]) {\n result.add(reverseBedroomMap[parsed]);\n } else if (bedroomLabels.has(value)) {\n result.add(value);\n }\n }\n }\n\n return result.size > 0 ? Array.from(result) : undefined;\n};\n\nexport const transformUnitsApiResponseToClientFilters = (\n params: UnitsFilterParams,\n): UnitsClientFilters => {\n const availability =\n params.availability && params.availability.length > 0\n ? params.availability.map(\n (value) => reverseAvailabilityMap[value] ?? value,\n )\n : undefined;\n\n return {\n availability,\n bedrooms: normalizeBedrooms(params.bedrooms),\n cost: params.cost ?? undefined,\n highlights: params.highlights ?? [],\n };\n};\n"],"names":["SchemaMismatchError","message","detail","OpenDBError","SCHEMA_VERSION","UserSchema","z","UserUnitDataSchema","UnitDataSchema","FilterOptionValueSchema","FilterCollectionSchema","FiltersSchema","QueryParamsSchema","ResultsModeEnum","SortByEnum","AppStoreDataSchema","UnitSchema","PropertySchema","ApiUserSchema","ViewedUnitSchema","TourContactDataSchema","UserPropertyStateSchema","PropertyStoreDataSchema","UnitFavoriteSchema","FavoritesSchema","UnifiedStoreDataSchema","OrmDexie","Dexie","name","mode","onIssue","configureValidation","opts","validate","schema","value","ctx","res","details","MANIFEST_KEY","ManifestSchema","db","openPromise","VALIDATION_INSTALLED","installValidationHooks","instance","vopts","anyDb","table","_pk","obj","v","mods","next","dropInvalid","isProbablyDev","__vite_import_meta_env__","getDB","defaultMode","_a","_b","row","saved","parsed","fresh","_c","e","_d","resetDB","dbName","USER_POINTER_KEY","defaultIdGenerator","b","h","x","getPointerUuid","ensureUser","gen","ptrUuid","existing","insideUuid","uuid","newUser","winner","getUserUUID","debugDump","out","t","exportJSON","filename","snapshot","blob","kvGet","key","kvSet","kvRemove","createORMStringStorage","mem","prefix","toKey","keyFor","userId","propertyId","getFavoritedUnitsForProperty","setFavoriteUnit","unitId","on","current","nextSet","validated","toggleFavoriteUnit","isUnitFavorited","defaultPropertyStoreData","PropertyStore","state","normalized","sanitizedData","acc","entry","fallbackState","fallbackParsed","updater","currentState","newState","validatedState","slug","property","results","data","updatedFavoritedUnits","id","today","formattedDate","updatedViewedUnits","u","propertyStore","defaultFilters","defaultUnifiedStoreData","toArray","input","extractFilterValues","item","toStringArray","toNumberArray","num","toNumberValue","UnifiedStore","merged","sanitizedProperties","sanitizedUnitResults","fallback","units","baseSchema","validatedUnits","unit","index","partial","full","partialSchema","validatedPartial","apiProperty","filters","apiParams","sortBy","values","store","createZustandUnifiedStore","options","set","get","syncState","ormState","notifyFilterUpdate","apiFilters","createUseUnitState","useStore","createStructuredStoreActions","defaultValue","createStructuredStore","baseStore","actions","favorites","api.isUnitFavorited","api.toggleFavoriteUnit","api.setFavoriteUnit","api.getFavoritedUnitsForProperty","DEFAULT_WEB_ORIGIN","DEFAULT_PLACEHOLDER_IMAGE","normalizeSignature","signature","buildExploreUrl","unitSlug","propertySlug","origin","buildImageUrl","image","placeholder","transformUnitsApiResponse","apiResponse","transformUnitsApiResponseToClient","placeholderImage","hits","hit","source","title","reverseAvailabilityMap","reverseBedroomMap","bedroomLabels","normalizeBedrooms","bedrooms","result","bedroom","label","transformUnitsApiResponseToClientFilters","params"],"mappings":"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"}