@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.
Files changed (139) hide show
  1. package/dist/_virtual/_commonjsHelpers.cjs +2 -0
  2. package/dist/_virtual/_commonjsHelpers.cjs.map +1 -0
  3. package/dist/_virtual/_commonjsHelpers.mjs +9 -0
  4. package/dist/_virtual/_commonjsHelpers.mjs.map +1 -0
  5. package/dist/_virtual/dexie.min.cjs +2 -0
  6. package/dist/_virtual/dexie.min.cjs.map +1 -0
  7. package/dist/_virtual/dexie.min.mjs +5 -0
  8. package/dist/_virtual/dexie.min.mjs.map +1 -0
  9. package/dist/adapters/dexie.cjs +2 -0
  10. package/dist/adapters/dexie.cjs.map +1 -0
  11. package/dist/adapters/dexie.mjs +14 -0
  12. package/dist/adapters/dexie.mjs.map +1 -0
  13. package/dist/adapters/structured-store.cjs +2 -0
  14. package/dist/adapters/structured-store.cjs.map +1 -0
  15. package/dist/adapters/structured-store.mjs +50 -0
  16. package/dist/adapters/structured-store.mjs.map +1 -0
  17. package/dist/adapters/zustand-store.cjs +2 -0
  18. package/dist/adapters/zustand-store.cjs.map +1 -0
  19. package/dist/adapters/zustand-store.mjs +169 -0
  20. package/dist/adapters/zustand-store.mjs.map +1 -0
  21. package/dist/api/favorites.cjs +2 -0
  22. package/dist/api/favorites.cjs.map +1 -0
  23. package/dist/api/favorites.mjs +34 -0
  24. package/dist/api/favorites.mjs.map +1 -0
  25. package/dist/api/properties.cjs +2 -0
  26. package/dist/api/properties.cjs.map +1 -0
  27. package/dist/api/properties.mjs +197 -0
  28. package/dist/api/properties.mjs.map +1 -0
  29. package/dist/api/users.cjs +2 -0
  30. package/dist/api/users.cjs.map +1 -0
  31. package/dist/api/users.mjs +54 -0
  32. package/dist/api/users.mjs.map +1 -0
  33. package/dist/db.cjs +2 -0
  34. package/dist/db.cjs.map +1 -0
  35. package/dist/db.mjs +116 -0
  36. package/dist/db.mjs.map +1 -0
  37. package/dist/debug.cjs +2 -0
  38. package/dist/debug.cjs.map +1 -0
  39. package/dist/debug.mjs +18 -0
  40. package/dist/debug.mjs.map +1 -0
  41. package/dist/errors.cjs +2 -0
  42. package/dist/errors.cjs.map +1 -0
  43. package/dist/errors.mjs +15 -0
  44. package/dist/errors.mjs.map +1 -0
  45. package/dist/features/analytics/MixpanelProvider.cjs +2 -0
  46. package/dist/features/analytics/MixpanelProvider.cjs.map +1 -0
  47. package/dist/features/analytics/MixpanelProvider.mjs +40 -0
  48. package/dist/features/analytics/MixpanelProvider.mjs.map +1 -0
  49. package/dist/features/analytics/analytics.cjs +2 -0
  50. package/dist/features/analytics/analytics.cjs.map +1 -0
  51. package/dist/features/analytics/analytics.d.ts +520 -397
  52. package/dist/features/analytics/analytics.mjs +230 -0
  53. package/dist/features/analytics/analytics.mjs.map +1 -0
  54. package/dist/features/analytics/generateUserUUID.cjs +2 -0
  55. package/dist/features/analytics/generateUserUUID.cjs.map +1 -0
  56. package/dist/features/analytics/generateUserUUID.mjs +6 -0
  57. package/dist/features/analytics/generateUserUUID.mjs.map +1 -0
  58. package/dist/features/units/transformers.cjs +2 -0
  59. package/dist/features/units/transformers.cjs.map +1 -0
  60. package/dist/features/units/transformers.mjs +69 -0
  61. package/dist/features/units/transformers.mjs.map +1 -0
  62. package/dist/index.cjs +1 -65
  63. package/dist/index.cjs.map +1 -1
  64. package/dist/index.d.ts +1 -0
  65. package/dist/index.mjs +84 -14861
  66. package/dist/index.mjs.map +1 -1
  67. package/dist/node_modules/.pnpm/dexie@4.2.0/node_modules/dexie/dist/dexie.min.cjs +4 -0
  68. package/dist/node_modules/.pnpm/dexie@4.2.0/node_modules/dexie/dist/dexie.min.cjs.map +1 -0
  69. package/dist/node_modules/.pnpm/dexie@4.2.0/node_modules/dexie/dist/dexie.min.mjs +3048 -0
  70. package/dist/node_modules/.pnpm/dexie@4.2.0/node_modules/dexie/dist/dexie.min.mjs.map +1 -0
  71. package/dist/node_modules/.pnpm/dexie@4.2.0/node_modules/dexie/import-wrapper-prod.cjs +2 -0
  72. package/dist/node_modules/.pnpm/dexie@4.2.0/node_modules/dexie/import-wrapper-prod.cjs.map +1 -0
  73. package/dist/node_modules/.pnpm/dexie@4.2.0/node_modules/dexie/import-wrapper-prod.mjs +33 -0
  74. package/dist/node_modules/.pnpm/dexie@4.2.0/node_modules/dexie/import-wrapper-prod.mjs.map +1 -0
  75. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.cjs +2 -0
  76. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.cjs.map +1 -0
  77. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.mjs +88 -0
  78. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.mjs.map +1 -0
  79. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.cjs +2 -0
  80. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.cjs.map +1 -0
  81. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.mjs +10 -0
  82. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.mjs.map +1 -0
  83. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.cjs +2 -0
  84. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.cjs.map +1 -0
  85. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.mjs +8 -0
  86. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.mjs.map +1 -0
  87. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.cjs +2 -0
  88. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.cjs.map +1 -0
  89. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.mjs +98 -0
  90. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.mjs.map +1 -0
  91. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.cjs +2 -0
  92. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.cjs.map +1 -0
  93. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.mjs +95 -0
  94. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.mjs.map +1 -0
  95. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.cjs +2 -0
  96. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.cjs.map +1 -0
  97. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.mjs +62 -0
  98. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.mjs.map +1 -0
  99. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.cjs +2 -0
  100. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.cjs.map +1 -0
  101. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.mjs +2402 -0
  102. package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.mjs.map +1 -0
  103. package/dist/schema.cjs +2 -0
  104. package/dist/schema.cjs.map +1 -0
  105. package/dist/schema.d.ts +165 -0
  106. package/dist/schema.mjs +209 -0
  107. package/dist/schema.mjs.map +1 -0
  108. package/dist/storage.cjs +2 -0
  109. package/dist/storage.cjs.map +1 -0
  110. package/dist/storage.mjs +54 -0
  111. package/dist/storage.mjs.map +1 -0
  112. package/dist/stores/store.cjs +2 -0
  113. package/dist/stores/store.cjs.map +1 -0
  114. package/dist/stores/store.mjs +607 -0
  115. package/dist/stores/store.mjs.map +1 -0
  116. package/dist/units/favorites.cjs +2 -0
  117. package/dist/units/favorites.cjs.map +1 -0
  118. package/dist/units/favorites.mjs +19 -0
  119. package/dist/units/favorites.mjs.map +1 -0
  120. package/dist/utils/casing.cjs +2 -0
  121. package/dist/utils/casing.cjs.map +1 -0
  122. package/dist/utils/casing.d.ts +6 -0
  123. package/dist/utils/casing.mjs +12 -0
  124. package/dist/utils/casing.mjs.map +1 -0
  125. package/dist/utils/collections.cjs +2 -0
  126. package/dist/utils/collections.cjs.map +1 -0
  127. package/dist/utils/collections.d.ts +1 -0
  128. package/dist/utils/collections.mjs +13 -0
  129. package/dist/utils/collections.mjs.map +1 -0
  130. package/dist/utils/dimensions.cjs +2 -0
  131. package/dist/utils/dimensions.cjs.map +1 -0
  132. package/dist/utils/dimensions.d.ts +32 -0
  133. package/dist/utils/dimensions.mjs +29 -0
  134. package/dist/utils/dimensions.mjs.map +1 -0
  135. package/dist/validation.cjs +2 -0
  136. package/dist/validation.cjs.map +1 -0
  137. package/dist/validation.mjs +18 -0
  138. package/dist/validation.mjs.map +1 -0
  139. package/package.json +18 -4
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var o=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function l(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}exports.commonjsGlobal=o;exports.getDefaultExportFromCjs=l;
2
+ //# sourceMappingURL=_commonjsHelpers.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_commonjsHelpers.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ var o = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
2
+ function l(e) {
3
+ return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
4
+ }
5
+ export {
6
+ o as commonjsGlobal,
7
+ l as getDefaultExportFromCjs
8
+ };
9
+ //# sourceMappingURL=_commonjsHelpers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_commonjsHelpers.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={exports:{}};exports.__module=e;
2
+ //# sourceMappingURL=dexie.min.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dexie.min.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ var e = { exports: {} };
2
+ export {
3
+ e as __module
4
+ };
5
+ //# sourceMappingURL=dexie.min.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dexie.min.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("../node_modules/.pnpm/dexie@4.2.0/node_modules/dexie/import-wrapper-prod.cjs"),r=require("../schema.cjs");class t extends s.Dexie{constructor(e="inresi-orm"){super(e),this.version(r.SCHEMA_VERSION).stores({users:"uuid",kv:"key"}),this.users=this.table("users"),this.kv=this.table("kv")}}exports.OrmDexie=t;
2
+ //# sourceMappingURL=dexie.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dexie.cjs","sources":["../../src/adapters/dexie.ts"],"sourcesContent":["import Dexie, { type Table } from \"dexie\";\nimport { SCHEMA_VERSION } from \"../schema\";\n\nexport interface KV {\n key: string;\n value: unknown;\n}\n\nexport interface OrmDexieTables {\n users: Table<any, string>;\n kv: Table<KV, string>;\n}\n\nexport class OrmDexie extends Dexie {\n users!: OrmDexieTables[\"users\"];\n kv!: OrmDexieTables[\"kv\"];\n\n constructor(name = \"inresi-orm\") {\n super(name);\n this.version(SCHEMA_VERSION).stores({\n users: \"uuid\",\n kv: \"key\",\n });\n\n this.users = this.table(\"users\");\n this.kv = this.table(\"kv\");\n }\n}\n"],"names":["OrmDexie","Dexie","name","SCHEMA_VERSION"],"mappings":"2MAaO,MAAMA,UAAiBC,EAAAA,KAAM,CAIlC,YAAYC,EAAO,aAAc,CAC/B,MAAMA,CAAI,EACV,KAAK,QAAQC,gBAAc,EAAE,OAAO,CAClC,MAAO,OACP,GAAI,KAAA,CACL,EAED,KAAK,MAAQ,KAAK,MAAM,OAAO,EAC/B,KAAK,GAAK,KAAK,MAAM,IAAI,CAC3B,CACF"}
@@ -0,0 +1,14 @@
1
+ import { Dexie as e } from "../node_modules/.pnpm/dexie@4.2.0/node_modules/dexie/import-wrapper-prod.mjs";
2
+ import { SCHEMA_VERSION as r } from "../schema.mjs";
3
+ class u extends e {
4
+ constructor(s = "inresi-orm") {
5
+ super(s), this.version(r).stores({
6
+ users: "uuid",
7
+ kv: "key"
8
+ }), this.users = this.table("users"), this.kv = this.table("kv");
9
+ }
10
+ }
11
+ export {
12
+ u as OrmDexie
13
+ };
14
+ //# sourceMappingURL=dexie.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dexie.mjs","sources":["../../src/adapters/dexie.ts"],"sourcesContent":["import Dexie, { type Table } from \"dexie\";\nimport { SCHEMA_VERSION } from \"../schema\";\n\nexport interface KV {\n key: string;\n value: unknown;\n}\n\nexport interface OrmDexieTables {\n users: Table<any, string>;\n kv: Table<KV, string>;\n}\n\nexport class OrmDexie extends Dexie {\n users!: OrmDexieTables[\"users\"];\n kv!: OrmDexieTables[\"kv\"];\n\n constructor(name = \"inresi-orm\") {\n super(name);\n this.version(SCHEMA_VERSION).stores({\n users: \"uuid\",\n kv: \"key\",\n });\n\n this.users = this.table(\"users\");\n this.kv = this.table(\"kv\");\n }\n}\n"],"names":["OrmDexie","Dexie","name","SCHEMA_VERSION"],"mappings":";;AAaO,MAAMA,UAAiBC,EAAM;AAAA,EAIlC,YAAYC,IAAO,cAAc;AAC/B,UAAMA,CAAI,GACV,KAAK,QAAQC,CAAc,EAAE,OAAO;AAAA,MAClC,OAAO;AAAA,MACP,IAAI;AAAA,IAAA,CACL,GAED,KAAK,QAAQ,KAAK,MAAM,OAAO,GAC/B,KAAK,KAAK,KAAK,MAAM,IAAI;AAAA,EAC3B;AACF;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./zustand-store.cjs");function u(t,i){return{property:{unit:{favorites:{toggle:t.toggleFavorite.bind(t)},viewed:{mark:t.markUnitAsViewed.bind(t)}},questionnaire:{setResults:t.setQuestionnaireResults.bind(t)},tour:{setContactedOn:t.setTourContactedOn.bind(t),getContactedOn:t.getTourContactedOn.bind(t),setContactData:t.setTourContactData.bind(t)}},filters:{set:t.setFilters.bind(t),setTemp:t.setTempFilters.bind(t),setToDefault:t.setFiltersToDefault.bind(t),commitTemp:async(e,n)=>{const c=(i?i():t).tempFilters[e]??n;await t.handleTempFilterChange(e,c),await t.submitFilterUpdate()},commitAvailability:async()=>{await t.submitFilterUpdate()},submit:t.submitFilterUpdate.bind(t)}}}function d(t){return(i,e)=>{const n=r.createZustandUnifiedStore(t)(i,e),a=u(n,e);return{...n,...a}}}exports.createStructuredStore=d;exports.createStructuredStoreActions=u;
2
+ //# sourceMappingURL=structured-store.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured-store.cjs","sources":["../../src/adapters/structured-store.ts"],"sourcesContent":["/**\n * Structured store wrapper (preferred DX)\n *\n * This layer wraps the flat Zustand adapter with domain‑grouped actions\n * for a more discoverable API in apps. It does not add new behavior —\n * it simply organizes calls like:\n * - `property.unit.favorites.toggle` → `toggleFavorite`\n * - `property.unit.viewed.mark` → `markUnitAsViewed`\n * - `filters.set/submit/...` → filter methods\n */\nimport {\n type ZustandUnifiedStoreState,\n createZustandUnifiedStore,\n type Filters,\n type UnitData,\n type TourContactData,\n type QueryParams\n} from \"./zustand-store\";\n\nexport interface StructuredStoreActions {\n property: {\n unit: {\n favorites: {\n toggle: (unitId: string) => Promise<void>;\n };\n viewed: {\n mark: (unitId: string, slug: string) => Promise<void>;\n };\n };\n questionnaire: {\n setResults: (results: unknown) => Promise<void>;\n };\n tour: {\n setContactedOn: () => Promise<void>;\n getContactedOn: () => Promise<string | null>;\n setContactData: (data: TourContactData) => Promise<void>;\n };\n };\n\n filters: {\n set: (filters: Partial<Filters>) => Promise<void>;\n setTemp: (filters: Partial<Filters>) => Promise<void>;\n setToDefault: () => Promise<void>;\n commitTemp: <K extends keyof Filters>(key: K, defaultValue: Filters[K]) => Promise<void>;\n commitAvailability: () => Promise<void>;\n submit: () => Promise<void>;\n };\n}\n\nexport function createStructuredStoreActions(store: ZustandUnifiedStoreState, get?: () => ZustandUnifiedStoreState): StructuredStoreActions {\n return {\n property: {\n unit: {\n favorites: {\n toggle: store.toggleFavorite.bind(store),\n },\n viewed: {\n mark: store.markUnitAsViewed.bind(store),\n },\n },\n questionnaire: {\n setResults: store.setQuestionnaireResults.bind(store),\n },\n tour: {\n setContactedOn: store.setTourContactedOn.bind(store),\n getContactedOn: store.getTourContactedOn.bind(store),\n setContactData: store.setTourContactData.bind(store),\n },\n },\n filters: {\n set: store.setFilters.bind(store),\n setTemp: store.setTempFilters.bind(store),\n setToDefault: store.setFiltersToDefault.bind(store),\n commitTemp: async (key, defaultValue) => {\n const state = get ? get() : (store as unknown as ZustandUnifiedStoreState);\n const value = (state.tempFilters as Filters)[key] ?? defaultValue;\n await store.handleTempFilterChange(key, value as any);\n await store.submitFilterUpdate();\n },\n commitAvailability: async () => {\n await store.submitFilterUpdate();\n },\n submit: store.submitFilterUpdate.bind(store),\n },\n };\n}\n\nexport type StructuredStore = ZustandUnifiedStoreState & StructuredStoreActions;\n\nexport function createStructuredStore(options?: {\n onFilterUpdate?: (apiParams: QueryParams) => void;\n}) {\n return (set: any, get: any): StructuredStore => {\n const baseStore = createZustandUnifiedStore(options)(set, get);\n const actions = createStructuredStoreActions(baseStore, get);\n\n return {\n ...baseStore,\n ...actions,\n };\n };\n}\n"],"names":["createStructuredStoreActions","store","get","key","defaultValue","value","createStructuredStore","options","set","baseStore","createZustandUnifiedStore","actions"],"mappings":"uHAiDO,SAASA,EAA6BC,EAAiCC,EAA8D,CAC1I,MAAO,CACL,SAAU,CACR,KAAM,CACJ,UAAW,CACT,OAAQD,EAAM,eAAe,KAAKA,CAAK,CAAA,EAEzC,OAAQ,CACN,KAAMA,EAAM,iBAAiB,KAAKA,CAAK,CAAA,CACzC,EAEF,cAAe,CACb,WAAYA,EAAM,wBAAwB,KAAKA,CAAK,CAAA,EAEtD,KAAM,CACJ,eAAgBA,EAAM,mBAAmB,KAAKA,CAAK,EACnD,eAAgBA,EAAM,mBAAmB,KAAKA,CAAK,EACnD,eAAgBA,EAAM,mBAAmB,KAAKA,CAAK,CAAA,CACrD,EAEF,QAAS,CACP,IAAKA,EAAM,WAAW,KAAKA,CAAK,EAChC,QAASA,EAAM,eAAe,KAAKA,CAAK,EACxC,aAAcA,EAAM,oBAAoB,KAAKA,CAAK,EAClD,WAAY,MAAOE,EAAKC,IAAiB,CAEvC,MAAMC,GADQH,EAAMA,EAAA,EAASD,GACR,YAAwBE,CAAG,GAAKC,EACrD,MAAMH,EAAM,uBAAuBE,EAAKE,CAAY,EACpD,MAAMJ,EAAM,mBAAA,CACd,EACA,mBAAoB,SAAY,CAC9B,MAAMA,EAAM,mBAAA,CACd,EACA,OAAQA,EAAM,mBAAmB,KAAKA,CAAK,CAAA,CAC7C,CAEJ,CAIO,SAASK,EAAsBC,EAEnC,CACD,MAAO,CAACC,EAAUN,IAA8B,CAC9C,MAAMO,EAAYC,EAAAA,0BAA0BH,CAAO,EAAEC,EAAKN,CAAG,EACvDS,EAAUX,EAA6BS,EAAWP,CAAG,EAE3D,MAAO,CACL,GAAGO,EACH,GAAGE,CAAA,CAEP,CACF"}
@@ -0,0 +1,50 @@
1
+ import { createZustandUnifiedStore as d } from "./zustand-store.mjs";
2
+ function c(t, i) {
3
+ return {
4
+ property: {
5
+ unit: {
6
+ favorites: {
7
+ toggle: t.toggleFavorite.bind(t)
8
+ },
9
+ viewed: {
10
+ mark: t.markUnitAsViewed.bind(t)
11
+ }
12
+ },
13
+ questionnaire: {
14
+ setResults: t.setQuestionnaireResults.bind(t)
15
+ },
16
+ tour: {
17
+ setContactedOn: t.setTourContactedOn.bind(t),
18
+ getContactedOn: t.getTourContactedOn.bind(t),
19
+ setContactData: t.setTourContactData.bind(t)
20
+ }
21
+ },
22
+ filters: {
23
+ set: t.setFilters.bind(t),
24
+ setTemp: t.setTempFilters.bind(t),
25
+ setToDefault: t.setFiltersToDefault.bind(t),
26
+ commitTemp: async (e, n) => {
27
+ const u = (i ? i() : t).tempFilters[e] ?? n;
28
+ await t.handleTempFilterChange(e, u), await t.submitFilterUpdate();
29
+ },
30
+ commitAvailability: async () => {
31
+ await t.submitFilterUpdate();
32
+ },
33
+ submit: t.submitFilterUpdate.bind(t)
34
+ }
35
+ };
36
+ }
37
+ function r(t) {
38
+ return (i, e) => {
39
+ const n = d(t)(i, e), a = c(n, e);
40
+ return {
41
+ ...n,
42
+ ...a
43
+ };
44
+ };
45
+ }
46
+ export {
47
+ r as createStructuredStore,
48
+ c as createStructuredStoreActions
49
+ };
50
+ //# sourceMappingURL=structured-store.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured-store.mjs","sources":["../../src/adapters/structured-store.ts"],"sourcesContent":["/**\n * Structured store wrapper (preferred DX)\n *\n * This layer wraps the flat Zustand adapter with domain‑grouped actions\n * for a more discoverable API in apps. It does not add new behavior —\n * it simply organizes calls like:\n * - `property.unit.favorites.toggle` → `toggleFavorite`\n * - `property.unit.viewed.mark` → `markUnitAsViewed`\n * - `filters.set/submit/...` → filter methods\n */\nimport {\n type ZustandUnifiedStoreState,\n createZustandUnifiedStore,\n type Filters,\n type UnitData,\n type TourContactData,\n type QueryParams\n} from \"./zustand-store\";\n\nexport interface StructuredStoreActions {\n property: {\n unit: {\n favorites: {\n toggle: (unitId: string) => Promise<void>;\n };\n viewed: {\n mark: (unitId: string, slug: string) => Promise<void>;\n };\n };\n questionnaire: {\n setResults: (results: unknown) => Promise<void>;\n };\n tour: {\n setContactedOn: () => Promise<void>;\n getContactedOn: () => Promise<string | null>;\n setContactData: (data: TourContactData) => Promise<void>;\n };\n };\n\n filters: {\n set: (filters: Partial<Filters>) => Promise<void>;\n setTemp: (filters: Partial<Filters>) => Promise<void>;\n setToDefault: () => Promise<void>;\n commitTemp: <K extends keyof Filters>(key: K, defaultValue: Filters[K]) => Promise<void>;\n commitAvailability: () => Promise<void>;\n submit: () => Promise<void>;\n };\n}\n\nexport function createStructuredStoreActions(store: ZustandUnifiedStoreState, get?: () => ZustandUnifiedStoreState): StructuredStoreActions {\n return {\n property: {\n unit: {\n favorites: {\n toggle: store.toggleFavorite.bind(store),\n },\n viewed: {\n mark: store.markUnitAsViewed.bind(store),\n },\n },\n questionnaire: {\n setResults: store.setQuestionnaireResults.bind(store),\n },\n tour: {\n setContactedOn: store.setTourContactedOn.bind(store),\n getContactedOn: store.getTourContactedOn.bind(store),\n setContactData: store.setTourContactData.bind(store),\n },\n },\n filters: {\n set: store.setFilters.bind(store),\n setTemp: store.setTempFilters.bind(store),\n setToDefault: store.setFiltersToDefault.bind(store),\n commitTemp: async (key, defaultValue) => {\n const state = get ? get() : (store as unknown as ZustandUnifiedStoreState);\n const value = (state.tempFilters as Filters)[key] ?? defaultValue;\n await store.handleTempFilterChange(key, value as any);\n await store.submitFilterUpdate();\n },\n commitAvailability: async () => {\n await store.submitFilterUpdate();\n },\n submit: store.submitFilterUpdate.bind(store),\n },\n };\n}\n\nexport type StructuredStore = ZustandUnifiedStoreState & StructuredStoreActions;\n\nexport function createStructuredStore(options?: {\n onFilterUpdate?: (apiParams: QueryParams) => void;\n}) {\n return (set: any, get: any): StructuredStore => {\n const baseStore = createZustandUnifiedStore(options)(set, get);\n const actions = createStructuredStoreActions(baseStore, get);\n\n return {\n ...baseStore,\n ...actions,\n };\n };\n}\n"],"names":["createStructuredStoreActions","store","get","key","defaultValue","value","createStructuredStore","options","set","baseStore","createZustandUnifiedStore","actions"],"mappings":";AAiDO,SAASA,EAA6BC,GAAiCC,GAA8D;AAC1I,SAAO;AAAA,IACL,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,WAAW;AAAA,UACT,QAAQD,EAAM,eAAe,KAAKA,CAAK;AAAA,QAAA;AAAA,QAEzC,QAAQ;AAAA,UACN,MAAMA,EAAM,iBAAiB,KAAKA,CAAK;AAAA,QAAA;AAAA,MACzC;AAAA,MAEF,eAAe;AAAA,QACb,YAAYA,EAAM,wBAAwB,KAAKA,CAAK;AAAA,MAAA;AAAA,MAEtD,MAAM;AAAA,QACJ,gBAAgBA,EAAM,mBAAmB,KAAKA,CAAK;AAAA,QACnD,gBAAgBA,EAAM,mBAAmB,KAAKA,CAAK;AAAA,QACnD,gBAAgBA,EAAM,mBAAmB,KAAKA,CAAK;AAAA,MAAA;AAAA,IACrD;AAAA,IAEF,SAAS;AAAA,MACP,KAAKA,EAAM,WAAW,KAAKA,CAAK;AAAA,MAChC,SAASA,EAAM,eAAe,KAAKA,CAAK;AAAA,MACxC,cAAcA,EAAM,oBAAoB,KAAKA,CAAK;AAAA,MAClD,YAAY,OAAOE,GAAKC,MAAiB;AAEvC,cAAMC,KADQH,IAAMA,EAAA,IAASD,GACR,YAAwBE,CAAG,KAAKC;AACrD,cAAMH,EAAM,uBAAuBE,GAAKE,CAAY,GACpD,MAAMJ,EAAM,mBAAA;AAAA,MACd;AAAA,MACA,oBAAoB,YAAY;AAC9B,cAAMA,EAAM,mBAAA;AAAA,MACd;AAAA,MACA,QAAQA,EAAM,mBAAmB,KAAKA,CAAK;AAAA,IAAA;AAAA,EAC7C;AAEJ;AAIO,SAASK,EAAsBC,GAEnC;AACD,SAAO,CAACC,GAAUN,MAA8B;AAC9C,UAAMO,IAAYC,EAA0BH,CAAO,EAAEC,GAAKN,CAAG,GACvDS,IAAUX,EAA6BS,GAAWP,CAAG;AAE3D,WAAO;AAAA,MACL,GAAGO;AAAA,MACH,GAAGE;AAAA,IAAA;AAAA,EAEP;AACF;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../stores/store.cjs");function d(n){return(s,o)=>{const a=async()=>{const t=await e.store.getFullState();s({properties:t.properties,currentPropertyId:t.currentPropertyId,currentPropertySlug:t.currentPropertySlug,hasPreviouslySearched:t.hasPreviouslySearched,unitResults:t.unitResults,filters:t.filters,tempFilters:t.tempFilters,apiFilters:t.apiFilters,resultsMode:t.resultsMode,resolvedQuestionnaireValues:t.resolvedQuestionnaireValues,sortBy:t.sortBy})},u=async()=>{if(n!=null&&n.onFilterUpdate){const t=(await e.store.getFullState()).apiFilters;n.onFilterUpdate(t)}};return{properties:{},currentPropertyId:null,currentPropertySlug:null,hasPreviouslySearched:[],unitResults:[],filters:{availability:void 0,bedrooms:void 0,cost:void 0,highlights:void 0},tempFilters:{availability:void 0,bedrooms:void 0,cost:void 0,highlights:void 0},apiFilters:{limit:10,page:1},resultsMode:"all",resolvedQuestionnaireValues:{},sortBy:"relevance",filtersLoaded:!1,async initializeProperty(t,r){await e.store.initializeProperty(t,r),await a()},async setCurrentProperty(t,r){await e.store.setCurrentProperty(t,r),s({currentPropertyId:t,...r&&{currentPropertySlug:r}})},async setCurrentPropertySlug(t){await e.store.setCurrentPropertySlug(t),s({currentPropertySlug:t})},async setHasPreviouslySearched(t){await e.store.setHasPreviouslySearched(t),await a()},async toggleFavorite(t){await e.store.toggleFavorite(t),await a()},async markUnitAsViewed(t,r){await e.store.markUnitAsViewed(t,r),await a()},async setTourContactedOn(){await e.store.setTourContactedOn(),await a()},getTourContactedOn:e.store.getTourContactedOn.bind(e.store),async setQuestionnaireResults(t){await e.store.setQuestionnaireResults(t),await a()},async setTourContactData(t){await e.store.setTourContactData(t),await a()},async setUnitResults(t){await e.store.setUnitResults(t),await a()},async clearUnitResults(){await e.store.clearUnitResults(),await a()},async setFilters(t){await e.store.setFilters(t);const r=o();s({filters:{...r.filters,...t}})},async setTempFilters(t){await e.store.setTempFilters(t);const r=o();s({tempFilters:{...r.tempFilters,...t}})},async setFiltersToDefault(){await e.store.setFiltersToDefault(),s({filters:{availability:void 0,bedrooms:void 0,cost:void 0,highlights:void 0}})},async setApiFilters(t){await e.store.setApiFilters(t);const r=o();s({apiFilters:{...r.apiFilters,...t}})},async handleTempFilterChange(t,r){await e.store.handleTempFilterChange(t,r);const i=o();s({tempFilters:{...i.tempFilters,[t]:r}})},async submitFilterUpdate(){await e.store.submitFilterUpdate(),await a(),await u()},async setResultsMode(t){await e.store.setResultsMode(t),s({resultsMode:t})},async setSortBy(t){await e.store.setSortBy(t),s({sortBy:t})},async setResolvedQuestionnaireValues(t,r){await e.store.setResolvedQuestionnaireValues(t,r);const i=o();s({resolvedQuestionnaireValues:{...i.resolvedQuestionnaireValues,[t]:r}})},getUnitState(t){var l;const r=o(),i=r.currentPropertyId?r.properties[r.currentPropertyId]:null;return{isFavorite:(i==null?void 0:i.favoritedUnits.includes(t))??!1,viewedDate:((l=i==null?void 0:i.viewedUnits.find(c=>c.unitId===t))==null?void 0:l.viewedDate)??""}},getResultsUrl:e.store.getResultsUrl.bind(e.store),getCurrentProperty:e.store.getCurrentProperty.bind(e.store),getPropertyData:e.store.getPropertyData.bind(e.store),async _hydrate(){await a()},async _initialize(){await e.store.initialize(),await a(),s({filtersLoaded:!0})}}}}function y(){return n=>s=>n(o=>o.getUnitState(s))}exports.createUseUnitState=y;exports.createZustandUnifiedStore=d;
2
+ //# sourceMappingURL=zustand-store.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zustand-store.cjs","sources":["../../src/adapters/zustand-store.ts"],"sourcesContent":["/**\n * Zustand adapter (flat API)\n *\n * This file exposes a flat, unified Zustand store that mirrors the underlying\n * ORM store and keeps React state in sync. It is the low-level bridge.\n *\n * For a friendlier, domain-grouped API, use `createStructuredStore` from\n * `./structured-store`, which wraps this adapter and exposes nested actions\n * like `property.unit.favorites.toggle`, `filters.set`, etc.\n */\nimport { store } from \"../stores/store\";\nimport type { UnifiedStoreData, UserPropertyState, Filters, QueryParams, ResultsMode, SortBy, TourContactData, Unit } from \"../schema\";\n\n// Unified Zustand store interface\nexport interface ZustandUnifiedStoreState {\n // Property data\n properties: Record<string, UserPropertyState>;\n currentPropertyId: string | null;\n currentPropertySlug: string | null;\n hasPreviouslySearched: string[];\n\n // App data\n unitResults: Unit[];\n filters: Filters;\n tempFilters: Filters;\n apiFilters: QueryParams;\n resultsMode: ResultsMode;\n resolvedQuestionnaireValues: Record<string, string[]>;\n sortBy: SortBy;\n filtersLoaded: boolean;\n\n // === PROPERTY OPERATIONS ===\n initializeProperty: (propertyId: string, slug: string) => Promise<void>;\n setCurrentProperty: (propertyId: string, slug?: string) => Promise<void>;\n setCurrentPropertySlug: (slug: string) => Promise<void>;\n setHasPreviouslySearched: (slug: string) => Promise<void>;\n toggleFavorite: (unitId: string) => Promise<void>;\n markUnitAsViewed: (unitId: string, slug: string) => Promise<void>;\n setTourContactedOn: () => Promise<void>;\n getTourContactedOn: () => Promise<string | null>;\n setQuestionnaireResults: (results: unknown) => Promise<void>;\n setTourContactData: (data: TourContactData) => Promise<void>;\n setUnitResults: (units: unknown) => Promise<void>;\n clearUnitResults: () => Promise<void>;\n\n\n // === FILTER OPERATIONS ===\n setFilters: (filters: Partial<Filters>) => Promise<void>;\n setTempFilters: (filters: Partial<Filters>) => Promise<void>;\n setFiltersToDefault: () => Promise<void>;\n setApiFilters: (filters: Partial<QueryParams>) => Promise<void>;\n handleTempFilterChange: <K extends keyof Filters>(key: K, value: Filters[K]) => Promise<void>;\n submitFilterUpdate: () => Promise<void>;\n\n // === RESULTS AND SORTING ===\n setResultsMode: (mode: ResultsMode) => Promise<void>;\n setSortBy: (sortBy: SortBy) => Promise<void>;\n\n // === QUESTIONNAIRE ===\n setResolvedQuestionnaireValues: (name: string, values: string[]) => Promise<void>;\n\n // === UTILITY METHODS ===\n getUnitState: (unitId: string) => {\n isFavorite: boolean;\n viewedDate: string;\n };\n getResultsUrl: () => Promise<string | null>;\n getCurrentProperty: () => Promise<UserPropertyState | null>;\n getPropertyData: (propertyId?: string) => Promise<UserPropertyState | null>;\n\n // === INTERNAL ===\n _hydrate: () => Promise<void>;\n _initialize: () => Promise<void>;\n}\n\n/**\n * @deprecated For new apps, use `createStructuredStore` from `./structured-store`.\n * This flat adapter remains for migration/advanced cases.\n */\nexport function createZustandUnifiedStore(options?: {\n onFilterUpdate?: (apiParams: QueryParams) => void;\n}) {\n return (set: any, get: any): ZustandUnifiedStoreState => {\n // Helper to update local state after ORM operations\n const syncState = async () => {\n const ormState = await store.getFullState();\n set({\n properties: ormState.properties,\n currentPropertyId: ormState.currentPropertyId,\n currentPropertySlug: ormState.currentPropertySlug,\n hasPreviouslySearched: ormState.hasPreviouslySearched,\n unitResults: ormState.unitResults,\n filters: ormState.filters,\n tempFilters: ormState.tempFilters,\n apiFilters: ormState.apiFilters,\n resultsMode: ormState.resultsMode,\n resolvedQuestionnaireValues: ormState.resolvedQuestionnaireValues,\n sortBy: ormState.sortBy,\n });\n };\n\n // Helper to notify of filter updates\n const notifyFilterUpdate = async () => {\n if (options?.onFilterUpdate) {\n const apiFilters = (await store.getFullState()).apiFilters;\n options.onFilterUpdate(apiFilters);\n }\n };\n\n return {\n // Initial state\n properties: {},\n currentPropertyId: null,\n currentPropertySlug: null,\n hasPreviouslySearched: [],\n unitResults: [],\n filters: {\n availability: undefined,\n bedrooms: undefined,\n cost: undefined,\n highlights: undefined,\n },\n tempFilters: {\n availability: undefined,\n bedrooms: undefined,\n cost: undefined,\n highlights: undefined,\n },\n apiFilters: {\n limit: 10,\n page: 1,\n },\n resultsMode: \"all\",\n resolvedQuestionnaireValues: {},\n sortBy: \"relevance\",\n filtersLoaded: false,\n\n // === PROPERTY OPERATIONS ===\n async initializeProperty(propertyId, slug) {\n await store.initializeProperty(propertyId, slug);\n await syncState();\n },\n\n async setCurrentProperty(propertyId, slug) {\n await store.setCurrentProperty(propertyId, slug);\n set({\n currentPropertyId: propertyId,\n ...(slug && { currentPropertySlug: slug })\n });\n },\n\n async setCurrentPropertySlug(slug) {\n await store.setCurrentPropertySlug(slug);\n set({ currentPropertySlug: slug });\n },\n\n async setHasPreviouslySearched(slug) {\n await store.setHasPreviouslySearched(slug);\n await syncState();\n },\n\n async toggleFavorite(unitId) {\n await store.toggleFavorite(unitId);\n await syncState();\n },\n\n async markUnitAsViewed(unitId, slug) {\n await store.markUnitAsViewed(unitId, slug);\n await syncState();\n },\n\n async setTourContactedOn() {\n await store.setTourContactedOn();\n await syncState();\n },\n\n getTourContactedOn: store.getTourContactedOn.bind(store),\n\n async setQuestionnaireResults(results) {\n await store.setQuestionnaireResults(results);\n await syncState();\n },\n\n async setTourContactData(data) {\n await store.setTourContactData(data);\n await syncState();\n },\n\n async setUnitResults(units) {\n await store.setUnitResults(units);\n await syncState();\n },\n\n async clearUnitResults() {\n await store.clearUnitResults();\n await syncState();\n },\n\n\n // === FILTER OPERATIONS ===\n async setFilters(filters) {\n await store.setFilters(filters);\n const state = get();\n set({ filters: { ...state.filters, ...filters } });\n },\n\n async setTempFilters(filters) {\n await store.setTempFilters(filters);\n const state = get();\n set({ tempFilters: { ...state.tempFilters, ...filters } });\n },\n\n async setFiltersToDefault() {\n await store.setFiltersToDefault();\n const defaultFilters = {\n availability: undefined,\n bedrooms: undefined,\n cost: undefined,\n highlights: undefined,\n };\n set({ filters: defaultFilters });\n },\n\n async setApiFilters(filters) {\n await store.setApiFilters(filters);\n const state = get();\n set({ apiFilters: { ...state.apiFilters, ...filters } });\n },\n\n async handleTempFilterChange(key, value) {\n await store.handleTempFilterChange(key, value);\n const state = get();\n set({ tempFilters: { ...state.tempFilters, [key]: value } });\n },\n\n async submitFilterUpdate() {\n await store.submitFilterUpdate();\n await syncState();\n await notifyFilterUpdate();\n },\n\n // === RESULTS AND SORTING ===\n async setResultsMode(mode) {\n await store.setResultsMode(mode);\n set({ resultsMode: mode });\n },\n\n async setSortBy(sortBy) {\n await store.setSortBy(sortBy);\n set({ sortBy });\n },\n\n // === QUESTIONNAIRE ===\n async setResolvedQuestionnaireValues(name, values) {\n await store.setResolvedQuestionnaireValues(name, values);\n const state = get();\n set({\n resolvedQuestionnaireValues: {\n ...state.resolvedQuestionnaireValues,\n [name]: values,\n }\n });\n },\n\n // === UTILITY METHODS ===\n getUnitState(unitId: string) {\n const state = get();\n const property = state.currentPropertyId ? state.properties[state.currentPropertyId] : null;\n\n return {\n isFavorite: property?.favoritedUnits.includes(unitId) ?? false,\n viewedDate:\n property?.viewedUnits.find((u: any) => u.unitId === unitId)?.viewedDate ?? \"\",\n };\n },\n\n getResultsUrl: store.getResultsUrl.bind(store),\n getCurrentProperty: store.getCurrentProperty.bind(store),\n getPropertyData: store.getPropertyData.bind(store),\n\n // === INTERNAL ===\n async _hydrate() {\n await syncState();\n },\n\n async _initialize() {\n await store.initialize();\n await syncState();\n set({ filtersLoaded: true });\n },\n };\n };\n}\n\n// Helper hook factory for unit state\nexport function createUseUnitState() {\n return (useStore: any) => (unitId: string) =>\n useStore((state: ZustandUnifiedStoreState) => state.getUnitState(unitId));\n}\n\n// Export types for consuming apps\nexport type { UnitData, UserPropertyState, Filters, QueryParams, ResultsMode, SortBy, TourContactData, Unit } from \"../schema\";\n\n// Intentionally no alias exports in vNext; use `createStructuredStore` or `createZustandUnifiedStore` explicitly.\n"],"names":["createZustandUnifiedStore","options","set","get","syncState","ormState","store","notifyFilterUpdate","apiFilters","propertyId","slug","unitId","results","data","units","filters","state","key","value","mode","sortBy","name","values","property","_a","u","createUseUnitState","useStore"],"mappings":"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"}
@@ -0,0 +1,169 @@
1
+ import { store as e } from "../stores/store.mjs";
2
+ function y(l) {
3
+ return (i, n) => {
4
+ const r = async () => {
5
+ const t = await e.getFullState();
6
+ i({
7
+ properties: t.properties,
8
+ currentPropertyId: t.currentPropertyId,
9
+ currentPropertySlug: t.currentPropertySlug,
10
+ hasPreviouslySearched: t.hasPreviouslySearched,
11
+ unitResults: t.unitResults,
12
+ filters: t.filters,
13
+ tempFilters: t.tempFilters,
14
+ apiFilters: t.apiFilters,
15
+ resultsMode: t.resultsMode,
16
+ resolvedQuestionnaireValues: t.resolvedQuestionnaireValues,
17
+ sortBy: t.sortBy
18
+ });
19
+ }, u = async () => {
20
+ if (l != null && l.onFilterUpdate) {
21
+ const t = (await e.getFullState()).apiFilters;
22
+ l.onFilterUpdate(t);
23
+ }
24
+ };
25
+ return {
26
+ // Initial state
27
+ properties: {},
28
+ currentPropertyId: null,
29
+ currentPropertySlug: null,
30
+ hasPreviouslySearched: [],
31
+ unitResults: [],
32
+ filters: {
33
+ availability: void 0,
34
+ bedrooms: void 0,
35
+ cost: void 0,
36
+ highlights: void 0
37
+ },
38
+ tempFilters: {
39
+ availability: void 0,
40
+ bedrooms: void 0,
41
+ cost: void 0,
42
+ highlights: void 0
43
+ },
44
+ apiFilters: {
45
+ limit: 10,
46
+ page: 1
47
+ },
48
+ resultsMode: "all",
49
+ resolvedQuestionnaireValues: {},
50
+ sortBy: "relevance",
51
+ filtersLoaded: !1,
52
+ // === PROPERTY OPERATIONS ===
53
+ async initializeProperty(t, a) {
54
+ await e.initializeProperty(t, a), await r();
55
+ },
56
+ async setCurrentProperty(t, a) {
57
+ await e.setCurrentProperty(t, a), i({
58
+ currentPropertyId: t,
59
+ ...a && { currentPropertySlug: a }
60
+ });
61
+ },
62
+ async setCurrentPropertySlug(t) {
63
+ await e.setCurrentPropertySlug(t), i({ currentPropertySlug: t });
64
+ },
65
+ async setHasPreviouslySearched(t) {
66
+ await e.setHasPreviouslySearched(t), await r();
67
+ },
68
+ async toggleFavorite(t) {
69
+ await e.toggleFavorite(t), await r();
70
+ },
71
+ async markUnitAsViewed(t, a) {
72
+ await e.markUnitAsViewed(t, a), await r();
73
+ },
74
+ async setTourContactedOn() {
75
+ await e.setTourContactedOn(), await r();
76
+ },
77
+ getTourContactedOn: e.getTourContactedOn.bind(e),
78
+ async setQuestionnaireResults(t) {
79
+ await e.setQuestionnaireResults(t), await r();
80
+ },
81
+ async setTourContactData(t) {
82
+ await e.setTourContactData(t), await r();
83
+ },
84
+ async setUnitResults(t) {
85
+ await e.setUnitResults(t), await r();
86
+ },
87
+ async clearUnitResults() {
88
+ await e.clearUnitResults(), await r();
89
+ },
90
+ // === FILTER OPERATIONS ===
91
+ async setFilters(t) {
92
+ await e.setFilters(t);
93
+ const a = n();
94
+ i({ filters: { ...a.filters, ...t } });
95
+ },
96
+ async setTempFilters(t) {
97
+ await e.setTempFilters(t);
98
+ const a = n();
99
+ i({ tempFilters: { ...a.tempFilters, ...t } });
100
+ },
101
+ async setFiltersToDefault() {
102
+ await e.setFiltersToDefault(), i({ filters: {
103
+ availability: void 0,
104
+ bedrooms: void 0,
105
+ cost: void 0,
106
+ highlights: void 0
107
+ } });
108
+ },
109
+ async setApiFilters(t) {
110
+ await e.setApiFilters(t);
111
+ const a = n();
112
+ i({ apiFilters: { ...a.apiFilters, ...t } });
113
+ },
114
+ async handleTempFilterChange(t, a) {
115
+ await e.handleTempFilterChange(t, a);
116
+ const s = n();
117
+ i({ tempFilters: { ...s.tempFilters, [t]: a } });
118
+ },
119
+ async submitFilterUpdate() {
120
+ await e.submitFilterUpdate(), await r(), await u();
121
+ },
122
+ // === RESULTS AND SORTING ===
123
+ async setResultsMode(t) {
124
+ await e.setResultsMode(t), i({ resultsMode: t });
125
+ },
126
+ async setSortBy(t) {
127
+ await e.setSortBy(t), i({ sortBy: t });
128
+ },
129
+ // === QUESTIONNAIRE ===
130
+ async setResolvedQuestionnaireValues(t, a) {
131
+ await e.setResolvedQuestionnaireValues(t, a);
132
+ const s = n();
133
+ i({
134
+ resolvedQuestionnaireValues: {
135
+ ...s.resolvedQuestionnaireValues,
136
+ [t]: a
137
+ }
138
+ });
139
+ },
140
+ // === UTILITY METHODS ===
141
+ getUnitState(t) {
142
+ var o;
143
+ const a = n(), s = a.currentPropertyId ? a.properties[a.currentPropertyId] : null;
144
+ return {
145
+ isFavorite: (s == null ? void 0 : s.favoritedUnits.includes(t)) ?? !1,
146
+ viewedDate: ((o = s == null ? void 0 : s.viewedUnits.find((c) => c.unitId === t)) == null ? void 0 : o.viewedDate) ?? ""
147
+ };
148
+ },
149
+ getResultsUrl: e.getResultsUrl.bind(e),
150
+ getCurrentProperty: e.getCurrentProperty.bind(e),
151
+ getPropertyData: e.getPropertyData.bind(e),
152
+ // === INTERNAL ===
153
+ async _hydrate() {
154
+ await r();
155
+ },
156
+ async _initialize() {
157
+ await e.initialize(), await r(), i({ filtersLoaded: !0 });
158
+ }
159
+ };
160
+ };
161
+ }
162
+ function p() {
163
+ return (l) => (i) => l((n) => n.getUnitState(i));
164
+ }
165
+ export {
166
+ p as createUseUnitState,
167
+ y as createZustandUnifiedStore
168
+ };
169
+ //# sourceMappingURL=zustand-store.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zustand-store.mjs","sources":["../../src/adapters/zustand-store.ts"],"sourcesContent":["/**\n * Zustand adapter (flat API)\n *\n * This file exposes a flat, unified Zustand store that mirrors the underlying\n * ORM store and keeps React state in sync. It is the low-level bridge.\n *\n * For a friendlier, domain-grouped API, use `createStructuredStore` from\n * `./structured-store`, which wraps this adapter and exposes nested actions\n * like `property.unit.favorites.toggle`, `filters.set`, etc.\n */\nimport { store } from \"../stores/store\";\nimport type { UnifiedStoreData, UserPropertyState, Filters, QueryParams, ResultsMode, SortBy, TourContactData, Unit } from \"../schema\";\n\n// Unified Zustand store interface\nexport interface ZustandUnifiedStoreState {\n // Property data\n properties: Record<string, UserPropertyState>;\n currentPropertyId: string | null;\n currentPropertySlug: string | null;\n hasPreviouslySearched: string[];\n\n // App data\n unitResults: Unit[];\n filters: Filters;\n tempFilters: Filters;\n apiFilters: QueryParams;\n resultsMode: ResultsMode;\n resolvedQuestionnaireValues: Record<string, string[]>;\n sortBy: SortBy;\n filtersLoaded: boolean;\n\n // === PROPERTY OPERATIONS ===\n initializeProperty: (propertyId: string, slug: string) => Promise<void>;\n setCurrentProperty: (propertyId: string, slug?: string) => Promise<void>;\n setCurrentPropertySlug: (slug: string) => Promise<void>;\n setHasPreviouslySearched: (slug: string) => Promise<void>;\n toggleFavorite: (unitId: string) => Promise<void>;\n markUnitAsViewed: (unitId: string, slug: string) => Promise<void>;\n setTourContactedOn: () => Promise<void>;\n getTourContactedOn: () => Promise<string | null>;\n setQuestionnaireResults: (results: unknown) => Promise<void>;\n setTourContactData: (data: TourContactData) => Promise<void>;\n setUnitResults: (units: unknown) => Promise<void>;\n clearUnitResults: () => Promise<void>;\n\n\n // === FILTER OPERATIONS ===\n setFilters: (filters: Partial<Filters>) => Promise<void>;\n setTempFilters: (filters: Partial<Filters>) => Promise<void>;\n setFiltersToDefault: () => Promise<void>;\n setApiFilters: (filters: Partial<QueryParams>) => Promise<void>;\n handleTempFilterChange: <K extends keyof Filters>(key: K, value: Filters[K]) => Promise<void>;\n submitFilterUpdate: () => Promise<void>;\n\n // === RESULTS AND SORTING ===\n setResultsMode: (mode: ResultsMode) => Promise<void>;\n setSortBy: (sortBy: SortBy) => Promise<void>;\n\n // === QUESTIONNAIRE ===\n setResolvedQuestionnaireValues: (name: string, values: string[]) => Promise<void>;\n\n // === UTILITY METHODS ===\n getUnitState: (unitId: string) => {\n isFavorite: boolean;\n viewedDate: string;\n };\n getResultsUrl: () => Promise<string | null>;\n getCurrentProperty: () => Promise<UserPropertyState | null>;\n getPropertyData: (propertyId?: string) => Promise<UserPropertyState | null>;\n\n // === INTERNAL ===\n _hydrate: () => Promise<void>;\n _initialize: () => Promise<void>;\n}\n\n/**\n * @deprecated For new apps, use `createStructuredStore` from `./structured-store`.\n * This flat adapter remains for migration/advanced cases.\n */\nexport function createZustandUnifiedStore(options?: {\n onFilterUpdate?: (apiParams: QueryParams) => void;\n}) {\n return (set: any, get: any): ZustandUnifiedStoreState => {\n // Helper to update local state after ORM operations\n const syncState = async () => {\n const ormState = await store.getFullState();\n set({\n properties: ormState.properties,\n currentPropertyId: ormState.currentPropertyId,\n currentPropertySlug: ormState.currentPropertySlug,\n hasPreviouslySearched: ormState.hasPreviouslySearched,\n unitResults: ormState.unitResults,\n filters: ormState.filters,\n tempFilters: ormState.tempFilters,\n apiFilters: ormState.apiFilters,\n resultsMode: ormState.resultsMode,\n resolvedQuestionnaireValues: ormState.resolvedQuestionnaireValues,\n sortBy: ormState.sortBy,\n });\n };\n\n // Helper to notify of filter updates\n const notifyFilterUpdate = async () => {\n if (options?.onFilterUpdate) {\n const apiFilters = (await store.getFullState()).apiFilters;\n options.onFilterUpdate(apiFilters);\n }\n };\n\n return {\n // Initial state\n properties: {},\n currentPropertyId: null,\n currentPropertySlug: null,\n hasPreviouslySearched: [],\n unitResults: [],\n filters: {\n availability: undefined,\n bedrooms: undefined,\n cost: undefined,\n highlights: undefined,\n },\n tempFilters: {\n availability: undefined,\n bedrooms: undefined,\n cost: undefined,\n highlights: undefined,\n },\n apiFilters: {\n limit: 10,\n page: 1,\n },\n resultsMode: \"all\",\n resolvedQuestionnaireValues: {},\n sortBy: \"relevance\",\n filtersLoaded: false,\n\n // === PROPERTY OPERATIONS ===\n async initializeProperty(propertyId, slug) {\n await store.initializeProperty(propertyId, slug);\n await syncState();\n },\n\n async setCurrentProperty(propertyId, slug) {\n await store.setCurrentProperty(propertyId, slug);\n set({\n currentPropertyId: propertyId,\n ...(slug && { currentPropertySlug: slug })\n });\n },\n\n async setCurrentPropertySlug(slug) {\n await store.setCurrentPropertySlug(slug);\n set({ currentPropertySlug: slug });\n },\n\n async setHasPreviouslySearched(slug) {\n await store.setHasPreviouslySearched(slug);\n await syncState();\n },\n\n async toggleFavorite(unitId) {\n await store.toggleFavorite(unitId);\n await syncState();\n },\n\n async markUnitAsViewed(unitId, slug) {\n await store.markUnitAsViewed(unitId, slug);\n await syncState();\n },\n\n async setTourContactedOn() {\n await store.setTourContactedOn();\n await syncState();\n },\n\n getTourContactedOn: store.getTourContactedOn.bind(store),\n\n async setQuestionnaireResults(results) {\n await store.setQuestionnaireResults(results);\n await syncState();\n },\n\n async setTourContactData(data) {\n await store.setTourContactData(data);\n await syncState();\n },\n\n async setUnitResults(units) {\n await store.setUnitResults(units);\n await syncState();\n },\n\n async clearUnitResults() {\n await store.clearUnitResults();\n await syncState();\n },\n\n\n // === FILTER OPERATIONS ===\n async setFilters(filters) {\n await store.setFilters(filters);\n const state = get();\n set({ filters: { ...state.filters, ...filters } });\n },\n\n async setTempFilters(filters) {\n await store.setTempFilters(filters);\n const state = get();\n set({ tempFilters: { ...state.tempFilters, ...filters } });\n },\n\n async setFiltersToDefault() {\n await store.setFiltersToDefault();\n const defaultFilters = {\n availability: undefined,\n bedrooms: undefined,\n cost: undefined,\n highlights: undefined,\n };\n set({ filters: defaultFilters });\n },\n\n async setApiFilters(filters) {\n await store.setApiFilters(filters);\n const state = get();\n set({ apiFilters: { ...state.apiFilters, ...filters } });\n },\n\n async handleTempFilterChange(key, value) {\n await store.handleTempFilterChange(key, value);\n const state = get();\n set({ tempFilters: { ...state.tempFilters, [key]: value } });\n },\n\n async submitFilterUpdate() {\n await store.submitFilterUpdate();\n await syncState();\n await notifyFilterUpdate();\n },\n\n // === RESULTS AND SORTING ===\n async setResultsMode(mode) {\n await store.setResultsMode(mode);\n set({ resultsMode: mode });\n },\n\n async setSortBy(sortBy) {\n await store.setSortBy(sortBy);\n set({ sortBy });\n },\n\n // === QUESTIONNAIRE ===\n async setResolvedQuestionnaireValues(name, values) {\n await store.setResolvedQuestionnaireValues(name, values);\n const state = get();\n set({\n resolvedQuestionnaireValues: {\n ...state.resolvedQuestionnaireValues,\n [name]: values,\n }\n });\n },\n\n // === UTILITY METHODS ===\n getUnitState(unitId: string) {\n const state = get();\n const property = state.currentPropertyId ? state.properties[state.currentPropertyId] : null;\n\n return {\n isFavorite: property?.favoritedUnits.includes(unitId) ?? false,\n viewedDate:\n property?.viewedUnits.find((u: any) => u.unitId === unitId)?.viewedDate ?? \"\",\n };\n },\n\n getResultsUrl: store.getResultsUrl.bind(store),\n getCurrentProperty: store.getCurrentProperty.bind(store),\n getPropertyData: store.getPropertyData.bind(store),\n\n // === INTERNAL ===\n async _hydrate() {\n await syncState();\n },\n\n async _initialize() {\n await store.initialize();\n await syncState();\n set({ filtersLoaded: true });\n },\n };\n };\n}\n\n// Helper hook factory for unit state\nexport function createUseUnitState() {\n return (useStore: any) => (unitId: string) =>\n useStore((state: ZustandUnifiedStoreState) => state.getUnitState(unitId));\n}\n\n// Export types for consuming apps\nexport type { UnitData, UserPropertyState, Filters, QueryParams, ResultsMode, SortBy, TourContactData, Unit } from \"../schema\";\n\n// Intentionally no alias exports in vNext; use `createStructuredStore` or `createZustandUnifiedStore` explicitly.\n"],"names":["createZustandUnifiedStore","options","set","get","syncState","ormState","store","notifyFilterUpdate","apiFilters","propertyId","slug","unitId","results","data","units","filters","state","key","value","mode","sortBy","name","values","property","_a","u","createUseUnitState","useStore"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("../db.cjs"),l=require("./users.cjs"),c=require("../schema.cjs"),g=(e,t)=>`favorites:${e}:${t}`;async function u(e){const t=await v.getDB(),{uuid:a}=await l.ensureUser(),n=g(a,String(e)),r=await t.kv.get(n),s=r?c.FavoritesSchema.safeParse(r.value):null;return s!=null&&s.success?s.data.unitIds:[]}async function w(e,t,a){const n=await v.getDB(),{uuid:r}=await l.ensureUser(),s=g(r,String(e));return n.transaction("rw",n.kv,async()=>{const i=await n.kv.get(s),F=i&&c.FavoritesSchema.safeParse(i.value).success?i.value:{unitIds:[],updatedAt:new Date().toISOString()},o=new Set(F.unitIds);a?o.add(t):o.delete(t);const S={unitIds:[...o],updatedAt:new Date().toISOString()},d=c.FavoritesSchema.parse(S);return await n.kv.put({key:s,value:d}),d.unitIds})}async function y(e,t){const n=!(await u(e)).includes(t);return w(e,t,n)}async function U(e,t){return(await u(e)).includes(t)}exports.getFavoritedUnitsForProperty=u;exports.isUnitFavorited=U;exports.setFavoriteUnit=w;exports.toggleFavoriteUnit=y;
2
+ //# sourceMappingURL=favorites.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"favorites.cjs","sources":["../../src/api/favorites.ts"],"sourcesContent":["// src/api/favourites.ts\nimport { getDB } from \"../db\";\nimport { ensureUser } from \"./users\";\nimport { FavoritesSchema } from \"../schema\";\n\nconst keyFor = (userId: string, propertyId: string) =>\n `favorites:${userId}:${propertyId}`;\n\nexport async function getFavoritedUnitsForProperty(\n propertyId: string | number,\n): Promise<string[]> {\n const db = await getDB();\n const { uuid } = await ensureUser();\n const key = keyFor(uuid, String(propertyId));\n const row = await db.kv.get(key);\n const parsed = row ? FavoritesSchema.safeParse(row.value) : null;\n return parsed?.success ? parsed.data.unitIds : [];\n}\n\nexport async function setFavoriteUnit(\n propertyId: string | number,\n unitId: string,\n on: boolean,\n): Promise<string[]> {\n const db = await getDB();\n const { uuid } = await ensureUser();\n const key = keyFor(uuid, String(propertyId));\n\n return db.transaction(\"rw\", db.kv, async () => {\n const row = await db.kv.get(key);\n const current =\n row && FavoritesSchema.safeParse(row.value).success\n ? (row!.value as any)\n : { unitIds: [] as string[], updatedAt: new Date().toISOString() };\n\n const nextSet = new Set<string>(current.unitIds);\n on ? nextSet.add(unitId) : nextSet.delete(unitId);\n\n const next = {\n unitIds: [...nextSet],\n updatedAt: new Date().toISOString(),\n };\n const validated = FavoritesSchema.parse(next);\n await db.kv.put({ key, value: validated });\n return validated.unitIds;\n });\n}\n\nexport async function toggleFavoriteUnit(\n propertyId: string | number,\n unitId: string,\n): Promise<string[]> {\n const current = await getFavoritedUnitsForProperty(propertyId);\n const on = !current.includes(unitId);\n return setFavoriteUnit(propertyId, unitId, on);\n}\n\nexport async function isUnitFavorited(\n propertyId: string | number,\n unitId: string,\n): Promise<boolean> {\n const list = await getFavoritedUnitsForProperty(propertyId);\n return list.includes(unitId);\n}\n"],"names":["keyFor","userId","propertyId","getFavoritedUnitsForProperty","db","getDB","uuid","ensureUser","key","row","parsed","FavoritesSchema","setFavoriteUnit","unitId","on","current","nextSet","next","validated","toggleFavoriteUnit","isUnitFavorited"],"mappings":"iKAKMA,EAAS,CAACC,EAAgBC,IAC9B,aAAaD,CAAM,IAAIC,CAAU,GAEnC,eAAsBC,EACpBD,EACmB,CACnB,MAAME,EAAK,MAAMC,QAAA,EACX,CAAE,KAAAC,GAAS,MAAMC,aAAA,EACjBC,EAAMR,EAAOM,EAAM,OAAOJ,CAAU,CAAC,EACrCO,EAAM,MAAML,EAAG,GAAG,IAAII,CAAG,EACzBE,EAASD,EAAME,EAAAA,gBAAgB,UAAUF,EAAI,KAAK,EAAI,KAC5D,OAAOC,GAAA,MAAAA,EAAQ,QAAUA,EAAO,KAAK,QAAU,CAAA,CACjD,CAEA,eAAsBE,EACpBV,EACAW,EACAC,EACmB,CACnB,MAAMV,EAAK,MAAMC,QAAA,EACX,CAAE,KAAAC,GAAS,MAAMC,aAAA,EACjBC,EAAMR,EAAOM,EAAM,OAAOJ,CAAU,CAAC,EAE3C,OAAOE,EAAG,YAAY,KAAMA,EAAG,GAAI,SAAY,CAC7C,MAAMK,EAAM,MAAML,EAAG,GAAG,IAAII,CAAG,EACzBO,EACJN,GAAOE,EAAAA,gBAAgB,UAAUF,EAAI,KAAK,EAAE,QACvCA,EAAK,MACN,CAAE,QAAS,GAAgB,cAAe,KAAA,EAAO,aAAY,EAE7DO,EAAU,IAAI,IAAYD,EAAQ,OAAO,EAC/CD,EAAKE,EAAQ,IAAIH,CAAM,EAAIG,EAAQ,OAAOH,CAAM,EAEhD,MAAMI,EAAO,CACX,QAAS,CAAC,GAAGD,CAAO,EACpB,UAAW,IAAI,KAAA,EAAO,YAAA,CAAY,EAE9BE,EAAYP,EAAAA,gBAAgB,MAAMM,CAAI,EAC5C,aAAMb,EAAG,GAAG,IAAI,CAAE,IAAAI,EAAK,MAAOU,EAAW,EAClCA,EAAU,OACnB,CAAC,CACH,CAEA,eAAsBC,EACpBjB,EACAW,EACmB,CAEnB,MAAMC,EAAK,EADK,MAAMX,EAA6BD,CAAU,GACzC,SAASW,CAAM,EACnC,OAAOD,EAAgBV,EAAYW,EAAQC,CAAE,CAC/C,CAEA,eAAsBM,EACpBlB,EACAW,EACkB,CAElB,OADa,MAAMV,EAA6BD,CAAU,GAC9C,SAASW,CAAM,CAC7B"}
@@ -0,0 +1,34 @@
1
+ import { getDB as d } from "../db.mjs";
2
+ import { ensureUser as v } from "./users.mjs";
3
+ import { FavoritesSchema as c } from "../schema.mjs";
4
+ const w = (n, t) => `favorites:${n}:${t}`;
5
+ async function l(n) {
6
+ const t = await d(), { uuid: s } = await v(), e = w(s, String(n)), o = await t.kv.get(e), a = o ? c.safeParse(o.value) : null;
7
+ return a != null && a.success ? a.data.unitIds : [];
8
+ }
9
+ async function S(n, t, s) {
10
+ const e = await d(), { uuid: o } = await v(), a = w(o, String(n));
11
+ return e.transaction("rw", e.kv, async () => {
12
+ const r = await e.kv.get(a), f = r && c.safeParse(r.value).success ? r.value : { unitIds: [], updatedAt: (/* @__PURE__ */ new Date()).toISOString() }, i = new Set(f.unitIds);
13
+ s ? i.add(t) : i.delete(t);
14
+ const g = {
15
+ unitIds: [...i],
16
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
17
+ }, u = c.parse(g);
18
+ return await e.kv.put({ key: a, value: u }), u.unitIds;
19
+ });
20
+ }
21
+ async function F(n, t) {
22
+ const e = !(await l(n)).includes(t);
23
+ return S(n, t, e);
24
+ }
25
+ async function p(n, t) {
26
+ return (await l(n)).includes(t);
27
+ }
28
+ export {
29
+ l as getFavoritedUnitsForProperty,
30
+ p as isUnitFavorited,
31
+ S as setFavoriteUnit,
32
+ F as toggleFavoriteUnit
33
+ };
34
+ //# sourceMappingURL=favorites.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"favorites.mjs","sources":["../../src/api/favorites.ts"],"sourcesContent":["// src/api/favourites.ts\nimport { getDB } from \"../db\";\nimport { ensureUser } from \"./users\";\nimport { FavoritesSchema } from \"../schema\";\n\nconst keyFor = (userId: string, propertyId: string) =>\n `favorites:${userId}:${propertyId}`;\n\nexport async function getFavoritedUnitsForProperty(\n propertyId: string | number,\n): Promise<string[]> {\n const db = await getDB();\n const { uuid } = await ensureUser();\n const key = keyFor(uuid, String(propertyId));\n const row = await db.kv.get(key);\n const parsed = row ? FavoritesSchema.safeParse(row.value) : null;\n return parsed?.success ? parsed.data.unitIds : [];\n}\n\nexport async function setFavoriteUnit(\n propertyId: string | number,\n unitId: string,\n on: boolean,\n): Promise<string[]> {\n const db = await getDB();\n const { uuid } = await ensureUser();\n const key = keyFor(uuid, String(propertyId));\n\n return db.transaction(\"rw\", db.kv, async () => {\n const row = await db.kv.get(key);\n const current =\n row && FavoritesSchema.safeParse(row.value).success\n ? (row!.value as any)\n : { unitIds: [] as string[], updatedAt: new Date().toISOString() };\n\n const nextSet = new Set<string>(current.unitIds);\n on ? nextSet.add(unitId) : nextSet.delete(unitId);\n\n const next = {\n unitIds: [...nextSet],\n updatedAt: new Date().toISOString(),\n };\n const validated = FavoritesSchema.parse(next);\n await db.kv.put({ key, value: validated });\n return validated.unitIds;\n });\n}\n\nexport async function toggleFavoriteUnit(\n propertyId: string | number,\n unitId: string,\n): Promise<string[]> {\n const current = await getFavoritedUnitsForProperty(propertyId);\n const on = !current.includes(unitId);\n return setFavoriteUnit(propertyId, unitId, on);\n}\n\nexport async function isUnitFavorited(\n propertyId: string | number,\n unitId: string,\n): Promise<boolean> {\n const list = await getFavoritedUnitsForProperty(propertyId);\n return list.includes(unitId);\n}\n"],"names":["keyFor","userId","propertyId","getFavoritedUnitsForProperty","db","getDB","uuid","ensureUser","key","row","parsed","FavoritesSchema","setFavoriteUnit","unitId","on","current","nextSet","next","validated","toggleFavoriteUnit","isUnitFavorited"],"mappings":";;;AAKA,MAAMA,IAAS,CAACC,GAAgBC,MAC9B,aAAaD,CAAM,IAAIC,CAAU;AAEnC,eAAsBC,EACpBD,GACmB;AACnB,QAAME,IAAK,MAAMC,EAAA,GACX,EAAE,MAAAC,MAAS,MAAMC,EAAA,GACjBC,IAAMR,EAAOM,GAAM,OAAOJ,CAAU,CAAC,GACrCO,IAAM,MAAML,EAAG,GAAG,IAAII,CAAG,GACzBE,IAASD,IAAME,EAAgB,UAAUF,EAAI,KAAK,IAAI;AAC5D,SAAOC,KAAA,QAAAA,EAAQ,UAAUA,EAAO,KAAK,UAAU,CAAA;AACjD;AAEA,eAAsBE,EACpBV,GACAW,GACAC,GACmB;AACnB,QAAMV,IAAK,MAAMC,EAAA,GACX,EAAE,MAAAC,MAAS,MAAMC,EAAA,GACjBC,IAAMR,EAAOM,GAAM,OAAOJ,CAAU,CAAC;AAE3C,SAAOE,EAAG,YAAY,MAAMA,EAAG,IAAI,YAAY;AAC7C,UAAMK,IAAM,MAAML,EAAG,GAAG,IAAII,CAAG,GACzBO,IACJN,KAAOE,EAAgB,UAAUF,EAAI,KAAK,EAAE,UACvCA,EAAK,QACN,EAAE,SAAS,IAAgB,gCAAe,KAAA,GAAO,cAAY,GAE7DO,IAAU,IAAI,IAAYD,EAAQ,OAAO;AAC/C,IAAAD,IAAKE,EAAQ,IAAIH,CAAM,IAAIG,EAAQ,OAAOH,CAAM;AAEhD,UAAMI,IAAO;AAAA,MACX,SAAS,CAAC,GAAGD,CAAO;AAAA,MACpB,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,IAAY,GAE9BE,IAAYP,EAAgB,MAAMM,CAAI;AAC5C,iBAAMb,EAAG,GAAG,IAAI,EAAE,KAAAI,GAAK,OAAOU,GAAW,GAClCA,EAAU;AAAA,EACnB,CAAC;AACH;AAEA,eAAsBC,EACpBjB,GACAW,GACmB;AAEnB,QAAMC,IAAK,EADK,MAAMX,EAA6BD,CAAU,GACzC,SAASW,CAAM;AACnC,SAAOD,EAAgBV,GAAYW,GAAQC,CAAE;AAC/C;AAEA,eAAsBM,EACpBlB,GACAW,GACkB;AAElB,UADa,MAAMV,EAA6BD,CAAU,GAC9C,SAASW,CAAM;AAC7B;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const y=require("../storage.cjs"),s=require("../schema.cjs"),c={data:{},propertySlug:null,propertyId:null,hasPreviouslySearched:[]};class l{async getState(){const e=await y.kvGet("property");if(!e)return c;const t={...e,propertyId:e.propertyId==null?null:String(e.propertyId),propertySlug:e.propertySlug??null,hasPreviouslySearched:Array.isArray(e.hasPreviouslySearched)?e.hasPreviouslySearched.map(String):[]},r=s.PropertyStoreDataSchema.safeParse(t);if(r.success)return r.data;const a=Object.entries(t.data??{}).reduce((i,[d,p])=>{const u=s.UserPropertyStateSchema.safeParse(p);return u.success&&(i[d]=u.data),i},{}),n={...c,...t,data:a},o=s.PropertyStoreDataSchema.safeParse(n);return o.success?o.data:c}async setState(e){const t=await this.getState(),r=e(t),a=s.PropertyStoreDataSchema.parse(r);await y.kvSet("property",a)}async setHasPreviouslySearched(e){await this.setState(t=>({...t,hasPreviouslySearched:Array.from(new Set([...t.hasPreviouslySearched,e]))}))}async setTourContactedOn(){await this.setState(e=>{const t=e.propertyId;if(!t)return e;const r=e.data[t];return r?{...e,data:{...e.data,[t]:{...r,tourContactedOn:new Date().toISOString()}}}:e})}async getTourContactedOn(){var r;const e=await this.getState(),t=e.propertyId;return t?((r=e.data[t])==null?void 0:r.tourContactedOn)??null:null}async setQuestionnaireResults(e){await this.setState(t=>{const r=t.propertyId;if(!r)return t;const a=t.data[r];return a?{...t,data:{...t.data,[r]:{...a,questionnaireResults:e}}}:t})}async setTourContactData(e){await this.setState(t=>{const r=t.propertyId;if(!r)return t;const a=t.data[r];return a?{...t,data:{...t.data,[r]:{...a,tourContactData:e}}}:t})}async toggleFavorite(e){await this.setState(t=>{const r=t.propertyId;if(!r)return t;const a=t.data[r];if(!a)return t;const o=a.favoritedUnits.includes(e)?a.favoritedUnits.filter(i=>i!==e):[...a.favoritedUnits,e];return{...t,data:{...t.data,[r]:{...a,favoritedUnits:o}}}})}async markUnitAsViewed(e,t){const r=new Date,a=`${String(r.getMonth()+1).padStart(2,"0")}/${String(r.getDate()).padStart(2,"0")}`;await this.setState(n=>{const o=n.propertyId;if(!o)return n;const i=n.data[o];if(!i)return n;const d=[...i.viewedUnits.filter(p=>p.unitId!==e),{unitId:e,viewedDate:a}];return{...n,data:{...n.data,[o]:{...i,viewedUnits:d}}}}),typeof window<"u"&&window.open(`//${t}`,"_blank")}async getUnitState(e){var a;const t=await this.getState(),r=t.propertyId?t.data[t.propertyId]:null;return{isFavorite:(r==null?void 0:r.favoritedUnits.includes(e))??!1,viewedDate:((a=r==null?void 0:r.viewedUnits.find(n=>n.unitId===e))==null?void 0:a.viewedDate)??""}}async getPropertyData(e){const t=await this.getState(),r=e==null?t.propertyId:String(e);return r?t.data[r]??null:null}async getCurrentProperty(){const e=await this.getState();return e.propertyId?e.data[e.propertyId]??null:null}async getFullState(){return this.getState()}async initializeProperty(e,t){const r=String(e);await this.setState(a=>a.data[r]?{...a,propertyId:r,propertySlug:t}:{...a,propertyId:r,propertySlug:t,data:{...a.data,[r]:{id:r,slug:t,favoritedUnits:[],tourContactedOn:null,viewedUnits:[],questionnaireResults:null,tourContactData:null}}})}}const S=new l;exports.PropertyStore=l;exports.propertyStore=S;
2
+ //# sourceMappingURL=properties.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties.cjs","sources":["../../src/api/properties.ts"],"sourcesContent":["import { kvGet, kvSet } from \"../storage\";\nimport {\n ViewedUnitSchema,\n TourContactDataSchema,\n UserPropertyStateSchema,\n PropertyStoreDataSchema,\n type ViewedUnit,\n type TourContactData,\n type UserPropertyState,\n type PropertyStoreData,\n} from \"../schema\";\n\n// Re-export types for legacy import paths\nexport type { ViewedUnit, TourContactData, UserPropertyState, PropertyStoreData } from \"../schema\";\n\n// Default state\nconst defaultPropertyStoreData: PropertyStoreData = {\n data: {},\n propertySlug: null,\n propertyId: null,\n hasPreviouslySearched: [],\n};\n\n// Core property store API\nexport class PropertyStore {\n private async getState(): Promise<PropertyStoreData> {\n const state = await kvGet<PropertyStoreData>(\"property\");\n if (!state) return defaultPropertyStoreData;\n\n const normalized = {\n ...state,\n propertyId: state.propertyId == null ? null : String(state.propertyId),\n propertySlug: state.propertySlug ?? null,\n hasPreviouslySearched: Array.isArray(state.hasPreviouslySearched)\n ? state.hasPreviouslySearched.map(String)\n : [],\n };\n\n const parsed = PropertyStoreDataSchema.safeParse(normalized);\n if (parsed.success) return parsed.data;\n\n const sanitizedData = Object.entries(normalized.data ?? {}).reduce<\n Record<string, UserPropertyState>\n >((acc, [key, value]) => {\n const entry = UserPropertyStateSchema.safeParse(value);\n if (entry.success) acc[key] = entry.data;\n return acc;\n }, {});\n\n const fallbackState = {\n ...defaultPropertyStoreData,\n ...normalized,\n data: sanitizedData,\n };\n\n const fallbackParsed = PropertyStoreDataSchema.safeParse(fallbackState);\n return fallbackParsed.success ? fallbackParsed.data : defaultPropertyStoreData;\n }\n\n private async setState(updater: (state: PropertyStoreData) => PropertyStoreData): Promise<void> {\n const currentState = await this.getState();\n const newState = updater(currentState);\n const validatedState = PropertyStoreDataSchema.parse(newState);\n await kvSet(\"property\", validatedState);\n }\n\n // Basic state operations (legacy direct setters removed in vNext)\n\n async setHasPreviouslySearched(slug: string): Promise<void> {\n await this.setState(state => ({\n ...state,\n hasPreviouslySearched: Array.from(\n new Set([...state.hasPreviouslySearched, slug])\n ),\n }));\n }\n\n // Property-specific operations\n async setTourContactedOn(): Promise<void> {\n await this.setState(state => {\n const propertyId = state.propertyId;\n if (!propertyId) return state;\n\n const property = state.data[propertyId];\n if (!property) return state;\n\n return {\n ...state,\n data: {\n ...state.data,\n [propertyId]: {\n ...property,\n tourContactedOn: new Date().toISOString(),\n },\n },\n };\n });\n }\n\n async getTourContactedOn(): Promise<string | null> {\n const state = await this.getState();\n const propertyId = state.propertyId;\n if (!propertyId) return null;\n\n return state.data[propertyId]?.tourContactedOn ?? null;\n }\n\n async setQuestionnaireResults(results: unknown): Promise<void> {\n await this.setState(state => {\n const propertyId = state.propertyId;\n if (!propertyId) return state;\n\n const property = state.data[propertyId];\n if (!property) return state;\n\n return {\n ...state,\n data: {\n ...state.data,\n [propertyId]: {\n ...property,\n questionnaireResults: results,\n },\n },\n };\n });\n }\n\n async setTourContactData(data: TourContactData): Promise<void> {\n await this.setState(state => {\n const propertyId = state.propertyId;\n if (!propertyId) return state;\n\n const property = state.data[propertyId];\n if (!property) return state;\n\n return {\n ...state,\n data: {\n ...state.data,\n [propertyId]: {\n ...property,\n tourContactData: data,\n },\n },\n };\n });\n }\n\n async toggleFavorite(unitId: string): Promise<void> {\n await this.setState(state => {\n const propertyId = state.propertyId;\n if (!propertyId) return state;\n\n const property = state.data[propertyId];\n if (!property) return state;\n\n const isFavorited = property.favoritedUnits.includes(unitId);\n const updatedFavoritedUnits = isFavorited\n ? property.favoritedUnits.filter((id) => id !== unitId)\n : [...property.favoritedUnits, unitId];\n\n return {\n ...state,\n data: {\n ...state.data,\n [propertyId]: {\n ...property,\n favoritedUnits: updatedFavoritedUnits,\n },\n },\n };\n });\n }\n\n async markUnitAsViewed(unitId: string, slug: string): Promise<void> {\n const today = new Date();\n const formattedDate = `${String(today.getMonth() + 1).padStart(\n 2,\n \"0\"\n )}/${String(today.getDate()).padStart(2, \"0\")}`;\n\n await this.setState(state => {\n const propertyId = state.propertyId;\n if (!propertyId) return state;\n\n const property = state.data[propertyId];\n if (!property) return state;\n\n const updatedViewedUnits = [\n // Remove existing entry if it exists\n ...property.viewedUnits.filter((u) => u.unitId !== unitId),\n // Add updated one\n {\n unitId,\n viewedDate: formattedDate,\n },\n ];\n\n return {\n ...state,\n data: {\n ...state.data,\n [propertyId]: {\n ...property,\n viewedUnits: updatedViewedUnits,\n },\n },\n };\n });\n\n // Note: This opens a new window - you might want to handle this in the consuming app\n if (typeof window !== 'undefined') {\n window.open(`//${slug}`, \"_blank\");\n }\n }\n\n // Utility methods for getting specific data\n async getUnitState(unitId: string): Promise<{\n isFavorite: boolean;\n viewedDate: string;\n }> {\n const state = await this.getState();\n const property = state.propertyId ? state.data[state.propertyId] : null;\n\n return {\n isFavorite: property?.favoritedUnits.includes(unitId) ?? false,\n viewedDate:\n property?.viewedUnits.find((u) => u.unitId === unitId)?.viewedDate ?? \"\",\n };\n }\n\n async getPropertyData(propertyId?: string | number): Promise<UserPropertyState | null> {\n const state = await this.getState();\n const id = propertyId == null ? state.propertyId : String(propertyId);\n return id ? state.data[id] ?? null : null;\n }\n\n async getCurrentProperty(): Promise<UserPropertyState | null> {\n const state = await this.getState();\n return state.propertyId ? state.data[state.propertyId] ?? null : null;\n }\n\n async getFullState(): Promise<PropertyStoreData> {\n return this.getState();\n }\n\n // Initialize property if it doesn't exist\n async initializeProperty(propertyId: string | number, slug: string): Promise<void> {\n const id = String(propertyId);\n await this.setState(state => {\n if (state.data[id]) {\n return { ...state, propertyId: id, propertySlug: slug };\n }\n\n return {\n ...state,\n propertyId: id,\n propertySlug: slug,\n data: {\n ...state.data,\n [id]: {\n id,\n slug,\n favoritedUnits: [],\n tourContactedOn: null,\n viewedUnits: [],\n questionnaireResults: null,\n tourContactData: null,\n },\n },\n };\n });\n }\n}\n\n// Export singleton instance\nexport const propertyStore = new PropertyStore();\n"],"names":["defaultPropertyStoreData","PropertyStore","state","kvGet","normalized","parsed","PropertyStoreDataSchema","sanitizedData","acc","key","value","entry","UserPropertyStateSchema","fallbackState","fallbackParsed","updater","currentState","newState","validatedState","kvSet","slug","propertyId","property","_a","results","data","unitId","updatedFavoritedUnits","id","today","formattedDate","updatedViewedUnits","u","propertyStore"],"mappings":"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"}