edges-svelte
Version:
A blazing-fast, extremely lightweight and SSR-friendly store for Svelte
81 lines (80 loc) • 2.84 kB
JavaScript
import { createState as BaseCreateState, createDerivedState as BaseCreateDerivedState, createRawState as BaseCreateRawState } from '../store/index.js';
import { RequestContext } from '../context/index.js';
import { browser } from '$app/environment';
const globalClientCache = new Map();
export const clearCache = (pattern) => {
if (browser) {
if (pattern) {
for (const [key] of globalClientCache) {
if (key.includes(pattern)) {
globalClientCache.delete(key);
}
}
}
else {
globalClientCache.clear();
}
}
};
export const createUiProvider = (name, factory, dependencies, inject) => {
const cacheKey = name;
return () => {
let contextMap;
if (browser) {
contextMap = globalClientCache;
}
else {
const context = RequestContext.current();
if (!context.data.providers) {
context.data.providers = new Map();
}
contextMap = context.data.providers;
}
if (cacheKey && contextMap.has(cacheKey)) {
const cached = contextMap.get(cacheKey);
if (cached !== undefined) {
return cached;
}
}
const deps = {
...(typeof dependencies === 'function' ? dependencies(cacheKey) : dependencies),
...inject
};
const instance = factory(deps);
if (cacheKey) {
contextMap.set(cacheKey, instance);
}
return instance;
};
};
export const createStore = (name, factory, inject) => {
return createUiProvider(name, factory, (cacheKey) => {
let stateCounter = 0;
return {
createState: (initial) => {
const key = `${cacheKey}::state::${stateCounter++}`;
const initFn = typeof initial === 'function' ? initial : () => initial;
return BaseCreateState(key, initFn);
},
createRawState: (initial) => {
const key = `${cacheKey}::rawstate::${stateCounter++}`;
const initFn = typeof initial === 'function' ? initial : () => initial;
return BaseCreateRawState(key, initFn);
},
createDerivedState: BaseCreateDerivedState
};
}, inject);
};
export const createStoreFactory = (inject) => {
return function createInjectedStore(name, factory) {
return createStore(name, factory, inject);
};
};
export const createPresenter = (name, factory, inject) => {
return createUiProvider(name, factory, {}, inject);
};
export const createPresenterFactory = (inject) => {
return function createInjectedStore(name, factory) {
return createPresenter(name, factory, inject);
};
};