@movk/nuxt 1.2.0 → 1.3.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 (293) hide show
  1. package/.nuxt/movk-ui.css +3 -0
  2. package/README.md +74 -79
  3. package/dist/module.d.mts +57 -1
  4. package/dist/module.json +2 -2
  5. package/dist/module.mjs +120 -126
  6. package/dist/runtime/components/AutoForm.d.vue.ts +10 -30
  7. package/dist/runtime/components/AutoForm.vue +114 -125
  8. package/dist/runtime/components/AutoForm.vue.d.ts +10 -30
  9. package/dist/runtime/components/ColorChooser.d.vue.ts +21 -22
  10. package/dist/runtime/components/ColorChooser.vue +304 -27
  11. package/dist/runtime/components/ColorChooser.vue.d.ts +21 -22
  12. package/dist/runtime/components/DataTable.d.vue.ts +57 -0
  13. package/dist/runtime/components/DataTable.vue +584 -0
  14. package/dist/runtime/components/DataTable.vue.d.ts +57 -0
  15. package/dist/runtime/components/DatePicker.d.vue.ts +20 -33
  16. package/dist/runtime/components/DatePicker.vue +173 -65
  17. package/dist/runtime/components/DatePicker.vue.d.ts +20 -33
  18. package/dist/runtime/components/MessageBox.d.vue.ts +36 -0
  19. package/dist/runtime/components/MessageBox.vue +113 -0
  20. package/dist/runtime/components/MessageBox.vue.d.ts +36 -0
  21. package/dist/runtime/components/PillGroup.d.vue.ts +33 -0
  22. package/dist/runtime/components/PillGroup.vue +291 -0
  23. package/dist/runtime/components/PillGroup.vue.d.ts +33 -0
  24. package/dist/runtime/components/Popconfirm.d.vue.ts +30 -0
  25. package/dist/runtime/components/Popconfirm.vue +143 -0
  26. package/dist/runtime/components/Popconfirm.vue.d.ts +30 -0
  27. package/dist/runtime/components/SearchForm.d.vue.ts +21 -149
  28. package/dist/runtime/components/SearchForm.vue +211 -153
  29. package/dist/runtime/components/SearchForm.vue.d.ts +21 -149
  30. package/dist/runtime/components/SlideVerify.d.vue.ts +31 -70
  31. package/dist/runtime/components/SlideVerify.vue +117 -90
  32. package/dist/runtime/components/SlideVerify.vue.d.ts +31 -70
  33. package/dist/runtime/components/StarRating.d.vue.ts +38 -87
  34. package/dist/runtime/components/StarRating.vue +118 -74
  35. package/dist/runtime/components/StarRating.vue.d.ts +38 -87
  36. package/dist/runtime/components/input/AsPhoneNumberInput.d.vue.ts +11 -15
  37. package/dist/runtime/components/input/AsPhoneNumberInput.vue +22 -9
  38. package/dist/runtime/components/input/AsPhoneNumberInput.vue.d.ts +11 -15
  39. package/dist/runtime/components/input/WithCharacterLimit.d.vue.ts +11 -13
  40. package/dist/runtime/components/input/WithCharacterLimit.vue +23 -11
  41. package/dist/runtime/components/input/WithCharacterLimit.vue.d.ts +11 -13
  42. package/dist/runtime/components/input/WithClear.d.vue.ts +13 -11
  43. package/dist/runtime/components/input/WithClear.vue +27 -8
  44. package/dist/runtime/components/input/WithClear.vue.d.ts +13 -11
  45. package/dist/runtime/components/input/WithCopy.d.vue.ts +13 -13
  46. package/dist/runtime/components/input/WithCopy.vue +25 -8
  47. package/dist/runtime/components/input/WithCopy.vue.d.ts +13 -13
  48. package/dist/runtime/components/input/WithFloatingLabel.d.vue.ts +13 -16
  49. package/dist/runtime/components/input/WithFloatingLabel.vue +35 -27
  50. package/dist/runtime/components/input/WithFloatingLabel.vue.d.ts +13 -16
  51. package/dist/runtime/components/input/WithPasswordToggle.d.vue.ts +11 -7
  52. package/dist/runtime/components/input/WithPasswordToggle.vue +24 -7
  53. package/dist/runtime/components/input/WithPasswordToggle.vue.d.ts +11 -7
  54. package/dist/runtime/components/theme-picker/ThemePicker.d.vue.ts +8 -1
  55. package/dist/runtime/components/theme-picker/ThemePicker.vue +27 -12
  56. package/dist/runtime/components/theme-picker/ThemePicker.vue.d.ts +8 -1
  57. package/dist/runtime/components/theme-picker/ThemePickerButton.d.vue.ts +9 -4
  58. package/dist/runtime/components/theme-picker/ThemePickerButton.vue +4 -0
  59. package/dist/runtime/components/theme-picker/ThemePickerButton.vue.d.ts +9 -4
  60. package/dist/runtime/composables/index.d.ts +9 -8
  61. package/dist/runtime/composables/index.js +1 -0
  62. package/dist/runtime/composables/useApiFetch.d.ts +10 -5
  63. package/dist/runtime/composables/useApiFetch.js +20 -2
  64. package/dist/runtime/composables/useAutoForm.d.ts +4 -4
  65. package/dist/runtime/composables/useAutoForm.js +23 -9
  66. package/dist/runtime/composables/useClientApiFetch.d.ts +3 -2
  67. package/dist/runtime/composables/useDateFormatter.d.ts +16 -3
  68. package/dist/runtime/composables/useDateFormatter.js +89 -30
  69. package/dist/runtime/composables/useDownloadWithProgress.d.ts +26 -27
  70. package/dist/runtime/composables/useDownloadWithProgress.js +142 -40
  71. package/dist/runtime/composables/useLazyApiFetch.d.ts +3 -2
  72. package/dist/runtime/composables/useMessageBox.d.ts +6 -0
  73. package/dist/runtime/composables/useMessageBox.js +16 -0
  74. package/dist/runtime/composables/useTheme.d.ts +26 -16
  75. package/dist/runtime/composables/useTheme.js +98 -71
  76. package/dist/runtime/composables/useUploadWithProgress.d.ts +23 -29
  77. package/dist/runtime/composables/useUploadWithProgress.js +78 -67
  78. package/dist/runtime/domains/api/auth.d.ts +2 -0
  79. package/dist/runtime/domains/api/auth.js +31 -0
  80. package/dist/runtime/domains/api/endpoint-config.d.ts +11 -0
  81. package/dist/runtime/domains/api/endpoint-config.js +17 -0
  82. package/dist/runtime/domains/api/errors.d.ts +2 -0
  83. package/dist/runtime/domains/api/errors.js +10 -0
  84. package/dist/runtime/domains/api/fetch-key.d.ts +20 -0
  85. package/dist/runtime/domains/api/fetch-key.js +23 -0
  86. package/dist/runtime/domains/api/interceptors/error.d.ts +13 -0
  87. package/dist/runtime/domains/api/interceptors/error.js +49 -0
  88. package/dist/runtime/domains/api/interceptors/request.d.ts +12 -0
  89. package/dist/runtime/domains/api/interceptors/request.js +46 -0
  90. package/dist/runtime/domains/api/interceptors/response.d.ts +17 -0
  91. package/dist/runtime/domains/api/interceptors/response.js +27 -0
  92. package/dist/runtime/domains/api/response.d.ts +4 -0
  93. package/dist/runtime/domains/api/response.js +14 -0
  94. package/dist/runtime/domains/api/toast.d.ts +15 -0
  95. package/dist/runtime/domains/api/toast.js +46 -0
  96. package/dist/runtime/domains/api/transfer.d.ts +69 -0
  97. package/dist/runtime/domains/api/transfer.js +81 -0
  98. package/dist/runtime/domains/auto-form/actions.d.ts +2 -0
  99. package/dist/runtime/domains/auto-form/actions.js +4 -0
  100. package/dist/runtime/domains/auto-form/components/Array.d.vue.ts +13 -0
  101. package/dist/runtime/{components/auto-form-renderer/AutoFormRendererArray.vue → domains/auto-form/components/Array.vue} +25 -29
  102. package/dist/runtime/domains/auto-form/components/Array.vue.d.ts +13 -0
  103. package/dist/runtime/domains/auto-form/components/Children.d.vue.ts +11 -0
  104. package/dist/runtime/{components/auto-form-renderer/AutoFormRendererChildren.vue → domains/auto-form/components/Children.vue} +18 -18
  105. package/dist/runtime/domains/auto-form/components/Children.vue.d.ts +11 -0
  106. package/dist/runtime/domains/auto-form/components/Field.d.vue.ts +11 -0
  107. package/dist/runtime/domains/auto-form/components/Field.vue +56 -0
  108. package/dist/runtime/domains/auto-form/components/Field.vue.d.ts +11 -0
  109. package/dist/runtime/domains/auto-form/components/Layout.d.vue.ts +11 -0
  110. package/dist/runtime/{components/auto-form-renderer/AutoFormRendererLayout.vue → domains/auto-form/components/Layout.vue} +24 -25
  111. package/dist/runtime/domains/auto-form/components/Layout.vue.d.ts +11 -0
  112. package/dist/runtime/domains/auto-form/components/Nested.d.vue.ts +11 -0
  113. package/dist/runtime/{components/auto-form-renderer/AutoFormRendererNested.vue → domains/auto-form/components/Nested.vue} +17 -21
  114. package/dist/runtime/domains/auto-form/components/Nested.vue.d.ts +11 -0
  115. package/dist/runtime/domains/auto-form/controls.d.ts +41 -0
  116. package/dist/runtime/{auto-form → domains/auto-form}/controls.js +27 -24
  117. package/dist/runtime/{auto-form/field-utils.d.ts → domains/auto-form/fields.d.ts} +3 -1
  118. package/dist/runtime/{auto-form/field-utils.js → domains/auto-form/fields.js} +18 -2
  119. package/dist/runtime/{auto-form → domains/auto-form}/metadata.js +1 -1
  120. package/dist/runtime/domains/auto-form/provider.d.ts +62 -0
  121. package/dist/runtime/{auto-form → domains/auto-form}/provider.js +6 -3
  122. package/dist/runtime/{auto-form/reactive-utils.d.ts → domains/auto-form/reactive.d.ts} +5 -5
  123. package/dist/runtime/{auto-form/reactive-utils.js → domains/auto-form/reactive.js} +1 -1
  124. package/dist/runtime/{auto-form/schema-introspector.d.ts → domains/auto-form/schema.d.ts} +2 -2
  125. package/dist/runtime/{auto-form/schema-introspector.js → domains/auto-form/schema.js} +1 -1
  126. package/dist/runtime/domains/data-table/columns/constants.d.ts +50 -0
  127. package/dist/runtime/domains/data-table/columns/constants.js +19 -0
  128. package/dist/runtime/domains/data-table/columns/resolve-columns.d.ts +4 -0
  129. package/dist/runtime/domains/data-table/columns/resolve-columns.js +59 -0
  130. package/dist/runtime/domains/data-table/columns/resolve-data-column.d.ts +9 -0
  131. package/dist/runtime/domains/data-table/columns/resolve-data-column.js +164 -0
  132. package/dist/runtime/domains/data-table/columns/resolve-group-column.d.ts +4 -0
  133. package/dist/runtime/domains/data-table/columns/resolve-group-column.js +19 -0
  134. package/dist/runtime/domains/data-table/columns/resolve-special-columns.d.ts +8 -0
  135. package/dist/runtime/domains/data-table/columns/resolve-special-columns.js +232 -0
  136. package/dist/runtime/domains/data-table/columns/style.d.ts +11 -0
  137. package/dist/runtime/domains/data-table/columns/style.js +67 -0
  138. package/dist/runtime/domains/data-table/columns/utils.d.ts +6 -0
  139. package/dist/runtime/domains/data-table/columns/utils.js +16 -0
  140. package/dist/runtime/domains/data-table/components/ActionConfirm.d.vue.ts +10 -0
  141. package/dist/runtime/domains/data-table/components/ActionConfirm.vue +39 -0
  142. package/dist/runtime/domains/data-table/components/ActionConfirm.vue.d.ts +10 -0
  143. package/dist/runtime/domains/data-table/components/ActionsCell.d.vue.ts +11 -0
  144. package/dist/runtime/domains/data-table/components/ActionsCell.vue +91 -0
  145. package/dist/runtime/domains/data-table/components/ActionsCell.vue.d.ts +11 -0
  146. package/dist/runtime/domains/data-table/components/CellTooltip.d.vue.ts +9 -0
  147. package/dist/runtime/domains/data-table/components/CellTooltip.vue +40 -0
  148. package/dist/runtime/domains/data-table/components/CellTooltip.vue.d.ts +9 -0
  149. package/dist/runtime/domains/data-table/components/Pagination.d.vue.ts +26 -0
  150. package/dist/runtime/domains/data-table/components/Pagination.vue +132 -0
  151. package/dist/runtime/domains/data-table/components/Pagination.vue.d.ts +26 -0
  152. package/dist/runtime/domains/data-table/indent.d.ts +8 -0
  153. package/dist/runtime/domains/data-table/indent.js +19 -0
  154. package/dist/runtime/domains/data-table/tree-selection.d.ts +9 -0
  155. package/dist/runtime/domains/data-table/tree-selection.js +76 -0
  156. package/dist/runtime/{utils/theme.d.ts → domains/theme/theme-icons.d.ts} +0 -1
  157. package/dist/runtime/index.css +1 -0
  158. package/dist/runtime/plugins/api.factory.js +17 -117
  159. package/dist/runtime/plugins/theme.js +49 -27
  160. package/dist/runtime/types/api/config.d.ts +127 -0
  161. package/dist/runtime/types/api/fetch.d.ts +50 -0
  162. package/dist/runtime/types/api/index.d.ts +5 -0
  163. package/dist/runtime/types/api/module.d.ts +94 -0
  164. package/dist/runtime/types/api/response.d.ts +62 -0
  165. package/dist/runtime/types/api/response.js +0 -0
  166. package/dist/runtime/types/api/transfer.d.ts +32 -0
  167. package/dist/runtime/types/api/transfer.js +0 -0
  168. package/dist/runtime/types/app.config.d.ts +6 -0
  169. package/dist/runtime/types/auto-form/base.d.ts +26 -0
  170. package/dist/runtime/types/auto-form/base.js +0 -0
  171. package/dist/runtime/types/auto-form/component.d.ts +28 -0
  172. package/dist/runtime/types/auto-form/component.js +0 -0
  173. package/dist/runtime/types/auto-form/controls.d.ts +45 -0
  174. package/dist/runtime/types/auto-form/controls.js +0 -0
  175. package/dist/runtime/types/auto-form/fields.d.ts +68 -0
  176. package/dist/runtime/types/auto-form/fields.js +0 -0
  177. package/dist/runtime/types/auto-form/index.d.ts +7 -0
  178. package/dist/runtime/types/auto-form/index.js +0 -0
  179. package/dist/runtime/types/auto-form/search-form.d.ts +84 -0
  180. package/dist/runtime/types/auto-form/search-form.js +0 -0
  181. package/dist/runtime/types/auto-form/slots.d.ts +85 -0
  182. package/dist/runtime/types/auto-form/slots.js +0 -0
  183. package/dist/runtime/types/auto-form/zod-factory.d.ts +127 -0
  184. package/dist/runtime/types/auto-form/zod-factory.js +0 -0
  185. package/dist/runtime/types/components/color-chooser.d.ts +109 -0
  186. package/dist/runtime/types/components/color-chooser.js +0 -0
  187. package/dist/runtime/types/components/date-picker.d.ts +41 -0
  188. package/dist/runtime/types/components/date-picker.js +0 -0
  189. package/dist/runtime/types/components/index.d.ts +8 -0
  190. package/dist/runtime/types/components/index.js +0 -0
  191. package/dist/runtime/types/components/input/as-phone-number-input.d.ts +17 -0
  192. package/dist/runtime/types/components/input/as-phone-number-input.js +0 -0
  193. package/dist/runtime/types/components/input/index.d.ts +6 -0
  194. package/dist/runtime/types/components/input/index.js +0 -0
  195. package/dist/runtime/types/components/input/with-character-limit.d.ts +11 -0
  196. package/dist/runtime/types/components/input/with-character-limit.js +0 -0
  197. package/dist/runtime/types/components/input/with-clear.d.ts +10 -0
  198. package/dist/runtime/types/components/input/with-clear.js +0 -0
  199. package/dist/runtime/types/components/input/with-copy.d.ts +11 -0
  200. package/dist/runtime/types/components/input/with-copy.js +0 -0
  201. package/dist/runtime/types/components/input/with-floating-label.d.ts +12 -0
  202. package/dist/runtime/types/components/input/with-floating-label.js +0 -0
  203. package/dist/runtime/types/components/input/with-password-toggle.d.ts +7 -0
  204. package/dist/runtime/types/components/input/with-password-toggle.js +0 -0
  205. package/dist/runtime/types/components/message-box.d.ts +69 -0
  206. package/dist/runtime/types/components/message-box.js +0 -0
  207. package/dist/runtime/types/components/pill-group.d.ts +103 -0
  208. package/dist/runtime/types/components/pill-group.js +0 -0
  209. package/dist/runtime/types/components/popconfirm.d.ts +74 -0
  210. package/dist/runtime/types/components/popconfirm.js +0 -0
  211. package/dist/runtime/types/components/slide-verify.d.ts +54 -0
  212. package/dist/runtime/types/components/slide-verify.js +0 -0
  213. package/dist/runtime/types/components/star-rating.d.ts +55 -0
  214. package/dist/runtime/types/components/star-rating.js +0 -0
  215. package/dist/runtime/types/data-table/columns.d.ts +236 -0
  216. package/dist/runtime/types/data-table/columns.js +6 -0
  217. package/dist/runtime/types/data-table/component.d.ts +190 -0
  218. package/dist/runtime/types/data-table/component.js +0 -0
  219. package/dist/runtime/types/data-table/contexts.d.ts +44 -0
  220. package/dist/runtime/types/data-table/contexts.js +0 -0
  221. package/dist/runtime/types/data-table/index.d.ts +6 -0
  222. package/dist/runtime/types/data-table/index.js +1 -0
  223. package/dist/runtime/types/data-table/pagination.d.ts +87 -0
  224. package/dist/runtime/types/data-table/pagination.js +0 -0
  225. package/dist/runtime/types/index.d.ts +6 -5
  226. package/dist/runtime/types/index.js +5 -5
  227. package/dist/runtime/types/shared.d.ts +5 -0
  228. package/dist/runtime/types/shared.js +0 -0
  229. package/dist/runtime/types/zod.d.ts +11 -10
  230. package/dist/runtime/utils/extend-theme.d.ts +19 -0
  231. package/dist/runtime/utils/extend-theme.js +44 -0
  232. package/dist/runtime/utils/form-control.d.ts +33 -0
  233. package/dist/runtime/utils/form-control.js +54 -0
  234. package/dist/runtime/utils/meta.d.ts +2 -5
  235. package/dist/runtime/utils/meta.js +1 -3
  236. package/dist/runtime/utils/theme-defaults.d.ts +27 -0
  237. package/dist/runtime/utils/theme-defaults.js +28 -0
  238. package/dist/runtime/utils/tv.d.ts +1 -0
  239. package/dist/runtime/utils/tv.js +4 -0
  240. package/dist/runtime/vue/composables/useSiteConfig.d.ts +13 -0
  241. package/dist/runtime/vue/composables/useSiteConfig.js +11 -0
  242. package/dist/runtime/vue/plugins/theme.d.ts +6 -0
  243. package/dist/runtime/vue/plugins/theme.js +14 -0
  244. package/dist/runtime/vue/stubs/base.d.ts +2 -0
  245. package/dist/runtime/vue/stubs/base.js +2 -0
  246. package/dist/runtime/vue/stubs/inertia.d.ts +2 -0
  247. package/dist/runtime/vue/stubs/inertia.js +2 -0
  248. package/dist/runtime/vue/stubs/movk-extra.d.ts +2 -0
  249. package/dist/runtime/vue/stubs/movk-extra.js +2 -0
  250. package/dist/runtime/vue/stubs/none.d.ts +2 -0
  251. package/dist/runtime/vue/stubs/none.js +2 -0
  252. package/dist/runtime/vue/stubs/vue-router.d.ts +2 -0
  253. package/dist/runtime/vue/stubs/vue-router.js +2 -0
  254. package/dist/shared/nuxt.DfBEyjld.mjs +667 -0
  255. package/dist/types.d.mts +2 -6
  256. package/dist/unplugin.d.mts +28 -0
  257. package/dist/unplugin.mjs +292 -0
  258. package/dist/vite.d.mts +12 -0
  259. package/dist/vite.mjs +20 -0
  260. package/package.json +75 -36
  261. package/vue-plugin.d.ts +5 -0
  262. package/dist/runtime/auto-form/controls.d.ts +0 -221
  263. package/dist/runtime/auto-form/provider.d.ts +0 -27
  264. package/dist/runtime/components/auto-form-renderer/AutoFormRendererArray.d.vue.ts +0 -28
  265. package/dist/runtime/components/auto-form-renderer/AutoFormRendererArray.vue.d.ts +0 -28
  266. package/dist/runtime/components/auto-form-renderer/AutoFormRendererChildren.d.vue.ts +0 -26
  267. package/dist/runtime/components/auto-form-renderer/AutoFormRendererChildren.vue.d.ts +0 -26
  268. package/dist/runtime/components/auto-form-renderer/AutoFormRendererField.d.vue.ts +0 -26
  269. package/dist/runtime/components/auto-form-renderer/AutoFormRendererField.vue +0 -55
  270. package/dist/runtime/components/auto-form-renderer/AutoFormRendererField.vue.d.ts +0 -26
  271. package/dist/runtime/components/auto-form-renderer/AutoFormRendererLayout.d.vue.ts +0 -26
  272. package/dist/runtime/components/auto-form-renderer/AutoFormRendererLayout.vue.d.ts +0 -26
  273. package/dist/runtime/components/auto-form-renderer/AutoFormRendererNested.d.vue.ts +0 -26
  274. package/dist/runtime/components/auto-form-renderer/AutoFormRendererNested.vue.d.ts +0 -26
  275. package/dist/runtime/constants/api-defaults.d.ts +0 -9
  276. package/dist/runtime/constants/api-defaults.js +0 -32
  277. package/dist/runtime/constants/grid-cols.d.ts +0 -7
  278. package/dist/runtime/constants/grid-cols.js +0 -44
  279. package/dist/runtime/style.css +0 -1
  280. package/dist/runtime/types/api.d.ts +0 -349
  281. package/dist/runtime/types/auto-form.d.ts +0 -259
  282. package/dist/runtime/types/module.d.ts +0 -96
  283. package/dist/runtime/types/theme.d.ts +0 -2
  284. package/dist/runtime/utils/api-utils.d.ts +0 -58
  285. package/dist/runtime/utils/api-utils.js +0 -98
  286. /package/dist/runtime/{constants/auto-form.d.ts → domains/auto-form/constants.d.ts} +0 -0
  287. /package/dist/runtime/{constants/auto-form.js → domains/auto-form/constants.js} +0 -0
  288. /package/dist/runtime/{auto-form → domains/auto-form}/metadata.d.ts +0 -0
  289. /package/dist/runtime/{utils/theme.js → domains/theme/theme-icons.js} +0 -0
  290. /package/dist/runtime/types/{api.js → api/config.js} +0 -0
  291. /package/dist/runtime/types/{auto-form.js → api/fetch.js} +0 -0
  292. /package/dist/runtime/types/{module.js → api/index.js} +0 -0
  293. /package/dist/runtime/types/{theme.js → api/module.js} +0 -0
