UNPKG

solid-request

Version:
845 lines (844 loc) 21.4 kB
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 };