@citruslime/vue-utils 1.4.3-beta.0 → 1.4.3-beta.2

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,288 +1,288 @@
1
1
  import { replacePlaceholders as Y } from "@citruslime/utils";
2
- import { toRef as se, readonly as re, customRef as le, ref as $, getCurrentScope as ce, onScopeDispose as fe, unref as de, watch as I, isRef as oe, shallowRef as W, computed as pe, reactive as he, toRefs as me } from "vue";
3
- const He = [
2
+ import { toRef as le, readonly as re, customRef as ue, ref as H, getCurrentScope as ce, onScopeDispose as fe, unref as de, watch as I, isRef as oe, shallowRef as W, computed as pe } from "vue";
3
+ const Ae = [
4
4
  "GET",
5
5
  "POST",
6
6
  "PUT",
7
7
  "DELETE"
8
8
  ];
9
- function $e(e, t, n = null, s = null) {
9
+ function Be(e, t, n = null, l = null) {
10
10
  return {
11
11
  url: e,
12
12
  type: t,
13
- headers: n ?? ie,
14
- hasBody: ye(t, s)
13
+ headers: n ?? ae,
14
+ hasBody: he(t, l)
15
15
  };
16
16
  }
17
- function ie() {
17
+ function ae() {
18
18
  return {
19
19
  accept: "application/json",
20
20
  "content-type": "application/json"
21
21
  };
22
22
  }
23
- function ye(e, t) {
23
+ function he(e, t) {
24
24
  return !!(t === null && (e === "PUT" || e === "POST") || t);
25
25
  }
26
- function ae(e) {
26
+ function ie(e) {
27
27
  return ce() ? (fe(e), !0) : !1;
28
28
  }
29
29
  function q() {
30
- const e = /* @__PURE__ */ new Set(), t = (i) => {
31
- e.delete(i);
30
+ const e = /* @__PURE__ */ new Set(), t = (s) => {
31
+ e.delete(s);
32
32
  };
33
33
  return {
34
- on: (i) => {
35
- e.add(i);
36
- const r = () => t(i);
37
- return ae(r), {
34
+ on: (s) => {
35
+ e.add(s);
36
+ const r = () => t(s);
37
+ return ie(r), {
38
38
  off: r
39
39
  };
40
40
  },
41
41
  off: t,
42
- trigger: (i) => Promise.all(Array.from(e).map((r) => r(i)))
42
+ trigger: (s) => Promise.all(Array.from(e).map((r) => r(s)))
43
43
  };
44
44
  }
45
- function O(e) {
45
+ function b(e) {
46
46
  return typeof e == "function" ? e() : de(e);
47
47
  }
48
- const ue = typeof window < "u", ve = () => {
48
+ const se = typeof window < "u", ye = () => {
49
49
  };
50
50
  function Z(e, t = !1, n = "Timeout") {
51
- return new Promise((s, i) => {
52
- setTimeout(t ? () => i(n) : s, e);
51
+ return new Promise((l, s) => {
52
+ setTimeout(t ? () => s(n) : l, e);
53
53
  });
54
54
  }
55
- function we(e, ...t) {
55
+ function me(e, ...t) {
56
56
  return t.some((n) => n in e);
57
57
  }
58
58
  function L(...e) {
59
59
  if (e.length !== 1)
60
- return se(...e);
60
+ return le(...e);
61
61
  const t = e[0];
62
- return typeof t == "function" ? re(le(() => ({ get: t, set: ve }))) : $(t);
62
+ return typeof t == "function" ? re(ue(() => ({ get: t, set: ye }))) : H(t);
63
63
  }
64
- function k(e, t = !1) {
65
- function n(a, { flush: u = "sync", deep: h = !1, timeout: p, throwOnTimeout: F } = {}) {
66
- let y = null;
64
+ function z(e, t = !1) {
65
+ function n(o, { flush: c = "sync", deep: i = !1, timeout: y, throwOnTimeout: F } = {}) {
66
+ let v = null;
67
67
  const D = [new Promise((E) => {
68
- y = I(
68
+ v = I(
69
69
  e,
70
70
  (_) => {
71
- a(_) !== t && (y == null || y(), E(_));
71
+ o(_) !== t && (v == null || v(), E(_));
72
72
  },
73
73
  {
74
- flush: u,
75
- deep: h,
74
+ flush: c,
75
+ deep: i,
76
76
  immediate: !0
77
77
  }
78
78
  );
79
79
  })];
80
- return p != null && D.push(
81
- Z(p, F).then(() => O(e)).finally(() => y == null ? void 0 : y())
80
+ return y != null && D.push(
81
+ Z(y, F).then(() => b(e)).finally(() => v == null ? void 0 : v())
82
82
  ), Promise.race(D);
83
83
  }
84
- function s(a, u) {
85
- if (!oe(a))
86
- return n((_) => _ === a, u);
87
- const { flush: h = "sync", deep: p = !1, timeout: F, throwOnTimeout: y } = u ?? {};
88
- let w = null;
84
+ function l(o, c) {
85
+ if (!oe(o))
86
+ return n((_) => _ === o, c);
87
+ const { flush: i = "sync", deep: y = !1, timeout: F, throwOnTimeout: v } = c ?? {};
88
+ let P = null;
89
89
  const E = [new Promise((_) => {
90
- w = I(
91
- [e, a],
90
+ P = I(
91
+ [e, o],
92
92
  ([j, S]) => {
93
- t !== (j === S) && (w == null || w(), _(j));
93
+ t !== (j === S) && (P == null || P(), _(j));
94
94
  },
95
95
  {
96
- flush: h,
97
- deep: p,
96
+ flush: i,
97
+ deep: y,
98
98
  immediate: !0
99
99
  }
100
100
  );
101
101
  })];
102
102
  return F != null && E.push(
103
- Z(F, y).then(() => O(e)).finally(() => (w == null || w(), O(e)))
103
+ Z(F, v).then(() => b(e)).finally(() => (P == null || P(), b(e)))
104
104
  ), Promise.race(E);
105
105
  }
106
- function i(a) {
107
- return n((u) => !!u, a);
106
+ function s(o) {
107
+ return n((c) => !!c, o);
108
108
  }
109
- function r(a) {
110
- return s(null, a);
109
+ function r(o) {
110
+ return l(null, o);
111
111
  }
112
- function o(a) {
113
- return s(void 0, a);
112
+ function a(o) {
113
+ return l(void 0, o);
114
114
  }
115
- function b(a) {
116
- return n(Number.isNaN, a);
115
+ function h(o) {
116
+ return n(Number.isNaN, o);
117
117
  }
118
- function l(a, u) {
119
- return n((h) => {
120
- const p = Array.from(h);
121
- return p.includes(a) || p.includes(O(a));
122
- }, u);
118
+ function w(o, c) {
119
+ return n((i) => {
120
+ const y = Array.from(i);
121
+ return y.includes(o) || y.includes(b(o));
122
+ }, c);
123
123
  }
124
- function v(a) {
125
- return g(1, a);
124
+ function u(o) {
125
+ return O(1, o);
126
126
  }
127
- function g(a = 1, u) {
128
- let h = -1;
129
- return n(() => (h += 1, h >= a), u);
127
+ function O(o = 1, c) {
128
+ let i = -1;
129
+ return n(() => (i += 1, i >= o), c);
130
130
  }
131
- return Array.isArray(O(e)) ? {
131
+ return Array.isArray(b(e)) ? {
132
132
  toMatch: n,
133
- toContains: l,
134
- changed: v,
135
- changedTimes: g,
133
+ toContains: w,
134
+ changed: u,
135
+ changedTimes: O,
136
136
  get not() {
137
- return k(e, !t);
137
+ return z(e, !t);
138
138
  }
139
139
  } : {
140
140
  toMatch: n,
141
- toBe: s,
142
- toBeTruthy: i,
141
+ toBe: l,
142
+ toBeTruthy: s,
143
143
  toBeNull: r,
144
- toBeNaN: b,
145
- toBeUndefined: o,
146
- changed: v,
147
- changedTimes: g,
144
+ toBeNaN: h,
145
+ toBeUndefined: a,
146
+ changed: u,
147
+ changedTimes: O,
148
148
  get not() {
149
- return k(e, !t);
149
+ return z(e, !t);
150
150
  }
151
151
  };
152
152
  }
153
- function Pe(e) {
154
- return k(e);
153
+ function ve(e) {
154
+ return z(e);
155
155
  }
156
- function be(e, t, n = {}) {
156
+ function Pe(e, t, n = {}) {
157
157
  const {
158
- immediate: s = !0
159
- } = n, i = $(!1);
158
+ immediate: l = !0
159
+ } = n, s = H(!1);
160
160
  let r = null;
161
- function o() {
161
+ function a() {
162
162
  r && (clearTimeout(r), r = null);
163
163
  }
164
- function b() {
165
- i.value = !1, o();
164
+ function h() {
165
+ s.value = !1, a();
166
166
  }
167
- function l(...v) {
168
- o(), i.value = !0, r = setTimeout(() => {
169
- i.value = !1, r = null, e(...v);
170
- }, O(t));
167
+ function w(...u) {
168
+ a(), s.value = !0, r = setTimeout(() => {
169
+ s.value = !1, r = null, e(...u);
170
+ }, b(t));
171
171
  }
172
- return s && (i.value = !0, ue && l()), ae(b), {
173
- isPending: re(i),
174
- start: l,
175
- stop: b
172
+ return l && (s.value = !0, se && w()), ie(h), {
173
+ isPending: re(s),
174
+ start: w,
175
+ stop: h
176
176
  };
177
177
  }
178
- const ge = ue ? window : void 0;
179
- var Te = Object.defineProperty, Oe = Object.defineProperties, Fe = Object.getOwnPropertyDescriptors, ee = Object.getOwnPropertySymbols, Ee = Object.prototype.hasOwnProperty, _e = Object.prototype.propertyIsEnumerable, te = (e, t, n) => t in e ? Te(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n, d = (e, t) => {
178
+ const ge = se ? window : void 0;
179
+ var we = Object.defineProperty, Oe = Object.defineProperties, Te = Object.getOwnPropertyDescriptors, ee = Object.getOwnPropertySymbols, be = Object.prototype.hasOwnProperty, Fe = Object.prototype.propertyIsEnumerable, te = (e, t, n) => t in e ? we(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n, p = (e, t) => {
180
180
  for (var n in t || (t = {}))
181
- Ee.call(t, n) && te(e, n, t[n]);
181
+ be.call(t, n) && te(e, n, t[n]);
182
182
  if (ee)
183
183
  for (var n of ee(t))
184
- _e.call(t, n) && te(e, n, t[n]);
184
+ Fe.call(t, n) && te(e, n, t[n]);
185
185
  return e;
186
- }, N = (e, t) => Oe(e, Fe(t));
187
- const je = {
186
+ }, N = (e, t) => Oe(e, Te(t));
187
+ const Ee = {
188
188
  json: "application/json",
189
189
  text: "text/plain"
190
190
  };
191
191
  function ne(e) {
192
- return e && we(e, "immediate", "refetch", "initialData", "timeout", "beforeFetch", "afterFetch", "onFetchError", "fetch");
192
+ return e && me(e, "immediate", "refetch", "initialData", "timeout", "beforeFetch", "afterFetch", "onFetchError", "fetch");
193
193
  }
194
- function R(e) {
194
+ function k(e) {
195
195
  return typeof Headers < "u" && e instanceof Headers ? Object.fromEntries([...e.entries()]) : e;
196
196
  }
197
- function De(e, ...t) {
197
+ function _e(e, ...t) {
198
198
  var n;
199
- const s = typeof AbortController == "function";
200
- let i = {}, r = { immediate: !0, refetch: !1, timeout: 0 };
201
- const o = {
199
+ const l = typeof AbortController == "function";
200
+ let s = {}, r = { immediate: !0, refetch: !1, timeout: 0 };
201
+ const a = {
202
202
  method: "GET",
203
203
  type: "text",
204
204
  payload: void 0
205
205
  };
206
- t.length > 0 && (ne(t[0]) ? r = d(d({}, r), t[0]) : i = t[0]), t.length > 1 && ne(t[1]) && (r = d(d({}, r), t[1]));
206
+ t.length > 0 && (ne(t[0]) ? r = p(p({}, r), t[0]) : s = t[0]), t.length > 1 && ne(t[1]) && (r = p(p({}, r), t[1]));
207
207
  const {
208
- fetch: b = (n = ge) == null ? void 0 : n.fetch,
209
- initialData: l,
210
- timeout: v
211
- } = r, g = q(), a = q(), u = q(), h = $(!1), p = $(!1), F = $(!1), y = $(null), w = W(null), D = W(null), E = W(l || null), _ = pe(() => s && p.value);
208
+ fetch: h = (n = ge) == null ? void 0 : n.fetch,
209
+ initialData: w,
210
+ timeout: u
211
+ } = r, O = q(), o = q(), c = q(), i = H(!1), y = H(!1), F = H(!1), v = H(null), P = W(null), D = W(null), E = W(w || null), _ = pe(() => l && y.value);
212
212
  let j, S;
213
213
  const M = () => {
214
- s && (j == null || j.abort(), j = new AbortController(), j.signal.onabort = () => F.value = !0, i = N(d({}, i), {
214
+ l && (j == null || j.abort(), j = new AbortController(), j.signal.onabort = () => F.value = !0, s = N(p({}, s), {
215
215
  signal: j.signal
216
216
  }));
217
- }, K = (c) => {
218
- p.value = c, h.value = !c;
217
+ }, K = (f) => {
218
+ y.value = f, i.value = !f;
219
219
  };
220
- v && (S = be(M, v, { immediate: !1 }));
221
- const U = async (c = !1) => {
222
- var P;
223
- M(), K(!0), D.value = null, y.value = null, F.value = !1;
220
+ u && (S = Pe(M, u, { immediate: !1 }));
221
+ const U = async (f = !1) => {
222
+ var g;
223
+ M(), K(!0), D.value = null, v.value = null, F.value = !1;
224
224
  const m = {
225
- method: o.method,
225
+ method: a.method,
226
226
  headers: {}
227
227
  };
228
- if (o.payload) {
229
- const J = R(m.headers);
230
- o.payloadType && (J["Content-Type"] = (P = je[o.payloadType]) != null ? P : o.payloadType);
231
- const G = O(o.payload);
232
- m.body = o.payloadType === "json" ? JSON.stringify(G) : G;
228
+ if (a.payload) {
229
+ const J = k(m.headers);
230
+ a.payloadType && (J["Content-Type"] = (g = Ee[a.payloadType]) != null ? g : a.payloadType);
231
+ const G = b(a.payload);
232
+ m.body = a.payloadType === "json" ? JSON.stringify(G) : G;
233
233
  }
234
- let H = !1;
234
+ let $ = !1;
235
235
  const T = {
236
- url: O(e),
237
- options: d(d({}, m), i),
236
+ url: b(e),
237
+ options: p(p({}, m), s),
238
238
  cancel: () => {
239
- H = !0;
239
+ $ = !0;
240
240
  }
241
241
  };
242
- if (r.beforeFetch && Object.assign(T, await r.beforeFetch(T)), H || !b)
242
+ if (r.beforeFetch && Object.assign(T, await r.beforeFetch(T)), $ || !h)
243
243
  return K(!1), Promise.resolve(null);
244
244
  let B = null;
245
245
  return S && S.start(), new Promise((J, G) => {
246
- var Q;
247
- b(
246
+ var R;
247
+ h(
248
248
  T.url,
249
- N(d(d({}, m), T.options), {
250
- headers: d(d({}, R(m.headers)), R((Q = T.options) == null ? void 0 : Q.headers))
249
+ N(p(p({}, m), T.options), {
250
+ headers: p(p({}, k(m.headers)), k((R = T.options) == null ? void 0 : R.headers))
251
251
  })
252
- ).then(async (f) => {
253
- if (w.value = f, y.value = f.status, B = await f[o.type](), !f.ok)
254
- throw E.value = l || null, new Error(f.statusText);
255
- return r.afterFetch && ({ data: B } = await r.afterFetch({ data: B, response: f })), E.value = B, g.trigger(f), J(f);
256
- }).catch(async (f) => {
257
- let X = f.message || f.name;
258
- return r.onFetchError && ({ error: X } = await r.onFetchError({ data: B, error: f, response: w.value })), D.value = X, a.trigger(f), c ? G(f) : J(null);
252
+ ).then(async (d) => {
253
+ if (P.value = d, v.value = d.status, B = await d[a.type](), !d.ok)
254
+ throw E.value = w || null, new Error(d.statusText);
255
+ return r.afterFetch && ({ data: B } = await r.afterFetch({ data: B, response: d })), E.value = B, O.trigger(d), J(d);
256
+ }).catch(async (d) => {
257
+ let X = d.message || d.name;
258
+ return r.onFetchError && ({ error: X } = await r.onFetchError({ data: B, error: d, response: P.value })), D.value = X, o.trigger(d), f ? G(d) : J(null);
259
259
  }).finally(() => {
260
- K(!1), S && S.stop(), u.trigger(null);
260
+ K(!1), S && S.stop(), c.trigger(null);
261
261
  });
262
262
  });
263
- }, z = L(r.refetch);
263
+ }, Q = L(r.refetch);
264
264
  I(
265
265
  [
266
- z,
266
+ Q,
267
267
  L(e)
268
268
  ],
269
- ([c]) => c && U(),
269
+ ([f]) => f && U(),
270
270
  { deep: !0 }
271
271
  );
272
272
  const x = {
273
- isFinished: h,
274
- statusCode: y,
275
- response: w,
273
+ isFinished: i,
274
+ statusCode: v,
275
+ response: P,
276
276
  error: D,
277
277
  data: E,
278
- isFetching: p,
278
+ isFetching: y,
279
279
  canAbort: _,
280
280
  aborted: F,
281
281
  abort: M,
282
282
  execute: U,
283
- onFetchResponse: g.on,
284
- onFetchError: a.on,
285
- onFetchFinally: u.on,
283
+ onFetchResponse: O.on,
284
+ onFetchError: o.on,
285
+ onFetchFinally: c.on,
286
286
  // method
287
287
  get: A("GET"),
288
288
  put: A("PUT"),
@@ -298,19 +298,19 @@ function De(e, ...t) {
298
298
  arrayBuffer: C("arrayBuffer"),
299
299
  formData: C("formData")
300
300
  };
301
- function A(c) {
302
- return (P, m) => {
303
- if (!p.value) {
304
- o.method = c, o.payload = P, o.payloadType = m, oe(o.payload) && I(
301
+ function A(f) {
302
+ return (g, m) => {
303
+ if (!y.value) {
304
+ a.method = f, a.payload = g, a.payloadType = m, oe(a.payload) && I(
305
305
  [
306
- z,
307
- L(o.payload)
306
+ Q,
307
+ L(a.payload)
308
308
  ],
309
309
  ([T]) => T && U(),
310
310
  { deep: !0 }
311
311
  );
312
- const H = O(o.payload);
313
- return !m && H && Object.getPrototypeOf(H) === Object.prototype && !(H instanceof FormData) && (o.payloadType = "json"), N(d({}, x), {
312
+ const $ = b(a.payload);
313
+ return !m && $ && Object.getPrototypeOf($) === Object.prototype && !($ instanceof FormData) && (a.payloadType = "json"), N(p({}, x), {
314
314
  then(T, B) {
315
315
  return V().then(T, B);
316
316
  }
@@ -319,86 +319,72 @@ function De(e, ...t) {
319
319
  };
320
320
  }
321
321
  function V() {
322
- return new Promise((c, P) => {
323
- Pe(h).toBe(!0).then(() => c(x)).catch((m) => P(m));
322
+ return new Promise((f, g) => {
323
+ ve(i).toBe(!0).then(() => f(x)).catch((m) => g(m));
324
324
  });
325
325
  }
326
- function C(c) {
326
+ function C(f) {
327
327
  return () => {
328
- if (!p.value)
329
- return o.type = c, N(d({}, x), {
330
- then(P, m) {
331
- return V().then(P, m);
328
+ if (!y.value)
329
+ return a.type = f, N(p({}, x), {
330
+ then(g, m) {
331
+ return V().then(g, m);
332
332
  }
333
333
  });
334
334
  };
335
335
  }
336
- return r.immediate && Promise.resolve().then(() => U()), N(d({}, x), {
337
- then(c, P) {
338
- return V().then(c, P);
336
+ return r.immediate && Promise.resolve().then(() => U()), N(p({}, x), {
337
+ then(f, g) {
338
+ return V().then(f, g);
339
339
  }
340
340
  });
341
341
  }
342
- function Ce(e, t) {
343
- const n = {};
344
- return Object.keys(e).forEach((i) => {
345
- n[i] = (...r) => {
346
- const o = e[i], b = o.type;
347
- let l = o.url;
348
- l.startsWith("http") || (l = `/api/${l}`), o.hasBody ? l = Y(l, ...r.splice(1)) : l = Y(l, ...r);
349
- const v = {
350
- ...ie(),
351
- ...o.headers()
352
- }, g = De(
353
- l,
342
+ function $e(e, t, n = "/api/") {
343
+ const l = {};
344
+ return Object.keys(e).forEach((r) => {
345
+ l[r] = (...a) => {
346
+ const h = e[r], w = h.type;
347
+ let u = h.url;
348
+ u.startsWith("http") || (u = `${n}${u}`), h.hasBody ? u = Y(u, ...a.splice(1)) : u = Y(u, ...a);
349
+ const O = {
350
+ ...ae(),
351
+ ...h.headers()
352
+ }, o = _e(
353
+ u,
354
354
  {
355
- method: b
355
+ method: w
356
356
  },
357
357
  {
358
358
  immediate: !1,
359
- beforeFetch({ options: u }) {
360
- return u.headers = {
361
- ...u.headers,
362
- ...v
363
- }, o.hasBody && r.length && (u.body = JSON.stringify(r[0])), {
364
- options: u
359
+ beforeFetch({ options: i }) {
360
+ return i.headers = {
361
+ ...i.headers,
362
+ ...O
363
+ }, h.hasBody && a.length && (i.body = JSON.stringify(a[0])), {
364
+ options: i
365
365
  };
366
366
  },
367
- onFetchError(u) {
368
- return u != null && u.response && t(u), u;
367
+ onFetchError(i) {
368
+ return i != null && i.response && t(i), i;
369
369
  }
370
370
  }
371
371
  );
372
372
  return {
373
- ...Se(v) === "application/json" ? g.json() : g.text()
373
+ ...je(O) === "application/json" ? o.json() : o.text()
374
374
  };
375
375
  };
376
- }), n;
376
+ }), l;
377
377
  }
378
- function Se(e) {
378
+ function je(e) {
379
379
  return e.accept ?? "*/*";
380
380
  }
381
- function Ne(e) {
381
+ function He(e) {
382
382
  return JSON.parse(JSON.stringify(e));
383
383
  }
384
- function Ue(e = 500) {
385
- const t = he({
386
- debouncer: null,
387
- timeout: e
388
- });
389
- function n(s, ...i) {
390
- t.debouncer !== null && window.clearTimeout(t.debouncer), t.debouncer = window.setTimeout(() => s(...i), t.timeout);
391
- }
392
- return {
393
- ...me(t),
394
- debounce: n
395
- };
396
- }
397
384
  export {
398
- Ne as copy,
399
- $e as createEndpoint,
400
- ie as getDefaultHeaders,
401
- He as requestTypes,
402
- Ce as useApi,
403
- Ue as useDebouncer
385
+ He as copy,
386
+ Be as createEndpoint,
387
+ ae as getDefaultHeaders,
388
+ Ae as requestTypes,
389
+ $e as useApi
404
390
  };
@@ -1 +1 @@
1
- (function(h,$){typeof exports=="object"&&typeof module<"u"?$(exports,require("@citruslime/utils"),require("vue")):typeof define=="function"&&define.amd?define(["exports","@citruslime/utils","vue"],$):(h=typeof globalThis<"u"?globalThis:h||self,$(h.CitrusLimeVueUtils={},h.CLUtils,h.Vue))})(this,function(h,$,s){"use strict";const ie=["GET","POST","PUT","DELETE"];function ae(e,t,n=null,u=null){return{url:e,type:t,headers:n??I,hasBody:se(t,u)}}function I(){return{accept:"application/json","content-type":"application/json"}}function se(e,t){return!!(t===null&&(e==="PUT"||e==="POST")||t)}function Q(e){return s.getCurrentScope()?(s.onScopeDispose(e),!0):!1}function L(){const e=new Set,t=i=>{e.delete(i)};return{on:i=>{e.add(i);const r=()=>t(i);return Q(r),{off:r}},off:t,trigger:i=>Promise.all(Array.from(e).map(r=>r(i)))}}function O(e){return typeof e=="function"?e():s.unref(e)}const X=typeof window<"u",le=()=>{};function Y(e,t=!1,n="Timeout"){return new Promise((u,i)=>{setTimeout(t?()=>i(n):u,e)})}function ue(e,...t){return t.some(n=>n in e)}function R(...e){if(e.length!==1)return s.toRef(...e);const t=e[0];return typeof t=="function"?s.readonly(s.customRef(()=>({get:t,set:le}))):s.ref(t)}function K(e,t=!1){function n(a,{flush:l="sync",deep:m=!1,timeout:y,throwOnTimeout:v}={}){let T=null;const A=[new Promise(_=>{T=s.watch(e,D=>{a(D)!==t&&(T==null||T(),_(D))},{flush:l,deep:m,immediate:!0})})];return y!=null&&A.push(Y(y,v).then(()=>O(e)).finally(()=>T==null?void 0:T())),Promise.race(A)}function u(a,l){if(!s.isRef(a))return n(D=>D===a,l);const{flush:m="sync",deep:y=!1,timeout:v,throwOnTimeout:T}=l??{};let b=null;const _=[new Promise(D=>{b=s.watch([e,a],([S,B])=>{t!==(S===B)&&(b==null||b(),D(S))},{flush:m,deep:y,immediate:!0})})];return v!=null&&_.push(Y(v,T).then(()=>O(e)).finally(()=>(b==null||b(),O(e)))),Promise.race(_)}function i(a){return n(l=>!!l,a)}function r(a){return u(null,a)}function o(a){return u(void 0,a)}function F(a){return n(Number.isNaN,a)}function c(a,l){return n(m=>{const y=Array.from(m);return y.includes(a)||y.includes(O(a))},l)}function P(a){return E(1,a)}function E(a=1,l){let m=-1;return n(()=>(m+=1,m>=a),l)}return Array.isArray(O(e))?{toMatch:n,toContains:c,changed:P,changedTimes:E,get not(){return K(e,!t)}}:{toMatch:n,toBe:u,toBeTruthy:i,toBeNull:r,toBeNaN:F,toBeUndefined:o,changed:P,changedTimes:E,get not(){return K(e,!t)}}}function ce(e){return K(e)}function fe(e,t,n={}){const{immediate:u=!0}=n,i=s.ref(!1);let r=null;function o(){r&&(clearTimeout(r),r=null)}function F(){i.value=!1,o()}function c(...P){o(),i.value=!0,r=setTimeout(()=>{i.value=!1,r=null,e(...P)},O(t))}return u&&(i.value=!0,X&&c()),Q(F),{isPending:s.readonly(i),start:c,stop:F}}const de=X?window:void 0;var pe=Object.defineProperty,he=Object.defineProperties,ye=Object.getOwnPropertyDescriptors,Z=Object.getOwnPropertySymbols,me=Object.prototype.hasOwnProperty,we=Object.prototype.propertyIsEnumerable,ee=(e,t,n)=>t in e?pe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,f=(e,t)=>{for(var n in t||(t={}))me.call(t,n)&&ee(e,n,t[n]);if(Z)for(var n of Z(t))we.call(t,n)&&ee(e,n,t[n]);return e},U=(e,t)=>he(e,ye(t));const Te={json:"application/json",text:"text/plain"};function te(e){return e&&ue(e,"immediate","refetch","initialData","timeout","beforeFetch","afterFetch","onFetchError","fetch")}function W(e){return typeof Headers<"u"&&e instanceof Headers?Object.fromEntries([...e.entries()]):e}function Pe(e,...t){var n;const u=typeof AbortController=="function";let i={},r={immediate:!0,refetch:!1,timeout:0};const o={method:"GET",type:"text",payload:void 0};t.length>0&&(te(t[0])?r=f(f({},r),t[0]):i=t[0]),t.length>1&&te(t[1])&&(r=f(f({},r),t[1]));const{fetch:F=(n=de)==null?void 0:n.fetch,initialData:c,timeout:P}=r,E=L(),a=L(),l=L(),m=s.ref(!1),y=s.ref(!1),v=s.ref(!1),T=s.ref(null),b=s.shallowRef(null),A=s.shallowRef(null),_=s.shallowRef(c||null),D=s.computed(()=>u&&y.value);let S,B;const k=()=>{u&&(S==null||S.abort(),S=new AbortController,S.signal.onabort=()=>v.value=!0,i=U(f({},i),{signal:S.signal}))},x=d=>{y.value=d,m.value=!d};P&&(B=fe(k,P,{immediate:!1}));const J=async(d=!1)=>{var g;k(),x(!0),A.value=null,T.value=null,v.value=!1;const w={method:o.method,headers:{}};if(o.payload){const V=W(w.headers);o.payloadType&&(V["Content-Type"]=(g=Te[o.payloadType])!=null?g:o.payloadType);const G=O(o.payload);w.body=o.payloadType==="json"?JSON.stringify(G):G}let N=!1;const j={url:O(e),options:f(f({},w),i),cancel:()=>{N=!0}};if(r.beforeFetch&&Object.assign(j,await r.beforeFetch(j)),N||!F)return x(!1),Promise.resolve(null);let C=null;return B&&B.start(),new Promise((V,G)=>{var re;F(j.url,U(f(f({},w),j.options),{headers:f(f({},W(w.headers)),W((re=j.options)==null?void 0:re.headers))})).then(async p=>{if(b.value=p,T.value=p.status,C=await p[o.type](),!p.ok)throw _.value=c||null,new Error(p.statusText);return r.afterFetch&&({data:C}=await r.afterFetch({data:C,response:p})),_.value=C,E.trigger(p),V(p)}).catch(async p=>{let oe=p.message||p.name;return r.onFetchError&&({error:oe}=await r.onFetchError({data:C,error:p,response:b.value})),A.value=oe,a.trigger(p),d?G(p):V(null)}).finally(()=>{x(!1),B&&B.stop(),l.trigger(null)})})},ne=R(r.refetch);s.watch([ne,R(e)],([d])=>d&&J(),{deep:!0});const M={isFinished:m,statusCode:T,response:b,error:A,data:_,isFetching:y,canAbort:D,aborted:v,abort:k,execute:J,onFetchResponse:E.on,onFetchError:a.on,onFetchFinally:l.on,get:H("GET"),put:H("PUT"),post:H("POST"),delete:H("DELETE"),patch:H("PATCH"),head:H("HEAD"),options:H("OPTIONS"),json:q("json"),text:q("text"),blob:q("blob"),arrayBuffer:q("arrayBuffer"),formData:q("formData")};function H(d){return(g,w)=>{if(!y.value){o.method=d,o.payload=g,o.payloadType=w,s.isRef(o.payload)&&s.watch([ne,R(o.payload)],([j])=>j&&J(),{deep:!0});const N=O(o.payload);return!w&&N&&Object.getPrototypeOf(N)===Object.prototype&&!(N instanceof FormData)&&(o.payloadType="json"),U(f({},M),{then(j,C){return z().then(j,C)}})}}}function z(){return new Promise((d,g)=>{ce(m).toBe(!0).then(()=>d(M)).catch(w=>g(w))})}function q(d){return()=>{if(!y.value)return o.type=d,U(f({},M),{then(g,w){return z().then(g,w)}})}}return r.immediate&&Promise.resolve().then(()=>J()),U(f({},M),{then(d,g){return z().then(d,g)}})}function be(e,t){const n={};return Object.keys(e).forEach(i=>{n[i]=(...r)=>{const o=e[i],F=o.type;let c=o.url;c.startsWith("http")||(c=`/api/${c}`),o.hasBody?c=$.replacePlaceholders(c,...r.splice(1)):c=$.replacePlaceholders(c,...r);const P={...I(),...o.headers()},E=Pe(c,{method:F},{immediate:!1,beforeFetch({options:l}){return l.headers={...l.headers,...P},o.hasBody&&r.length&&(l.body=JSON.stringify(r[0])),{options:l}},onFetchError(l){return l!=null&&l.response&&t(l),l}});return{...ge(P)==="application/json"?E.json():E.text()}}}),n}function ge(e){return e.accept??"*/*"}function Oe(e){return JSON.parse(JSON.stringify(e))}function Fe(e=500){const t=s.reactive({debouncer:null,timeout:e});function n(u,...i){t.debouncer!==null&&window.clearTimeout(t.debouncer),t.debouncer=window.setTimeout(()=>u(...i),t.timeout)}return{...s.toRefs(t),debounce:n}}h.copy=Oe,h.createEndpoint=ae,h.getDefaultHeaders=I,h.requestTypes=ie,h.useApi=be,h.useDebouncer=Fe,Object.defineProperty(h,Symbol.toStringTag,{value:"Module"})});
1
+ (function(w,$){typeof exports=="object"&&typeof module<"u"?$(exports,require("@citruslime/utils"),require("vue")):typeof define=="function"&&define.amd?define(["exports","@citruslime/utils","vue"],$):(w=typeof globalThis<"u"?globalThis:w||self,$(w.CitrusLimeVueUtils={},w.CLUtils,w.Vue))})(this,function(w,$,a){"use strict";const ie=["GET","POST","PUT","DELETE"];function ae(e,t,n=null,u=null){return{url:e,type:t,headers:n??I,hasBody:se(t,u)}}function I(){return{accept:"application/json","content-type":"application/json"}}function se(e,t){return!!(t===null&&(e==="PUT"||e==="POST")||t)}function Q(e){return a.getCurrentScope()?(a.onScopeDispose(e),!0):!1}function L(){const e=new Set,t=l=>{e.delete(l)};return{on:l=>{e.add(l);const r=()=>t(l);return Q(r),{off:r}},off:t,trigger:l=>Promise.all(Array.from(e).map(r=>r(l)))}}function b(e){return typeof e=="function"?e():a.unref(e)}const X=typeof window<"u",le=()=>{};function Y(e,t=!1,n="Timeout"){return new Promise((u,l)=>{setTimeout(t?()=>l(n):u,e)})}function ue(e,...t){return t.some(n=>n in e)}function K(...e){if(e.length!==1)return a.toRef(...e);const t=e[0];return typeof t=="function"?a.readonly(a.customRef(()=>({get:t,set:le}))):a.ref(t)}function R(e,t=!1){function n(o,{flush:f="sync",deep:s=!1,timeout:m,throwOnTimeout:j}={}){let T=null;const A=[new Promise(_=>{T=a.watch(e,D=>{o(D)!==t&&(T==null||T(),_(D))},{flush:f,deep:s,immediate:!0})})];return m!=null&&A.push(Y(m,j).then(()=>b(e)).finally(()=>T==null?void 0:T())),Promise.race(A)}function u(o,f){if(!a.isRef(o))return n(D=>D===o,f);const{flush:s="sync",deep:m=!1,timeout:j,throwOnTimeout:T}=f??{};let g=null;const _=[new Promise(D=>{g=a.watch([e,o],([S,B])=>{t!==(S===B)&&(g==null||g(),D(S))},{flush:s,deep:m,immediate:!0})})];return j!=null&&_.push(Y(j,T).then(()=>b(e)).finally(()=>(g==null||g(),b(e)))),Promise.race(_)}function l(o){return n(f=>!!f,o)}function r(o){return u(null,o)}function i(o){return u(void 0,o)}function y(o){return n(Number.isNaN,o)}function F(o,f){return n(s=>{const m=Array.from(s);return m.includes(o)||m.includes(b(o))},f)}function c(o){return v(1,o)}function v(o=1,f){let s=-1;return n(()=>(s+=1,s>=o),f)}return Array.isArray(b(e))?{toMatch:n,toContains:F,changed:c,changedTimes:v,get not(){return R(e,!t)}}:{toMatch:n,toBe:u,toBeTruthy:l,toBeNull:r,toBeNaN:y,toBeUndefined:i,changed:c,changedTimes:v,get not(){return R(e,!t)}}}function ce(e){return R(e)}function fe(e,t,n={}){const{immediate:u=!0}=n,l=a.ref(!1);let r=null;function i(){r&&(clearTimeout(r),r=null)}function y(){l.value=!1,i()}function F(...c){i(),l.value=!0,r=setTimeout(()=>{l.value=!1,r=null,e(...c)},b(t))}return u&&(l.value=!0,X&&F()),Q(y),{isPending:a.readonly(l),start:F,stop:y}}const de=X?window:void 0;var pe=Object.defineProperty,he=Object.defineProperties,ye=Object.getOwnPropertyDescriptors,Z=Object.getOwnPropertySymbols,me=Object.prototype.hasOwnProperty,we=Object.prototype.propertyIsEnumerable,ee=(e,t,n)=>t in e?pe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,d=(e,t)=>{for(var n in t||(t={}))me.call(t,n)&&ee(e,n,t[n]);if(Z)for(var n of Z(t))we.call(t,n)&&ee(e,n,t[n]);return e},U=(e,t)=>he(e,ye(t));const Pe={json:"application/json",text:"text/plain"};function te(e){return e&&ue(e,"immediate","refetch","initialData","timeout","beforeFetch","afterFetch","onFetchError","fetch")}function W(e){return typeof Headers<"u"&&e instanceof Headers?Object.fromEntries([...e.entries()]):e}function Te(e,...t){var n;const u=typeof AbortController=="function";let l={},r={immediate:!0,refetch:!1,timeout:0};const i={method:"GET",type:"text",payload:void 0};t.length>0&&(te(t[0])?r=d(d({},r),t[0]):l=t[0]),t.length>1&&te(t[1])&&(r=d(d({},r),t[1]));const{fetch:y=(n=de)==null?void 0:n.fetch,initialData:F,timeout:c}=r,v=L(),o=L(),f=L(),s=a.ref(!1),m=a.ref(!1),j=a.ref(!1),T=a.ref(null),g=a.shallowRef(null),A=a.shallowRef(null),_=a.shallowRef(F||null),D=a.computed(()=>u&&m.value);let S,B;const x=()=>{u&&(S==null||S.abort(),S=new AbortController,S.signal.onabort=()=>j.value=!0,l=U(d({},l),{signal:S.signal}))},k=p=>{m.value=p,s.value=!p};c&&(B=fe(x,c,{immediate:!1}));const J=async(p=!1)=>{var O;x(),k(!0),A.value=null,T.value=null,j.value=!1;const P={method:i.method,headers:{}};if(i.payload){const V=W(P.headers);i.payloadType&&(V["Content-Type"]=(O=Pe[i.payloadType])!=null?O:i.payloadType);const G=b(i.payload);P.body=i.payloadType==="json"?JSON.stringify(G):G}let N=!1;const E={url:b(e),options:d(d({},P),l),cancel:()=>{N=!0}};if(r.beforeFetch&&Object.assign(E,await r.beforeFetch(E)),N||!y)return k(!1),Promise.resolve(null);let C=null;return B&&B.start(),new Promise((V,G)=>{var re;y(E.url,U(d(d({},P),E.options),{headers:d(d({},W(P.headers)),W((re=E.options)==null?void 0:re.headers))})).then(async h=>{if(g.value=h,T.value=h.status,C=await h[i.type](),!h.ok)throw _.value=F||null,new Error(h.statusText);return r.afterFetch&&({data:C}=await r.afterFetch({data:C,response:h})),_.value=C,v.trigger(h),V(h)}).catch(async h=>{let oe=h.message||h.name;return r.onFetchError&&({error:oe}=await r.onFetchError({data:C,error:h,response:g.value})),A.value=oe,o.trigger(h),p?G(h):V(null)}).finally(()=>{k(!1),B&&B.stop(),f.trigger(null)})})},ne=K(r.refetch);a.watch([ne,K(e)],([p])=>p&&J(),{deep:!0});const M={isFinished:s,statusCode:T,response:g,error:A,data:_,isFetching:m,canAbort:D,aborted:j,abort:x,execute:J,onFetchResponse:v.on,onFetchError:o.on,onFetchFinally:f.on,get:H("GET"),put:H("PUT"),post:H("POST"),delete:H("DELETE"),patch:H("PATCH"),head:H("HEAD"),options:H("OPTIONS"),json:q("json"),text:q("text"),blob:q("blob"),arrayBuffer:q("arrayBuffer"),formData:q("formData")};function H(p){return(O,P)=>{if(!m.value){i.method=p,i.payload=O,i.payloadType=P,a.isRef(i.payload)&&a.watch([ne,K(i.payload)],([E])=>E&&J(),{deep:!0});const N=b(i.payload);return!P&&N&&Object.getPrototypeOf(N)===Object.prototype&&!(N instanceof FormData)&&(i.payloadType="json"),U(d({},M),{then(E,C){return z().then(E,C)}})}}}function z(){return new Promise((p,O)=>{ce(s).toBe(!0).then(()=>p(M)).catch(P=>O(P))})}function q(p){return()=>{if(!m.value)return i.type=p,U(d({},M),{then(O,P){return z().then(O,P)}})}}return r.immediate&&Promise.resolve().then(()=>J()),U(d({},M),{then(p,O){return z().then(p,O)}})}function ge(e,t,n="/api/"){const u={};return Object.keys(e).forEach(r=>{u[r]=(...i)=>{const y=e[r],F=y.type;let c=y.url;c.startsWith("http")||(c=`${n}${c}`),y.hasBody?c=$.replacePlaceholders(c,...i.splice(1)):c=$.replacePlaceholders(c,...i);const v={...I(),...y.headers()},o=Te(c,{method:F},{immediate:!1,beforeFetch({options:s}){return s.headers={...s.headers,...v},y.hasBody&&i.length&&(s.body=JSON.stringify(i[0])),{options:s}},onFetchError(s){return s!=null&&s.response&&t(s),s}});return{...Oe(v)==="application/json"?o.json():o.text()}}}),u}function Oe(e){return e.accept??"*/*"}function be(e){return JSON.parse(JSON.stringify(e))}w.copy=be,w.createEndpoint=ae,w.getDefaultHeaders=I,w.requestTypes=ie,w.useApi=ge,Object.defineProperty(w,Symbol.toStringTag,{value:"Module"})});
@@ -6,10 +6,11 @@ export type ApiRequest<TResponseModel> = ReturnType<typeof useFetch<TResponseMod
6
6
  *
7
7
  * @param endpoints The endpoints provided to build with the factory.
8
8
  * @param handleFetchErrorResponse The error handler for the api factory.
9
+ * @param prefix The prefix to append to the url (defaults to '/api/').
9
10
  * @returns An API object containing request methods.
10
11
  */
11
12
  export declare function useApi<TEndpoint extends Record<keyof TEndpoint, Endpoint>>(endpoints: TEndpoint, handleFetchErrorResponse: (context: {
12
13
  data: any;
13
14
  response: Response | null;
14
15
  error: any;
15
- }) => void): Record<keyof TEndpoint, <TResponseModel>(...values: unknown[]) => ApiRequest<TResponseModel>>;
16
+ }) => void, prefix?: string): Record<keyof TEndpoint, <TResponseModel>(...values: unknown[]) => ApiRequest<TResponseModel>>;
@@ -1,4 +1,3 @@
1
1
  export * from './api/endpoints';
2
2
  export * from './api/factory';
3
3
  export * from './copy';
4
- export * from './debouncer';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@citruslime/vue-utils",
3
- "version": "1.4.3-beta.0",
3
+ "version": "1.4.3-beta.2",
4
4
  "type": "module",
5
5
  "author": {
6
6
  "name": "Citrus-Lime Ltd",
@@ -1,13 +0,0 @@
1
- import type { Ref } from 'vue';
2
- export interface Debouncer {
3
- debouncer: Ref<number | null>;
4
- timeout: Ref<number>;
5
- debounce(event: Function, ...eventArgs: unknown[]): void;
6
- }
7
- /**
8
- * Composable for creating a debouncer.
9
- *
10
- * @param timeout The timeout, in milliseconds, to use when debouncing.
11
- * @returns A debouncer composable.
12
- */
13
- export declare function useDebouncer(timeout?: number): Debouncer;