mvc-kit 2.12.5 → 2.13.1

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 (382) hide show
  1. package/BEST_PRACTICES.md +1390 -0
  2. package/agent-config/bin/postinstall.mjs +4 -3
  3. package/agent-config/bin/setup.mjs +5 -1
  4. package/agent-config/claude-code/agents/mvc-kit-architect.md +16 -8
  5. package/agent-config/claude-code/skills/guide/SKILL.md +29 -7
  6. package/agent-config/claude-code/skills/guide/patterns.md +12 -0
  7. package/agent-config/claude-code/skills/guide/recipes.md +510 -0
  8. package/agent-config/claude-code/skills/guide/testing.md +297 -0
  9. package/agent-config/claude-code/skills/review/SKILL.md +3 -13
  10. package/agent-config/claude-code/skills/review/checklist.md +30 -5
  11. package/agent-config/claude-code/skills/scaffold/SKILL.md +4 -13
  12. package/agent-config/lib/install-claude.mjs +90 -25
  13. package/dist/Channel.cjs +276 -300
  14. package/dist/Channel.cjs.map +1 -1
  15. package/dist/Channel.js +275 -299
  16. package/dist/Channel.js.map +1 -1
  17. package/dist/Collection.cjs +424 -504
  18. package/dist/Collection.cjs.map +1 -1
  19. package/dist/Collection.js +423 -503
  20. package/dist/Collection.js.map +1 -1
  21. package/dist/Controller.cjs +70 -67
  22. package/dist/Controller.cjs.map +1 -1
  23. package/dist/Controller.js +69 -66
  24. package/dist/Controller.js.map +1 -1
  25. package/dist/EventBus.cjs +77 -88
  26. package/dist/EventBus.cjs.map +1 -1
  27. package/dist/EventBus.js +76 -87
  28. package/dist/EventBus.js.map +1 -1
  29. package/dist/Feed.cjs +81 -77
  30. package/dist/Feed.cjs.map +1 -1
  31. package/dist/Feed.js +80 -76
  32. package/dist/Feed.js.map +1 -1
  33. package/dist/Model.cjs +181 -207
  34. package/dist/Model.cjs.map +1 -1
  35. package/dist/Model.js +179 -205
  36. package/dist/Model.js.map +1 -1
  37. package/dist/Pagination.cjs +75 -73
  38. package/dist/Pagination.cjs.map +1 -1
  39. package/dist/Pagination.js +74 -72
  40. package/dist/Pagination.js.map +1 -1
  41. package/dist/Pending.cjs +255 -287
  42. package/dist/Pending.cjs.map +1 -1
  43. package/dist/Pending.js +253 -285
  44. package/dist/Pending.js.map +1 -1
  45. package/dist/PersistentCollection.cjs +242 -285
  46. package/dist/PersistentCollection.cjs.map +1 -1
  47. package/dist/PersistentCollection.js +241 -284
  48. package/dist/PersistentCollection.js.map +1 -1
  49. package/dist/Resource.cjs +166 -174
  50. package/dist/Resource.cjs.map +1 -1
  51. package/dist/Resource.js +164 -172
  52. package/dist/Resource.js.map +1 -1
  53. package/dist/Selection.cjs +84 -94
  54. package/dist/Selection.cjs.map +1 -1
  55. package/dist/Selection.js +83 -93
  56. package/dist/Selection.js.map +1 -1
  57. package/dist/Service.cjs +54 -55
  58. package/dist/Service.cjs.map +1 -1
  59. package/dist/Service.js +53 -54
  60. package/dist/Service.js.map +1 -1
  61. package/dist/Sorting.cjs +102 -101
  62. package/dist/Sorting.cjs.map +1 -1
  63. package/dist/Sorting.js +102 -101
  64. package/dist/Sorting.js.map +1 -1
  65. package/dist/Trackable.cjs +112 -80
  66. package/dist/Trackable.cjs.map +1 -1
  67. package/dist/Trackable.js +111 -79
  68. package/dist/Trackable.js.map +1 -1
  69. package/dist/ViewModel.cjs +528 -576
  70. package/dist/ViewModel.cjs.map +1 -1
  71. package/dist/ViewModel.js +525 -573
  72. package/dist/ViewModel.js.map +1 -1
  73. package/dist/bindPublicMethods.cjs +43 -24
  74. package/dist/bindPublicMethods.cjs.map +1 -1
  75. package/dist/bindPublicMethods.js +43 -24
  76. package/dist/bindPublicMethods.js.map +1 -1
  77. package/dist/errors.cjs +67 -68
  78. package/dist/errors.cjs.map +1 -1
  79. package/dist/errors.js +68 -71
  80. package/dist/errors.js.map +1 -1
  81. package/dist/mvc-kit.cjs +44 -46
  82. package/dist/mvc-kit.js +5 -32
  83. package/dist/produceDraft.cjs +105 -95
  84. package/dist/produceDraft.cjs.map +1 -1
  85. package/dist/produceDraft.js +106 -97
  86. package/dist/produceDraft.js.map +1 -1
  87. package/dist/react/components/CardList.cjs +30 -40
  88. package/dist/react/components/CardList.cjs.map +1 -1
  89. package/dist/react/components/CardList.js +31 -41
  90. package/dist/react/components/CardList.js.map +1 -1
  91. package/dist/react/components/DataTable.cjs +146 -169
  92. package/dist/react/components/DataTable.cjs.map +1 -1
  93. package/dist/react/components/DataTable.js +147 -170
  94. package/dist/react/components/DataTable.js.map +1 -1
  95. package/dist/react/components/InfiniteScroll.cjs +51 -42
  96. package/dist/react/components/InfiniteScroll.cjs.map +1 -1
  97. package/dist/react/components/InfiniteScroll.js +52 -43
  98. package/dist/react/components/InfiniteScroll.js.map +1 -1
  99. package/dist/react/components/types.cjs +10 -6
  100. package/dist/react/components/types.cjs.map +1 -1
  101. package/dist/react/components/types.js +11 -9
  102. package/dist/react/components/types.js.map +1 -1
  103. package/dist/react/guards.cjs +10 -6
  104. package/dist/react/guards.cjs.map +1 -1
  105. package/dist/react/guards.js +11 -9
  106. package/dist/react/guards.js.map +1 -1
  107. package/dist/react/provider.cjs +23 -20
  108. package/dist/react/provider.cjs.map +1 -1
  109. package/dist/react/provider.js +23 -21
  110. package/dist/react/provider.js.map +1 -1
  111. package/dist/react/use-event-bus.cjs +24 -20
  112. package/dist/react/use-event-bus.cjs.map +1 -1
  113. package/dist/react/use-event-bus.js +24 -21
  114. package/dist/react/use-event-bus.js.map +1 -1
  115. package/dist/react/use-instance.cjs +43 -36
  116. package/dist/react/use-instance.cjs.map +1 -1
  117. package/dist/react/use-instance.js +43 -36
  118. package/dist/react/use-instance.js.map +1 -1
  119. package/dist/react/use-local.cjs +48 -64
  120. package/dist/react/use-local.cjs.map +1 -1
  121. package/dist/react/use-local.js +47 -63
  122. package/dist/react/use-local.js.map +1 -1
  123. package/dist/react/use-model.cjs +84 -98
  124. package/dist/react/use-model.cjs.map +1 -1
  125. package/dist/react/use-model.js +84 -100
  126. package/dist/react/use-model.js.map +1 -1
  127. package/dist/react/use-singleton.cjs +19 -23
  128. package/dist/react/use-singleton.cjs.map +1 -1
  129. package/dist/react/use-singleton.js +16 -20
  130. package/dist/react/use-singleton.js.map +1 -1
  131. package/dist/react/use-subscribe-only.cjs +28 -22
  132. package/dist/react/use-subscribe-only.cjs.map +1 -1
  133. package/dist/react/use-subscribe-only.js +28 -22
  134. package/dist/react/use-subscribe-only.js.map +1 -1
  135. package/dist/react/use-teardown.cjs +20 -19
  136. package/dist/react/use-teardown.cjs.map +1 -1
  137. package/dist/react/use-teardown.js +20 -19
  138. package/dist/react/use-teardown.js.map +1 -1
  139. package/dist/react-native/NativeCollection.cjs +98 -78
  140. package/dist/react-native/NativeCollection.cjs.map +1 -1
  141. package/dist/react-native/NativeCollection.js +97 -77
  142. package/dist/react-native/NativeCollection.js.map +1 -1
  143. package/dist/react-native.cjs +2 -4
  144. package/dist/react-native.js +1 -4
  145. package/dist/react.cjs +24 -26
  146. package/dist/react.js +1 -17
  147. package/dist/singleton.cjs +28 -22
  148. package/dist/singleton.cjs.map +1 -1
  149. package/dist/singleton.js +29 -26
  150. package/dist/singleton.js.map +1 -1
  151. package/dist/walkPrototypeChain.cjs +20 -12
  152. package/dist/walkPrototypeChain.cjs.map +1 -1
  153. package/dist/walkPrototypeChain.js +21 -13
  154. package/dist/walkPrototypeChain.js.map +1 -1
  155. package/dist/web/IndexedDBCollection.cjs +53 -36
  156. package/dist/web/IndexedDBCollection.cjs.map +1 -1
  157. package/dist/web/IndexedDBCollection.js +52 -35
  158. package/dist/web/IndexedDBCollection.js.map +1 -1
  159. package/dist/web/WebStorageCollection.cjs +82 -84
  160. package/dist/web/WebStorageCollection.cjs.map +1 -1
  161. package/dist/web/WebStorageCollection.js +81 -83
  162. package/dist/web/WebStorageCollection.js.map +1 -1
  163. package/dist/web/idb.cjs +107 -99
  164. package/dist/web/idb.cjs.map +1 -1
  165. package/dist/web/idb.js +108 -105
  166. package/dist/web/idb.js.map +1 -1
  167. package/dist/web.cjs +4 -6
  168. package/dist/web.js +1 -5
  169. package/dist/wrapAsyncMethods.cjs +141 -168
  170. package/dist/wrapAsyncMethods.cjs.map +1 -1
  171. package/dist/wrapAsyncMethods.js +141 -168
  172. package/dist/wrapAsyncMethods.js.map +1 -1
  173. package/examples/primitive/channel.ts +109 -0
  174. package/examples/primitive/collection.ts +118 -0
  175. package/examples/primitive/controller.ts +118 -0
  176. package/examples/primitive/counter.ts +108 -0
  177. package/examples/primitive/env.d.ts +1 -0
  178. package/examples/primitive/eventbus.ts +77 -0
  179. package/examples/primitive/feed.ts +162 -0
  180. package/examples/primitive/model.ts +82 -0
  181. package/examples/primitive/pagination.ts +91 -0
  182. package/examples/primitive/pending.ts +189 -0
  183. package/examples/primitive/persistent-collection.ts +116 -0
  184. package/examples/primitive/resource.ts +114 -0
  185. package/examples/primitive/selection.ts +96 -0
  186. package/examples/primitive/sorting.ts +112 -0
  187. package/examples/primitive/timer.ts +58 -0
  188. package/examples/primitive/trackable.ts +225 -0
  189. package/examples/primitive/tsconfig.json +20 -0
  190. package/examples/primitive/viewmodel-service.ts +161 -0
  191. package/examples/react/AuthExample/index.html +12 -0
  192. package/examples/react/AuthExample/src/App.tsx +29 -0
  193. package/examples/react/AuthExample/src/components/AdminPage.tsx +51 -0
  194. package/examples/react/AuthExample/src/components/AppHeader.tsx +32 -0
  195. package/examples/react/AuthExample/src/components/AuthGuard.tsx +50 -0
  196. package/examples/react/AuthExample/src/components/AuthScreen.tsx +181 -0
  197. package/examples/react/AuthExample/src/components/DashboardPage.tsx +41 -0
  198. package/examples/react/AuthExample/src/components/ProfilePage.tsx +44 -0
  199. package/examples/react/AuthExample/src/components/Toast.tsx +41 -0
  200. package/examples/react/AuthExample/src/env.d.ts +10 -0
  201. package/examples/react/AuthExample/src/events/AppEventBus.ts +7 -0
  202. package/examples/react/AuthExample/src/main.tsx +10 -0
  203. package/examples/react/AuthExample/src/mock/api.ts +78 -0
  204. package/examples/react/AuthExample/src/models/LoginFormModel.ts +19 -0
  205. package/examples/react/AuthExample/src/models/RegisterFormModel.ts +25 -0
  206. package/examples/react/AuthExample/src/services/AuthService.ts +21 -0
  207. package/examples/react/AuthExample/src/styles.css +445 -0
  208. package/examples/react/AuthExample/src/types/auth.ts +12 -0
  209. package/examples/react/AuthExample/src/viewmodels/AuthViewModel.ts +111 -0
  210. package/examples/react/AuthExample/tsconfig.json +22 -0
  211. package/examples/react/AuthExample/vite.config.ts +18 -0
  212. package/examples/react/ComplexApp/index.html +12 -0
  213. package/examples/react/ComplexApp/src/App.tsx +17 -0
  214. package/examples/react/ComplexApp/src/channels/ActivityChannel.ts +24 -0
  215. package/examples/react/ComplexApp/src/channels/DashboardChannel.ts +26 -0
  216. package/examples/react/ComplexApp/src/channels/ErrorsChannel.ts +5 -0
  217. package/examples/react/ComplexApp/src/channels/LatencyChannel.ts +5 -0
  218. package/examples/react/ComplexApp/src/channels/OrdersChannel.ts +5 -0
  219. package/examples/react/ComplexApp/src/channels/RevenueChannel.ts +5 -0
  220. package/examples/react/ComplexApp/src/channels/TrafficChannel.ts +5 -0
  221. package/examples/react/ComplexApp/src/channels/UsersMetricChannel.ts +5 -0
  222. package/examples/react/ComplexApp/src/collections/DashboardCollection.ts +6 -0
  223. package/examples/react/ComplexApp/src/collections/ErrorsCollection.ts +3 -0
  224. package/examples/react/ComplexApp/src/collections/LatencyCollection.ts +3 -0
  225. package/examples/react/ComplexApp/src/collections/OrdersCollection.ts +3 -0
  226. package/examples/react/ComplexApp/src/collections/RevenueCollection.ts +3 -0
  227. package/examples/react/ComplexApp/src/collections/TrafficCollection.ts +3 -0
  228. package/examples/react/ComplexApp/src/collections/UsersMetricCollection.ts +3 -0
  229. package/examples/react/ComplexApp/src/components/activity/ActivityFeed.tsx +31 -0
  230. package/examples/react/ComplexApp/src/components/activity/ActivityItemRow.tsx +35 -0
  231. package/examples/react/ComplexApp/src/components/dashboard/DashboardCard.tsx +37 -0
  232. package/examples/react/ComplexApp/src/components/dashboard/DashboardPage.tsx +34 -0
  233. package/examples/react/ComplexApp/src/components/layout/Navbar.tsx +32 -0
  234. package/examples/react/ComplexApp/src/components/layout/SocialFeedPanel.tsx +57 -0
  235. package/examples/react/ComplexApp/src/components/shared/Spinner.tsx +3 -0
  236. package/examples/react/ComplexApp/src/components/shared/StatusIndicator.tsx +13 -0
  237. package/examples/react/ComplexApp/src/components/shared/Toast.tsx +40 -0
  238. package/examples/react/ComplexApp/src/env.d.ts +10 -0
  239. package/examples/react/ComplexApp/src/events/AppEventBus.ts +7 -0
  240. package/examples/react/ComplexApp/src/main.tsx +10 -0
  241. package/examples/react/ComplexApp/src/mock-remote/MockWebSocket.ts +38 -0
  242. package/examples/react/ComplexApp/src/mock-remote/activity-api.ts +48 -0
  243. package/examples/react/ComplexApp/src/mock-remote/dashboard-generators.ts +45 -0
  244. package/examples/react/ComplexApp/src/mock-remote/delay.ts +18 -0
  245. package/examples/react/ComplexApp/src/mock-remote/social-api.ts +55 -0
  246. package/examples/react/ComplexApp/src/resources/ActivityResource.ts +12 -0
  247. package/examples/react/ComplexApp/src/resources/SocialFeedResource.ts +17 -0
  248. package/examples/react/ComplexApp/src/styles.css +463 -0
  249. package/examples/react/ComplexApp/src/types/activity.ts +8 -0
  250. package/examples/react/ComplexApp/src/types/dashboard.ts +5 -0
  251. package/examples/react/ComplexApp/src/types/social.ts +8 -0
  252. package/examples/react/ComplexApp/src/types/users.ts +6 -0
  253. package/examples/react/ComplexApp/src/viewmodels/ActivityFeedViewModel.ts +68 -0
  254. package/examples/react/ComplexApp/src/viewmodels/AppStateViewModel.ts +26 -0
  255. package/examples/react/ComplexApp/src/viewmodels/DashboardCardViewModel.ts +69 -0
  256. package/examples/react/ComplexApp/src/viewmodels/ErrorsCardViewModel.ts +9 -0
  257. package/examples/react/ComplexApp/src/viewmodels/LatencyCardViewModel.ts +9 -0
  258. package/examples/react/ComplexApp/src/viewmodels/OrdersCardViewModel.ts +9 -0
  259. package/examples/react/ComplexApp/src/viewmodels/RevenueCardViewModel.ts +9 -0
  260. package/examples/react/ComplexApp/src/viewmodels/SocialFeedViewModel.ts +39 -0
  261. package/examples/react/ComplexApp/src/viewmodels/TrafficCardViewModel.ts +9 -0
  262. package/examples/react/ComplexApp/src/viewmodels/UsersMetricCardViewModel.ts +9 -0
  263. package/examples/react/ComplexApp/tsconfig.json +22 -0
  264. package/examples/react/ComplexApp/vite.config.ts +18 -0
  265. package/examples/react/FullApp/index.html +12 -0
  266. package/examples/react/FullApp/src/App.tsx +28 -0
  267. package/examples/react/FullApp/src/collections/ConversationsCollection.ts +4 -0
  268. package/examples/react/FullApp/src/collections/LocationsCollection.ts +4 -0
  269. package/examples/react/FullApp/src/components/auth/LoginPage.tsx +80 -0
  270. package/examples/react/FullApp/src/components/dashboard/DashboardPage.tsx +29 -0
  271. package/examples/react/FullApp/src/components/dashboard/RecentActivityCard.tsx +35 -0
  272. package/examples/react/FullApp/src/components/dashboard/StatsCard.tsx +19 -0
  273. package/examples/react/FullApp/src/components/layout/AppShell.tsx +31 -0
  274. package/examples/react/FullApp/src/components/layout/Header.tsx +25 -0
  275. package/examples/react/FullApp/src/components/layout/Sidebar.tsx +29 -0
  276. package/examples/react/FullApp/src/components/locations/LocationFilters.tsx +60 -0
  277. package/examples/react/FullApp/src/components/locations/LocationForm.tsx +112 -0
  278. package/examples/react/FullApp/src/components/locations/LocationProfilePage.tsx +81 -0
  279. package/examples/react/FullApp/src/components/locations/LocationsPage.tsx +127 -0
  280. package/examples/react/FullApp/src/components/messaging/ConversationList.tsx +59 -0
  281. package/examples/react/FullApp/src/components/messaging/MessageBubble.tsx +22 -0
  282. package/examples/react/FullApp/src/components/messaging/MessageThread.tsx +100 -0
  283. package/examples/react/FullApp/src/components/messaging/MessagingPage.tsx +52 -0
  284. package/examples/react/FullApp/src/components/shared/ErrorBanner.tsx +3 -0
  285. package/examples/react/FullApp/src/components/shared/Spinner.tsx +7 -0
  286. package/examples/react/FullApp/src/components/shared/Toast.tsx +41 -0
  287. package/examples/react/FullApp/src/components/users/UserFilters.tsx +59 -0
  288. package/examples/react/FullApp/src/components/users/UsersPage.tsx +80 -0
  289. package/examples/react/FullApp/src/components/users/UsersTable.tsx +52 -0
  290. package/examples/react/FullApp/src/env.d.ts +10 -0
  291. package/examples/react/FullApp/src/events/AppEventBus.ts +7 -0
  292. package/examples/react/FullApp/src/main.tsx +10 -0
  293. package/examples/react/FullApp/src/mock/delay.ts +21 -0
  294. package/examples/react/FullApp/src/mock/locations.ts +76 -0
  295. package/examples/react/FullApp/src/mock/messages.ts +237 -0
  296. package/examples/react/FullApp/src/mock/users.ts +84 -0
  297. package/examples/react/FullApp/src/models/LocationFormModel.ts +31 -0
  298. package/examples/react/FullApp/src/models/LoginFormModel.ts +19 -0
  299. package/examples/react/FullApp/src/resources/UsersResource.ts +12 -0
  300. package/examples/react/FullApp/src/services/AuthService.ts +18 -0
  301. package/examples/react/FullApp/src/services/LocationService.ts +23 -0
  302. package/examples/react/FullApp/src/services/MessageService.ts +65 -0
  303. package/examples/react/FullApp/src/services/UserService.ts +23 -0
  304. package/examples/react/FullApp/src/styles.css +767 -0
  305. package/examples/react/FullApp/src/types/conversation.ts +7 -0
  306. package/examples/react/FullApp/src/types/location.ts +12 -0
  307. package/examples/react/FullApp/src/types/message.ts +7 -0
  308. package/examples/react/FullApp/src/types/user.ts +10 -0
  309. package/examples/react/FullApp/src/viewmodels/AuthViewModel.ts +51 -0
  310. package/examples/react/FullApp/src/viewmodels/ConversationsViewModel.ts +89 -0
  311. package/examples/react/FullApp/src/viewmodels/DashboardViewModel.ts +56 -0
  312. package/examples/react/FullApp/src/viewmodels/LocationProfileViewModel.ts +81 -0
  313. package/examples/react/FullApp/src/viewmodels/LocationsViewModel.ts +113 -0
  314. package/examples/react/FullApp/src/viewmodels/MessageThreadViewModel.ts +83 -0
  315. package/examples/react/FullApp/src/viewmodels/UsersViewModel.ts +88 -0
  316. package/examples/react/FullApp/tsconfig.json +22 -0
  317. package/examples/react/FullApp/vite.config.ts +18 -0
  318. package/examples/react/WorkerApp/index.html +12 -0
  319. package/examples/react/WorkerApp/src/App.tsx +24 -0
  320. package/examples/react/WorkerApp/src/channels/MessagingChannel.ts +46 -0
  321. package/examples/react/WorkerApp/src/channels/WorkerStatusChannel.ts +35 -0
  322. package/examples/react/WorkerApp/src/components/auth/LoginPage.tsx +60 -0
  323. package/examples/react/WorkerApp/src/components/layout/AppShell.tsx +31 -0
  324. package/examples/react/WorkerApp/src/components/layout/Header.tsx +23 -0
  325. package/examples/react/WorkerApp/src/components/layout/Sidebar.tsx +28 -0
  326. package/examples/react/WorkerApp/src/components/messaging/ComposeBar.tsx +33 -0
  327. package/examples/react/WorkerApp/src/components/messaging/ConversationList.tsx +59 -0
  328. package/examples/react/WorkerApp/src/components/messaging/MessageBubble.tsx +45 -0
  329. package/examples/react/WorkerApp/src/components/messaging/MessageThread.tsx +93 -0
  330. package/examples/react/WorkerApp/src/components/messaging/MessagingPage.tsx +53 -0
  331. package/examples/react/WorkerApp/src/components/shared/ErrorBanner.tsx +3 -0
  332. package/examples/react/WorkerApp/src/components/shared/PendingBanner.tsx +37 -0
  333. package/examples/react/WorkerApp/src/components/shared/Spinner.tsx +7 -0
  334. package/examples/react/WorkerApp/src/components/shared/Toast.tsx +41 -0
  335. package/examples/react/WorkerApp/src/components/shift/ShiftPage.tsx +98 -0
  336. package/examples/react/WorkerApp/src/components/shift/ShiftTimer.tsx +24 -0
  337. package/examples/react/WorkerApp/src/components/shift/SiteSelector.tsx +27 -0
  338. package/examples/react/WorkerApp/src/components/sites/SiteFilters.tsx +61 -0
  339. package/examples/react/WorkerApp/src/components/sites/SitesPage.tsx +102 -0
  340. package/examples/react/WorkerApp/src/env.d.ts +10 -0
  341. package/examples/react/WorkerApp/src/events/AppEventBus.ts +7 -0
  342. package/examples/react/WorkerApp/src/main.tsx +10 -0
  343. package/examples/react/WorkerApp/src/mock/MockWebSocket.ts +38 -0
  344. package/examples/react/WorkerApp/src/mock/delay.ts +31 -0
  345. package/examples/react/WorkerApp/src/mock/messages.ts +120 -0
  346. package/examples/react/WorkerApp/src/mock/shifts.ts +57 -0
  347. package/examples/react/WorkerApp/src/mock/sites.ts +14 -0
  348. package/examples/react/WorkerApp/src/mock/workers.ts +12 -0
  349. package/examples/react/WorkerApp/src/models/ComposeMessageModel.ts +17 -0
  350. package/examples/react/WorkerApp/src/resources/ConversationsResource.ts +10 -0
  351. package/examples/react/WorkerApp/src/resources/MessagesResource.ts +32 -0
  352. package/examples/react/WorkerApp/src/resources/ShiftResource.ts +73 -0
  353. package/examples/react/WorkerApp/src/resources/SitesResource.ts +11 -0
  354. package/examples/react/WorkerApp/src/resources/WorkersResource.ts +11 -0
  355. package/examples/react/WorkerApp/src/styles.css +756 -0
  356. package/examples/react/WorkerApp/src/types/conversation.ts +7 -0
  357. package/examples/react/WorkerApp/src/types/message.ts +7 -0
  358. package/examples/react/WorkerApp/src/types/shift.ts +13 -0
  359. package/examples/react/WorkerApp/src/types/site.ts +8 -0
  360. package/examples/react/WorkerApp/src/types/worker.ts +8 -0
  361. package/examples/react/WorkerApp/src/viewmodels/AuthViewModel.ts +41 -0
  362. package/examples/react/WorkerApp/src/viewmodels/ConversationsViewModel.ts +83 -0
  363. package/examples/react/WorkerApp/src/viewmodels/MessageThreadViewModel.ts +113 -0
  364. package/examples/react/WorkerApp/src/viewmodels/ShiftViewModel.ts +147 -0
  365. package/examples/react/WorkerApp/src/viewmodels/SitesViewModel.ts +82 -0
  366. package/examples/react/WorkerApp/tsconfig.json +22 -0
  367. package/examples/react/WorkerApp/vite.config.ts +18 -0
  368. package/package.json +11 -9
  369. package/src/Pending.test.ts +1 -2
  370. package/src/Sorting.test.ts +1 -1
  371. package/src/produceDraft.test.ts +3 -3
  372. package/src/react/components/CardList.test.tsx +1 -1
  373. package/src/react/components/DataTable.test.tsx +1 -1
  374. package/src/react/components/InfiniteScroll.test.tsx +5 -5
  375. package/dist/mvc-kit.cjs.map +0 -1
  376. package/dist/mvc-kit.js.map +0 -1
  377. package/dist/react-native.cjs.map +0 -1
  378. package/dist/react-native.js.map +0 -1
  379. package/dist/react.cjs.map +0 -1
  380. package/dist/react.js.map +0 -1
  381. package/dist/web.cjs.map +0 -1
  382. package/dist/web.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"idb.cjs","sources":["../../src/web/idb.ts"],"sourcesContent":["/**\n * Shared IndexedDB connection manager.\n * Deduplicates indexedDB.open() calls and handles dynamic object store creation\n * by bumping the DB version when a new storageKey is encountered.\n */\n\nconst _connections = new Map<string, IDBDatabase>();\nconst _stores = new Map<string, Set<string>>(); // dbName → known store names\nlet _openQueue: Promise<void> = Promise.resolve(); // Sequential open queue\n\nfunction openDB(dbName: string, storeName: string): Promise<IDBDatabase> {\n // If we already have a connection with the required store, reuse it\n const existing = _connections.get(dbName);\n if (existing) {\n if (existing.objectStoreNames.contains(storeName)) {\n return Promise.resolve(existing);\n }\n // Need to add a new store — close and reopen with bumped version\n existing.close();\n _connections.delete(dbName);\n }\n\n // Track known stores\n let stores = _stores.get(dbName);\n if (!stores) {\n stores = new Set();\n _stores.set(dbName, stores);\n }\n stores.add(storeName);\n\n // Serialize opens to prevent version conflicts\n const result = _openQueue.then(() => doOpen(dbName, stores!));\n _openQueue = result.then(() => {}, () => {}); // Absorb errors for the queue\n return result;\n}\n\nfunction doOpen(dbName: string, stores: Set<string>): Promise<IDBDatabase> {\n // Close existing cached connection if any (may have been opened by queued op)\n const existingDb = _connections.get(dbName);\n existingDb?.close();\n _connections.delete(dbName);\n\n // Probe current DB version (version-less open never triggers upgrade)\n return new Promise<IDBDatabase>((resolve, reject) => {\n const probe = indexedDB.open(dbName);\n probe.onsuccess = () => {\n const db = probe.result;\n const version = db.version;\n\n // Check if all required stores already exist\n let needsUpgrade = false;\n for (const name of stores) {\n if (!db.objectStoreNames.contains(name)) {\n needsUpgrade = true;\n break;\n }\n }\n\n if (!needsUpgrade) {\n _connections.set(dbName, db);\n resolve(db);\n return;\n }\n\n // Need new stores — close and reopen with bumped version\n db.close();\n const upgrade = indexedDB.open(dbName, version + 1);\n upgrade.onupgradeneeded = () => {\n const udb = upgrade.result;\n for (const name of stores) {\n if (!udb.objectStoreNames.contains(name)) {\n udb.createObjectStore(name, { keyPath: 'id' });\n }\n }\n };\n upgrade.onsuccess = () => {\n _connections.set(dbName, upgrade.result);\n resolve(upgrade.result);\n };\n upgrade.onerror = () => reject(upgrade.error);\n };\n probe.onerror = () => reject(probe.error);\n });\n}\n\n/**\n * Open a transaction and return the object store for the given database and store name.\n */\nexport function getStore(\n dbName: string,\n storeName: string,\n mode: IDBTransactionMode,\n): Promise<IDBObjectStore> {\n return openDB(dbName, storeName).then((db) => {\n const tx = db.transaction(storeName, mode);\n return tx.objectStore(storeName);\n });\n}\n\n/**\n * Retrieve all items from an IndexedDB object store.\n */\nexport function idbGetAll<T>(store: IDBObjectStore): Promise<T[]> {\n return new Promise((resolve, reject) => {\n const request = store.getAll();\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n}\n\n/**\n * Retrieve a single item by key from an IndexedDB object store.\n */\nexport function idbGet<T>(store: IDBObjectStore, id: IDBValidKey): Promise<T | null> {\n return new Promise((resolve, reject) => {\n const request = store.get(id);\n request.onsuccess = () => resolve(request.result ?? null);\n request.onerror = () => reject(request.error);\n });\n}\n\n/**\n * Write (put) multiple items into an IndexedDB object store.\n */\nexport function idbPut<T>(store: IDBObjectStore, items: T[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = store.transaction;\n for (const item of items) {\n store.put(item);\n }\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/**\n * Delete multiple items by key from an IndexedDB object store.\n */\nexport function idbDelete(store: IDBObjectStore, ids: IDBValidKey[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = store.transaction;\n for (const id of ids) {\n store.delete(id);\n }\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/**\n * Clear all items from an IndexedDB object store.\n */\nexport function idbClear(store: IDBObjectStore): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = store.transaction;\n store.clear();\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/** Close all cached connections and delete all known databases. Used in test cleanup. */\nexport function closeAllConnections(): void {\n for (const db of _connections.values()) {\n db.close();\n }\n _connections.clear();\n _stores.clear();\n _openQueue = Promise.resolve();\n}\n\n/** Delete a database by name. Returns a promise that resolves when deleted. */\nexport function deleteDatabase(dbName: string): Promise<void> {\n const existing = _connections.get(dbName);\n existing?.close();\n _connections.delete(dbName);\n _stores.delete(dbName);\n\n return new Promise((resolve, reject) => {\n const request = indexedDB.deleteDatabase(dbName);\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"idb.cjs","names":[],"sources":["../../src/web/idb.ts"],"sourcesContent":["/**\n * Shared IndexedDB connection manager.\n * Deduplicates indexedDB.open() calls and handles dynamic object store creation\n * by bumping the DB version when a new storageKey is encountered.\n */\n\nconst _connections = new Map<string, IDBDatabase>();\nconst _stores = new Map<string, Set<string>>(); // dbName → known store names\nlet _openQueue: Promise<void> = Promise.resolve(); // Sequential open queue\n\nfunction openDB(dbName: string, storeName: string): Promise<IDBDatabase> {\n // If we already have a connection with the required store, reuse it\n const existing = _connections.get(dbName);\n if (existing) {\n if (existing.objectStoreNames.contains(storeName)) {\n return Promise.resolve(existing);\n }\n // Need to add a new store — close and reopen with bumped version\n existing.close();\n _connections.delete(dbName);\n }\n\n // Track known stores\n let stores = _stores.get(dbName);\n if (!stores) {\n stores = new Set();\n _stores.set(dbName, stores);\n }\n stores.add(storeName);\n\n // Serialize opens to prevent version conflicts\n const result = _openQueue.then(() => doOpen(dbName, stores!));\n _openQueue = result.then(() => {}, () => {}); // Absorb errors for the queue\n return result;\n}\n\nfunction doOpen(dbName: string, stores: Set<string>): Promise<IDBDatabase> {\n // Close existing cached connection if any (may have been opened by queued op)\n const existingDb = _connections.get(dbName);\n existingDb?.close();\n _connections.delete(dbName);\n\n // Probe current DB version (version-less open never triggers upgrade)\n return new Promise<IDBDatabase>((resolve, reject) => {\n const probe = indexedDB.open(dbName);\n probe.onsuccess = () => {\n const db = probe.result;\n const version = db.version;\n\n // Check if all required stores already exist\n let needsUpgrade = false;\n for (const name of stores) {\n if (!db.objectStoreNames.contains(name)) {\n needsUpgrade = true;\n break;\n }\n }\n\n if (!needsUpgrade) {\n _connections.set(dbName, db);\n resolve(db);\n return;\n }\n\n // Need new stores — close and reopen with bumped version\n db.close();\n const upgrade = indexedDB.open(dbName, version + 1);\n upgrade.onupgradeneeded = () => {\n const udb = upgrade.result;\n for (const name of stores) {\n if (!udb.objectStoreNames.contains(name)) {\n udb.createObjectStore(name, { keyPath: 'id' });\n }\n }\n };\n upgrade.onsuccess = () => {\n _connections.set(dbName, upgrade.result);\n resolve(upgrade.result);\n };\n upgrade.onerror = () => reject(upgrade.error);\n };\n probe.onerror = () => reject(probe.error);\n });\n}\n\n/**\n * Open a transaction and return the object store for the given database and store name.\n */\nexport function getStore(\n dbName: string,\n storeName: string,\n mode: IDBTransactionMode,\n): Promise<IDBObjectStore> {\n return openDB(dbName, storeName).then((db) => {\n const tx = db.transaction(storeName, mode);\n return tx.objectStore(storeName);\n });\n}\n\n/**\n * Retrieve all items from an IndexedDB object store.\n */\nexport function idbGetAll<T>(store: IDBObjectStore): Promise<T[]> {\n return new Promise((resolve, reject) => {\n const request = store.getAll();\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n}\n\n/**\n * Retrieve a single item by key from an IndexedDB object store.\n */\nexport function idbGet<T>(store: IDBObjectStore, id: IDBValidKey): Promise<T | null> {\n return new Promise((resolve, reject) => {\n const request = store.get(id);\n request.onsuccess = () => resolve(request.result ?? null);\n request.onerror = () => reject(request.error);\n });\n}\n\n/**\n * Write (put) multiple items into an IndexedDB object store.\n */\nexport function idbPut<T>(store: IDBObjectStore, items: T[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = store.transaction;\n for (const item of items) {\n store.put(item);\n }\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/**\n * Delete multiple items by key from an IndexedDB object store.\n */\nexport function idbDelete(store: IDBObjectStore, ids: IDBValidKey[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = store.transaction;\n for (const id of ids) {\n store.delete(id);\n }\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/**\n * Clear all items from an IndexedDB object store.\n */\nexport function idbClear(store: IDBObjectStore): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = store.transaction;\n store.clear();\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/** Close all cached connections and delete all known databases. Used in test cleanup. */\nexport function closeAllConnections(): void {\n for (const db of _connections.values()) {\n db.close();\n }\n _connections.clear();\n _stores.clear();\n _openQueue = Promise.resolve();\n}\n\n/** Delete a database by name. Returns a promise that resolves when deleted. */\nexport function deleteDatabase(dbName: string): Promise<void> {\n const existing = _connections.get(dbName);\n existing?.close();\n _connections.delete(dbName);\n _stores.delete(dbName);\n\n return new Promise((resolve, reject) => {\n const request = indexedDB.deleteDatabase(dbName);\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n}\n"],"mappings":"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"}
package/dist/web/idb.js CHANGED
@@ -1,121 +1,124 @@
1
- const _connections = /* @__PURE__ */ new Map();
2
- const _stores = /* @__PURE__ */ new Map();
3
- let _openQueue = Promise.resolve();
1
+ //#region src/web/idb.ts
2
+ /**
3
+ * Shared IndexedDB connection manager.
4
+ * Deduplicates indexedDB.open() calls and handles dynamic object store creation
5
+ * by bumping the DB version when a new storageKey is encountered.
6
+ */
7
+ var _connections = /* @__PURE__ */ new Map();
8
+ var _stores = /* @__PURE__ */ new Map();
9
+ var _openQueue = Promise.resolve();
4
10
  function openDB(dbName, storeName) {
5
- const existing = _connections.get(dbName);
6
- if (existing) {
7
- if (existing.objectStoreNames.contains(storeName)) {
8
- return Promise.resolve(existing);
9
- }
10
- existing.close();
11
- _connections.delete(dbName);
12
- }
13
- let stores = _stores.get(dbName);
14
- if (!stores) {
15
- stores = /* @__PURE__ */ new Set();
16
- _stores.set(dbName, stores);
17
- }
18
- stores.add(storeName);
19
- const result = _openQueue.then(() => doOpen(dbName, stores));
20
- _openQueue = result.then(() => {
21
- }, () => {
22
- });
23
- return result;
11
+ const existing = _connections.get(dbName);
12
+ if (existing) {
13
+ if (existing.objectStoreNames.contains(storeName)) return Promise.resolve(existing);
14
+ existing.close();
15
+ _connections.delete(dbName);
16
+ }
17
+ let stores = _stores.get(dbName);
18
+ if (!stores) {
19
+ stores = /* @__PURE__ */ new Set();
20
+ _stores.set(dbName, stores);
21
+ }
22
+ stores.add(storeName);
23
+ const result = _openQueue.then(() => doOpen(dbName, stores));
24
+ _openQueue = result.then(() => {}, () => {});
25
+ return result;
24
26
  }
25
27
  function doOpen(dbName, stores) {
26
- const existingDb = _connections.get(dbName);
27
- existingDb?.close();
28
- _connections.delete(dbName);
29
- return new Promise((resolve, reject) => {
30
- const probe = indexedDB.open(dbName);
31
- probe.onsuccess = () => {
32
- const db = probe.result;
33
- const version = db.version;
34
- let needsUpgrade = false;
35
- for (const name of stores) {
36
- if (!db.objectStoreNames.contains(name)) {
37
- needsUpgrade = true;
38
- break;
39
- }
40
- }
41
- if (!needsUpgrade) {
42
- _connections.set(dbName, db);
43
- resolve(db);
44
- return;
45
- }
46
- db.close();
47
- const upgrade = indexedDB.open(dbName, version + 1);
48
- upgrade.onupgradeneeded = () => {
49
- const udb = upgrade.result;
50
- for (const name of stores) {
51
- if (!udb.objectStoreNames.contains(name)) {
52
- udb.createObjectStore(name, { keyPath: "id" });
53
- }
54
- }
55
- };
56
- upgrade.onsuccess = () => {
57
- _connections.set(dbName, upgrade.result);
58
- resolve(upgrade.result);
59
- };
60
- upgrade.onerror = () => reject(upgrade.error);
61
- };
62
- probe.onerror = () => reject(probe.error);
63
- });
28
+ _connections.get(dbName)?.close();
29
+ _connections.delete(dbName);
30
+ return new Promise((resolve, reject) => {
31
+ const probe = indexedDB.open(dbName);
32
+ probe.onsuccess = () => {
33
+ const db = probe.result;
34
+ const version = db.version;
35
+ let needsUpgrade = false;
36
+ for (const name of stores) if (!db.objectStoreNames.contains(name)) {
37
+ needsUpgrade = true;
38
+ break;
39
+ }
40
+ if (!needsUpgrade) {
41
+ _connections.set(dbName, db);
42
+ resolve(db);
43
+ return;
44
+ }
45
+ db.close();
46
+ const upgrade = indexedDB.open(dbName, version + 1);
47
+ upgrade.onupgradeneeded = () => {
48
+ const udb = upgrade.result;
49
+ for (const name of stores) if (!udb.objectStoreNames.contains(name)) udb.createObjectStore(name, { keyPath: "id" });
50
+ };
51
+ upgrade.onsuccess = () => {
52
+ _connections.set(dbName, upgrade.result);
53
+ resolve(upgrade.result);
54
+ };
55
+ upgrade.onerror = () => reject(upgrade.error);
56
+ };
57
+ probe.onerror = () => reject(probe.error);
58
+ });
64
59
  }
60
+ /**
61
+ * Open a transaction and return the object store for the given database and store name.
62
+ */
65
63
  function getStore(dbName, storeName, mode) {
66
- return openDB(dbName, storeName).then((db) => {
67
- const tx = db.transaction(storeName, mode);
68
- return tx.objectStore(storeName);
69
- });
64
+ return openDB(dbName, storeName).then((db) => {
65
+ return db.transaction(storeName, mode).objectStore(storeName);
66
+ });
70
67
  }
68
+ /**
69
+ * Retrieve all items from an IndexedDB object store.
70
+ */
71
71
  function idbGetAll(store) {
72
- return new Promise((resolve, reject) => {
73
- const request = store.getAll();
74
- request.onsuccess = () => resolve(request.result);
75
- request.onerror = () => reject(request.error);
76
- });
72
+ return new Promise((resolve, reject) => {
73
+ const request = store.getAll();
74
+ request.onsuccess = () => resolve(request.result);
75
+ request.onerror = () => reject(request.error);
76
+ });
77
77
  }
78
+ /**
79
+ * Retrieve a single item by key from an IndexedDB object store.
80
+ */
78
81
  function idbGet(store, id) {
79
- return new Promise((resolve, reject) => {
80
- const request = store.get(id);
81
- request.onsuccess = () => resolve(request.result ?? null);
82
- request.onerror = () => reject(request.error);
83
- });
82
+ return new Promise((resolve, reject) => {
83
+ const request = store.get(id);
84
+ request.onsuccess = () => resolve(request.result ?? null);
85
+ request.onerror = () => reject(request.error);
86
+ });
84
87
  }
88
+ /**
89
+ * Write (put) multiple items into an IndexedDB object store.
90
+ */
85
91
  function idbPut(store, items) {
86
- return new Promise((resolve, reject) => {
87
- const tx = store.transaction;
88
- for (const item of items) {
89
- store.put(item);
90
- }
91
- tx.oncomplete = () => resolve();
92
- tx.onerror = () => reject(tx.error);
93
- });
92
+ return new Promise((resolve, reject) => {
93
+ const tx = store.transaction;
94
+ for (const item of items) store.put(item);
95
+ tx.oncomplete = () => resolve();
96
+ tx.onerror = () => reject(tx.error);
97
+ });
94
98
  }
99
+ /**
100
+ * Delete multiple items by key from an IndexedDB object store.
101
+ */
95
102
  function idbDelete(store, ids) {
96
- return new Promise((resolve, reject) => {
97
- const tx = store.transaction;
98
- for (const id of ids) {
99
- store.delete(id);
100
- }
101
- tx.oncomplete = () => resolve();
102
- tx.onerror = () => reject(tx.error);
103
- });
103
+ return new Promise((resolve, reject) => {
104
+ const tx = store.transaction;
105
+ for (const id of ids) store.delete(id);
106
+ tx.oncomplete = () => resolve();
107
+ tx.onerror = () => reject(tx.error);
108
+ });
104
109
  }
110
+ /**
111
+ * Clear all items from an IndexedDB object store.
112
+ */
105
113
  function idbClear(store) {
106
- return new Promise((resolve, reject) => {
107
- const tx = store.transaction;
108
- store.clear();
109
- tx.oncomplete = () => resolve();
110
- tx.onerror = () => reject(tx.error);
111
- });
114
+ return new Promise((resolve, reject) => {
115
+ const tx = store.transaction;
116
+ store.clear();
117
+ tx.oncomplete = () => resolve();
118
+ tx.onerror = () => reject(tx.error);
119
+ });
112
120
  }
113
- export {
114
- getStore,
115
- idbClear,
116
- idbDelete,
117
- idbGet,
118
- idbGetAll,
119
- idbPut
120
- };
121
- //# sourceMappingURL=idb.js.map
121
+ //#endregion
122
+ export { getStore, idbClear, idbDelete, idbGet, idbGetAll, idbPut };
123
+
124
+ //# sourceMappingURL=idb.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"idb.js","sources":["../../src/web/idb.ts"],"sourcesContent":["/**\n * Shared IndexedDB connection manager.\n * Deduplicates indexedDB.open() calls and handles dynamic object store creation\n * by bumping the DB version when a new storageKey is encountered.\n */\n\nconst _connections = new Map<string, IDBDatabase>();\nconst _stores = new Map<string, Set<string>>(); // dbName → known store names\nlet _openQueue: Promise<void> = Promise.resolve(); // Sequential open queue\n\nfunction openDB(dbName: string, storeName: string): Promise<IDBDatabase> {\n // If we already have a connection with the required store, reuse it\n const existing = _connections.get(dbName);\n if (existing) {\n if (existing.objectStoreNames.contains(storeName)) {\n return Promise.resolve(existing);\n }\n // Need to add a new store — close and reopen with bumped version\n existing.close();\n _connections.delete(dbName);\n }\n\n // Track known stores\n let stores = _stores.get(dbName);\n if (!stores) {\n stores = new Set();\n _stores.set(dbName, stores);\n }\n stores.add(storeName);\n\n // Serialize opens to prevent version conflicts\n const result = _openQueue.then(() => doOpen(dbName, stores!));\n _openQueue = result.then(() => {}, () => {}); // Absorb errors for the queue\n return result;\n}\n\nfunction doOpen(dbName: string, stores: Set<string>): Promise<IDBDatabase> {\n // Close existing cached connection if any (may have been opened by queued op)\n const existingDb = _connections.get(dbName);\n existingDb?.close();\n _connections.delete(dbName);\n\n // Probe current DB version (version-less open never triggers upgrade)\n return new Promise<IDBDatabase>((resolve, reject) => {\n const probe = indexedDB.open(dbName);\n probe.onsuccess = () => {\n const db = probe.result;\n const version = db.version;\n\n // Check if all required stores already exist\n let needsUpgrade = false;\n for (const name of stores) {\n if (!db.objectStoreNames.contains(name)) {\n needsUpgrade = true;\n break;\n }\n }\n\n if (!needsUpgrade) {\n _connections.set(dbName, db);\n resolve(db);\n return;\n }\n\n // Need new stores — close and reopen with bumped version\n db.close();\n const upgrade = indexedDB.open(dbName, version + 1);\n upgrade.onupgradeneeded = () => {\n const udb = upgrade.result;\n for (const name of stores) {\n if (!udb.objectStoreNames.contains(name)) {\n udb.createObjectStore(name, { keyPath: 'id' });\n }\n }\n };\n upgrade.onsuccess = () => {\n _connections.set(dbName, upgrade.result);\n resolve(upgrade.result);\n };\n upgrade.onerror = () => reject(upgrade.error);\n };\n probe.onerror = () => reject(probe.error);\n });\n}\n\n/**\n * Open a transaction and return the object store for the given database and store name.\n */\nexport function getStore(\n dbName: string,\n storeName: string,\n mode: IDBTransactionMode,\n): Promise<IDBObjectStore> {\n return openDB(dbName, storeName).then((db) => {\n const tx = db.transaction(storeName, mode);\n return tx.objectStore(storeName);\n });\n}\n\n/**\n * Retrieve all items from an IndexedDB object store.\n */\nexport function idbGetAll<T>(store: IDBObjectStore): Promise<T[]> {\n return new Promise((resolve, reject) => {\n const request = store.getAll();\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n}\n\n/**\n * Retrieve a single item by key from an IndexedDB object store.\n */\nexport function idbGet<T>(store: IDBObjectStore, id: IDBValidKey): Promise<T | null> {\n return new Promise((resolve, reject) => {\n const request = store.get(id);\n request.onsuccess = () => resolve(request.result ?? null);\n request.onerror = () => reject(request.error);\n });\n}\n\n/**\n * Write (put) multiple items into an IndexedDB object store.\n */\nexport function idbPut<T>(store: IDBObjectStore, items: T[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = store.transaction;\n for (const item of items) {\n store.put(item);\n }\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/**\n * Delete multiple items by key from an IndexedDB object store.\n */\nexport function idbDelete(store: IDBObjectStore, ids: IDBValidKey[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = store.transaction;\n for (const id of ids) {\n store.delete(id);\n }\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/**\n * Clear all items from an IndexedDB object store.\n */\nexport function idbClear(store: IDBObjectStore): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = store.transaction;\n store.clear();\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/** Close all cached connections and delete all known databases. Used in test cleanup. */\nexport function closeAllConnections(): void {\n for (const db of _connections.values()) {\n db.close();\n }\n _connections.clear();\n _stores.clear();\n _openQueue = Promise.resolve();\n}\n\n/** Delete a database by name. Returns a promise that resolves when deleted. */\nexport function deleteDatabase(dbName: string): Promise<void> {\n const existing = _connections.get(dbName);\n existing?.close();\n _connections.delete(dbName);\n _stores.delete(dbName);\n\n return new Promise((resolve, reject) => {\n const request = indexedDB.deleteDatabase(dbName);\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"idb.js","names":[],"sources":["../../src/web/idb.ts"],"sourcesContent":["/**\n * Shared IndexedDB connection manager.\n * Deduplicates indexedDB.open() calls and handles dynamic object store creation\n * by bumping the DB version when a new storageKey is encountered.\n */\n\nconst _connections = new Map<string, IDBDatabase>();\nconst _stores = new Map<string, Set<string>>(); // dbName → known store names\nlet _openQueue: Promise<void> = Promise.resolve(); // Sequential open queue\n\nfunction openDB(dbName: string, storeName: string): Promise<IDBDatabase> {\n // If we already have a connection with the required store, reuse it\n const existing = _connections.get(dbName);\n if (existing) {\n if (existing.objectStoreNames.contains(storeName)) {\n return Promise.resolve(existing);\n }\n // Need to add a new store — close and reopen with bumped version\n existing.close();\n _connections.delete(dbName);\n }\n\n // Track known stores\n let stores = _stores.get(dbName);\n if (!stores) {\n stores = new Set();\n _stores.set(dbName, stores);\n }\n stores.add(storeName);\n\n // Serialize opens to prevent version conflicts\n const result = _openQueue.then(() => doOpen(dbName, stores!));\n _openQueue = result.then(() => {}, () => {}); // Absorb errors for the queue\n return result;\n}\n\nfunction doOpen(dbName: string, stores: Set<string>): Promise<IDBDatabase> {\n // Close existing cached connection if any (may have been opened by queued op)\n const existingDb = _connections.get(dbName);\n existingDb?.close();\n _connections.delete(dbName);\n\n // Probe current DB version (version-less open never triggers upgrade)\n return new Promise<IDBDatabase>((resolve, reject) => {\n const probe = indexedDB.open(dbName);\n probe.onsuccess = () => {\n const db = probe.result;\n const version = db.version;\n\n // Check if all required stores already exist\n let needsUpgrade = false;\n for (const name of stores) {\n if (!db.objectStoreNames.contains(name)) {\n needsUpgrade = true;\n break;\n }\n }\n\n if (!needsUpgrade) {\n _connections.set(dbName, db);\n resolve(db);\n return;\n }\n\n // Need new stores — close and reopen with bumped version\n db.close();\n const upgrade = indexedDB.open(dbName, version + 1);\n upgrade.onupgradeneeded = () => {\n const udb = upgrade.result;\n for (const name of stores) {\n if (!udb.objectStoreNames.contains(name)) {\n udb.createObjectStore(name, { keyPath: 'id' });\n }\n }\n };\n upgrade.onsuccess = () => {\n _connections.set(dbName, upgrade.result);\n resolve(upgrade.result);\n };\n upgrade.onerror = () => reject(upgrade.error);\n };\n probe.onerror = () => reject(probe.error);\n });\n}\n\n/**\n * Open a transaction and return the object store for the given database and store name.\n */\nexport function getStore(\n dbName: string,\n storeName: string,\n mode: IDBTransactionMode,\n): Promise<IDBObjectStore> {\n return openDB(dbName, storeName).then((db) => {\n const tx = db.transaction(storeName, mode);\n return tx.objectStore(storeName);\n });\n}\n\n/**\n * Retrieve all items from an IndexedDB object store.\n */\nexport function idbGetAll<T>(store: IDBObjectStore): Promise<T[]> {\n return new Promise((resolve, reject) => {\n const request = store.getAll();\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n}\n\n/**\n * Retrieve a single item by key from an IndexedDB object store.\n */\nexport function idbGet<T>(store: IDBObjectStore, id: IDBValidKey): Promise<T | null> {\n return new Promise((resolve, reject) => {\n const request = store.get(id);\n request.onsuccess = () => resolve(request.result ?? null);\n request.onerror = () => reject(request.error);\n });\n}\n\n/**\n * Write (put) multiple items into an IndexedDB object store.\n */\nexport function idbPut<T>(store: IDBObjectStore, items: T[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = store.transaction;\n for (const item of items) {\n store.put(item);\n }\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/**\n * Delete multiple items by key from an IndexedDB object store.\n */\nexport function idbDelete(store: IDBObjectStore, ids: IDBValidKey[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = store.transaction;\n for (const id of ids) {\n store.delete(id);\n }\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/**\n * Clear all items from an IndexedDB object store.\n */\nexport function idbClear(store: IDBObjectStore): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = store.transaction;\n store.clear();\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n/** Close all cached connections and delete all known databases. Used in test cleanup. */\nexport function closeAllConnections(): void {\n for (const db of _connections.values()) {\n db.close();\n }\n _connections.clear();\n _stores.clear();\n _openQueue = Promise.resolve();\n}\n\n/** Delete a database by name. Returns a promise that resolves when deleted. */\nexport function deleteDatabase(dbName: string): Promise<void> {\n const existing = _connections.get(dbName);\n existing?.close();\n _connections.delete(dbName);\n _stores.delete(dbName);\n\n return new Promise((resolve, reject) => {\n const request = indexedDB.deleteDatabase(dbName);\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n}\n"],"mappings":"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"}
package/dist/web.cjs CHANGED
@@ -1,7 +1,5 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const WebStorageCollection = require("./web/WebStorageCollection.cjs");
4
- const IndexedDBCollection = require("./web/IndexedDBCollection.cjs");
5
- exports.WebStorageCollection = WebStorageCollection.WebStorageCollection;
6
- exports.IndexedDBCollection = IndexedDBCollection.IndexedDBCollection;
7
- //# sourceMappingURL=web.cjs.map
2
+ const require_WebStorageCollection = require("./web/WebStorageCollection.cjs");
3
+ const require_IndexedDBCollection = require("./web/IndexedDBCollection.cjs");
4
+ exports.IndexedDBCollection = require_IndexedDBCollection.IndexedDBCollection;
5
+ exports.WebStorageCollection = require_WebStorageCollection.WebStorageCollection;
package/dist/web.js CHANGED
@@ -1,7 +1,3 @@
1
1
  import { WebStorageCollection } from "./web/WebStorageCollection.js";
2
2
  import { IndexedDBCollection } from "./web/IndexedDBCollection.js";
3
- export {
4
- IndexedDBCollection,
5
- WebStorageCollection
6
- };
7
- //# sourceMappingURL=web.js.map
3
+ export { IndexedDBCollection, WebStorageCollection };