@donotdev/crud 0.0.8 → 0.0.10

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 (370) hide show
  1. package/dist/CrudService.d.ts +30 -60
  2. package/dist/CrudService.d.ts.map +1 -1
  3. package/dist/CrudService.js +1 -1
  4. package/dist/CrudStore.d.ts +1 -94
  5. package/dist/CrudStore.d.ts.map +1 -1
  6. package/dist/CrudStore.js +1 -1
  7. package/dist/FieldRegistry.js +1 -1
  8. package/dist/adapters/FirestoreAdapter.d.ts +3 -1
  9. package/dist/adapters/FirestoreAdapter.d.ts.map +1 -1
  10. package/dist/adapters/FirestoreAdapter.js +1 -1
  11. package/dist/adapters/FunctionsAdapter.d.ts +8 -1
  12. package/dist/adapters/FunctionsAdapter.d.ts.map +1 -1
  13. package/dist/adapters/FunctionsAdapter.js +1 -1
  14. package/dist/adapters/index.js +1 -1
  15. package/dist/builtinFieldTypes.d.ts +17 -4
  16. package/dist/builtinFieldTypes.d.ts.map +1 -1
  17. package/dist/builtinFieldTypes.js +1 -1
  18. package/dist/components/CrudButton.js +1 -1
  19. package/dist/components/DisplayFieldRenderer.d.ts +2 -0
  20. package/dist/components/DisplayFieldRenderer.d.ts.map +1 -1
  21. package/dist/components/DisplayFieldRenderer.js +1 -1
  22. package/dist/components/EntityDisplayRenderer.d.ts +3 -3
  23. package/dist/components/EntityDisplayRenderer.d.ts.map +1 -1
  24. package/dist/components/EntityDisplayRenderer.js +1 -1
  25. package/dist/components/EntityFilters.d.ts +61 -0
  26. package/dist/components/EntityFilters.d.ts.map +1 -0
  27. package/dist/components/EntityFilters.js +1 -0
  28. package/dist/components/EntityFormRenderer.d.ts +22 -1
  29. package/dist/components/EntityFormRenderer.d.ts.map +1 -1
  30. package/dist/components/EntityFormRenderer.js +1 -1
  31. package/dist/components/FormFieldRenderer.d.ts.map +1 -1
  32. package/dist/components/FormFieldRenderer.js +1 -1
  33. package/dist/components/FormLayout.js +1 -1
  34. package/dist/components/controlled/complex/ControlledAddressField.d.ts +3 -0
  35. package/dist/components/controlled/complex/ControlledAddressField.d.ts.map +1 -1
  36. package/dist/components/controlled/complex/ControlledAddressField.js +1 -1
  37. package/dist/components/controlled/complex/ControlledDateField.d.ts +3 -0
  38. package/dist/components/controlled/complex/ControlledDateField.d.ts.map +1 -1
  39. package/dist/components/controlled/complex/ControlledDateField.js +1 -1
  40. package/dist/components/controlled/complex/ControlledGeoPointField.d.ts +3 -0
  41. package/dist/components/controlled/complex/ControlledGeoPointField.d.ts.map +1 -1
  42. package/dist/components/controlled/complex/ControlledGeoPointField.js +1 -1
  43. package/dist/components/controlled/complex/ControlledMapField.d.ts +3 -0
  44. package/dist/components/controlled/complex/ControlledMapField.d.ts.map +1 -1
  45. package/dist/components/controlled/complex/ControlledMapField.js +1 -1
  46. package/dist/components/controlled/complex/ControlledMultiInputField.d.ts +3 -0
  47. package/dist/components/controlled/complex/ControlledMultiInputField.d.ts.map +1 -1
  48. package/dist/components/controlled/complex/ControlledMultiInputField.js +1 -1
  49. package/dist/components/controlled/complex/ControlledRichTextField.d.ts +3 -0
  50. package/dist/components/controlled/complex/ControlledRichTextField.d.ts.map +1 -1
  51. package/dist/components/controlled/complex/ControlledRichTextField.js +1 -1
  52. package/dist/components/controlled/complex/ControlledTimestampField.d.ts +3 -0
  53. package/dist/components/controlled/complex/ControlledTimestampField.d.ts.map +1 -1
  54. package/dist/components/controlled/complex/ControlledTimestampField.js +1 -1
  55. package/dist/components/controlled/complex/index.d.ts.map +1 -1
  56. package/dist/components/controlled/complex/index.js +1 -1
  57. package/dist/components/controlled/file/ControlledDocumentField.d.ts +3 -0
  58. package/dist/components/controlled/file/ControlledDocumentField.d.ts.map +1 -1
  59. package/dist/components/controlled/file/ControlledDocumentField.js +1 -1
  60. package/dist/components/controlled/file/ControlledFileField.d.ts +3 -0
  61. package/dist/components/controlled/file/ControlledFileField.d.ts.map +1 -1
  62. package/dist/components/controlled/file/ControlledFileField.js +1 -1
  63. package/dist/components/controlled/file/ControlledImageField.d.ts +3 -0
  64. package/dist/components/controlled/file/ControlledImageField.d.ts.map +1 -1
  65. package/dist/components/controlled/file/ControlledImageField.js +1 -1
  66. package/dist/components/controlled/file/ControlledMultiDocumentField.d.ts +3 -0
  67. package/dist/components/controlled/file/ControlledMultiDocumentField.d.ts.map +1 -1
  68. package/dist/components/controlled/file/ControlledMultiDocumentField.js +1 -1
  69. package/dist/components/controlled/file/ControlledMultiFileField.d.ts +3 -0
  70. package/dist/components/controlled/file/ControlledMultiFileField.d.ts.map +1 -1
  71. package/dist/components/controlled/file/ControlledMultiFileField.js +1 -1
  72. package/dist/components/controlled/file/ControlledMultiImageField.d.ts +3 -0
  73. package/dist/components/controlled/file/ControlledMultiImageField.d.ts.map +1 -1
  74. package/dist/components/controlled/file/ControlledMultiImageField.js +1 -1
  75. package/dist/components/controlled/file/index.d.ts.map +1 -1
  76. package/dist/components/controlled/file/index.js +1 -1
  77. package/dist/components/controlled/index.d.ts +4 -0
  78. package/dist/components/controlled/index.d.ts.map +1 -1
  79. package/dist/components/controlled/index.js +1 -1
  80. package/dist/components/controlled/input/ControlledCheckboxField.d.ts +3 -0
  81. package/dist/components/controlled/input/ControlledCheckboxField.d.ts.map +1 -1
  82. package/dist/components/controlled/input/ControlledCheckboxField.js +1 -1
  83. package/dist/components/controlled/input/ControlledCurrencyField.d.ts +8 -0
  84. package/dist/components/controlled/input/ControlledCurrencyField.d.ts.map +1 -0
  85. package/dist/components/controlled/input/ControlledCurrencyField.js +1 -0
  86. package/dist/components/controlled/input/ControlledGdprConsentField.d.ts +8 -0
  87. package/dist/components/controlled/input/ControlledGdprConsentField.d.ts.map +1 -0
  88. package/dist/components/controlled/input/ControlledGdprConsentField.js +1 -0
  89. package/dist/components/controlled/input/ControlledNumberField.d.ts +3 -0
  90. package/dist/components/controlled/input/ControlledNumberField.d.ts.map +1 -1
  91. package/dist/components/controlled/input/ControlledNumberField.js +1 -1
  92. package/dist/components/controlled/input/ControlledPasswordField.d.ts +3 -0
  93. package/dist/components/controlled/input/ControlledPasswordField.d.ts.map +1 -1
  94. package/dist/components/controlled/input/ControlledPasswordField.js +1 -1
  95. package/dist/components/controlled/input/ControlledPhoneField.d.ts +3 -0
  96. package/dist/components/controlled/input/ControlledPhoneField.d.ts.map +1 -1
  97. package/dist/components/controlled/input/ControlledPhoneField.js +1 -1
  98. package/dist/components/controlled/input/ControlledPriceField.d.ts +8 -0
  99. package/dist/components/controlled/input/ControlledPriceField.d.ts.map +1 -0
  100. package/dist/components/controlled/input/ControlledPriceField.js +1 -0
  101. package/dist/components/controlled/input/ControlledRangeField.d.ts +3 -0
  102. package/dist/components/controlled/input/ControlledRangeField.d.ts.map +1 -1
  103. package/dist/components/controlled/input/ControlledRangeField.js +1 -1
  104. package/dist/components/controlled/input/ControlledRatingField.d.ts +8 -0
  105. package/dist/components/controlled/input/ControlledRatingField.d.ts.map +1 -0
  106. package/dist/components/controlled/input/ControlledRatingField.js +1 -0
  107. package/dist/components/controlled/input/ControlledSwitchField.d.ts +3 -0
  108. package/dist/components/controlled/input/ControlledSwitchField.d.ts.map +1 -1
  109. package/dist/components/controlled/input/ControlledSwitchField.js +1 -1
  110. package/dist/components/controlled/input/ControlledTextField.d.ts +3 -0
  111. package/dist/components/controlled/input/ControlledTextField.d.ts.map +1 -1
  112. package/dist/components/controlled/input/ControlledTextField.js +1 -1
  113. package/dist/components/controlled/input/ControlledTextareaField.d.ts +3 -0
  114. package/dist/components/controlled/input/ControlledTextareaField.d.ts.map +1 -1
  115. package/dist/components/controlled/input/ControlledTextareaField.js +1 -1
  116. package/dist/components/controlled/input/index.d.ts +4 -0
  117. package/dist/components/controlled/input/index.d.ts.map +1 -1
  118. package/dist/components/controlled/input/index.js +1 -1
  119. package/dist/components/controlled/select/ControlledComboboxField.d.ts +4 -0
  120. package/dist/components/controlled/select/ControlledComboboxField.d.ts.map +1 -1
  121. package/dist/components/controlled/select/ControlledComboboxField.js +1 -1
  122. package/dist/components/controlled/select/ControlledDropdownField.d.ts +4 -0
  123. package/dist/components/controlled/select/ControlledDropdownField.d.ts.map +1 -1
  124. package/dist/components/controlled/select/ControlledDropdownField.js +1 -1
  125. package/dist/components/controlled/select/ControlledMultiDropdownField.d.ts +4 -0
  126. package/dist/components/controlled/select/ControlledMultiDropdownField.d.ts.map +1 -1
  127. package/dist/components/controlled/select/ControlledMultiDropdownField.js +1 -1
  128. package/dist/components/controlled/select/ControlledRadioField.d.ts +4 -0
  129. package/dist/components/controlled/select/ControlledRadioField.d.ts.map +1 -1
  130. package/dist/components/controlled/select/ControlledRadioField.js +1 -1
  131. package/dist/components/controlled/select/ControlledYearField.d.ts +9 -0
  132. package/dist/components/controlled/select/ControlledYearField.d.ts.map +1 -0
  133. package/dist/components/controlled/select/ControlledYearField.js +1 -0
  134. package/dist/components/controlled/select/index.d.ts +1 -0
  135. package/dist/components/controlled/select/index.d.ts.map +1 -1
  136. package/dist/components/controlled/select/index.js +1 -1
  137. package/dist/components/controlled/types.d.ts +6 -0
  138. package/dist/components/controlled/types.d.ts.map +1 -1
  139. package/dist/components/controlled/types.js +1 -1
  140. package/dist/components/fields/display/AvatarFieldDisplay.d.ts +23 -0
  141. package/dist/components/fields/display/AvatarFieldDisplay.d.ts.map +1 -0
  142. package/dist/components/fields/display/AvatarFieldDisplay.js +1 -0
  143. package/dist/components/fields/display/BadgeFieldDisplay.d.ts +21 -0
  144. package/dist/components/fields/display/BadgeFieldDisplay.d.ts.map +1 -0
  145. package/dist/components/fields/display/BadgeFieldDisplay.js +1 -0
  146. package/dist/components/fields/display/ButtonFieldDisplay.d.ts +29 -0
  147. package/dist/components/fields/display/ButtonFieldDisplay.d.ts.map +1 -0
  148. package/dist/components/fields/display/ButtonFieldDisplay.js +1 -0
  149. package/dist/components/fields/display/CheckboxFieldDisplay.d.ts +21 -0
  150. package/dist/components/fields/display/CheckboxFieldDisplay.d.ts.map +1 -0
  151. package/dist/components/fields/display/CheckboxFieldDisplay.js +1 -0
  152. package/dist/components/fields/display/DateFieldDisplay.d.ts +24 -0
  153. package/dist/components/fields/display/DateFieldDisplay.d.ts.map +1 -0
  154. package/dist/components/fields/display/DateFieldDisplay.js +1 -0
  155. package/dist/components/fields/display/DropdownDisplay.d.ts +21 -0
  156. package/dist/components/fields/display/DropdownDisplay.d.ts.map +1 -0
  157. package/dist/components/fields/display/DropdownDisplay.js +1 -0
  158. package/dist/components/fields/display/FileFieldDisplay.d.ts +21 -0
  159. package/dist/components/fields/display/FileFieldDisplay.d.ts.map +1 -0
  160. package/dist/components/fields/display/FileFieldDisplay.js +1 -0
  161. package/dist/components/fields/display/GeoPointFieldDisplay.d.ts +25 -0
  162. package/dist/components/fields/display/GeoPointFieldDisplay.d.ts.map +1 -0
  163. package/dist/components/fields/display/GeoPointFieldDisplay.js +1 -0
  164. package/dist/components/fields/display/HiddenFieldDisplay.d.ts +30 -0
  165. package/dist/components/fields/display/HiddenFieldDisplay.d.ts.map +1 -0
  166. package/dist/components/fields/display/HiddenFieldDisplay.js +1 -0
  167. package/dist/components/fields/display/ImageFieldDisplay.d.ts +24 -0
  168. package/dist/components/fields/display/ImageFieldDisplay.d.ts.map +1 -0
  169. package/dist/components/fields/display/ImageFieldDisplay.js +1 -0
  170. package/dist/components/fields/display/LinkFieldDisplay.d.ts +22 -0
  171. package/dist/components/fields/display/LinkFieldDisplay.d.ts.map +1 -0
  172. package/dist/components/fields/display/LinkFieldDisplay.js +1 -0
  173. package/dist/components/fields/display/MapFieldDisplay.d.ts +25 -0
  174. package/dist/components/fields/display/MapFieldDisplay.d.ts.map +1 -0
  175. package/dist/components/fields/display/MapFieldDisplay.js +1 -0
  176. package/dist/components/fields/display/MultiDropdownDisplay.d.ts +22 -0
  177. package/dist/components/fields/display/MultiDropdownDisplay.d.ts.map +1 -0
  178. package/dist/components/fields/display/MultiDropdownDisplay.js +1 -0
  179. package/dist/components/fields/display/MultiInputTextFieldDisplay.d.ts +22 -0
  180. package/dist/components/fields/display/MultiInputTextFieldDisplay.d.ts.map +1 -0
  181. package/dist/components/fields/display/MultiInputTextFieldDisplay.js +1 -0
  182. package/dist/components/fields/display/NumberFieldDisplay.d.ts +24 -0
  183. package/dist/components/fields/display/NumberFieldDisplay.d.ts.map +1 -0
  184. package/dist/components/fields/display/NumberFieldDisplay.js +1 -0
  185. package/dist/components/fields/display/PasswordFieldDisplay.d.ts +24 -0
  186. package/dist/components/fields/display/PasswordFieldDisplay.d.ts.map +1 -0
  187. package/dist/components/fields/display/PasswordFieldDisplay.js +1 -0
  188. package/dist/components/fields/display/PhoneNumberDisplay.d.ts +22 -0
  189. package/dist/components/fields/display/PhoneNumberDisplay.d.ts.map +1 -0
  190. package/dist/components/fields/display/PhoneNumberDisplay.js +1 -0
  191. package/dist/components/fields/display/RadioFieldDisplay.d.ts +22 -0
  192. package/dist/components/fields/display/RadioFieldDisplay.d.ts.map +1 -0
  193. package/dist/components/fields/display/RadioFieldDisplay.js +1 -0
  194. package/dist/components/fields/display/RangeFieldDisplay.d.ts +22 -0
  195. package/dist/components/fields/display/RangeFieldDisplay.d.ts.map +1 -0
  196. package/dist/components/fields/display/RangeFieldDisplay.js +1 -0
  197. package/dist/components/fields/display/ReferenceFieldDisplay.d.ts +22 -0
  198. package/dist/components/fields/display/ReferenceFieldDisplay.d.ts.map +1 -0
  199. package/dist/components/fields/display/ReferenceFieldDisplay.js +1 -0
  200. package/dist/components/fields/display/RichTextDisplay.d.ts +25 -0
  201. package/dist/components/fields/display/RichTextDisplay.d.ts.map +1 -0
  202. package/dist/components/fields/display/RichTextDisplay.js +61 -0
  203. package/dist/components/fields/display/TextAreaDisplay.d.ts +22 -0
  204. package/dist/components/fields/display/TextAreaDisplay.d.ts.map +1 -0
  205. package/dist/components/fields/display/TextAreaDisplay.js +1 -0
  206. package/dist/components/fields/display/TextFieldDisplay.d.ts +42 -0
  207. package/dist/components/fields/display/TextFieldDisplay.d.ts.map +1 -0
  208. package/dist/components/fields/display/TextFieldDisplay.js +1 -0
  209. package/dist/components/fields/display/TimestampFieldDisplay.d.ts +22 -0
  210. package/dist/components/fields/display/TimestampFieldDisplay.d.ts.map +1 -0
  211. package/dist/components/fields/display/TimestampFieldDisplay.js +1 -0
  212. package/dist/components/fields/display/index.d.ts +32 -0
  213. package/dist/components/fields/display/index.d.ts.map +1 -0
  214. package/dist/components/fields/display/index.js +1 -0
  215. package/dist/components/form/fields/AddressFieldComponent.js +1 -1
  216. package/dist/components/form/fields/AvatarFieldComponent.js +1 -1
  217. package/dist/components/form/fields/BadgeFieldComponent.js +1 -1
  218. package/dist/components/form/fields/ButtonFieldComponent.js +1 -1
  219. package/dist/components/form/fields/CheckboxFieldComponent.d.ts +3 -3
  220. package/dist/components/form/fields/CheckboxFieldComponent.d.ts.map +1 -1
  221. package/dist/components/form/fields/CheckboxFieldComponent.js +1 -1
  222. package/dist/components/form/fields/ComboboxComponent.d.ts +6 -0
  223. package/dist/components/form/fields/ComboboxComponent.d.ts.map +1 -1
  224. package/dist/components/form/fields/ComboboxComponent.js +1 -1
  225. package/dist/components/form/fields/CurrencyFieldComponent.js +1 -1
  226. package/dist/components/form/fields/DateFieldComponent.js +1 -1
  227. package/dist/components/form/fields/DocumentFieldComponent.d.ts.map +1 -1
  228. package/dist/components/form/fields/DocumentFieldComponent.js +1 -1
  229. package/dist/components/form/fields/DropdownComponent.js +1 -1
  230. package/dist/components/form/fields/FileFieldComponent.d.ts.map +1 -1
  231. package/dist/components/form/fields/FileFieldComponent.js +1 -1
  232. package/dist/components/form/fields/GdprConsentFieldComponent.d.ts +26 -0
  233. package/dist/components/form/fields/GdprConsentFieldComponent.d.ts.map +1 -0
  234. package/dist/components/form/fields/GdprConsentFieldComponent.js +1 -0
  235. package/dist/components/form/fields/GeoPointFieldComponent.js +1 -1
  236. package/dist/components/form/fields/HiddenFieldComponent.js +1 -1
  237. package/dist/components/form/fields/ImageFieldComponent.d.ts +3 -2
  238. package/dist/components/form/fields/ImageFieldComponent.d.ts.map +1 -1
  239. package/dist/components/form/fields/ImageFieldComponent.js +1 -1
  240. package/dist/components/form/fields/MapFieldComponent.js +1 -1
  241. package/dist/components/form/fields/MultiDropdownComponent.js +1 -1
  242. package/dist/components/form/fields/MultiInputTextFieldComponent.js +1 -1
  243. package/dist/components/form/fields/NumberFieldComponent.js +1 -1
  244. package/dist/components/form/fields/PasswordFieldComponent.js +1 -1
  245. package/dist/components/form/fields/PhoneNumberComponent.d.ts.map +1 -1
  246. package/dist/components/form/fields/PhoneNumberComponent.js +1 -1
  247. package/dist/components/form/fields/PriceFieldComponent.d.ts +34 -0
  248. package/dist/components/form/fields/PriceFieldComponent.d.ts.map +1 -0
  249. package/dist/components/form/fields/PriceFieldComponent.js +1 -0
  250. package/dist/components/form/fields/RadioFieldComponent.js +1 -1
  251. package/dist/components/form/fields/RangeFieldComponent.js +1 -1
  252. package/dist/components/form/fields/RatingFieldComponent.d.ts +37 -0
  253. package/dist/components/form/fields/RatingFieldComponent.d.ts.map +1 -0
  254. package/dist/components/form/fields/RatingFieldComponent.js +1 -0
  255. package/dist/components/form/fields/ReferenceFieldComponent.js +1 -1
  256. package/dist/components/form/fields/RichTextComponent.d.ts +2 -21
  257. package/dist/components/form/fields/RichTextComponent.d.ts.map +1 -1
  258. package/dist/components/form/fields/RichTextComponent.js +1 -1
  259. package/dist/components/form/fields/SwitchFieldComponent.js +1 -1
  260. package/dist/components/form/fields/TextAreaComponent.d.ts.map +1 -1
  261. package/dist/components/form/fields/TextAreaComponent.js +1 -1
  262. package/dist/components/form/fields/TextFieldComponent.js +1 -1
  263. package/dist/components/form/fields/TimestampFieldComponent.js +1 -1
  264. package/dist/components/form/fields/index.d.ts +7 -1
  265. package/dist/components/form/fields/index.d.ts.map +1 -1
  266. package/dist/components/form/fields/index.js +1 -1
  267. package/dist/components/form/fields/internal/TiptapEditor.d.ts +1 -1
  268. package/dist/components/form/fields/internal/TiptapEditor.d.ts.map +1 -1
  269. package/dist/components/form/fields/internal/TiptapEditor.js +2 -2
  270. package/dist/components/form/fields/types.d.ts +33 -0
  271. package/dist/components/form/fields/types.d.ts.map +1 -0
  272. package/dist/components/form/fields/types.js +0 -0
  273. package/dist/components/form/internal/ImageViewerDialog.d.ts +2 -1
  274. package/dist/components/form/internal/ImageViewerDialog.d.ts.map +1 -1
  275. package/dist/components/form/internal/ImageViewerDialog.js +1 -1
  276. package/dist/components/index.d.ts +4 -8
  277. package/dist/components/index.d.ts.map +1 -1
  278. package/dist/components/index.js +1 -1
  279. package/dist/contexts/UploadContext.d.ts.map +1 -1
  280. package/dist/contexts/UploadContext.js +1 -1
  281. package/dist/contexts/index.js +1 -1
  282. package/dist/fieldTypeRegistry.d.ts +92 -0
  283. package/dist/fieldTypeRegistry.d.ts.map +1 -0
  284. package/dist/fieldTypeRegistry.js +1 -0
  285. package/dist/forms/hooks/index.js +1 -1
  286. package/dist/forms/hooks/useController.js +1 -1
  287. package/dist/forms/hooks/useEntityField.js +1 -1
  288. package/dist/forms/hooks/useEntityForm.d.ts.map +1 -1
  289. package/dist/forms/hooks/useEntityForm.js +1 -1
  290. package/dist/forms/index.d.ts +2 -2
  291. package/dist/forms/index.d.ts.map +1 -1
  292. package/dist/forms/index.js +1 -1
  293. package/dist/forms/types.d.ts +15 -0
  294. package/dist/forms/types.d.ts.map +1 -1
  295. package/dist/forms/utils/getFieldsForOperation.js +1 -1
  296. package/dist/forms/utils/index.d.ts +0 -2
  297. package/dist/forms/utils/index.d.ts.map +1 -1
  298. package/dist/forms/utils/index.js +1 -1
  299. package/dist/forms/utils/isFieldEditable.js +1 -1
  300. package/dist/forms/utils/translateFieldLabel.js +1 -1
  301. package/dist/forms/utils/validateEntity.js +1 -1
  302. package/dist/hooks/index.d.ts +5 -0
  303. package/dist/hooks/index.d.ts.map +1 -1
  304. package/dist/hooks/index.js +1 -1
  305. package/dist/hooks/useEntityFavorites.d.ts +53 -0
  306. package/dist/hooks/useEntityFavorites.d.ts.map +1 -0
  307. package/dist/hooks/useEntityFavorites.js +1 -0
  308. package/dist/hooks/useFileUpload.d.ts.map +1 -1
  309. package/dist/hooks/useFileUpload.js +1 -1
  310. package/dist/hooks/useFormNavigationGuard.d.ts +34 -0
  311. package/dist/hooks/useFormNavigationGuard.d.ts.map +1 -0
  312. package/dist/hooks/useFormNavigationGuard.js +1 -0
  313. package/dist/hooks/useRelatedItems.d.ts +37 -0
  314. package/dist/hooks/useRelatedItems.d.ts.map +1 -0
  315. package/dist/hooks/useRelatedItems.js +1 -0
  316. package/dist/hooks/useUnsavedChangesWarning.d.ts +51 -0
  317. package/dist/hooks/useUnsavedChangesWarning.d.ts.map +1 -0
  318. package/dist/hooks/useUnsavedChangesWarning.js +1 -0
  319. package/dist/index.d.ts +9 -6
  320. package/dist/index.d.ts.map +1 -1
  321. package/dist/index.js +1 -1
  322. package/dist/registerBuiltinFieldTypes.d.ts +6 -0
  323. package/dist/registerBuiltinFieldTypes.d.ts.map +1 -0
  324. package/dist/registerBuiltinFieldTypes.js +1 -0
  325. package/dist/stores/FormStore.d.ts +17 -0
  326. package/dist/stores/FormStore.d.ts.map +1 -1
  327. package/dist/stores/FormStore.js +1 -1
  328. package/dist/stores/UploadStore.js +1 -1
  329. package/dist/stores/index.d.ts +1 -1
  330. package/dist/stores/index.d.ts.map +1 -1
  331. package/dist/stores/index.js +1 -1
  332. package/dist/tsconfig.tsbuildinfo +1 -1
  333. package/dist/types.d.ts +202 -0
  334. package/dist/types.d.ts.map +1 -0
  335. package/dist/types.js +0 -0
  336. package/dist/useBaseCrudList.d.ts +53 -0
  337. package/dist/useBaseCrudList.d.ts.map +1 -0
  338. package/dist/useBaseCrudList.js +1 -0
  339. package/dist/useCrud.d.ts +4 -8
  340. package/dist/useCrud.d.ts.map +1 -1
  341. package/dist/useCrud.js +1 -1
  342. package/dist/useCrudCardList.d.ts +10 -4
  343. package/dist/useCrudCardList.d.ts.map +1 -1
  344. package/dist/useCrudCardList.js +1 -1
  345. package/dist/useCrudList.d.ts +19 -5
  346. package/dist/useCrudList.d.ts.map +1 -1
  347. package/dist/useCrudList.js +1 -1
  348. package/dist/utils/collections.js +1 -1
  349. package/dist/utils/fileStorage.js +1 -1
  350. package/dist/utils/imageProcessing.js +1 -1
  351. package/dist/utils/imageStorage.js +1 -1
  352. package/dist/utils/imageUtils.js +1 -1
  353. package/dist/utils/mergeWithOptimistic.d.ts +5 -6
  354. package/dist/utils/mergeWithOptimistic.d.ts.map +1 -1
  355. package/dist/utils/mergeWithOptimistic.js +1 -1
  356. package/dist/utils/scopeUtils.d.ts +38 -0
  357. package/dist/utils/scopeUtils.d.ts.map +1 -0
  358. package/dist/utils/scopeUtils.js +1 -0
  359. package/dist/utils/uploadValidation.d.ts.map +1 -1
  360. package/dist/utils/uploadValidation.js +1 -1
  361. package/package.json +24 -17
  362. package/dist/components/EntityCardList.d.ts +0 -27
  363. package/dist/components/EntityCardList.d.ts.map +0 -1
  364. package/dist/components/EntityCardList.js +0 -1
  365. package/dist/components/EntityList.d.ts +0 -24
  366. package/dist/components/EntityList.d.ts.map +0 -1
  367. package/dist/components/EntityList.js +0 -1
  368. package/dist/forms/utils/optionHelpers.d.ts +0 -54
  369. package/dist/forms/utils/optionHelpers.d.ts.map +0 -1
  370. package/dist/forms/utils/optionHelpers.js +0 -1
