@superbright/indexeddb-orm 0.1.9 → 1.0.0
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/dist/_virtual/_commonjsHelpers.cjs +2 -0
- package/dist/_virtual/_commonjsHelpers.cjs.map +1 -0
- package/dist/_virtual/_commonjsHelpers.mjs +9 -0
- package/dist/_virtual/_commonjsHelpers.mjs.map +1 -0
- package/dist/_virtual/dexie.min.cjs +2 -0
- package/dist/_virtual/dexie.min.cjs.map +1 -0
- package/dist/_virtual/dexie.min.mjs +5 -0
- package/dist/_virtual/dexie.min.mjs.map +1 -0
- package/dist/adapters/dexie.cjs +2 -0
- package/dist/adapters/dexie.cjs.map +1 -0
- package/dist/adapters/dexie.mjs +14 -0
- package/dist/adapters/dexie.mjs.map +1 -0
- package/dist/adapters/structured-store.cjs +2 -0
- package/dist/adapters/structured-store.cjs.map +1 -0
- package/dist/adapters/structured-store.mjs +50 -0
- package/dist/adapters/structured-store.mjs.map +1 -0
- package/dist/adapters/zustand-store.cjs +2 -0
- package/dist/adapters/zustand-store.cjs.map +1 -0
- package/dist/adapters/zustand-store.mjs +169 -0
- package/dist/adapters/zustand-store.mjs.map +1 -0
- package/dist/api/favorites.cjs +2 -0
- package/dist/api/favorites.cjs.map +1 -0
- package/dist/api/favorites.mjs +34 -0
- package/dist/api/favorites.mjs.map +1 -0
- package/dist/api/properties.cjs +2 -0
- package/dist/api/properties.cjs.map +1 -0
- package/dist/api/properties.mjs +197 -0
- package/dist/api/properties.mjs.map +1 -0
- package/dist/api/users.cjs +2 -0
- package/dist/api/users.cjs.map +1 -0
- package/dist/api/users.mjs +54 -0
- package/dist/api/users.mjs.map +1 -0
- package/dist/db.cjs +2 -0
- package/dist/db.cjs.map +1 -0
- package/dist/db.mjs +116 -0
- package/dist/db.mjs.map +1 -0
- package/dist/debug.cjs +2 -0
- package/dist/debug.cjs.map +1 -0
- package/dist/debug.mjs +18 -0
- package/dist/debug.mjs.map +1 -0
- package/dist/errors.cjs +2 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.mjs +15 -0
- package/dist/errors.mjs.map +1 -0
- package/dist/features/analytics/MixpanelProvider.cjs +2 -0
- package/dist/features/analytics/MixpanelProvider.cjs.map +1 -0
- package/dist/features/analytics/MixpanelProvider.mjs +40 -0
- package/dist/features/analytics/MixpanelProvider.mjs.map +1 -0
- package/dist/features/analytics/analytics.cjs +2 -0
- package/dist/features/analytics/analytics.cjs.map +1 -0
- package/dist/features/analytics/analytics.d.ts +520 -397
- package/dist/features/analytics/analytics.mjs +230 -0
- package/dist/features/analytics/analytics.mjs.map +1 -0
- package/dist/features/analytics/generateUserUUID.cjs +2 -0
- package/dist/features/analytics/generateUserUUID.cjs.map +1 -0
- package/dist/features/analytics/generateUserUUID.mjs +6 -0
- package/dist/features/analytics/generateUserUUID.mjs.map +1 -0
- package/dist/features/units/transformers.cjs +2 -0
- package/dist/features/units/transformers.cjs.map +1 -0
- package/dist/features/units/transformers.mjs +69 -0
- package/dist/features/units/transformers.mjs.map +1 -0
- package/dist/index.cjs +1 -65
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +84 -14861
- package/dist/index.mjs.map +1 -1
- package/dist/node_modules/.pnpm/dexie@4.2.0/node_modules/dexie/dist/dexie.min.cjs +4 -0
- package/dist/node_modules/.pnpm/dexie@4.2.0/node_modules/dexie/dist/dexie.min.cjs.map +1 -0
- package/dist/node_modules/.pnpm/dexie@4.2.0/node_modules/dexie/dist/dexie.min.mjs +3048 -0
- package/dist/node_modules/.pnpm/dexie@4.2.0/node_modules/dexie/dist/dexie.min.mjs.map +1 -0
- package/dist/node_modules/.pnpm/dexie@4.2.0/node_modules/dexie/import-wrapper-prod.cjs +2 -0
- package/dist/node_modules/.pnpm/dexie@4.2.0/node_modules/dexie/import-wrapper-prod.cjs.map +1 -0
- package/dist/node_modules/.pnpm/dexie@4.2.0/node_modules/dexie/import-wrapper-prod.mjs +33 -0
- package/dist/node_modules/.pnpm/dexie@4.2.0/node_modules/dexie/import-wrapper-prod.mjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.cjs +2 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.cjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.mjs +88 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.mjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.cjs +2 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.cjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.mjs +10 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.mjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.cjs +2 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.cjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.mjs +8 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.mjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.cjs +2 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.cjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.mjs +98 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.mjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.cjs +2 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.cjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.mjs +95 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.mjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.cjs +2 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.cjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.mjs +62 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.mjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.cjs +2 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.cjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.mjs +2402 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.mjs.map +1 -0
- package/dist/schema.cjs +2 -0
- package/dist/schema.cjs.map +1 -0
- package/dist/schema.d.ts +165 -0
- package/dist/schema.mjs +209 -0
- package/dist/schema.mjs.map +1 -0
- package/dist/storage.cjs +2 -0
- package/dist/storage.cjs.map +1 -0
- package/dist/storage.mjs +54 -0
- package/dist/storage.mjs.map +1 -0
- package/dist/stores/store.cjs +2 -0
- package/dist/stores/store.cjs.map +1 -0
- package/dist/stores/store.mjs +607 -0
- package/dist/stores/store.mjs.map +1 -0
- package/dist/units/favorites.cjs +2 -0
- package/dist/units/favorites.cjs.map +1 -0
- package/dist/units/favorites.mjs +19 -0
- package/dist/units/favorites.mjs.map +1 -0
- package/dist/utils/casing.cjs +2 -0
- package/dist/utils/casing.cjs.map +1 -0
- package/dist/utils/casing.d.ts +6 -0
- package/dist/utils/casing.mjs +12 -0
- package/dist/utils/casing.mjs.map +1 -0
- package/dist/utils/collections.cjs +2 -0
- package/dist/utils/collections.cjs.map +1 -0
- package/dist/utils/collections.d.ts +1 -0
- package/dist/utils/collections.mjs +13 -0
- package/dist/utils/collections.mjs.map +1 -0
- package/dist/utils/dimensions.cjs +2 -0
- package/dist/utils/dimensions.cjs.map +1 -0
- package/dist/utils/dimensions.d.ts +32 -0
- package/dist/utils/dimensions.mjs +29 -0
- package/dist/utils/dimensions.mjs.map +1 -0
- package/dist/validation.cjs +2 -0
- package/dist/validation.cjs.map +1 -0
- package/dist/validation.mjs +18 -0
- package/dist/validation.mjs.map +1 -0
- package/package.json +18 -4
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { convertKeysToSnakeCase as T, convertKeysToCamelCase as u } from "../../utils/casing.mjs";
|
|
2
|
+
import { normalizeToStringArray as h } from "../../utils/collections.mjs";
|
|
3
|
+
import { useMixpanel as q } from "./MixpanelProvider.mjs";
|
|
4
|
+
import { object as p, string as e, number as o, enum as y, any as C, unknown as U, boolean as k, array as w } from "../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.mjs";
|
|
5
|
+
const J = ["location", "budget", "size", "other"], x = [
|
|
6
|
+
"cost_low_to_high",
|
|
7
|
+
"cost_high_to_low",
|
|
8
|
+
"newest",
|
|
9
|
+
"relevance"
|
|
10
|
+
], b = [
|
|
11
|
+
"Skip",
|
|
12
|
+
"Continue",
|
|
13
|
+
"Back"
|
|
14
|
+
], c = p({
|
|
15
|
+
propertyId: e().min(1, "propertyId is required"),
|
|
16
|
+
propertySlug: e().min(1, "propertySlug is required")
|
|
17
|
+
}), l = c.extend({
|
|
18
|
+
propertyName: e().min(1, "propertyName is required")
|
|
19
|
+
}), A = l.extend({
|
|
20
|
+
totalUnitsAvailable: o().int().nonnegative(),
|
|
21
|
+
resultsUnitCount: o().int().nonnegative(),
|
|
22
|
+
unitCountDate: e().optional()
|
|
23
|
+
}), F = l.extend({
|
|
24
|
+
totalUnitsAvailable: o().int().nonnegative(),
|
|
25
|
+
resultsUnitCount: o().int().nonnegative(),
|
|
26
|
+
unitCountDate: e().optional()
|
|
27
|
+
}), m = l.extend({
|
|
28
|
+
totalUnitsAvailable: o().int().nonnegative(),
|
|
29
|
+
resultsUnitCount: o().int().nonnegative(),
|
|
30
|
+
unitCountDate: e().optional(),
|
|
31
|
+
lifestylePreferences: U().optional()
|
|
32
|
+
}), S = l.extend({
|
|
33
|
+
funnelStep: o().int().nonnegative(),
|
|
34
|
+
profileQuestion: e().min(1, "profileQuestion is required"),
|
|
35
|
+
interactedElement: y(b),
|
|
36
|
+
questionEnum: e().optional()
|
|
37
|
+
}), P = S.extend({
|
|
38
|
+
selectedAnswersEnumArray: C().transform((a) => h(a)).refine((a) => Array.isArray(a), {
|
|
39
|
+
message: "selectedAnswersEnumArray must resolve to an array"
|
|
40
|
+
})
|
|
41
|
+
});
|
|
42
|
+
c.extend({
|
|
43
|
+
unitId: e().min(1, "unitId is required"),
|
|
44
|
+
unitTitle: e().min(1, "unitTitle is required"),
|
|
45
|
+
unitSlug: e().min(1, "unitSlug is required")
|
|
46
|
+
});
|
|
47
|
+
const f = l.extend({
|
|
48
|
+
unitId: e().min(1, "unitId is required"),
|
|
49
|
+
unitTitle: e().min(1, "unitTitle is required"),
|
|
50
|
+
unitSlug: e().min(1, "unitSlug is required")
|
|
51
|
+
}), O = f.extend({
|
|
52
|
+
favoritedUnit: k()
|
|
53
|
+
}), I = C().transform((a) => h(a)).refine((a) => Array.isArray(a), {
|
|
54
|
+
message: "Selection must resolve to an array"
|
|
55
|
+
}), Q = l.extend({
|
|
56
|
+
filterIndex: o().int().nonnegative(),
|
|
57
|
+
filterLabel: e().min(1, "filterLabel is required"),
|
|
58
|
+
selectedFiltersEnum: I,
|
|
59
|
+
filterName: e().optional()
|
|
60
|
+
}), v = l.extend({
|
|
61
|
+
filterIndex: o().int().nonnegative(),
|
|
62
|
+
filterLabel: e().min(1, "filterLabel is required"),
|
|
63
|
+
selectedFiltersEnum: I
|
|
64
|
+
}), g = c.extend({
|
|
65
|
+
sortIndex: o().int().nonnegative(),
|
|
66
|
+
sortEnum: y(x)
|
|
67
|
+
}), D = l.extend({
|
|
68
|
+
sortIndex: o().int().nonnegative(),
|
|
69
|
+
sortEnum: y(x),
|
|
70
|
+
resultsUnitCount: o().int().nonnegative(),
|
|
71
|
+
unitCountDate: e().optional()
|
|
72
|
+
}), K = c.extend({
|
|
73
|
+
fullQuestionnaireSchemaJson: U().optional(),
|
|
74
|
+
resultsJson: p({
|
|
75
|
+
type: e().optional(),
|
|
76
|
+
total: o().int().nonnegative().optional(),
|
|
77
|
+
units: w(
|
|
78
|
+
p({
|
|
79
|
+
unitId: e().min(1, "unitId is required"),
|
|
80
|
+
unitName: e().optional()
|
|
81
|
+
})
|
|
82
|
+
).optional()
|
|
83
|
+
}).optional()
|
|
84
|
+
}), z = f.extend({
|
|
85
|
+
favoritedUnit: k()
|
|
86
|
+
}), N = f.extend({
|
|
87
|
+
favoritedUnit: k()
|
|
88
|
+
}), L = l.extend({
|
|
89
|
+
unitId: e().min(1, "unitId is required"),
|
|
90
|
+
unitTitle: e().min(1, "unitTitle is required"),
|
|
91
|
+
unitSlug: e().min(1, "unitSlug is required"),
|
|
92
|
+
resultsUnitCount: o().int().nonnegative(),
|
|
93
|
+
unitCountDate: e().optional()
|
|
94
|
+
});
|
|
95
|
+
function _() {
|
|
96
|
+
const a = q();
|
|
97
|
+
return (s, n) => {
|
|
98
|
+
const t = n == null ? n : T(n);
|
|
99
|
+
a.track(s, t);
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const M = (a, s, n, t) => (r) => {
|
|
103
|
+
const i = u(
|
|
104
|
+
r
|
|
105
|
+
), d = s.parse(i), E = t != null && t.forwardOriginalPayload ? r : d;
|
|
106
|
+
n(a, E, {
|
|
107
|
+
skipKeyTransform: t == null ? void 0 : t.skipKeyTransform
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
function V(a) {
|
|
111
|
+
const s = (t, r, i) => {
|
|
112
|
+
const d = i != null && i.skipKeyTransform ? r : T(r);
|
|
113
|
+
a(t, d);
|
|
114
|
+
}, n = (t, r, i) => M(t, r, s, i);
|
|
115
|
+
return {
|
|
116
|
+
trackViewAllUnits: (t) => {
|
|
117
|
+
const r = u(
|
|
118
|
+
t
|
|
119
|
+
), i = A.parse({
|
|
120
|
+
unitCountDate: (/* @__PURE__ */ new Date()).toISOString(),
|
|
121
|
+
...r
|
|
122
|
+
});
|
|
123
|
+
s("View All Units", i);
|
|
124
|
+
},
|
|
125
|
+
trackQuestionnaireSkip: (t) => {
|
|
126
|
+
const r = u(
|
|
127
|
+
t
|
|
128
|
+
), i = S.parse({
|
|
129
|
+
...r,
|
|
130
|
+
interactedElement: "Skip"
|
|
131
|
+
});
|
|
132
|
+
s("Questionnaire Navigated", i);
|
|
133
|
+
},
|
|
134
|
+
trackQuestionnaireContinue: (t) => {
|
|
135
|
+
const r = u(
|
|
136
|
+
t
|
|
137
|
+
), i = P.parse({
|
|
138
|
+
...r,
|
|
139
|
+
interactedElement: "Continue"
|
|
140
|
+
});
|
|
141
|
+
s("Questionnaire Navigated", i);
|
|
142
|
+
},
|
|
143
|
+
trackQuestionnaireBack: (t) => {
|
|
144
|
+
const r = u(
|
|
145
|
+
t
|
|
146
|
+
), i = S.parse({
|
|
147
|
+
...r,
|
|
148
|
+
interactedElement: "Back"
|
|
149
|
+
});
|
|
150
|
+
s("Questionnaire Navigated", i);
|
|
151
|
+
},
|
|
152
|
+
trackClickUnit: n("Unit Card Clicked", z, {
|
|
153
|
+
skipKeyTransform: !0,
|
|
154
|
+
forwardOriginalPayload: !0
|
|
155
|
+
}),
|
|
156
|
+
trackHoverUnit: n("Unit Hovered", O, {
|
|
157
|
+
skipKeyTransform: !0,
|
|
158
|
+
forwardOriginalPayload: !0
|
|
159
|
+
}),
|
|
160
|
+
trackLoadMore: (t) => {
|
|
161
|
+
const r = u(
|
|
162
|
+
t
|
|
163
|
+
), i = F.parse({
|
|
164
|
+
unitCountDate: (/* @__PURE__ */ new Date()).toISOString(),
|
|
165
|
+
...r
|
|
166
|
+
});
|
|
167
|
+
s("Load More", i);
|
|
168
|
+
},
|
|
169
|
+
trackFilterOpened: n("Filter Opened", Q),
|
|
170
|
+
trackFilterCanceled: n(
|
|
171
|
+
"Filter Canceled",
|
|
172
|
+
v
|
|
173
|
+
),
|
|
174
|
+
trackFilterApplied: n(
|
|
175
|
+
"Filter Applied",
|
|
176
|
+
v
|
|
177
|
+
),
|
|
178
|
+
trackOpenSort: (t) => {
|
|
179
|
+
const r = u(
|
|
180
|
+
t
|
|
181
|
+
), i = D.parse({
|
|
182
|
+
unitCountDate: (/* @__PURE__ */ new Date()).toISOString(),
|
|
183
|
+
...r
|
|
184
|
+
});
|
|
185
|
+
s("Sort Opened", i);
|
|
186
|
+
},
|
|
187
|
+
trackSelectSort: n("Sort Applied", g),
|
|
188
|
+
trackCancelSort: n("Sort Canceled", g),
|
|
189
|
+
trackClickUnitFavorites: n(
|
|
190
|
+
"Unit Favorited",
|
|
191
|
+
N
|
|
192
|
+
),
|
|
193
|
+
trackUnitUnfavorited: n(
|
|
194
|
+
"Unit Unfavorited",
|
|
195
|
+
L
|
|
196
|
+
),
|
|
197
|
+
trackQuestionnaireResult: n(
|
|
198
|
+
"Questionnaire Submitted",
|
|
199
|
+
K
|
|
200
|
+
),
|
|
201
|
+
trackScheduleTourFormInteracted: n(
|
|
202
|
+
"Schedule Tour Form Interacted",
|
|
203
|
+
m,
|
|
204
|
+
{ skipKeyTransform: !0, forwardOriginalPayload: !0 }
|
|
205
|
+
),
|
|
206
|
+
trackScheduleTourFormSubmitted: n(
|
|
207
|
+
"Schedule Tour Form Submitted",
|
|
208
|
+
m,
|
|
209
|
+
{ skipKeyTransform: !0, forwardOriginalPayload: !0 }
|
|
210
|
+
),
|
|
211
|
+
trackScheduleTourUrlClicked: n(
|
|
212
|
+
"Schedule Tour URL Clicked",
|
|
213
|
+
m,
|
|
214
|
+
{ skipKeyTransform: !0, forwardOriginalPayload: !0 }
|
|
215
|
+
)
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
function W() {
|
|
219
|
+
const a = _();
|
|
220
|
+
return V(a);
|
|
221
|
+
}
|
|
222
|
+
export {
|
|
223
|
+
J as QuestionEnumValues,
|
|
224
|
+
b as QuestionnaireInteractionValues,
|
|
225
|
+
x as SortEnumValues,
|
|
226
|
+
V as buildTrackingEvents,
|
|
227
|
+
_ as useTrackEvent,
|
|
228
|
+
W as useTrackingEvents
|
|
229
|
+
};
|
|
230
|
+
//# sourceMappingURL=analytics.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.mjs","sources":["../../../src/features/analytics/analytics.ts"],"sourcesContent":["import { z } from \"zod\";\n\nimport {\n convertKeysToCamelCase,\n convertKeysToSnakeCase,\n} from \"../../utils/casing\";\nimport { normalizeToStringArray } from \"../../utils/collections\";\nimport { useMixpanel } from \"./MixpanelProvider\";\n\nexport const QuestionEnumValues = [\"location\", \"budget\", \"size\", \"other\"] as const;\nexport type QuestionEnum = (typeof QuestionEnumValues)[number];\nexport type FilterEnum = string;\nexport const SortEnumValues = [\n \"cost_low_to_high\",\n \"cost_high_to_low\",\n \"newest\",\n \"relevance\",\n] as const;\nexport type SortEnum = (typeof SortEnumValues)[number];\nexport const QuestionnaireInteractionValues = [\n \"Skip\",\n \"Continue\",\n \"Back\",\n] as const;\nexport type QuestionnaireInteraction =\n (typeof QuestionnaireInteractionValues)[number];\n\nconst propertyContextSchema = z.object({\n propertyId: z.string().min(1, \"propertyId is required\"),\n propertySlug: z.string().min(1, \"propertySlug is required\"),\n});\n\nconst propertyWithNameSchema = propertyContextSchema.extend({\n propertyName: z.string().min(1, \"propertyName is required\"),\n});\n\nconst viewAllUnitsSchema = propertyWithNameSchema.extend({\n totalUnitsAvailable: z.number().int().nonnegative(),\n resultsUnitCount: z.number().int().nonnegative(),\n unitCountDate: z.string().optional(),\n});\n\nconst loadMoreSchema = propertyWithNameSchema.extend({\n totalUnitsAvailable: z.number().int().nonnegative(),\n resultsUnitCount: z.number().int().nonnegative(),\n unitCountDate: z.string().optional(),\n});\n\nconst scheduleTourFormSchema = propertyWithNameSchema.extend({\n totalUnitsAvailable: z.number().int().nonnegative(),\n resultsUnitCount: z.number().int().nonnegative(),\n unitCountDate: z.string().optional(),\n lifestylePreferences: z.unknown().optional(),\n});\n\nconst questionnaireEventSchema = propertyWithNameSchema.extend({\n funnelStep: z.number().int().nonnegative(),\n profileQuestion: z.string().min(1, \"profileQuestion is required\"),\n interactedElement: z.enum(QuestionnaireInteractionValues),\n questionEnum: z.string().optional(),\n});\n\nconst continueQuestionnaireEventSchema = questionnaireEventSchema.extend({\n selectedAnswersEnumArray: z\n .any()\n .transform((value) => normalizeToStringArray(value))\n .refine((value): value is string[] => Array.isArray(value), {\n message: \"selectedAnswersEnumArray must resolve to an array\",\n }),\n});\n\nconst unitEventSchema = propertyContextSchema.extend({\n unitId: z.string().min(1, \"unitId is required\"),\n unitTitle: z.string().min(1, \"unitTitle is required\"),\n unitSlug: z.string().min(1, \"unitSlug is required\"),\n});\n\nconst unitWithPropertyNameSchema = propertyWithNameSchema.extend({\n unitId: z.string().min(1, \"unitId is required\"),\n unitTitle: z.string().min(1, \"unitTitle is required\"),\n unitSlug: z.string().min(1, \"unitSlug is required\"),\n});\n\nconst hoverUnitSchema = unitWithPropertyNameSchema.extend({\n favoritedUnit: z.boolean(),\n});\n\nconst selectionSchema = z\n .any()\n .transform((value) => normalizeToStringArray(value))\n .refine((value): value is string[] => Array.isArray(value), {\n message: \"Selection must resolve to an array\",\n });\n\nconst filterOpenSchema = propertyWithNameSchema.extend({\n filterIndex: z.number().int().nonnegative(),\n filterLabel: z.string().min(1, \"filterLabel is required\"),\n selectedFiltersEnum: selectionSchema,\n filterName: z.string().optional(),\n});\n\nconst filterMutationSchema = propertyWithNameSchema.extend({\n filterIndex: z.number().int().nonnegative(),\n filterLabel: z.string().min(1, \"filterLabel is required\"),\n selectedFiltersEnum: selectionSchema,\n});\n\nconst sortEventSchema = propertyContextSchema.extend({\n sortIndex: z.number().int().nonnegative(),\n sortEnum: z.enum(SortEnumValues),\n});\n\nconst sortOpenSchema = propertyWithNameSchema.extend({\n sortIndex: z.number().int().nonnegative(),\n sortEnum: z.enum(SortEnumValues),\n resultsUnitCount: z.number().int().nonnegative(),\n unitCountDate: z.string().optional(),\n});\n\nconst questionnaireResultSchema = propertyContextSchema.extend({\n fullQuestionnaireSchemaJson: z.unknown().optional(),\n resultsJson: z\n .object({\n type: z.string().optional(),\n total: z.number().int().nonnegative().optional(),\n units: z\n .array(\n z.object({\n unitId: z.string().min(1, \"unitId is required\"),\n unitName: z.string().optional(),\n })\n )\n .optional(),\n })\n .optional(),\n});\n\nconst clickUnitSchema = unitWithPropertyNameSchema.extend({\n favoritedUnit: z.boolean(),\n});\n\nconst clickUnitFavoritesSchema = unitWithPropertyNameSchema.extend({\n favoritedUnit: z.boolean(),\n});\n\nconst unitUnfavoritedSchema = propertyWithNameSchema.extend({\n unitId: z.string().min(1, \"unitId is required\"),\n unitTitle: z.string().min(1, \"unitTitle is required\"),\n unitSlug: z.string().min(1, \"unitSlug is required\"),\n resultsUnitCount: z.number().int().nonnegative(),\n unitCountDate: z.string().optional(),\n});\n\nexport type BaseEvent = z.infer<typeof propertyContextSchema>;\nexport type ViewAllUnitsEvent = z.infer<typeof viewAllUnitsSchema>;\nexport type LoadMoreEvent = z.infer<typeof loadMoreSchema>;\nexport type QuestionnaireEvent = z.infer<typeof questionnaireEventSchema>;\nexport type ContinueQuestionnaireEvent = z.infer<\n typeof continueQuestionnaireEventSchema\n>;\nexport type ClickUnitEvent = z.infer<typeof clickUnitSchema>;\nexport type UnitEvent = z.infer<typeof unitEventSchema>;\nexport type HoverUnitEvent = z.infer<typeof hoverUnitSchema>;\nexport type FilterEvent = z.infer<typeof filterMutationSchema>;\nexport type FilterOpenEvent = z.infer<typeof filterOpenSchema>;\nexport type SortEvent = z.infer<typeof sortEventSchema>;\nexport type SortOpenEvent = z.infer<typeof sortOpenSchema>;\nexport type QuestionnaireResultEvent = z.infer<\n typeof questionnaireResultSchema\n>;\nexport type ClickUnitFavoritesEvent = z.infer<typeof clickUnitFavoritesSchema>;\nexport type ScheduleTourFormEvent = z.infer<typeof scheduleTourFormSchema>;\nexport type UnitUnfavoritedEvent = z.infer<typeof unitUnfavoritedSchema>;\n\nexport type TrackingEventWithUnits = FilterEvent & {\n trackingEvent: (payload: FilterEvent) => void;\n [metadata: string]: unknown;\n};\n\nexport type TrackEventFn = (eventName: string, data?: Record<string, any>) => void;\n\nexport function useTrackEvent() {\n const mixpanel = useMixpanel();\n return (eventName: string, data?: Record<string, any>) => {\n const payload =\n data == null ? data : (convertKeysToSnakeCase(data) as Record<string, any>);\n mixpanel.track(eventName, payload);\n };\n}\n\nconst createStrictTrackerInternal =\n <Schema extends z.ZodTypeAny>(\n eventName: string,\n schema: Schema,\n dispatch: (\n eventName: string,\n payload: unknown,\n options?: { skipKeyTransform?: boolean },\n ) => void,\n options?: { skipKeyTransform?: boolean; forwardOriginalPayload?: boolean },\n ) =>\n (payload: z.input<Schema>) => {\n const normalizedPayload = convertKeysToCamelCase(\n payload,\n ) as z.input<Schema>;\n const parsed = schema.parse(normalizedPayload);\n const payloadForDispatch = options?.forwardOriginalPayload\n ? payload\n : parsed;\n dispatch(eventName, payloadForDispatch, {\n skipKeyTransform: options?.skipKeyTransform,\n });\n };\n\nexport function buildTrackingEvents(trackEvent: TrackEventFn) {\n const dispatch = (\n eventName: string,\n payload: unknown,\n options?: { skipKeyTransform?: boolean },\n ) => {\n const finalPayload = options?.skipKeyTransform\n ? (payload as Record<string, any>)\n : (convertKeysToSnakeCase(payload) as Record<string, any>);\n trackEvent(eventName, finalPayload);\n };\n\n const createStrictTracker = <Schema extends z.ZodTypeAny>(\n eventName: string,\n schema: Schema,\n options?: { skipKeyTransform?: boolean; forwardOriginalPayload?: boolean },\n ) => createStrictTrackerInternal(eventName, schema, dispatch, options);\n\n return {\n trackViewAllUnits: (payload: z.input<typeof viewAllUnitsSchema>) => {\n const normalizedPayload = convertKeysToCamelCase(\n payload,\n ) as z.input<typeof viewAllUnitsSchema>;\n const parsed = viewAllUnitsSchema.parse({\n unitCountDate: new Date().toISOString(),\n ...normalizedPayload,\n });\n dispatch(\"View All Units\", parsed);\n },\n trackQuestionnaireSkip: (\n payload: Omit<\n z.input<typeof questionnaireEventSchema>,\n \"interactedElement\"\n >,\n ) => {\n const normalizedPayload = convertKeysToCamelCase(\n payload,\n ) as Omit<\n z.input<typeof questionnaireEventSchema>,\n \"interactedElement\"\n >;\n const parsed = questionnaireEventSchema.parse({\n ...normalizedPayload,\n interactedElement: \"Skip\",\n });\n dispatch(\"Questionnaire Navigated\", parsed);\n },\n trackQuestionnaireContinue: (\n payload: Omit<\n z.input<typeof continueQuestionnaireEventSchema>,\n \"interactedElement\"\n >,\n ) => {\n const normalizedPayload = convertKeysToCamelCase(\n payload,\n ) as Omit<\n z.input<typeof continueQuestionnaireEventSchema>,\n \"interactedElement\"\n >;\n const parsed = continueQuestionnaireEventSchema.parse({\n ...normalizedPayload,\n interactedElement: \"Continue\",\n });\n dispatch(\"Questionnaire Navigated\", parsed);\n },\n trackQuestionnaireBack: (\n payload: Omit<\n z.input<typeof questionnaireEventSchema>,\n \"interactedElement\"\n >,\n ) => {\n const normalizedPayload = convertKeysToCamelCase(\n payload,\n ) as Omit<\n z.input<typeof questionnaireEventSchema>,\n \"interactedElement\"\n >;\n const parsed = questionnaireEventSchema.parse({\n ...normalizedPayload,\n interactedElement: \"Back\",\n });\n dispatch(\"Questionnaire Navigated\", parsed);\n },\n trackClickUnit: createStrictTracker(\"Unit Card Clicked\", clickUnitSchema, {\n skipKeyTransform: true,\n forwardOriginalPayload: true,\n }),\n trackHoverUnit: createStrictTracker(\"Unit Hovered\", hoverUnitSchema, {\n skipKeyTransform: true,\n forwardOriginalPayload: true,\n }),\n trackLoadMore: (payload: z.input<typeof loadMoreSchema>) => {\n const normalizedPayload = convertKeysToCamelCase(\n payload,\n ) as z.input<typeof loadMoreSchema>;\n const parsed = loadMoreSchema.parse({\n unitCountDate: new Date().toISOString(),\n ...normalizedPayload,\n });\n dispatch(\"Load More\", parsed);\n },\n trackFilterOpened: createStrictTracker(\"Filter Opened\", filterOpenSchema),\n trackFilterCanceled: createStrictTracker(\n \"Filter Canceled\",\n filterMutationSchema,\n ),\n trackFilterApplied: createStrictTracker(\n \"Filter Applied\",\n filterMutationSchema,\n ),\n trackOpenSort: (payload: z.input<typeof sortOpenSchema>) => {\n const normalizedPayload = convertKeysToCamelCase(\n payload,\n ) as z.input<typeof sortOpenSchema>;\n const parsed = sortOpenSchema.parse({\n unitCountDate: new Date().toISOString(),\n ...normalizedPayload,\n });\n dispatch(\"Sort Opened\", parsed);\n },\n trackSelectSort: createStrictTracker(\"Sort Applied\", sortEventSchema),\n trackCancelSort: createStrictTracker(\"Sort Canceled\", sortEventSchema),\n trackClickUnitFavorites: createStrictTracker(\n \"Unit Favorited\",\n clickUnitFavoritesSchema,\n ),\n trackUnitUnfavorited: createStrictTracker(\n \"Unit Unfavorited\",\n unitUnfavoritedSchema,\n ),\n trackQuestionnaireResult: createStrictTracker(\n \"Questionnaire Submitted\",\n questionnaireResultSchema,\n ),\n trackScheduleTourFormInteracted: createStrictTracker(\n \"Schedule Tour Form Interacted\",\n scheduleTourFormSchema,\n { skipKeyTransform: true, forwardOriginalPayload: true },\n ),\n trackScheduleTourFormSubmitted: createStrictTracker(\n \"Schedule Tour Form Submitted\",\n scheduleTourFormSchema,\n { skipKeyTransform: true, forwardOriginalPayload: true },\n ),\n trackScheduleTourUrlClicked: createStrictTracker(\n \"Schedule Tour URL Clicked\",\n scheduleTourFormSchema,\n { skipKeyTransform: true, forwardOriginalPayload: true },\n ),\n };\n}\n\nexport function useTrackingEvents() {\n const trackEvent = useTrackEvent();\n return buildTrackingEvents(trackEvent);\n}\n"],"names":["QuestionEnumValues","SortEnumValues","QuestionnaireInteractionValues","propertyContextSchema","z.object","z.string","propertyWithNameSchema","viewAllUnitsSchema","z.number","loadMoreSchema","scheduleTourFormSchema","z.unknown","questionnaireEventSchema","z.enum","continueQuestionnaireEventSchema","z.any","value","normalizeToStringArray","unitWithPropertyNameSchema","hoverUnitSchema","z.boolean","selectionSchema","filterOpenSchema","filterMutationSchema","sortEventSchema","sortOpenSchema","questionnaireResultSchema","z.array","clickUnitSchema","clickUnitFavoritesSchema","unitUnfavoritedSchema","useTrackEvent","mixpanel","useMixpanel","eventName","data","payload","convertKeysToSnakeCase","createStrictTrackerInternal","schema","dispatch","options","normalizedPayload","convertKeysToCamelCase","parsed","payloadForDispatch","buildTrackingEvents","trackEvent","finalPayload","createStrictTracker","useTrackingEvents"],"mappings":";;;;AASO,MAAMA,IAAqB,CAAC,YAAY,UAAU,QAAQ,OAAO,GAG3DC,IAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEaC,IAAiC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AACF,GAIMC,IAAwBC,EAAS;AAAA,EACrC,YAAYC,EAAE,EAAS,IAAI,GAAG,wBAAwB;AAAA,EACtD,cAAcA,EAAE,EAAS,IAAI,GAAG,0BAA0B;AAC5D,CAAC,GAEKC,IAAyBH,EAAsB,OAAO;AAAA,EAC1D,cAAcE,EAAE,EAAS,IAAI,GAAG,0BAA0B;AAC5D,CAAC,GAEKE,IAAqBD,EAAuB,OAAO;AAAA,EACvD,qBAAqBE,EAAE,EAAS,IAAA,EAAM,YAAA;AAAA,EACtC,kBAAkBA,EAAE,EAAS,IAAA,EAAM,YAAA;AAAA,EACnC,eAAeH,EAAE,EAAS,SAAA;AAC5B,CAAC,GAEKI,IAAiBH,EAAuB,OAAO;AAAA,EACnD,qBAAqBE,EAAE,EAAS,IAAA,EAAM,YAAA;AAAA,EACtC,kBAAkBA,EAAE,EAAS,IAAA,EAAM,YAAA;AAAA,EACnC,eAAeH,EAAE,EAAS,SAAA;AAC5B,CAAC,GAEKK,IAAyBJ,EAAuB,OAAO;AAAA,EAC3D,qBAAqBE,EAAE,EAAS,IAAA,EAAM,YAAA;AAAA,EACtC,kBAAkBA,EAAE,EAAS,IAAA,EAAM,YAAA;AAAA,EACnC,eAAeH,EAAE,EAAS,SAAA;AAAA,EAC1B,sBAAsBM,EAAE,EAAU,SAAA;AACpC,CAAC,GAEKC,IAA2BN,EAAuB,OAAO;AAAA,EAC7D,YAAYE,EAAE,EAAS,IAAA,EAAM,YAAA;AAAA,EAC7B,iBAAiBH,EAAE,EAAS,IAAI,GAAG,6BAA6B;AAAA,EAChE,mBAAmBQ,EAAOX,CAA8B;AAAA,EACxD,cAAcG,EAAE,EAAS,SAAA;AAC3B,CAAC,GAEKS,IAAmCF,EAAyB,OAAO;AAAA,EACvE,0BAA0BG,EACvB,EACA,UAAU,CAACC,MAAUC,EAAuBD,CAAK,CAAC,EAClD,OAAO,CAACA,MAA6B,MAAM,QAAQA,CAAK,GAAG;AAAA,IAC1D,SAAS;AAAA,EAAA,CACV;AACL,CAAC;AAEuBb,EAAsB,OAAO;AAAA,EACnD,QAAQE,EAAE,EAAS,IAAI,GAAG,oBAAoB;AAAA,EAC9C,WAAWA,EAAE,EAAS,IAAI,GAAG,uBAAuB;AAAA,EACpD,UAAUA,EAAE,EAAS,IAAI,GAAG,sBAAsB;AACpD,CAAC;AAED,MAAMa,IAA6BZ,EAAuB,OAAO;AAAA,EAC/D,QAAQD,EAAE,EAAS,IAAI,GAAG,oBAAoB;AAAA,EAC9C,WAAWA,EAAE,EAAS,IAAI,GAAG,uBAAuB;AAAA,EACpD,UAAUA,EAAE,EAAS,IAAI,GAAG,sBAAsB;AACpD,CAAC,GAEKc,IAAkBD,EAA2B,OAAO;AAAA,EACxD,eAAeE,EAAE;AACnB,CAAC,GAEKC,IAAkBN,EACrB,EACA,UAAU,CAACC,MAAUC,EAAuBD,CAAK,CAAC,EAClD,OAAO,CAACA,MAA6B,MAAM,QAAQA,CAAK,GAAG;AAAA,EAC1D,SAAS;AACX,CAAC,GAEGM,IAAmBhB,EAAuB,OAAO;AAAA,EACrD,aAAaE,EAAE,EAAS,IAAA,EAAM,YAAA;AAAA,EAC9B,aAAaH,EAAE,EAAS,IAAI,GAAG,yBAAyB;AAAA,EACxD,qBAAqBgB;AAAA,EACrB,YAAYhB,EAAE,EAAS,SAAA;AACzB,CAAC,GAEKkB,IAAuBjB,EAAuB,OAAO;AAAA,EACzD,aAAaE,EAAE,EAAS,IAAA,EAAM,YAAA;AAAA,EAC9B,aAAaH,EAAE,EAAS,IAAI,GAAG,yBAAyB;AAAA,EACxD,qBAAqBgB;AACvB,CAAC,GAEKG,IAAkBrB,EAAsB,OAAO;AAAA,EACnD,WAAWK,EAAE,EAAS,IAAA,EAAM,YAAA;AAAA,EAC5B,UAAUK,EAAOZ,CAAc;AACjC,CAAC,GAEKwB,IAAiBnB,EAAuB,OAAO;AAAA,EAClD,WAAWE,EAAE,EAAS,IAAA,EAAM,YAAA;AAAA,EAC5B,UAAUK,EAAOZ,CAAc;AAAA,EAC/B,kBAAkBO,EAAE,EAAS,IAAA,EAAM,YAAA;AAAA,EACnC,eAAeH,EAAE,EAAS,SAAA;AAC7B,CAAC,GAEKqB,IAA4BvB,EAAsB,OAAO;AAAA,EAC7D,6BAA6BQ,EAAE,EAAU,SAAA;AAAA,EACzC,aAAaP,EACH;AAAA,IACN,MAAMC,EAAE,EAAS,SAAA;AAAA,IACjB,OAAOG,EAAE,EAAS,MAAM,YAAA,EAAc,SAAA;AAAA,IACtC,OAAOmB;AAAAA,MAEHvB,EAAS;AAAA,QACP,QAAQC,EAAE,EAAS,IAAI,GAAG,oBAAoB;AAAA,QAC9C,UAAUA,EAAE,EAAS,SAAA;AAAA,MAAS,CAC/B;AAAA,IAAA,EAEF,SAAA;AAAA,EAAS,CACb,EACA,SAAA;AACL,CAAC,GAEKuB,IAAkBV,EAA2B,OAAO;AAAA,EACxD,eAAeE,EAAE;AACnB,CAAC,GAEKS,IAA2BX,EAA2B,OAAO;AAAA,EACjE,eAAeE,EAAE;AACnB,CAAC,GAEKU,IAAwBxB,EAAuB,OAAO;AAAA,EAC1D,QAAQD,EAAE,EAAS,IAAI,GAAG,oBAAoB;AAAA,EAC9C,WAAWA,EAAE,EAAS,IAAI,GAAG,uBAAuB;AAAA,EACpD,UAAUA,EAAE,EAAS,IAAI,GAAG,sBAAsB;AAAA,EAClD,kBAAkBG,EAAE,EAAS,IAAA,EAAM,YAAA;AAAA,EACnC,eAAeH,EAAE,EAAS,SAAA;AAC5B,CAAC;AA8BM,SAAS0B,IAAgB;AAC9B,QAAMC,IAAWC,EAAA;AACjB,SAAO,CAACC,GAAmBC,MAA+B;AACxD,UAAMC,IACJD,KAAQ,OAAOA,IAAQE,EAAuBF,CAAI;AACpD,IAAAH,EAAS,MAAME,GAAWE,CAAO;AAAA,EACnC;AACF;AAEA,MAAME,IACJ,CACEJ,GACAK,GACAC,GAKAC,MAEF,CAACL,MAA6B;AAC5B,QAAMM,IAAoBC;AAAA,IACxBP;AAAA,EAAA,GAEIQ,IAASL,EAAO,MAAMG,CAAiB,GACvCG,IAAqBJ,KAAA,QAAAA,EAAS,yBAChCL,IACAQ;AACJ,EAAAJ,EAASN,GAAWW,GAAoB;AAAA,IACtC,kBAAkBJ,KAAA,gBAAAA,EAAS;AAAA,EAAA,CAC5B;AACH;AAEK,SAASK,EAAoBC,GAA0B;AAC5D,QAAMP,IAAW,CACfN,GACAE,GACAK,MACG;AACH,UAAMO,IAAeP,KAAA,QAAAA,EAAS,mBACzBL,IACAC,EAAuBD,CAAO;AACnC,IAAAW,EAAWb,GAAWc,CAAY;AAAA,EACpC,GAEMC,IAAsB,CAC1Bf,GACAK,GACAE,MACGH,EAA4BJ,GAAWK,GAAQC,GAAUC,CAAO;AAErE,SAAO;AAAA,IACL,mBAAmB,CAACL,MAAgD;AAClE,YAAMM,IAAoBC;AAAA,QACxBP;AAAA,MAAA,GAEIQ,IAASrC,EAAmB,MAAM;AAAA,QACtC,gBAAe,oBAAI,KAAA,GAAO,YAAA;AAAA,QAC1B,GAAGmC;AAAA,MAAA,CACJ;AACD,MAAAF,EAAS,kBAAkBI,CAAM;AAAA,IACnC;AAAA,IACA,wBAAwB,CACtBR,MAIG;AACH,YAAMM,IAAoBC;AAAA,QACxBP;AAAA,MAAA,GAKIQ,IAAShC,EAAyB,MAAM;AAAA,QAC5C,GAAG8B;AAAA,QACH,mBAAmB;AAAA,MAAA,CACpB;AACD,MAAAF,EAAS,2BAA2BI,CAAM;AAAA,IAC5C;AAAA,IACA,4BAA4B,CAC1BR,MAIG;AACH,YAAMM,IAAoBC;AAAA,QACxBP;AAAA,MAAA,GAKIQ,IAAS9B,EAAiC,MAAM;AAAA,QACpD,GAAG4B;AAAA,QACH,mBAAmB;AAAA,MAAA,CACpB;AACD,MAAAF,EAAS,2BAA2BI,CAAM;AAAA,IAC5C;AAAA,IACA,wBAAwB,CACtBR,MAIG;AACH,YAAMM,IAAoBC;AAAA,QACxBP;AAAA,MAAA,GAKIQ,IAAShC,EAAyB,MAAM;AAAA,QAC5C,GAAG8B;AAAA,QACH,mBAAmB;AAAA,MAAA,CACpB;AACD,MAAAF,EAAS,2BAA2BI,CAAM;AAAA,IAC5C;AAAA,IACA,gBAAgBK,EAAoB,qBAAqBrB,GAAiB;AAAA,MACxE,kBAAkB;AAAA,MAClB,wBAAwB;AAAA,IAAA,CACzB;AAAA,IACD,gBAAgBqB,EAAoB,gBAAgB9B,GAAiB;AAAA,MACnE,kBAAkB;AAAA,MAClB,wBAAwB;AAAA,IAAA,CACzB;AAAA,IACD,eAAe,CAACiB,MAA4C;AAC1D,YAAMM,IAAoBC;AAAA,QACxBP;AAAA,MAAA,GAEIQ,IAASnC,EAAe,MAAM;AAAA,QAClC,gBAAe,oBAAI,KAAA,GAAO,YAAA;AAAA,QAC1B,GAAGiC;AAAA,MAAA,CACJ;AACD,MAAAF,EAAS,aAAaI,CAAM;AAAA,IAC9B;AAAA,IACA,mBAAmBK,EAAoB,iBAAiB3B,CAAgB;AAAA,IACxE,qBAAqB2B;AAAA,MACnB;AAAA,MACA1B;AAAA,IAAA;AAAA,IAEF,oBAAoB0B;AAAA,MAClB;AAAA,MACA1B;AAAA,IAAA;AAAA,IAEF,eAAe,CAACa,MAA4C;AAC1D,YAAMM,IAAoBC;AAAA,QACxBP;AAAA,MAAA,GAEIQ,IAASnB,EAAe,MAAM;AAAA,QAClC,gBAAe,oBAAI,KAAA,GAAO,YAAA;AAAA,QAC1B,GAAGiB;AAAA,MAAA,CACJ;AACD,MAAAF,EAAS,eAAeI,CAAM;AAAA,IAChC;AAAA,IACA,iBAAiBK,EAAoB,gBAAgBzB,CAAe;AAAA,IACpE,iBAAiByB,EAAoB,iBAAiBzB,CAAe;AAAA,IACrE,yBAAyByB;AAAA,MACvB;AAAA,MACApB;AAAA,IAAA;AAAA,IAEF,sBAAsBoB;AAAA,MACpB;AAAA,MACAnB;AAAA,IAAA;AAAA,IAEF,0BAA0BmB;AAAA,MACxB;AAAA,MACAvB;AAAA,IAAA;AAAA,IAEF,iCAAiCuB;AAAA,MAC/B;AAAA,MACAvC;AAAA,MACA,EAAE,kBAAkB,IAAM,wBAAwB,GAAA;AAAA,IAAK;AAAA,IAEzD,gCAAgCuC;AAAA,MAC9B;AAAA,MACAvC;AAAA,MACA,EAAE,kBAAkB,IAAM,wBAAwB,GAAA;AAAA,IAAK;AAAA,IAEzD,6BAA6BuC;AAAA,MAC3B;AAAA,MACAvC;AAAA,MACA,EAAE,kBAAkB,IAAM,wBAAwB,GAAA;AAAA,IAAK;AAAA,EACzD;AAEJ;AAEO,SAASwC,IAAoB;AAClC,QAAMH,IAAahB,EAAA;AACnB,SAAOe,EAAoBC,CAAU;AACvC;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateUserUUID.cjs","sources":["../../../src/features/analytics/generateUserUUID.ts"],"sourcesContent":["import { getUserUUID } from \"../../api/users\";\n\nexport const generateUserUUID = getUserUUID();\n"],"names":["generateUserUUID","getUserUUID"],"mappings":"uHAEaA,EAAmBC,EAAAA,YAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateUserUUID.mjs","sources":["../../../src/features/analytics/generateUserUUID.ts"],"sourcesContent":["import { getUserUUID } from \"../../api/users\";\n\nexport const generateUserUUID = getUserUUID();\n"],"names":["generateUserUUID","getUserUUID"],"mappings":";AAEO,MAAMA,IAAmBC,EAAA;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c="//web.inresiapp.com",d="/placeholder.jpg",p=t=>t?t.startsWith("?")?t:`?${t}`:"",m=(t,r,e=c)=>`${e}/${r}/unit/${t}/explore`,s=(t,r=d)=>!(t!=null&&t.CFURL)||!(t!=null&&t.name)||!(t!=null&&t.signature)?r:`${t.CFURL}${t.name}${p(t.signature)}`;function v(t){return{data:t}}function y(t,r,e){var u,f;const a=(e==null?void 0:e.origin)??c,n=(e==null?void 0:e.placeholderImage)??d,l=((u=t.hits)==null?void 0:u.map(U=>{var b,h;const o=U._source??{},A=typeof o.name=="string"?o.name:typeof o.title=="string"?o.title:"";return{...o,title:A,slug:m(String(o.slug??""),r,a),imageUrl:s(o.image,n),secondaryImageUrl:s((b=o.additionalImages)==null?void 0:b[0],n),tertiaryImageUrl:s((h=o.additionalImages)==null?void 0:h[1],n)}}))??[];return{total:((f=t.total)==null?void 0:f.value)??l.length,maxScore:t.max_score??null,type:t.type??"units",hits:l}}const I={asap:"ASAP",next_month:"Next Month","2_3_months":"2-3 Months",all:"Just Browsing"},i={0:"Studio",1:"1 Bed",2:"2 Bed",3:"3+ Bed"},E=new Set(Object.values(i)),_=t=>{if(!t||t.length===0)return;const r=new Set;for(const e of t){if(typeof e=="number"){const n=i[e];n&&r.add(n);continue}const a=e.split(",").map(n=>n.trim());for(const n of a){const l=Number.parseInt(n,10);!Number.isNaN(l)&&i[l]?r.add(i[l]):E.has(n)&&r.add(n)}}return r.size>0?Array.from(r):void 0},g=t=>({availability:t.availability&&t.availability.length>0?t.availability.map(e=>I[e]??e):void 0,bedrooms:_(t.bedrooms),cost:t.cost??void 0,highlights:t.highlights??[]});exports.DEFAULT_PLACEHOLDER_IMAGE=d;exports.DEFAULT_WEB_ORIGIN=c;exports.buildExploreUrl=m;exports.buildImageUrl=s;exports.transformUnitsApiResponse=v;exports.transformUnitsApiResponseToClient=y;exports.transformUnitsApiResponseToClientFilters=g;
|
|
2
|
+
//# sourceMappingURL=transformers.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers.cjs","sources":["../../../src/features/units/transformers.ts"],"sourcesContent":["export const DEFAULT_WEB_ORIGIN = \"//web.inresiapp.com\";\nexport const DEFAULT_PLACEHOLDER_IMAGE = \"/placeholder.jpg\";\n\nexport interface UnitImageApiResponse {\n CFURL?: string;\n name?: string;\n signature?: string;\n}\n\nexport interface UnitSourceApiResponse extends Record<string, unknown> {\n id?: number | string;\n name?: string;\n title?: string;\n slug?: string;\n cost?: number;\n bedrooms?: number;\n bathrooms?: number;\n totalSqFt?: number;\n amenities?: unknown;\n highlights?: unknown;\n availability?: string | Date | null;\n image?: UnitImageApiResponse;\n additionalImages?: UnitImageApiResponse[];\n}\n\nexport interface UnitHitApiResponse<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> {\n _index?: string;\n _id?: string;\n _score?: number;\n _source?: Source;\n}\n\nexport interface UnitsTotalInfo {\n value: number;\n relation?: string;\n}\n\nexport interface UnitsDataApiResponse<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> {\n total?: UnitsTotalInfo;\n max_score?: number | null;\n hits?: UnitHitApiResponse<Source>[];\n type?: string;\n}\n\nexport interface UnitsApiResponse<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> {\n data: UnitsDataApiResponse<Source>;\n}\n\nexport type TransformedUnit<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> = Source & {\n title: string;\n slug: string;\n imageUrl: string;\n secondaryImageUrl?: string;\n tertiaryImageUrl?: string;\n};\n\nexport interface UnitsClientList<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> {\n total: number;\n maxScore: number | null;\n type: string;\n hits: TransformedUnit<Source>[];\n}\n\nexport interface TransformUnitsOptions {\n origin?: string;\n placeholderImage?: string;\n}\n\nconst normalizeSignature = (signature?: string): string => {\n if (!signature) return \"\";\n return signature.startsWith(\"?\") ? signature : `?${signature}`;\n};\n\nexport const buildExploreUrl = (\n unitSlug: string,\n propertySlug: string,\n origin = DEFAULT_WEB_ORIGIN,\n): string => `${origin}/${propertySlug}/unit/${unitSlug}/explore`;\n\nexport const buildImageUrl = (\n image?: UnitImageApiResponse,\n placeholder = DEFAULT_PLACEHOLDER_IMAGE,\n): string => {\n if (!image?.CFURL || !image?.name || !image?.signature) return placeholder;\n return `${image.CFURL}${image.name}${normalizeSignature(image.signature)}`;\n};\n\nexport function transformUnitsApiResponse<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n>(apiResponse: UnitsDataApiResponse<Source>): UnitsApiResponse<Source> {\n return { data: apiResponse };\n}\n\nexport function transformUnitsApiResponseToClient<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n>(\n apiResponse: UnitsDataApiResponse<Source>,\n propertySlug: string,\n options?: TransformUnitsOptions,\n): UnitsClientList<Source> {\n const origin = options?.origin ?? DEFAULT_WEB_ORIGIN;\n const placeholderImage = options?.placeholderImage ?? DEFAULT_PLACEHOLDER_IMAGE;\n\n const hits =\n apiResponse.hits?.map((hit) => {\n const source = (hit._source ?? {}) as Source & UnitSourceApiResponse;\n const title =\n typeof source.name === \"string\"\n ? source.name\n : typeof source.title === \"string\"\n ? source.title\n : \"\";\n\n const normalized: TransformedUnit<Source> = {\n ...(source as Source),\n title,\n slug: buildExploreUrl(String(source.slug ?? \"\"), propertySlug, origin),\n imageUrl: buildImageUrl(source.image, placeholderImage),\n secondaryImageUrl: buildImageUrl(source.additionalImages?.[0], placeholderImage),\n tertiaryImageUrl: buildImageUrl(source.additionalImages?.[1], placeholderImage),\n };\n\n return normalized;\n }) ?? [];\n\n return {\n total: apiResponse.total?.value ?? hits.length,\n maxScore: apiResponse.max_score ?? null,\n type: apiResponse.type ?? \"units\",\n hits,\n };\n}\n\nexport interface UnitsFilterParams {\n availability?: string[];\n bedrooms?: (number | string)[];\n cost?: number | null;\n highlights?: string[];\n}\n\nexport interface UnitsClientFilters {\n availability?: string[];\n bedrooms?: string[];\n cost?: number;\n highlights: string[];\n}\n\nconst reverseAvailabilityMap: Record<string, string> = {\n asap: \"ASAP\",\n next_month: \"Next Month\",\n \"2_3_months\": \"2-3 Months\",\n all: \"Just Browsing\",\n};\n\nconst reverseBedroomMap: Record<number, string> = {\n 0: \"Studio\",\n 1: \"1 Bed\",\n 2: \"2 Bed\",\n 3: \"3+ Bed\",\n};\n\nconst bedroomLabels = new Set(Object.values(reverseBedroomMap));\n\nconst normalizeBedrooms = (\n bedrooms?: (number | string)[],\n): string[] | undefined => {\n if (!bedrooms || bedrooms.length === 0) return undefined;\n\n const result = new Set<string>();\n\n for (const bedroom of bedrooms) {\n if (typeof bedroom === \"number\") {\n const label = reverseBedroomMap[bedroom];\n if (label) result.add(label);\n continue;\n }\n\n const values = bedroom.split(\",\").map((v) => v.trim());\n\n for (const value of values) {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isNaN(parsed) && reverseBedroomMap[parsed]) {\n result.add(reverseBedroomMap[parsed]);\n } else if (bedroomLabels.has(value)) {\n result.add(value);\n }\n }\n }\n\n return result.size > 0 ? Array.from(result) : undefined;\n};\n\nexport const transformUnitsApiResponseToClientFilters = (\n params: UnitsFilterParams,\n): UnitsClientFilters => {\n const availability =\n params.availability && params.availability.length > 0\n ? params.availability.map(\n (value) => reverseAvailabilityMap[value] ?? value,\n )\n : undefined;\n\n return {\n availability,\n bedrooms: normalizeBedrooms(params.bedrooms),\n cost: params.cost ?? undefined,\n highlights: params.highlights ?? [],\n };\n};\n"],"names":["DEFAULT_WEB_ORIGIN","DEFAULT_PLACEHOLDER_IMAGE","normalizeSignature","signature","buildExploreUrl","unitSlug","propertySlug","origin","buildImageUrl","image","placeholder","transformUnitsApiResponse","apiResponse","transformUnitsApiResponseToClient","options","placeholderImage","hits","_a","hit","source","title","_b","reverseAvailabilityMap","reverseBedroomMap","bedroomLabels","normalizeBedrooms","bedrooms","result","bedroom","label","values","v","value","parsed","transformUnitsApiResponseToClientFilters","params"],"mappings":"gFAAO,MAAMA,EAAqB,sBACrBC,EAA4B,mBA6EnCC,EAAsBC,GACrBA,EACEA,EAAU,WAAW,GAAG,EAAIA,EAAY,IAAIA,CAAS,GADrC,GAIZC,EAAkB,CAC7BC,EACAC,EACAC,EAASP,IACE,GAAGO,CAAM,IAAID,CAAY,SAASD,CAAQ,WAE1CG,EAAgB,CAC3BC,EACAC,EAAcT,IAEV,EAACQ,GAAA,MAAAA,EAAO,QAAS,EAACA,GAAA,MAAAA,EAAO,OAAQ,EAACA,GAAA,MAAAA,EAAO,WAAkBC,EACxD,GAAGD,EAAM,KAAK,GAAGA,EAAM,IAAI,GAAGP,EAAmBO,EAAM,SAAS,CAAC,GAGnE,SAASE,EAEdC,EAAqE,CACrE,MAAO,CAAE,KAAMA,CAAA,CACjB,CAEO,SAASC,EAGdD,EACAN,EACAQ,EACyB,SACzB,MAAMP,GAASO,GAAA,YAAAA,EAAS,SAAUd,EAC5Be,GAAmBD,GAAA,YAAAA,EAAS,mBAAoBb,EAEhDe,IACJC,EAAAL,EAAY,OAAZ,YAAAK,EAAkB,IAAKC,GAAQ,SAC7B,MAAMC,EAAUD,EAAI,SAAW,CAAA,EACzBE,EACJ,OAAOD,EAAO,MAAS,SACnBA,EAAO,KACP,OAAOA,EAAO,OAAU,SACtBA,EAAO,MACP,GAWR,MAT4C,CAC1C,GAAIA,EACJ,MAAAC,EACA,KAAMhB,EAAgB,OAAOe,EAAO,MAAQ,EAAE,EAAGb,EAAcC,CAAM,EACrE,SAAUC,EAAcW,EAAO,MAAOJ,CAAgB,EACtD,kBAAmBP,GAAcS,EAAAE,EAAO,mBAAP,YAAAF,EAA0B,GAAIF,CAAgB,EAC/E,iBAAkBP,GAAca,EAAAF,EAAO,mBAAP,YAAAE,EAA0B,GAAIN,CAAgB,CAAA,CAIlF,KAAM,CAAA,EAER,MAAO,CACL,QAAOM,EAAAT,EAAY,QAAZ,YAAAS,EAAmB,QAASL,EAAK,OACxC,SAAUJ,EAAY,WAAa,KACnC,KAAMA,EAAY,MAAQ,QAC1B,KAAAI,CAAA,CAEJ,CAgBA,MAAMM,EAAiD,CACrD,KAAM,OACN,WAAY,aACZ,aAAc,aACd,IAAK,eACP,EAEMC,EAA4C,CAChD,EAAG,SACH,EAAG,QACH,EAAG,QACH,EAAG,QACL,EAEMC,EAAgB,IAAI,IAAI,OAAO,OAAOD,CAAiB,CAAC,EAExDE,EACJC,GACyB,CACzB,GAAI,CAACA,GAAYA,EAAS,SAAW,EAAG,OAExC,MAAMC,MAAa,IAEnB,UAAWC,KAAWF,EAAU,CAC9B,GAAI,OAAOE,GAAY,SAAU,CAC/B,MAAMC,EAAQN,EAAkBK,CAAO,EACnCC,GAAOF,EAAO,IAAIE,CAAK,EAC3B,QACF,CAEA,MAAMC,EAASF,EAAQ,MAAM,GAAG,EAAE,IAAKG,GAAMA,EAAE,MAAM,EAErD,UAAWC,KAASF,EAAQ,CAC1B,MAAMG,EAAS,OAAO,SAASD,EAAO,EAAE,EACpC,CAAC,OAAO,MAAMC,CAAM,GAAKV,EAAkBU,CAAM,EACnDN,EAAO,IAAIJ,EAAkBU,CAAM,CAAC,EAC3BT,EAAc,IAAIQ,CAAK,GAChCL,EAAO,IAAIK,CAAK,CAEpB,CACF,CAEA,OAAOL,EAAO,KAAO,EAAI,MAAM,KAAKA,CAAM,EAAI,MAChD,EAEaO,EACXC,IASO,CACL,aAPAA,EAAO,cAAgBA,EAAO,aAAa,OAAS,EAChDA,EAAO,aAAa,IACjBH,GAAUV,EAAuBU,CAAK,GAAKA,CAAA,EAE9C,OAIJ,SAAUP,EAAkBU,EAAO,QAAQ,EAC3C,KAAMA,EAAO,MAAQ,OACrB,WAAYA,EAAO,YAAc,CAAA,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
const h = "//web.inresiapp.com", b = "/placeholder.jpg", y = (t) => t ? t.startsWith("?") ? t : `?${t}` : "", U = (t, r, e = h) => `${e}/${r}/unit/${t}/explore`, a = (t, r = b) => !(t != null && t.CFURL) || !(t != null && t.name) || !(t != null && t.signature) ? r : `${t.CFURL}${t.name}${y(t.signature)}`;
|
|
2
|
+
function g(t) {
|
|
3
|
+
return { data: t };
|
|
4
|
+
}
|
|
5
|
+
function x(t, r, e) {
|
|
6
|
+
var c, d;
|
|
7
|
+
const i = (e == null ? void 0 : e.origin) ?? h, n = (e == null ? void 0 : e.placeholderImage) ?? b, l = ((c = t.hits) == null ? void 0 : c.map((m) => {
|
|
8
|
+
var u, f;
|
|
9
|
+
const o = m._source ?? {}, v = typeof o.name == "string" ? o.name : typeof o.title == "string" ? o.title : "";
|
|
10
|
+
return {
|
|
11
|
+
...o,
|
|
12
|
+
title: v,
|
|
13
|
+
slug: U(String(o.slug ?? ""), r, i),
|
|
14
|
+
imageUrl: a(o.image, n),
|
|
15
|
+
secondaryImageUrl: a((u = o.additionalImages) == null ? void 0 : u[0], n),
|
|
16
|
+
tertiaryImageUrl: a((f = o.additionalImages) == null ? void 0 : f[1], n)
|
|
17
|
+
};
|
|
18
|
+
})) ?? [];
|
|
19
|
+
return {
|
|
20
|
+
total: ((d = t.total) == null ? void 0 : d.value) ?? l.length,
|
|
21
|
+
maxScore: t.max_score ?? null,
|
|
22
|
+
type: t.type ?? "units",
|
|
23
|
+
hits: l
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const A = {
|
|
27
|
+
asap: "ASAP",
|
|
28
|
+
next_month: "Next Month",
|
|
29
|
+
"2_3_months": "2-3 Months",
|
|
30
|
+
all: "Just Browsing"
|
|
31
|
+
}, s = {
|
|
32
|
+
0: "Studio",
|
|
33
|
+
1: "1 Bed",
|
|
34
|
+
2: "2 Bed",
|
|
35
|
+
3: "3+ Bed"
|
|
36
|
+
}, I = new Set(Object.values(s)), p = (t) => {
|
|
37
|
+
if (!t || t.length === 0) return;
|
|
38
|
+
const r = /* @__PURE__ */ new Set();
|
|
39
|
+
for (const e of t) {
|
|
40
|
+
if (typeof e == "number") {
|
|
41
|
+
const n = s[e];
|
|
42
|
+
n && r.add(n);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const i = e.split(",").map((n) => n.trim());
|
|
46
|
+
for (const n of i) {
|
|
47
|
+
const l = Number.parseInt(n, 10);
|
|
48
|
+
!Number.isNaN(l) && s[l] ? r.add(s[l]) : I.has(n) && r.add(n);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return r.size > 0 ? Array.from(r) : void 0;
|
|
52
|
+
}, B = (t) => ({
|
|
53
|
+
availability: t.availability && t.availability.length > 0 ? t.availability.map(
|
|
54
|
+
(e) => A[e] ?? e
|
|
55
|
+
) : void 0,
|
|
56
|
+
bedrooms: p(t.bedrooms),
|
|
57
|
+
cost: t.cost ?? void 0,
|
|
58
|
+
highlights: t.highlights ?? []
|
|
59
|
+
});
|
|
60
|
+
export {
|
|
61
|
+
b as DEFAULT_PLACEHOLDER_IMAGE,
|
|
62
|
+
h as DEFAULT_WEB_ORIGIN,
|
|
63
|
+
U as buildExploreUrl,
|
|
64
|
+
a as buildImageUrl,
|
|
65
|
+
g as transformUnitsApiResponse,
|
|
66
|
+
x as transformUnitsApiResponseToClient,
|
|
67
|
+
B as transformUnitsApiResponseToClientFilters
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=transformers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers.mjs","sources":["../../../src/features/units/transformers.ts"],"sourcesContent":["export const DEFAULT_WEB_ORIGIN = \"//web.inresiapp.com\";\nexport const DEFAULT_PLACEHOLDER_IMAGE = \"/placeholder.jpg\";\n\nexport interface UnitImageApiResponse {\n CFURL?: string;\n name?: string;\n signature?: string;\n}\n\nexport interface UnitSourceApiResponse extends Record<string, unknown> {\n id?: number | string;\n name?: string;\n title?: string;\n slug?: string;\n cost?: number;\n bedrooms?: number;\n bathrooms?: number;\n totalSqFt?: number;\n amenities?: unknown;\n highlights?: unknown;\n availability?: string | Date | null;\n image?: UnitImageApiResponse;\n additionalImages?: UnitImageApiResponse[];\n}\n\nexport interface UnitHitApiResponse<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> {\n _index?: string;\n _id?: string;\n _score?: number;\n _source?: Source;\n}\n\nexport interface UnitsTotalInfo {\n value: number;\n relation?: string;\n}\n\nexport interface UnitsDataApiResponse<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> {\n total?: UnitsTotalInfo;\n max_score?: number | null;\n hits?: UnitHitApiResponse<Source>[];\n type?: string;\n}\n\nexport interface UnitsApiResponse<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> {\n data: UnitsDataApiResponse<Source>;\n}\n\nexport type TransformedUnit<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> = Source & {\n title: string;\n slug: string;\n imageUrl: string;\n secondaryImageUrl?: string;\n tertiaryImageUrl?: string;\n};\n\nexport interface UnitsClientList<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n> {\n total: number;\n maxScore: number | null;\n type: string;\n hits: TransformedUnit<Source>[];\n}\n\nexport interface TransformUnitsOptions {\n origin?: string;\n placeholderImage?: string;\n}\n\nconst normalizeSignature = (signature?: string): string => {\n if (!signature) return \"\";\n return signature.startsWith(\"?\") ? signature : `?${signature}`;\n};\n\nexport const buildExploreUrl = (\n unitSlug: string,\n propertySlug: string,\n origin = DEFAULT_WEB_ORIGIN,\n): string => `${origin}/${propertySlug}/unit/${unitSlug}/explore`;\n\nexport const buildImageUrl = (\n image?: UnitImageApiResponse,\n placeholder = DEFAULT_PLACEHOLDER_IMAGE,\n): string => {\n if (!image?.CFURL || !image?.name || !image?.signature) return placeholder;\n return `${image.CFURL}${image.name}${normalizeSignature(image.signature)}`;\n};\n\nexport function transformUnitsApiResponse<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n>(apiResponse: UnitsDataApiResponse<Source>): UnitsApiResponse<Source> {\n return { data: apiResponse };\n}\n\nexport function transformUnitsApiResponseToClient<\n Source extends Record<string, unknown> = UnitSourceApiResponse,\n>(\n apiResponse: UnitsDataApiResponse<Source>,\n propertySlug: string,\n options?: TransformUnitsOptions,\n): UnitsClientList<Source> {\n const origin = options?.origin ?? DEFAULT_WEB_ORIGIN;\n const placeholderImage = options?.placeholderImage ?? DEFAULT_PLACEHOLDER_IMAGE;\n\n const hits =\n apiResponse.hits?.map((hit) => {\n const source = (hit._source ?? {}) as Source & UnitSourceApiResponse;\n const title =\n typeof source.name === \"string\"\n ? source.name\n : typeof source.title === \"string\"\n ? source.title\n : \"\";\n\n const normalized: TransformedUnit<Source> = {\n ...(source as Source),\n title,\n slug: buildExploreUrl(String(source.slug ?? \"\"), propertySlug, origin),\n imageUrl: buildImageUrl(source.image, placeholderImage),\n secondaryImageUrl: buildImageUrl(source.additionalImages?.[0], placeholderImage),\n tertiaryImageUrl: buildImageUrl(source.additionalImages?.[1], placeholderImage),\n };\n\n return normalized;\n }) ?? [];\n\n return {\n total: apiResponse.total?.value ?? hits.length,\n maxScore: apiResponse.max_score ?? null,\n type: apiResponse.type ?? \"units\",\n hits,\n };\n}\n\nexport interface UnitsFilterParams {\n availability?: string[];\n bedrooms?: (number | string)[];\n cost?: number | null;\n highlights?: string[];\n}\n\nexport interface UnitsClientFilters {\n availability?: string[];\n bedrooms?: string[];\n cost?: number;\n highlights: string[];\n}\n\nconst reverseAvailabilityMap: Record<string, string> = {\n asap: \"ASAP\",\n next_month: \"Next Month\",\n \"2_3_months\": \"2-3 Months\",\n all: \"Just Browsing\",\n};\n\nconst reverseBedroomMap: Record<number, string> = {\n 0: \"Studio\",\n 1: \"1 Bed\",\n 2: \"2 Bed\",\n 3: \"3+ Bed\",\n};\n\nconst bedroomLabels = new Set(Object.values(reverseBedroomMap));\n\nconst normalizeBedrooms = (\n bedrooms?: (number | string)[],\n): string[] | undefined => {\n if (!bedrooms || bedrooms.length === 0) return undefined;\n\n const result = new Set<string>();\n\n for (const bedroom of bedrooms) {\n if (typeof bedroom === \"number\") {\n const label = reverseBedroomMap[bedroom];\n if (label) result.add(label);\n continue;\n }\n\n const values = bedroom.split(\",\").map((v) => v.trim());\n\n for (const value of values) {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isNaN(parsed) && reverseBedroomMap[parsed]) {\n result.add(reverseBedroomMap[parsed]);\n } else if (bedroomLabels.has(value)) {\n result.add(value);\n }\n }\n }\n\n return result.size > 0 ? Array.from(result) : undefined;\n};\n\nexport const transformUnitsApiResponseToClientFilters = (\n params: UnitsFilterParams,\n): UnitsClientFilters => {\n const availability =\n params.availability && params.availability.length > 0\n ? params.availability.map(\n (value) => reverseAvailabilityMap[value] ?? value,\n )\n : undefined;\n\n return {\n availability,\n bedrooms: normalizeBedrooms(params.bedrooms),\n cost: params.cost ?? undefined,\n highlights: params.highlights ?? [],\n };\n};\n"],"names":["DEFAULT_WEB_ORIGIN","DEFAULT_PLACEHOLDER_IMAGE","normalizeSignature","signature","buildExploreUrl","unitSlug","propertySlug","origin","buildImageUrl","image","placeholder","transformUnitsApiResponse","apiResponse","transformUnitsApiResponseToClient","options","_a","_b","placeholderImage","hits","hit","source","title","reverseAvailabilityMap","reverseBedroomMap","bedroomLabels","normalizeBedrooms","bedrooms","result","bedroom","label","values","v","value","parsed","transformUnitsApiResponseToClientFilters","params"],"mappings":"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"}
|