@blueprint-ts/core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/.editorconfig +508 -0
  2. package/.eslintrc.cjs +15 -0
  3. package/.prettierrc.json +8 -0
  4. package/LICENSE +21 -0
  5. package/README.md +1 -0
  6. package/docker-compose.yaml +8 -0
  7. package/docs/.vitepress/config.ts +68 -0
  8. package/docs/.vitepress/theme/Layout.vue +14 -0
  9. package/docs/.vitepress/theme/components/VersionSelector.vue +64 -0
  10. package/docs/.vitepress/theme/index.js +13 -0
  11. package/docs/index.md +70 -0
  12. package/docs/services/laravel/pagination.md +54 -0
  13. package/docs/services/laravel/requests.md +62 -0
  14. package/docs/services/requests/index.md +74 -0
  15. package/docs/vue/forms.md +326 -0
  16. package/docs/vue/requests/route-model-binding.md +66 -0
  17. package/docs/vue/state.md +293 -0
  18. package/env.d.ts +1 -0
  19. package/eslint.config.js +15 -0
  20. package/examples/files/7z2404-x64.exe +0 -0
  21. package/examples/index.html +14 -0
  22. package/examples/js/app.js +8 -0
  23. package/examples/js/router.js +22 -0
  24. package/examples/js/view/App.vue +49 -0
  25. package/examples/js/view/layout/DemoPage.vue +28 -0
  26. package/examples/js/view/pagination/Pagination.vue +28 -0
  27. package/examples/js/view/pagination/components/errorPagination/ErrorPagination.vue +71 -0
  28. package/examples/js/view/pagination/components/errorPagination/GetProductsRequest.ts +54 -0
  29. package/examples/js/view/pagination/components/infiniteScrolling/GetProductsRequest.ts +50 -0
  30. package/examples/js/view/pagination/components/infiniteScrolling/InfiniteScrolling.vue +57 -0
  31. package/examples/js/view/pagination/components/tablePagination/GetProductsRequest.ts +50 -0
  32. package/examples/js/view/pagination/components/tablePagination/TablePagination.vue +63 -0
  33. package/examples/js/view/requests/Requests.vue +34 -0
  34. package/examples/js/view/requests/components/abortableRequest/AbortableRequest.vue +36 -0
  35. package/examples/js/view/requests/components/abortableRequest/GetProductsRequest.ts +25 -0
  36. package/examples/js/view/requests/components/fileDownloadRequest/DownloadFileRequest.ts +15 -0
  37. package/examples/js/view/requests/components/fileDownloadRequest/FileDownloadRequest.vue +44 -0
  38. package/examples/js/view/requests/components/getRequestWithDynamicParams/GetProductsRequest.ts +34 -0
  39. package/examples/js/view/requests/components/getRequestWithDynamicParams/GetRequestWithDynamicParams.vue +59 -0
  40. package/examples/js/view/requests/components/serverErrorRequest/ServerErrorRequest.ts +21 -0
  41. package/examples/js/view/requests/components/serverErrorRequest/ServerErrorRequest.vue +53 -0
  42. package/package.json +81 -0
  43. package/release-tool.json +7 -0
  44. package/src/helpers.ts +78 -0
  45. package/src/service/bulkRequests/BulkRequestEvent.enum.ts +4 -0
  46. package/src/service/bulkRequests/BulkRequestSender.ts +184 -0
  47. package/src/service/bulkRequests/BulkRequestWrapper.ts +49 -0
  48. package/src/service/bulkRequests/index.ts +6 -0
  49. package/src/service/laravel/pagination/contracts/PaginationParamsContract.ts +4 -0
  50. package/src/service/laravel/pagination/contracts/PaginationResponseBodyContract.ts +6 -0
  51. package/src/service/laravel/pagination/dataDrivers/RequestDriver.ts +32 -0
  52. package/src/service/laravel/pagination/index.ts +7 -0
  53. package/src/service/laravel/requests/JsonBaseRequest.ts +35 -0
  54. package/src/service/laravel/requests/PaginationJsonBaseRequest.ts +29 -0
  55. package/src/service/laravel/requests/index.ts +9 -0
  56. package/src/service/laravel/requests/responses/JsonResponse.ts +8 -0
  57. package/src/service/laravel/requests/responses/PaginationResponse.ts +16 -0
  58. package/src/service/pagination/InfiniteScroller.ts +21 -0
  59. package/src/service/pagination/Paginator.ts +149 -0
  60. package/src/service/pagination/contracts/PaginateableRequestContract.ts +13 -0
  61. package/src/service/pagination/contracts/PaginationDataDriverContract.ts +5 -0
  62. package/src/service/pagination/contracts/PaginationResponseContract.ts +7 -0
  63. package/src/service/pagination/contracts/PaginatorLoadDataOptions.ts +4 -0
  64. package/src/service/pagination/contracts/ViewDriverContract.ts +12 -0
  65. package/src/service/pagination/contracts/ViewDriverFactoryContract.ts +5 -0
  66. package/src/service/pagination/dataDrivers/ArrayDriver.ts +28 -0
  67. package/src/service/pagination/dtos/PaginationDataDto.ts +14 -0
  68. package/src/service/pagination/factories/VuePaginationDriverFactory.ts +9 -0
  69. package/src/service/pagination/frontendDrivers/VuePaginationDriver.ts +61 -0
  70. package/src/service/pagination/index.ts +16 -0
  71. package/src/service/persistenceDrivers/LocalStorageDriver.ts +22 -0
  72. package/src/service/persistenceDrivers/NonPersistentDriver.ts +12 -0
  73. package/src/service/persistenceDrivers/SessionStorageDriver.ts +22 -0
  74. package/src/service/persistenceDrivers/index.ts +8 -0
  75. package/src/service/persistenceDrivers/types/PersistenceDriver.ts +5 -0
  76. package/src/service/requests/BaseRequest.ts +197 -0
  77. package/src/service/requests/ErrorHandler.ts +64 -0
  78. package/src/service/requests/RequestEvents.enum.ts +3 -0
  79. package/src/service/requests/RequestMethod.enum.ts +8 -0
  80. package/src/service/requests/bodies/FormDataBody.ts +41 -0
  81. package/src/service/requests/bodies/JsonBody.ts +16 -0
  82. package/src/service/requests/contracts/AbortableRequestContract.ts +3 -0
  83. package/src/service/requests/contracts/BaseRequestContract.ts +36 -0
  84. package/src/service/requests/contracts/BodyContract.ts +7 -0
  85. package/src/service/requests/contracts/BodyFactoryContract.ts +5 -0
  86. package/src/service/requests/contracts/DriverConfigContract.ts +7 -0
  87. package/src/service/requests/contracts/HeadersContract.ts +5 -0
  88. package/src/service/requests/contracts/RequestDriverContract.ts +15 -0
  89. package/src/service/requests/contracts/RequestLoaderContract.ts +5 -0
  90. package/src/service/requests/contracts/RequestLoaderFactoryContract.ts +5 -0
  91. package/src/service/requests/contracts/ResponseContract.ts +7 -0
  92. package/src/service/requests/drivers/contracts/ResponseHandlerContract.ts +10 -0
  93. package/src/service/requests/drivers/fetch/FetchDriver.ts +115 -0
  94. package/src/service/requests/drivers/fetch/FetchResponse.ts +30 -0
  95. package/src/service/requests/exceptions/NoResponseReceivedException.ts +3 -0
  96. package/src/service/requests/exceptions/NotFoundException.ts +3 -0
  97. package/src/service/requests/exceptions/PageExpiredException.ts +3 -0
  98. package/src/service/requests/exceptions/ResponseBodyException.ts +15 -0
  99. package/src/service/requests/exceptions/ResponseException.ts +11 -0
  100. package/src/service/requests/exceptions/ServerErrorException.ts +3 -0
  101. package/src/service/requests/exceptions/UnauthorizedException.ts +3 -0
  102. package/src/service/requests/exceptions/ValidationException.ts +3 -0
  103. package/src/service/requests/exceptions/index.ts +19 -0
  104. package/src/service/requests/factories/FormDataFactory.ts +9 -0
  105. package/src/service/requests/factories/JsonBodyFactory.ts +9 -0
  106. package/src/service/requests/index.ts +50 -0
  107. package/src/service/requests/responses/BaseResponse.ts +41 -0
  108. package/src/service/requests/responses/BlobResponse.ts +19 -0
  109. package/src/service/requests/responses/JsonResponse.ts +15 -0
  110. package/src/service/requests/responses/PlainTextResponse.ts +15 -0
  111. package/src/service/support/DeferredPromise.ts +67 -0
  112. package/src/service/support/index.ts +3 -0
  113. package/src/vue/composables/useConfirmDialog.ts +59 -0
  114. package/src/vue/composables/useGlobalCheckbox.ts +145 -0
  115. package/src/vue/composables/useIsEmpty.ts +34 -0
  116. package/src/vue/composables/useIsOpen.ts +37 -0
  117. package/src/vue/composables/useIsOpenFromVar.ts +61 -0
  118. package/src/vue/composables/useModelWrapper.ts +24 -0
  119. package/src/vue/composables/useOnOpen.ts +34 -0
  120. package/src/vue/contracts/ModelValueOptions.ts +3 -0
  121. package/src/vue/contracts/ModelValueProps.ts +3 -0
  122. package/src/vue/forms/BaseForm.ts +1074 -0
  123. package/src/vue/forms/PropertyAwareArray.ts +78 -0
  124. package/src/vue/forms/index.ts +11 -0
  125. package/src/vue/forms/types/PersistedForm.ts +6 -0
  126. package/src/vue/forms/validation/ValidationMode.enum.ts +14 -0
  127. package/src/vue/forms/validation/index.ts +12 -0
  128. package/src/vue/forms/validation/rules/BaseRule.ts +7 -0
  129. package/src/vue/forms/validation/rules/ConfirmedRule.ts +39 -0
  130. package/src/vue/forms/validation/rules/MinRule.ts +61 -0
  131. package/src/vue/forms/validation/rules/RequiredRule.ts +19 -0
  132. package/src/vue/forms/validation/rules/UrlRule.ts +24 -0
  133. package/src/vue/forms/validation/types/BidirectionalRule.ts +11 -0
  134. package/src/vue/index.ts +14 -0
  135. package/src/vue/requests/factories/VueRequestLoaderFactory.ts +9 -0
  136. package/src/vue/requests/index.ts +5 -0
  137. package/src/vue/requests/loaders/VueRequestBatchLoader.ts +30 -0
  138. package/src/vue/requests/loaders/VueRequestLoader.ts +18 -0
  139. package/src/vue/router/routeModelBinding/RouteModelRequestResolver.ts +11 -0
  140. package/src/vue/router/routeModelBinding/defineRoute.ts +31 -0
  141. package/src/vue/router/routeModelBinding/index.ts +8 -0
  142. package/src/vue/router/routeModelBinding/installRouteInjection.ts +73 -0
  143. package/src/vue/router/routeModelBinding/types.ts +46 -0
  144. package/src/vue/state/State.ts +391 -0
  145. package/src/vue/state/index.ts +3 -0
  146. package/tests/service/helpers/mergeDeep.test.ts +53 -0
  147. package/tests/service/laravel/pagination/dataDrivers/RequestDriver.test.ts +84 -0
  148. package/tests/service/laravel/requests/JsonBaseRequest.test.ts +43 -0
  149. package/tests/service/laravel/requests/PaginationJsonBaseRequest.test.ts +58 -0
  150. package/tests/service/laravel/requests/responses/JsonResponse.test.ts +59 -0
  151. package/tests/service/laravel/requests/responses/PaginationResponse.test.ts +127 -0
  152. package/tests/service/pagination/dtos/PaginationDataDto.test.ts +35 -0
  153. package/tests/service/pagination/factories/VuePaginationDriverFactory.test.ts +32 -0
  154. package/tests/service/pagination/frontendDrivers/VuePaginationDriver.test.ts +66 -0
  155. package/tests/service/requests/ErrorHandler.test.ts +141 -0
  156. package/tsconfig.json +114 -0
  157. package/vite.config.ts +34 -0
  158. package/vitest.config.ts +14 -0
