vue-api-kit 1.10.4 → 1.10.6

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.
@@ -1,7 +1,7 @@
1
1
  import { AxiosError, InternalAxiosRequestConfig } from 'axios';
2
2
  import { Ref } from 'vue';
3
3
  import { ZodError, ZodType } from 'zod';
4
- import { $ZodIssue } from 'zod/v4/core';
4
+ import { $ZodFlattenedError } from 'zod/v4/core';
5
5
  /**
6
6
  * HTTP methods supported by the API client
7
7
  * @example
@@ -129,14 +129,11 @@ export interface ApiClientOptions<Q extends Record<string, NestedStructure<ApiQu
129
129
  onBeforeRequest?: (config: InternalAxiosRequestConfig<any>) => Promise<any> | void | any;
130
130
  onStartRequest?: () => Promise<void> | void | any;
131
131
  onFinishRequest?: () => Promise<void> | void | any;
132
- onErrorRequest?: (error: {
132
+ onError?: (error: {
133
+ err: AxiosError | ZodError | Error;
133
134
  message: string;
134
- status?: number;
135
- code?: string;
136
- data?: any;
137
- url?: string;
138
135
  }) => void;
139
- onZodError?: (issues: Omit<$ZodIssue, "input">[]) => void;
136
+ onZodError?: (zodError: $ZodFlattenedError<any, any>) => void;
140
137
  }
141
138
  /**
142
139
  * Options for configuring a query hook
@@ -165,7 +162,7 @@ export interface UseQueryOptions<TParams = any, TData = any, TResult = any> {
165
162
  debounce?: number;
166
163
  onResult?: (result: TResult) => void;
167
164
  onError?: (error: AxiosError | ZodError | Error) => void;
168
- onZodError?: (issues: Omit<$ZodIssue, "input">[]) => void;
165
+ onZodError?: (zodError: $ZodFlattenedError<any, any>) => void;
169
166
  onBeforeRequest?: (config: InternalAxiosRequestConfig<any>) => Promise<any> | void | any;
170
167
  }
171
168
  /**
@@ -181,7 +178,7 @@ export interface UseQueryOptions<TParams = any, TData = any, TResult = any> {
181
178
  export interface UseMutationOptions<TResult = any> {
182
179
  onResult?: (result: TResult) => void;
183
180
  onError?: (error: AxiosError | ZodError | Error) => void;
184
- onZodError?: (issues: Omit<$ZodIssue, "input">[]) => void;
181
+ onZodError?: (zodError: $ZodFlattenedError<any, any>) => void;
185
182
  onUploadProgress?: (progress: number) => void;
186
183
  onBeforeRequest?: (config: InternalAxiosRequestConfig<any>) => Promise<any> | void | any;
187
184
  }
@@ -199,7 +196,7 @@ export interface UseMutationOptions<TResult = any> {
199
196
  export interface QueryResult<TResult> {
200
197
  result: Ref<TResult | undefined>;
201
198
  errorMessage: Ref<string | undefined>;
202
- zodErrors: Ref<Omit<$ZodIssue, "input">[] | undefined>;
199
+ zodError: Ref<$ZodFlattenedError<any, any> | undefined>;
203
200
  isLoading: Ref<boolean>;
204
201
  isDone: Ref<boolean>;
205
202
  refetch: () => Promise<void>;
@@ -219,7 +216,7 @@ export interface QueryResult<TResult> {
219
216
  export interface MutationResult<TResult, TData = any, TParams = any> {
220
217
  result: Ref<TResult | undefined>;
221
218
  errorMessage: Ref<string | undefined>;
222
- zodErrors: Ref<Omit<$ZodIssue, "input">[] | undefined>;
219
+ zodError: Ref<$ZodFlattenedError<any, any> | undefined>;
223
220
  isLoading: Ref<boolean>;
224
221
  isDone: Ref<boolean>;
225
222
  uploadProgress: Ref<number>;
package/dist/index.js CHANGED
@@ -1,17 +1,17 @@
1
- import { ZodError as S } from "zod";
2
- import * as H from "zod";
3
- import N, { AxiosError as F } from "axios";
1
+ import A, { ZodError as F } from "zod";
2
+ import * as G from "zod";
3
+ import U, { AxiosError as Z } from "axios";
4
4
  import { AxiosError as ae } from "axios";
5
- import { nextTick as $, ref as R, onMounted as U, watch as _, onBeforeUnmount as I } from "vue";
6
- import { debounce as Q } from "lodash-es";
7
- function z(e) {
5
+ import { nextTick as _, ref as h, onMounted as N, watch as Q, onBeforeUnmount as z } from "vue";
6
+ import { debounce as J } from "lodash-es";
7
+ function H(e) {
8
8
  return e && typeof e == "object" && e !== null && typeof e.path == "string";
9
9
  }
10
- function V(e) {
10
+ function W(e) {
11
11
  return e && typeof e == "object" && e !== null && typeof e.path == "string" && typeof e.method == "string";
12
12
  }
13
- function K(e) {
14
- const y = N.create({
13
+ function Y(e) {
14
+ const p = U.create({
15
15
  baseURL: e.baseURL,
16
16
  headers: {
17
17
  "Content-Type": "application/json",
@@ -21,234 +21,232 @@ function K(e) {
21
21
  withCredentials: e.withCredentials ?? !1,
22
22
  withXSRFToken: e.withXSRFToken ?? !1
23
23
  });
24
- let P = !1, b = null;
25
- e.onBeforeRequest && y.interceptors.request.use(
24
+ let B = !1, w = null;
25
+ e.onBeforeRequest && p.interceptors.request.use(
26
26
  async (r) => {
27
27
  try {
28
28
  return await e.onBeforeRequest(r) || r;
29
- } catch (i) {
30
- return Promise.reject(i);
29
+ } catch (n) {
30
+ return Promise.reject(n);
31
31
  }
32
32
  },
33
33
  (r) => Promise.reject(r)
34
- ), e.onStartRequest && y.interceptors.request.use(
34
+ ), e.onStartRequest && p.interceptors.request.use(
35
35
  async (r) => {
36
36
  try {
37
37
  return await e.onStartRequest(), r;
38
- } catch (i) {
39
- return Promise.reject(i);
38
+ } catch (n) {
39
+ return Promise.reject(n);
40
40
  }
41
41
  },
42
42
  (r) => Promise.reject(r)
43
- ), e.onFinishRequest && y.interceptors.response.use(
43
+ ), e.onFinishRequest && p.interceptors.response.use(
44
44
  (r) => (e.onFinishRequest(), r),
45
45
  (r) => (e.onFinishRequest(), Promise.reject(r))
46
- ), y.interceptors.request.use((r) => {
46
+ ), p.interceptors.request.use((r) => {
47
47
  if (!r.url) return r;
48
- const i = (m) => {
48
+ const n = (m) => {
49
49
  if (m)
50
- for (const [d, t] of Object.entries(m)) {
51
- const a = `{${d}}`;
52
- r.url.includes(a) && (r.url = r.url.replace(
53
- a,
54
- encodeURIComponent(String(t))
55
- ), delete m[d]);
50
+ for (const [c, s] of Object.entries(m)) {
51
+ const o = `{${c}}`;
52
+ r.url.includes(o) && (r.url = r.url.replace(
53
+ o,
54
+ encodeURIComponent(String(s))
55
+ ), delete m[c]);
56
56
  }
57
57
  };
58
- return r.method !== "get" && r.data?.params && i(r.data.params), i(r.params), r;
59
- }), e.csrfRefreshEndpoint && y.interceptors.response.use(
58
+ return r.method !== "get" && r.data?.params && n(r.data.params), n(r.params), r;
59
+ }), e.csrfRefreshEndpoint && p.interceptors.response.use(
60
60
  (r) => r,
61
61
  async (r) => {
62
- const i = r.config;
63
- if (i?.url === e.csrfRefreshEndpoint)
62
+ const n = r.config;
63
+ if (n?.url === e.csrfRefreshEndpoint)
64
64
  return Promise.reject(r);
65
- if (r.response && (r.response.status === 403 || r.response.status === 419) && !i?._retry) {
66
- i._retry = !0;
65
+ if (r.response && (r.response.status === 403 || r.response.status === 419) && !n?._retry) {
66
+ n._retry = !0;
67
67
  try {
68
- return P && b ? await b : (P = !0, b = y.get(e.csrfRefreshEndpoint).then(() => {
69
- P = !1, b = null;
70
- }), await b), y.request(i);
68
+ return B && w ? await w : (B = !0, w = p.get(e.csrfRefreshEndpoint).then(() => {
69
+ B = !1, w = null;
70
+ }), await w), p.request(n);
71
71
  } catch (m) {
72
- return P = !1, b = null, Promise.reject(m);
72
+ return B = !1, w = null, Promise.reject(m);
73
73
  }
74
74
  }
75
75
  return Promise.reject(r);
76
76
  }
77
- ), y.interceptors.response.use(
77
+ ), p.interceptors.response.use(
78
78
  (r) => r,
79
- (r) => ($(() => {
79
+ (r) => (_(() => {
80
80
  r.code;
81
81
  }), Promise.reject(r))
82
82
  );
83
83
  function D(r) {
84
- const i = {};
84
+ const n = {};
85
85
  for (const m in r) {
86
- const d = r[m];
87
- if (d)
88
- if (z(d)) {
89
- const t = d;
90
- i[m] = (a) => {
91
- let o;
92
- a && typeof a == "object" && ("loadOnMount" in a || "debounce" in a || "onResult" in a || "onError" in a || "onZodError" in a || "onBeforeRequest" in a || "params" in a || "data" in a ? o = a : o = { params: a });
93
- const C = R(), g = R(), q = R(), j = R(!1), A = R(!1), B = R(!0);
94
- let w = new AbortController();
95
- const u = () => {
96
- w?.abort(), w = new AbortController();
86
+ const c = r[m];
87
+ if (c)
88
+ if (H(c)) {
89
+ const s = c;
90
+ n[m] = (o) => {
91
+ let a;
92
+ o && typeof o == "object" && ("loadOnMount" in o || "debounce" in o || "onResult" in o || "onError" in o || "onZodError" in o || "onBeforeRequest" in o || "params" in o || "data" in o ? a = o : a = { params: o });
93
+ const g = h(), v = h(), E = h(), C = h(!1), j = h(!1), k = h(!0);
94
+ let P = new AbortController();
95
+ const i = () => {
96
+ P?.abort(), P = new AbortController();
97
97
  }, l = async () => {
98
- j.value && u(), j.value = !0, g.value = void 0;
98
+ C.value && i(), C.value = !0, v.value = void 0;
99
99
  try {
100
- t.params && o?.params && t.params.parse(o.params);
101
- let s = o?.data;
102
- t.data && s && t.data.parse(s);
103
- const c = {
104
- method: t.method ?? "GET",
105
- url: t.path,
106
- params: o?.params,
107
- signal: w.signal
100
+ s.params && a?.params && s.params.parse(a.params);
101
+ let t = a?.data;
102
+ s.data && t && s.data.parse(t);
103
+ const u = {
104
+ method: s.method ?? "GET",
105
+ url: s.path,
106
+ params: a?.params,
107
+ signal: P.signal
108
108
  };
109
- if (t.method === "POST" && s && (c.data = s), t.onBeforeRequest) {
110
- const f = await t.onBeforeRequest(c);
111
- f !== void 0 && Object.assign(c, f);
109
+ if (s.method === "POST" && t && (u.data = t), s.onBeforeRequest) {
110
+ const d = await s.onBeforeRequest(u);
111
+ d !== void 0 && Object.assign(u, d);
112
112
  }
113
- if (o?.onBeforeRequest) {
114
- const f = await o.onBeforeRequest(c);
115
- f !== void 0 && Object.assign(c, f);
113
+ if (a?.onBeforeRequest) {
114
+ const d = await a.onBeforeRequest(u);
115
+ d !== void 0 && Object.assign(u, d);
116
116
  }
117
- const h = await y.request(c), n = t.response ? t.response.parse(h.data) : h.data;
118
- C.value = n, o?.onResult?.(n);
119
- } catch (s) {
120
- if (s instanceof F) {
121
- if (s.code !== "ERR_CANCELED") {
122
- const c = s.config?.url, h = s.response?.data?.message || s.message || "An error occurred", n = s.response?.status, f = s.code, v = s.response?.data;
123
- g.value = h, o?.onError?.(s), e.onErrorRequest?.({ message: h, status: n, code: f, data: v, url: c });
117
+ v.value = void 0, E.value = void 0;
118
+ const b = await p.request(u), f = s.response ? s.response.parse(b.data) : b.data;
119
+ g.value = f, a?.onResult?.(f);
120
+ } catch (t) {
121
+ if (t instanceof Z) {
122
+ if (t.code !== "ERR_CANCELED") {
123
+ const u = t.response?.data?.message || t.message || "An error occurred";
124
+ v.value = u, a?.onError?.(t), e.onError?.({ err: t, message: u });
124
125
  }
125
- } else if (s instanceof S) {
126
- q.value = s.issues || [];
127
- const h = `Validation error: ${q.value.map(
128
- (n) => `${n.path.join(".")}: ${n.message}`
129
- ).join(", ")}`;
130
- g.value = h, o?.onError?.(s), o?.onZodError?.(q.value), e.onErrorRequest?.({ message: h, code: "VALIDATION_ERROR" }), e.onZodError && e.onZodError(q.value);
126
+ } else if (t instanceof F) {
127
+ E.value = A.flattenError(t);
128
+ const u = Object.keys(E.value.fieldErrors).length, b = `${Object.values(E.value.fieldErrors).at(0)}.${u > 1 ? ` (and ${u - 1} more errors)` : ""}`;
129
+ v.value = b, a?.onError?.(t), a?.onZodError?.(A.flattenError(t)), e.onError?.({ err: t, message: b }), e.onZodError && e.onZodError(A.flattenError(t));
131
130
  } else {
132
- const c = s.message || "An error occurred";
133
- g.value = c, o?.onError?.(c), e.onErrorRequest?.({ message: c });
131
+ const u = t.message || "An error occurred";
132
+ v.value = u, a?.onError?.(u), e.onError?.({ err: t, message: u });
134
133
  }
135
134
  } finally {
136
- j.value = !1, A.value = !0;
135
+ C.value = !1, j.value = !0;
137
136
  }
138
- }, E = o?.debounce ? Q(l, o.debounce) : l;
139
- let p = null;
140
- return (o?.params || o?.data) && (U(() => {
141
- p && p(), p = _(
142
- () => JSON.stringify({ params: o.params, data: o.data }),
137
+ }, R = a?.debounce ? J(l, a.debounce) : l;
138
+ let q = null;
139
+ return (a?.params || a?.data) && (N(() => {
140
+ q && q(), q = Q(
141
+ () => JSON.stringify({ params: a.params, data: a.data }),
143
142
  () => {
144
- E();
143
+ R();
145
144
  },
146
145
  { immediate: !1 }
147
146
  );
148
- }), I(() => {
149
- p && p(), w?.abort();
150
- })), (o?.loadOnMount === void 0 || o.loadOnMount) && !A.value && (B.value ? (B.value = !1, l()) : E()), { result: C, errorMessage: g, zodErrors: q, isLoading: j, isDone: A, refetch: l };
147
+ }), z(() => {
148
+ q && q(), P?.abort();
149
+ })), (a?.loadOnMount === void 0 || a.loadOnMount) && !j.value && (k.value ? (k.value = !1, l()) : R()), { result: g, errorMessage: v, zodError: E, isLoading: C, isDone: j, refetch: l };
151
150
  };
152
- } else typeof d == "object" && (i[m] = D(d));
151
+ } else typeof c == "object" && (n[m] = D(c));
153
152
  }
154
- return i;
153
+ return n;
155
154
  }
156
- const L = e.queries ?? {}, T = D(L);
157
- function k(r) {
158
- const i = {};
155
+ const x = e.queries ?? {}, L = D(x);
156
+ function S(r) {
157
+ const n = {};
159
158
  for (const m in r) {
160
- const d = r[m];
161
- if (d)
162
- if (V(d)) {
163
- const t = d;
164
- i[m] = (a) => {
165
- const o = R(), C = R(), g = R(), q = R(!1), j = R(!1), A = R(0);
166
- return { result: o, errorMessage: C, zodErrors: g, isLoading: q, isDone: j, uploadProgress: A, mutate: async (w) => {
167
- if (!q.value) {
168
- q.value = !0, C.value = void 0, A.value = 0;
159
+ const c = r[m];
160
+ if (c)
161
+ if (W(c)) {
162
+ const s = c;
163
+ n[m] = (o) => {
164
+ const a = h(), g = h(), v = h(), E = h(!1), C = h(!1), j = h(0);
165
+ return { result: a, errorMessage: g, zodError: v, isLoading: E, isDone: C, uploadProgress: j, mutate: async (P) => {
166
+ if (!E.value) {
167
+ E.value = !0, g.value = void 0, j.value = 0;
169
168
  try {
170
- const { data: u = {}, params: l } = w ?? {};
171
- let E = u ?? {}, p = {};
172
- if (t.isMultipart) {
173
- const n = new FormData();
174
- for (const [f, v] of Object.entries(u))
175
- v instanceof File || v instanceof Blob ? n.append(f, v) : Array.isArray(v) ? v.forEach((M) => {
176
- M instanceof File || M instanceof Blob ? n.append(f, M) : n.append(f, JSON.stringify(M));
177
- }) : typeof v == "object" && v !== null ? n.append(f, JSON.stringify(v)) : n.append(f, String(v));
178
- E = n, p["Content-Type"] = "multipart/form-data";
179
- } else t.data && t.data.parse(u);
180
- t.params && l && t.params.parse(l);
181
- const s = {
182
- method: t.method,
183
- url: t.path,
184
- data: E,
169
+ const { data: i = {}, params: l } = P ?? {};
170
+ let R = i ?? {}, q = {};
171
+ if (s.isMultipart) {
172
+ const f = new FormData();
173
+ for (const [d, y] of Object.entries(i))
174
+ y instanceof File || y instanceof Blob ? f.append(d, y) : Array.isArray(y) ? y.forEach((M) => {
175
+ M instanceof File || M instanceof Blob ? f.append(d, M) : f.append(d, JSON.stringify(M));
176
+ }) : typeof y == "object" && y !== null ? f.append(d, JSON.stringify(y)) : f.append(d, String(y));
177
+ R = f, q["Content-Type"] = "multipart/form-data";
178
+ } else s.data && s.data.parse(i);
179
+ s.params && l && s.params.parse(l);
180
+ const t = {
181
+ method: s.method,
182
+ url: s.path,
183
+ data: R,
185
184
  params: l,
186
- headers: p,
187
- onUploadProgress: (n) => {
188
- if (n.total) {
189
- const f = Math.round(n.loaded * 100 / n.total);
190
- A.value = f, a?.onUploadProgress?.(f);
185
+ headers: q,
186
+ onUploadProgress: (f) => {
187
+ if (f.total) {
188
+ const d = Math.round(f.loaded * 100 / f.total);
189
+ j.value = d, o?.onUploadProgress?.(d);
191
190
  }
192
191
  }
193
192
  };
194
- if (t.onBeforeRequest) {
195
- const n = await t.onBeforeRequest(s);
196
- n !== void 0 && Object.assign(s, n);
193
+ if (s.onBeforeRequest) {
194
+ const f = await s.onBeforeRequest(t);
195
+ f !== void 0 && Object.assign(t, f);
197
196
  }
198
- if (a?.onBeforeRequest) {
199
- const n = await a.onBeforeRequest(s);
200
- n !== void 0 && Object.assign(s, n);
197
+ if (o?.onBeforeRequest) {
198
+ const f = await o.onBeforeRequest(t);
199
+ f !== void 0 && Object.assign(t, f);
201
200
  }
202
- const c = await y.request(s), h = t.response ? t.response.parse(c.data) : c.data;
203
- o.value = h, a?.onResult?.(h);
204
- } catch (u) {
205
- if (u instanceof F) {
206
- const l = u.response?.data?.message || u.message || "An error occurred", E = u.response?.status, p = u.code;
207
- C.value = l, a?.onError?.(u), e.onErrorRequest?.({ message: l, status: E, code: p });
208
- } else if (u instanceof S) {
209
- g.value = u.issues || [];
210
- const E = `Validation error: ${g.value.map(
211
- (p) => `${p.path.join(".")}: ${p.message}`
212
- ).join(", ")}`;
213
- C.value = E, a?.onError?.(u), a?.onZodError?.(g.value), e.onErrorRequest?.({ message: E, code: "VALIDATION_ERROR" }), e.onZodError && e.onZodError(g.value);
201
+ g.value = void 0, v.value = void 0;
202
+ const u = await p.request(t), b = s.response ? s.response.parse(u.data) : u.data;
203
+ a.value = b, o?.onResult?.(b);
204
+ } catch (i) {
205
+ if (i instanceof Z) {
206
+ const l = i.response?.data?.message || i.message || "An error occurred";
207
+ g.value = l, o?.onError?.(i), e.onError?.({ err: i, message: l });
208
+ } else if (i instanceof F) {
209
+ v.value = A.flattenError(i);
210
+ const l = Object.keys(v.value.fieldErrors).length, R = `${Object.values(v.value.fieldErrors).at(0)}.${l > 1 ? ` (and ${l - 1} more errors)` : ""}`;
211
+ g.value = R, o?.onError?.(i), o?.onZodError?.(A.flattenError(i)), e.onError?.({ err: i, message: R }), e.onZodError && e.onZodError(A.flattenError(i));
214
212
  } else {
215
- const l = u.message || "An error occurred";
216
- C.value = l, a?.onError?.(u), e.onErrorRequest?.({ message: l });
213
+ const l = i.message || "An error occurred";
214
+ g.value = l, o?.onError?.(i), e.onError?.({ err: i, message: l });
217
215
  }
218
216
  } finally {
219
- q.value = !1, j.value = !0;
217
+ E.value = !1, C.value = !0;
220
218
  }
221
219
  }
222
220
  } };
223
221
  };
224
- } else typeof d == "object" && (i[m] = k(d));
222
+ } else typeof c == "object" && (n[m] = S(c));
225
223
  }
226
- return i;
224
+ return n;
227
225
  }
228
- const Z = e.mutations ?? {}, x = k(Z);
226
+ const T = e.mutations ?? {}, $ = S(T);
229
227
  return {
230
- query: T,
231
- mutation: x
228
+ query: L,
229
+ mutation: $
232
230
  };
233
231
  }
234
- function Y(e) {
232
+ function O(e) {
235
233
  return e;
236
234
  }
237
- function O(e) {
235
+ function ee(e) {
238
236
  return e;
239
237
  }
240
- function ee(...e) {
238
+ function re(...e) {
241
239
  return Object.assign({}, ...e);
242
240
  }
243
- function re(...e) {
241
+ function te(...e) {
244
242
  return Object.assign({}, ...e);
245
243
  }
246
244
  export {
247
245
  ae as AxiosError,
248
- K as createApiClient,
249
- O as defineMutation,
250
- Y as defineQuery,
251
- re as mergeMutations,
252
- ee as mergeQueries,
253
- H as z
246
+ Y as createApiClient,
247
+ ee as defineMutation,
248
+ O as defineQuery,
249
+ te as mergeMutations,
250
+ re as mergeQueries,
251
+ G as z
254
252
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vue-api-kit",
3
3
  "type": "module",
4
- "version": "1.10.4",
4
+ "version": "1.10.6",
5
5
  "description": "A powerful and flexible API client for Vue 3 applications, built with TypeScript and Zod for type-safe API interactions.",
6
6
  "keywords": [
7
7
  "vue3",