@caikengren/uni-use-request
Version:
useRequest hook library in uni-app
807 lines (785 loc) • 27.8 kB
JavaScript
(function(exports, vue, __caikengren_uni_hooks_shared, __dcloudio_uni_app) {
//#region rolldown:runtime
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
key = keys[i];
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
get: ((k) => from[k]).bind(null, key),
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
value: mod,
enumerable: true
}) : target, mod));
//#endregion
vue = __toESM(vue);
__caikengren_uni_hooks_shared = __toESM(__caikengren_uni_hooks_shared);
__dcloudio_uni_app = __toESM(__dcloudio_uni_app);
//#region src/plugins/useAutoRunPlugin.ts
const useAutoRunPlugin = (fetchInstance, { manual, ready = true, refreshDeps = [], refreshDepsAction }) => {
const hasAutoRun = (0, vue.ref)(false);
(0, vue.watchEffect)(() => {
if (!manual && fetchInstance.options.refreshDeps !== true) hasAutoRun.value = (0, vue.unref)(ready);
});
if (Array.isArray(refreshDeps)) (0, vue.watch)([hasAutoRun, ...refreshDeps], ([autoRun]) => {
if (!autoRun) return;
if (!manual && autoRun) if (refreshDepsAction) refreshDepsAction();
else fetchInstance.refresh();
}, {
deep: true,
immediate: false
});
else (0, vue.watch)(hasAutoRun, (h) => {
if (!manual && h) if (refreshDepsAction) refreshDepsAction();
else fetchInstance.refresh();
});
return {
name: "autoRunPlugin",
onBefore: () => {
if (!(0, vue.unref)(ready)) return { stopNow: true };
}
};
};
useAutoRunPlugin.onInit = ({ ready = true, manual }) => ({ loading: !manual && (0, vue.unref)(ready) });
var useAutoRunPlugin_default = useAutoRunPlugin;
//#endregion
//#region src/utils/cache.ts
const cache = /* @__PURE__ */ new Map();
function setCache(key, cacheTime, cachedData) {
const currentCache = cache.get(key);
if (currentCache === null || currentCache === void 0 ? void 0 : currentCache.timer) clearTimeout(currentCache.timer);
let timer;
if (cacheTime > -1) timer = setTimeout(() => {
cache.delete(key);
}, cacheTime);
cache.set(key, {
...cachedData,
timer
});
}
const getCache = (key) => cache.get(key);
//#endregion
//#region src/utils/cachePromise.ts
const cachePromise = /* @__PURE__ */ new Map();
const getCachePromise = (cacheKey) => cachePromise.get(cacheKey);
function setCachePromise(cacheKey, promise) {
cachePromise.set(cacheKey, promise);
promise.then((res) => {
cachePromise.delete(cacheKey);
return res;
}).catch((err) => {
cachePromise.delete(cacheKey);
throw err;
});
}
//#endregion
//#region src/utils/cacheSubscribe.ts
const listeners = {};
const otherListeners = [];
function trigger(key, data) {
if (listeners[key]) {
listeners[key].forEach((item) => item(data));
otherListeners.forEach((item) => item({
type: key,
data
}));
}
}
function subscribe(key, listener) {
if (!listeners[key]) listeners[key] = [];
listeners[key].push(listener);
return function unsubscribe() {
const index = listeners[key].indexOf(listener);
listeners[key].splice(index, 1);
};
}
//#endregion
//#region src/plugins/useCachePlugin.ts
const useCachePlugin = (fetchInstance, { cacheKey, cacheTime = 300 * 1e3, staleTime = 0, setCache: customSetCache, getCache: customGetCache }) => {
const unSubscribeRef = (0, vue.ref)();
const currentPromiseRef = (0, vue.ref)();
const _setCache = (key, cachedData) => {
if (customSetCache) customSetCache(cachedData);
else setCache(key, cacheTime, cachedData);
trigger(key, cachedData.data);
};
const _getCache = (key, params = []) => {
if (customGetCache) return customGetCache(params);
return getCache(key);
};
(0, vue.watchEffect)(() => {
if (!cacheKey) return;
const cacheData = _getCache(cacheKey);
if (cacheData && Object.hasOwnProperty.call(cacheData, "data")) {
fetchInstance.state.data = cacheData.data;
fetchInstance.state.params = cacheData.params;
if (staleTime === -1 || (/* @__PURE__ */ new Date()).getTime() - cacheData.time <= staleTime) fetchInstance.state.loading = false;
}
unSubscribeRef.value = subscribe(cacheKey, (data) => {
fetchInstance.setState({ data });
});
});
(0, vue.onScopeDispose)(() => {
var _unSubscribeRef$value;
(_unSubscribeRef$value = unSubscribeRef.value) === null || _unSubscribeRef$value === void 0 || _unSubscribeRef$value.call(unSubscribeRef);
});
if (!cacheKey) return {};
return {
name: "cachePlugin",
onBefore: (params) => {
const cacheData = _getCache(cacheKey, params);
if (!cacheData || !Object.hasOwnProperty.call(cacheData, "data")) return {};
if (staleTime === -1 || (/* @__PURE__ */ new Date()).getTime() - cacheData.time <= staleTime) return {
loading: false,
data: cacheData === null || cacheData === void 0 ? void 0 : cacheData.data,
returnNow: true
};
return { data: cacheData === null || cacheData === void 0 ? void 0 : cacheData.data };
},
onRequest: (service, args) => {
let servicePromise = getCachePromise(cacheKey);
if (servicePromise && servicePromise !== currentPromiseRef.value) return { servicePromise };
servicePromise = service(...args);
currentPromiseRef.value = servicePromise;
setCachePromise(cacheKey, servicePromise);
return { servicePromise };
},
onSuccess: (data, params) => {
if (cacheKey) {
var _unSubscribeRef$value2;
(_unSubscribeRef$value2 = unSubscribeRef.value) === null || _unSubscribeRef$value2 === void 0 || _unSubscribeRef$value2.call(unSubscribeRef);
_setCache(cacheKey, {
data,
params,
time: (/* @__PURE__ */ new Date()).getTime()
});
unSubscribeRef.value = subscribe(cacheKey, (d) => {
fetchInstance.setState({ data: d });
});
}
},
onMutate: (data) => {
if (cacheKey) {
var _unSubscribeRef$value3;
(_unSubscribeRef$value3 = unSubscribeRef.value) === null || _unSubscribeRef$value3 === void 0 || _unSubscribeRef$value3.call(unSubscribeRef);
_setCache(cacheKey, {
data,
params: fetchInstance.state.params,
time: (/* @__PURE__ */ new Date()).getTime()
});
unSubscribeRef.value = subscribe(cacheKey, (d) => {
fetchInstance.setState({ data: d });
});
}
}
};
};
var useCachePlugin_default = useCachePlugin;
//#endregion
//#region src/plugins/useDebouncePlugin.ts
const useDebouncePlugin = (fetchInstance, { debounceWait, debounceMaxWait }) => {
const debouncedRef = (0, vue.ref)();
(0, vue.watchEffect)((onInvalidate) => {
if ((0, vue.unref)(debounceWait)) {
const _originRunAsync = fetchInstance.runAsync.bind(fetchInstance);
debouncedRef.value = (0, __caikengren_uni_hooks_shared.createFilterWrapper)((0, __caikengren_uni_hooks_shared.debounceFilter)(debounceWait || 200, { maxWait: (0, vue.unref)(debounceMaxWait) }), (callback) => {
callback();
});
fetchInstance.runAsync = (...args) => new Promise((resolve, reject) => {
var _debouncedRef$value;
(_debouncedRef$value = debouncedRef.value) === null || _debouncedRef$value === void 0 || _debouncedRef$value.call(debouncedRef, () => {
_originRunAsync(...args).then(resolve).catch(reject);
});
});
onInvalidate(() => {
var _debouncedRef$value2;
(_debouncedRef$value2 = debouncedRef.value) === null || _debouncedRef$value2 === void 0 || _debouncedRef$value2.cancel();
fetchInstance.runAsync = _originRunAsync;
});
}
});
if (!(0, vue.unref)(debounceWait)) return {};
return {
name: "debouncePlugin",
onCancel: () => {
var _debouncedRef$value3;
(_debouncedRef$value3 = debouncedRef.value) === null || _debouncedRef$value3 === void 0 || _debouncedRef$value3.cancel();
}
};
};
var useDebouncePlugin_default = useDebouncePlugin;
//#endregion
//#region src/devtools/store.ts
var RegisterDevToolsStore = class {
constructor() {
this.requestInstances = /* @__PURE__ */ new Map();
this.listeners = [];
}
emit(payload) {
this.listeners.forEach((item) => item(payload));
}
subscribe(listener) {
this.listeners.push(listener);
return () => {
const index = this.listeners.indexOf(listener);
this.listeners.splice(index, 1);
};
}
insert(key, payload) {
this.requestInstances.set(key, { ...payload });
this.emit({
key,
...payload
});
}
update(key, payload) {
if (this.has(key)) this.requestInstances.set(key, {
...this.requestInstances.get(key),
...payload
});
}
has(key) {
return this.requestInstances.has(key);
}
reset(key) {
if (this.requestInstances.has(key)) {
const current = this.requestInstances.get(key);
this.requestInstances.clear();
this.insert(key, current);
} else this.requestInstances.clear();
}
getAll() {
return this.requestInstances;
}
};
const devToolsStore = new RegisterDevToolsStore();
var store_default = devToolsStore;
//#endregion
//#region src/devtools/utils.ts
var HashTable = class {
constructor() {
this.table = {};
this.hashTable = {};
}
insert(str) {
const symbolCode = Symbol(str);
this.table[str] = true;
this.hashTable[symbolCode] = str;
return symbolCode;
}
find(symbolCode) {
return this.hashTable[symbolCode];
}
};
const HashTableInstance = new HashTable();
function getFunctionName(func) {
const match = func.toString().match(/^function\s+([^\s(]+)/);
return match ? match[1] : "";
}
function getArrowFunctionName(func) {
const match = func.toString().match(/([a-z$_][\w$]*)\s*\(/i);
return match ? match[1].trim() : "";
}
//#endregion
//#region src/plugins/useDevtoolsPlugin.ts
const useDevtoolsPlugin = (fetchInstance, { ready = true, debugKey,...rest }) => {
const createDevTarget = () => {
if (debugKey && !store_default.has(debugKey)) {
const functionName = fetchInstance.serviceRef.value.toString().includes("function") ? getFunctionName(fetchInstance.serviceRef.value.toString()) : getArrowFunctionName(fetchInstance.serviceRef.value.toString());
store_default.insert(debugKey, {
instance: fetchInstance,
requestName: functionName,
time: Date.now()
});
}
};
const processObj = (0, vue.computed)(() => Object.fromEntries(Object.entries({
ready,
...rest
}).map(([key, value]) => [key, (0, vue.unref)(value)])));
(0, vue.watchEffect)(() => {
if (debugKey && store_default.has(debugKey)) store_default.emit({
...fetchInstance,
options: {
...fetchInstance.options,
...processObj.value
}
});
});
return {
name: "devtoolsPlugin",
onBefore: (params) => {
createDevTarget();
if (debugKey && store_default.has(debugKey)) store_default.emit({
...fetchInstance.state,
key: debugKey,
params,
loading: true,
time: Date.now(),
type: "pending"
});
},
onSuccess(data, params) {
createDevTarget();
if (debugKey && store_default.has(debugKey)) store_default.emit({
...fetchInstance.state,
key: debugKey,
data,
params,
loading: false,
time: Date.now(),
type: "done"
});
},
onCancel() {
createDevTarget();
if (debugKey && store_default.has(debugKey)) store_default.emit({
...fetchInstance.state,
key: debugKey,
loading: false,
time: Date.now(),
type: "cancel"
});
},
onError(e, params) {
createDevTarget();
if (debugKey && store_default.has(debugKey)) store_default.emit({
...fetchInstance.state,
key: debugKey,
params,
loading: false,
error: e,
time: Date.now(),
type: "error"
});
},
onMutate(data) {
createDevTarget();
if (debugKey && store_default.has(debugKey)) store_default.emit({
...fetchInstance.state,
key: debugKey,
data,
loading: false,
time: Date.now(),
type: "mutate"
});
}
};
};
var useDevtoolsPlugin_default = useDevtoolsPlugin;
//#endregion
//#region src/plugins/useLoadingDelayPlugin.ts
const useLoadingDelayPlugin = (inst, { loadingDelay }) => {
const delayRef = (0, vue.ref)();
const clear = () => {
if (delayRef.value) {
clearTimeout((0, vue.unref)(delayRef.value));
delayRef.value = void 0;
}
};
return {
name: "loadingDelayPlugin",
onFinally: () => {
clear();
const delay = (0, vue.unref)(loadingDelay);
/**
*
* if loadingDelay is set, the loading state will be delayed,
* until the delay time is reached.
*
* if delay is set to 0, the loading state will not be delayed. because 0 is mean nothing.
*/
if (delay) {
inst.setState({ loading: true });
delayRef.value = setTimeout(() => {
inst.setState({ loading: false });
}, delay);
}
},
onError: () => {
clear();
}
};
};
var useLoadingDelayPlugin_default = useLoadingDelayPlugin;
//#endregion
//#region src/plugins/usePollingPlugin.ts
const usePollingPlugin = (fetchInstance, { pollingInterval, pollingWhenHidden = true, pollingErrorRetryCount = -1 }) => {
let timeouter;
const delayedPolling = (0, vue.ref)(null);
const countRef = (0, vue.ref)(0);
const isVisible = (0, vue.ref)(false);
(0, __dcloudio_uni_app.onPageShow)(() => {
isVisible.value = true;
if (delayedPolling.value) {
delayedPolling.value();
delayedPolling.value = null;
}
});
(0, __dcloudio_uni_app.onPageHide)(() => {
isVisible.value = false;
});
const stopPolling = () => {
if (timeouter) clearTimeout(timeouter);
delayedPolling.value = null;
};
(0, vue.watchEffect)(() => {
if (!(0, vue.unref)(pollingInterval)) stopPolling();
});
if (!(0, vue.unref)(pollingInterval)) return {};
return {
name: "pollingPlugin",
onBefore: () => {
stopPolling();
},
onError: () => {
countRef.value += 1;
},
onSuccess: () => {
countRef.value = 0;
},
onFinally: () => {
if (pollingErrorRetryCount === -1 || pollingErrorRetryCount !== -1 && countRef.value <= pollingErrorRetryCount) timeouter = setTimeout(() => {
if (!pollingWhenHidden && !isVisible.value) delayedPolling.value = () => {
fetchInstance.refresh();
};
else fetchInstance.refresh();
}, (0, vue.unref)(pollingInterval));
else countRef.value = 0;
},
onCancel: () => {
stopPolling();
}
};
};
var usePollingPlugin_default = usePollingPlugin;
//#endregion
//#region src/plugins/useRetryPlugin.ts
const useRetryPlugin = (fetchInstance, { retryInterval, retryCount }) => {
const timerRef = (0, vue.ref)();
const countRef = (0, vue.ref)(0);
const triggerByRetry = (0, vue.ref)(false);
if (!retryCount) return {};
return {
name: "retryPlugin",
onBefore: () => {
if (!triggerByRetry.value) countRef.value = 0;
triggerByRetry.value = false;
if (timerRef.value) clearTimeout(timerRef.value);
},
onSuccess: () => {
countRef.value = 0;
},
onError: () => {
countRef.value += 1;
if (retryCount === -1 || countRef.value <= retryCount) {
const timeout = retryInterval !== null && retryInterval !== void 0 ? retryInterval : Math.min(1e3 * 2 ** countRef.value, 3e4);
timerRef.value = setTimeout(() => {
triggerByRetry.value = true;
fetchInstance.refresh();
}, timeout);
} else countRef.value = 0;
},
onCancel: () => {
countRef.value = 0;
if (timerRef.value) clearTimeout(timerRef.value);
}
};
};
var useRetryPlugin_default = useRetryPlugin;
//#endregion
//#region src/plugins/useThrottlePlugin.ts
const useThrottlePlugin = (fetchInstance, { throttleWait, throttleLeading, throttleTrailing }) => {
const options = (0, vue.computed)(() => {
const ret = { delay: 200 };
if ((0, vue.unref)(throttleWait) !== void 0) ret.delay = (0, vue.unref)(throttleWait) || 200;
if ((0, vue.unref)(throttleLeading) !== void 0) ret.leading = (0, vue.unref)(throttleLeading);
if ((0, vue.unref)(throttleTrailing) !== void 0) ret.trailing = (0, vue.unref)(throttleTrailing);
return ret;
});
const throttledRef = (0, vue.computed)(() => (0, __caikengren_uni_hooks_shared.createFilterWrapper)((0, __caikengren_uni_hooks_shared.throttleFilter)(options.value), (callback) => {
callback();
}));
(0, vue.watchEffect)((onInvalidate) => {
if ((0, vue.unref)(throttleWait)) {
const _originRunAsync = fetchInstance.runAsync.bind(fetchInstance);
fetchInstance.runAsync = (...args) => new Promise((resolve, reject) => {
var _throttledRef$value;
(_throttledRef$value = throttledRef.value) === null || _throttledRef$value === void 0 || _throttledRef$value.call(throttledRef, () => {
_originRunAsync(...args).then(resolve).catch(reject);
});
});
onInvalidate(() => {
var _throttledRef$value2;
fetchInstance.runAsync = _originRunAsync;
(_throttledRef$value2 = throttledRef.value) === null || _throttledRef$value2 === void 0 || _throttledRef$value2.cancel();
});
}
});
if (!(0, vue.unref)(throttleWait)) return {};
return {
name: "throttlePlugin",
onCancel: () => {
var _throttledRef$value3;
(_throttledRef$value3 = throttledRef.value) === null || _throttledRef$value3 === void 0 || _throttledRef$value3.cancel();
}
};
};
var useThrottlePlugin_default = useThrottlePlugin;
//#endregion
//#region src/config.ts
const USEREQUEST_GLOBAL_OPTIONS_PROVIDE_KEY = Symbol("USEREQUEST_GLOBAL_OPTIONS_PROVIDE_KEY");
//#endregion
//#region src/utils/index.ts
const isFunction = (value) => typeof value === "function";
const isBoolean = (value) => typeof value === "boolean";
//#endregion
//#region src/Fetch.ts
var Fetch = class {
constructor(serviceRef, options, setUpdateData, initState = {}) {
this.serviceRef = serviceRef;
this.options = options;
this.setUpdateData = setUpdateData;
this.initState = initState;
this.count = 0;
this.state = {
loading: false,
params: void 0,
data: void 0,
error: void 0
};
this.previousValidData = void 0;
this.state = {
...this.state,
loading: !options.manual,
...initState
};
}
/**
* set state
* @param currentState currentState
*/
setState(currentState = {}) {
this.state = {
...this.state,
...currentState
};
this.setUpdateData(this.state);
}
/**
*
* @param data Result value `unknown`
* @param key Result key `data`| `params` | `loading`| `error`
*/
setFetchState(data, key) {
if (Array.isArray(key)) key.forEach((k) => {
this.state[k] = data;
this.setUpdateData(data, k);
});
else {
this.state[key] = data;
this.setUpdateData(data, key);
}
}
/**
* Traverse the plugin that needs to be run,
* 插件的回调函数, 用于执行插件的逻辑.
*/
runPluginHandler(event, ...rest) {
var _ref, _this$pluginImpls$map, _this$pluginImpls;
const r = (_ref = (_this$pluginImpls$map = (_this$pluginImpls = this.pluginImpls) === null || _this$pluginImpls === void 0 ? void 0 : _this$pluginImpls.map((i) => {
var _i$event;
return (_i$event = i[event]) === null || _i$event === void 0 ? void 0 : _i$event.call(i, ...rest);
})) !== null && _this$pluginImpls$map !== void 0 ? _this$pluginImpls$map : []) === null || _ref === void 0 ? void 0 : _ref.filter(Boolean);
return Object.assign({}, ...r);
}
async runAsync(...params) {
this.count += 1;
const currentCount = this.count;
const { stopNow = false, returnNow = false,...state } = this.runPluginHandler("onBefore", params);
if (stopNow) return new Promise(() => {});
this.setState({
loading: true,
params,
...state
});
if (returnNow) return Promise.resolve(state.data);
try {
var _this$options$onBefor, _this$options;
(_this$options$onBefor = (_this$options = this.options).onBefore) === null || _this$options$onBefor === void 0 || _this$options$onBefor.call(_this$options, params);
} catch (error) {
var _this$options$onError, _this$options2;
this.setState({
error,
loading: false
});
(_this$options$onError = (_this$options2 = this.options).onError) === null || _this$options$onError === void 0 || _this$options$onError.call(_this$options2, error, params);
this.runPluginHandler("onError", error, params);
return new Promise(() => {});
}
try {
let { servicePromise } = this.runPluginHandler("onRequest", this.serviceRef.value, params);
const requestReturnResponse = (res) => {
var _this$options$onSucce, _this$options3, _this$options$onFinal, _this$options4;
if (currentCount !== this.count) return new Promise(() => {});
const formattedResult = this.options.formatResult ? this.options.formatResult(res) : res;
this.setState({
data: formattedResult,
error: void 0,
loading: false
});
(_this$options$onSucce = (_this$options3 = this.options).onSuccess) === null || _this$options$onSucce === void 0 || _this$options$onSucce.call(_this$options3, formattedResult, params);
this.runPluginHandler("onSuccess", formattedResult, params);
this.previousValidData = formattedResult;
(_this$options$onFinal = (_this$options4 = this.options).onFinally) === null || _this$options$onFinal === void 0 || _this$options$onFinal.call(_this$options4, params, formattedResult, void 0);
if (currentCount === this.count) this.runPluginHandler("onFinally", params, formattedResult, void 0);
return formattedResult;
};
if (!servicePromise) servicePromise = this.serviceRef.value(...params);
return requestReturnResponse(await servicePromise);
} catch (error) {
var _this$options$onError2, _this$options5, _this$options6, _this$options7, _this$options8, _this$options$onFinal2, _this$options9;
if (currentCount !== this.count) return new Promise(() => {});
this.setState({
error,
loading: false
});
(_this$options$onError2 = (_this$options5 = this.options).onError) === null || _this$options$onError2 === void 0 || _this$options$onError2.call(_this$options5, error, params);
this.runPluginHandler("onError", error, params);
if (isFunction((_this$options6 = this.options) === null || _this$options6 === void 0 ? void 0 : _this$options6.rollbackOnError) && ((_this$options7 = this.options) === null || _this$options7 === void 0 ? void 0 : _this$options7.rollbackOnError(params)) || isBoolean((_this$options8 = this.options) === null || _this$options8 === void 0 ? void 0 : _this$options8.rollbackOnError) && this.options.rollbackOnError) this.setState({ data: this.previousValidData });
(_this$options$onFinal2 = (_this$options9 = this.options).onFinally) === null || _this$options$onFinal2 === void 0 || _this$options$onFinal2.call(_this$options9, params, void 0, error);
if (currentCount === this.count) this.runPluginHandler("onFinally", params, void 0, error);
throw error;
}
}
run(...params) {
this.runAsync(...params).catch((error) => {
if (!this.options.onError) console.error(error);
});
}
cancel() {
this.count += 1;
this.setState({ loading: false });
this.runPluginHandler("onCancel");
}
refresh() {
this.run(...this.state.params || []);
}
refreshAsync() {
return this.runAsync(...this.state.params || []);
}
mutate(data) {
const targetData = isFunction(data) ? data(this.state.data) : data;
this.runPluginHandler("onMutate", targetData);
this.setState({ data: targetData });
}
};
//#endregion
//#region src/useRequestImplement.ts
function isUseRequestFetchState(state) {
return Object.keys(state).filter((i) => [
"data",
"loading",
"params",
"error"
].includes(i)).length === 4;
}
function useRequestImplement(service, options = {}, plugins = []) {
const USEREQUEST_GLOBAL_OPTIONS = (0, vue.inject)(USEREQUEST_GLOBAL_OPTIONS_PROVIDE_KEY, {});
const { initialData = void 0, manual = false, ready = true,...rest } = {
...USEREQUEST_GLOBAL_OPTIONS !== null && USEREQUEST_GLOBAL_OPTIONS !== void 0 ? USEREQUEST_GLOBAL_OPTIONS : {},
...options !== null && options !== void 0 ? options : {}
};
const fetchOptions = {
manual,
ready,
initialData,
...rest
};
const serviceRef = (0, vue.ref)(service);
const state = (0, vue.reactive)({
data: initialData,
loading: false,
params: void 0,
error: void 0
});
const setState = (currentState, field) => {
if (field) state[field] = currentState;
else if (isUseRequestFetchState(currentState)) {
state.data = currentState.data;
state.loading = currentState.loading;
state.error = currentState.error;
state.params = currentState.params;
}
};
const initState = plugins.map((p) => {
var _p$onInit;
return p === null || p === void 0 || (_p$onInit = p.onInit) === null || _p$onInit === void 0 ? void 0 : _p$onInit.call(p, fetchOptions);
}).filter(Boolean);
const fetchInstance = new Fetch(serviceRef, fetchOptions, setState, Object.assign({}, ...initState, state));
fetchInstance.options = fetchOptions;
fetchInstance.pluginImpls = plugins.map((p) => p(fetchInstance, fetchOptions));
const readyComputed = (0, vue.computed)(() => (0, vue.isRef)(ready) ? ready.value : ready);
(0, vue.watchEffect)(() => {
if (!manual) {
const params = fetchInstance.state.params || options.defaultParams || [];
if (readyComputed.value && fetchInstance.options.refreshDeps === true && !!serviceRef.value) fetchInstance.run(...params);
}
});
if (!manual && fetchInstance.options.refreshDeps !== true) {
const params = fetchInstance.state.params || options.defaultParams || [];
if ((0, vue.unref)(ready)) fetchInstance.run(...params);
}
(0, vue.onScopeDispose)(() => {
fetchInstance.cancel();
});
return {
...(0, vue.toRefs)(state),
cancel: fetchInstance.cancel.bind(fetchInstance),
refresh: fetchInstance.refresh.bind(fetchInstance),
refreshAsync: fetchInstance.refreshAsync.bind(fetchInstance),
run: fetchInstance.run.bind(fetchInstance),
runAsync: fetchInstance.runAsync.bind(fetchInstance),
mutate: fetchInstance.mutate.bind(fetchInstance)
};
}
var useRequestImplement_default = useRequestImplement;
//#endregion
//#region src/utils/resolve-args.ts
function withArgs(hook, use) {
return function useRequestArgs(service, options = {}, plugins = []) {
let next = hook;
const middleware = use || [];
for (let i = middleware.length; i--;) next = middleware[i](next);
return next(service, options, plugins);
};
}
//#endregion
//#region src/useRequest.ts
function useRequest(service, options, plugins) {
var _ref;
const BuiltInPlugins = (_ref = [
useDevtoolsPlugin_default,
useDebouncePlugin_default,
useLoadingDelayPlugin_default,
usePollingPlugin_default,
useThrottlePlugin_default,
useAutoRunPlugin_default,
useCachePlugin_default,
useRetryPlugin_default
]) === null || _ref === void 0 ? void 0 : _ref.filter(Boolean);
return withArgs(useRequestImplement_default, options === null || options === void 0 ? void 0 : options.use)(service, options, [...plugins || [], ...BuiltInPlugins]);
}
var useRequest_default = useRequest;
//#endregion
exports.useRequest = useRequest_default;
})(this.UniHooks = this.UniHooks || {}, Vue, __caikengren_uni_hooks_shared, __dcloudio_uni_app);