@@ -0,0 +1,50 @@
1
+ import {BaseRequest, type Paginatable, JsonResponse } from '@hank-it/ui/service/requests'
2
+ import type {PaginationResponseContract} from '@hank-it/ui/service/pagination'
3
+
4
+ export interface ProductResource {
5
+ id: number
6
+ title: string
7
+ description: string
8
+ }
9
+
10
+ export interface ProductPaginationResource {
11
+ products: ProductResource[]
12
+ total: number
13
+ limit: number
14
+ skip: number
15
+ }
16
+
17
+ export class GetProductsRequestResponse extends JsonResponse implements PaginationResponseContract {
18
+ public getData() {
19
+ return this.data
20
+ }
21
+
22
+ public getTotal(): number {
23
+ return this.body.total
24
+ }
25
+
26
+ public dataHandler(data) {
27
+ return data.products
28
+ }
29
+ }
30
+
31
+ export class GetProductsRequest extends BaseRequest implements Paginatable {
32
+ method() {
33
+ return 'GET'
34
+ }
35
+
36
+ url() {
37
+ return 'https://dummyjson.com/products'
38
+ }
39
+
40
+ public setPaginationParams(page: number, size: number): BaseRequest {
41
+ return this.withParams({
42
+ skip: (page - 1) * size,
43
+ limit: size,
44
+ })
45
+ }
46
+
47
+ protected getResponse() {
48
+ return new GetProductsRequestResponse
49
+ }
50
+ }
@@ -0,0 +1,57 @@
1
+ <template>
2
+ <div class="container" @scroll="scroll">
3
+ <div class="item" v-for="row in paginator.getPageData()">
4
+ {{ row }}
5
+ <br>
6
+ </div>
7
+ </div>
8
+ </template>
9
+
10
+ <script setup lang="ts">
11
+ import {GetProductsRequest} from "./GetProductsRequest";
12
+ import {InfiniteScroller, RequestDriver, VuePaginationDriverFactory, Paginator} from '@hank-it/ui/service/pagination'
13
+ import {VueLoaderDriverFactory, BaseRequest, FetchDriver} from '@hank-it/ui/service/requests'
14
+ import {isAtBottom} from '@hank-it/ui/service/helpers'
15
+ import { debounce } from 'lodash'
16
+
17
+ function scroll(event) {
18
+ console.log("scroll")
19
+
20
+ if (isAtBottom(event.target.scrollHeight, event.target.scrollTop, event.target.clientHeight)) {
21
+ loadNextDebounced()
22
+ }
23
+ }
24
+
25
+ const loadNextDebounced = debounce(event => {
26
+ paginator.toNextPage()
27
+ }, 100)
28
+
29
+ /* Booting */
30
+ BaseRequest.setRequestDriver(new FetchDriver)
31
+ BaseRequest.setLoaderStateFactory(new VueLoaderDriverFactory)
32
+ Paginator.setViewDriverFactory(new VuePaginationDriverFactory())
33
+
34
+ /* component */
35
+ const getProductsRequest = new GetProductsRequest
36
+
37
+ const paginator = new InfiniteScroller(new RequestDriver(getProductsRequest))
38
+
39
+ paginator.init(1, 10)
40
+
41
+ </script>
42
+
43
+ <style scoped>
44
+ .container {
45
+ overflow: auto;
46
+ border-style: solid;
47
+ border-color: red;
48
+ height: 400px;
49
+ display: flex;
50
+ flex-direction: column;
51
+ }
52
+
53
+ .item {
54
+ margin-top: 10px;
55
+ margin-bottom: 10px;
56
+ }
57
+ </style>
@@ -0,0 +1,50 @@
1
+ import {BaseRequest, type Paginatable, JsonResponse } from '@hank-it/ui/service/requests'
2
+ import type {PaginationResponseContract} from '@hank-it/ui/service/pagination'
3
+
4
+ export interface ProductResource {
5
+ id: number
6
+ title: string
7
+ description: string
8
+ }
9
+
10
+ export interface ProductPaginationResource {
11
+ products: ProductResource[]
12
+ total: number
13
+ limit: number
14
+ skip: number
15
+ }
16
+
17
+ export class GetProductsRequestResponse extends JsonResponse implements PaginationResponseContract {
18
+ public getData() {
19
+ return this.data
20
+ }
21
+
22
+ public getTotal(): number {
23
+ return this.body.total
24
+ }
25
+
26
+ public dataHandler(data) {
27
+ return data.products
28
+ }
29
+ }
30
+
31
+ export class GetProductsRequest extends BaseRequest implements Paginatable {
32
+ method() {
33
+ return 'GET'
34
+ }
35
+
36
+ url() {
37
+ return 'https://dummyjson.com/products'
38
+ }
39
+
40
+ public setPaginationParams(page: number, size: number): BaseRequest {
41
+ return this.withParams({
42
+ skip: (page - 1) * size,
43
+ limit: size,
44
+ })
45
+ }
46
+
47
+ protected getResponse() {
48
+ return new GetProductsRequestResponse
49
+ }
50
+ }
@@ -0,0 +1,63 @@
1
+ <template>
2
+ <table>
3
+ <tr>
4
+ <th>ID</th>
5
+ <th>Title</th>
6
+ <th>Description</th>
7
+ </tr>
8
+ <tr v-for="row in paginator.getPageData()">
9
+ <td>{{ row.id }}</td>
10
+ <td>{{ row.title }}</td>
11
+ <td>{{ row.description }}</td>
12
+ </tr>
13
+ </table>
14
+
15
+ Current page: {{ paginator.getCurrentPage() }}
16
+ <br>
17
+ Pages: {{ paginator.getPages() }}
18
+ <br>
19
+ Page Size: <input v-model="pageSize" />
20
+ <br>
21
+ Back Page <button @click="paginator.toPreviousPage()">Back</button>
22
+ <br>
23
+ Next Page <button @click="paginator.toNextPage()">Next</button>
24
+ <br>
25
+ Showing {{ paginator.getFromItemNumber() }} to {{ paginator.getToItemNumber() }} of {{ paginator.getTotal() }} items.
26
+
27
+ {{ displayablePages }}
28
+ </template>
29
+
30
+ <script setup lang="ts">
31
+ import {GetProductsRequest} from "./GetProductsRequest";
32
+ import {Paginator, RequestDriver, VuePaginationDriverFactory} from '@hank-it/ui/service/pagination'
33
+ import {VueLoaderDriverFactory, BaseRequest, FetchDriver} from '@hank-it/ui/service/requests'
34
+ import {computed} from 'vue'
35
+ import {getDisplayablePages} from '@hank-it/ui/service/helpers'
36
+
37
+ /* Booting */
38
+ BaseRequest.setRequestDriver(new FetchDriver)
39
+ BaseRequest.setLoaderStateFactory(new VueLoaderDriverFactory)
40
+ Paginator.setViewDriverFactory(new VuePaginationDriverFactory())
41
+
42
+ /* component */
43
+ const getProductsRequest = new GetProductsRequest
44
+
45
+ const paginator = new Paginator(new RequestDriver(getProductsRequest))
46
+
47
+ paginator.init(1, 10)
48
+
49
+ const pageSize = computed({
50
+ set(value) {
51
+ paginator.setPageSize(value)
52
+ },
53
+ get() {
54
+ return paginator.getPageSize()
55
+ }
56
+ })
57
+
58
+ const displayablePages = computed(() => {
59
+ console.log(paginator.getPages())
60
+
61
+ return getDisplayablePages(paginator.getPages().length, paginator.getCurrentPage())
62
+ })
63
+ </script>
@@ -0,0 +1,34 @@
1
+ <template>
2
+ <DemoPage :components="components" />
3
+ </template>
4
+
5
+ <script setup lang="ts">
6
+ import GetRequestWithDynamicParams from './components/getRequestWithDynamicParams/GetRequestWithDynamicParams.vue'
7
+ import AbortableRequest from './components/abortableRequest/AbortableRequest.vue'
8
+ import ServerErrorRequest from './components/serverErrorRequest/ServerErrorRequest.vue'
9
+ import FileDownloadRequest from './components/fileDownloadRequest/FileDownloadRequest.vue'
10
+ import DemoPage from '../layout/DemoPage.vue'
11
+
12
+ const components = {
13
+ 'get-request-with-dynamic-params': {
14
+ name: 'Get request with dynamic params',
15
+ component: GetRequestWithDynamicParams,
16
+ route: { name: 'requests', params: { component: 'get-request-with-dynamic-params' } },
17
+ },
18
+ 'abortable-request': {
19
+ name: 'Abortable request',
20
+ component: AbortableRequest,
21
+ route: { name: 'requests', params: { component: 'abortable-request' } },
22
+ },
23
+ 'server-error-request': {
24
+ name: 'Server error request',
25
+ component: ServerErrorRequest,
26
+ route: { name: 'requests', params: { component: 'server-error-request' } },
27
+ },
28
+ 'file-download-request': {
29
+ name: 'File download request',
30
+ component: FileDownloadRequest,
31
+ route: { name: 'requests', params: { component: 'file-download-request' } },
32
+ },
33
+ }
34
+ </script>
@@ -0,0 +1,36 @@
1
+ <template>
2
+ <h1>Abortable request</h1>
3
+
4
+ <p v-if="request.isLoading()">Lade...</p>
5
+
6
+ <p>Response: {{ data }}</p>
7
+
8
+ <button @click="controller.abort()">Abort</button>
9
+ </template>
10
+
11
+ <script setup lang="ts">
12
+ import {ref} from "vue";
13
+ import {VueLoaderDriverFactory, BaseRequest, FetchDriver} from '@hank-it/ui/service/requests'
14
+ import {GetProductsRequest} from './GetProductsRequest'
15
+
16
+ /* Booting */
17
+ BaseRequest.setRequestDriver(new FetchDriver)
18
+ BaseRequest.setLoaderStateFactory(new VueLoaderDriverFactory)
19
+
20
+ /* Component */
21
+ const controller = new AbortController();
22
+
23
+ const data = ref({})
24
+
25
+ const request = new GetProductsRequest({
26
+ abortSignal: controller.signal,
27
+ })
28
+
29
+ function sendRequest() {
30
+ request.send().then(response => {
31
+ data.value = response.data
32
+ })
33
+ }
34
+
35
+ sendRequest()
36
+ </script>
@@ -0,0 +1,25 @@
1
+ import {BaseRequest, BaseResponse } from '@hank-it/ui/service/requests'
2
+ import DriverConfigContract from '../../../../../../src/service/requests/contracts/DriverConfigContract'
3
+ import JsonResponse from '../../../../../../src/service/requests/responses/JsonResponse'
4
+
5
+ export class GetProductsRequestResponse extends JsonResponse {}
6
+
7
+ export class GetProductsRequest extends BaseRequest implements GetProductsRequest {
8
+ method() {
9
+ return 'GET'
10
+ }
11
+
12
+ url() {
13
+ return 'https://dummyjson.com/products/?delay=5000'
14
+ }
15
+
16
+ protected getConfig(): DriverConfigContract {
17
+ return {
18
+ corsWithCredentials: false,
19
+ }
20
+ }
21
+
22
+ protected getResponse() {
23
+ return new GetProductsRequestResponse
24
+ }
25
+ }
@@ -0,0 +1,15 @@
1
+ import {BaseRequest, BlobResponse } from '@hank-it/ui/service/requests'
2
+
3
+ export default class DownloadFileRequest extends BaseRequest {
4
+ method() {
5
+ return 'GET'
6
+ }
7
+
8
+ url() {
9
+ return 'http://localhost:5173/files/7z2404-x64.exe'
10
+ }
11
+
12
+ protected getResponse() {
13
+ return new BlobResponse
14
+ }
15
+ }
@@ -0,0 +1,44 @@
1
+ <template>
2
+ <div>
3
+
4
+ </div>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ import {ref, computed} from 'vue'
9
+ import {VueLoaderDriverFactory, BaseRequest, FetchDriver} from '@hank-it/ui/service/requests'
10
+ import DownloadFileRequest from './DownloadFileRequest'
11
+
12
+ /* Booting */
13
+ BaseRequest.setRequestDriver(new FetchDriver)
14
+ BaseRequest.setLoaderStateFactory(new VueLoaderDriverFactory)
15
+
16
+ /* Component */
17
+ const request = new DownloadFileRequest
18
+
19
+ function sendRequest() {
20
+ request.send().then(response => {
21
+ console.log(response)
22
+
23
+ // saveBlob(response.data, 'test.exe');
24
+ })
25
+ }
26
+
27
+ function saveBlob(blob, fileName) {
28
+ const a = document.createElement("a");
29
+ document.body.appendChild(a);
30
+ a.style = "display: none";
31
+
32
+ const url = window.URL.createObjectURL(blob);
33
+ a.href = url;
34
+ a.download = fileName;
35
+ a.click();
36
+ window.URL.revokeObjectURL(url);
37
+ }
38
+
39
+ sendRequest()
40
+ </script>
41
+
42
+ <style scoped>
43
+
44
+ </style>
@@ -0,0 +1,34 @@
1
+ import {BaseRequest, type Paginatable, type DriverConfigContract, JsonResponse } from '@hank-it/ui/service/requests'
2
+
3
+ export class GetProductsRequestResponse extends JsonResponse {
4
+ public dataHandler(data) {
5
+ return data.products
6
+ }
7
+ }
8
+
9
+ export class GetProductsRequest extends BaseRequest implements Paginatable {
10
+ method() {
11
+ return 'GET'
12
+ }
13
+
14
+ url() {
15
+ return 'https://dummyjson.com/products/search'
16
+ }
17
+
18
+ public setPaginationParams(page: number, size: number): BaseRequest {
19
+ return this.withParams({
20
+ skip: (page - 1) * size,
21
+ limit: size,
22
+ })
23
+ }
24
+
25
+ protected getConfig(): DriverConfigContract {
26
+ return {
27
+ corsWithCredentials: false,
28
+ }
29
+ }
30
+
31
+ protected getResponse() {
32
+ return new GetProductsRequestResponse
33
+ }
34
+ }
@@ -0,0 +1,59 @@
1
+ <template>
2
+ <h1>Get request with dynamic params</h1>
3
+
4
+ <input placeholder="Search" v-model="search">
5
+
6
+ <p v-if="request.isLoading()">Lade...</p>
7
+
8
+ <table>
9
+ <tr v-for="row in data">
10
+ <td>{{ row.id }}</td>
11
+ <td>{{ row.title }}</td>
12
+ <td>{{ row.description }}</td>
13
+ </tr>
14
+ </table>
15
+ </template>
16
+
17
+ <script setup lang="ts">
18
+ import {ref, computed} from 'vue'
19
+ import {VueLoaderDriverFactory, BaseRequest, FetchDriver} from '@hank-it/ui/service/requests'
20
+ import {GetProductsRequest} from './GetProductsRequest'
21
+
22
+ /* Booting */
23
+ BaseRequest.setRequestDriver(new FetchDriver({
24
+ corsWithCredentials: true,
25
+ }))
26
+ BaseRequest.setLoaderStateFactory(new VueLoaderDriverFactory)
27
+
28
+ /* Component */
29
+ const internalSearch = ref('')
30
+
31
+ const search = computed({
32
+ set(value) {
33
+ internalSearch.value = value
34
+
35
+ sendRequest()
36
+ },
37
+ get() {
38
+ return internalSearch.value
39
+ }
40
+ })
41
+
42
+ const data = ref({})
43
+
44
+ const request = new GetProductsRequest
45
+
46
+ function sendRequest() {
47
+ request.setParams({
48
+ q: search.value,
49
+ }).send().then(response => {
50
+ data.value = response.data
51
+ })
52
+ }
53
+
54
+ sendRequest()
55
+ </script>
56
+
57
+ <style scoped>
58
+
59
+ </style>
@@ -0,0 +1,21 @@
1
+ import {BaseRequest, JsonResponse } from '@hank-it/ui/service/requests'
2
+
3
+ export class GetProductsRequestResponse extends JsonResponse {}
4
+
5
+ export class ServerErrorRequest extends BaseRequest implements ServerErrorRequest {
6
+ method() {
7
+ return 'GET'
8
+ }
9
+
10
+ url() {
11
+ return 'https://dummyjson.com/http/500'
12
+ }
13
+
14
+ public getCorsWithCredentials(): boolean {
15
+ return false
16
+ }
17
+
18
+ protected getResponse() {
19
+ return new GetProductsRequestResponse
20
+ }
21
+ }
@@ -0,0 +1,53 @@
1
+ <template>
2
+ <h1>Server error request</h1>
3
+
4
+ <p v-if="request.isLoading()">Lade...</p>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ import {ref} from 'vue'
9
+ import { VueLoaderDriverFactory, BaseRequest, FetchDriver, ResponseException, ErrorHandler } from '@hank-it/ui/service/requests'
10
+ import {ServerErrorRequest} from './ServerErrorRequest'
11
+
12
+ /* Booting */
13
+ BaseRequest.setRequestDriver(new FetchDriver({
14
+ corsWithCredentials: false
15
+ }))
16
+ BaseRequest.setLoaderStateFactory(new VueLoaderDriverFactory)
17
+
18
+ /* Component */
19
+ const data = ref({})
20
+
21
+ const request = new ServerErrorRequest()
22
+
23
+ function sendRequest() {
24
+ request.send()
25
+ .then(response => {
26
+ data.value = response.data
27
+ })
28
+ .catch((response: ResponseException) => {
29
+ console.log('Specific error handler')
30
+
31
+ console.log(response.getError().getStatusCode())
32
+ console.log(response.getError().getHeaders())
33
+ console.log(response.getError().getOriginalError())
34
+ response.getError().getBodyPromise().then(body => {
35
+ console.log(body)
36
+ })
37
+ })
38
+ }
39
+
40
+ // Global error handler
41
+ ErrorHandler.registerHandler(error => {
42
+ console.debug("Registered handler")
43
+
44
+ console.log(error.getStatusCode())
45
+ console.log(error.getHeaders())
46
+ console.log(error.getOriginalError())
47
+ error.getBodyPromise().then(body => {
48
+ console.log(body)
49
+ })
50
+ })
51
+
52
+ sendRequest()
53
+ </script>
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "@blueprint-ts/core",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "type": "module",
9
+ "exports": {
10
+ "./service/pagination": "./src/service/pagination/index.ts",
11
+ "./service/support": "./src/service/support/index.ts",
12
+ "./service/requests": "./src/service/requests/index.ts",
13
+ "./service/bulkRequests": "./src/service/bulkRequests/index.ts",
14
+ "./service/persistenceDrivers": "./src/service/persistenceDrivers/index.ts",
15
+ "./service/requests/exceptions": "./src/service/requests/exceptions/index.ts",
16
+ "./service/laravel/requests": "./src/service/laravel/requests/index.ts",
17
+ "./service/laravel/pagination": "./src/service/laravel/pagination/index.ts",
18
+ "./helpers": "./src/helpers.ts",
19
+ "./vue": "./src/vue/index.ts",
20
+ "./vue/forms": "./src/vue/forms/index.ts",
21
+ "./vue/forms/validation": "./src/vue/forms/validation/index.ts",
22
+ "./vue/requests": "./src/vue/requests/index.ts",
23
+ "./vue/router/routeModelBinding": "./src/vue/router/routeModelBinding/index.ts",
24
+ "./vue/state": "./src/vue/state/index.ts"
25
+ },
26
+ "scripts": {
27
+ "dev": "vite",
28
+ "build": "run-p type-check \"build-only {@}\" --",
29
+ "preview": "vite preview",
30
+ "test": "vitest",
31
+ "test:coverage": "vitest --coverage",
32
+ "build-only": "vite build",
33
+ "lint": "eslint \"src/**/*.{js,vue,ts}\"",
34
+ "lint:fix": "eslint \"src/**/*.{js,vue,ts}\" --fix",
35
+ "format": "prettier --check src/",
36
+ "type-check": "tsc --noEmit",
37
+ "docs:dev": "vitepress dev docs",
38
+ "docs:build": "vitepress build docs",
39
+ "docs:preview": "vitepress preview docs"
40
+ },
41
+ "optionalDependencies": {
42
+ "@rollup/rollup-linux-x64-gnu": "*",
43
+ "@rollup/rollup-linux-x64-musl": "*",
44
+ "@rollup/rollup-win32-x64-gnu": "*",
45
+ "@rollup/rollup-win32-x64-musl": "*"
46
+ },
47
+ "devDependencies": {
48
+ "@rushstack/eslint-patch": "^1.3.3",
49
+ "@tsconfig/node20": "^20.1.2",
50
+ "@types/jsdom": "^21.1.6",
51
+ "@types/lodash-es": "^4.17.12",
52
+ "@types/node": "^20.11.28",
53
+ "@types/qs": "^6.9.18",
54
+ "@typescript-eslint/eslint-plugin": "^8.21.0",
55
+ "@typescript-eslint/parser": "^8.21.0",
56
+ "@typescript-eslint/typescript-estree": "^8.21.0",
57
+ "@vitejs/plugin-vue": "^5.0.4",
58
+ "@vitejs/plugin-vue-jsx": "^3.1.0",
59
+ "@vitest/coverage-v8": "^3.0.4",
60
+ "@vue/eslint-config-typescript": "^14.0.0",
61
+ "autoprefixer": "^10.4.19",
62
+ "eslint": "^9.0.0",
63
+ "eslint-config-prettier": "^10.0.1",
64
+ "eslint-plugin-vue": "^9.31.0",
65
+ "jsdom": "^24.0.0",
66
+ "npm-run-all2": "^6.1.2",
67
+ "prettier": "^3.0.3",
68
+ "typescript": "^5.7.2",
69
+ "typescript-eslint": "^8.21.0",
70
+ "vite": "^5.1.6",
71
+ "vitepress": "^1.6.3",
72
+ "vitest": "^3.0.4",
73
+ "vue": "^3.4.25",
74
+ "vue-router": "^4.3.2"
75
+ },
76
+ "dependencies": {
77
+ "lodash-es": "^4.17.21",
78
+ "qs": "^6.12.0",
79
+ "uuid": "^11.1.0"
80
+ }
81
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version_file": "package.json",
3
+ "version_pattern": "\"version\":\\s*\"([0-9]+\\.[0-9]+\\.[0-9]+)\"",
4
+ "version_template": "\"version\": \"{}\"",
5
+ "develop_branch": "develop",
6
+ "main_branch": "main"
7
+ }