@@ -0,0 +1,202 @@
1
+ /**
2
+ * @fileoverview Shared CRUD Types
3
+ * @description Types shared between CrudService and CrudStore.
4
+ *
5
+ * **Architecture:**
6
+ * - TanStack Query = single source of truth for data
7
+ * - CrudStore = only tracks optimistic metadata (optimisticData + originalData)
8
+ * - mergeWithOptimistic merges TanStack cache with optimistic data for display
9
+ *
10
+ * @version 0.0.1
11
+ * @since 0.0.1
12
+ * @author AMBROISE PARK Consulting
13
+ */
14
+ import type { dndevSchema, QueryClient } from '@donotdev/core';
15
+ import type { QueryOptions } from './adapters/FirestoreAdapter';
16
+ import type { PaginatedQueryResult } from './adapters/FunctionsAdapter';
17
+ /**
18
+ * Backend type for CRUD operations
19
+ *
20
+ * @version 0.0.1
21
+ * @since 0.0.1
22
+ * @author AMBROISE PARK Consulting
23
+ */
24
+ export type BackendType = 'functions' | 'firestore';
25
+ /**
26
+ * Optimistic operation status
27
+ */
28
+ export type OptimisticStatus = 'pending' | 'confirmed' | 'failed';
29
+ /**
30
+ * Optimistic operation metadata
31
+ * Contains both original data (for rollback) and current data (for display)
32
+ */
33
+ export interface OptimisticMeta {
34
+ tempId: string;
35
+ originalData: unknown | null;
36
+ /** Current optimistic data to display (the new/updated value) */
37
+ optimisticData: unknown;
38
+ status: OptimisticStatus;
39
+ operation: 'add' | 'update' | 'delete';
40
+ }
41
+ /**
42
+ * Filter state type for list views
43
+ * Persists across navigation within CrudStore
44
+ */
45
+ export type FilterState = Record<string, string | {
46
+ min?: string;
47
+ max?: string;
48
+ }>;
49
+ /**
50
+ * Collection UI state (filters, favorites toggle)
51
+ * Persists across navigation
52
+ */
53
+ export interface CollectionUIState {
54
+ filters: FilterState;
55
+ showFavoritesOnly: boolean;
56
+ }
57
+ /**
58
+ * CRUD store state interface
59
+ * Note: No data field - TanStack Query owns data, CrudStore only tracks optimistic ops
60
+ *
61
+ * @version 0.0.3
62
+ * @since 0.0.1
63
+ * @author AMBROISE PARK Consulting
64
+ */
65
+ export interface CrudState {
66
+ backend: BackendType | null;
67
+ crudService: CrudServiceInterface | null;
68
+ /** Global flag to hide success toasts (set from app config) */
69
+ hideSuccessToasts: boolean;
70
+ collections: Record<string, {
71
+ loading: boolean;
72
+ error: Error | null;
73
+ lastUpdated: number;
74
+ /** Optimistic operation metadata keyed by document id */
75
+ optimistic: Record<string, OptimisticMeta>;
76
+ /** UI state: filters and favorites toggle (persists across navigation) */
77
+ ui: CollectionUIState;
78
+ }>;
79
+ }
80
+ /**
81
+ * CRUD store actions interface
82
+ * Note: No setData/getData - TanStack Query owns data, CrudStore only tracks optimistic ops
83
+ *
84
+ * @version 0.0.3
85
+ * @since 0.0.1
86
+ * @author AMBROISE PARK Consulting
87
+ */
88
+ export interface CrudActions {
89
+ setCrudService: (service: CrudServiceInterface) => void;
90
+ setBackend: (backend: BackendType) => void;
91
+ /** Set global flag to hide success toasts (called from app bootstrap) */
92
+ setHideSuccessToasts: (hide: boolean) => void;
93
+ setLoading: (collection: string, loading: boolean) => void;
94
+ setError: (collection: string, error: Error | null) => void;
95
+ clearCollection: (collection: string) => void;
96
+ clearError: (collection: string) => void;
97
+ setFilters: (collection: string, filters: FilterState) => void;
98
+ setShowFavoritesOnly: (collection: string, show: boolean) => void;
99
+ getFilters: (collection: string) => FilterState;
100
+ getShowFavoritesOnly: (collection: string) => boolean;
101
+ /** Add item optimistically (before server confirms) */
102
+ addOptimistic: (collection: string, tempId: string, data: unknown) => void;
103
+ /** Confirm optimistic add - replace temp item with real item */
104
+ confirmOptimistic: (collection: string, tempId: string, realId: string, realData: unknown) => void;
105
+ /** Reject optimistic add - remove temp item */
106
+ rejectOptimistic: (collection: string, tempId: string) => void;
107
+ /** Update item optimistically */
108
+ updateOptimistic: (collection: string, id: string, data: unknown, originalData: unknown) => void;
109
+ /** Confirm optimistic update */
110
+ confirmUpdate: (collection: string, id: string) => void;
111
+ /** Reject optimistic update - restore original data */
112
+ rejectUpdate: (collection: string, id: string) => void;
113
+ /** Delete item optimistically (hide but keep for rollback) */
114
+ deleteOptimistic: (collection: string, id: string, originalData: unknown) => void;
115
+ /** Confirm optimistic delete - remove completely */
116
+ confirmDelete: (collection: string, id: string) => void;
117
+ /** Reject optimistic delete - restore item */
118
+ rejectDelete: (collection: string, id: string) => void;
119
+ getLoading: (collection: string) => boolean;
120
+ getError: (collection: string) => Error | null;
121
+ /** Check if item is optimistic (not yet confirmed by server) */
122
+ isOptimistic: (collection: string, id: string) => boolean;
123
+ /** Get optimistic status for an item */
124
+ getOptimisticStatus: (collection: string, id: string) => OptimisticStatus | null;
125
+ /** Get optimistic data for an item (for display during pending state) */
126
+ getOptimisticData: (collection: string, id: string) => unknown | null;
127
+ }
128
+ /**
129
+ * Store API type for CrudService - typed instead of any
130
+ * Used by CrudService to type the store it receives
131
+ */
132
+ export type CrudStoreApi = {
133
+ getState: () => CrudState & CrudActions;
134
+ };
135
+ /**
136
+ * Cache options for read operations
137
+ */
138
+ export interface CacheOptions {
139
+ /** Bypass cache and fetch directly from adapter */
140
+ noCache?: boolean;
141
+ /** Custom stale time in ms (default: Infinity) */
142
+ staleTime?: number;
143
+ }
144
+ /**
145
+ * Options for mutation operations (add, update, delete, set)
146
+ */
147
+ export interface MutationOptions {
148
+ /**
149
+ * Override success toast behavior for this operation
150
+ * - true: always show toast
151
+ * - false: never show toast
152
+ * - undefined: use global setting (hideSuccessToasts)
153
+ */
154
+ showSuccessToast?: boolean;
155
+ }
156
+ /**
157
+ * CRUD Service Interface
158
+ * Complete interface for CRUD operations with caching and optimistic updates
159
+ *
160
+ * @version 0.0.4
161
+ * @since 0.0.1
162
+ * @author AMBROISE PARK Consulting
163
+ */
164
+ export interface CrudServiceInterface {
165
+ initialize(backend: BackendType): Promise<void>;
166
+ setStore(store: CrudStoreApi): void;
167
+ /** Schema accepts unknown since OperationSchemas stores dndevSchema<unknown>. T is for return type. */
168
+ getListQueryOptions<T>(collection: string, queryOptions: QueryOptions, schema: dndevSchema<unknown>, cacheOptions?: CacheOptions, schemaType?: 'list' | 'listCard'): {
169
+ queryKey: readonly string[];
170
+ queryFn: () => Promise<PaginatedQueryResult<T>>;
171
+ staleTime: number;
172
+ };
173
+ /** Schema accepts unknown since OperationSchemas stores dndevSchema<unknown>. T is for return type. */
174
+ getDocQueryOptions<T>(collection: string, id: string, schema: dndevSchema<unknown>, cacheOptions?: CacheOptions): {
175
+ queryKey: readonly string[];
176
+ queryFn: () => Promise<T | null>;
177
+ staleTime: number;
178
+ };
179
+ get<T>(collection: string, id: string, schema: dndevSchema<T>, options?: CacheOptions): Promise<T | null>;
180
+ query<T>(collection: string, options: QueryOptions, schema: dndevSchema<T>, cacheOptions?: CacheOptions, schemaType?: 'list' | 'listCard'): Promise<PaginatedQueryResult<T>>;
181
+ set<T>(collection: string, id: string, data: T, schema: dndevSchema<T>, options?: MutationOptions): Promise<void>;
182
+ update<T>(collection: string, id: string, data: Partial<T>, options?: MutationOptions): Promise<void>;
183
+ delete(collection: string, id: string, options?: MutationOptions): Promise<void>;
184
+ add<T>(collection: string, data: T, schema: dndevSchema<T>, options?: MutationOptions): Promise<string>;
185
+ subscribe<T>(collection: string, id: string, callback: (data: T | null, error?: Error) => void, schema: dndevSchema<T>): () => void;
186
+ subscribeToCollection<T>(collection: string, options: QueryOptions, callback: (data: T[], error?: Error) => void, schema: dndevSchema<T>): () => void;
187
+ /** Add with optimistic update - shows item immediately, confirms/rolls back after server */
188
+ addOptimistic<T extends {
189
+ id?: string;
190
+ }>(collection: string, data: T, schema: dndevSchema<T>, options?: MutationOptions): Promise<T & {
191
+ id: string;
192
+ }>;
193
+ /** Update with optimistic update - shows change immediately, confirms/rolls back after server */
194
+ updateOptimistic<T>(collection: string, id: string, data: Partial<T>, schema: dndevSchema<T>, options?: MutationOptions): Promise<T>;
195
+ /** Delete with optimistic update - hides item immediately, confirms/restores after server */
196
+ deleteOptimistic(collection: string, id: string, options?: MutationOptions): Promise<void>;
197
+ /** Invalidate all cached queries for a collection */
198
+ invalidateCollection(collection: string): Promise<void>;
199
+ /** Get the shared QueryClient instance from @donotdev/core */
200
+ getQueryClient(): QueryClient;
201
+ }
202
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
File without changes
@@ -0,0 +1,53 @@
1
+ import type { Entity, FeatureStatus } from '@donotdev/core';
2
+ import type { QueryOptions } from './CrudService';
3
+ import type { UseCrudOptions } from './useCrud';
4
+ /** Schema type determines which schema to use */
5
+ export type ListSchemaType = 'list' | 'listCard';
6
+ /** Pagination configuration */
7
+ export interface PaginationConfig {
8
+ /** Pagination mode: 'client' fetches all, 'server' fetches per page */
9
+ mode: 'client' | 'server';
10
+ /** Page number for server-side pagination (1-indexed) */
11
+ page: number;
12
+ /** Page size for server-side pagination */
13
+ pageSize: number;
14
+ }
15
+ /** Base options for list hooks */
16
+ export interface UseBaseCrudListOptions<T> extends UseCrudOptions<T> {
17
+ /** Automatically fetch data on mount (default: true) */
18
+ enabled?: boolean;
19
+ /** Where/orderBy/limit passed to query */
20
+ queryOptions?: QueryOptions;
21
+ }
22
+ /** Base return type for list hooks */
23
+ export interface UseBaseCrudListReturn<T> {
24
+ status: FeatureStatus;
25
+ data: {
26
+ items: T[];
27
+ total?: number;
28
+ } | null;
29
+ /** Convenience: items array (data?.items ?? []) */
30
+ items: T[];
31
+ /** True during initial fetch (show skeletons) */
32
+ loading: boolean;
33
+ /** True during background refetch (show subtle indicator) */
34
+ fetching: boolean;
35
+ error: Error | null;
36
+ /** Manual refresh function */
37
+ mutate: () => Promise<void>;
38
+ /** Alias for mutate (manual refresh) */
39
+ refresh: () => Promise<void>;
40
+ isAvailable: boolean;
41
+ }
42
+ /**
43
+ * Internal base hook for list operations
44
+ * Used by useCrudList and useCrudCardList
45
+ *
46
+ * @internal Not exported to consumers
47
+ */
48
+ export declare function useBaseCrudList<T extends {
49
+ id: string;
50
+ } = {
51
+ id: string;
52
+ }>(entityOrCollection: Entity | string, schemaType: ListSchemaType, pagination: PaginationConfig | null, options?: UseBaseCrudListOptions<T>): UseBaseCrudListReturn<T>;
53
+ //# sourceMappingURL=useBaseCrudList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBaseCrudList.d.ts","sourceRoot":"","sources":["../src/useBaseCrudList.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAe,MAAM,gBAAgB,CAAC;AAOzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAKhD,iDAAiD;AACjD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,CAAC;AAEjD,+BAA+B;AAC/B,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,kCAAkC;AAClC,MAAM,WAAW,sBAAsB,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IAClE,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,sCAAsC;AACtC,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE;QAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5C,mDAAmD;IACnD,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,wCAAwC;IACxC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EACvE,kBAAkB,EAAE,MAAM,GAAG,MAAM,EACnC,UAAU,EAAE,cAAc,EAC1B,UAAU,EAAE,gBAAgB,GAAG,IAAI,EACnC,OAAO,GAAE,sBAAsB,CAAC,CAAC,CAAM,GACtC,qBAAqB,CAAC,CAAC,CAAC,CAwO1B"}
@@ -0,0 +1 @@
1
+ import{useMemo as P,useCallback as H,useRef as Q}from"react";import{useQuery as J}from"@donotdev/core";import{useCrudStore as N}from"./CrudStore";import{useCrud as j,getCrudServiceInstance as U,EMPTY_OPTIMISTIC as X}from"./useCrud";import{mergeWithOptimistic as Z}from"./utils/mergeWithOptimistic";import{injectScopeFilter as $,getCurrentScopeValue as ee}from"./utils/scopeUtils";function te(x,f,t,p={}){const K=p.enabled??!0,b=j("status"),a=b==="ready",V=j(x,p),{error:w,invalidate:I,_collection:d,_schemas:g,_cacheOptions:C,_scope:O}=V,M=N(e=>e.collections[d]?.optimistic||X),q=Q(new Map([[1,null]])),h=Q(0),k=ee(O),v=P(()=>{if(!a||!g)return null;const e=U();if(!e)return null;const y=f==="listCard"?g.listCard:g.list,m=$(p.queryOptions,O);if(!t||t.mode==="client")return e.getListQueryOptions(d,m,y,C,f);const o=q.current,n=h.current,{page:l,pageSize:s}=t;let i,r;if(o.has(l))i=o.get(l)??void 0,r=s;else if(l>n&&o.has(n)){const u=l-n;i=o.get(n)??void 0,r=u*s}else i=void 0,r=l*s;return e.getListQueryOptions(d,{...m,limit:r,startAfterId:i},y,C,f)},[a,d,C,g?"hasSchema":"noSchema",f,t?.mode,t?.page,t?.pageSize,p.queryOptions,O?.provider,k]),{data:c,isLoading:B,isFetching:E,error:R,refetch:T}=J({queryKey:v?.queryKey??["crud",d,"disabled"],queryFn:v?.queryFn??(()=>Promise.resolve({items:[]})),staleTime:v?.staleTime,enabled:K&&!!v}),_=P(()=>{if(!c||!a)return{items:[],total:void 0};let e=c.items;if(t?.mode==="server"&&e.length>0){const s=q.current,i=h.current,{page:r,pageSize:u}=t,Y=e.length;if(Math.ceil(Y/u)>1||r>i){const L=s.has(r)?r:i+1;for(let S=L;S<=r;S++){const A=(S-L+1)*u-1;if(A<e.length){const G=e[A];s.set(S+1,G.id)}}}c.lastVisible&&s.set(r+1,c.lastVisible),h.current=Math.max(i,r);const F=s.has(r)?0:(r-i-1)*u,D=F+u;e=e.slice(F,D)}const y=Z(e,M),m=new Set(e.map(s=>s.id));let o=0,n=0;for(const[s,i]of Object.entries(M))i.operation==="add"&&!m.has(s)?o++:i.operation==="delete"&&m.has(s)&&n++;const l=(c.total??e.length)+o-n;return{items:y,total:t?l:void 0}},[c,M,a,t?.mode,t?.page,t?.pageSize]),z=H(async()=>{a&&(t?.mode==="server"&&(q.current=new Map([[1,null]]),h.current=0),await I(),await T())},[I,T,a,t?.mode]);if(!a){const e=async()=>{};return{status:b,data:{items:[],total:void 0},items:[],loading:!1,fetching:!1,error:w,mutate:e,refresh:e,isAvailable:!1}}const W=_?.items??[];return{status:b,data:_,items:W,loading:B,fetching:E,error:R??w,mutate:z,refresh:z,isAvailable:!0}}export{te as useBaseCrudList};
package/dist/useCrud.d.ts CHANGED
@@ -1,6 +1,5 @@
1
- import type { dndevSchema, Entity, FeatureStatus, OperationSchemas, CrudAPI } from '@donotdev/core';
2
- import type { CrudServiceInterface, CacheOptions } from './CrudService';
3
- import type { BackendType } from './CrudStore';
1
+ import type { dndevSchema, Entity, FeatureStatus, OperationSchemas, CrudAPI, ScopeConfig } from '@donotdev/core';
2
+ import type { CrudServiceInterface, CacheOptions, BackendType } from './types';
4
3
  export declare const EMPTY_DATA: Record<string, unknown>;
