solid-request
Version:
solid-js use-request hooks library
845 lines (844 loc) • 21.4 kB
JavaScript
const Rt = (t, e) => t === e, M = {
equals: Rt
};
let gt = mt;
const R = 1, H = 2, Et = {
owned: null,
cleanups: null,
context: null,
owner: null
};
var v = null;
let A = null, b = null, p = null, w = null, W = 0;
function j(t, e) {
e = e ? Object.assign({}, M, e) : M;
const n = {
value: t,
observers: null,
observerSlots: null,
comparator: e.equals || void 0
}, r = (s) => (typeof s == "function" && (s = s(n.value)), bt(n, s));
return [ht.bind(n), r];
}
function T(t, e, n) {
gt = $t;
const r = pt(t, e, !1, R), s = ot && wt(v, ot.id);
s && (r.suspense = s), r.user = !0, w ? w.push(r) : q(r);
}
function O(t, e, n) {
n = n ? Object.assign({}, M, n) : M;
const r = pt(t, e, !0, 0);
return r.observers = null, r.observerSlots = null, r.comparator = n.equals || void 0, q(r), ht.bind(r);
}
function K(t) {
if (b === null)
return t();
const e = b;
b = null;
try {
return t();
} finally {
b = e;
}
}
function it(t, e, n) {
const r = Array.isArray(t);
let s, i = n && n.defer;
return (o) => {
let u;
if (r) {
u = Array(t.length);
for (let c = 0; c < t.length; c++)
u[c] = t[c]();
} else
u = t();
if (i) {
i = !1;
return;
}
const l = K(() => e(u, s, o));
return s = u, l;
};
}
function tt(t) {
T(() => K(t));
}
function U(t) {
return v === null || (v.cleanups === null ? v.cleanups = [t] : v.cleanups.push(t)), t;
}
let ot;
function ht() {
const t = A;
if (this.sources && (this.state || t))
if (this.state === R || t)
q(this);
else {
const e = p;
p = null, V(() => I(this), !1), p = e;
}
if (b) {
const e = this.observers ? this.observers.length : 0;
b.sources ? (b.sources.push(this), b.sourceSlots.push(e)) : (b.sources = [this], b.sourceSlots = [e]), this.observers ? (this.observers.push(b), this.observerSlots.push(b.sources.length - 1)) : (this.observers = [b], this.observerSlots = [b.sources.length - 1]);
}
return this.value;
}
function bt(t, e, n) {
let r = t.value;
return (!t.comparator || !t.comparator(r, e)) && (t.value = e, t.observers && t.observers.length && V(() => {
for (let s = 0; s < t.observers.length; s += 1) {
const i = t.observers[s], o = A && A.running;
o && A.disposed.has(i), (o && !i.tState || !o && !i.state) && (i.pure ? p.push(i) : w.push(i), i.observers && vt(i)), o || (i.state = R);
}
if (p.length > 1e6)
throw p = [], new Error();
}, !1)), e;
}
function q(t) {
if (!t.fn)
return;
et(t);
const e = v, n = b, r = W;
b = v = t, jt(t, t.value, r), b = n, v = e;
}
function jt(t, e, n) {
let r;
try {
r = t.fn(e);
} catch (s) {
return t.pure && (t.state = R, t.owned && t.owned.forEach(et), t.owned = null), t.updatedAt = n + 1, St(s);
}
(!t.updatedAt || t.updatedAt <= n) && (t.updatedAt != null && "observers" in t ? bt(t, r) : t.value = r, t.updatedAt = n);
}
function pt(t, e, n, r = R, s) {
const i = {
fn: t,
state: r,
updatedAt: null,
owned: null,
sources: null,
sourceSlots: null,
cleanups: null,
value: e,
owner: v,
context: null,
pure: n
};
return v === null || v !== Et && (v.owned ? v.owned.push(i) : v.owned = [i]), i;
}
function G(t) {
const e = A;
if (t.state === 0 || e)
return;
if (t.state === H || e)
return I(t);
if (t.suspense && K(t.suspense.inFallback))
return t.suspense.effects.push(t);
const n = [t];
for (; (t = t.owner) && (!t.updatedAt || t.updatedAt < W); )
(t.state || e) && n.push(t);
for (let r = n.length - 1; r >= 0; r--)
if (t = n[r], t.state === R || e)
q(t);
else if (t.state === H || e) {
const s = p;
p = null, V(() => I(t, n[0]), !1), p = s;
}
}
function V(t, e) {
if (p)
return t();
let n = !1;
e || (p = []), w ? n = !0 : w = [], W++;
try {
const r = t();
return xt(n), r;
} catch (r) {
n || (w = null), p = null, St(r);
}
}
function xt(t) {
if (p && (mt(p), p = null), t)
return;
const e = w;
w = null, e.length && V(() => gt(e), !1);
}
function mt(t) {
for (let e = 0; e < t.length; e++)
G(t[e]);
}
function $t(t) {
let e, n = 0;
for (e = 0; e < t.length; e++) {
const r = t[e];
r.user ? t[n++] = r : G(r);
}
for (e = 0; e < n; e++)
G(t[e]);
}
function I(t, e) {
const n = A;
t.state = 0;
for (let r = 0; r < t.sources.length; r += 1) {
const s = t.sources[r];
s.sources && (s.state === R || n ? s !== e && (!s.updatedAt || s.updatedAt < W) && G(s) : (s.state === H || n) && I(s, e));
}
}
function vt(t) {
const e = A;
for (let n = 0; n < t.observers.length; n += 1) {
const r = t.observers[n];
(!r.state || e) && (r.state = H, r.pure ? p.push(r) : w.push(r), r.observers && vt(r));
}
}
function et(t) {
let e;
if (t.sources)
for (; t.sources.length; ) {
const n = t.sources.pop(), r = t.sourceSlots.pop(), s = n.observers;
if (s && s.length) {
const i = s.pop(), o = n.observerSlots.pop();
r < s.length && (i.sourceSlots[o] = r, s[r] = i, n.observerSlots[r] = o);
}
}
if (t.owned) {
for (e = 0; e < t.owned.length; e++)
et(t.owned[e]);
t.owned = null;
}
if (t.cleanups) {
for (e = 0; e < t.cleanups.length; e++)
t.cleanups[e]();
t.cleanups = null;
}
t.state = 0, t.context = null;
}
function Ct(t) {
return t instanceof Error || typeof t == "string" ? t : new Error("Unknown error");
}
function St(t) {
throw t = Ct(t), t;
}
function wt(t, e) {
return t ? t.context && t.context[e] !== void 0 ? t.context[e] : wt(t.owner, e) : void 0;
}
function _t(t) {
return typeof t == "function";
}
function d(t) {
return _t(t) ? t() : t;
}
const Tt = (t, { manual: e, ready: n = !0, refreshDeps: r = [], refreshDepsAction: s }) => {
const [i, o] = j(!1);
return T(() => {
e || o(d(n));
}), r instanceof Array ? T(it(
[i, ...r],
([u]) => {
u && !e && u && (s ? s() : t.refresh());
}
)) : T(it(i, (u) => {
!e && u && (s ? s() : t.refresh());
})), {
onBefore: () => {
if (!d(n))
return {
stopNow: !0
};
}
};
};
Tt.onInit = ({ ready: t = !0, manual: e }) => ({
loading: !e && d(t)
});
const E = /* @__PURE__ */ new Map(), Nt = (t, e, n) => {
const r = E.get(t);
r?.timer && clearTimeout(r.timer);
let s;
e > -1 && (s = setTimeout(() => {
E.delete(t);
}, e)), E.set(t, {
...n,
timer: s
});
}, Ut = (t) => E.get(t), en = (t) => {
t ? (Array.isArray(t) ? t : [t]).forEach((n) => E.delete(n)) : E.clear();
}, B = /* @__PURE__ */ new Map(), Ft = (t) => B.get(t), Lt = (t, e) => {
B.set(t, e), e.then((n) => (B.delete(t), n)).catch((n) => {
throw B.delete(t), n;
});
}, P = {}, Dt = (t, e) => {
P[t] && P[t].forEach((n) => n(e));
}, Z = (t, e) => (P[t] || (P[t] = []), P[t].push(e), function() {
const r = P[t].indexOf(e);
P[t].splice(r, 1);
}), Bt = (t, {
cacheKey: e,
cacheTime: n = 5 * 60 * 1e3,
staleTime: r = 0,
setCache: s,
getCache: i
}) => {
let o, u;
const l = (a, f) => {
s ? s(f) : Nt(a, n, f), Dt(a, f.data);
}, c = (a, f = []) => i ? i(f) : Ut(a);
return T(() => {
if (!e)
return;
const a = c(e);
a && Object.hasOwnProperty.call(a, "data") && (t.state.data = a.data, t.state.params = a.params, (r === -1 || (/* @__PURE__ */ new Date()).getTime() - a.time <= r) && (t.state.loading = !1)), o = Z(e, (f) => {
t.setState({ data: f });
});
}), tt(() => {
U(() => {
o?.();
});
}), e ? {
onBefore: (a) => {
const f = c(e, a);
return !f || !Object.hasOwnProperty.call(f, "data") ? {} : r === -1 || (/* @__PURE__ */ new Date()).getTime() - f.time <= r ? {
loading: !1,
data: f?.data,
returnNow: !0
} : {
data: f?.data
};
},
onRequest: (a, f) => {
let m = Ft(e);
return m && m !== u ? { servicePromise: m } : (m = a(...f), u = m, Lt(e, m), { servicePromise: m });
},
onSuccess: (a, f) => {
e && (o?.(), l(e, {
data: a,
params: f,
time: (/* @__PURE__ */ new Date()).getTime()
}), o = Z(e, (m) => {
t.setState({ data: m });
}));
},
onMutate: (a) => {
e && (o?.(), l(e, {
data: a,
params: t.state.params,
time: (/* @__PURE__ */ new Date()).getTime()
}), o = Z(e, (f) => {
t.setState({ data: f });
}));
}
} : {};
};
var D = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
function Mt(t) {
var e = typeof t;
return t != null && (e == "object" || e == "function");
}
var nt = Mt, Ht = typeof D == "object" && D && D.Object === Object && D, Gt = Ht, It = Gt, Wt = typeof self == "object" && self && self.Object === Object && self, qt = It || Wt || Function("return this")(), yt = qt, Vt = yt, Xt = function() {
return Vt.Date.now();
}, Qt = Xt, zt = /\s/;
function Jt(t) {
for (var e = t.length; e-- && zt.test(t.charAt(e)); )
;
return e;
}
var Yt = Jt, Zt = Yt, kt = /^\s+/;
function Kt(t) {
return t && t.slice(0, Zt(t) + 1).replace(kt, "");
}
var te = Kt, ee = yt, ne = ee.Symbol, Pt = ne, ut = Pt, Ot = Object.prototype, re = Ot.hasOwnProperty, se = Ot.toString, C = ut ? ut.toStringTag : void 0;
function ie(t) {
var e = re.call(t, C), n = t[C];
try {
t[C] = void 0;
var r = !0;
} catch {
}
var s = se.call(t);
return r && (e ? t[C] = n : delete t[C]), s;
}
var oe = ie, ue = Object.prototype, ae = ue.toString;
function le(t) {
return ae.call(t);
}
var ce = le, at = Pt, fe = oe, de = ce, ge = "[object Null]", he = "[object Undefined]", lt = at ? at.toStringTag : void 0;
function be(t) {
return t == null ? t === void 0 ? he : ge : lt && lt in Object(t) ? fe(t) : de(t);
}
var pe = be;
function me(t) {
return t != null && typeof t == "object";
}
var ve = me, Se = pe, we = ve, Te = "[object Symbol]";
function ye(t) {
return typeof t == "symbol" || we(t) && Se(t) == Te;
}
var Pe = ye, Oe = te, ct = nt, Ae = Pe, ft = 0 / 0, Re = /^[-+]0x[0-9a-f]+$/i, Ee = /^0b[01]+$/i, je = /^0o[0-7]+$/i, xe = parseInt;
function $e(t) {
if (typeof t == "number")
return t;
if (Ae(t))
return ft;
if (ct(t)) {
var e = typeof t.valueOf == "function" ? t.valueOf() : t;
t = ct(e) ? e + "" : e;
}
if (typeof t != "string")
return t === 0 ? t : +t;
t = Oe(t);
var n = Ee.test(t);
return n || je.test(t) ? xe(t.slice(2), n ? 2 : 8) : Re.test(t) ? ft : +t;
}
var Ce = $e, _e = nt, k = Qt, dt = Ce, Ne = "Expected a function", Ue = Math.max, Fe = Math.min;
function Le(t, e, n) {
var r, s, i, o, u, l, c = 0, a = !1, f = !1, m = !0;
if (typeof t != "function")
throw new TypeError(Ne);
e = dt(e) || 0, _e(n) && (a = !!n.leading, f = "maxWait" in n, i = f ? Ue(dt(n.maxWait) || 0, e) : i, m = "trailing" in n ? !!n.trailing : m);
function x(h) {
var y = r, $ = s;
return r = s = void 0, c = h, o = t.apply($, y), o;
}
function Q(h) {
return c = h, u = setTimeout(g, e), a ? x(h) : o;
}
function z(h) {
var y = h - l, $ = h - c, st = e - y;
return f ? Fe(st, i - $) : st;
}
function F(h) {
var y = h - l, $ = h - c;
return l === void 0 || y >= e || y < 0 || f && $ >= i;
}
function g() {
var h = k();
if (F(h))
return S(h);
u = setTimeout(g, z(h));
}
function S(h) {
return u = void 0, m && r ? x(h) : (r = s = void 0, o);
}
function L() {
u !== void 0 && clearTimeout(u), c = 0, r = l = s = u = void 0;
}
function J() {
return u === void 0 ? o : S(k());
}
function Y() {
var h = k(), y = F(h);
if (r = arguments, s = this, l = h, y) {
if (u === void 0)
return Q(l);
if (f)
return clearTimeout(u), u = setTimeout(g, e), x(l);
}
return u === void 0 && (u = setTimeout(g, e)), o;
}
return Y.cancel = L, Y.flush = J, Y;
}
var At = Le;
const De = (t, { debounceWait: e, debounceLeading: n, debounceTrailing: r, debounceMaxWait: s }) => {
const [i, o] = j(), u = O(() => {
const l = {}, c = d(n), a = d(r), f = d(s);
return c !== void 0 && (l.leading = c), a !== void 0 && (l.trailing = a), f !== void 0 && (l.maxWait = f), l;
});
return T(() => {
if (d(e)) {
const l = t.runAsync.bind(t);
o(
() => At(
(c) => {
c();
},
d(e),
u()
)
), t.runAsync = (...c) => new Promise((a, f) => {
i()?.(() => {
l(...c).then(a).catch(f);
});
}), U(() => {
i()?.cancel(), t.runAsync = l;
});
}
}), d(e) ? {
onCancel: () => {
i()?.cancel();
}
} : {};
}, Be = (t, { loadingDelay: e }) => {
let n;
if (!d(e))
return {};
const r = () => {
n && clearTimeout(n);
};
return {
onBefore: () => (r(), n = setTimeout(() => {
t.setState({
loading: !0
});
}, d(e)), {
loading: !1
}),
onFinally: () => {
r();
},
onCancel: () => {
r();
}
};
};
function X() {
return !!(typeof window < "u" && window.document && window.document.createElement);
}
function rt() {
return X() ? document.visibilityState !== "hidden" : !0;
}
const _ = [];
function Me(t) {
return _.push(t), function() {
const n = _.indexOf(t);
_.splice(n, 1);
};
}
if (X()) {
const t = () => {
if (rt())
for (let e = 0; e < _.length; e++) {
const n = _[e];
n();
}
};
window.addEventListener("visibilitychange", t, !1);
}
const He = (t, { pollingInterval: e, pollingWhenHidden: n = !0, pollingErrorRetryCount: r = -1 }) => {
let s, i;
const [o, u] = j(0), l = () => {
s && clearInterval(s), i?.();
};
return T(() => {
d(e) || l();
}), d(e) ? {
onBefore: () => {
l();
},
onError: () => {
u((c) => c + 1);
},
onSuccess: () => {
u(() => 0);
},
onFinally: () => {
r === -1 || // When an error occurs, the request is not repeated after pollingErrorRetryCount retries
r !== -1 && o() <= r ? s = setTimeout(() => {
!n && !rt() ? i = Me(() => {
t.refresh();
}) : t.refresh();
}, d(e)) : u(() => 0);
},
onCancel: () => {
l();
}
} : {};
};
function Ge(t, e) {
let n = !1;
return (...r) => {
n || (n = !0, t(...r), setTimeout(() => {
n = !1;
}, e));
};
}
function Ie() {
return X() && typeof navigator.onLine < "u" ? navigator.onLine : !0;
}
const N = [];
function We(t) {
return N.push(t), function() {
const n = N.indexOf(t);
N.splice(n, 1);
};
}
if (X()) {
const t = () => {
if (!(!rt() || !Ie()))
for (let e = 0; e < N.length; e++) {
const n = N[e];
n();
}
};
window.addEventListener("visibilitychange", t, !1), window.addEventListener("focus", t, !1);
}
const qe = (t, { refreshOnWindowFocus: e, focusTimespan: n = 5e3 }) => {
let r;
const s = () => {
r?.();
};
return T(() => {
if (d(e)) {
const i = Ge(
t.refresh.bind(t),
d(n)
);
r = We(() => {
i();
});
}
U(() => {
s();
});
}), tt(() => {
U(() => {
s();
});
}), {};
}, Ve = (t, { retryInterval: e, retryCount: n }) => {
let r;
const [s, i] = j(0), [o, u] = j(!1);
return n ? {
onBefore: () => {
o() || i(() => 0), u(() => !1), r && clearTimeout(r);
},
onSuccess: () => {
i(() => 0);
},
onError: () => {
if (i((l) => l + 1), n === -1 || s() <= n) {
const l = e ?? Math.min(1e3 * 2 ** s(), 3e4);
r = setTimeout(() => {
u(() => !0), t.refresh();
}, l);
} else
i(() => 0);
},
onCancel: () => {
i(() => 0), r && clearTimeout(r);
}
} : {};
};
var Xe = At, Qe = nt, ze = "Expected a function";
function Je(t, e, n) {
var r = !0, s = !0;
if (typeof t != "function")
throw new TypeError(ze);
return Qe(n) && (r = "leading" in n ? !!n.leading : r, s = "trailing" in n ? !!n.trailing : s), Xe(t, e, {
leading: r,
maxWait: e,
trailing: s
});
}
var Ye = Je;
const Ze = (t, { throttleWait: e, throttleLeading: n, throttleTrailing: r }) => {
const s = O(() => {
const o = {};
return d(n) !== void 0 && (o.leading = d(n)), d(r) !== void 0 && (o.trailing = d(r)), o;
}), i = O(
() => Ye(
(o) => {
o();
},
d(e),
s()
)
);
return T(() => {
if (d(e)) {
const o = t.runAsync.bind(t);
t.runAsync = (...u) => new Promise((l, c) => {
i()?.(() => {
o(...u).then(l).catch(c);
});
}), U(() => {
t.runAsync = o, i()?.cancel();
});
}
}), d(e) ? {
onCancel: () => {
i()?.cancel();
}
} : {};
};
class ke {
constructor(e, n, r, s = {}) {
this.serviceRef = e, this.options = n, this.setUpdateData = r, this.initState = s, this.state = {
...this.state,
loading: !n.manual,
...s
};
}
pluginImpls;
count = 0;
servicePreset;
state = {
loading: !1,
params: void 0,
data: void 0,
error: void 0
};
// 设置state
setState(e = {}) {
this.state = {
...this.state,
...e
}, this.setUpdateData(this.state);
}
/**
*
* @param data Result value `any`
* @param key Result key `data`| `params` | `loading`| `error`
*/
setData(e, n) {
n instanceof Array ? n.forEach((r) => {
this.state[r] = e, this.setUpdateData(e, r);
}) : (this.state[n] = e, this.setUpdateData(e, n));
}
// 遍历需要运行的插件,是一个回调函数,供插件获取fetch实例和在对应节点执行插件逻辑
runPluginHandler(e, ...n) {
const r = (this.pluginImpls?.map((s) => s[e]?.(...n)) ?? [])?.filter(
Boolean
);
return Object.assign({}, ...r);
}
setServicePreset(e) {
e ? this.servicePreset = e : this.servicePreset = null;
}
// 异步请求
// @ts-ignore
async runAsync(...e) {
this.count += 1;
const n = this.count, {
stopNow: r = !1,
returnNow: s = !1,
...i
} = this.runPluginHandler("onBefore", e);
if (r)
return new Promise(() => {
});
if (this.setState({
loading: !0,
params: e,
...i
}), s)
return Promise.resolve(i.data);
this.options.onBefore?.(e);
try {
let { servicePromise: o } = this.runPluginHandler(
"onRequest",
this.serviceRef,
e
);
const u = (c) => {
if (n !== this.count)
return new Promise(() => {
});
const a = this.options.formatResult ? this.options.formatResult(c) : c;
return this.setState({
data: a,
error: void 0,
loading: !1
}), this.options.onSuccess?.(a, e), this.runPluginHandler("onSuccess", a, e), this.options.onFinally?.(e, a, void 0), n === this.count && this.runPluginHandler("onFinally", e, a, void 0), this.setServicePreset(null), a;
};
o || (o = this.servicePreset ?? this.serviceRef(...e));
const l = await o;
return u(l);
} catch (o) {
if (n !== this.count)
return new Promise(() => {
});
throw this.setState({
error: o,
loading: !1
}), this.options.onError?.(o, e), this.runPluginHandler("onError", o, e), this.options.onFinally?.(e, void 0, o), n === this.count && this.runPluginHandler("onFinally", e, void 0, o), o;
}
}
run(...e) {
this.runAsync(...e).catch((n) => {
this.options.onError || console.error(n);
});
}
cancel() {
this.count += 1, this.setState({
loading: !1
}), this.runPluginHandler("onCancel");
}
refresh() {
this.run(...this.state.params || []);
}
refreshAsync() {
return this.runAsync(...this.state.params || []);
}
mutate(e) {
let n;
typeof e == "function" ? n = e?.(this.state.data) : n = e, this.runPluginHandler("onMutate", n), this.setState({
data: n
});
}
}
function Ke(t, e = {}, n = []) {
const {
initialData: r = void 0,
manual: s = !1,
ready: i = !0,
...o
} = {
...e ?? {}
}, u = {
manual: s,
ready: i,
...o
}, l = t, [c, a] = j({
data: r,
loading: !1,
params: void 0,
error: void 0
}), f = (S, L) => {
a(L ? (J) => ({
...J,
[L]: S
}) : S);
}, m = O(() => c().data), x = O(() => c().loading), Q = O(() => c().params), z = O(() => c().error), F = n.map((S) => S?.onInit?.(u)).filter(Boolean), g = new ke(
l,
u,
f,
Object.assign({}, ...F, c)
);
return g.options = u, g.pluginImpls = n.map((S) => S(g, u)), tt(() => {
if (!s) {
const S = g.state.params || e.defaultParams || [];
d(i) && g.run(...S);
}
}), {
data: m,
error: z,
loading: x,
params: Q,
cancel: g.cancel.bind(g),
refresh: g.refresh.bind(g),
refreshAsync: g.refreshAsync.bind(g),
run: g.run.bind(g),
runAsync: g.runAsync.bind(g),
mutate: g.mutate.bind(g)
};
}
function tn(t, e, n) {
return Ke(t, e, [
...n || [],
De,
Be,
He,
qe,
Ze,
Tt,
Bt,
Ve
]);
}
function nn(t, e, n) {
return tn(t, e, n);
}
export {
en as clearUseRequestCache,
nn as createUseRequest,
tn as default
};