@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.
- package/dist/bulkRequests/BulkRequestEvent.enum.d.ts +4 -0
- package/dist/bulkRequests/BulkRequestEvent.enum.js +5 -0
- package/dist/bulkRequests/BulkRequestSender.d.ts +31 -0
- package/dist/bulkRequests/BulkRequestSender.js +161 -0
- package/dist/bulkRequests/BulkRequestWrapper.d.ts +15 -0
- package/dist/bulkRequests/BulkRequestWrapper.js +50 -0
- package/dist/bulkRequests/index.d.ts +5 -0
- package/dist/bulkRequests/index.js +5 -0
- package/{src/laravel/pagination/contracts/PaginationResponseBodyContract.ts → dist/laravel/pagination/contracts/PaginationResponseBodyContract.d.ts} +4 -4
- package/dist/laravel/pagination/contracts/PaginationResponseBodyContract.js +1 -0
- package/dist/laravel/pagination/dataDrivers/RequestDriver.d.ts +10 -0
- package/dist/laravel/pagination/dataDrivers/RequestDriver.js +18 -0
- package/dist/laravel/pagination/index.d.ts +4 -0
- package/dist/laravel/pagination/index.js +2 -0
- package/dist/laravel/requests/JsonBaseRequest.d.ts +14 -0
- package/dist/laravel/requests/JsonBaseRequest.js +15 -0
- package/dist/laravel/requests/PaginationJsonBaseRequest.d.ts +8 -0
- package/dist/laravel/requests/PaginationJsonBaseRequest.js +13 -0
- package/dist/laravel/requests/index.d.ts +7 -0
- package/dist/laravel/requests/index.js +5 -0
- package/dist/laravel/requests/responses/JsonResponse.d.ts +5 -0
- package/dist/laravel/requests/responses/JsonResponse.js +6 -0
- package/dist/laravel/requests/responses/PaginationResponse.d.ts +7 -0
- package/dist/laravel/requests/responses/PaginationResponse.js +9 -0
- package/dist/pagination/BasePaginator.d.ts +19 -0
- package/dist/pagination/BasePaginator.js +65 -0
- package/dist/pagination/InfiniteScroller.d.ts +6 -0
- package/dist/pagination/InfiniteScroller.js +17 -0
- package/dist/pagination/PageAwarePaginator.d.ts +32 -0
- package/dist/pagination/PageAwarePaginator.js +86 -0
- package/dist/pagination/StatePaginator.d.ts +25 -0
- package/dist/pagination/StatePaginator.js +55 -0
- package/dist/pagination/contracts/BaseViewDriverContract.d.ts +6 -0
- package/dist/pagination/contracts/BaseViewDriverContract.js +1 -0
- package/{src/pagination/contracts/BaseViewDriverFactoryContract.ts → dist/pagination/contracts/BaseViewDriverFactoryContract.d.ts} +2 -3
- package/dist/pagination/contracts/BaseViewDriverFactoryContract.js +1 -0
- package/dist/pagination/contracts/PaginateableRequestContract.d.ts +4 -0
- package/dist/pagination/contracts/PaginateableRequestContract.js +1 -0
- package/dist/pagination/contracts/PaginationDataDriverContract.d.ts +4 -0
- package/dist/pagination/contracts/PaginationDataDriverContract.js +1 -0
- package/{src/pagination/contracts/PaginationResponseContract.ts → dist/pagination/contracts/PaginationResponseContract.d.ts} +3 -5
- package/dist/pagination/contracts/PaginationResponseContract.js +1 -0
- package/{src/pagination/contracts/PaginatorLoadDataOptions.ts → dist/pagination/contracts/PaginatorLoadDataOptions.d.ts} +2 -2
- package/dist/pagination/contracts/PaginatorLoadDataOptions.js +1 -0
- package/{src/pagination/contracts/StatePaginationDataDriverContract.ts → dist/pagination/contracts/StatePaginationDataDriverContract.d.ts} +2 -3
- package/dist/pagination/contracts/StatePaginationDataDriverContract.js +1 -0
- package/dist/pagination/contracts/ViewDriverContract.d.ts +9 -0
- package/dist/pagination/contracts/ViewDriverContract.js +1 -0
- package/dist/pagination/contracts/ViewDriverFactoryContract.d.ts +4 -0
- package/dist/pagination/contracts/ViewDriverFactoryContract.js +1 -0
- package/dist/pagination/dataDrivers/ArrayDriver.d.ts +9 -0
- package/dist/pagination/dataDrivers/ArrayDriver.js +20 -0
- package/dist/pagination/dtos/PaginationDataDto.d.ts +7 -0
- package/dist/pagination/dtos/PaginationDataDto.js +12 -0
- package/dist/pagination/dtos/StatePaginationDataDto.d.ts +7 -0
- package/dist/pagination/dtos/StatePaginationDataDto.js +13 -0
- package/dist/pagination/factories/VueBaseViewDriverFactory.d.ts +5 -0
- package/dist/pagination/factories/VueBaseViewDriverFactory.js +6 -0
- package/dist/pagination/factories/VuePaginationDriverFactory.d.ts +5 -0
- package/dist/pagination/factories/VuePaginationDriverFactory.js +6 -0
- package/dist/pagination/frontendDrivers/VueBaseViewDriver.d.ts +11 -0
- package/dist/pagination/frontendDrivers/VueBaseViewDriver.js +19 -0
- package/dist/pagination/frontendDrivers/VuePaginationDriver.d.ts +21 -0
- package/dist/pagination/frontendDrivers/VuePaginationDriver.js +41 -0
- package/dist/pagination/index.d.ts +22 -0
- package/dist/pagination/index.js +13 -0
- package/dist/persistenceDrivers/LocalStorageDriver.d.ts +9 -0
- package/dist/persistenceDrivers/LocalStorageDriver.js +18 -0
- package/dist/persistenceDrivers/NonPersistentDriver.d.ts +7 -0
- package/dist/persistenceDrivers/NonPersistentDriver.js +8 -0
- package/dist/persistenceDrivers/SessionStorageDriver.d.ts +9 -0
- package/dist/persistenceDrivers/SessionStorageDriver.js +18 -0
- package/dist/persistenceDrivers/index.d.ts +6 -0
- package/dist/persistenceDrivers/index.js +4 -0
- package/dist/persistenceDrivers/types/PersistenceDriver.d.ts +5 -0
- package/dist/persistenceDrivers/types/PersistenceDriver.js +1 -0
- package/dist/requests/BaseRequest.d.ts +62 -0
- package/dist/requests/BaseRequest.js +224 -0
- package/dist/requests/ErrorHandler.d.ts +11 -0
- package/dist/requests/ErrorHandler.js +127 -0
- package/dist/requests/RequestConcurrencyMode.enum.d.ts +6 -0
- package/dist/requests/RequestConcurrencyMode.enum.js +7 -0
- package/dist/requests/RequestErrorRouter.d.ts +38 -0
- package/dist/requests/RequestErrorRouter.js +38 -0
- package/dist/requests/RequestEvents.enum.d.ts +4 -0
- package/dist/requests/RequestEvents.enum.js +5 -0
- package/dist/requests/RequestMethod.enum.d.ts +8 -0
- package/dist/requests/RequestMethod.enum.js +9 -0
- package/dist/requests/bodies/BinaryBody.d.ts +10 -0
- package/dist/requests/bodies/BinaryBody.js +22 -0
- package/dist/requests/bodies/FormDataBody.d.ts +14 -0
- package/dist/requests/bodies/FormDataBody.js +60 -0
- package/dist/requests/bodies/JsonBody.d.ts +8 -0
- package/dist/requests/bodies/JsonBody.js +13 -0
- package/{src/requests/contracts/AbortableRequestContract.ts → dist/requests/contracts/AbortableRequestContract.d.ts} +1 -1
- package/dist/requests/contracts/AbortableRequestContract.js +1 -0
- package/dist/requests/contracts/BaseRequestContract.d.ts +23 -0
- package/dist/requests/contracts/BaseRequestContract.js +1 -0
- package/dist/requests/contracts/BodyContract.d.ts +6 -0
- package/dist/requests/contracts/BodyContract.js +1 -0
- package/dist/requests/contracts/BodyFactoryContract.d.ts +4 -0
- package/dist/requests/contracts/BodyFactoryContract.js +1 -0
- package/dist/requests/contracts/DriverConfigContract.d.ts +8 -0
- package/dist/requests/contracts/DriverConfigContract.js +1 -0
- package/dist/requests/contracts/HeadersContract.d.ts +7 -0
- package/dist/requests/contracts/HeadersContract.js +1 -0
- package/dist/requests/contracts/RequestDriverContract.d.ts +8 -0
- package/dist/requests/contracts/RequestDriverContract.js +1 -0
- package/dist/requests/contracts/RequestLoaderContract.d.ts +4 -0
- package/dist/requests/contracts/RequestLoaderContract.js +1 -0
- package/{src/requests/contracts/RequestLoaderFactoryContract.ts → dist/requests/contracts/RequestLoaderFactoryContract.d.ts} +2 -3
- package/dist/requests/contracts/RequestLoaderFactoryContract.js +1 -0
- package/dist/requests/contracts/ResponseContract.d.ts +5 -0
- package/dist/requests/contracts/ResponseContract.js +1 -0
- package/dist/requests/drivers/contracts/ResponseHandlerContract.d.ts +9 -0
- package/dist/requests/drivers/contracts/ResponseHandlerContract.js +1 -0
- package/dist/requests/drivers/fetch/FetchDriver.d.ts +26 -0
- package/dist/requests/drivers/fetch/FetchDriver.js +73 -0
- package/dist/requests/drivers/fetch/FetchResponse.d.ts +12 -0
- package/dist/requests/drivers/fetch/FetchResponse.js +38 -0
- package/dist/requests/drivers/xhr/XMLHttpRequestDriver.d.ts +13 -0
- package/dist/requests/drivers/xhr/XMLHttpRequestDriver.js +107 -0
- package/dist/requests/drivers/xhr/XMLHttpRequestResponse.d.ts +17 -0
- package/dist/requests/drivers/xhr/XMLHttpRequestResponse.js +84 -0
- package/dist/requests/exceptions/BadGatewayException.d.ts +3 -0
- package/dist/requests/exceptions/BadGatewayException.js +3 -0
- package/dist/requests/exceptions/BadRequestException.d.ts +3 -0
- package/dist/requests/exceptions/BadRequestException.js +3 -0
- package/dist/requests/exceptions/ConflictException.d.ts +3 -0
- package/dist/requests/exceptions/ConflictException.js +3 -0
- package/dist/requests/exceptions/ForbiddenException.d.ts +3 -0
- package/dist/requests/exceptions/ForbiddenException.js +3 -0
- package/dist/requests/exceptions/GatewayTimeoutException.d.ts +3 -0
- package/dist/requests/exceptions/GatewayTimeoutException.js +3 -0
- package/dist/requests/exceptions/GoneException.d.ts +3 -0
- package/dist/requests/exceptions/GoneException.js +3 -0
- package/dist/requests/exceptions/InvalidJsonException.d.ts +7 -0
- package/dist/requests/exceptions/InvalidJsonException.js +10 -0
- package/dist/requests/exceptions/LockedException.d.ts +3 -0
- package/dist/requests/exceptions/LockedException.js +3 -0
- package/dist/requests/exceptions/MethodNotAllowedException.d.ts +3 -0
- package/dist/requests/exceptions/MethodNotAllowedException.js +3 -0
- package/dist/requests/exceptions/NoResponseReceivedException.d.ts +3 -0
- package/{src/requests/exceptions/NoResponseReceivedException.ts → dist/requests/exceptions/NoResponseReceivedException.js} +3 -3
- package/dist/requests/exceptions/NotFoundException.d.ts +3 -0
- package/dist/requests/exceptions/NotFoundException.js +3 -0
- package/dist/requests/exceptions/NotImplementedException.d.ts +3 -0
- package/dist/requests/exceptions/NotImplementedException.js +3 -0
- package/dist/requests/exceptions/PageExpiredException.d.ts +3 -0
- package/dist/requests/exceptions/PageExpiredException.js +3 -0
- package/dist/requests/exceptions/PayloadTooLargeException.d.ts +3 -0
- package/dist/requests/exceptions/PayloadTooLargeException.js +3 -0
- package/dist/requests/exceptions/PreconditionFailedException.d.ts +3 -0
- package/dist/requests/exceptions/PreconditionFailedException.js +3 -0
- package/dist/requests/exceptions/RequestTimeoutException.d.ts +3 -0
- package/dist/requests/exceptions/RequestTimeoutException.js +3 -0
- package/dist/requests/exceptions/ResponseBodyException.d.ts +7 -0
- package/dist/requests/exceptions/ResponseBodyException.js +10 -0
- package/dist/requests/exceptions/ResponseException.d.ts +6 -0
- package/dist/requests/exceptions/ResponseException.js +9 -0
- package/dist/requests/exceptions/ServerErrorException.d.ts +3 -0
- package/dist/requests/exceptions/ServerErrorException.js +3 -0
- package/dist/requests/exceptions/ServiceUnavailableException.d.ts +3 -0
- package/dist/requests/exceptions/ServiceUnavailableException.js +3 -0
- package/dist/requests/exceptions/StaleResponseException.d.ts +5 -0
- package/dist/requests/exceptions/StaleResponseException.js +10 -0
- package/dist/requests/exceptions/TooManyRequestsException.d.ts +3 -0
- package/dist/requests/exceptions/TooManyRequestsException.js +3 -0
- package/dist/requests/exceptions/UnauthorizedException.d.ts +3 -0
- package/dist/requests/exceptions/UnauthorizedException.js +3 -0
- package/dist/requests/exceptions/UnsupportedMediaTypeException.d.ts +3 -0
- package/dist/requests/exceptions/UnsupportedMediaTypeException.js +3 -0
- package/dist/requests/exceptions/ValidationException.d.ts +3 -0
- package/dist/requests/exceptions/ValidationException.js +3 -0
- package/dist/requests/exceptions/index.d.ts +25 -0
- package/dist/requests/exceptions/index.js +25 -0
- package/dist/requests/factories/BinaryBodyFactory.d.ts +8 -0
- package/dist/requests/factories/BinaryBodyFactory.js +9 -0
- package/dist/requests/factories/FormDataFactory.d.ts +12 -0
- package/dist/requests/factories/FormDataFactory.js +6 -0
- package/dist/requests/factories/JsonBodyFactory.d.ts +5 -0
- package/dist/requests/factories/JsonBodyFactory.js +6 -0
- package/dist/requests/index.d.ts +31 -0
- package/dist/requests/index.js +19 -0
- package/dist/requests/responses/BaseResponse.d.ts +14 -0
- package/dist/requests/responses/BaseResponse.js +36 -0
- package/dist/requests/responses/BlobResponse.d.ts +7 -0
- package/dist/requests/responses/BlobResponse.js +16 -0
- package/dist/requests/responses/JsonResponse.d.ts +5 -0
- package/dist/requests/responses/JsonResponse.js +12 -0
- package/dist/requests/responses/PlainTextResponse.d.ts +5 -0
- package/dist/requests/responses/PlainTextResponse.js +12 -0
- package/{src/requests/types/RequestConcurrencyOptions.ts → dist/requests/types/RequestConcurrencyOptions.d.ts} +4 -5
- package/dist/requests/types/RequestConcurrencyOptions.js +1 -0
- package/dist/requests/types/RequestUploadProgress.d.ts +6 -0
- package/dist/requests/types/RequestUploadProgress.js +1 -0
- package/dist/support/DeferredPromise.d.ts +37 -0
- package/dist/support/DeferredPromise.js +55 -0
- package/dist/support/helpers.d.ts +5 -0
- package/dist/support/helpers.js +69 -0
- package/{src/support/index.ts → dist/support/index.d.ts} +3 -4
- package/dist/support/index.js +3 -0
- package/dist/vue/composables/useConfirmDialog.d.ts +20 -0
- package/dist/vue/composables/useConfirmDialog.js +52 -0
- package/dist/vue/composables/useGlobalCheckbox.d.ts +13 -0
- package/dist/vue/composables/useGlobalCheckbox.js +123 -0
- package/dist/vue/composables/useIsEmpty.d.ts +4 -0
- package/dist/vue/composables/useIsEmpty.js +27 -0
- package/dist/vue/composables/useIsOpen.d.ts +5 -0
- package/dist/vue/composables/useIsOpen.js +25 -0
- package/dist/vue/composables/useIsOpenFromVar.d.ts +6 -0
- package/dist/vue/composables/useIsOpenFromVar.js +45 -0
- package/dist/vue/composables/useModelWrapper.d.ts +9 -0
- package/dist/vue/composables/useModelWrapper.js +18 -0
- package/dist/vue/composables/useOnOpen.d.ts +7 -0
- package/dist/vue/composables/useOnOpen.js +25 -0
- package/{src/vue/contracts/ModelValueOptions.ts → dist/vue/contracts/ModelValueOptions.d.ts} +1 -1
- package/dist/vue/contracts/ModelValueOptions.js +1 -0
- package/dist/vue/contracts/ModelValueProps.d.ts +3 -0
- package/dist/vue/contracts/ModelValueProps.js +1 -0
- package/dist/vue/forms/BaseForm.d.ts +162 -0
- package/dist/vue/forms/BaseForm.js +997 -0
- package/dist/vue/forms/PropertyAwareArray.d.ts +53 -0
- package/dist/vue/forms/PropertyAwareArray.js +54 -0
- package/{src/vue/forms/index.ts → dist/vue/forms/index.d.ts} +9 -11
- package/dist/vue/forms/index.js +6 -0
- package/dist/vue/forms/types/PersistedForm.d.ts +6 -0
- package/dist/vue/forms/types/PersistedForm.js +1 -0
- package/dist/vue/forms/validation/ValidationMode.enum.d.ts +11 -0
- package/dist/vue/forms/validation/ValidationMode.enum.js +14 -0
- package/dist/vue/forms/validation/index.d.ts +12 -0
- package/dist/vue/forms/validation/index.js +9 -0
- package/dist/vue/forms/validation/rules/BaseRule.d.ts +5 -0
- package/dist/vue/forms/validation/rules/BaseRule.js +5 -0
- package/dist/vue/forms/validation/rules/ConfirmedRule.d.ts +10 -0
- package/dist/vue/forms/validation/rules/ConfirmedRule.js +26 -0
- package/dist/vue/forms/validation/rules/EmailRule.d.ts +7 -0
- package/dist/vue/forms/validation/rules/EmailRule.js +19 -0
- package/dist/vue/forms/validation/rules/JsonRule.d.ts +7 -0
- package/dist/vue/forms/validation/rules/JsonRule.js +25 -0
- package/dist/vue/forms/validation/rules/MinRule.d.ts +26 -0
- package/dist/vue/forms/validation/rules/MinRule.js +52 -0
- package/dist/vue/forms/validation/rules/RequiredRule.d.ts +7 -0
- package/dist/vue/forms/validation/rules/RequiredRule.js +16 -0
- package/dist/vue/forms/validation/rules/UrlRule.d.ts +7 -0
- package/dist/vue/forms/validation/rules/UrlRule.js +22 -0
- package/{src/vue/forms/validation/types/BidirectionalRule.ts → dist/vue/forms/validation/types/BidirectionalRule.d.ts} +4 -4
- package/dist/vue/forms/validation/types/BidirectionalRule.js +1 -0
- package/dist/vue/forms/validation/types/ValidationRules.d.ts +11 -0
- package/dist/vue/forms/validation/types/ValidationRules.js +1 -0
- package/dist/vue/index.d.ts +11 -0
- package/dist/vue/index.js +10 -0
- package/dist/vue/requests/factories/VueRequestLoaderFactory.d.ts +6 -0
- package/dist/vue/requests/factories/VueRequestLoaderFactory.js +6 -0
- package/{src/vue/requests/index.ts → dist/vue/requests/index.d.ts} +4 -5
- package/dist/vue/requests/index.js +4 -0
- package/dist/vue/requests/loaders/VueRequestBatchLoader.d.ts +12 -0
- package/dist/vue/requests/loaders/VueRequestBatchLoader.js +29 -0
- package/dist/vue/requests/loaders/VueRequestLoader.d.ts +8 -0
- package/dist/vue/requests/loaders/VueRequestLoader.js +12 -0
- package/dist/vue/router/routeResourceBinding/RouteResourceBoundView.d.ts +57 -0
- package/dist/vue/router/routeResourceBinding/RouteResourceBoundView.js +135 -0
- package/dist/vue/router/routeResourceBinding/RouteResourceRequestResolver.d.ts +6 -0
- package/dist/vue/router/routeResourceBinding/RouteResourceRequestResolver.js +20 -0
- package/dist/vue/router/routeResourceBinding/defineRoute.d.ts +23 -0
- package/dist/vue/router/routeResourceBinding/defineRoute.js +42 -0
- package/dist/vue/router/routeResourceBinding/index.d.ts +8 -0
- package/dist/vue/router/routeResourceBinding/index.js +6 -0
- package/dist/vue/router/routeResourceBinding/installRouteInjection.d.ts +14 -0
- package/dist/vue/router/routeResourceBinding/installRouteInjection.js +133 -0
- package/dist/vue/router/routeResourceBinding/types.d.ts +55 -0
- package/dist/vue/router/routeResourceBinding/types.js +1 -0
- package/dist/vue/router/routeResourceBinding/useRouteResource.d.ts +8 -0
- package/dist/vue/router/routeResourceBinding/useRouteResource.js +29 -0
- package/dist/vue/state/State.d.ts +75 -0
- package/dist/vue/state/State.js +267 -0
- package/dist/vue/state/index.d.ts +2 -0
- package/dist/vue/state/index.js +2 -0
- package/package.json +81 -23
- package/.editorconfig +0 -508
- package/.eslintrc.cjs +0 -15
- package/.prettierrc.json +0 -8
- package/CHANGELOG.md +0 -213
- package/docker-compose.yaml +0 -8
- package/docs/.vitepress/config.ts +0 -124
- package/docs/index.md +0 -13
- package/docs/laravel/pagination.md +0 -67
- package/docs/laravel/requests.md +0 -62
- package/docs/services/pagination/index.md +0 -46
- package/docs/services/pagination/infinite-scroller.md +0 -20
- package/docs/services/pagination/page-aware.md +0 -51
- package/docs/services/pagination/state-pagination.md +0 -77
- package/docs/services/pagination/updating-rows.md +0 -52
- package/docs/services/persistence/index.md +0 -46
- package/docs/services/requests/abort-requests.md +0 -29
- package/docs/services/requests/bulk-requests.md +0 -70
- package/docs/services/requests/concurrency.md +0 -58
- package/docs/services/requests/drivers.md +0 -115
- package/docs/services/requests/error-handling.md +0 -153
- package/docs/services/requests/events.md +0 -53
- package/docs/services/requests/file-uploads.md +0 -105
- package/docs/services/requests/getting-started.md +0 -201
- package/docs/services/requests/headers.md +0 -40
- package/docs/services/requests/loading.md +0 -63
- package/docs/services/requests/request-bodies.md +0 -61
- package/docs/services/requests/responses.md +0 -34
- package/docs/services/support/deferred-promise.md +0 -63
- package/docs/services/support/helpers.md +0 -77
- package/docs/services/support/index.md +0 -6
- package/docs/upgrading/v1-to-v2.md +0 -64
- package/docs/upgrading/v2-to-v3.md +0 -52
- package/docs/upgrading/v3-to-v4.md +0 -214
- package/docs/upgrading.md +0 -0
- package/docs/vue/composables/use-confirm-dialog.md +0 -96
- package/docs/vue/composables/use-global-checkbox.md +0 -73
- package/docs/vue/composables/use-is-empty.md +0 -26
- package/docs/vue/composables/use-is-open-from-var.md +0 -32
- package/docs/vue/composables/use-is-open.md +0 -28
- package/docs/vue/composables/use-model-wrapper.md +0 -29
- package/docs/vue/composables/use-on-open.md +0 -26
- package/docs/vue/forms/arrays.md +0 -102
- package/docs/vue/forms/errors.md +0 -52
- package/docs/vue/forms/index.md +0 -99
- package/docs/vue/forms/payloads.md +0 -99
- package/docs/vue/forms/persistence.md +0 -19
- package/docs/vue/forms/state-and-properties.md +0 -26
- package/docs/vue/forms/utilities.md +0 -27
- package/docs/vue/forms/validation.md +0 -189
- package/docs/vue/requests/loading.md +0 -51
- package/docs/vue/router/route-resource-binding.md +0 -240
- package/docs/vue/state.md +0 -309
- package/env.d.ts +0 -1
- package/eslint.config.js +0 -15
- package/release-tool.json +0 -26
- package/src/bulkRequests/BulkRequestEvent.enum.ts +0 -4
- package/src/bulkRequests/BulkRequestSender.ts +0 -196
- package/src/bulkRequests/BulkRequestWrapper.ts +0 -49
- package/src/bulkRequests/index.ts +0 -6
- package/src/laravel/pagination/dataDrivers/RequestDriver.ts +0 -30
- package/src/laravel/pagination/index.ts +0 -6
- package/src/laravel/requests/JsonBaseRequest.ts +0 -35
- package/src/laravel/requests/PaginationJsonBaseRequest.ts +0 -29
- package/src/laravel/requests/index.ts +0 -9
- package/src/laravel/requests/responses/JsonResponse.ts +0 -8
- package/src/laravel/requests/responses/PaginationResponse.ts +0 -16
- package/src/pagination/BasePaginator.ts +0 -94
- package/src/pagination/InfiniteScroller.ts +0 -22
- package/src/pagination/PageAwarePaginator.ts +0 -132
- package/src/pagination/StatePaginator.ts +0 -86
- package/src/pagination/contracts/BaseViewDriverContract.ts +0 -6
- package/src/pagination/contracts/PaginateableRequestContract.ts +0 -13
- package/src/pagination/contracts/PaginationDataDriverContract.ts +0 -5
- package/src/pagination/contracts/ViewDriverContract.ts +0 -10
- package/src/pagination/contracts/ViewDriverFactoryContract.ts +0 -5
- package/src/pagination/dataDrivers/ArrayDriver.ts +0 -28
- package/src/pagination/dtos/PaginationDataDto.ts +0 -14
- package/src/pagination/dtos/StatePaginationDataDto.ts +0 -19
- package/src/pagination/factories/VueBaseViewDriverFactory.ts +0 -9
- package/src/pagination/factories/VuePaginationDriverFactory.ts +0 -9
- package/src/pagination/frontendDrivers/VueBaseViewDriver.ts +0 -28
- package/src/pagination/frontendDrivers/VuePaginationDriver.ts +0 -61
- package/src/pagination/index.ts +0 -46
- package/src/persistenceDrivers/LocalStorageDriver.ts +0 -22
- package/src/persistenceDrivers/NonPersistentDriver.ts +0 -12
- package/src/persistenceDrivers/SessionStorageDriver.ts +0 -22
- package/src/persistenceDrivers/index.ts +0 -8
- package/src/persistenceDrivers/types/PersistenceDriver.ts +0 -5
- package/src/requests/BaseRequest.ts +0 -321
- package/src/requests/ErrorHandler.ts +0 -144
- package/src/requests/RequestConcurrencyMode.enum.ts +0 -6
- package/src/requests/RequestErrorRouter.ts +0 -89
- package/src/requests/RequestEvents.enum.ts +0 -4
- package/src/requests/RequestMethod.enum.ts +0 -8
- package/src/requests/bodies/FormDataBody.ts +0 -81
- package/src/requests/bodies/JsonBody.ts +0 -16
- package/src/requests/contracts/BaseRequestContract.ts +0 -39
- package/src/requests/contracts/BodyContract.ts +0 -7
- package/src/requests/contracts/BodyFactoryContract.ts +0 -5
- package/src/requests/contracts/DriverConfigContract.ts +0 -9
- package/src/requests/contracts/HeadersContract.ts +0 -5
- package/src/requests/contracts/RequestDriverContract.ts +0 -15
- package/src/requests/contracts/RequestLoaderContract.ts +0 -5
- package/src/requests/contracts/ResponseContract.ts +0 -7
- package/src/requests/drivers/contracts/ResponseHandlerContract.ts +0 -10
- package/src/requests/drivers/fetch/FetchDriver.ts +0 -115
- package/src/requests/drivers/fetch/FetchResponse.ts +0 -30
- package/src/requests/drivers/xhr/XMLHttpRequestDriver.ts +0 -138
- package/src/requests/drivers/xhr/XMLHttpRequestResponse.ts +0 -95
- package/src/requests/exceptions/BadGatewayException.ts +0 -3
- package/src/requests/exceptions/BadRequestException.ts +0 -3
- package/src/requests/exceptions/ConflictException.ts +0 -3
- package/src/requests/exceptions/ForbiddenException.ts +0 -3
- package/src/requests/exceptions/GatewayTimeoutException.ts +0 -3
- package/src/requests/exceptions/GoneException.ts +0 -3
- package/src/requests/exceptions/InvalidJsonException.ts +0 -15
- package/src/requests/exceptions/LockedException.ts +0 -3
- package/src/requests/exceptions/MethodNotAllowedException.ts +0 -3
- package/src/requests/exceptions/NotFoundException.ts +0 -3
- package/src/requests/exceptions/NotImplementedException.ts +0 -3
- package/src/requests/exceptions/PageExpiredException.ts +0 -3
- package/src/requests/exceptions/PayloadTooLargeException.ts +0 -3
- package/src/requests/exceptions/PreconditionFailedException.ts +0 -3
- package/src/requests/exceptions/RequestTimeoutException.ts +0 -3
- package/src/requests/exceptions/ResponseBodyException.ts +0 -15
- package/src/requests/exceptions/ResponseException.ts +0 -11
- package/src/requests/exceptions/ServerErrorException.ts +0 -3
- package/src/requests/exceptions/ServiceUnavailableException.ts +0 -3
- package/src/requests/exceptions/StaleResponseException.ts +0 -13
- package/src/requests/exceptions/TooManyRequestsException.ts +0 -3
- package/src/requests/exceptions/UnauthorizedException.ts +0 -3
- package/src/requests/exceptions/UnsupportedMediaTypeException.ts +0 -3
- package/src/requests/exceptions/ValidationException.ts +0 -3
- package/src/requests/exceptions/index.ts +0 -51
- package/src/requests/factories/FormDataFactory.ts +0 -17
- package/src/requests/factories/JsonBodyFactory.ts +0 -9
- package/src/requests/index.ts +0 -61
- package/src/requests/responses/BaseResponse.ts +0 -41
- package/src/requests/responses/BlobResponse.ts +0 -19
- package/src/requests/responses/JsonResponse.ts +0 -15
- package/src/requests/responses/PlainTextResponse.ts +0 -15
- package/src/requests/types/RequestUploadProgress.ts +0 -6
- package/src/support/DeferredPromise.ts +0 -67
- package/src/support/helpers.ts +0 -78
- package/src/vue/composables/useConfirmDialog.ts +0 -63
- package/src/vue/composables/useGlobalCheckbox.ts +0 -145
- package/src/vue/composables/useIsEmpty.ts +0 -34
- package/src/vue/composables/useIsOpen.ts +0 -37
- package/src/vue/composables/useIsOpenFromVar.ts +0 -61
- package/src/vue/composables/useModelWrapper.ts +0 -27
- package/src/vue/composables/useOnOpen.ts +0 -34
- package/src/vue/contracts/ModelValueProps.ts +0 -3
- package/src/vue/forms/BaseForm.ts +0 -1192
- package/src/vue/forms/PropertyAwareArray.ts +0 -81
- package/src/vue/forms/types/PersistedForm.ts +0 -6
- package/src/vue/forms/validation/ValidationMode.enum.ts +0 -14
- package/src/vue/forms/validation/index.ts +0 -15
- package/src/vue/forms/validation/rules/BaseRule.ts +0 -7
- package/src/vue/forms/validation/rules/ConfirmedRule.ts +0 -39
- package/src/vue/forms/validation/rules/EmailRule.ts +0 -23
- package/src/vue/forms/validation/rules/JsonRule.ts +0 -28
- package/src/vue/forms/validation/rules/MinRule.ts +0 -61
- package/src/vue/forms/validation/rules/RequiredRule.ts +0 -19
- package/src/vue/forms/validation/rules/UrlRule.ts +0 -24
- package/src/vue/forms/validation/types/ValidationRules.ts +0 -15
- package/src/vue/index.ts +0 -14
- package/src/vue/requests/factories/VueRequestLoaderFactory.ts +0 -10
- package/src/vue/requests/loaders/VueRequestBatchLoader.ts +0 -35
- package/src/vue/requests/loaders/VueRequestLoader.ts +0 -18
- package/src/vue/router/routeResourceBinding/RouteResourceBoundView.ts +0 -145
- package/src/vue/router/routeResourceBinding/RouteResourceRequestResolver.ts +0 -11
- package/src/vue/router/routeResourceBinding/defineRoute.ts +0 -59
- package/src/vue/router/routeResourceBinding/index.ts +0 -11
- package/src/vue/router/routeResourceBinding/installRouteInjection.ts +0 -164
- package/src/vue/router/routeResourceBinding/types.ts +0 -53
- package/src/vue/router/routeResourceBinding/useRouteResource.ts +0 -24
- package/src/vue/state/State.ts +0 -380
- package/src/vue/state/index.ts +0 -3
- package/tests/service/bulkRequests/BulkRequestSender.test.ts +0 -76
- package/tests/service/bulkRequests/BulkRequestWrapper.test.ts +0 -51
- package/tests/service/helpers/mergeDeep.test.ts +0 -53
- package/tests/service/laravel/pagination/dataDrivers/RequestDriver.test.ts +0 -84
- package/tests/service/laravel/requests/JsonBaseRequest.test.ts +0 -43
- package/tests/service/laravel/requests/PaginationJsonBaseRequest.test.ts +0 -58
- package/tests/service/laravel/requests/responses/JsonResponse.test.ts +0 -59
- package/tests/service/laravel/requests/responses/PaginationResponse.test.ts +0 -127
- package/tests/service/pagination/BasePaginator.test.ts +0 -100
- package/tests/service/pagination/InfiniteScroller.test.ts +0 -101
- package/tests/service/pagination/PageAwarePaginator.test.ts +0 -133
- package/tests/service/pagination/StatePaginator.test.ts +0 -76
- package/tests/service/pagination/VueViewDrivers.test.ts +0 -46
- package/tests/service/pagination/dtos/PaginationDataDto.test.ts +0 -35
- package/tests/service/pagination/dtos/StatePaginationDataDto.test.ts +0 -14
- package/tests/service/pagination/factories/VuePaginationDriverFactory.test.ts +0 -32
- package/tests/service/pagination/frontendDrivers/VuePaginationDriver.test.ts +0 -66
- package/tests/service/persistenceDrivers/PersistenceDrivers.test.ts +0 -56
- package/tests/service/requests/BaseRequest.test.ts +0 -250
- package/tests/service/requests/BodiesAndFactories.test.ts +0 -28
- package/tests/service/requests/Enums.test.ts +0 -20
- package/tests/service/requests/ErrorHandler.test.ts +0 -188
- package/tests/service/requests/FormDataBody.test.ts +0 -63
- package/tests/service/requests/RequestErrorRouter.test.ts +0 -44
- package/tests/service/requests/Responses.test.ts +0 -83
- package/tests/service/requests/exceptions/Exceptions.test.ts +0 -43
- package/tests/service/requests/fetch/FetchDriver.test.ts +0 -76
- package/tests/service/requests/fetch/FetchResponse.test.ts +0 -21
- package/tests/service/requests/xhr/XMLHttpRequestDriver.test.ts +0 -178
- package/tests/service/support/DeferredPromise.test.ts +0 -40
- package/tests/service/support/helpers.test.ts +0 -37
- package/tests/vue/composables/useConfirmDialog.test.ts +0 -77
- package/tests/vue/composables/useGlobalCheckbox.test.ts +0 -126
- package/tests/vue/composables/useIsEmpty.test.ts +0 -18
- package/tests/vue/composables/useIsOpen.test.ts +0 -25
- package/tests/vue/composables/useIsOpenFromVar.test.ts +0 -22
- package/tests/vue/composables/useModelWrapper.test.ts +0 -30
- package/tests/vue/composables/useOnOpen.test.ts +0 -26
- package/tests/vue/forms/BaseForm.behavior.test.ts +0 -98
- package/tests/vue/forms/BaseForm.transformers.test.ts +0 -109
- package/tests/vue/forms/PropertyAwareArray.test.ts +0 -30
- package/tests/vue/forms/validation/ValidationRules.test.ts +0 -79
- package/tests/vue/requests/VueRequestLoaders.test.ts +0 -48
- package/tests/vue/router/routeResourceBinding/RouteResourceBoundView.test.ts +0 -344
- package/tests/vue/router/routeResourceBinding/RouteResourceUtils.test.ts +0 -70
- package/tests/vue/router/routeResourceBinding/installRouteInjection.test.ts +0 -450
- package/tests/vue/state/State.test.ts +0 -151
- package/tsconfig.json +0 -114
- package/vite.config.ts +0 -34
- 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
|
-
}
|
package/src/vue/state/State.ts
DELETED
|
@@ -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
|
-
}
|
package/src/vue/state/index.ts
DELETED
|
@@ -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
|
-
})
|