@@ -1,139 +1,39 @@
1
- import {
2
- showToast,
3
- isBusinessSuccess,
4
- extractMessage,
5
- extractData,
6
- createApiError,
7
- extractToastMessage,
8
- getAuthHeaders
9
- } from "../utils/api-utils.js";
10
- import { defineNuxtPlugin, navigateTo, useNuxtApp, useUserSession, useRuntimeConfig } from "#imports";
11
- import defu from "defu";
12
- async function handleUnauthorized(config, nuxtApp) {
13
- const unauthorizedConfig = config.unauthorized;
14
- if (!unauthorizedConfig) return;
15
- if (unauthorizedConfig.clearSession) {
16
- try {
17
- const userSession = nuxtApp.vueApp.runWithContext(() => useUserSession());
18
- if (userSession?.clear) {
19
- await userSession.clear();
20
- await userSession.fetch();
21
- }
22
- } catch {
23
- }
24
- }
25
- if (unauthorizedConfig.redirect) {
26
- const loginPath = unauthorizedConfig.loginPath || "/login";
27
- await nuxtApp.runWithContext(() => navigateTo(loginPath));
28
- }
29
- }
30
- function getApiFetchContext(options) {
31
- return options.context || {};
32
- }
1
+ import { resolveEndpointConfig } from "../domains/api/endpoint-config.js";
2
+ import { createOnRequest } from "../domains/api/interceptors/request.js";
3
+ import { createOnResponse } from "../domains/api/interceptors/response.js";
4
+ import { createOnResponseError } from "../domains/api/interceptors/error.js";
5
+ import { defineNuxtPlugin, useNuxtApp, useRuntimeConfig } from "#imports";
33
6
  function createEndpointFetch(resolvedConfig, publicConfig, nuxtApp) {
34
- const { auth: authConfig, toast: toastConfig, response: responseConfig } = resolvedConfig;
35
7
  return $fetch.create({
36
8
  baseURL: resolvedConfig.baseURL,
37
9
  headers: resolvedConfig.headers,
38
- async onRequest(context) {
39
- if (authConfig.enabled) {
40
- const authHeaders = getAuthHeaders({ auth: authConfig });
41
- const headers = new Headers(context.options.headers);
42
- for (const [key, value] of Object.entries(authHeaders)) {
43
- headers.set(key, value);
44
- }
45
- context.options.headers = headers;
46
- }
47
- if (publicConfig.debug) {
48
- const h = context.options.headers;
49
- const headersLog = h instanceof Headers ? Object.fromEntries(h.entries()) : h;
50
- console.log("[Movk API] Request:", {
51
- method: context.options.method || "GET",
52
- url: `${resolvedConfig.baseURL}${context.request}`,
53
- headers: headersLog,
54
- body: context.options.body ? "(body present)" : void 0
55
- });
56
- }
57
- await nuxtApp.callHook("movk:api:request", context);
58
- },
59
- async onResponse(context) {
60
- const raw = context.response._data;
61
- const { toast, skipBusinessCheck } = getApiFetchContext(context.options);
62
- if (publicConfig.debug) {
63
- console.log("[Movk API] Response:", raw);
64
- }
65
- if (skipBusinessCheck || isBusinessSuccess(raw, responseConfig)) {
66
- context.response._data = extractData(raw, responseConfig);
67
- await nuxtApp.callHook("movk:api:response", context);
68
- if (import.meta.client) {
69
- const message = toast !== false ? extractToastMessage(toast, "success", extractMessage(raw, responseConfig) || "") : void 0;
70
- showToast("success", message, toast, toastConfig);
71
- }
72
- } else {
73
- await nuxtApp.callHook("movk:api:error", context);
74
- if (import.meta.client) {
75
- const message = extractMessage(raw, responseConfig);
76
- const errorMessage = toast !== false ? extractToastMessage(toast, "error", message || "\u8BF7\u6C42\u5931\u8D25") : void 0;
77
- showToast("error", errorMessage, toast, toastConfig);
78
- }
79
- throw createApiError(raw, extractMessage(raw, responseConfig));
80
- }
81
- },
82
- async onResponseError(context) {
83
- const { response } = context;
84
- const { toast } = getApiFetchContext(context.options);
85
- if (response.status === 401) {
86
- const result = { handled: false };
87
- await nuxtApp.callHook("movk:api:unauthorized", context, result);
88
- if (!result.handled) {
89
- await handleUnauthorized(authConfig, nuxtApp);
90
- }
91
- }
92
- await nuxtApp.callHook("movk:api:error", context);
93
- if (import.meta.client) {
94
- const data = response._data;
95
- const message = data ? extractMessage(data, responseConfig) : void 0;
96
- const errorMessage = toast !== false ? extractToastMessage(toast, "error", message || `\u8BF7\u6C42\u5931\u8D25 (${response.status})`) : void 0;
97
- showToast("error", errorMessage, toast, toastConfig);
98
- }
99
- if (publicConfig.debug) {
100
- console.error("[Movk API] Error:", response.status, response._data);
101
- }
102
- }
10
+ onRequest: createOnRequest(resolvedConfig, publicConfig, nuxtApp),
11
+ onResponse: createOnResponse(resolvedConfig, publicConfig, nuxtApp),
12
+ onResponseError: createOnResponseError(resolvedConfig, publicConfig, nuxtApp)
103
13
  });
104
14
  }