5
4
  export declare const EMPTY_OPTIMISTIC: Record<string, unknown>;
6
5
  /**
@@ -17,9 +16,6 @@ export interface UseCrudOptions<T> {
17
16
  /** Disable caching (bypass TanStack Query) */
18
17
  noCache?: boolean;
19
18
  }
20
- /**
21
- * CRUD API return type - Single Document & Actions
22
- */
23
19
  /**
24
20
  * CRUD API return type - Single Document & Actions
25
21
  */
@@ -30,8 +26,8 @@ export interface UseCrudReturn<T> extends CrudAPI<T> {
30
26
  _schemas: OperationSchemas | undefined;
31
27
  /** @internal Cache options */
32
28
  _cacheOptions: CacheOptions;
33
- /** @internal Store data for collection */
34
- _storeData: Record<string, unknown>;
29
+ /** @internal Scope configuration (for multi-tenancy) */
30
+ _scope: ScopeConfig | undefined;
35
31
  }
36
32
  /**
37
33
  * React hook for CRUD Actions & Single Documents
@@ -1 +1 @@
1
- {"version":3,"file":"useCrud.d.ts","sourceRoot":"","sources":["../src/useCrud.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EACV,WAAW,EACX,MAAM,EACN,aAAa,EACb,gBAAgB,EAChB,OAAO,EACR,MAAM,gBAAgB,CAAC;AAKxB,OAAO,KAAK,EAAE,oBAAoB,EAAgB,YAAY,EAAE,MAAM,eAAe,CAAC;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,CAAC;AACtD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,CAAC;AAM5D;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,oBAAoB,GAAG,IAAI,CAEpE;AAMD,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IAElD,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,QAAQ,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACvC,8BAA8B;IAC9B,aAAa,EAAE,YAAY,CAAC;IAC5B,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,aAAa,CAAC;AACtD,wBAAgB,OAAO,CAAC,CAAC,GAAG,OAAO,EACjC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAC1B,aAAa,CAAC,CAAC,CAAC,CAAC;AACpB,wBAAgB,OAAO,CAAC,CAAC,GAAG,OAAO,EACjC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAC1B,aAAa,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"useCrud.d.ts","sourceRoot":"","sources":["../src/useCrud.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EACV,WAAW,EACX,MAAM,EACN,aAAa,EACb,gBAAgB,EAChB,OAAO,EACP,WAAW,EACZ,MAAM,gBAAgB,CAAC;AAOxB,OAAO,KAAK,EACV,oBAAoB,EACpB,YAAY,EACZ,WAAW,EAEZ,MAAM,SAAS,CAAC;AAKjB,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,CAAC;AACtD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,CAAC;AAM5D;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,oBAAoB,GAAG,IAAI,CAEpE;AAMD,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IAElD,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,QAAQ,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACvC,8BAA8B;IAC9B,aAAa,EAAE,YAAY,CAAC;IAC5B,wDAAwD;IACxD,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;CACjC;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,aAAa,CAAC;AACtD,wBAAgB,OAAO,CAAC,CAAC,GAAG,OAAO,EACjC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAC1B,aAAa,CAAC,CAAC,CAAC,CAAC;AACpB,wBAAgB,OAAO,CAAC,CAAC,GAAG,OAAO,EACjC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAC1B,aAAa,CAAC,CAAC,CAAC,CAAC"}
package/dist/useCrud.js CHANGED
@@ -1 +1 @@
1
- "use client";import{useEffect as B,useMemo as y,useCallback as n}from"react";import{useFeatureConsent as L,FRAMEWORK_FEATURES as j,FEATURE_STATUS as f,handleError as V,isClient as W,createSchemas as Z,DEGRADED_CRUD_API as $}from"@donotdev/core";import{getCrudService as H}from"./CrudService";import{useCrudStore as a}from"./CrudStore";const J={},ee={};let U=null,v=null,D=!1;function o(){return U}function te(u,i={}){const m=L(j.CRUD),P=a(e=>e.crudService),E=m&&!P,h=m?E?f.INITIALIZING:f.READY:f.DEGRADED;if(u==="status")return h;const S=typeof u=="object"?u:i.entity,t=typeof u=="string"?u:u.collection,d=i.backend||"functions",g=i.noCache??!1,T=i.staleTime,l=y(()=>({noCache:g,staleTime:T}),[g,T]),s=y(()=>{if(i.schema){const e=i.schema;return{create:e,draft:e,update:e,get:e,list:e,listCard:e,delete:e}}if(S)return Z(S)},[i.schema?"custom":S?.name,t]),b=a(e=>e.collections[t]?.data||J),w=a(e=>e.collections[t]?.loading||!1),A=a(e=>e.collections[t]?.error||null),F=a(e=>e.collections[t]?.data.current||null);B(()=>{if(!W()||!m||!s)return;const{crudService:e,backend:c}=a.getState();e&&c===d||v||(v=(async()=>{try{const r=H();U=r,r.setStore(a),await r.initialize(d),D=!1,a.getState().setBackend(d),a.getState().setCrudService(r)}catch(r){D||(V(r,{userMessage:"Failed to initialize CRUD service.",context:{backend:d,collection:t},severity:"error"}),D=!0)}finally{v=null}})())},[m,d,t,s?"hasSchema":"noSchema"]);const C=E||w,k=h===f.READY,x=n(async e=>{const c=o();return!c||!s?null:c.get(t,e,s.get,l)},[t,s?"hasSchema":"noSchema",l]),M=n(async(e,c)=>{const r=o();if(!r||!s)return;const G=c?.status==="draft"?s.draft:s.create;await r.set(t,e,c,G)},[t,s?"hasSchema":"noSchema"]),N=n(async(e,c)=>{const r=o();r&&await r.update(t,e,c)},[t]),z=n(async e=>{const c=o();c&&await c.delete(t,e)},[t]),Y=n(async e=>{const c=o();if(!c||!s)return"";const R=e?.status==="draft"?s.draft:s.create;return c.add(t,e,R)},[t,s?"hasSchema":"noSchema"]),q=n(async e=>{const c=o();return!c||!s?[]:c.query(t,e,s.list,l)},[t,s?"hasSchema":"noSchema",l]),p=n((e,c)=>{const r=o();return!r||!s?()=>{}:r.subscribe(t,e,c,s.get)},[t,s?"hasSchema":"noSchema"]),_=n((e,c)=>{const r=o();return!r||!s?()=>{}:r.subscribeToCollection(t,e,c,s.list)},[t,s?"hasSchema":"noSchema"]),I=n(async()=>{const e=o();e&&await e.invalidateCollection(t)},[t]);return k?{status:f.READY,data:F,loading:C,error:A,get:x,set:M,update:N,delete:z,add:Y,query:q,subscribe:p,subscribeToCollection:_,invalidate:I,isAvailable:!0,_collection:t,_schemas:s,_cacheOptions:l,_storeData:b}:{...$,status:h,loading:C,error:A,subscribe:p,subscribeToCollection:_,invalidate:I,_collection:t,_schemas:s,_cacheOptions:l,_storeData:b}}export{J as EMPTY_DATA,ee as EMPTY_OPTIMISTIC,o as getCrudServiceInstance,te as useCrud};
1
+ "use client";import{useEffect as B,useMemo as w,useCallback as r}from"react";import{useFeatureConsent as L,FRAMEWORK_FEATURES as W,FEATURE_STATUS as S,handleError as Z,isClient as H,createSchemas as J,DEGRADED_CRUD_API as K}from"@donotdev/core";import{getCrudService as Q}from"./CrudService";import{useCrudStore as u}from"./CrudStore";import{injectScope as F,injectScopeFilter as V}from"./utils/scopeUtils";const X={},$={};let M=null,y=null,E=!1;function n(){return M}function ee(m,l={}){const f=L(W.CRUD),U=u(e=>e.crudService),g=f&&!U,b=f?g?S.INITIALIZING:S.READY:S.DEGRADED;if(m==="status")return b;const p=typeof m=="object"?m:l.entity,t=typeof m=="string"?m:m.collection,o=p?.scope,h=l.backend||"functions",T=l.noCache??!1,v=l.staleTime,d=w(()=>({noCache:T,staleTime:v}),[T,v]),a=w(()=>{if(l.schema){const e=l.schema;return{create:e,draft:e,update:e,get:e,list:e,listCard:e,delete:e}}if(p)return J(p)},[l.schema?"custom":p?.name,t]),k=u(e=>e.collections[t]?.loading||!1),A=u(e=>e.collections[t]?.error||null),Y=null;B(()=>{if(!H()||!f||!a)return;const{crudService:e,backend:c}=u.getState();e&&c===h||y||(y=(async()=>{try{const s=Q();M=s,s.setStore(u),await s.initialize(h),E=!1,u.getState().setBackend(h),u.getState().setCrudService(s)}catch(s){E||(Z(s,{userMessage:"Failed to initialize CRUD service.",context:{backend:h,collection:t},severity:"error"}),E=!0)}finally{y=null}})())},[f,h,t,a?"hasSchema":"noSchema"]);const _=g||k,O=b===S.READY,P=r(async e=>{const c=n();return!c||!a?null:c.get(t,e,a.get,d)},[t,a?"hasSchema":"noSchema",d]),j=r(async(e,c,s)=>{const i=n();if(!i||!a)return;const C=F(c,o),N=C?.status==="draft"?a.draft:a.create;await i.set(t,e,C,N,s)},[t,a?"hasSchema":"noSchema",o?.provider]),G=r(async(e,c,s)=>{const i=n();i&&await i.update(t,e,c,s)},[t]),q=r(async(e,c)=>{const s=n();s&&await s.delete(t,e,c)},[t]),x=r(async(e,c)=>{const s=n();if(!s||!a)return"";const i=F(e,o),C=i?.status==="draft"?a.draft:a.create;return s.add(t,i,C,c)},[t,a?"hasSchema":"noSchema",o?.provider]),z=r(async e=>{const c=n();if(!c||!a)return[];const s=V(e,o);return(await c.query(t,s,a.list,d)).items},[t,a?"hasSchema":"noSchema",d,o?.provider]),D=r((e,c)=>{const s=n();return!s||!a?()=>{}:s.subscribe(t,e,c,a.get)},[t,a?"hasSchema":"noSchema"]),R=r((e,c)=>{const s=n();return!s||!a?()=>{}:s.subscribeToCollection(t,e,c,a.list)},[t,a?"hasSchema":"noSchema"]),I=r(async()=>{const e=n();e&&await e.invalidateCollection(t)},[t]);return O?{status:S.READY,data:Y,loading:_,error:A,get:P,set:j,update:G,delete:q,add:x,query:z,subscribe:D,subscribeToCollection:R,invalidate:I,isAvailable:!0,_collection:t,_schemas:a,_cacheOptions:d,_scope:o}:{...K,status:b,loading:_,error:A,subscribe:D,subscribeToCollection:R,invalidate:I,_collection:t,_schemas:a,_cacheOptions:d,_scope:o}}export{X as EMPTY_DATA,$ as EMPTY_OPTIMISTIC,n as getCrudServiceInstance,ee as useCrud};
@@ -1,24 +1,28 @@
1
1
  /**
2
2
  * @fileoverview useCrudCardList Hook - Optimized Card List Management
3
3
  * @description Specialized hook for fetching lists of entities optimized for card views.
4
- * Uses TanStack Query for reactive loading states.
5
4
  * Fetches only the fields defined in `listCardFields` (or `listFields`) to reduce payload size.
6
5
  *
7
- * @version 0.1.0
6
+ * @version 0.0.10
8
7
  * @since 0.0.1
9
8
  * @author AMBROISE PARK Consulting
10
9
  */
