@blueprint-ts/core 4.1.0-beta.1 → 4.1.0-beta.3

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 (507) hide show
  1. package/dist/bulkRequests/BulkRequestEvent.enum.d.ts +4 -0
  2. package/dist/bulkRequests/BulkRequestEvent.enum.js +5 -0
  3. package/dist/bulkRequests/BulkRequestSender.d.ts +31 -0
  4. package/dist/bulkRequests/BulkRequestSender.js +161 -0
  5. package/dist/bulkRequests/BulkRequestWrapper.d.ts +15 -0
  6. package/dist/bulkRequests/BulkRequestWrapper.js +50 -0
  7. package/dist/bulkRequests/index.d.ts +5 -0
  8. package/dist/bulkRequests/index.js +5 -0
  9. package/{src/laravel/pagination/contracts/PaginationResponseBodyContract.ts → dist/laravel/pagination/contracts/PaginationResponseBodyContract.d.ts} +4 -4
  10. package/dist/laravel/pagination/contracts/PaginationResponseBodyContract.js +1 -0
  11. package/dist/laravel/pagination/dataDrivers/RequestDriver.d.ts +10 -0
  12. package/dist/laravel/pagination/dataDrivers/RequestDriver.js +18 -0
  13. package/dist/laravel/pagination/index.d.ts +4 -0
  14. package/dist/laravel/pagination/index.js +2 -0
  15. package/dist/laravel/requests/JsonBaseRequest.d.ts +14 -0
  16. package/dist/laravel/requests/JsonBaseRequest.js +15 -0
  17. package/dist/laravel/requests/PaginationJsonBaseRequest.d.ts +8 -0
  18. package/dist/laravel/requests/PaginationJsonBaseRequest.js +13 -0
  19. package/dist/laravel/requests/index.d.ts +7 -0
  20. package/dist/laravel/requests/index.js +5 -0
  21. package/dist/laravel/requests/responses/JsonResponse.d.ts +5 -0
  22. package/dist/laravel/requests/responses/JsonResponse.js +6 -0
  23. package/dist/laravel/requests/responses/PaginationResponse.d.ts +7 -0
  24. package/dist/laravel/requests/responses/PaginationResponse.js +9 -0
  25. package/dist/pagination/BasePaginator.d.ts +19 -0
  26. package/dist/pagination/BasePaginator.js +65 -0
  27. package/dist/pagination/InfiniteScroller.d.ts +6 -0
  28. package/dist/pagination/InfiniteScroller.js +17 -0
  29. package/dist/pagination/PageAwarePaginator.d.ts +32 -0
  30. package/dist/pagination/PageAwarePaginator.js +86 -0
  31. package/dist/pagination/StatePaginator.d.ts +25 -0
  32. package/dist/pagination/StatePaginator.js +55 -0
  33. package/dist/pagination/contracts/BaseViewDriverContract.d.ts +6 -0
  34. package/dist/pagination/contracts/BaseViewDriverContract.js +1 -0
  35. package/{src/pagination/contracts/BaseViewDriverFactoryContract.ts → dist/pagination/contracts/BaseViewDriverFactoryContract.d.ts} +2 -3
  36. package/dist/pagination/contracts/BaseViewDriverFactoryContract.js +1 -0
  37. package/dist/pagination/contracts/PaginateableRequestContract.d.ts +4 -0
  38. package/dist/pagination/contracts/PaginateableRequestContract.js +1 -0
  39. package/dist/pagination/contracts/PaginationDataDriverContract.d.ts +4 -0
  40. package/dist/pagination/contracts/PaginationDataDriverContract.js +1 -0
  41. package/{src/pagination/contracts/PaginationResponseContract.ts → dist/pagination/contracts/PaginationResponseContract.d.ts} +3 -5
  42. package/dist/pagination/contracts/PaginationResponseContract.js +1 -0
  43. package/{src/pagination/contracts/PaginatorLoadDataOptions.ts → dist/pagination/contracts/PaginatorLoadDataOptions.d.ts} +2 -2
  44. package/dist/pagination/contracts/PaginatorLoadDataOptions.js +1 -0
  45. package/{src/pagination/contracts/StatePaginationDataDriverContract.ts → dist/pagination/contracts/StatePaginationDataDriverContract.d.ts} +2 -3
  46. package/dist/pagination/contracts/StatePaginationDataDriverContract.js +1 -0
  47. package/dist/pagination/contracts/ViewDriverContract.d.ts +9 -0
  48. package/dist/pagination/contracts/ViewDriverContract.js +1 -0
  49. package/dist/pagination/contracts/ViewDriverFactoryContract.d.ts +4 -0
  50. package/dist/pagination/contracts/ViewDriverFactoryContract.js +1 -0
  51. package/dist/pagination/dataDrivers/ArrayDriver.d.ts +9 -0
  52. package/dist/pagination/dataDrivers/ArrayDriver.js +20 -0
  53. package/dist/pagination/dtos/PaginationDataDto.d.ts +7 -0
  54. package/dist/pagination/dtos/PaginationDataDto.js +12 -0
  55. package/dist/pagination/dtos/StatePaginationDataDto.d.ts +7 -0
  56. package/dist/pagination/dtos/StatePaginationDataDto.js +13 -0
  57. package/dist/pagination/factories/VueBaseViewDriverFactory.d.ts +5 -0
  58. package/dist/pagination/factories/VueBaseViewDriverFactory.js +6 -0
  59. package/dist/pagination/factories/VuePaginationDriverFactory.d.ts +5 -0
  60. package/dist/pagination/factories/VuePaginationDriverFactory.js +6 -0
  61. package/dist/pagination/frontendDrivers/VueBaseViewDriver.d.ts +11 -0
  62. package/dist/pagination/frontendDrivers/VueBaseViewDriver.js +19 -0
  63. package/dist/pagination/frontendDrivers/VuePaginationDriver.d.ts +21 -0
  64. package/dist/pagination/frontendDrivers/VuePaginationDriver.js +41 -0
  65. package/dist/pagination/index.d.ts +22 -0
  66. package/dist/pagination/index.js +13 -0
  67. package/dist/persistenceDrivers/LocalStorageDriver.d.ts +9 -0
  68. package/dist/persistenceDrivers/LocalStorageDriver.js +18 -0
  69. package/dist/persistenceDrivers/NonPersistentDriver.d.ts +7 -0
  70. package/dist/persistenceDrivers/NonPersistentDriver.js +8 -0
  71. package/dist/persistenceDrivers/SessionStorageDriver.d.ts +9 -0
  72. package/dist/persistenceDrivers/SessionStorageDriver.js +18 -0
  73. package/dist/persistenceDrivers/index.d.ts +6 -0
  74. package/dist/persistenceDrivers/index.js +4 -0
  75. package/dist/persistenceDrivers/types/PersistenceDriver.d.ts +5 -0
  76. package/dist/persistenceDrivers/types/PersistenceDriver.js +1 -0
  77. package/dist/requests/BaseRequest.d.ts +62 -0
  78. package/dist/requests/BaseRequest.js +224 -0
  79. package/dist/requests/ErrorHandler.d.ts +11 -0
  80. package/dist/requests/ErrorHandler.js +127 -0
  81. package/dist/requests/RequestConcurrencyMode.enum.d.ts +6 -0
  82. package/dist/requests/RequestConcurrencyMode.enum.js +7 -0
  83. package/dist/requests/RequestErrorRouter.d.ts +38 -0
  84. package/dist/requests/RequestErrorRouter.js +38 -0
  85. package/dist/requests/RequestEvents.enum.d.ts +4 -0
  86. package/dist/requests/RequestEvents.enum.js +5 -0
  87. package/dist/requests/RequestMethod.enum.d.ts +8 -0
  88. package/dist/requests/RequestMethod.enum.js +9 -0
  89. package/dist/requests/bodies/BinaryBody.d.ts +10 -0
  90. package/dist/requests/bodies/BinaryBody.js +22 -0
  91. package/dist/requests/bodies/FormDataBody.d.ts +14 -0
  92. package/dist/requests/bodies/FormDataBody.js +60 -0
  93. package/dist/requests/bodies/JsonBody.d.ts +8 -0
  94. package/dist/requests/bodies/JsonBody.js +13 -0
  95. package/{src/requests/contracts/AbortableRequestContract.ts → dist/requests/contracts/AbortableRequestContract.d.ts} +1 -1
  96. package/dist/requests/contracts/AbortableRequestContract.js +1 -0
  97. package/dist/requests/contracts/BaseRequestContract.d.ts +23 -0
  98. package/dist/requests/contracts/BaseRequestContract.js +1 -0
  99. package/dist/requests/contracts/BodyContract.d.ts +6 -0
  100. package/dist/requests/contracts/BodyContract.js +1 -0
  101. package/dist/requests/contracts/BodyFactoryContract.d.ts +4 -0
  102. package/dist/requests/contracts/BodyFactoryContract.js +1 -0
  103. package/dist/requests/contracts/DriverConfigContract.d.ts +8 -0
  104. package/dist/requests/contracts/DriverConfigContract.js +1 -0
  105. package/dist/requests/contracts/HeadersContract.d.ts +7 -0
  106. package/dist/requests/contracts/HeadersContract.js +1 -0
  107. package/dist/requests/contracts/RequestDriverContract.d.ts +8 -0
  108. package/dist/requests/contracts/RequestDriverContract.js +1 -0
  109. package/dist/requests/contracts/RequestLoaderContract.d.ts +4 -0
  110. package/dist/requests/contracts/RequestLoaderContract.js +1 -0
  111. package/{src/requests/contracts/RequestLoaderFactoryContract.ts → dist/requests/contracts/RequestLoaderFactoryContract.d.ts} +2 -3
  112. package/dist/requests/contracts/RequestLoaderFactoryContract.js +1 -0
  113. package/dist/requests/contracts/ResponseContract.d.ts +5 -0
  114. package/dist/requests/contracts/ResponseContract.js +1 -0
  115. package/dist/requests/drivers/contracts/ResponseHandlerContract.d.ts +9 -0
  116. package/dist/requests/drivers/contracts/ResponseHandlerContract.js +1 -0
  117. package/dist/requests/drivers/fetch/FetchDriver.d.ts +26 -0
  118. package/dist/requests/drivers/fetch/FetchDriver.js +73 -0
  119. package/dist/requests/drivers/fetch/FetchResponse.d.ts +12 -0
  120. package/dist/requests/drivers/fetch/FetchResponse.js +38 -0
  121. package/dist/requests/drivers/xhr/XMLHttpRequestDriver.d.ts +13 -0
  122. package/dist/requests/drivers/xhr/XMLHttpRequestDriver.js +107 -0
  123. package/dist/requests/drivers/xhr/XMLHttpRequestResponse.d.ts +17 -0
  124. package/dist/requests/drivers/xhr/XMLHttpRequestResponse.js +84 -0
  125. package/dist/requests/exceptions/BadGatewayException.d.ts +3 -0
  126. package/dist/requests/exceptions/BadGatewayException.js +3 -0
  127. package/dist/requests/exceptions/BadRequestException.d.ts +3 -0
  128. package/dist/requests/exceptions/BadRequestException.js +3 -0
  129. package/dist/requests/exceptions/ConflictException.d.ts +3 -0
  130. package/dist/requests/exceptions/ConflictException.js +3 -0
  131. package/dist/requests/exceptions/ForbiddenException.d.ts +3 -0
  132. package/dist/requests/exceptions/ForbiddenException.js +3 -0
  133. package/dist/requests/exceptions/GatewayTimeoutException.d.ts +3 -0
  134. package/dist/requests/exceptions/GatewayTimeoutException.js +3 -0
  135. package/dist/requests/exceptions/GoneException.d.ts +3 -0
  136. package/dist/requests/exceptions/GoneException.js +3 -0
  137. package/dist/requests/exceptions/InvalidJsonException.d.ts +7 -0
  138. package/dist/requests/exceptions/InvalidJsonException.js +10 -0
  139. package/dist/requests/exceptions/LockedException.d.ts +3 -0
  140. package/dist/requests/exceptions/LockedException.js +3 -0
  141. package/dist/requests/exceptions/MethodNotAllowedException.d.ts +3 -0
  142. package/dist/requests/exceptions/MethodNotAllowedException.js +3 -0
  143. package/dist/requests/exceptions/NoResponseReceivedException.d.ts +3 -0
  144. package/{src/requests/exceptions/NoResponseReceivedException.ts → dist/requests/exceptions/NoResponseReceivedException.js} +3 -3
  145. package/dist/requests/exceptions/NotFoundException.d.ts +3 -0
  146. package/dist/requests/exceptions/NotFoundException.js +3 -0
  147. package/dist/requests/exceptions/NotImplementedException.d.ts +3 -0
  148. package/dist/requests/exceptions/NotImplementedException.js +3 -0
  149. package/dist/requests/exceptions/PageExpiredException.d.ts +3 -0
  150. package/dist/requests/exceptions/PageExpiredException.js +3 -0
  151. package/dist/requests/exceptions/PayloadTooLargeException.d.ts +3 -0
  152. package/dist/requests/exceptions/PayloadTooLargeException.js +3 -0
  153. package/dist/requests/exceptions/PreconditionFailedException.d.ts +3 -0
  154. package/dist/requests/exceptions/PreconditionFailedException.js +3 -0
  155. package/dist/requests/exceptions/RequestTimeoutException.d.ts +3 -0
  156. package/dist/requests/exceptions/RequestTimeoutException.js +3 -0
  157. package/dist/requests/exceptions/ResponseBodyException.d.ts +7 -0
  158. package/dist/requests/exceptions/ResponseBodyException.js +10 -0
  159. package/dist/requests/exceptions/ResponseException.d.ts +6 -0
  160. package/dist/requests/exceptions/ResponseException.js +9 -0
  161. package/dist/requests/exceptions/ServerErrorException.d.ts +3 -0
  162. package/dist/requests/exceptions/ServerErrorException.js +3 -0
  163. package/dist/requests/exceptions/ServiceUnavailableException.d.ts +3 -0
  164. package/dist/requests/exceptions/ServiceUnavailableException.js +3 -0
  165. package/dist/requests/exceptions/StaleResponseException.d.ts +5 -0
  166. package/dist/requests/exceptions/StaleResponseException.js +10 -0
  167. package/dist/requests/exceptions/TooManyRequestsException.d.ts +3 -0
  168. package/dist/requests/exceptions/TooManyRequestsException.js +3 -0
  169. package/dist/requests/exceptions/UnauthorizedException.d.ts +3 -0
  170. package/dist/requests/exceptions/UnauthorizedException.js +3 -0
  171. package/dist/requests/exceptions/UnsupportedMediaTypeException.d.ts +3 -0
  172. package/dist/requests/exceptions/UnsupportedMediaTypeException.js +3 -0
  173. package/dist/requests/exceptions/ValidationException.d.ts +3 -0
  174. package/dist/requests/exceptions/ValidationException.js +3 -0
  175. package/dist/requests/exceptions/index.d.ts +25 -0
  176. package/dist/requests/exceptions/index.js +25 -0
  177. package/dist/requests/factories/BinaryBodyFactory.d.ts +8 -0
  178. package/dist/requests/factories/BinaryBodyFactory.js +9 -0
  179. package/dist/requests/factories/FormDataFactory.d.ts +12 -0
  180. package/dist/requests/factories/FormDataFactory.js +6 -0
  181. package/dist/requests/factories/JsonBodyFactory.d.ts +5 -0
  182. package/dist/requests/factories/JsonBodyFactory.js +6 -0
  183. package/dist/requests/index.d.ts +31 -0
  184. package/dist/requests/index.js +19 -0
  185. package/dist/requests/responses/BaseResponse.d.ts +14 -0
  186. package/dist/requests/responses/BaseResponse.js +36 -0
  187. package/dist/requests/responses/BlobResponse.d.ts +7 -0
  188. package/dist/requests/responses/BlobResponse.js +16 -0
  189. package/dist/requests/responses/JsonResponse.d.ts +5 -0
  190. package/dist/requests/responses/JsonResponse.js +12 -0
  191. package/dist/requests/responses/PlainTextResponse.d.ts +5 -0
  192. package/dist/requests/responses/PlainTextResponse.js +12 -0
  193. package/{src/requests/types/RequestConcurrencyOptions.ts → dist/requests/types/RequestConcurrencyOptions.d.ts} +4 -5
  194. package/dist/requests/types/RequestConcurrencyOptions.js +1 -0
  195. package/dist/requests/types/RequestUploadProgress.d.ts +6 -0
  196. package/dist/requests/types/RequestUploadProgress.js +1 -0
  197. package/dist/support/DeferredPromise.d.ts +37 -0
  198. package/dist/support/DeferredPromise.js +55 -0
  199. package/dist/support/helpers.d.ts +5 -0
  200. package/dist/support/helpers.js +69 -0
  201. package/{src/support/index.ts → dist/support/index.d.ts} +3 -4
  202. package/dist/support/index.js +3 -0
  203. package/dist/vue/composables/useConfirmDialog.d.ts +20 -0
  204. package/dist/vue/composables/useConfirmDialog.js +52 -0
  205. package/dist/vue/composables/useGlobalCheckbox.d.ts +13 -0
  206. package/dist/vue/composables/useGlobalCheckbox.js +123 -0
  207. package/dist/vue/composables/useIsEmpty.d.ts +4 -0
  208. package/dist/vue/composables/useIsEmpty.js +27 -0
  209. package/dist/vue/composables/useIsOpen.d.ts +5 -0
  210. package/dist/vue/composables/useIsOpen.js +25 -0
  211. package/dist/vue/composables/useIsOpenFromVar.d.ts +6 -0
  212. package/dist/vue/composables/useIsOpenFromVar.js +45 -0
  213. package/dist/vue/composables/useModelWrapper.d.ts +9 -0
  214. package/dist/vue/composables/useModelWrapper.js +18 -0
  215. package/dist/vue/composables/useOnOpen.d.ts +7 -0
  216. package/dist/vue/composables/useOnOpen.js +25 -0
  217. package/{src/vue/contracts/ModelValueOptions.ts → dist/vue/contracts/ModelValueOptions.d.ts} +1 -1
  218. package/dist/vue/contracts/ModelValueOptions.js +1 -0
  219. package/dist/vue/contracts/ModelValueProps.d.ts +3 -0
  220. package/dist/vue/contracts/ModelValueProps.js +1 -0
  221. package/dist/vue/forms/BaseForm.d.ts +162 -0
  222. package/dist/vue/forms/BaseForm.js +997 -0
  223. package/dist/vue/forms/PropertyAwareArray.d.ts +53 -0
  224. package/dist/vue/forms/PropertyAwareArray.js +54 -0
  225. package/{src/vue/forms/index.ts → dist/vue/forms/index.d.ts} +9 -11
  226. package/dist/vue/forms/index.js +6 -0
  227. package/dist/vue/forms/types/PersistedForm.d.ts +6 -0
  228. package/dist/vue/forms/types/PersistedForm.js +1 -0
  229. package/dist/vue/forms/validation/ValidationMode.enum.d.ts +11 -0
  230. package/dist/vue/forms/validation/ValidationMode.enum.js +14 -0
  231. package/dist/vue/forms/validation/index.d.ts +12 -0
  232. package/dist/vue/forms/validation/index.js +9 -0
  233. package/dist/vue/forms/validation/rules/BaseRule.d.ts +5 -0
  234. package/dist/vue/forms/validation/rules/BaseRule.js +5 -0
  235. package/dist/vue/forms/validation/rules/ConfirmedRule.d.ts +10 -0
  236. package/dist/vue/forms/validation/rules/ConfirmedRule.js +26 -0
  237. package/dist/vue/forms/validation/rules/EmailRule.d.ts +7 -0
  238. package/dist/vue/forms/validation/rules/EmailRule.js +19 -0
  239. package/dist/vue/forms/validation/rules/JsonRule.d.ts +7 -0
  240. package/dist/vue/forms/validation/rules/JsonRule.js +25 -0
  241. package/dist/vue/forms/validation/rules/MinRule.d.ts +26 -0
  242. package/dist/vue/forms/validation/rules/MinRule.js +52 -0
  243. package/dist/vue/forms/validation/rules/RequiredRule.d.ts +7 -0
  244. package/dist/vue/forms/validation/rules/RequiredRule.js +16 -0
  245. package/dist/vue/forms/validation/rules/UrlRule.d.ts +7 -0
  246. package/dist/vue/forms/validation/rules/UrlRule.js +22 -0
  247. package/{src/vue/forms/validation/types/BidirectionalRule.ts → dist/vue/forms/validation/types/BidirectionalRule.d.ts} +4 -4
  248. package/dist/vue/forms/validation/types/BidirectionalRule.js +1 -0
  249. package/dist/vue/forms/validation/types/ValidationRules.d.ts +11 -0
  250. package/dist/vue/forms/validation/types/ValidationRules.js +1 -0
  251. package/dist/vue/index.d.ts +11 -0
  252. package/dist/vue/index.js +10 -0
  253. package/dist/vue/requests/factories/VueRequestLoaderFactory.d.ts +6 -0
  254. package/dist/vue/requests/factories/VueRequestLoaderFactory.js +6 -0
  255. package/{src/vue/requests/index.ts → dist/vue/requests/index.d.ts} +4 -5
  256. package/dist/vue/requests/index.js +4 -0
  257. package/dist/vue/requests/loaders/VueRequestBatchLoader.d.ts +12 -0
  258. package/dist/vue/requests/loaders/VueRequestBatchLoader.js +29 -0
  259. package/dist/vue/requests/loaders/VueRequestLoader.d.ts +8 -0
  260. package/dist/vue/requests/loaders/VueRequestLoader.js +12 -0
  261. package/dist/vue/router/routeResourceBinding/RouteResourceBoundView.d.ts +57 -0
  262. package/dist/vue/router/routeResourceBinding/RouteResourceBoundView.js +135 -0
  263. package/dist/vue/router/routeResourceBinding/RouteResourceRequestResolver.d.ts +6 -0
  264. package/dist/vue/router/routeResourceBinding/RouteResourceRequestResolver.js +20 -0
  265. package/dist/vue/router/routeResourceBinding/defineRoute.d.ts +23 -0
  266. package/dist/vue/router/routeResourceBinding/defineRoute.js +42 -0
  267. package/dist/vue/router/routeResourceBinding/index.d.ts +8 -0
  268. package/dist/vue/router/routeResourceBinding/index.js +6 -0
  269. package/dist/vue/router/routeResourceBinding/installRouteInjection.d.ts +14 -0
  270. package/dist/vue/router/routeResourceBinding/installRouteInjection.js +133 -0
  271. package/dist/vue/router/routeResourceBinding/types.d.ts +55 -0
  272. package/dist/vue/router/routeResourceBinding/types.js +1 -0
  273. package/dist/vue/router/routeResourceBinding/useRouteResource.d.ts +8 -0
  274. package/dist/vue/router/routeResourceBinding/useRouteResource.js +29 -0
  275. package/dist/vue/state/State.d.ts +75 -0
  276. package/dist/vue/state/State.js +267 -0
  277. package/dist/vue/state/index.d.ts +2 -0
  278. package/dist/vue/state/index.js +2 -0
  279. package/package.json +81 -23
  280. package/.editorconfig +0 -508
  281. package/.eslintrc.cjs +0 -15
  282. package/.prettierrc.json +0 -8
  283. package/CHANGELOG.md +0 -213
  284. package/docker-compose.yaml +0 -8
  285. package/docs/.vitepress/config.ts +0 -124
  286. package/docs/index.md +0 -13
  287. package/docs/laravel/pagination.md +0 -67
  288. package/docs/laravel/requests.md +0 -62
  289. package/docs/services/pagination/index.md +0 -46
  290. package/docs/services/pagination/infinite-scroller.md +0 -20
  291. package/docs/services/pagination/page-aware.md +0 -51
  292. package/docs/services/pagination/state-pagination.md +0 -77
  293. package/docs/services/pagination/updating-rows.md +0 -52
  294. package/docs/services/persistence/index.md +0 -46
  295. package/docs/services/requests/abort-requests.md +0 -29
  296. package/docs/services/requests/bulk-requests.md +0 -70
  297. package/docs/services/requests/concurrency.md +0 -58
  298. package/docs/services/requests/drivers.md +0 -115
  299. package/docs/services/requests/error-handling.md +0 -153
  300. package/docs/services/requests/events.md +0 -53
  301. package/docs/services/requests/file-uploads.md +0 -105
  302. package/docs/services/requests/getting-started.md +0 -201
  303. package/docs/services/requests/headers.md +0 -40
  304. package/docs/services/requests/loading.md +0 -63
  305. package/docs/services/requests/request-bodies.md +0 -61
  306. package/docs/services/requests/responses.md +0 -34
  307. package/docs/services/support/deferred-promise.md +0 -63
  308. package/docs/services/support/helpers.md +0 -77
  309. package/docs/services/support/index.md +0 -6
  310. package/docs/upgrading/v1-to-v2.md +0 -64
  311. package/docs/upgrading/v2-to-v3.md +0 -52
  312. package/docs/upgrading/v3-to-v4.md +0 -214
  313. package/docs/upgrading.md +0 -0
  314. package/docs/vue/composables/use-confirm-dialog.md +0 -96
  315. package/docs/vue/composables/use-global-checkbox.md +0 -73
  316. package/docs/vue/composables/use-is-empty.md +0 -26
  317. package/docs/vue/composables/use-is-open-from-var.md +0 -32
  318. package/docs/vue/composables/use-is-open.md +0 -28
  319. package/docs/vue/composables/use-model-wrapper.md +0 -29
  320. package/docs/vue/composables/use-on-open.md +0 -26
  321. package/docs/vue/forms/arrays.md +0 -102
  322. package/docs/vue/forms/errors.md +0 -52
  323. package/docs/vue/forms/index.md +0 -99
  324. package/docs/vue/forms/payloads.md +0 -99
  325. package/docs/vue/forms/persistence.md +0 -19
  326. package/docs/vue/forms/state-and-properties.md +0 -26
  327. package/docs/vue/forms/utilities.md +0 -27
  328. package/docs/vue/forms/validation.md +0 -189
  329. package/docs/vue/requests/loading.md +0 -51
  330. package/docs/vue/router/route-resource-binding.md +0 -240
  331. package/docs/vue/state.md +0 -309
  332. package/env.d.ts +0 -1
  333. package/eslint.config.js +0 -15
  334. package/release-tool.json +0 -26
  335. package/src/bulkRequests/BulkRequestEvent.enum.ts +0 -4
  336. package/src/bulkRequests/BulkRequestSender.ts +0 -196
  337. package/src/bulkRequests/BulkRequestWrapper.ts +0 -49
  338. package/src/bulkRequests/index.ts +0 -6
  339. package/src/laravel/pagination/dataDrivers/RequestDriver.ts +0 -30
  340. package/src/laravel/pagination/index.ts +0 -6
  341. package/src/laravel/requests/JsonBaseRequest.ts +0 -35
  342. package/src/laravel/requests/PaginationJsonBaseRequest.ts +0 -29
  343. package/src/laravel/requests/index.ts +0 -9
  344. package/src/laravel/requests/responses/JsonResponse.ts +0 -8
  345. package/src/laravel/requests/responses/PaginationResponse.ts +0 -16
  346. package/src/pagination/BasePaginator.ts +0 -94
  347. package/src/pagination/InfiniteScroller.ts +0 -22
  348. package/src/pagination/PageAwarePaginator.ts +0 -132
  349. package/src/pagination/StatePaginator.ts +0 -86
  350. package/src/pagination/contracts/BaseViewDriverContract.ts +0 -6
  351. package/src/pagination/contracts/PaginateableRequestContract.ts +0 -13
  352. package/src/pagination/contracts/PaginationDataDriverContract.ts +0 -5
  353. package/src/pagination/contracts/ViewDriverContract.ts +0 -10
  354. package/src/pagination/contracts/ViewDriverFactoryContract.ts +0 -5
  355. package/src/pagination/dataDrivers/ArrayDriver.ts +0 -28
  356. package/src/pagination/dtos/PaginationDataDto.ts +0 -14
  357. package/src/pagination/dtos/StatePaginationDataDto.ts +0 -19
  358. package/src/pagination/factories/VueBaseViewDriverFactory.ts +0 -9
  359. package/src/pagination/factories/VuePaginationDriverFactory.ts +0 -9
  360. package/src/pagination/frontendDrivers/VueBaseViewDriver.ts +0 -28
  361. package/src/pagination/frontendDrivers/VuePaginationDriver.ts +0 -61
  362. package/src/pagination/index.ts +0 -46
  363. package/src/persistenceDrivers/LocalStorageDriver.ts +0 -22
  364. package/src/persistenceDrivers/NonPersistentDriver.ts +0 -12
  365. package/src/persistenceDrivers/SessionStorageDriver.ts +0 -22
  366. package/src/persistenceDrivers/index.ts +0 -8
  367. package/src/persistenceDrivers/types/PersistenceDriver.ts +0 -5
  368. package/src/requests/BaseRequest.ts +0 -321
  369. package/src/requests/ErrorHandler.ts +0 -144
  370. package/src/requests/RequestConcurrencyMode.enum.ts +0 -6
  371. package/src/requests/RequestErrorRouter.ts +0 -89
  372. package/src/requests/RequestEvents.enum.ts +0 -4
  373. package/src/requests/RequestMethod.enum.ts +0 -8
  374. package/src/requests/bodies/FormDataBody.ts +0 -81
  375. package/src/requests/bodies/JsonBody.ts +0 -16
  376. package/src/requests/contracts/BaseRequestContract.ts +0 -39
  377. package/src/requests/contracts/BodyContract.ts +0 -7
  378. package/src/requests/contracts/BodyFactoryContract.ts +0 -5
  379. package/src/requests/contracts/DriverConfigContract.ts +0 -9
  380. package/src/requests/contracts/HeadersContract.ts +0 -5
  381. package/src/requests/contracts/RequestDriverContract.ts +0 -15
  382. package/src/requests/contracts/RequestLoaderContract.ts +0 -5
  383. package/src/requests/contracts/ResponseContract.ts +0 -7
  384. package/src/requests/drivers/contracts/ResponseHandlerContract.ts +0 -10
  385. package/src/requests/drivers/fetch/FetchDriver.ts +0 -115
  386. package/src/requests/drivers/fetch/FetchResponse.ts +0 -30
  387. package/src/requests/drivers/xhr/XMLHttpRequestDriver.ts +0 -138
  388. package/src/requests/drivers/xhr/XMLHttpRequestResponse.ts +0 -95
  389. package/src/requests/exceptions/BadGatewayException.ts +0 -3
  390. package/src/requests/exceptions/BadRequestException.ts +0 -3
  391. package/src/requests/exceptions/ConflictException.ts +0 -3
  392. package/src/requests/exceptions/ForbiddenException.ts +0 -3
  393. package/src/requests/exceptions/GatewayTimeoutException.ts +0 -3
  394. package/src/requests/exceptions/GoneException.ts +0 -3
  395. package/src/requests/exceptions/InvalidJsonException.ts +0 -15
  396. package/src/requests/exceptions/LockedException.ts +0 -3
  397. package/src/requests/exceptions/MethodNotAllowedException.ts +0 -3
  398. package/src/requests/exceptions/NotFoundException.ts +0 -3
  399. package/src/requests/exceptions/NotImplementedException.ts +0 -3
  400. package/src/requests/exceptions/PageExpiredException.ts +0 -3
  401. package/src/requests/exceptions/PayloadTooLargeException.ts +0 -3
  402. package/src/requests/exceptions/PreconditionFailedException.ts +0 -3
  403. package/src/requests/exceptions/RequestTimeoutException.ts +0 -3
  404. package/src/requests/exceptions/ResponseBodyException.ts +0 -15
  405. package/src/requests/exceptions/ResponseException.ts +0 -11
  406. package/src/requests/exceptions/ServerErrorException.ts +0 -3
  407. package/src/requests/exceptions/ServiceUnavailableException.ts +0 -3
  408. package/src/requests/exceptions/StaleResponseException.ts +0 -13
  409. package/src/requests/exceptions/TooManyRequestsException.ts +0 -3
  410. package/src/requests/exceptions/UnauthorizedException.ts +0 -3
  411. package/src/requests/exceptions/UnsupportedMediaTypeException.ts +0 -3
  412. package/src/requests/exceptions/ValidationException.ts +0 -3
  413. package/src/requests/exceptions/index.ts +0 -51
  414. package/src/requests/factories/FormDataFactory.ts +0 -17
  415. package/src/requests/factories/JsonBodyFactory.ts +0 -9
  416. package/src/requests/index.ts +0 -61
  417. package/src/requests/responses/BaseResponse.ts +0 -41
  418. package/src/requests/responses/BlobResponse.ts +0 -19
  419. package/src/requests/responses/JsonResponse.ts +0 -15
  420. package/src/requests/responses/PlainTextResponse.ts +0 -15
  421. package/src/requests/types/RequestUploadProgress.ts +0 -6
  422. package/src/support/DeferredPromise.ts +0 -67
  423. package/src/support/helpers.ts +0 -78
  424. package/src/vue/composables/useConfirmDialog.ts +0 -63
  425. package/src/vue/composables/useGlobalCheckbox.ts +0 -145
  426. package/src/vue/composables/useIsEmpty.ts +0 -34
  427. package/src/vue/composables/useIsOpen.ts +0 -37
  428. package/src/vue/composables/useIsOpenFromVar.ts +0 -61
  429. package/src/vue/composables/useModelWrapper.ts +0 -27
  430. package/src/vue/composables/useOnOpen.ts +0 -34
  431. package/src/vue/contracts/ModelValueProps.ts +0 -3
  432. package/src/vue/forms/BaseForm.ts +0 -1192
  433. package/src/vue/forms/PropertyAwareArray.ts +0 -81
  434. package/src/vue/forms/types/PersistedForm.ts +0 -6
  435. package/src/vue/forms/validation/ValidationMode.enum.ts +0 -14
  436. package/src/vue/forms/validation/index.ts +0 -15
  437. package/src/vue/forms/validation/rules/BaseRule.ts +0 -7
  438. package/src/vue/forms/validation/rules/ConfirmedRule.ts +0 -39
  439. package/src/vue/forms/validation/rules/EmailRule.ts +0 -23
  440. package/src/vue/forms/validation/rules/JsonRule.ts +0 -28
  441. package/src/vue/forms/validation/rules/MinRule.ts +0 -61
  442. package/src/vue/forms/validation/rules/RequiredRule.ts +0 -19
  443. package/src/vue/forms/validation/rules/UrlRule.ts +0 -24
  444. package/src/vue/forms/validation/types/ValidationRules.ts +0 -15
  445. package/src/vue/index.ts +0 -14
  446. package/src/vue/requests/factories/VueRequestLoaderFactory.ts +0 -10
  447. package/src/vue/requests/loaders/VueRequestBatchLoader.ts +0 -35
  448. package/src/vue/requests/loaders/VueRequestLoader.ts +0 -18
  449. package/src/vue/router/routeResourceBinding/RouteResourceBoundView.ts +0 -145
  450. package/src/vue/router/routeResourceBinding/RouteResourceRequestResolver.ts +0 -11
  451. package/src/vue/router/routeResourceBinding/defineRoute.ts +0 -59
  452. package/src/vue/router/routeResourceBinding/index.ts +0 -11
  453. package/src/vue/router/routeResourceBinding/installRouteInjection.ts +0 -164
  454. package/src/vue/router/routeResourceBinding/types.ts +0 -53
  455. package/src/vue/router/routeResourceBinding/useRouteResource.ts +0 -24
  456. package/src/vue/state/State.ts +0 -380
  457. package/src/vue/state/index.ts +0 -3
  458. package/tests/service/bulkRequests/BulkRequestSender.test.ts +0 -76
  459. package/tests/service/bulkRequests/BulkRequestWrapper.test.ts +0 -51
  460. package/tests/service/helpers/mergeDeep.test.ts +0 -53
  461. package/tests/service/laravel/pagination/dataDrivers/RequestDriver.test.ts +0 -84
  462. package/tests/service/laravel/requests/JsonBaseRequest.test.ts +0 -43
  463. package/tests/service/laravel/requests/PaginationJsonBaseRequest.test.ts +0 -58
  464. package/tests/service/laravel/requests/responses/JsonResponse.test.ts +0 -59
  465. package/tests/service/laravel/requests/responses/PaginationResponse.test.ts +0 -127
  466. package/tests/service/pagination/BasePaginator.test.ts +0 -100
  467. package/tests/service/pagination/InfiniteScroller.test.ts +0 -101
  468. package/tests/service/pagination/PageAwarePaginator.test.ts +0 -133
  469. package/tests/service/pagination/StatePaginator.test.ts +0 -76
  470. package/tests/service/pagination/VueViewDrivers.test.ts +0 -46
  471. package/tests/service/pagination/dtos/PaginationDataDto.test.ts +0 -35
  472. package/tests/service/pagination/dtos/StatePaginationDataDto.test.ts +0 -14
  473. package/tests/service/pagination/factories/VuePaginationDriverFactory.test.ts +0 -32
  474. package/tests/service/pagination/frontendDrivers/VuePaginationDriver.test.ts +0 -66
  475. package/tests/service/persistenceDrivers/PersistenceDrivers.test.ts +0 -56
  476. package/tests/service/requests/BaseRequest.test.ts +0 -250
  477. package/tests/service/requests/BodiesAndFactories.test.ts +0 -28
  478. package/tests/service/requests/Enums.test.ts +0 -20
  479. package/tests/service/requests/ErrorHandler.test.ts +0 -188
  480. package/tests/service/requests/FormDataBody.test.ts +0 -63
  481. package/tests/service/requests/RequestErrorRouter.test.ts +0 -44
  482. package/tests/service/requests/Responses.test.ts +0 -83
  483. package/tests/service/requests/exceptions/Exceptions.test.ts +0 -43
  484. package/tests/service/requests/fetch/FetchDriver.test.ts +0 -76
  485. package/tests/service/requests/fetch/FetchResponse.test.ts +0 -21
  486. package/tests/service/requests/xhr/XMLHttpRequestDriver.test.ts +0 -178
  487. package/tests/service/support/DeferredPromise.test.ts +0 -40
  488. package/tests/service/support/helpers.test.ts +0 -37
  489. package/tests/vue/composables/useConfirmDialog.test.ts +0 -77
  490. package/tests/vue/composables/useGlobalCheckbox.test.ts +0 -126
  491. package/tests/vue/composables/useIsEmpty.test.ts +0 -18
  492. package/tests/vue/composables/useIsOpen.test.ts +0 -25
  493. package/tests/vue/composables/useIsOpenFromVar.test.ts +0 -22
  494. package/tests/vue/composables/useModelWrapper.test.ts +0 -30
  495. package/tests/vue/composables/useOnOpen.test.ts +0 -26
  496. package/tests/vue/forms/BaseForm.behavior.test.ts +0 -98
  497. package/tests/vue/forms/BaseForm.transformers.test.ts +0 -109
  498. package/tests/vue/forms/PropertyAwareArray.test.ts +0 -30
  499. package/tests/vue/forms/validation/ValidationRules.test.ts +0 -79
  500. package/tests/vue/requests/VueRequestLoaders.test.ts +0 -48
  501. package/tests/vue/router/routeResourceBinding/RouteResourceBoundView.test.ts +0 -344
  502. package/tests/vue/router/routeResourceBinding/RouteResourceUtils.test.ts +0 -70
  503. package/tests/vue/router/routeResourceBinding/installRouteInjection.test.ts +0 -450
  504. package/tests/vue/state/State.test.ts +0 -151
  505. package/tsconfig.json +0 -114
  506. package/vite.config.ts +0 -34
  507. package/vitest.config.ts +0 -23
