@uni-store/core
Version:
Unified Store
108 lines (102 loc) • 3.5 kB
JavaScript
/*!
* @uni-store/core v0.3.5
* (c) 2022 dolymood (dolymood@gmail.com)
* @license MIT
*/
;
Object.defineProperty(exports, '__esModule', { value: true });
var reactivity = require('@vue/reactivity');
var runtimeCore = require('@vue/runtime-core');
function addSubscription(subscriptions, callback) {
subscriptions.push(callback);
const removeSubscription = () => {
const idx = subscriptions.indexOf(callback);
if (idx > -1) {
subscriptions.splice(idx, 1);
}
};
return removeSubscription;
}
function createStore(setup) {
const scope = reactivity.effectScope(true);
const store = reactivity.reactive({
$dispose,
$subscribe
});
// watcher options for $subscribe
const subscribeOptions = {
deep: true,
flush: 'post'
};
let subscriptions = reactivity.markRaw([]);
function $subscribe(callback, options = {}) {
const _removeSubscription = addSubscription(subscriptions, callback);
const stopWatcher = scope.run(() => runtimeCore.watch(() => store, (newStore) => {
callback(newStore.$state);
}, Object.assign({}, subscribeOptions, options)));
const removeSubscription = () => {
stopWatcher();
_removeSubscription();
};
return removeSubscription;
}
function $dispose() {
scope.stop();
subscriptions = [];
}
const setupState = scope.run(() => setup());
Object.defineProperty(store, '$state', {
get() {
return setupState;
}
});
Object.assign(store, setupState);
return store;
}
/**
* Create a `useStore` function that retrieves the store instance
*
* @param setup - function that creates the store
* @returns `useStore` function with `reset` param that determines whether create a new store instance
*/
function defineStore(setup) {
let store;
return function useStore(reset = false) {
if (!store || reset) {
store && store.$dispose();
store = createStore(setup);
}
return store;
};
}
exports.computed = reactivity.computed;
exports.customRef = reactivity.customRef;
exports.effect = reactivity.effect;
exports.effectScope = reactivity.effectScope;
exports.getCurrentScope = reactivity.getCurrentScope;
exports.isProxy = reactivity.isProxy;
exports.isReactive = reactivity.isReactive;
exports.isReadonly = reactivity.isReadonly;
exports.isRef = reactivity.isRef;
exports.isShallow = reactivity.isShallow;
exports.markRaw = reactivity.markRaw;
exports.onScopeDispose = reactivity.onScopeDispose;
exports.proxyRefs = reactivity.proxyRefs;
exports.reactive = reactivity.reactive;
exports.readonly = reactivity.readonly;
exports.ref = reactivity.ref;
exports.shallowReactive = reactivity.shallowReactive;
exports.shallowReadonly = reactivity.shallowReadonly;
exports.shallowRef = reactivity.shallowRef;
exports.stop = reactivity.stop;
exports.toRaw = reactivity.toRaw;
exports.toRef = reactivity.toRef;
exports.toRefs = reactivity.toRefs;
exports.triggerRef = reactivity.triggerRef;
exports.unref = reactivity.unref;
exports.nextTick = runtimeCore.nextTick;
exports.watch = runtimeCore.watch;
exports.watchEffect = runtimeCore.watchEffect;
exports.watchPostEffect = runtimeCore.watchPostEffect;
exports.watchSyncEffect = runtimeCore.watchSyncEffect;
exports.defineStore = defineStore;