@volverjs/data
Version:
Repository pattern implementation with a tiny HttpClient based on Fetch API.
231 lines (230 loc) • 6.52 kB
JavaScript
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
};