@@ -1,164 +0,0 @@
1
- import { type Router } from 'vue-router'
2
- import { reactive } from 'vue'
3
-
4
- type InjectRuntimeConfig = {
5
- from: string
6
- resolve: (param: string) => { resolve(): Promise<unknown> }
7
- getter: (payload: unknown) => unknown
8
- }
9
-
10
- type CachedEntry = {
11
- paramValue: string
12
- payload: unknown
13
- }
14
-
15
- /**
16
- * Installs the runtime part:
17
- * - resolves all route.inject entries before navigation completes
18
- * - stores results on to.meta._injectedProps
19
- * - ensures route props include injected results (so components receive them as props)
20
- * - caches resolved resources so child routes inherit parent-resolved data
21
- * without triggering redundant requests (as long as the param value is unchanged)
22
- *
23
- * Notes:
24
- * - This keeps router files clean: only an `inject` block per route.
25
- * - This is intentionally runtime-generic; type safety happens at route definition time.
26
- */
27
- export function installRouteInjection(router: Router) {
28
- const cache: Record<string, CachedEntry> = {}
29
-
30
- router.beforeResolve(async (to) => {
31
- console.log('[Route Injection] Resolving route injections...')
32
-
33
- if (!to.meta._injectedProps) {
34
- to.meta._injectedProps = reactive({})
35
- }
36
-
37
- if (!to.meta._injectionState) {
38
- to.meta._injectionState = reactive({})
39
- }
40
-
41
- const resolvers: Record<string, (options?: { silent?: boolean }) => Promise<unknown>> = {}
42
- const activePropNames = new Set<string>()
43
- const pendingResolvers: Array<() => Promise<void>> = []
44
-
45
- // Iterate through all matched route records (from parent to child)
46
- for (const record of to.matched) {
47
- console.debug(`[Route Injection] Processing route "${record.path}"`)
48
-
49
- // Access the custom 'inject' property directly from the record
50
- const inject = record.meta.inject as Record<string, InjectRuntimeConfig> | undefined
51
-
52
- if (!inject) {
53
- console.debug(`[Route Injection] No injections found for route "${record.path}"`)
54
-
55
- continue
56
- }
57
-
58
- for (const [propName, cfg] of Object.entries(inject)) {
59
- const rawParam = to.params[cfg.from]
60
-
61
- if (rawParam === undefined || rawParam === null) {
62
- console.warn(`[Route Injection] Param "${cfg.from}" not found for prop "${propName}"`)
63
-
64
- continue
65
- }
66
-
67
- const paramValue = Array.isArray(rawParam) ? rawParam[0] : String(rawParam)
68
-
69
- if (paramValue === undefined || paramValue === null) {
70
- console.warn(`[Route Injection] Param value "${cfg.from}" not found for prop "${propName}"`)
71
-
72
- continue
73
- }
74
-
75
- activePropNames.add(propName)
76
-
77
- // Initialize state for this prop
78
- const state = to.meta._injectionState as Record<string, { loading: boolean; error: Error | null }>
79
- if (!state[propName]) {
80
- state[propName] = reactive({ loading: false, error: null })
81
- }
82
-
83
- // Define the refresh logic for this specific prop (always fetches fresh data)
84
- const resolveProp = async (options?: { silent?: boolean }) => {
85
- const propState = (to.meta._injectionState as Record<string, { loading: boolean; error: Error | null }>)[propName]!
86
- if (!options?.silent) {
87
- propState.loading = true
88
- }
89
- propState.error = null
90
-
91
- try {
92
- const resolver = cfg.resolve(paramValue)
93
- let payload = await resolver.resolve()
94
- if (typeof cfg.getter === 'function') {
95
- payload = cfg.getter(payload)
96
- }
97
-
98
- // Update cache
99
- cache[propName] = { paramValue, payload }
100
-
101
- // Updating the reactive object triggers the component re-render
102
- const injectedProps = to.meta._injectedProps as Record<string, unknown>
103
- injectedProps[propName] = payload
104
- return payload
105
- } catch (e) {
106
- propState.error = e instanceof Error ? e : new Error(String(e))
107
- throw e
108
- } finally {
109
- propState.loading = false
110
- }
111
- }
112
-
113
- resolvers[propName] = resolveProp
114
-
115
- // Reuse cached value if the param hasn't changed (e.g. navigating between child routes)
116
- const cached = cache[propName]
117
- if (cached && cached.paramValue === paramValue) {
118
- console.debug(`[Route Injection] Using cached value for prop "${propName}" (param "${cfg.from}" unchanged)`)
119
- const injectedPropsCache = to.meta._injectedProps as Record<string, unknown>
120
- injectedPropsCache[propName] = cached.payload
121
-
122
- continue
123
- }
124
-
125
- // Set loading immediately and queue resolver (non-blocking)
126
- const injectionState = to.meta._injectionState as Record<string, { loading: boolean; error: Error | null }>
127
- injectionState[propName]!.loading = true
128
- pendingResolvers.push(async () => {
129
- try {
130
- await resolveProp()
131
- } catch (e) {
132
- console.error(`[Route Injection] Failed to resolve prop "${propName}"`, e)
133
- }
134
- })
135
-
136
- console.debug(`[Route Injection] Queued resolution for prop "${propName}" for route "${record.path}"`)
137
- }
138
- }
139
-
140
- // Evict cache entries that are no longer part of the active route hierarchy
141
- for (const key of Object.keys(cache)) {
142
- if (!activePropNames.has(key)) {
143
- delete cache[key]
144
- }
145
- }
146
-
147
- // Attach the resolvers and a global refresh helper to the route meta
148
- to.meta['_injectedResolvers'] = resolvers
149
- to.meta['refresh'] = async (propName: string, options?: { silent?: boolean }) => {
150
- if (resolvers[propName]) {
151
- return await resolvers[propName](options)
152
- }
153
-
154
- console.warn(`[Route Injection] No resolver found for "${propName}"`)
155
-
156
- return undefined
157
- }
158
-
159
- // Fire pending resolvers without blocking navigation
160
- if (pendingResolvers.length > 0) {
161
- Promise.all(pendingResolvers.map((fn) => fn()))
162
- }
163
- })
164
- }
@@ -1,53 +0,0 @@
1
- import { type Component } from 'vue'
2
- import { type RouteLocationNormalized } from 'vue-router'
3
-
4
- /**
5
- * Generic resolver interface.
6
- */
7
- export interface Resolver<T> {
8
- resolve(): Promise<T>
9
- }
10
-
11
- /**
12
- * A minimal "request" contract that matches your request classes:
13
- * new ProductShowRequest(id).send() -> { getData(): T }
14
- */
15
- export interface DataRequest<T> {
16
- send(): Promise<{ getData(): T }>
17
- }
18
-
19
- /**
20
- * Inject config that is type-safe against component props.
21
- *
22
- * Props[K] is the required resolved type for prop K.
23
- */
24
- export type InjectConfig<Props extends Record<string, unknown>> = {
25
- [K in keyof Props]?: {
26
- /**
27
- * Route param name, e.g. "productId"
28
- */
29
- from: keyof RouteLocationNormalized['params'] | string
30
-
31
- /**
32
- * Create a resolver from the param value.
33
- * Param value is treated as string (most common in routes).
34
- */
35
- resolve: (param: string) => Resolver<Props[K]>
36
- }
37
- }
38
-
39
- /**
40
- * Extended route meta to store injected props at runtime.
41
- */
42
- declare module 'vue-router' {
43
- interface RouteMeta {
44
- _injectedProps?: Record<string, unknown>
45
- _injectedResolvers?: Record<string, () => Promise<unknown>>
46
- _injectionState?: Record<string, { loading: boolean; error: Error | null }>
47
- _errorComponent?: Component
48
- _loadingComponent?: Component
49
- _lazy?: boolean
50
- refresh?: (propName: string, options?: { silent?: boolean }) => Promise<unknown>
51
- inject?: Record<string, unknown>
52
- }
53
- }
@@ -1,24 +0,0 @@
1
- import { computed, type ComputedRef } from 'vue'
2
- import { useRoute } from 'vue-router'
3
-
4
- type InjectionState = Record<string, { loading: boolean; error: Error | null }>
5
-
6
- export function useRouteResource(propName: string) {
7
- const route = useRoute()
8
-
9
- const refresh = async (options?: { silent?: boolean }) => {
10
- return await route.meta.refresh?.(propName, options)
11
- }
12
-
13
- const isLoading: ComputedRef<boolean> = computed(() => {
14
- const state = route.meta._injectionState as InjectionState | undefined
15
- return state?.[propName]?.loading ?? false
16
- })
17
-
18
- const error: ComputedRef<Error | null> = computed(() => {
19
- const state = route.meta._injectionState as InjectionState | undefined
20
- return state?.[propName]?.error ?? null
21
- })
22
-
23
- return { refresh, isLoading, error }
24
- }
@@ -1,380 +0,0 @@
1
- import { debounce } from 'lodash-es'
2
- import { type PersistenceDriver } from '../../persistenceDrivers'
3
- import { NonPersistentDriver } from '../../persistenceDrivers'
4
- import { computed, ref, type Ref, watch, reactive } from 'vue'
5
-
6
- export interface StateOptions {
7
- persist?: boolean
8
- persistSuffix?: string
9
- }
10
-
11
- /** Generic type for change handlers. */
12
- type ChangeHandler<T> = (val: T, oldVal: T) => void
13
-
14
- /** Type for accessing nested properties with dot notation. */
15
- type PathValue<T, P extends string> = P extends keyof T
16
- ? T[P]
17
- : P extends `${infer K}.${infer Rest}`
18
- ? K extends keyof T
19
- ? T[K] extends Record<string, unknown>
20
- ? PathValue<T[K], Rest>
21
- : never
22
- : never
23
- : never
24
-
25
- /** Helper type to get all possible paths in an object. */
26
- type PathsToStringProps<T> = T extends object ? { [K in keyof T]: K extends string ? K | `${K}.${PathsToStringProps<T[K]>}` : never }[keyof T] : never
27
-
28
- /** Union type of all possible dot-notation paths in T. */
29
- type Path<T> = keyof T | PathsToStringProps<T>
30
-
31
- function isRecord(value: unknown): value is Record<string, unknown> {
32
- return !!value && typeof value === 'object' && !Array.isArray(value)
33
- }
34
-
35
- function getNestedValue(root: unknown, pathParts: string[]): unknown {
36
- let current = root
37
- for (const part of pathParts) {
38
- if (!isRecord(current)) {
39
- return undefined
40
- }
41
- current = current[part]
42
- }
43
- return current
44
- }
45
-
46
- export abstract class State<T extends object> {
47
- private readonly properties: { [K in keyof T]: Ref<T[K]> }
48
- private readonly _initial: T
49
- private readonly _persist: boolean
50
- private readonly _persistKey: string
51
- private _driver: PersistenceDriver
52
- private _stateProxy: T | null = null
53
- private _watchStopFunctions: Map<string, () => void> = new Map()
54
- private _resetHandlers: Map<string, (() => void)[]> = new Map()
55
- private _watchIdCounter = 0
56
-
57
- protected constructor(initial: T, options?: StateOptions) {
58
- this._initial = initial
59
- this._persist = !!options?.persist
60
- const className = this.constructor.name
61
- this._persistKey = className + (options?.persistSuffix ? `_${options.persistSuffix}` : '')
62
- this._driver = this.getPersistenceDriver()
63
-
64
- let loaded: T | null = null
65
- if (this._persist) {
66
- loaded = this._driver.get<T>(this._persistKey)
67
- if (loaded) {
68
- const initialKeys = Object.keys(initial).sort()
69
- const loadedKeys = Object.keys(loaded).sort()
70
- const sameKeys = initialKeys.length === loadedKeys.length && initialKeys.every((k, i) => k === loadedKeys[i])
71
- if (!sameKeys) {
72
- this._driver.remove(this._persistKey)
73
- loaded = null
74
- }
75
- }
76
- }
77
-
78
- const base = loaded ?? initial
79
- this.properties = {} as { [K in keyof T]: Ref<T[K]> }
80
- const keys = Object.keys(base) as Array<keyof T>
81
-
82
- for (const k of keys) {
83
- let value = (base as T)[k]
84
- value = this.wrapReactive(value)
85
-
86
- const _ref = ref(value) as Ref<T[typeof k]>
87
-
88
- this.properties[k] = computed({
89
- get: () => _ref.value,
90
- set: (val) => {
91
- _ref.value = this.wrapReactive(val)
92
-
93
- if (this._persist) {
94
- this._driver.set(this._persistKey, this.export())
95
- }
96
- }
97
- }) as Ref<T[typeof k]>
98
- }
99
- }
100
-
101
- /**
102
- * Safe deep clone that preserves types
103
- */
104
- private deepClone<V>(value: V): V {
105
- if (value === null || value === undefined) return value
106
- if (typeof value !== 'object') return value
107
-
108
- return JSON.parse(JSON.stringify(value)) as V
109
- }
110
-
111
- /**
112
- * Ensure objects/arrays are cloned and wrapped in Vue reactivity.
113
- */
114
- private wrapReactive<V>(value: V): V {
115
- if (value && typeof value === 'object') {
116
- return reactive(this.deepClone(value)) as V
117
- }
118
- return value
119
- }
120
-
121
- /**
122
- * Get a proxy to the state that allows direct property access and setting
123
- * without using .value
124
- */
125
- public get state(): T {
126
- if (!this._stateProxy) {
127
- this._stateProxy = new Proxy({} as T, {
128
- get: (_, prop: string | symbol) => {
129
- if (typeof prop === 'symbol' || prop === 'toJSON') {
130
- return undefined
131
- }
132
-
133
- const key = prop as keyof T
134
- if (key in this.properties) {
135
- return this.properties[key].value
136
- }
137
-
138
- return undefined
139
- },
140
- set: (_, prop: string | symbol, value) => {
141
- if (typeof prop === 'symbol') {
142
- return false
143
- }
144
-
145
- const key = prop as keyof T
146
- if (key in this.properties) {
147
- this.properties[key].value = value
148
- }
149
-
150
- return true
151
- }
152
- })
153
- }
154
-
155
- return this._stateProxy
156
- }
157
-
158
- /**
159
- * Add a subscription to specific properties or nested properties
160
- * @param paths Path(s) to the property. Can be:
161
- * - A single path (top-level key or nested with dot notation)
162
- * - An array of paths to watch (triggers when any changes)
163
- * @param handler Function to call when the property changes
164
- * @param options Optional configuration for debounce and executeOnReset
165
- * @returns A function to remove the subscription
166
- */
167
- public subscribe<P extends Path<T>>(
168
- paths: P,
169
- handler: ChangeHandler<PathValue<T, P & string>>,
170
- options?: { debounce?: number; executeOnReset?: boolean }
171
- ): () => void
172
- public subscribe<P extends Path<T>>(
173
- paths: P[],
174
- handler: (changedPath: P, state: T) => void,
175
- options?: { debounce?: number; executeOnReset?: boolean }
176
- ): () => void
177
- public subscribe<P extends Path<T>>(
178
- paths: P | P[],
179
- handler: ChangeHandler<PathValue<T, P & string>> | ((changedPath: P, state: T) => void),
180
- options?: { debounce?: number; executeOnReset?: boolean }
181
- ): () => void {
182
- const stopFunctions: (() => void)[] = []
183
- const resetHandlers: (() => void)[] = []
184
-
185
- if (Array.isArray(paths)) {
186
- for (const path of paths) {
187
- const pathHandler = () => {
188
- ;(handler as (changedPath: P, state: T) => void)(path, this.export())
189
- }
190
-
191
- if (options?.executeOnReset) {
192
- resetHandlers.push(pathHandler)
193
- }
194
-
195
- const stop = this.setupWatcher(path as string, pathHandler, options)
196
- stopFunctions.push(stop)
197
- }
198
- } else {
199
- const pathHandler = handler as ChangeHandler<unknown>
200
-
201
- if (options?.executeOnReset) {
202
- resetHandlers.push(() => pathHandler(undefined, undefined))
203
- }
204
-
205
- const stop = this.setupWatcher(paths as string, pathHandler, options)
206
- stopFunctions.push(stop)
207
- }
208
-
209
- if (resetHandlers.length > 0) {
210
- const resetId = Math.random().toString(36)
211
- this._resetHandlers.set(resetId, resetHandlers)
212
-
213
- stopFunctions.push(() => {
214
- this._resetHandlers.delete(resetId)
215
- })
216
- }
217
-
218
- return () => stopFunctions.forEach((stop) => stop())
219
- }
220
-
221
- /**
222
- * Internal method to set up a watcher for a specific path
223
- */
224
- private setupWatcher(
225
- path: string,
226
- handler: (newVal?: unknown, oldVal?: unknown) => void,
227
- options?: { debounce?: number; executeOnReset?: boolean }
228
- ): () => void {
229
- const pathParts = path.split('.')
230
- const debouncedHandler = options?.debounce && options.debounce > 0 ? debounce(handler, options.debounce) : undefined
231
-
232
- const effectiveHandler = debouncedHandler || handler
233
-
234
- if (pathParts.length === 1 && path in this.properties) {
235
- const key = path as keyof T
236
-
237
- const stopWatch = watch(
238
- () => this.properties[key].value,
239
- (newVal, oldVal) => {
240
- if (!this.isEqual(newVal, oldVal)) {
241
- effectiveHandler(newVal, oldVal)
242
- }
243
- },
244
- { deep: true }
245
- )
246
-
247
- const watchId = `watch:${this._watchIdCounter++}`
248
- this._watchStopFunctions.set(watchId, stopWatch)
249
-
250
- return () => {
251
- if (this._watchStopFunctions.has(watchId)) {
252
- this._watchStopFunctions.get(watchId)!()
253
- this._watchStopFunctions.delete(watchId)
254
- }
255
- }
256
- }
257
-
258
- const topLevelKey = pathParts[0] as keyof T
259
-
260
- if (topLevelKey in this.properties) {
261
- const getter = () => {
262
- const root = this.properties[topLevelKey].value
263
- return getNestedValue(root, pathParts.slice(1))
264
- }
265
-
266
- const stopWatch = watch(
267
- getter,
268
- (newVal, oldVal) => {
269
- if (!this.isEqual(newVal, oldVal)) {
270
- effectiveHandler(newVal, oldVal)
271
- }
272
- },
273
- { deep: true }
274
- )
275
-
276
- const watchId = `watch:${this._watchIdCounter++}`
277
- this._watchStopFunctions.set(watchId, stopWatch)
278
-
279
- return () => {
280
- if (this._watchStopFunctions.has(watchId)) {
281
- this._watchStopFunctions.get(watchId)!()
282
- this._watchStopFunctions.delete(watchId)
283
- }
284
- }
285
- }
286
-
287
- return () => {}
288
- }
289
-
290
- /**
291
- * Simple deep equality check
292
- */
293
- private isEqual(a: unknown, b: unknown): boolean {
294
- if (a === b) return true
295
-
296
- if (a === null || b === null) return false
297
- if (a === undefined || b === undefined) return false
298
-
299
- if (typeof a !== typeof b) return false
300
-
301
- if (typeof a === 'object' && typeof b === 'object') {
302
- const aArray = Array.isArray(a)
303
- const bArray = Array.isArray(b)
304
-
305
- if (aArray !== bArray) return false
306
-
307
- if (aArray && bArray) {
308
- const arrayA = a as unknown[]
309
- const arrayB = b as unknown[]
310
- if (arrayA.length !== arrayB.length) return false
311
- return arrayA.every((val, i) => this.isEqual(val, arrayB[i]))
312
- }
313
-
314
- const objA = a as Record<string, unknown>
315
- const objB = b as Record<string, unknown>
316
-
317
- const keysA = Object.keys(objA).sort()
318
- const keysB = Object.keys(objB).sort()
319
-
320
- if (keysA.length !== keysB.length) return false
321
- if (!keysA.every((k, i) => k === keysB[i])) return false
322
-
323
- return keysA.every((k) => this.isEqual(objA[k], objB[k]))
324
- }
325
-
326
- return false
327
- }
328
-
329
- protected getPersistenceDriver(): PersistenceDriver {
330
- return new NonPersistentDriver()
331
- }
332
-
333
- public export(): T {
334
- const out = {} as T
335
- for (const k in this.properties) {
336
- const key = k as keyof T
337
- out[key] = this.deepClone(this.properties[key].value)
338
- }
339
- return out
340
- }
341
-
342
- public import(data: Partial<T>): void {
343
- for (const k in data) {
344
- if (k in this.properties) {
345
- const key = k as keyof T
346
- this.properties[key].value = data[key] as T[typeof key]
347
- }
348
- }
349
- if (this._persist) {
350
- this._driver.set(this._persistKey, this.export())
351
- }
352
- }
353
-
354
- public reset(): void {
355
- this.import(this._initial)
356
-
357
- for (const handlers of this._resetHandlers.values()) {
358
- for (const handler of handlers) {
359
- handler()
360
- }
361
- }
362
- }
363
-
364
- public get persistKey(): string {
365
- return this._persistKey
366
- }
367
-
368
- /**
369
- * Clean up all watchers when the state is no longer needed
370
- */
371
- public destroy(): void {
372
- for (const stopFn of this._watchStopFunctions.values()) {
373
- stopFn()
374
- }
375
- this._watchStopFunctions.clear()
376
- this._resetHandlers.clear()
377
-
378
- this._stateProxy = null
379
- }
380
- }
@@ -1,3 +0,0 @@
1
- import { State } from './State'
2
-
3
- export { State }
@@ -1,76 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest'
2
- import { BulkRequestSender, BulkRequestExecutionMode } from '../../../src/bulkRequests/BulkRequestSender'
3
- import { BulkRequestWrapper } from '../../../src/bulkRequests/BulkRequestWrapper'
4
- import { BulkRequestEventEnum } from '../../../src/bulkRequests/BulkRequestEvent.enum'
5
-
6
- const createRequest = (options: { failTimes?: number } = {}) => {
7
- let calls = 0
8
-
9
- return {
10
- send: vi.fn().mockImplementation(() => {
11
- calls += 1
12
- if (options.failTimes && calls <= options.failTimes) {
13
- return Promise.reject(new Error('fail'))
14
- }
15
- return Promise.resolve('ok')
16
- }),
17
- isLoading: vi.fn().mockReturnValue(false),
18
- setAbortSignal: vi.fn(),
19
- }
20
- }
21
-
22
- describe('BulkRequestSender', () => {
23
- it('sends requests in parallel and emits success events', async () => {
24
- const wrappers = [new BulkRequestWrapper(createRequest() as any), new BulkRequestWrapper(createRequest() as any)]
25
-
26
- const sender = new BulkRequestSender(wrappers, BulkRequestExecutionMode.PARALLEL)
27
- const onSuccess = vi.fn()
28
-
29
- sender.on(BulkRequestEventEnum.REQUEST_SUCCESSFUL, onSuccess)
30
-
31
- const result = await sender.send()
32
-
33
- expect(onSuccess).toHaveBeenCalledTimes(2)
34
- expect(result.getSuccessCount()).toBe(2)
35
- expect(result.getErrorCount()).toBe(0)
36
- expect(result.getSuccessfulResponses()).toEqual(['ok', 'ok'])
37
- })
38
-
39
- it('retries failed requests and emits failure events when still failing', async () => {
40
- const failingRequest = createRequest({ failTimes: 2 })
41
- const wrapper = new BulkRequestWrapper(failingRequest as any)
42
-
43
- const sender = new BulkRequestSender([wrapper], BulkRequestExecutionMode.SEQUENTIAL, 1)
44
- const onFailed = vi.fn()
45
-
46
- sender.on(BulkRequestEventEnum.REQUEST_FAILED, onFailed)
47
-
48
- await sender.send()
49
-
50
- expect(failingRequest.send).toHaveBeenCalledTimes(2)
51
- expect(onFailed).toHaveBeenCalledTimes(1)
52
- })
53
-
54
- it('reports loading state when any request is loading', () => {
55
- const request1 = createRequest()
56
- const request2 = createRequest()
57
- request2.isLoading = vi.fn().mockReturnValue(true)
58
-
59
- const sender = new BulkRequestSender(
60
- [new BulkRequestWrapper(request1 as any), new BulkRequestWrapper(request2 as any)],
61
- BulkRequestExecutionMode.PARALLEL
62
- )
63
-
64
- expect(sender.isLoading).toBe(true)
65
- })
66
-
67
- it('removes event handlers with off()', () => {
68
- const sender = new BulkRequestSender([], BulkRequestExecutionMode.PARALLEL)
69
- const handler = vi.fn()
70
-
71
- sender.on(BulkRequestEventEnum.REQUEST_SUCCESSFUL, handler)
72
- sender.off(BulkRequestEventEnum.REQUEST_SUCCESSFUL)
73
-
74
- expect((sender as any).events.has(BulkRequestEventEnum.REQUEST_SUCCESSFUL)).toBe(false)
75
- })
76
- })