UNPKG

edges-svelte

Version:

A blazing-fast, extremely lightweight and SSR-friendly store for Svelte

81 lines (80 loc) 2.84 kB
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); }; };