UNPKG

@volverjs/data

Version:

Repository pattern implementation with a tiny HttpClient based on Fetch API.

231 lines (230 loc) 6.52 kB
import { unref as n, ref as i, readonly as q, computed as G } from "vue"; import { HttpClient as A } from "../HttpClient.js"; import { RepositoryHttp as B } from "../RepositoryHttp.js"; var D = /* @__PURE__ */ ((e) => (e.loading = "loading", e.error = "error", e.success = "success", e.idle = "idle", e))(D || {}); function y() { const e = i( "idle" /* idle */ ), c = G( () => e.value === "loading" /* loading */ ), r = G( () => e.value === "error" /* error */ ), t = G( () => e.value === "success" /* success */ ); return { status: e, isLoading: c, isError: r, isSuccess: t }; } const S = /* @__PURE__ */ new Map(), O = "global"; class I extends A { _scope; constructor(c) { super(c), this._scope = c.scope; } get scope() { return this._scope; } install(c, { globalName: r = "vvHttp" } = {}) { if (c.config.globalProperties[`$${r}`]) throw new Error(`globalName already exist: ${r}`); c.config.globalProperties[`$${r}`] = this; } } function F({ scope: e = O, ...c } = {}) { if (S.has(e)) throw new Error(`httpClient with scope ${e} already exist`); const r = new I({ ...c, scope: e }); return S.set(e, r), r; } function J(e) { if (e === O) throw new Error("You cannot remove httpClient global instance"); if (!S.has(e)) throw new Error(`httpClient with scope ${e} not exist`); return S.delete(e); } function M(e = O) { const c = S.get(e); if (!c) throw new Error("HttpClient instance not found"); const r = (t, d, _ = {}) => { const { status: H, isLoading: j, isError: E, isSuccess: f } = y(), o = n(_).immediate ?? !0, a = i(), g = i(), w = i(), b = (v = n(d), u = n(_)) => { H.value = "loading", a.value = void 0, g.value = void 0; const { responsePromise: l, abort: p, signal: m } = c.request( t, v, u ); return l.then((s) => (w.value = s, s.json())).then((s) => { g.value = s, H.value = "success"; }).catch((s) => { if (!m.aborted) { a.value = s, H.value = "error"; return; } H.value = "idle"; }), { responsePromise: l, abort: p, signal: m }; }; return { execute: b, isLoading: j, isSuccess: f, isError: E, error: q(a), data: g, response: w, ...o ? b() : {} }; }; return { client: c, request: r, requestGet: (t, d = {}) => r("get", t, d), requestPost: (t, d = {}) => r("post", t, d), requestPut: (t, d = {}) => r("put", t, d), requestDelete: (t, d = {}) => r("delete", t, d), requestHead: (t, d = {}) => r("head", t, d), requestPatch: (t, d = {}) => r("patch", t, d) }; } function K(e, c) { const { client: r } = M(c?.httpClientScope), t = new B( r, e, c ); return { repository: t, read: (E, f = {}) => { const { status: o, isLoading: a, isError: g, isSuccess: w } = y(), b = n(f).immediate ?? !0, v = i(), u = i(), l = i(), p = i(), m = (s = n(E), P = n(f)) => { o.value = "loading", v.value = void 0, l.value = void 0, u.value = void 0; const { abort: L, responsePromise: x } = t.read( s, P ); return x.then((C) => { if (u.value = C.data, l.value = C.item, p.value = C.metadata, C.aborted) { o.value = "idle"; return; } o.value = "success"; }).catch((C) => { v.value = C, o.value = "error"; }), { abort: L, responsePromise: x }; }; return { execute: m, isLoading: a, isSuccess: w, isError: g, error: q(v), data: u, item: l, metadata: p, ...b ? m() : {} }; }, create: (E, f = {}, o = {}) => { const { status: a, isLoading: g, isError: w, isSuccess: b } = y(), v = n(o).immediate ?? !0, u = i(), l = i(), p = i(), m = i(), s = (P = n(E), L = n(f), x = n(o)) => { a.value = "loading", u.value = void 0, p.value = void 0, l.value = void 0; const { abort: C, responsePromise: $ } = t.create( P, L, x ); return $.then((h) => { if (l.value = h.data, p.value = h.item, m.value = h.metadata, h.aborted) { a.value = "idle"; return; } a.value = "success"; }).catch((h) => { u.value = h, a.value = "error"; }), { abort: C, responsePromise: $ }; }; return { execute: s, isLoading: g, isSuccess: b, isError: w, error: q(u), data: l, metadata: m, ...v ? s() : {} }; }, update: (E, f = {}, o = {}) => { const { status: a, isLoading: g, isError: w, isSuccess: b } = y(), v = n(o).immediate ?? !0, u = i(), l = i(), p = i(), m = i(), s = (P = n(E), L = n(f), x = n(o)) => { a.value = "loading", u.value = void 0, p.value = void 0, l.value = void 0; const { abort: C, responsePromise: $ } = t.update( P, L, x ); return $.then((h) => { if (l.value = h.data, p.value = h.item, m.value = h.metadata, h.aborted) { a.value = "idle"; return; } a.value = "success"; }).catch((h) => { u.value = h, a.value = "error"; }), { abort: C, responsePromise: $ }; }; return { execute: s, isLoading: g, isSuccess: b, isError: w, error: q(u), data: l, metadata: m, ...v ? s() : {} }; }, remove: (E, f = {}) => { const { status: o, isLoading: a, isError: g, isSuccess: w } = y(), b = n(f).immediate ?? !0, v = i(), u = (l = n(E), p = n(f)) => { o.value = "loading", v.value = void 0; const { abort: m, responsePromise: s } = t.remove( l, p ); return s.then((P) => { if (P.aborted) { o.value = "idle"; return; } o.value = "success"; }).catch((P) => { v.value = P, o.value = "error"; }), { abort: m, responsePromise: s }; }; return { execute: u, isLoading: a, isSuccess: w, isError: g, error: q(v), ...b ? u() : {} }; } }; } export { D as HttpRequestStatus, F as createHttpClient, J as removeHttpClient, M as useHttpClient, K as useRepositoryHttp };