@superbright/indexeddb-orm 1.0.33 → 1.0.34
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.
- package/README.md +44 -359
- package/dist/adapters/dexie.cjs +1 -1
- package/dist/adapters/dexie.cjs.map +1 -1
- package/dist/adapters/dexie.d.ts +3 -4
- package/dist/adapters/dexie.mjs +6 -9
- package/dist/adapters/dexie.mjs.map +1 -1
- package/dist/adapters/zustand-store.cjs +1 -1
- package/dist/adapters/zustand-store.cjs.map +1 -1
- package/dist/adapters/zustand-store.d.ts +20 -41
- package/dist/adapters/zustand-store.mjs +34 -194
- package/dist/adapters/zustand-store.mjs.map +1 -1
- package/dist/base/index.d.ts +0 -1
- package/dist/base/visitorquestionnaire.d.ts +2 -2
- package/dist/db.cjs +1 -1
- package/dist/db.cjs.map +1 -1
- package/dist/db.mjs +57 -75
- package/dist/db.mjs.map +1 -1
- package/dist/features/analytics/analytics.d.ts +156 -156
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.mjs +92 -107
- package/dist/index.mjs.map +1 -1
- package/dist/schema.cjs +1 -1
- package/dist/schema.cjs.map +1 -1
- package/dist/schema.d.ts +1 -2088
- package/dist/schema.mjs +105 -161
- package/dist/schema.mjs.map +1 -1
- package/dist/stores/store.cjs +1 -1
- package/dist/stores/store.cjs.map +1 -1
- package/dist/stores/store.d.ts +7 -158
- package/dist/stores/store.mjs +13 -427
- package/dist/stores/store.mjs.map +1 -1
- package/dist/utils/casing.cjs +1 -1
- package/dist/utils/casing.cjs.map +1 -1
- package/dist/utils/casing.d.ts +0 -4
- package/dist/utils/casing.mjs +1 -4
- package/dist/utils/casing.mjs.map +1 -1
- package/dist/validation.cjs +1 -1
- package/dist/validation.cjs.map +1 -1
- package/dist/validation.d.ts +0 -2
- package/dist/validation.mjs +3 -14
- package/dist/validation.mjs.map +1 -1
- package/package.json +5 -1
- package/dist/adapters/structured-store.cjs +0 -2
- package/dist/adapters/structured-store.cjs.map +0 -1
- package/dist/adapters/structured-store.d.ts +0 -45
- package/dist/adapters/structured-store.mjs +0 -51
- package/dist/adapters/structured-store.mjs.map +0 -1
- package/dist/base/favoriteunit.cjs +0 -2
- package/dist/base/favoriteunit.cjs.map +0 -1
- package/dist/base/favoriteunit.d.ts +0 -14
- package/dist/base/favoriteunit.mjs +0 -10
- package/dist/base/favoriteunit.mjs.map +0 -1
package/dist/schema.mjs
CHANGED
|
@@ -1,73 +1,61 @@
|
|
|
1
|
-
import { object as
|
|
2
|
-
const
|
|
3
|
-
uuid:
|
|
1
|
+
import { object as n, enum as s, string as o, array as a, number as t, union as e, null as d, unknown as l, boolean as r, coerce as i, record as m } from "./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.mjs";
|
|
2
|
+
const h = 2, g = n({
|
|
3
|
+
uuid: o().uuid(),
|
|
4
4
|
// stored as ISO string; include to match ensureUser()
|
|
5
|
-
createdAt:
|
|
6
|
-
}),
|
|
7
|
-
|
|
8
|
-
viewedDate: t().optional()
|
|
9
|
-
}), v = g, s = n([
|
|
5
|
+
createdAt: o().datetime().optional()
|
|
6
|
+
}), p = e([
|
|
7
|
+
o(),
|
|
10
8
|
t(),
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
qty_bathrooms: r.number().nullable().optional(),
|
|
47
|
-
base_price: r.number().nullable().optional(),
|
|
48
|
-
dim_sq_ft: r.number().nullable().optional(),
|
|
49
|
-
propertyId: n([a().int(), t()]).optional(),
|
|
50
|
-
is_available: u().optional(),
|
|
51
|
-
createdAt: t().datetime().optional(),
|
|
52
|
-
updatedAt: t().datetime().optional(),
|
|
53
|
-
date_availability: t().datetime().nullable().optional(),
|
|
54
|
-
unitSetAvailableOn: t().datetime().nullable().optional(),
|
|
55
|
-
floorPlanId: n([a().int(), t()]).nullable().optional(),
|
|
9
|
+
r(),
|
|
10
|
+
m(l())
|
|
11
|
+
]), b = e([
|
|
12
|
+
p,
|
|
13
|
+
a(p)
|
|
14
|
+
]), S = n({
|
|
15
|
+
date_availability: b.nullable().optional(),
|
|
16
|
+
qty_bedrooms: e([a(p), d()]).optional(),
|
|
17
|
+
base_price: t().nullable().optional(),
|
|
18
|
+
highlights: a(p).optional()
|
|
19
|
+
}), f = s(["all", "bestFit", "closestMatch", "favorites", "loading"]), c = s(["relevance", "newest", "cost_low_to_high", "cost_high_to_low"]), v = n({
|
|
20
|
+
limit: t().default(10),
|
|
21
|
+
page: t().default(1),
|
|
22
|
+
sortBy: c.default("relevance"),
|
|
23
|
+
base_price: t().nullable().optional(),
|
|
24
|
+
date_availability: a(o()).optional(),
|
|
25
|
+
qty_bedrooms: a(t()).optional(),
|
|
26
|
+
highlights: a(o()).optional(),
|
|
27
|
+
nearBuilding: a(o()).optional(),
|
|
28
|
+
nearNeighbourhood: a(o()).optional()
|
|
29
|
+
}), u = n({
|
|
30
|
+
id: e([t().int(), o()]).optional(),
|
|
31
|
+
name: o(),
|
|
32
|
+
slug: o().nullable().optional(),
|
|
33
|
+
qty_bedrooms: i.number().nullable().optional(),
|
|
34
|
+
qty_bathrooms: i.number().nullable().optional(),
|
|
35
|
+
base_price: i.number().nullable().optional(),
|
|
36
|
+
dim_sq_ft: i.number().nullable().optional(),
|
|
37
|
+
propertyId: e([t().int(), o()]).optional(),
|
|
38
|
+
is_available: r().optional(),
|
|
39
|
+
createdAt: o().datetime().optional(),
|
|
40
|
+
updatedAt: o().datetime().optional(),
|
|
41
|
+
date_availability: o().datetime().nullable().optional(),
|
|
42
|
+
unitSetAvailableOn: o().datetime().nullable().optional(),
|
|
43
|
+
floorPlanId: e([t().int(), o()]).nullable().optional(),
|
|
56
44
|
// Relations and nested structures kept loose to avoid coupling
|
|
57
|
-
property:
|
|
58
|
-
amenities:
|
|
59
|
-
highlights:
|
|
60
|
-
floorPlan:
|
|
61
|
-
renderedStyle:
|
|
62
|
-
video:
|
|
63
|
-
videoThumbnail:
|
|
64
|
-
embedGif:
|
|
65
|
-
userId:
|
|
66
|
-
user:
|
|
67
|
-
status:
|
|
68
|
-
external_id:
|
|
69
|
-
unitRenderedStyles:
|
|
70
|
-
}),
|
|
45
|
+
property: l().optional(),
|
|
46
|
+
amenities: a(l()).optional(),
|
|
47
|
+
highlights: a(l()).optional(),
|
|
48
|
+
floorPlan: l().nullable().optional(),
|
|
49
|
+
renderedStyle: a(l()).optional(),
|
|
50
|
+
video: l().nullable().optional(),
|
|
51
|
+
videoThumbnail: l().nullable().optional(),
|
|
52
|
+
embedGif: l().nullable().optional(),
|
|
53
|
+
userId: e([t().int(), o()]).optional(),
|
|
54
|
+
user: l().optional(),
|
|
55
|
+
status: o().optional(),
|
|
56
|
+
external_id: o().nullable().optional(),
|
|
57
|
+
unitRenderedStyles: a(l()).optional()
|
|
58
|
+
}), _ = n({
|
|
71
59
|
/**
|
|
72
60
|
* Property (readable shape)
|
|
73
61
|
*
|
|
@@ -101,101 +89,57 @@ const w = 1, A = l({
|
|
|
101
89
|
* floorPlans?: unknown[]
|
|
102
90
|
* }
|
|
103
91
|
*/
|
|
104
|
-
id:
|
|
105
|
-
createdAt:
|
|
106
|
-
updatedAt:
|
|
107
|
-
name:
|
|
108
|
-
slug:
|
|
109
|
-
description:
|
|
110
|
-
contact_name:
|
|
111
|
-
contact_email:
|
|
112
|
-
contact_phone:
|
|
113
|
-
notification_email:
|
|
114
|
-
logo:
|
|
115
|
-
leadMedia:
|
|
116
|
-
overviewImages:
|
|
117
|
-
amenityImages:
|
|
118
|
-
address_street:
|
|
119
|
-
address_city:
|
|
120
|
-
address_state:
|
|
121
|
-
ingestionFileName:
|
|
122
|
-
address_zip:
|
|
123
|
-
address_country:
|
|
124
|
-
units:
|
|
125
|
-
amenities:
|
|
126
|
-
highlights:
|
|
127
|
-
externalServices:
|
|
128
|
-
userId:
|
|
129
|
-
user:
|
|
130
|
-
status:
|
|
131
|
-
floorPlans:
|
|
132
|
-
}),
|
|
133
|
-
id:
|
|
134
|
-
email:
|
|
135
|
-
first_name:
|
|
136
|
-
last_name:
|
|
137
|
-
password:
|
|
138
|
-
salt:
|
|
139
|
-
role:
|
|
140
|
-
Property:
|
|
141
|
-
Unit:
|
|
142
|
-
floorPlans:
|
|
143
|
-
createdAt:
|
|
144
|
-
updatedAt:
|
|
145
|
-
}), P = l({
|
|
146
|
-
unitId: t(),
|
|
147
|
-
viewedDate: t()
|
|
148
|
-
}), U = l({
|
|
149
|
-
timezone: t().optional(),
|
|
150
|
-
favouriteUnits: o(r.string()).optional(),
|
|
151
|
-
preferences: i(e()).optional()
|
|
152
|
-
}), S = l({
|
|
153
|
-
id: r.string(),
|
|
154
|
-
slug: t(),
|
|
155
|
-
favoritedUnits: o(t()).optional(),
|
|
156
|
-
tourContactedOn: t().nullable(),
|
|
157
|
-
viewedUnits: o(P),
|
|
158
|
-
questionnaireResults: e().nullable().optional(),
|
|
159
|
-
tourContactData: U.nullable().optional(),
|
|
160
|
-
// Full property payload persisted alongside per-property state
|
|
161
|
-
data: y.optional()
|
|
162
|
-
}), D = l({
|
|
163
|
-
data: i(S),
|
|
164
|
-
propertySlug: t().nullable(),
|
|
165
|
-
propertyId: t().nullable(),
|
|
166
|
-
hasPreviouslySearched: o(t())
|
|
167
|
-
}), q = l({
|
|
168
|
-
// Property-related data
|
|
169
|
-
properties: i(S),
|
|
170
|
-
currentPropertyId: t().nullable(),
|
|
171
|
-
currentPropertySlug: t().nullable(),
|
|
172
|
-
hasPreviouslySearched: o(t()),
|
|
173
|
-
// App-level data
|
|
174
|
-
unitResults: o(c),
|
|
175
|
-
filters: p,
|
|
176
|
-
tempFilters: p,
|
|
177
|
-
apiFilters: h,
|
|
178
|
-
resultsMode: b,
|
|
179
|
-
resolvedQuestionnaireValues: i(o(t())),
|
|
180
|
-
sortBy: d
|
|
92
|
+
id: e([t().int(), o()]),
|
|
93
|
+
createdAt: o().datetime(),
|
|
94
|
+
updatedAt: o().datetime(),
|
|
95
|
+
name: o(),
|
|
96
|
+
slug: o().nullable().optional(),
|
|
97
|
+
description: o(),
|
|
98
|
+
contact_name: o().nullable().optional(),
|
|
99
|
+
contact_email: o().optional(),
|
|
100
|
+
contact_phone: o().nullable().optional(),
|
|
101
|
+
notification_email: o().nullable().optional(),
|
|
102
|
+
logo: l().nullable().optional(),
|
|
103
|
+
leadMedia: l().nullable().optional(),
|
|
104
|
+
overviewImages: a(l()).optional(),
|
|
105
|
+
amenityImages: a(l()).optional(),
|
|
106
|
+
address_street: o().optional(),
|
|
107
|
+
address_city: o().optional(),
|
|
108
|
+
address_state: o().nullable().optional(),
|
|
109
|
+
ingestionFileName: o().nullable().optional(),
|
|
110
|
+
address_zip: o().optional(),
|
|
111
|
+
address_country: o().optional(),
|
|
112
|
+
units: a(u).optional(),
|
|
113
|
+
amenities: a(l()).optional(),
|
|
114
|
+
highlights: a(l()).optional(),
|
|
115
|
+
externalServices: a(l()).optional(),
|
|
116
|
+
userId: e([t().int(), o()]).optional(),
|
|
117
|
+
user: l().optional(),
|
|
118
|
+
status: o().optional(),
|
|
119
|
+
floorPlans: a(l()).optional()
|
|
120
|
+
}), T = n({
|
|
121
|
+
id: e([t().int(), o()]).optional(),
|
|
122
|
+
email: o().email().optional(),
|
|
123
|
+
first_name: o().optional(),
|
|
124
|
+
last_name: o().optional(),
|
|
125
|
+
password: o().optional(),
|
|
126
|
+
salt: o().optional(),
|
|
127
|
+
role: o().optional(),
|
|
128
|
+
Property: a(_).optional(),
|
|
129
|
+
Unit: a(u).optional(),
|
|
130
|
+
floorPlans: a(l()).optional(),
|
|
131
|
+
createdAt: o().datetime().optional(),
|
|
132
|
+
updatedAt: o().datetime().optional()
|
|
181
133
|
});
|
|
182
134
|
export {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
h as
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
U as TourContactDataSchema,
|
|
193
|
-
q as UnifiedStoreDataSchema,
|
|
194
|
-
v as UnitDataSchema,
|
|
195
|
-
c as UnitSchema,
|
|
196
|
-
S as UserPropertyStateSchema,
|
|
197
|
-
A as UserSchema,
|
|
198
|
-
g as UserUnitDataSchema,
|
|
199
|
-
P as ViewedUnitSchema
|
|
135
|
+
T as ApiUserSchema,
|
|
136
|
+
S as FiltersSchema,
|
|
137
|
+
_ as PropertySchema,
|
|
138
|
+
v as QueryParamsSchema,
|
|
139
|
+
f as ResultsModeEnum,
|
|
140
|
+
h as SCHEMA_VERSION,
|
|
141
|
+
c as SortByEnum,
|
|
142
|
+
u as UnitSchema,
|
|
143
|
+
g as UserSchema
|
|
200
144
|
};
|
|
201
145
|
//# sourceMappingURL=schema.mjs.map
|
package/dist/schema.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.mjs","sources":["../src/schema.ts"],"sourcesContent":["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 date_availability: FilterCollectionSchema.nullable().optional(),\n qty_bedrooms: z.union([z.array(FilterOptionValueSchema), z.null()]).optional(),\n base_price: z.number().nullable().optional(),\n highlights: z.array(FilterOptionValueSchema).optional(),\n});\nexport type Filters = z.infer<typeof FiltersSchema>;\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\", \"cost_low_to_high\", \"cost_high_to_low\"]);\nexport type SortBy = z.infer<typeof SortByEnum>;\n\nexport const QueryParamsSchema = z.object({\n limit: z.number().default(10),\n page: z.number().default(1),\n sortBy: SortByEnum.default(\"relevance\"),\n base_price: z.number().nullable().optional(),\n date_availability: z.array(z.string()).optional(),\n qty_bedrooms: z.array(z.number()).optional(),\n highlights: z.array(z.string()).optional(),\n nearBuilding: z.array(z.string()).optional(),\n nearNeighbourhood: z.array(z.string()).optional(),\n});\nexport type QueryParams = z.infer<typeof QueryParamsSchema>;\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 name: z.string(),\n slug: z.string().nullable().optional(),\n qty_bedrooms: z.coerce.number().nullable().optional(),\n qty_bathrooms: z.coerce.number().nullable().optional(),\n base_price: z.coerce.number().nullable().optional(),\n dim_sq_ft: z.coerce.number().nullable().optional(),\n propertyId: z.union([z.number().int(), z.string()]).optional(),\n is_available: z.boolean().optional(),\n createdAt: z.string().datetime().optional(),\n updatedAt: z.string().datetime().optional(),\n date_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 external_id: 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 /**\n * Property (readable shape)\n *\n * interface Property {\n * id: number | string\n * createdAt: string // ISO\n * updatedAt: string // ISO\n * title: string\n * slug?: string | null\n * description: string\n * contactName?: string | null\n * contactEmail?: string\n * contactPhone?: string | null\n * notificationEmail?: string | null\n * logo?: unknown | null\n * leadMedia?: unknown | null\n * overviewImages?: unknown[]\n * amenityImages?: unknown[]\n * street?: string\n * city?: string\n * state?: string | null\n * zip?: string\n * country?: string\n * units?: Unit[]\n * amenities?: unknown[]\n * highlights?: unknown[]\n * externalServices?: unknown[]\n * userId?: number | string\n * user?: unknown\n * status?: string\n * floorPlans?: unknown[]\n * }\n */\n id: z.union([z.number().int(), z.string()]),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n name: z.string(),\n slug: z.string().nullable().optional(),\n description: z.string(),\n contact_name: z.string().nullable().optional(),\n contact_email: z.string().optional(),\n contact_phone: z.string().nullable().optional(),\n notification_email: 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 address_street: z.string().optional(),\n address_city: z.string().optional(),\n address_state: z.string().nullable().optional(),\n ingestionFileName: z.string().nullable().optional(),\n address_zip: z.string().optional(),\n address_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 first_name: z.string().optional(),\n last_name: 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()).optional(),\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// 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"],"names":["SCHEMA_VERSION","UserSchema","z.object","z.string","UserUnitDataSchema","z.boolean","UnitDataSchema","FilterOptionValueSchema","z.union","z.number","z.record","z.unknown","FilterCollectionSchema","z.array","FiltersSchema","z.null","ResultsModeEnum","z.enum","SortByEnum","QueryParamsSchema","AppStoreDataSchema","UnitSchema","z.coerce","PropertySchema","ApiUserSchema","ViewedUnitSchema","TourContactDataSchema","UserPropertyStateSchema","PropertyStoreDataSchema","UnifiedStoreDataSchema"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema.mjs","sources":["../src/schema.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const SCHEMA_VERSION = 2 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\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 date_availability: FilterCollectionSchema.nullable().optional(),\n qty_bedrooms: z.union([z.array(FilterOptionValueSchema), z.null()]).optional(),\n base_price: z.number().nullable().optional(),\n highlights: z.array(FilterOptionValueSchema).optional(),\n});\nexport type Filters = z.infer<typeof FiltersSchema>;\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\", \"cost_low_to_high\", \"cost_high_to_low\"]);\nexport type SortBy = z.infer<typeof SortByEnum>;\n\nexport const QueryParamsSchema = z.object({\n limit: z.number().default(10),\n page: z.number().default(1),\n sortBy: SortByEnum.default(\"relevance\"),\n base_price: z.number().nullable().optional(),\n date_availability: z.array(z.string()).optional(),\n qty_bedrooms: z.array(z.number()).optional(),\n highlights: z.array(z.string()).optional(),\n nearBuilding: z.array(z.string()).optional(),\n nearNeighbourhood: z.array(z.string()).optional(),\n});\nexport type QueryParams = z.infer<typeof QueryParamsSchema>;\n\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 name: z.string(),\n slug: z.string().nullable().optional(),\n qty_bedrooms: z.coerce.number().nullable().optional(),\n qty_bathrooms: z.coerce.number().nullable().optional(),\n base_price: z.coerce.number().nullable().optional(),\n dim_sq_ft: z.coerce.number().nullable().optional(),\n propertyId: z.union([z.number().int(), z.string()]).optional(),\n is_available: z.boolean().optional(),\n createdAt: z.string().datetime().optional(),\n updatedAt: z.string().datetime().optional(),\n date_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 external_id: 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 /**\n * Property (readable shape)\n *\n * interface Property {\n * id: number | string\n * createdAt: string // ISO\n * updatedAt: string // ISO\n * title: string\n * slug?: string | null\n * description: string\n * contactName?: string | null\n * contactEmail?: string\n * contactPhone?: string | null\n * notificationEmail?: string | null\n * logo?: unknown | null\n * leadMedia?: unknown | null\n * overviewImages?: unknown[]\n * amenityImages?: unknown[]\n * street?: string\n * city?: string\n * state?: string | null\n * zip?: string\n * country?: string\n * units?: Unit[]\n * amenities?: unknown[]\n * highlights?: unknown[]\n * externalServices?: unknown[]\n * userId?: number | string\n * user?: unknown\n * status?: string\n * floorPlans?: unknown[]\n * }\n */\n id: z.union([z.number().int(), z.string()]),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n name: z.string(),\n slug: z.string().nullable().optional(),\n description: z.string(),\n contact_name: z.string().nullable().optional(),\n contact_email: z.string().optional(),\n contact_phone: z.string().nullable().optional(),\n notification_email: 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 address_street: z.string().optional(),\n address_city: z.string().optional(),\n address_state: z.string().nullable().optional(),\n ingestionFileName: z.string().nullable().optional(),\n address_zip: z.string().optional(),\n address_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 first_name: z.string().optional(),\n last_name: 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\n"],"names":["SCHEMA_VERSION","UserSchema","z.object","z.string","FilterOptionValueSchema","z.union","z.number","z.boolean","z.record","z.unknown","FilterCollectionSchema","z.array","FiltersSchema","z.null","ResultsModeEnum","z.enum","SortByEnum","QueryParamsSchema","UnitSchema","z.coerce","PropertySchema","ApiUserSchema"],"mappings":"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"}
|
package/dist/stores/store.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../storage.cjs");class s{async getVisitorUUID(){const t=await e.kvGet("user");return(t==null?void 0:t.visitor_uuid)??null}async setVisitorUUID(t){const r=await e.kvGet("user"),i=r!==null&&typeof r=="object"&&!Array.isArray(r)?r:{};await e.kvSet("user",{...i,visitor_uuid:t})}async clearVisitorUUID(){const t=await e.kvGet("user");if(t===null||typeof t!="object"||Array.isArray(t))return;const{visitor_uuid:r,...i}=t;await e.kvSet("user",i)}}const o=new s;exports.inResiOrmStore=o;
|
|
2
2
|
//# sourceMappingURL=store.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.cjs","sources":["../../src/stores/store.ts"],"sourcesContent":["import { kvGet, kvSet } from \"../storage\";\nimport type { ZodType, ZodTypeAny } from \"zod\";\nimport {\n UnifiedStoreDataSchema,\n UserPropertyStateSchema,\n type UnifiedStoreData,\n type UserPropertyState,\n type Filters,\n type QueryParams,\n type ResultsMode,\n type SortBy,\n type TourContactData,\n type Unit,\n UnitSchema,\n} from \"../schema\";\nimport { validate } from \"../validation\";\nimport { transformFiltersToUnitsSearchParams } from \"../features/filters/transformers\";\n\n// Default values\nconst defaultFilters: Filters = {\n date_availability: undefined,\n qty_bedrooms: undefined,\n base_price: 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 sortBy: \"relevance\",\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 /**\n * Resolves the persisted unified store snapshot, coercing legacy shapes into the latest schema\n * and sanitizing invalid entries where possible.\n */\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 /**\n * Applies an updater function to the current store state, validates the result, and persists it.\n *\n * @param updater - Pure function that maps the current state to the next state.\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 /**\n * Polls the persisted state until a current property pointer is available or the timeout elapses.\n *\n * @param timeoutMs - Maximum time in milliseconds to wait before failing.\n * @returns The active property ID once it becomes available.\n * @throws Error if the property pointer is not set before the timeout expires.\n */\n private async waitForCurrentProperty(timeoutMs = 1000): Promise<string> {\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n const state = await this.getState();\n const propertyId = state.currentPropertyId;\n if (propertyId && state.properties[propertyId]) return propertyId;\n\n await new Promise(resolve => setTimeout(resolve, 16));\n }\n\n const finalState = await this.getState();\n const propertyId = finalState.currentPropertyId;\n if (propertyId && finalState.properties[propertyId]) return propertyId;\n\n throw new Error(\"UnifiedStore: current property was not initialized in time\");\n }\n\n // === PROPERTY OPERATIONS ===\n\n /**\n * Ensures a property entry exists and registers it as the current property.\n *\n * @param propertyId - Identifier used to track the property.\n * @param slug - Canonical slug associated with the property.\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 /**\n * Persists a collection of units after validating each entry against the provided schema.\n *\n * @param units - Raw units collection returned by an API call.\n * @param schema - Optional override schema when the default `UnitSchema` is not sufficient.\n */\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 /**\n * Clears the cached unit results array.\n */\n async clearUnitResults(): Promise<void> {\n await this.setState(state => ({\n ...state,\n unitResults: [],\n }));\n }\n\n /**\n * Marks the provided property as current and optionally updates the slug.\n *\n * @param propertyId - Property identifier to focus.\n * @param slug - Optional slug override.\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 /**\n * Updates the slug for the current property selection.\n *\n * @param slug - New slug to persist.\n */\n async setCurrentPropertySlug(slug: string): Promise<void> {\n await this.setState(state => ({\n ...state,\n currentPropertySlug: slug\n }));\n }\n\n /**\n * Adds a slug to the `hasPreviouslySearched` list without duplicating existing entries.\n *\n * @param slug - Slug to record.\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 /**\n * Records the most recent view date for a unit and opens the unit URL in the browser when available.\n *\n * @param unitId - Identifier of the viewed unit.\n * @param slug - Property slug used to construct the URL.\n */\n async markUnitAsViewed(unitId: string, slug: string): Promise<void> {\n\n const url = `https://${slug}`;\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n\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\n }\n\n /**\n * Stamps the current property with the moment the tour outreach occurred.\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 /**\n * Reads the stored tour contact timestamp for the current property.\n *\n * @returns ISO string or null when no timestamp exists.\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 /**\n * Persists questionnaire results captured for the current property.\n *\n * @param results - Arbitrary questionnaire data.\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 /**\n * Persists structured tour contact preferences for the active property. The method waits until\n * a current property is available, allowing callers to invoke it before initialization completes.\n *\n * @param data - Contact preferences captured from the UI.\n */\n async setTourContactData(data: TourContactData): Promise<void> {\n const propertyId = await this.waitForCurrentProperty();\n\n await this.setState(state => {\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 /**\n * Merges the provided filter values into the committed filter state.\n *\n * @param filters - Partial filter payload to apply.\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 /**\n * Updates the transient filters used for in-progress UI interactions.\n *\n * @param filters - Partial staging filter payload.\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 /**\n * Resets the committed filters to their default values.\n */\n async setFiltersToDefault(): Promise<void> {\n await this.setState(state => ({ ...state, filters: defaultFilters }));\n }\n\n /**\n * Merges partial values into the API filters payload used for network requests.\n *\n * @param filters - Partial query parameters to persist.\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 /**\n * Updates a single temporary filter field without touching the rest of the staged filters.\n *\n * @param key - Filter key to mutate.\n * @param value - New value to assign.\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 /**\n * Normalizes the committed filters into API-ready structures and persists the result.\n */\n async submitFilterUpdate(): Promise<void> {\n await this.setState(state => {\n const apiParams: QueryParams = transformFiltersToUnitsSearchParams(\n {\n ...state.filters,\n limit: state.apiFilters.limit,\n page: state.apiFilters.page,\n sortBy: state.sortBy,\n },\n {\n defaultLimit: state.apiFilters.limit,\n defaultPage: state.apiFilters.page,\n defaultSort: state.sortBy,\n },\n );\n\n return {\n ...state,\n apiFilters: apiParams,\n };\n });\n }\n\n // === RESULTS AND SORTING ===\n\n /**\n * Persists the selected results mode (e.g. \"all\" or \"favorites\").\n *\n * @param mode - Mode identifier to store.\n */\n async setResultsMode(mode: ResultsMode): Promise<void> {\n await this.setState(state => ({ ...state, resultsMode: mode }));\n }\n\n /**\n * Persists the currently selected sort option.\n *\n * @param sortBy - Sort identifier.\n */\n async setSortBy(sortBy: SortBy): Promise<void> {\n await this.setState(state => ({ ...state, sortBy }));\n }\n\n // === QUESTIONNAIRE ===\n\n /**\n * Stores resolved questionnaire answers keyed by questionnaire name.\n *\n * @param name - Questionnaire identifier.\n * @param values - Selected option values.\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 // === VISITOR UUID ===\n\n /**\n * Reads the persisted visitor UUID from the KV store.\n *\n * @returns The visitor UUID string or null when not yet set.\n */\n async getVisitorUUID(): Promise<string | null> {\n const user = await kvGet<{ visitor_uuid?: string }>(\"user\");\n return user?.visitor_uuid ?? null;\n }\n\n /**\n * Persists a visitor UUID to the KV store.\n *\n * @param vid - Visitor UUID string returned by the session API.\n */\n async setVisitorUUID(vid: string): Promise<void> {\n const current = await kvGet<Record<string, unknown>>(\"user\");\n const safe = current !== null && typeof current === \"object\" && !Array.isArray(current) ? current : {};\n await kvSet(\"user\", { ...safe, visitor_uuid: vid });\n }\n\n /**\n * Removes the visitor UUID from the KV store.\n * Use when the stored UUID is stale (e.g. bootstrap returns 404).\n */\n async clearVisitorUUID(): Promise<void> {\n const current = await kvGet<Record<string, unknown>>(\"user\");\n if (current === null || typeof current !== \"object\" || Array.isArray(current)) return;\n const { visitor_uuid: _, ...rest } = current;\n await kvSet(\"user\", rest);\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"],"names":["defaultFilters","defaultUnifiedStoreData","UnifiedStore","state","kvGet","merged","parsed","UnifiedStoreDataSchema","sanitizedProperties","acc","key","value","entry","UserPropertyStateSchema","sanitizedUnitResults","UnitSchema","fallback","fallbackParsed","updater","currentState","newState","validatedState","kvSet","timeoutMs","deadline","propertyId","resolve","finalState","slug","id","units","schema","baseSchema","validatedUnits","unit","index","validate","unitId","url","today","formattedDate","property","updatedViewedUnits","u","_a","results","data","filters","apiParams","transformFiltersToUnitsSearchParams","mode","sortBy","name","values","user","vid","current","safe","_","rest","store"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store.cjs","sources":["../../src/stores/store.ts"],"sourcesContent":["import { kvGet, kvSet } from \"../storage\";\n\n/**\n * Persists the visitor UUID to the KV store.\n * All other state (filters, properties, units) is managed in-memory by the Zustand adapter.\n */\nclass UnifiedStore {\n async getVisitorUUID(): Promise<string | null> {\n const user = await kvGet<{ visitor_uuid?: string }>(\"user\");\n return user?.visitor_uuid ?? null;\n }\n\n async setVisitorUUID(vid: string): Promise<void> {\n const current = await kvGet<Record<string, unknown>>(\"user\");\n const safe = current !== null && typeof current === \"object\" && !Array.isArray(current) ? current : {};\n await kvSet(\"user\", { ...safe, visitor_uuid: vid });\n }\n\n async clearVisitorUUID(): Promise<void> {\n const current = await kvGet<Record<string, unknown>>(\"user\");\n if (current === null || typeof current !== \"object\" || Array.isArray(current)) return;\n const { visitor_uuid: _, ...rest } = current;\n await kvSet(\"user\", rest);\n }\n}\n\nexport const inResiOrmStore = new UnifiedStore();\n"],"names":["UnifiedStore","user","kvGet","vid","current","safe","kvSet","_","rest","inResiOrmStore"],"mappings":"kHAMA,MAAMA,CAAa,CACjB,MAAM,gBAAyC,CAC7C,MAAMC,EAAO,MAAMC,EAAAA,MAAiC,MAAM,EAC1D,OAAOD,GAAA,YAAAA,EAAM,eAAgB,IAC/B,CAEA,MAAM,eAAeE,EAA4B,CAC/C,MAAMC,EAAU,MAAMF,EAAAA,MAA+B,MAAM,EACrDG,EAAOD,IAAY,MAAQ,OAAOA,GAAY,UAAY,CAAC,MAAM,QAAQA,CAAO,EAAIA,EAAU,CAAA,EACpG,MAAME,EAAAA,MAAM,OAAQ,CAAE,GAAGD,EAAM,aAAcF,EAAK,CACpD,CAEA,MAAM,kBAAkC,CACtC,MAAMC,EAAU,MAAMF,EAAAA,MAA+B,MAAM,EAC3D,GAAIE,IAAY,MAAQ,OAAOA,GAAY,UAAY,MAAM,QAAQA,CAAO,EAAG,OAC/E,KAAM,CAAE,aAAcG,EAAG,GAAGC,GAASJ,EACrC,MAAME,EAAAA,MAAM,OAAQE,CAAI,CAC1B,CACF,CAEO,MAAMC,EAAiB,IAAIT"}
|
package/dist/stores/store.d.ts
CHANGED
|
@@ -1,162 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
* and sanitizing invalid entries where possible.
|
|
7
|
-
*/
|
|
8
|
-
private getState;
|
|
9
|
-
/**
|
|
10
|
-
* Applies an updater function to the current store state, validates the result, and persists it.
|
|
11
|
-
*
|
|
12
|
-
* @param updater - Pure function that maps the current state to the next state.
|
|
13
|
-
*/
|
|
14
|
-
private setState;
|
|
15
|
-
/**
|
|
16
|
-
* Polls the persisted state until a current property pointer is available or the timeout elapses.
|
|
17
|
-
*
|
|
18
|
-
* @param timeoutMs - Maximum time in milliseconds to wait before failing.
|
|
19
|
-
* @returns The active property ID once it becomes available.
|
|
20
|
-
* @throws Error if the property pointer is not set before the timeout expires.
|
|
21
|
-
*/
|
|
22
|
-
private waitForCurrentProperty;
|
|
23
|
-
/**
|
|
24
|
-
* Ensures a property entry exists and registers it as the current property.
|
|
25
|
-
*
|
|
26
|
-
* @param propertyId - Identifier used to track the property.
|
|
27
|
-
* @param slug - Canonical slug associated with the property.
|
|
28
|
-
*/
|
|
29
|
-
initializeProperty(propertyId: string | number, slug: string): Promise<void>;
|
|
30
|
-
/**
|
|
31
|
-
* Persists a collection of units after validating each entry against the provided schema.
|
|
32
|
-
*
|
|
33
|
-
* @param units - Raw units collection returned by an API call.
|
|
34
|
-
* @param schema - Optional override schema when the default `UnitSchema` is not sufficient.
|
|
35
|
-
*/
|
|
36
|
-
setUnitResults(units: unknown, schema?: ZodTypeAny): Promise<void>;
|
|
37
|
-
/**
|
|
38
|
-
* Clears the cached unit results array.
|
|
39
|
-
*/
|
|
40
|
-
clearUnitResults(): Promise<void>;
|
|
41
|
-
/**
|
|
42
|
-
* Marks the provided property as current and optionally updates the slug.
|
|
43
|
-
*
|
|
44
|
-
* @param propertyId - Property identifier to focus.
|
|
45
|
-
* @param slug - Optional slug override.
|
|
46
|
-
*/
|
|
47
|
-
setCurrentProperty(propertyId: string | number, slug?: string): Promise<void>;
|
|
48
|
-
/**
|
|
49
|
-
* Updates the slug for the current property selection.
|
|
50
|
-
*
|
|
51
|
-
* @param slug - New slug to persist.
|
|
52
|
-
*/
|
|
53
|
-
setCurrentPropertySlug(slug: string): Promise<void>;
|
|
54
|
-
/**
|
|
55
|
-
* Adds a slug to the `hasPreviouslySearched` list without duplicating existing entries.
|
|
56
|
-
*
|
|
57
|
-
* @param slug - Slug to record.
|
|
58
|
-
*/
|
|
59
|
-
setHasPreviouslySearched(slug: string): Promise<void>;
|
|
60
|
-
/**
|
|
61
|
-
* Records the most recent view date for a unit and opens the unit URL in the browser when available.
|
|
62
|
-
*
|
|
63
|
-
* @param unitId - Identifier of the viewed unit.
|
|
64
|
-
* @param slug - Property slug used to construct the URL.
|
|
65
|
-
*/
|
|
66
|
-
markUnitAsViewed(unitId: string, slug: string): Promise<void>;
|
|
67
|
-
/**
|
|
68
|
-
* Stamps the current property with the moment the tour outreach occurred.
|
|
69
|
-
*/
|
|
70
|
-
setTourContactedOn(): Promise<void>;
|
|
71
|
-
/**
|
|
72
|
-
* Reads the stored tour contact timestamp for the current property.
|
|
73
|
-
*
|
|
74
|
-
* @returns ISO string or null when no timestamp exists.
|
|
75
|
-
*/
|
|
76
|
-
getTourContactedOn(): Promise<string | null>;
|
|
77
|
-
/**
|
|
78
|
-
* Persists questionnaire results captured for the current property.
|
|
79
|
-
*
|
|
80
|
-
* @param results - Arbitrary questionnaire data.
|
|
81
|
-
*/
|
|
82
|
-
setQuestionnaireResults(results: unknown): Promise<void>;
|
|
83
|
-
/**
|
|
84
|
-
* Persists structured tour contact preferences for the active property. The method waits until
|
|
85
|
-
* a current property is available, allowing callers to invoke it before initialization completes.
|
|
86
|
-
*
|
|
87
|
-
* @param data - Contact preferences captured from the UI.
|
|
88
|
-
*/
|
|
89
|
-
setTourContactData(data: TourContactData): Promise<void>;
|
|
90
|
-
/**
|
|
91
|
-
* Merges the provided filter values into the committed filter state.
|
|
92
|
-
*
|
|
93
|
-
* @param filters - Partial filter payload to apply.
|
|
94
|
-
*/
|
|
95
|
-
setFilters(filters: Partial<Filters>): Promise<void>;
|
|
96
|
-
/**
|
|
97
|
-
* Updates the transient filters used for in-progress UI interactions.
|
|
98
|
-
*
|
|
99
|
-
* @param filters - Partial staging filter payload.
|
|
100
|
-
*/
|
|
101
|
-
setTempFilters(filters: Partial<Filters>): Promise<void>;
|
|
102
|
-
/**
|
|
103
|
-
* Resets the committed filters to their default values.
|
|
104
|
-
*/
|
|
105
|
-
setFiltersToDefault(): Promise<void>;
|
|
106
|
-
/**
|
|
107
|
-
* Merges partial values into the API filters payload used for network requests.
|
|
108
|
-
*
|
|
109
|
-
* @param filters - Partial query parameters to persist.
|
|
110
|
-
*/
|
|
111
|
-
setApiFilters(filters: Partial<QueryParams>): Promise<void>;
|
|
112
|
-
/**
|
|
113
|
-
* Updates a single temporary filter field without touching the rest of the staged filters.
|
|
114
|
-
*
|
|
115
|
-
* @param key - Filter key to mutate.
|
|
116
|
-
* @param value - New value to assign.
|
|
117
|
-
*/
|
|
118
|
-
handleTempFilterChange<K extends keyof Filters>(key: K, value: Filters[K]): Promise<void>;
|
|
119
|
-
/**
|
|
120
|
-
* Normalizes the committed filters into API-ready structures and persists the result.
|
|
121
|
-
*/
|
|
122
|
-
submitFilterUpdate(): Promise<void>;
|
|
123
|
-
/**
|
|
124
|
-
* Persists the selected results mode (e.g. "all" or "favorites").
|
|
125
|
-
*
|
|
126
|
-
* @param mode - Mode identifier to store.
|
|
127
|
-
*/
|
|
128
|
-
setResultsMode(mode: ResultsMode): Promise<void>;
|
|
129
|
-
/**
|
|
130
|
-
* Persists the currently selected sort option.
|
|
131
|
-
*
|
|
132
|
-
* @param sortBy - Sort identifier.
|
|
133
|
-
*/
|
|
134
|
-
setSortBy(sortBy: SortBy): Promise<void>;
|
|
135
|
-
/**
|
|
136
|
-
* Stores resolved questionnaire answers keyed by questionnaire name.
|
|
137
|
-
*
|
|
138
|
-
* @param name - Questionnaire identifier.
|
|
139
|
-
* @param values - Selected option values.
|
|
140
|
-
*/
|
|
141
|
-
setResolvedQuestionnaireValues(name: string, values: string[]): Promise<void>;
|
|
142
|
-
/**
|
|
143
|
-
* Reads the persisted visitor UUID from the KV store.
|
|
144
|
-
*
|
|
145
|
-
* @returns The visitor UUID string or null when not yet set.
|
|
146
|
-
*/
|
|
1
|
+
/**
|
|
2
|
+
* Persists the visitor UUID to the KV store.
|
|
3
|
+
* All other state (filters, properties, units) is managed in-memory by the Zustand adapter.
|
|
4
|
+
*/
|
|
5
|
+
declare class UnifiedStore {
|
|
147
6
|
getVisitorUUID(): Promise<string | null>;
|
|
148
|
-
/**
|
|
149
|
-
* Persists a visitor UUID to the KV store.
|
|
150
|
-
*
|
|
151
|
-
* @param vid - Visitor UUID string returned by the session API.
|
|
152
|
-
*/
|
|
153
7
|
setVisitorUUID(vid: string): Promise<void>;
|
|
154
|
-
/**
|
|
155
|
-
* Removes the visitor UUID from the KV store.
|
|
156
|
-
* Use when the stored UUID is stale (e.g. bootstrap returns 404).
|
|
157
|
-
*/
|
|
158
8
|
clearVisitorUUID(): Promise<void>;
|
|
159
9
|
}
|
|
160
|
-
export declare const
|
|
161
|
-
export {
|
|
162
|
-
export type { UserPropertyState, Filters } from "../schema";
|
|
10
|
+
export declare const inResiOrmStore: UnifiedStore;
|
|
11
|
+
export {};
|