11
10
  import type { Entity, FeatureStatus } from '@donotdev/core';
11
+ import type { QueryOptions } from './CrudService';
12
12
  import type { UseCrudOptions } from './useCrud';
13
13
  export interface UseCrudCardListOptions<T> extends UseCrudOptions<T> {
14
14
  /** Automatically fetch data on mount (default: true) */
15
15
  enabled?: boolean;
16
+ /** Where/orderBy/limit passed to listCard query */
17
+ queryOptions?: QueryOptions;
16
18
  }
17
19
  export interface UseCrudCardListReturn<T> {
18
20
  status: FeatureStatus;
19
21
  data: {
20
22
  items: T[];
21
23
  } | null;
24
+ /** Convenience: items array (data?.items ?? []) */
25
+ items: T[];
22
26
  /** True during initial fetch (show skeletons) */
23
27
  loading: boolean;
24
28
  /** True during background refetch (show subtle indicator) */
@@ -26,6 +30,8 @@ export interface UseCrudCardListReturn<T> {
26
30
  error: Error | null;
27
31
  /** Manual refresh function */
28
32
  mutate: () => Promise<void>;
33
+ /** Alias for mutate (manual refresh) */
34
+ refresh: () => Promise<void>;
29
35
  isAvailable: boolean;
30
36
  }
31
37
  /**
@@ -43,13 +49,13 @@ export interface UseCrudCardListReturn<T> {
43
49
  *
44
50
  * @example
45
51
  * ```typescript
46
- * const { data, loading, fetching } = useCrudCardList(carEntity);
52
+ * const { items, loading, refresh } = useCrudCardList(carEntity);
47
53
  *
48
54
  * if (loading) return <Skeletons />;
49
55
  *
50
56
  * return (
51
57
  * <Grid>
52
- * {data?.items.map(car => <Card key={car.id} title={car.make} />)}
58
+ * {items.map(car => <Card key={car.id} title={car.make} />)}
53
59
  * </Grid>
54
60
  * );
55
61
  * ```
@@ -1 +1 @@
1
- {"version":3,"file":"useCrudCardList.d.ts","sourceRoot":"","sources":["../src/useCrudCardList.ts"],"names":[],"mappings":"AACA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAO5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,MAAM,WAAW,sBAAsB,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IAClE,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE;QAAE,KAAK,EAAE,CAAC,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5B,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EACvE,kBAAkB,EAAE,MAAM,GAAG,MAAM,EACnC,OAAO,GAAE,sBAAsB,CAAC,CAAC,CAAM,GACtC,qBAAqB,CAAC,CAAC,CAAC,CAsF1B"}
1
+ {"version":3,"file":"useCrudCardList.d.ts","sourceRoot":"","sources":["../src/useCrudCardList.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAM5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,MAAM,WAAW,sBAAsB,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IAClE,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE;QAAE,KAAK,EAAE,CAAC,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5B,mDAAmD;IACnD,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,wCAAwC;IACxC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EACvE,kBAAkB,EAAE,MAAM,GAAG,MAAM,EACnC,OAAO,GAAE,sBAAsB,CAAC,CAAC,CAAM,GACtC,qBAAqB,CAAC,CAAC,CAAC,CAgC1B"}
@@ -1 +1 @@
1
- import{useMemo as y,useCallback as T}from"react";import{useQuery as _}from"@donotdev/core";import{useCrudStore as I}from"./CrudStore";import{useCrud as h,getCrudServiceInstance as L,EMPTY_OPTIMISTIC as A}from"./useCrud";import{mergeWithOptimistic as D}from"./utils/mergeWithOptimistic";function K(p,n={}){const C=n.enabled??!0,i=h("status"),e=i==="ready",g=h(p,n),{error:c,invalidate:u,_collection:r,_schemas:a,_cacheOptions:l,_storeData:m}=g,d=I(s=>s.collections[r]?.optimistic||A),t=y(()=>{if(!e||!a)return null;const s=L();return s?s.getListQueryOptions(r,{},a.listCard,l,"listCard"):null},[e,r,l,a?"hasSchema":"noSchema"]),{data:o,isLoading:b,isFetching:q,error:v,refetch:f}=_({queryKey:t?.queryKey??["crud",r,"disabled"],queryFn:t?.queryFn??(()=>Promise.resolve([])),staleTime:t?.staleTime,enabled:C&&!!t}),O=y(()=>!o||!e?[]:D(o,d,m),[o,d,m,e]),S=T(async()=>{e&&(await u(),await f())},[u,f,e]);return e?{status:i,data:{items:O},loading:b,fetching:q,error:v??c,mutate:S,isAvailable:!0}:{status:i,data:{items:[]},loading:!1,fetching:!1,error:c,mutate:async()=>{},isAvailable:!1}}export{K as useCrudCardList};
1
+ import{useBaseCrudList as i}from"./useBaseCrudList";function r(s,t={}){const a={enabled:t.enabled,queryOptions:t.queryOptions,backend:t.backend,schema:t.schema,entity:t.entity,staleTime:t.staleTime,noCache:t.noCache},e=i(s,"listCard",null,a);return{status:e.status,data:e.data?{items:e.data.items}:null,items:e.items,loading:e.loading,fetching:e.fetching,error:e.error,mutate:e.mutate,refresh:e.refresh,isAvailable:e.isAvailable}}export{r as useCrudCardList};
@@ -1,23 +1,35 @@
1
1
  /**
2
- * @fileoverview useCrudList Hook - Collection Management
2
+ * @fileoverview useCrudList Hook - Collection Management with Pagination
3
3
  * @description Specialized hook for fetching and managing lists of entities.
4
- * Uses TanStack Query for reactive loading states.
4
+ * Supports both client-side and server-side pagination.
5
5
  *
6
- * @version 0.2.0
6
+ * @version 0.0.10
7
7
  * @since 0.0.1
8
8
  * @author AMBROISE PARK Consulting
9
9
  */
10
10
  import type { Entity, FeatureStatus } from '@donotdev/core';
11
+ import type { QueryOptions } from './CrudService';
11
12
  import type { UseCrudOptions } from './useCrud';
12
13
  export interface UseCrudListOptions<T> extends UseCrudOptions<T> {
13
14
  /** Automatically fetch data on mount (default: true) */
14
15
  enabled?: boolean;
16
+ /** Pagination mode: 'client' (default) fetches all, 'server' fetches per page */
17
+ pagination?: 'client' | 'server';
18
+ /** Page number for server-side pagination (1-indexed, default: 1) */
19
+ page?: number;
20
+ /** Page size for server-side pagination (default: 10) */
21
+ pageSize?: number;
22
+ /** Where/orderBy/limit passed to list query (merged with pagination on server) */
23
+ queryOptions?: QueryOptions;
15
24
  }
16
25
  export interface UseCrudListReturn<T> {
17
26
  status: FeatureStatus;
18
27
  data: {
19
28
  items: T[];
29
+ total?: number;
20
30
  } | null;
31
+ /** Convenience: items array (data?.items ?? []) */
32
+ items: T[];
21
33
  /** True during initial fetch (show skeletons) */
22
34
  loading: boolean;
23
35
  /** True during background refetch (show subtle indicator) */
@@ -25,6 +37,8 @@ export interface UseCrudListReturn<T> {
25
37
  error: Error | null;
26
38
  /** Manual refresh function */
27
39
  mutate: () => Promise<void>;
40
+ /** Alias for mutate (manual refresh) */
41
+ refresh: () => Promise<void>;
28
42
  isAvailable: boolean;
29
43
  }
30
44
  /**
@@ -42,13 +56,13 @@ export interface UseCrudListReturn<T> {
42
56
  *
43
57
  * @example
44
58
  * ```typescript
45
- * const { data, loading, mutate } = useCrudList(carEntity);
59
+ * const { items, loading, refresh } = useCrudList(carEntity);
46
60
  *
47
61
  * if (loading) return <Loader />;
48
62
  *
49
63
  * return (
50
64
  * <ul>
51
- * {data?.items.map(car => <li key={car.id}>{car.make}</li>)}
65
+ * {items.map(car => <li key={car.id}>{car.make}</li>)}
52
66
  * </ul>
53
67
  * );
54
68
  * ```
@@ -1 +1 @@
1
- {"version":3,"file":"useCrudList.d.ts","sourceRoot":"","sources":["../src/useCrudList.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAO5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,MAAM,WAAW,kBAAkB,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IAC9D,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE;QAAE,KAAK,EAAE,CAAC,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5B,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EACnE,kBAAkB,EAAE,MAAM,GAAG,MAAM,EACnC,OAAO,GAAE,kBAAkB,CAAC,CAAC,CAAM,GAClC,iBAAiB,CAAC,CAAC,CAAC,CAsFtB"}
1
+ {"version":3,"file":"useCrudList.d.ts","sourceRoot":"","sources":["../src/useCrudList.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAO5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,MAAM,WAAW,kBAAkB,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IAC9D,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iFAAiF;IACjF,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE;QAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5C,mDAAmD;IACnD,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,wCAAwC;IACxC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EACnE,kBAAkB,EAAE,MAAM,GAAG,MAAM,EACnC,OAAO,GAAE,kBAAkB,CAAC,CAAC,CAAM,GAClC,iBAAiB,CAAC,CAAC,CAAC,CA6BtB"}
@@ -1 +1 @@
1
- import{useMemo as y,useCallback as T}from"react";import{useQuery as _}from"@donotdev/core";import{useCrudStore as I}from"./CrudStore";import{useCrud as h,getCrudServiceInstance as L,EMPTY_OPTIMISTIC as A}from"./useCrud";import{mergeWithOptimistic as D}from"./utils/mergeWithOptimistic";function K(p,n={}){const g=n.enabled??!0,i=h("status"),e=i==="ready",b=h(p,n),{error:c,invalidate:u,_collection:t,_schemas:a,_cacheOptions:l,_storeData:m}=b,d=I(s=>s.collections[t]?.optimistic||A),r=y(()=>{if(!e||!a)return null;const s=L();return s?s.getListQueryOptions(t,{},a.list,l,"list"):null},[e,t,l,a?"hasSchema":"noSchema"]),{data:o,isLoading:q,isFetching:v,error:C,refetch:f}=_({queryKey:r?.queryKey??["crud",t,"disabled"],queryFn:r?.queryFn??(()=>Promise.resolve([])),staleTime:r?.staleTime,enabled:g&&!!r}),O=y(()=>!o||!e?[]:D(o,d,m),[o,d,m,e]),S=T(async()=>{e&&(await u(),await f())},[u,f,e]);return e?{status:i,data:{items:O},loading:q,fetching:v,error:C??c,mutate:S,isAvailable:!0}:{status:i,data:{items:[]},loading:!1,fetching:!1,error:c,mutate:async()=>{},isAvailable:!1}}export{K as useCrudList};
1
+ import{useBaseCrudList as c}from"./useBaseCrudList";function r(a,e={}){const t=e.pagination??"client",n=e.page??1,i=e.pageSize??10,s={mode:t,page:n,pageSize:i},o={enabled:e.enabled,queryOptions:e.queryOptions,backend:e.backend,schema:e.schema,entity:e.entity,staleTime:e.staleTime,noCache:e.noCache};return c(a,"list",s,o)}export{r as useCrudList};
@@ -1 +1 @@
1
- import{getCrudService as o}from"../CrudService";async function u(s,t){const e=o(),r=[],a=t.range?.start??1,n=t.range?.end??28;for(let c=a;c<=n;c++){const i=String(c),d=await e.get(t.path(s),i,t.schema);d&&r.push(d)}return r}async function m(s,t,e){const r=o();for(const a of e){const n=t.idOf(a);await r.set(t.path(s),n,a,t.schema)}}async function h(s,t,e){const r=o();if(t.idFrom){const a=t.idFrom(e);return r.set(t.path(s),a,e,t.schema)}return r.add(t.path(s),e,t.schema)}export{h as appendToCollection,u as loadDeterministicRange,m as upsertDeterministic};
1
+ import{getCrudService as c}from"../CrudService";async function d(r,n){const a=c(),e=[],t=n.range?.start??1,s=n.range?.end??28;for(let o=t;o<=s;o++){const m=String(o),i=await a.get(n.path(r),m,n.schema);i&&e.push(i)}return e}async function h(r,n,a){const e=c();for(const t of a){const s=n.idOf(t);await e.set(n.path(r),s,t,n.schema)}}async function p(r,n,a){const e=c();if(n.idFrom){const t=n.idFrom(a);return e.set(n.path(r),t,a,n.schema)}return e.add(n.path(r),a,n.schema)}export{p as appendToCollection,d as loadDeterministicRange,h as upsertDeterministic};
@@ -1 +1 @@
1
- "use client";import{handleError as p}from"@donotdev/core";import{uploadFileResumable as u,deleteFileByUrl as d}from"@donotdev/firebase";function f(e){return e.replace(/[^a-zA-Z0-9.-]/g,"_").replace(/_{2,}/g,"_").toLowerCase()}async function x(e,t={}){const{storagePath:r="uploads/files",filename:n,onProgress:a}=t,o=Date.now(),i=f(e.name),c=n||`${o}_${i}`,l=`${r}/${c}`;try{const{promise:s}=u(e,{basePath:r,filename:c,onProgress:a,metadata:{contentType:e.type}});return{url:(await s).url,filename:e.name,size:e.size,mimeType:e.type,uploadedAt:new Date().toISOString()}}catch(s){throw p(s,{userMessage:"Failed to upload file",severity:"error",context:{filename:e.name,fileSize:e.size}})}}async function v(e,t={}){const r=[],n=e.reduce((o,i)=>o+i.size,0);let a=0;for(const o of e){const i=t.onProgress?l=>{const s=l.bytesTransferred/l.totalBytes*o.size;t.onProgress({bytesTransferred:a+s,totalBytes:n,progress:(a+s)/n*100})}:void 0,c=await x(o,{...t,onProgress:i});r.push(c),a+=o.size}return r}async function M(e){try{await d(e.url)}catch(t){throw p(t,{userMessage:"Failed to delete file",severity:"error",context:{url:e.url,filename:e.filename}}),t}}function S(){return`${Date.now()}-${Math.random().toString(36).slice(2,9)}`}function m(e){const t=e.split(".");return t.length>1?t.pop().toLowerCase():""}function P(e,t){const r=t?m(t):"";if(e){if(e.startsWith("image/"))return"image";if(e.startsWith("video/"))return"video";if(e.startsWith("audio/"))return"audio";if(e==="application/pdf")return"pdf";if(e.includes("word")||e.includes("document"))return"doc";if(e.includes("excel")||e.includes("spreadsheet"))return"xls";if(e.includes("powerpoint")||e.includes("presentation"))return"ppt"}switch(r){case"pdf":return"pdf";case"doc":case"docx":return"doc";case"xls":case"xlsx":case"csv":return"xls";case"ppt":case"pptx":return"ppt";case"md":case"txt":return"text";case"html":case"htm":return"html";case"zip":case"rar":case"7z":return"archive";default:return"file"}}function B(e){if(e===0)return"0 B";const t=1024,r=["B","KB","MB","GB"],n=Math.floor(Math.log(e)/Math.log(t));return`${parseFloat((e/Math.pow(t,n)).toFixed(1))} ${r[n]}`}const h=["application/pdf","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.ms-powerpoint","application/vnd.openxmlformats-officedocument.presentationml.presentation","text/plain","text/markdown","text/html","text/csv"],g=[".pdf",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".txt",".md",".html",".csv"];function E(){return[...h,...g].join(",")}export{g as DOCUMENT_EXTENSIONS,h as DOCUMENT_MIME_TYPES,M as deleteFile,B as formatFileSize,S as generateFileId,E as getDocumentAcceptString,m as getFileExtension,P as getFileIcon,x as uploadFile,v as uploadFiles};
1
+ "use client";import{handleError as p}from"@donotdev/core";import{uploadFileResumable as x,deleteFileByUrl as h}from"@donotdev/firebase";function g(e){return e.replace(/[^a-zA-Z0-9.-]/g,"_").replace(/_{2,}/g,"_").toLowerCase()}async function u(e,t={}){const{storagePath:r="uploads/files",filename:n,onProgress:o}=t,s=Date.now(),i=g(e.name),c=n||`${s}_${i}`,l=`${r}/${c}`;try{const{promise:a}=x(e,{basePath:r,filename:c,onProgress:o,metadata:{contentType:e.type}});return{url:(await a).url,filename:e.name,size:e.size,mimeType:e.type,uploadedAt:new Date().toISOString()}}catch(a){throw p(a,{userMessage:"Failed to upload file",severity:"error",context:{filename:e.name,fileSize:e.size}})}}async function w(e,t={}){const r=[],n=e.reduce((s,i)=>s+i.size,0);let o=0;for(const s of e){const i=t.onProgress?l=>{const a=l.bytesTransferred/l.totalBytes*s.size;t.onProgress({bytesTransferred:o+a,totalBytes:n,progress:(o+a)/n*100})}:void 0,c=await u(s,{...t,onProgress:i});r.push(c),o+=s.size}return r}async function y(e){try{await h(e.url)}catch(t){throw p(t,{userMessage:"Failed to delete file",severity:"error",context:{url:e.url,filename:e.filename}}),t}}function v(){return`${Date.now()}-${Math.random().toString(36).slice(2,9)}`}function d(e){const t=e.split(".");return t.length>1?t.pop().toLowerCase():""}function F(e,t){const r=t?d(t):"";if(e){if(e.startsWith("image/"))return"image";if(e.startsWith("video/"))return"video";if(e.startsWith("audio/"))return"audio";if(e==="application/pdf")return"pdf";if(e.includes("word")||e.includes("document"))return"doc";if(e.includes("excel")||e.includes("spreadsheet"))return"xls";if(e.includes("powerpoint")||e.includes("presentation"))return"ppt"}switch(r){case"pdf":return"pdf";case"doc":case"docx":return"doc";case"xls":case"xlsx":case"csv":return"xls";case"ppt":case"pptx":return"ppt";case"md":case"txt":return"text";case"html":case"htm":return"html";case"zip":case"rar":case"7z":return"archive";default:return"file"}}function M(e){if(e===0)return"0 B";const t=1024,r=["B","KB","MB","GB"],n=Math.floor(Math.log(e)/Math.log(t));return`${parseFloat((e/Math.pow(t,n)).toFixed(1))} ${r[n]}`}const f=["application/pdf","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.ms-powerpoint","application/vnd.openxmlformats-officedocument.presentationml.presentation","text/plain","text/markdown","text/html","text/csv"],m=[".pdf",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".txt",".md",".html",".csv"];function z(){return[...f,...m].join(",")}export{m as DOCUMENT_EXTENSIONS,f as DOCUMENT_MIME_TYPES,y as deleteFile,M as formatFileSize,v as generateFileId,z as getDocumentAcceptString,d as getFileExtension,F as getFileIcon,u as uploadFile,w as uploadFiles};
@@ -1 +1 @@
1
- async function x(t,r={}){const{maxWidth:o=1920,maxHeight:a=1440,thumbWidth:d=300,thumbHeight:i=225,aspectRatio:e=4/3,quality:h=.85,transparentBackground:c=!0,crop:l}=r;return new Promise((f,s)=>{const n=new Image,u=new FileReader;u.onload=w=>{n.src=w.target?.result},u.onerror=()=>s(new Error("Failed to read file")),n.onload=async()=>{try{const{width:w,height:F}=g(l?l.width:n.width,l?l.height:n.height,o,a,e),m=await b(n,w,F,e,h,c,l),v=await b(n,d,i,e,.65,c,l);f({fullBlob:m,thumbBlob:v,width:w,height:F})}catch(w){s(w)}},n.onerror=()=>s(new Error("Failed to load image")),u.readAsDataURL(t)})}function g(t,r,o,a,d){let i=t,e=r;i>o&&(e=o/i*e,i=o),e>a&&(i=a/e*i,e=a);const h=i/e;return Math.abs(h-d)>.01&&(h>d?e=i/d:i=e*d),{width:Math.round(i),height:Math.round(e)}}async function b(t,r,o,a,d,i,e){const h=document.createElement("canvas"),c=h.getContext("2d");if(!c)throw new Error("Failed to get canvas context");h.width=r,h.height=o,i?c.clearRect(0,0,r,o):(c.fillStyle="#FFFFFF",c.fillRect(0,0,r,o));let l,f,s,n;if(e)l=e.x,f=e.y,s=e.width,n=e.height;else{const u=t.width/t.height;s=t.width,n=t.height,l=0,f=0,u>a?(s=t.height*a,l=(t.width-s)/2):u<a&&(n=t.width/a,f=(t.height-n)/2)}return c.drawImage(t,l,f,s,n,0,0,r,o),new Promise((u,w)=>{h.toBlob(F=>{F?u(F):w(new Error("Failed to convert canvas to blob"))},"image/webp",d)})}function y(t,r){return t.type.startsWith("image/")?r&&t.size>r?{valid:!1,error:`File size exceeds ${(r/1048576).toFixed(1)}MB limit`}:{valid:!0}:{valid:!1,error:"File must be an image"}}export{x as processImage,y as validateImageFile};
1
+ async function v(t,r={}){const{maxWidth:n=1920,maxHeight:o=1440,thumbWidth:d=300,thumbHeight:i=225,aspectRatio:e=4/3,quality:l=.85,transparentBackground:s=!0,crop:h}=r;return new Promise((u,c)=>{const a=new Image,g=new FileReader;g.onload=w=>{a.src=w.target?.result},g.onerror=()=>c(new Error("Failed to read file")),a.onload=async()=>{try{const{width:w,height:m}=x(h?h.width:a.width,h?h.height:a.height,n,o,e),b=await F(a,w,m,e,l,s,h),f=await F(a,d,i,e,.65,s,h);u({fullBlob:b,thumbBlob:f,width:w,height:m})}catch(w){c(w)}},a.onerror=()=>c(new Error("Failed to load image")),g.readAsDataURL(t)})}function x(t,r,n,o,d){let i=t,e=r;i>n&&(e=n/i*e,i=n),e>o&&(i=o/e*i,e=o);const l=i/e;return Math.abs(l-d)>.01&&(l>d?e=i/d:i=e*d),{width:Math.round(i),height:Math.round(e)}}async function F(t,r,n,o,d,i,e){const l=document.createElement("canvas"),s=l.getContext("2d");if(!s)throw new Error("Failed to get canvas context");l.width=r,l.height=n,i?s.clearRect(0,0,r,n):(s.fillStyle="#FFFFFF",s.fillRect(0,0,r,n));let h,u,c,a;if(e)h=e.x,u=e.y,c=e.width,a=e.height;else{const g=t.width/t.height;c=t.width,a=t.height,h=0,u=0,g>o?(c=t.height*o,h=(t.width-c)/2):g<o&&(a=t.width/o,u=(t.height-a)/2)}return s.drawImage(t,h,u,c,a,0,0,r,n),new Promise((g,w)=>{l.toBlob(m=>{m?g(m):w(new Error("Failed to convert canvas to blob"))},"image/webp",d)})}function y(t,r){return t.type.startsWith("image/")?r&&t.size>r?{valid:!1,error:`File size exceeds ${(r/1048576).toFixed(1)}MB limit`}:{valid:!0}:{valid:!1,error:"File must be an image"}}export{v as processImage,y as validateImageFile};
@@ -1 +1 @@
1
- import{handleError as _}from"@donotdev/core";import{uploadFileResumable as c,deleteFileByUrl as i,getFileUrl as m}from"@donotdev/firebase";function F(e){return e.replace(/[^a-zA-Z0-9.-]/g,"_").replace(/_{2,}/g,"_").toLowerCase()}async function N(e,l,b,h={}){const{storagePath:r="uploads/images",filename:f,onProgress:s}=h,p=Date.now(),t=(f||`${p}_${F(b)}`).replace(/\.[^/.]+$/,""),w=`${r}/${t}_full.webp`,g=`${r}/${t}_thumb.webp`;try{const u=s?a=>{s({bytesTransferred:a.bytesTransferred,totalBytes:a.totalBytes*2,progress:a.progress*.5})}:void 0,o=new File([e],`${t}_full.webp`,{type:"image/webp"}),{promise:n}=c(o,{basePath:r,filename:`${t}_full.webp`,onProgress:u,metadata:{contentType:"image/webp"}}),d=(await n).url,y=s?a=>{s({bytesTransferred:a.bytesTransferred+e.size,totalBytes:e.size+l.size,progress:50+a.progress*.5})}:void 0,P=new File([l],`${t}_thumb.webp`,{type:"image/webp"}),{promise:U}=c(P,{basePath:r,filename:`${t}_thumb.webp`,onProgress:y,metadata:{contentType:"image/webp"}}),$=(await U).url;return{fullUrl:d,thumbUrl:$}}catch(u){try{const o=await m(w).catch(()=>null),n=await m(g).catch(()=>null);o&&await i(o).catch(()=>{}),n&&await i(n).catch(()=>{})}catch{}throw u}}async function k(e){try{await Promise.all([i(e.fullUrl),i(e.thumbUrl)])}catch(l){throw _(l,{userMessage:"Failed to delete image",severity:"error",context:{fullUrl:e.fullUrl,thumbUrl:e.thumbUrl}}),l}}export{k as deleteImage,N as uploadImage};
1
+ import{handleError as P}from"@donotdev/core";import{uploadFileResumable as u,deleteFileByUrl as n,getFileUrl as c}from"@donotdev/firebase";function F(e){return e.replace(/[^a-zA-Z0-9.-]/g,"_").replace(/_{2,}/g,"_").toLowerCase()}async function T(e,r,m,b={}){const{storagePath:l="uploads/images",filename:w,onProgress:s}=b,g=Date.now(),t=(w||`${g}_${F(m)}`).replace(/\.[^/.]+$/,""),f=`${l}/${t}_full.webp`,h=`${l}/${t}_thumb.webp`;try{const p=s?a=>{s({bytesTransferred:a.bytesTransferred,totalBytes:a.totalBytes*2,progress:a.progress*.5})}:void 0,o=new File([e],`${t}_full.webp`,{type:"image/webp"}),{promise:i}=u(o,{basePath:l,filename:`${t}_full.webp`,onProgress:p,metadata:{contentType:"image/webp"}}),y=(await i).url,d=s?a=>{s({bytesTransferred:a.bytesTransferred+e.size,totalBytes:e.size+r.size,progress:50+a.progress*.5})}:void 0,$=new File([r],`${t}_thumb.webp`,{type:"image/webp"}),{promise:U}=u($,{basePath:l,filename:`${t}_thumb.webp`,onProgress:d,metadata:{contentType:"image/webp"}}),_=(await U).url;return{fullUrl:y,thumbUrl:_}}catch(p){try{const o=await c(f).catch(()=>null),i=await c(h).catch(()=>null);o&&await n(o).catch(()=>{}),i&&await n(i).catch(()=>{})}catch{}throw p}}async function z(e){try{await Promise.all([n(e.fullUrl),n(e.thumbUrl)])}catch(r){throw P(r,{userMessage:"Failed to delete image",severity:"error",context:{fullUrl:e.fullUrl,thumbUrl:e.thumbUrl}}),r}}export{z as deleteImage,T as uploadImage};
@@ -1 +1 @@
1
- async function d(e){const t=await e.arrayBuffer(),r=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(r)).map(o=>o.toString(16).padStart(2,"0")).join("")}function h(e){return URL.createObjectURL(e)}function u(e){e.startsWith("blob:")&&URL.revokeObjectURL(e)}async function l(e){return new Promise((t,r)=>{const a=new Image,o=new FileReader;o.onload=n=>{if(!n.target?.result){r(new Error("Failed to read file"));return}a.src=n.target.result},o.onerror=()=>r(new Error("Failed to read file")),a.onload=()=>{const n=document.createElement("canvas"),i=n.getContext("2d");if(!i){r(new Error("Failed to get canvas context"));return}n.width=a.height,n.height=a.width,i.translate(n.width/2,n.height/2),i.rotate(Math.PI/2),i.drawImage(a,-a.width/2,-a.height/2),n.toBlob(s=>{if(s){const c=new File([s],e.name,{type:e.type,lastModified:Date.now()});t(c)}else r(new Error("Failed to create blob from canvas"))},e.type,.95)},a.onerror=()=>r(new Error("Failed to load image")),o.readAsDataURL(e)})}class f{undoStack=[];redoStack=[];maxStackSize=50;push(t){this.undoStack.push(t),this.undoStack.length>this.maxStackSize&&this.undoStack.shift(),this.redoStack=[]}undo(){const t=this.undoStack.pop();return t?(this.redoStack.push(t),t):null}redo(){const t=this.redoStack.pop();return t?(this.undoStack.push(t),t):null}canUndo(){return this.undoStack.length>0}canRedo(){return this.redoStack.length>0}clear(){this.undoStack=[],this.redoStack=[]}}function g(e,t){return e.filter(r=>r.hash===t)}function p(){return`img_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}export{f as UndoRedoManager,h as createPreviewURL,g as findDuplicatesByHash,d as generateFileHash,p as generateImageId,u as revokePreviewURL,l as rotateImage90};
1
+ async function d(e){const t=await e.arrayBuffer(),r=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(r)).map(a=>a.toString(16).padStart(2,"0")).join("")}function h(e){return URL.createObjectURL(e)}function u(e){e.startsWith("blob:")&&URL.revokeObjectURL(e)}async function l(e){return new Promise((t,r)=>{const a=new Image,i=new FileReader;i.onload=n=>{if(!n.target?.result){r(new Error("Failed to read file"));return}a.src=n.target.result},i.onerror=()=>r(new Error("Failed to read file")),a.onload=()=>{const n=document.createElement("canvas"),o=n.getContext("2d");if(!o){r(new Error("Failed to get canvas context"));return}n.width=a.height,n.height=a.width,o.translate(n.width/2,n.height/2),o.rotate(Math.PI/2),o.drawImage(a,-a.width/2,-a.height/2),n.toBlob(s=>{if(s){const c=new File([s],e.name,{type:e.type,lastModified:Date.now()});t(c)}else r(new Error("Failed to create blob from canvas"))},e.type,.95)},a.onerror=()=>r(new Error("Failed to load image")),i.readAsDataURL(e)})}class g{undoStack=[];redoStack=[];maxStackSize=50;push(t){this.undoStack.push(t),this.undoStack.length>this.maxStackSize&&this.undoStack.shift(),this.redoStack=[]}undo(){const t=this.undoStack.pop();return t?(this.redoStack.push(t),t):null}redo(){const t=this.redoStack.pop();return t?(this.undoStack.push(t),t):null}canUndo(){return this.undoStack.length>0}canRedo(){return this.redoStack.length>0}clear(){this.undoStack=[],this.redoStack=[]}}function S(e,t){return e.filter(r=>r.hash===t)}function w(){return`img_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}export{g as UndoRedoManager,h as createPreviewURL,S as findDuplicatesByHash,d as generateFileHash,w as generateImageId,u as revokePreviewURL,l as rotateImage90};
@@ -2,11 +2,11 @@
2
2
  * @fileoverview Optimistic merge utility
3
3
  * @description Merges TanStack Query results with optimistic operations from store
4
4
  *
5
- * @version 0.0.1
5
+ * @version 0.1.0
6
6
  * @since 0.0.1
7
7
  * @author AMBROISE PARK Consulting
8
8
  */
9
- import type { OptimisticMeta } from '../CrudStore';
9
+ import type { OptimisticMeta } from '../types';
10
10
  interface WithId {
11
11
  id: string;
12
12
  [key: string]: unknown;
@@ -14,14 +14,13 @@ interface WithId {
14
14
  /**
15
15
  * Merge query results with optimistic operations.
16
16
  * - Filter out items marked for deletion
17
- * - Apply optimistic updates
17
+ * - Apply optimistic updates from metadata
18
18
  * - Append optimistic adds (temp IDs)
19
19
  *
20
20
  * @param queryData - Data from TanStack Query cache
21
- * @param optimistic - Optimistic operation metadata from store
22
- * @param storeData - Current store data (for optimistic values)
21
+ * @param optimistic - Optimistic operation metadata from store (contains optimisticData)
23
22
  * @returns Merged array with optimistic changes applied
24
23
  */
25
- export declare function mergeWithOptimistic<T extends WithId>(queryData: T[], optimistic: Record<string, OptimisticMeta>, storeData?: Record<string, unknown>): T[];
24
+ export declare function mergeWithOptimistic<T extends WithId>(queryData: T[], optimistic: Record<string, OptimisticMeta>): T[];
26
25
  export {};
27
26
  //# sourceMappingURL=mergeWithOptimistic.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mergeWithOptimistic.d.ts","sourceRoot":"","sources":["../../src/utils/mergeWithOptimistic.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,UAAU,MAAM;IACd,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,EAClD,SAAS,EAAE,CAAC,EAAE,EACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EAC1C,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,CAAC,EAAE,CA4BL"}
1
+ {"version":3,"file":"mergeWithOptimistic.d.ts","sourceRoot":"","sources":["../../src/utils/mergeWithOptimistic.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,UAAU,MAAM;IACd,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,EAClD,SAAS,EAAE,CAAC,EAAE,EACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GACzC,CAAC,EAAE,CA4BL"}