105
15
  export default defineNuxtPlugin(() => {
106
16
  const nuxtApp = useNuxtApp();
107
17
  const runtimeConfig = useRuntimeConfig();
108
18
  const publicConfig = runtimeConfig.public.movkApi;
109
- const privateConfig = import.meta.server ? runtimeConfig.movkApi : void 0;
19
+ const privateEndpoints = import.meta.server ? runtimeConfig.movkApi?.endpoints : void 0;
110
20
  const endpointCache = /* @__PURE__ */ new Map();
21
+ const defaultEndpoint = publicConfig.defaultEndpoint || "default";
111
22
  const getOrCreateEndpoint = (endpointName) => {
112
- if (endpointCache.has(endpointName)) {
113
- return endpointCache.get(endpointName);
114
- }
115
- const endpoints = publicConfig.endpoints || {};
116
- const endpointConfig = endpoints[endpointName];
117
- if (!endpointConfig) {
118
- console.warn(`[Movk API] Endpoint "${endpointName}" not found, using default`);
119
- return getOrCreateEndpoint(publicConfig.defaultEndpoint || "default");
23
+ const cached = endpointCache.get(endpointName);
24
+ if (cached) return cached;
25
+ if (!publicConfig.endpoints?.[endpointName] && endpointName !== defaultEndpoint) {
26
+ console.warn(`[@movk/nuxt] Endpoint "${endpointName}" not found, using default`);
27
+ return getOrCreateEndpoint(defaultEndpoint);
120
28
  }
121
- const privateEndpointConfig = privateConfig?.endpoints?.[endpointName];
122
- const resolvedConfig = {
123
- ...endpointConfig,
124
- headers: privateEndpointConfig?.headers,
125
- auth: defu(endpointConfig.auth, publicConfig.auth),
126
- toast: defu(endpointConfig.toast, publicConfig.toast),
127
- response: defu(endpointConfig.response, publicConfig.response)
128
- };
129
- const $fetchInstance = createEndpointFetch(resolvedConfig, publicConfig, nuxtApp);
29
+ const resolved = resolveEndpointConfig(publicConfig, endpointName, privateEndpoints);
30
+ const $fetchInstance = createEndpointFetch(resolved, publicConfig, nuxtApp);
130
31
  const apiInstance = Object.assign($fetchInstance, {
131
32
  use: (endpoint) => getOrCreateEndpoint(endpoint)
132
33
  });
133
34
  endpointCache.set(endpointName, apiInstance);
134
35
  return apiInstance;
135
36
  };
136
- const defaultEndpoint = publicConfig.defaultEndpoint || "default";
137
37
  const api = getOrCreateEndpoint(defaultEndpoint);
138
38
  return {
139
39
  provide: {
@@ -1,6 +1,6 @@
1
- import { defineNuxtPlugin, useAppConfig, useHead, useSiteConfig } from "#imports";
2
1
  import { kebabCase } from "@movk/core";
3
- import { themeIcons } from "../utils/theme.js";
2
+ import { defineNuxtPlugin, useAppConfig, useHead, useSiteConfig } from "#imports";
3
+ import { themeIcons } from "../domains/theme/theme-icons.js";
4
4
  export default defineNuxtPlugin({
5
5
  enforce: "post",
6
6
  setup() {
@@ -16,62 +16,84 @@ export default defineNuxtPlugin({
16
16
  if (icons) appConfig.ui.icons = themeIcons[icons];
17
17
  }
18
18
  if (import.meta.server) {
19
+ const pickerFonts = appConfig.movk?.picker?.fonts ?? [];
20
+ const fontHrefMap = {};
21
+ for (const f of pickerFonts) {
22
+ if (f.href) fontHrefMap[f.name] = f.href;
23
+ }
24
+ const fontHrefMapJson = JSON.stringify(fontHrefMap);
19
25
  useHead({
20
26
  script: [{
21
27
  innerHTML: `
22
- var colorsEl = document.querySelector('style#nuxt-ui-colors');
23
- if (colorsEl) {
24
- let html = colorsEl.innerHTML;
25
- if (localStorage.getItem('${name}-ui-primary')) {
26
- const primaryColor = localStorage.getItem('${name}-ui-primary');
27
- if (primaryColor !== 'black') {
28
+ (function() {
29
+ var primaryColor = localStorage.getItem('${name}-ui-primary');
30
+ var neutralColor = localStorage.getItem('${name}-ui-neutral');
31
+ if (!primaryColor && !neutralColor) return;
32
+ function swapColors(el) {
33
+ var html = el.innerHTML;
34
+ if (primaryColor && primaryColor !== 'black') {
28
35
  html = html.replace(
29
36
  /(--ui-color-primary-\\d{2,3}:\\s*var\\(--color-)${appConfig.ui.colors.primary}(-\\d{2,3}.*?\\))/g,
30
37
  \`$1\${primaryColor}$2\`
31
38
  );
32
39
  }
40
+ if (neutralColor) {
41
+ html = html.replace(
42
+ /(--ui-color-neutral-\\d{2,3}:\\s*var\\(--color-)${appConfig.ui.colors.neutral}(-\\d{2,3}.*?\\))/g,
43
+ \`$1\${neutralColor === 'neutral' ? 'old-neutral' : neutralColor}$2\`
44
+ );
45
+ }
46
+ el.innerHTML = html;
33
47
  }
34
- if (localStorage.getItem('${name}-ui-neutral')) {
35
- let neutralColor = localStorage.getItem('${name}-ui-neutral');
36
- html = html.replace(
37
- /(--ui-color-neutral-\\d{2,3}:\\s*var\\(--color-)${appConfig.ui.colors.neutral}(-\\d{2,3}.*?\\))/g,
38
- \`$1\${neutralColor === 'neutral' ? 'old-neutral' : neutralColor}$2\`
39
- );
48
+ var colorsEl = document.querySelector('style#nuxt-ui-colors');
49
+ if (colorsEl) {
50
+ swapColors(colorsEl);
51
+ } else {
52
+ var obs = new MutationObserver(function(mutations) {
53
+ for (var i = 0; i < mutations.length; i++) {
54
+ for (var j = 0; j < mutations[i].addedNodes.length; j++) {
55
+ var node = mutations[i].addedNodes[j];
56
+ if (node.id === 'nuxt-ui-colors') {
57
+ swapColors(node);
58
+ obs.disconnect();
59
+ return;
60
+ }
61
+ }
62
+ }
63
+ });
64
+ obs.observe(document.head, { childList: true });
40
65
  }
41
-
42
- colorsEl.innerHTML = html;
43
- }
66
+ })();
44
67
  `.replace(/\s+/g, " "),
45
68
  type: "text/javascript",
46
69
  tagPriority: -1
47
70
  }, {
48
71
  innerHTML: `
49
- if (localStorage.getItem('${name}-ui-radius')) {
50
- document.getElementById('${name}-ui-radius').innerHTML = ':root { --ui-radius: ' + localStorage.getItem('${name}-ui-radius') + 'rem; }';
51
- }
72
+ var r = localStorage.getItem('${name}-ui-radius');
73
+ if (r) document.documentElement.style.setProperty('--ui-radius', r + 'rem');
52
74
  `.replace(/\s+/g, " "),
53
75
  type: "text/javascript",
54
76
  tagPriority: -1
55
77
  }, {
56
78
  innerHTML: `
57
79
  if (localStorage.getItem('${name}-ui-black-as-primary') === 'true') {
58
- document.getElementById('${name}-ui-black-as-primary').innerHTML = ':root { --ui-primary: black; } .dark { --ui-primary: white; }';
59
- } else {
60
- document.getElementById('${name}-ui-black-as-primary').innerHTML = '';
80
+ var isDark = document.documentElement.classList.contains('dark');
81
+ document.documentElement.style.setProperty('--ui-primary', isDark ? 'white' : 'black');
61
82
  }
62
83
  `.replace(/\s+/g, " ")
63
84
  }, {
64
85
  innerHTML: [
65
86
  `if (localStorage.getItem('${name}-ui-font')) {`,
66
87
  `var font = localStorage.getItem('${name}-ui-font');`,
67
- `document.getElementById('${name}-ui-font').innerHTML = ':root { --font-sans: \\'' + font + '\\', sans-serif; }';`,
68
- `if (font !== 'Alibaba PuHuiTi' && ['Alibaba PuHuiTi', 'Public Sans', 'DM Sans', 'Geist', 'Inter', 'Poppins', 'Outfit', 'Raleway'].includes(font)) {`,
88
+ `var fontEl = document.querySelector('style#nuxt-ui-font');`,
89
+ `if (fontEl) { fontEl.innerHTML = ':root { --font-sans: \\'' + font + '\\', sans-serif; }'; }`,
90
+ `var fontMap = ${fontHrefMapJson};`,
69
91
  `var lnk = document.createElement('link');`,
70
92
  `lnk.rel = 'stylesheet';`,
71
- `lnk.href = 'https://fonts.googleapis.com/css2?family=' + encodeURIComponent(font) + ':wght@400;500;600;700&display=swap';`,
93
+ `lnk.href = fontMap[font] || ('https://fonts.googleapis.com/css2?family=' + encodeURIComponent(font) + ':wght@400;500;600;700&display=swap');`,
72
94
  `lnk.id = 'font-' + font.toLowerCase().replace(/\\s+/g, '-');`,
73
95
  `document.head.appendChild(lnk);`,
74
- `}}`
96
+ `}`
75
97
  ].join(" ")
76
98
  }]
77
99
  });
@@ -0,0 +1,127 @@
1
+ import type { Suggest } from '@movk/core';
2
+ import type { Toast } from '@nuxt/ui/composables/useToast';
3
+ /**
4
+ * API 响应配置
5
+ * @description 定义业务状态码判断规则和数据/消息字段的映射关系
6
+ */
7
+ export interface ApiResponseConfig {
8
+ /**
9
+ * 表示成功的业务状态码列表
10
+ * @defaultValue [200, 0]
11
+ */
12
+ successCodes?: (number | string)[];
13
+ /**
14
+ * 响应中业务状态码的字段名
15
+ * @defaultValue 'code'
16
+ */
17
+ codeKey?: string;
18
+ /**
19
+ * 响应中消息内容的字段名
20
+ * @defaultValue 'message'
21
+ */
22
+ messageKey?: string;
23
+ /**
24
+ * 响应中业务数据的字段名
25
+ * @defaultValue 'data'
26
+ */
27
+ dataKey?: string;
28
+ }
29
+ /**
30
+ * API 认证配置
31
+ * @description 定义认证令牌的来源、格式和请求头配置
32
+ */
33
+ export interface ApiAuthConfig {
34
+ /**
35
+ * 是否启用认证
36
+ * @defaultValue false
37
+ */
38
+ enabled?: boolean;
39
+ /**
40
+ * 令牌来源类型
41
+ * @defaultValue 'session'
42
+ */
43
+ tokenSource?: Suggest<'session'>;
44
+ /**
45
+ * 令牌在会话对象中的路径(支持点号分隔的嵌套路径)
46
+ * @defaultValue 'token'
47
+ * @example 'token' | 'user.accessToken' | 'auth.credentials.token'
48
+ */
49
+ sessionTokenPath?: string;
50
+ /**
51
+ * 令牌类型前缀
52
+ * @defaultValue 'Bearer'
53
+ */
54
+ tokenType?: Suggest<'Bearer' | 'Basic' | 'Custom'>;
55
+ /**
56
+ * 自定义令牌类型前缀(当 tokenType 为 'Custom' 时使用)
57
+ */
58
+ customTokenType?: string;
59
+ /**
60
+ * 认证请求头名称
61
+ * @defaultValue 'Authorization'
62
+ */
63
+ headerName?: string;
64
+ /**
65
+ * 401 未授权处理配置
66
+ */
67
+ unauthorized?: {
68
+ /** 是否自动重定向到登录页 @defaultValue true */
69
+ redirect?: boolean;
70
+ /** 登录页路径 @defaultValue '/login' */
71
+ loginPath?: string;
72
+ /** 是否清除用户会话 @defaultValue true */
73
+ clearSession?: boolean;
74
+ };
75
+ }
76
+ export interface ApiToast extends Toast {
77
+ /**
78
+ * 是否显示提示
79
+ * @defaultValue true
80
+ */
81
+ show?: boolean;
82
+ }
83
+ /**
84
+ * Toast 提示配置
85
+ * @description 定义成功和错误提示的全局样式和行为
86
+ */
87
+ export interface ApiToastConfig {
88
+ /**
89
+ * 是否启用 Toast 提示
90
+ * @defaultValue true
91
+ */
92
+ enabled?: boolean;
93
+ /**
94
+ * 成功提示配置
95
+ */
96
+ success?: ApiToast;
97
+ /**
98
+ * 错误提示配置
99
+ */
100
+ error?: ApiToast;
101
+ }
102
+ /**
103
+ * API 端点公共配置
104
+ * @description 定义单个 API 端点的配置(可在客户端访问的配置)
105
+ */
106
+ export interface ApiEndpointPublicConfig {
107
+ /**
108
+ * 端点的基础 URL
109
+ */
110
+ baseURL: string;
111
+ /**
112
+ * 端点别名(用于标识)
113
+ */
114
+ alias?: string;
115
+ /**
116
+ * 端点级别的认证配置(覆盖全局配置)
117
+ */
118
+ auth?: ApiAuthConfig;
119
+ /**
120
+ * 端点级别的 Toast 配置(覆盖全局配置)
121
+ */
122
+ toast?: ApiToastConfig;
123
+ /**
124
+ * 端点级别的响应配置(覆盖全局配置)
125
+ */
126
+ response?: ApiResponseConfig;
127
+ }
@@ -0,0 +1,50 @@
1
+ import type { $Fetch } from 'nitropack/types';
2
+ import type { FetchError } from 'ofetch';
3
+ import type { UseFetchOptions as NuxtUseFetchOptions, AsyncData } from 'nuxt/app';
4
+ import type { RequestToastOptions, ApiError } from './response';
5
+ /**
6
+ * 端点名声明合并入口
7
+ * @description 构建期由模块按 nuxt.config 的 movk.api.endpoints 自动注入;
8
+ * 用户也可在自有 d.ts 中通过 `declare module '@movk/nuxt'` 追加自定义端点名
9
+ */
10
+ export interface MovkApiEndpoints {
11
+ }
12
+ /**
13
+ * 已声明的端点名联合
14
+ * @description 派生自 MovkApiEndpoints 的键集合
15
+ */
16
+ export type MovkApiEndpointName = keyof MovkApiEndpoints & string;
17
+ /**
18
+ * API 实例类型
19
+ * @description $fetch.create() 返回的实例,附加 use() 方法支持多端点切换
20
+ */
21
+ export type ApiInstance = $Fetch & {
22
+ /** 切换到指定端点,返回该端点的 $fetch 实例 */
23
+ use: (endpoint: MovkApiEndpointName) => ApiInstance;
24
+ };
25
+ /**
26
+ * useApiFetch 选项类型
27
+ * @template T - 业务数据类型(已解包)
28
+ * @template DataT - transform 转换后的类型(默认等于 T)
29
+ */
30
+ export type UseApiFetchOptions<T = unknown, DataT = T> = Omit<NuxtUseFetchOptions<T, DataT>, '$fetch' | 'context'> & {
31
+ /** 使用的端点名称(默认使用 defaultEndpoint) */
32
+ endpoint?: MovkApiEndpointName;
33
+ /** Toast 提示配置,设置为 false 禁用提示 */
34
+ toast?: RequestToastOptions | false;
35
+ /**
36
+ * 是否跳过业务状态码检查
37
+ * @description 仅跳过 code 校验,仍解包;与 skipUnwrap 正交。
38
+ */
39
+ skipBusinessCheck?: boolean;
40
+ /**
41
+ * 是否跳过数据解包
42
+ * @description 为 true 时返回原始响应;与 skipBusinessCheck 正交。
43
+ */
44
+ skipUnwrap?: boolean;
45
+ };
46
+ /**
47
+ * useApiFetch 返回值类型
48
+ * @template DataT - 最终数据类型
49
+ */
50
+ export type UseApiFetchReturn<DataT> = AsyncData<DataT | null, FetchError | ApiError | null>;
@@ -0,0 +1,5 @@
1
+ export type { ApiAuthConfig, ApiEndpointPublicConfig, ApiResponseConfig, ApiToastConfig } from './config';
2
+ export type { MovkApiPublicConfig } from './module';
3
+ export type { ApiError, ApiResponse, RequestToastOptions } from './response';
4
+ export type { ApiInstance, MovkApiEndpointName, MovkApiEndpoints, UseApiFetchOptions, UseApiFetchReturn } from './fetch';
5
+ export type { TransferRequestOptions, TransferResult, TransferStatus } from './transfer';
@@ -0,0 +1,94 @@
1
+ import type { ApiAuthConfig, ApiEndpointPublicConfig, ApiResponseConfig, ApiToastConfig } from './config';
2
+ /**
3
+ * Movk API 模块公共配置
4
+ * @description 定义模块的全局配置(可在客户端访问)
5
+ */
6
+ export interface MovkApiPublicConfig {
7
+ /**
8
+ * 默认使用的端点名称
9
+ * @defaultValue 'default'
10
+ */
11
+ defaultEndpoint?: string;
12
+ /**
13
+ * 是否启用调试模式(在控制台输出请求和响应日志)
14
+ * @defaultValue false
15
+ */
16
+ debug?: boolean;
17
+ /**
18
+ * 端点配置映射
19
+ * @defaultValue { default: { baseURL: '/api' } }
20
+ */
21
+ endpoints?: Record<string, ApiEndpointPublicConfig>;
22
+ /**
23
+ * 全局响应配置(已合并默认值,运行时必然存在)
24
+ */
25
+ response?: ApiResponseConfig;
26
+ /**
27
+ * 全局认证配置(已合并默认值,运行时必然存在)
28
+ */
29
+ auth?: ApiAuthConfig;
30
+ /**
31
+ * 全局 Toast 配置(已合并默认值,运行时必然存在)
32
+ */
33
+ toast?: ApiToastConfig;
34
+ }
35
+ /**
36
+ * 端点私有配置(仅服务端)
37
+ * @description 从端点配置中拆分出的服务端专用字段,不会暴露给客户端
38
+ */
39
+ export interface EndpointPrivateConfig {
40
+ /** 自定义请求头(仅服务端使用,不会暴露给客户端) */
41
+ headers?: Record<string, string>;
42
+ }
43
+ /**
44
+ * Movk API 模块完整配置
45
+ * @description 定义模块的完整配置(公共+私有),用于模块初始化时的配置验证
46
+ */
47
+ export interface MovkApiFullConfig {
48
+ /**
49
+ * 是否启用 API 模块
50
+ * @defaultValue true
51
+ */
52
+ enabled?: boolean;
53
+ /**
54
+ * 默认使用的端点名称
55
+ * @defaultValue 'default'
56
+ */
57
+ defaultEndpoint?: string;
58
+ /**
59
+ * 是否启用调试模式
60
+ * @defaultValue false
61
+ */
62
+ debug?: boolean;
63
+ /**
64
+ * 端点配置映射(包含公共和私有配置)
65
+ * @defaultValue { default: { baseURL: '/api' } }
66
+ */
67
+ endpoints?: Record<string, ApiEndpointPublicConfig & EndpointPrivateConfig>;
68
+ /**
69
+ * 全局响应配置
70
+ */
71
+ response?: ApiResponseConfig;
72
+ /**
73
+ * 全局认证配置
74
+ */
75
+ auth?: ApiAuthConfig;
76
+ /**
77
+ * 全局 Toast 配置
78
+ */
79
+ toast?: ApiToastConfig;
80
+ }
81
+ /**
82
+ * 已解析的端点配置
83
+ * @description 合并全局配置和端点配置后的最终配置,供内部使用
84
+ */
85
+ export interface ResolvedEndpointConfig extends Omit<ApiEndpointPublicConfig, 'auth' | 'toast' | 'response'> {
86
+ /** 认证配置(已合并全局默认值,必然存在) */
87
+ auth: ApiAuthConfig;
88
+ /** Toast 配置(已合并全局默认值,必然存在) */
89
+ toast: ApiToastConfig;
90
+ /** 响应配置(已合并全局默认值,必然存在) */
91
+ response: ApiResponseConfig;
92
+ /** 自定义请求头(仅服务端配置) */
93
+ headers?: Record<string, string>;
94
+ }
@@ -0,0 +1,62 @@
1
+ import type { Toast } from '@nuxt/ui/composables';
2
+ declare module 'ofetch' {
3
+ interface FetchOptions {
4
+ context?: ApiFetchContext;
5
+ }
6
+ }
7
+ /**
8
+ * API 请求扩展上下文
9
+ * @description 通过 fetch options 的 context 字段传递的额外配置
10
+ */
11
+ export interface ApiFetchContext {
12
+ /** Toast 提示配置,设置为 false 禁用提示 */
13
+ toast?: RequestToastOptions | false;
14
+ /**
15
+ * 是否跳过业务状态码检查
16
+ * @description 仅跳过 code 校验,**仍按 dataKey 解包**业务数据。与 skipUnwrap 正交。
17
+ */
18
+ skipBusinessCheck?: boolean;
19
+ /**
20
+ * 是否跳过数据解包
21
+ * @description 为 true 时拦截器不重写 response._data,调用方拿到原始响应。与 skipBusinessCheck 正交。
22
+ */
23
+ skipUnwrap?: boolean;
24
+ }
25
+ /**
26
+ * 请求级别的 Toast 提示选项
27
+ * @description 用于单个请求的 Toast 配置,可覆盖全局配置
28
+ */
29
+ export interface RequestToastOptions {
30
+ /** 成功提示配置,设置为 false 禁用成功提示 */
31
+ success?: Partial<Toast> | false;
32
+ /** 错误提示配置,设置为 false 禁用错误提示 */
33
+ error?: Partial<Toast> | false;
34
+ /** 自定义成功消息 */
35
+ successMessage?: string;
36
+ /** 自定义错误消息 */
37
+ errorMessage?: string;
38
+ }
39
+ /**
40
+ * API 响应数据结构
41
+ * @description 字段名通过 ApiResponseConfig 的 codeKey/messageKey/dataKey 配置化读取
42
+ */
43
+ export interface ApiResponse {
44
+ code?: number | string;
45
+ message?: string;
46
+ msg?: string;
47
+ data?: unknown;
48
+ status?: number;
49
+ [key: string]: unknown;
50
+ }
51
+ /**
52
+ * API 错误对象
53
+ * @description 扩展标准 Error,包含业务响应和状态码信息
54
+ */
55
+ export interface ApiError extends Error {
56
+ /** HTTP 或业务状态码 */
57
+ statusCode?: number;
58
+ /** 原始 API 响应数据 */
59
+ response?: ApiResponse;
60
+ /** 是否为业务逻辑错误(非 HTTP 错误) */
61
+ isBusinessError: boolean;
62
+ }
File without changes
@@ -0,0 +1,32 @@
1
+ import type { MovkApiEndpointName } from './fetch';
2
+ import type { ApiError, RequestToastOptions } from './response';
3
+ /**
4
+ * 传输状态
5
+ * @description idle 初始;pending 进行中;success 成功;error 失败;aborted 已中止
6
+ */
7
+ export type TransferStatus = 'idle' | 'pending' | 'success' | 'error' | 'aborted';
8
+ /**
9
+ * 传输结果(命令式调用返回值)
10
+ * @description data/error 二选一;aborted 标记是否被 abort 取消
11
+ */
12
+ export interface TransferResult<T = unknown> {
13
+ /** 业务数据(已按 dataKey 解包);失败或中止时为 null */
14
+ data: T | null;
15
+ /** 错误对象;成功或中止时为 null */
16
+ error: ApiError | Error | null;
17
+ /** 是否因调用方主动 abort 而结束 */
18
+ aborted: boolean;
19
+ }
20
+ /**
21
+ * 传输请求公共选项
22
+ */
23
+ export interface TransferRequestOptions {
24
+ /** 端点名称,未指定时使用 defaultEndpoint */
25
+ endpoint?: MovkApiEndpointName;
26
+ /** 额外的请求头(覆盖同名 auth 头) */
27
+ headers?: Record<string, string>;
28
+ /** Toast 配置,设置为 false 整体禁用 */
29
+ toast?: RequestToastOptions | false;
30
+ /** 跳过业务码校验(仍按 dataKey 解包),与 useApiFetch.skipBusinessCheck 同义 */
31
+ skipBusinessCheck?: boolean;
32
+ }
File without changes
@@ -0,0 +1,6 @@
1
+ declare module '#build/app.config' {
2
+ import type { AppConfig } from '@nuxt/schema'
3
+
4
+ const _default: AppConfig
5
+ export default _default
6
+ }