@superbright/indexeddb-orm 0.1.1 → 0.1.3

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/errors.ts","../src/adapters/dexie.ts","../src/validation.ts","../src/db.ts","../src/storage.ts","../src/api/properties.ts","../src/api/app.ts","../src/stores/unified.ts","../src/schema.ts","../src/api/users.ts","../src/debug.ts","../src/api/favorites.ts","../src/adapters/zustand-unified.ts","../src/adapters/structured-store.ts","../src/units/favorites.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 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\";\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","import { z } from \"zod\";\nimport { kvGet, kvSet } from \"../storage\";\n\n// Property-related schemas\nexport const ViewedUnitSchema = z.object({\n unitId: z.string(),\n viewedDate: z.string(),\n});\n\nexport const TourContactDataSchema = z.object({\n timezone: z.string(),\n favouriteUnits: z.array(z.string()).optional(),\n preferences: z.record(z.unknown()),\n});\n\nexport const PropertyDataSchema = z.object({\n id: z.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(), // Generic for IFilters\n tourContactData: TourContactDataSchema.nullable().optional(),\n});\n\nexport const PropertyStoreDataSchema = z.object({\n data: z.record(PropertyDataSchema),\n propertySlug: z.string().nullable(),\n propertyId: z.string().nullable(),\n hasPreviouslySearched: z.array(z.string()),\n});\n\nexport type ViewedUnit = z.infer<typeof ViewedUnitSchema>;\nexport type TourContactData = z.infer<typeof TourContactDataSchema>;\nexport type PropertyData = z.infer<typeof PropertyDataSchema>;\nexport type PropertyStoreData = z.infer<typeof PropertyStoreDataSchema>;\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 return state ?? 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 await kvSet(\"property\", newState);\n }\n\n // Basic state operations\n async setData(value: Record<string, PropertyData>): 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): Promise<void> {\n await this.setState(state => ({ ...state, propertyId: id }));\n }\n\n async removeData(key: string): Promise<void> {\n await this.setState(state => ({\n ...state,\n data: Object.entries(state.data)\n .filter(([k]) => k !== key)\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): Promise<PropertyData | null> {\n const state = await this.getState();\n const id = propertyId ?? state.propertyId;\n return id ? state.data[id] ?? null : null;\n }\n\n async getCurrentProperty(): Promise<PropertyData | 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, slug: string): Promise<void> {\n await this.setState(state => {\n if (state.data[propertyId]) {\n return { ...state, propertyId, propertySlug: slug };\n }\n\n return {\n ...state,\n propertyId,\n propertySlug: slug,\n data: {\n ...state.data,\n [propertyId]: {\n id: propertyId,\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();","import { z } from \"zod\";\nimport { kvGet, kvSet } from \"../storage\";\n\n// App-related schemas\nexport const UnitDataSchema = z.object({\n isFavorite: z.boolean().optional(),\n viewedDate: z.string().optional(),\n});\n\nexport const FiltersSchema = z.object({\n availability: z.union([z.string(), z.array(z.string())]).nullable().optional(),\n bedrooms: z.array(z.number()).nullable().optional(),\n cost: z.number().nullable().optional(),\n highlights: z.array(z.string()).optional(),\n});\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});\n\nexport const AppStoreDataSchema = z.object({\n data: z.record(UnitDataSchema),\n filters: FiltersSchema,\n tempFilters: FiltersSchema,\n apiFilters: QueryParamsSchema,\n resultsMode: z.enum([\"all\", \"bestFit\", \"closestMatch\", \"favorites\"]),\n propertySlug: z.string().nullable(),\n resolvedQuestionnaireValues: z.record(z.array(z.string())),\n sortBy: z.enum([\"relevance\", \"newest\", \"priceLowToHigh\", \"priceHighToLow\"]),\n filtersLoaded: z.boolean(),\n});\n\nexport type UnitData = z.infer<typeof UnitDataSchema>;\nexport type Filters = z.infer<typeof FiltersSchema>;\nexport type QueryParams = z.infer<typeof QueryParamsSchema>;\nexport type AppStoreData = z.infer<typeof AppStoreDataSchema>;\nexport type ResultsMode = \"all\" | \"bestFit\" | \"closestMatch\" | \"favorites\";\nexport type SortBy = \"relevance\" | \"newest\" | \"priceLowToHigh\" | \"priceHighToLow\";\n\n// Default values\nconst defaultFilters: Filters = {\n availability: undefined,\n bedrooms: undefined,\n cost: undefined,\n highlights: undefined,\n};\n\nconst defaultAppStoreData: AppStoreData = {\n data: {},\n filters: defaultFilters,\n tempFilters: defaultFilters,\n apiFilters: {\n limit: 10,\n page: 1,\n },\n resultsMode: \"all\",\n propertySlug: null,\n resolvedQuestionnaireValues: {},\n sortBy: \"relevance\",\n filtersLoaded: false,\n};\n\n// Core app store API\nexport class AppStore {\n private async getState(): Promise<AppStoreData> {\n const state = await kvGet<AppStoreData>(\"app\");\n return state ?? defaultAppStoreData;\n }\n\n private async setState(updater: (state: AppStoreData) => AppStoreData): Promise<void> {\n const currentState = await this.getState();\n const newState = updater(currentState);\n await kvSet(\"app\", newState);\n }\n\n // Unit data operations\n async setData(key: string, value: UnitData): Promise<void> {\n await this.setState(state => ({\n ...state,\n data: { ...state.data, [key]: value }\n }));\n }\n\n async removeData(key: string): Promise<void> {\n await this.setState(state => {\n const { [key]: removed, ...rest } = state.data;\n return { ...state, data: rest };\n });\n }\n\n async clearData(): Promise<void> {\n await this.setState(state => ({ ...state, data: {} }));\n }\n\n // Filter operations\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 // Results and sorting\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 // Property operations\n async setPropertySlug(slug: string): Promise<void> {\n await this.setState(state => ({ ...state, propertySlug: slug }));\n }\n\n async getResultsUrl(): Promise<string | null> {\n const state = await this.getState();\n return state.propertySlug ? `/${state.propertySlug}/results` : null;\n }\n\n // Questionnaire values\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 // Complex filter operations\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: (newFilters.availability as string[]) || [],\n bedrooms: newFilters.bedrooms || [],\n cost: newFilters.cost || null,\n highlights: 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 try {\n const apiParams: QueryParams = {\n ...state.apiFilters,\n availability: (state.filters.availability as string[]) || [],\n bedrooms: state.filters.bedrooms || [],\n cost: state.filters.cost || null,\n highlights: state.filters.highlights || [],\n };\n\n // Note: updateParams function call would need to be handled in consuming app\n // You might want to emit an event or use a callback for this\n\n return {\n ...state,\n apiFilters: apiParams,\n };\n } catch (error) {\n console.error(\"Error submitting filter update:\", error);\n return state;\n }\n });\n }\n\n // Persistence operations\n async loadPersistedFilters(): Promise<void> {\n // This method is now redundant since we're always loading from IndexedDB\n // But we'll keep it for compatibility and mark filters as loaded\n await this.setState(state => ({ ...state, filtersLoaded: true }));\n }\n\n // Utility methods\n async getUnitData(unitId: string): Promise<UnitData | null> {\n const state = await this.getState();\n return state.data[unitId] ?? null;\n }\n\n async getFilters(): Promise<Filters> {\n const state = await this.getState();\n return state.filters;\n }\n\n async getTempFilters(): Promise<Filters> {\n const state = await this.getState();\n return state.tempFilters;\n }\n\n async getApiFilters(): Promise<QueryParams> {\n const state = await this.getState();\n return state.apiFilters;\n }\n\n async getFullState(): Promise<AppStoreData> {\n return this.getState();\n }\n\n // Initialize with default values if needed\n async initialize(): Promise<void> {\n const state = await this.getState();\n if (Object.keys(state.data).length === 0 && !state.filtersLoaded) {\n await this.setState(state => ({\n ...defaultAppStoreData,\n ...state,\n filtersLoaded: true\n }));\n }\n }\n}\n\n// Export singleton instance\nexport const appStore = new AppStore();","import { z } from \"zod\";\nimport { kvGet, kvSet } from \"../storage\";\n\n// Combined store schemas\nexport const UnitDataSchema = z.object({\n isFavorite: z.boolean().optional(),\n viewedDate: z.string().optional(),\n});\n\nexport const ViewedUnitSchema = z.object({\n unitId: z.string(),\n viewedDate: z.string(),\n});\n\nexport const TourContactDataSchema = z.object({\n timezone: z.string(),\n favouriteUnits: z.array(z.string()).optional(),\n preferences: z.record(z.unknown()),\n});\n\nexport const PropertyDataSchema = z.object({\n id: z.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});\n\nexport const FiltersSchema = z.object({\n availability: z.union([z.string(), z.array(z.string())]).nullable().optional(),\n bedrooms: z.array(z.number()).nullable().optional(),\n cost: z.number().nullable().optional(),\n highlights: z.array(z.string()).optional(),\n});\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});\n\nexport const UnifiedStoreDataSchema = z.object({\n // Property-related data\n properties: z.record(PropertyDataSchema),\n currentPropertyId: z.string().nullable(),\n currentPropertySlug: z.string().nullable(),\n hasPreviouslySearched: z.array(z.string()),\n\n // App-level data\n filters: FiltersSchema,\n tempFilters: FiltersSchema,\n apiFilters: QueryParamsSchema,\n resultsMode: z.enum([\"all\", \"bestFit\", \"closestMatch\", \"favorites\"]),\n resolvedQuestionnaireValues: z.record(z.array(z.string())),\n sortBy: z.enum([\"relevance\", \"newest\", \"priceLowToHigh\", \"priceHighToLow\"]),\n filtersLoaded: z.boolean(),\n});\n\nexport type UnitData = z.infer<typeof UnitDataSchema>;\nexport type ViewedUnit = z.infer<typeof ViewedUnitSchema>;\nexport type TourContactData = z.infer<typeof TourContactDataSchema>;\nexport type PropertyData = z.infer<typeof PropertyDataSchema>;\nexport type Filters = z.infer<typeof FiltersSchema>;\nexport type QueryParams = z.infer<typeof QueryParamsSchema>;\nexport type UnifiedStoreData = z.infer<typeof UnifiedStoreDataSchema>;\nexport type ResultsMode = \"all\" | \"bestFit\" | \"closestMatch\" | \"favorites\";\nexport type SortBy = \"relevance\" | \"newest\" | \"priceLowToHigh\" | \"priceHighToLow\";\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 filters: defaultFilters,\n tempFilters: defaultFilters,\n apiFilters: {\n limit: 10,\n page: 1,\n },\n resultsMode: \"all\",\n resolvedQuestionnaireValues: {},\n sortBy: \"relevance\",\n filtersLoaded: false,\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 // Ensure all required fields exist (defensive programming)\n return {\n ...defaultUnifiedStoreData,\n ...state,\n properties: state.properties ?? {},\n };\n }\n\n private async setState(updater: (state: UnifiedStoreData) => UnifiedStoreData): Promise<void> {\n const currentState = await this.getState();\n const newState = updater(currentState);\n await kvSet(\"app\", newState);\n }\n\n // === PROPERTY OPERATIONS ===\n\n async initializeProperty(propertyId: string, slug: string): Promise<void> {\n await this.setState(state => {\n if (state.properties && state.properties[propertyId]) {\n return {\n ...state,\n currentPropertyId: propertyId,\n currentPropertySlug: slug\n };\n }\n\n return {\n ...state,\n currentPropertyId: propertyId,\n currentPropertySlug: slug,\n properties: {\n ...state.properties,\n [propertyId]: {\n id: propertyId,\n slug,\n favoritedUnits: [],\n tourContactedOn: null,\n viewedUnits: [],\n questionnaireResults: null,\n tourContactData: null,\n },\n },\n };\n });\n }\n\n async setCurrentProperty(propertyId: string, slug?: string): Promise<void> {\n await this.setState(state => ({\n ...state,\n currentPropertyId: propertyId,\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: (newFilters.availability as string[]) || [],\n bedrooms: newFilters.bedrooms || [],\n cost: newFilters.cost || null,\n highlights: 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: (state.filters.availability as string[]) || [],\n bedrooms: state.filters.bedrooms || [],\n cost: state.filters.cost || null,\n highlights: 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<PropertyData | null> {\n const state = await this.getState();\n return state.currentPropertyId ? state.properties[state.currentPropertyId] ?? null : null;\n }\n\n async getPropertyData(propertyId?: string): Promise<PropertyData | null> {\n const state = await this.getState();\n const id = propertyId ?? state.currentPropertyId;\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 const state = await this.getState();\n if (Object.keys(state.properties).length === 0 && !state.filtersLoaded) {\n await this.setState(state => ({\n ...defaultUnifiedStoreData,\n ...state,\n filtersLoaded: true\n }));\n }\n }\n\n async loadPersistedFilters(): Promise<void> {\n // Mark filters as loaded since we're always loading from IndexedDB\n await this.setState(state => ({ ...state, filtersLoaded: true }));\n }\n\n // === LEGACY COMPATIBILITY METHODS ===\n\n // Property store compatibility\n async setData(value: Record<string, PropertyData>): 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): Promise<void> {\n await this.setCurrentProperty(id);\n }\n\n async removeData(key: string): Promise<void> {\n await this.setState(state => {\n const { [key]: 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();","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});\nexport type User = z.infer<typeof UserSchema>;\n\n// favorites\nexport const FavoritesSchema = z.object({\n propertyId: z.string() || z.number(),\n unitIds: z.array(z.string()),\n});\nexport type Favorites = z.infer<typeof FavoritesSchema>;\n\n// Re-export property schemas from the API module\nexport {\n ViewedUnitSchema,\n TourContactDataSchema,\n PropertyDataSchema,\n PropertyStoreDataSchema,\n type ViewedUnit,\n type TourContactData,\n type PropertyData,\n type PropertyStoreData,\n} from \"./api/properties\";\n\n// Re-export app schemas from the API module\nexport {\n UnitDataSchema,\n FiltersSchema,\n QueryParamsSchema,\n AppStoreDataSchema,\n type UnitData,\n type Filters,\n type QueryParams,\n type AppStoreData,\n type ResultsMode,\n type SortBy,\n} from \"./api/app\";\n\n// Re-export unified store schemas\nexport {\n UnifiedStoreDataSchema,\n type UnifiedStoreData,\n} from \"./stores/unified\";\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","// 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 { store, type UnifiedStoreData, type UnitData, type PropertyData, type Filters, type QueryParams, type ResultsMode, type SortBy, type TourContactData } from \"../stores/unified\";\n\n// Unified Zustand store interface\nexport interface ZustandUnifiedStoreState {\n // Property data\n properties: Record<string, PropertyData>;\n currentPropertyId: string | null;\n currentPropertySlug: string | null;\n hasPreviouslySearched: string[];\n\n // App data\n units: Record<string, UnitData>;\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\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<PropertyData | null>;\n getPropertyData: (propertyId?: string) => Promise<PropertyData | null>;\n\n // === LEGACY COMPATIBILITY ===\n setData: (value: Record<string, PropertyData>) => 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 filters: ormState.filters,\n tempFilters: ormState.tempFilters,\n apiFilters: ormState.apiFilters,\n resultsMode: ormState.resultsMode,\n resolvedQuestionnaireValues: ormState.resolvedQuestionnaireValues,\n sortBy: ormState.sortBy,\n filtersLoaded: ormState.filtersLoaded,\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 units: {},\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\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 },\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 {\n UnitData,\n PropertyData,\n Filters,\n QueryParams,\n ResultsMode,\n SortBy,\n TourContactData\n} from \"../stores/unified\";","import {\n type ZustandUnifiedStoreState,\n createZustandUnifiedStore,\n type Filters,\n type UnitData,\n type TourContactData,\n type QueryParams\n} from \"./zustand-unified\";\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"],"names":["SchemaMismatchError","message","detail","OpenDBError","OrmDexie","Dexie","name","SCHEMA_VERSION","mode","onIssue","configureValidation","opts","validate","schema","value","ctx","res","details","MANIFEST_KEY","ManifestSchema","z","db","openPromise","VALIDATION_INSTALLED","installValidationHooks","instance","vopts","anyDb","table","_pk","obj","v","mods","next","UserSchema","dropInvalid","isProbablyDev","_documentCurrentScript","__vite_import_meta_env__","getDB","defaultMode","_a","_b","row","saved","parsed","fresh","_c","e","_d","resetDB","dbName","kvGet","key","kvSet","kvRemove","createORMStringStorage","mem","prefix","toKey","ViewedUnitSchema","TourContactDataSchema","PropertyDataSchema","PropertyStoreDataSchema","defaultPropertyStoreData","PropertyStore","updater","currentState","newState","state","slug","id","k","acc","propertyId","property","results","data","unitId","updatedFavoritedUnits","today","formattedDate","updatedViewedUnits","u","propertyStore","UnitDataSchema","FiltersSchema","QueryParamsSchema","AppStoreDataSchema","UnifiedStoreDataSchema","defaultFilters","defaultUnifiedStoreData","UnifiedStore","filters","defaultValue","newFilters","apiParams","sortBy","values","removed","rest","store","FavoritesSchema","USER_POINTER_KEY","defaultIdGenerator","b","h","x","getPointerUuid","ensureUser","gen","ptrUuid","existing","insideUuid","uuid","newUser","winner","getUserUUID","debugDump","out","t","exportJSON","filename","snapshot","blob","a","keyFor","userId","getFavoritedUnitsForProperty","setFavoriteUnit","on","current","nextSet","validated","toggleFavoriteUnit","isUnitFavorited","createZustandUnifiedStore","options","set","get","syncState","ormState","notifyFilterUpdate","apiFilters","createUseUnitState","useStore","createStructuredStoreActions","createStructuredStore","baseStore","actions","favorites","api.isUnitFavorited","api.toggleFavoriteUnit","api.setFavoriteUnit","api.getFavoritedUnitsForProperty"],"mappings":"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"}