cross-state 0.6.6 → 0.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/_virtual/use-sync-external-store-with-selector.development.cjs +103 -0
- package/dist/cjs/_virtual/use-sync-external-store-with-selector.development.cjs.map +1 -0
- package/dist/cjs/_virtual/use-sync-external-store-with-selector.development2.cjs +5 -0
- package/dist/cjs/_virtual/use-sync-external-store-with-selector.development2.cjs.map +1 -0
- package/dist/cjs/_virtual/use-sync-external-store-with-selector.production.min.cjs +71 -0
- package/dist/cjs/_virtual/use-sync-external-store-with-selector.production.min.cjs.map +1 -0
- package/dist/cjs/_virtual/use-sync-external-store-with-selector.production.min2.cjs +5 -0
- package/dist/cjs/_virtual/use-sync-external-store-with-selector.production.min2.cjs.map +1 -0
- package/dist/cjs/_virtual/with-selector.cjs +12 -0
- package/dist/cjs/_virtual/with-selector.cjs.map +1 -0
- package/dist/cjs/_virtual/with-selector2.cjs +13 -0
- package/dist/cjs/_virtual/with-selector2.cjs.map +1 -0
- package/dist/cjs/core/cache.cjs +227 -0
- package/dist/cjs/core/cache.cjs.map +1 -0
- package/dist/cjs/core/resourceGroup.cjs +53 -0
- package/dist/cjs/core/resourceGroup.cjs.map +1 -0
- package/dist/cjs/core/store.cjs +259 -0
- package/dist/cjs/core/store.cjs.map +1 -0
- package/dist/cjs/immer/immerActions.cjs +10 -0
- package/dist/cjs/immer/immerActions.cjs.map +1 -0
- package/dist/cjs/immer.cjs +2 -7
- package/dist/cjs/immer.cjs.map +1 -1
- package/dist/cjs/index.cjs +19 -299
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/lib/calcDuration.cjs +9 -0
- package/dist/cjs/lib/calcDuration.cjs.map +1 -0
- package/dist/cjs/lib/calculationHelper.cjs +140 -0
- package/dist/cjs/lib/calculationHelper.cjs.map +1 -0
- package/dist/cjs/lib/callable.cjs +11 -0
- package/dist/cjs/lib/callable.cjs.map +1 -0
- package/dist/cjs/lib/clone.cjs +19 -0
- package/dist/cjs/lib/clone.cjs.map +1 -0
- package/dist/cjs/lib/debounce.cjs +28 -0
- package/dist/cjs/lib/debounce.cjs.map +1 -0
- package/dist/cjs/lib/equals.cjs +5 -0
- package/dist/cjs/lib/equals.cjs.map +1 -0
- package/dist/cjs/lib/forwardError.cjs +9 -0
- package/dist/cjs/lib/forwardError.cjs.map +1 -0
- package/dist/cjs/lib/hash.cjs +19 -0
- package/dist/cjs/lib/hash.cjs.map +1 -0
- package/dist/cjs/lib/instanceCache.cjs +68 -0
- package/dist/cjs/lib/instanceCache.cjs.map +1 -0
- package/dist/cjs/lib/makeSelector.cjs +14 -0
- package/dist/cjs/lib/makeSelector.cjs.map +1 -0
- package/dist/cjs/lib/propAccess.cjs +66 -0
- package/dist/cjs/lib/propAccess.cjs.map +1 -0
- package/dist/cjs/lib/queue.cjs +61 -0
- package/dist/cjs/lib/queue.cjs.map +1 -0
- package/dist/cjs/lib/standardMethods.cjs +78 -0
- package/dist/cjs/lib/standardMethods.cjs.map +1 -0
- package/dist/cjs/lib/throttle.cjs +25 -0
- package/dist/cjs/lib/throttle.cjs.map +1 -0
- package/dist/cjs/lib/trackingProxy.cjs +39 -0
- package/dist/cjs/lib/trackingProxy.cjs.map +1 -0
- package/dist/cjs/react/read.cjs +15 -0
- package/dist/cjs/react/read.cjs.map +1 -0
- package/dist/cjs/react/storeScope.cjs +31 -0
- package/dist/cjs/react/storeScope.cjs.map +1 -0
- package/dist/cjs/react/useCache.cjs +31 -0
- package/dist/cjs/react/useCache.cjs.map +1 -0
- package/dist/cjs/react/useProp.cjs +9 -0
- package/dist/cjs/react/useProp.cjs.map +1 -0
- package/dist/cjs/react/useStore.cjs +51 -0
- package/dist/cjs/react/useStore.cjs.map +1 -0
- package/dist/cjs/react.cjs +11 -289
- package/dist/cjs/react.cjs.map +1 -1
- package/dist/es/_virtual/use-sync-external-store-with-selector.development.js +103 -0
- package/dist/es/_virtual/use-sync-external-store-with-selector.development.js.map +1 -0
- package/dist/es/_virtual/use-sync-external-store-with-selector.development2.js +5 -0
- package/dist/es/_virtual/use-sync-external-store-with-selector.development2.js.map +1 -0
- package/dist/es/_virtual/use-sync-external-store-with-selector.production.min.js +71 -0
- package/dist/es/_virtual/use-sync-external-store-with-selector.production.min.js.map +1 -0
- package/dist/es/_virtual/use-sync-external-store-with-selector.production.min2.js +5 -0
- package/dist/es/_virtual/use-sync-external-store-with-selector.production.min2.js.map +1 -0
- package/dist/es/_virtual/with-selector.js +11 -0
- package/dist/es/_virtual/with-selector.js.map +1 -0
- package/dist/es/_virtual/with-selector2.js +14 -0
- package/dist/es/_virtual/with-selector2.js.map +1 -0
- package/dist/es/core/cache.js +227 -0
- package/dist/es/core/cache.js.map +1 -0
- package/dist/es/core/resourceGroup.js +53 -0
- package/dist/es/core/resourceGroup.js.map +1 -0
- package/dist/es/core/store.js +259 -0
- package/dist/es/core/store.js.map +1 -0
- package/dist/es/{immer.mjs → immer/immerActions.js} +1 -1
- package/dist/es/immer/immerActions.js.map +1 -0
- package/dist/es/immer.js +5 -0
- package/dist/es/immer.js.map +1 -0
- package/dist/es/index.js +22 -0
- package/dist/es/index.js.map +1 -0
- package/dist/es/lib/calcDuration.js +9 -0
- package/dist/es/lib/calcDuration.js.map +1 -0
- package/dist/es/lib/calculationHelper.js +140 -0
- package/dist/es/lib/calculationHelper.js.map +1 -0
- package/dist/es/lib/callable.js +11 -0
- package/dist/es/lib/callable.js.map +1 -0
- package/dist/es/lib/clone.js +19 -0
- package/dist/es/lib/clone.js.map +1 -0
- package/dist/es/lib/debounce.js +28 -0
- package/dist/es/lib/debounce.js.map +1 -0
- package/dist/es/lib/equals.js +5 -0
- package/dist/es/lib/equals.js.map +1 -0
- package/dist/es/lib/forwardError.js +9 -0
- package/dist/es/lib/forwardError.js.map +1 -0
- package/dist/es/lib/hash.js +19 -0
- package/dist/es/lib/hash.js.map +1 -0
- package/dist/es/lib/instanceCache.js +68 -0
- package/dist/es/lib/instanceCache.js.map +1 -0
- package/dist/es/lib/makeSelector.js +14 -0
- package/dist/es/lib/makeSelector.js.map +1 -0
- package/dist/es/lib/propAccess.js +66 -0
- package/dist/es/lib/propAccess.js.map +1 -0
- package/dist/es/lib/queue.js +61 -0
- package/dist/es/lib/queue.js.map +1 -0
- package/dist/es/lib/standardMethods.js +78 -0
- package/dist/es/lib/standardMethods.js.map +1 -0
- package/dist/es/lib/throttle.js +25 -0
- package/dist/es/lib/throttle.js.map +1 -0
- package/dist/es/lib/trackingProxy.js +39 -0
- package/dist/es/lib/trackingProxy.js.map +1 -0
- package/dist/es/react/read.js +15 -0
- package/dist/es/react/read.js.map +1 -0
- package/dist/es/react/storeScope.js +31 -0
- package/dist/es/react/storeScope.js.map +1 -0
- package/dist/es/react/useCache.js +31 -0
- package/dist/es/react/useCache.js.map +1 -0
- package/dist/es/react/useProp.js +9 -0
- package/dist/es/react/useProp.js.map +1 -0
- package/dist/es/react/useStore.js +51 -0
- package/dist/es/react/useStore.js.map +1 -0
- package/dist/es/react.js +14 -0
- package/dist/es/react.js.map +1 -0
- package/dist/types/core/cache.d.ts +13 -11
- package/dist/types/core/store.d.ts +5 -3
- package/dist/types/lib/callable.d.ts +4 -0
- package/dist/types/lib/instanceCache.d.ts +2 -2
- package/package.json +8 -8
- package/dist/cjs/hash.cjs +0 -718
- package/dist/cjs/hash.cjs.map +0 -1
- package/dist/es/hash.mjs +0 -719
- package/dist/es/hash.mjs.map +0 -1
- package/dist/es/immer.mjs.map +0 -1
- package/dist/es/index.mjs +0 -303
- package/dist/es/index.mjs.map +0 -1
- package/dist/es/react.mjs +0 -292
- package/dist/es/react.mjs.map +0 -1
- package/dist/types/lib/bind.d.ts +0 -1
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/core/resourceGroup.ts","../../src/lib/instanceCache.ts","../../src/core/cache.ts"],"sourcesContent":["import { bind } from '@lib/bind';\n\nexport interface Resource {\n invalidate(): void;\n clear(): void;\n}\n\nexport class ResourceGroup {\n private refMap = new WeakMap<Resource, WeakRef<Resource>>();\n\n private refSet = new Set<WeakRef<Resource>>();\n\n constructor(public readonly name?: string) {\n bind(this);\n }\n\n add(resource: Resource) {\n const ref = new WeakRef(resource);\n this.refMap.set(resource, ref);\n this.refSet.add(ref);\n }\n\n delete(resource: Resource) {\n const ref = this.refMap.get(resource);\n if (ref) {\n this.refMap.delete(resource);\n this.refSet.delete(ref);\n }\n }\n\n invalidateAll() {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.invalidate();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n\n clearAll() {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.clear();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n}\n\nexport const allResources = new ResourceGroup();\n\nexport function createResourceGroup(name?: string) {\n return new ResourceGroup(name);\n}\n","import { hash } from './hash';\n\nexport class InstanceCache<Args extends any[], T extends object> {\n private cache = new Map<string, { t: number; ref?: T; weakRef: WeakRef<T> }>();\n\n private interval = this.cacheTime\n ? setInterval(() => this.cleanup(), Math.max(this.cacheTime / 10, 1))\n : undefined;\n\n constructor(private factory: (...args: Args) => T, private cacheTime?: number) {}\n\n cleanup() {\n const cutoff = this.now() - (this.cacheTime ?? 0);\n\n for (const [key, entry] of this.cache.entries()) {\n if (entry.ref && entry.t <= cutoff) {\n delete entry.ref;\n }\n\n if (!entry.ref && !entry.weakRef?.deref()) {\n this.cache.delete(key);\n }\n }\n }\n\n get(...args: Args) {\n const key = hash(args);\n let entry = this.cache.get(key);\n let value = entry?.ref ?? entry?.weakRef?.deref();\n\n if (!entry || !value) {\n value = this.factory(...args);\n entry = {\n t: this.now(),\n ref: value,\n weakRef: new WeakRef(value),\n };\n\n this.cache.set(key, entry);\n } else {\n entry.t = this.now();\n entry.ref ??= value;\n }\n\n return value;\n }\n\n values() {\n return [...this.cache.values()]\n .map((entry) => entry.ref ?? entry.weakRef?.deref())\n .filter((value): value is T => !!value);\n }\n\n stop() {\n if (this.interval) {\n clearInterval(this.interval);\n }\n }\n\n stats() {\n return {\n count: this.cache.size,\n withRef: [...this.cache.values()].filter((x) => !!x.ref).length,\n withWeakRef: [...this.cache.values()].filter((x) => !!x.weakRef?.deref()).length,\n };\n }\n\n private now() {\n return performance.now();\n }\n}\n","import type { Duration, Selector, Use } from './commonTypes';\nimport { allResources, type ResourceGroup } from './resourceGroup';\nimport { createStore, Store } from './store';\nimport type { CacheState, ErrorState, ValueState } from '@lib/cacheState';\nimport { calcDuration } from '@lib/calcDuration';\nimport { InstanceCache } from '@lib/instanceCache';\nimport { makeSelector } from '@lib/makeSelector';\nimport type { Path, Value } from '@lib/path';\n\nexport interface CacheGetOptions {\n update?: 'whenMissing' | 'whenStale' | 'force';\n backgroundUpdate?: boolean;\n}\n\nexport interface CacheFunction<T, Args extends any[] = []> {\n (this: { use: Use }, ...args: Args): Promise<T>;\n}\n\nexport interface CacheOptions<T> {\n invalidateAfter?: Duration | ((state: ValueState<T> | ErrorState) => Duration | undefined);\n clearAfter?: Duration | ((state: ValueState<T> | ErrorState) => Duration | undefined);\n resourceGroup?: ResourceGroup | ResourceGroup[];\n retain?: number;\n clearUnusedAfter?: Duration;\n}\n\nexport class Cache<T> extends Store<Promise<T>> {\n readonly state = createStore<CacheState<T>>({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n });\n\n protected stalePromise?: Promise<T>;\n\n protected timers = new Set<ReturnType<typeof setTimeout>>();\n\n constructor(\n getter: CacheFunction<T>,\n public readonly options: CacheOptions<T> = {},\n public readonly derivedFromCache?: {\n cache: Cache<any>;\n selectors: (Selector<any, any> | Path<any>)[];\n },\n ) {\n super(getter, options);\n this.watchPromise();\n }\n\n get({ update = 'whenStale', backgroundUpdate = false }: CacheGetOptions = {}) {\n const promise = this._value?.v;\n const stalePromise = this.stalePromise;\n\n if (\n (update === 'whenMissing' && !promise && !stalePromise) ||\n (update === 'whenStale' && !promise) ||\n update === 'force'\n ) {\n this.calculationHelper.execute();\n\n if ((!promise && !stalePromise) || !backgroundUpdate) {\n return super.get();\n }\n }\n\n if (!promise || (stalePromise && backgroundUpdate)) {\n return stalePromise!;\n }\n\n return promise;\n }\n\n invalidate({ invalidateDependencies = true }: { invalidateDependencies?: boolean } = {}) {\n if (invalidateDependencies) {\n this.calculationHelper.invalidateDependencies();\n }\n\n const { status, isStale, isUpdating } = this.state.get();\n if (status !== 'pending' && !isStale && !isUpdating) {\n this.stalePromise = this._value?.v;\n }\n\n this.state.set((state) => ({\n ...state,\n isStale: true,\n isUpdating: false,\n }));\n\n super.reset();\n }\n\n clear({ invalidateDependencies = true }: { invalidateDependencies?: boolean } = {}): void {\n if (invalidateDependencies) {\n this.calculationHelper.invalidateDependencies();\n }\n\n this.state.set({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n });\n delete this.stalePromise;\n super.reset();\n }\n\n mapValue<S>(selector: Selector<T, S>): Cache<S>;\n\n mapValue<P extends Path<T>>(selector: P): Cache<Value<T, P>>;\n\n mapValue<S>(_selector: Selector<T, S> | Path<any>): Cache<S> {\n const selector = makeSelector(_selector);\n const derivedFromCache = {\n cache: this.derivedFromCache ? this.derivedFromCache.cache : this,\n selectors: this.derivedFromCache\n ? [...this.derivedFromCache.selectors, _selector]\n : [_selector],\n };\n const that = this;\n\n return new Cache(\n async function () {\n const value = await this.use(that);\n return selector(value);\n },\n {},\n derivedFromCache,\n );\n }\n\n protected watchPromise() {\n this.sub(\n async (promise) => {\n this.state.set((state) => ({\n ...state,\n isUpdating: true,\n }));\n\n this.setTimers();\n\n try {\n const value = await promise;\n\n if (promise !== this._value?.v) {\n return;\n }\n\n this.state.set({\n status: 'value',\n value,\n isStale: false,\n isUpdating: false,\n });\n delete this.stalePromise;\n this.setTimers();\n } catch (error) {\n if (promise !== this._value?.v) {\n return;\n }\n\n this.state.set({\n status: 'error',\n error,\n isStale: false,\n isUpdating: false,\n });\n delete this.stalePromise;\n this.setTimers();\n }\n },\n { passive: true },\n );\n }\n\n protected setTimers() {\n for (const timer of this.timers) {\n clearTimeout(timer);\n }\n this.timers.clear();\n\n const state = this.state.get();\n let { invalidateAfter, clearAfter } = this.options;\n const ref = new WeakRef(this);\n\n if (state.status === 'pending') {\n return;\n }\n\n if (invalidateAfter instanceof Function) {\n invalidateAfter = invalidateAfter(state);\n }\n\n if (invalidateAfter) {\n this.timers.add(setTimeout(() => ref?.deref()?.invalidate(), calcDuration(invalidateAfter)));\n }\n\n if (clearAfter instanceof Function) {\n clearAfter = clearAfter(state);\n }\n\n if (clearAfter) {\n this.timers.add(setTimeout(() => ref?.deref()?.clear(), calcDuration(clearAfter)));\n }\n }\n}\n\nconst defaultOptions: CacheOptions<unknown> = {};\n\nfunction create<T>(cacheFunction: CacheFunction<T>, options?: CacheOptions<T>): Cache<T> {\n return withArgs(cacheFunction, options)();\n}\n\nfunction withArgs<T, Args extends any[]>(\n cacheFunction: CacheFunction<T, Args>,\n options?: CacheOptions<T>,\n): {\n (...args: Args): Cache<T>;\n invalidate: () => void;\n clear: () => void;\n} {\n const { clearUnusedAfter = defaultOptions.clearUnusedAfter ?? 0, resourceGroup } = options ?? {};\n\n const cache = new InstanceCache(\n (...args: Args) =>\n new Cache(function () {\n return cacheFunction.apply(this, args);\n }, options),\n calcDuration(clearUnusedAfter),\n );\n\n const get = (...args: Args) => {\n return cache.get(...args);\n };\n\n const invalidate = () => {\n for (const instance of cache.values()) {\n instance.invalidate();\n }\n };\n\n const clear = () => {\n for (const instance of cache.values()) {\n instance.clear();\n }\n };\n\n const resource = { invalidate, clear };\n const groups = Array.isArray(resourceGroup)\n ? resourceGroup\n : resourceGroup\n ? [resourceGroup]\n : [];\n for (const group of groups.concat(allResources)) {\n group.add(resource);\n }\n\n return Object.assign(get, resource);\n}\n\nexport const createCache = Object.assign(create, {\n withArgs,\n defaultOptions,\n});\n"],"names":["bind","hash","Store","createStore","makeSelector","calcDuration"],"mappings":";;;AAOO,MAAM,cAAc;AAAA,EAKzB,YAA4B,MAAe;AAAf,SAAA,OAAA;AAJpB,SAAA,6BAAa;AAEb,SAAA,6BAAa;AAGnBA,SAAA,KAAK,IAAI;AAAA,EACX;AAAA,EAEA,IAAI,UAAoB;AAChB,UAAA,MAAM,IAAI,QAAQ,QAAQ;AAC3B,SAAA,OAAO,IAAI,UAAU,GAAG;AACxB,SAAA,OAAO,IAAI,GAAG;AAAA,EACrB;AAAA,EAEA,OAAO,UAAoB;AACzB,UAAM,MAAM,KAAK,OAAO,IAAI,QAAQ;AACpC,QAAI,KAAK;AACF,WAAA,OAAO,OAAO,QAAQ;AACtB,WAAA,OAAO,OAAO,GAAG;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,gBAAgB;AACH,eAAA,OAAO,KAAK,QAAQ;AACvB,YAAA,WAAW,IAAI;AACrB,UAAI,UAAU;AACZ,iBAAS,WAAW;AAAA,MAAA,OACf;AACA,aAAA,OAAO,OAAO,GAAG;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW;AACE,eAAA,OAAO,KAAK,QAAQ;AACvB,YAAA,WAAW,IAAI;AACrB,UAAI,UAAU;AACZ,iBAAS,MAAM;AAAA,MAAA,OACV;AACA,aAAA,OAAO,OAAO,GAAG;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;AAEa,MAAA,eAAe,IAAI,cAAc;AAEvC,SAAS,oBAAoB,MAAe;AAC1C,SAAA,IAAI,cAAc,IAAI;AAC/B;ACvDO,MAAM,cAAoD;AAAA,EAO/D,YAAoB,SAAuC,WAAoB;AAA3D,SAAA,UAAA;AAAuC,SAAA,YAAA;AANnD,SAAA,4BAAY;AAEpB,SAAQ,WAAW,KAAK,YACpB,YAAY,MAAM,KAAK,QAAW,GAAA,KAAK,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,IAClE;AAAA,EAE4E;AAAA,EAEhF,UAAU;;AACR,UAAM,SAAS,KAAK,IAAI,KAAK,KAAK,aAAa;AAE/C,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,MAAM,WAAW;AAC/C,UAAI,MAAM,OAAO,MAAM,KAAK,QAAQ;AAClC,eAAO,MAAM;AAAA,MACf;AAEA,UAAI,CAAC,MAAM,OAAO,GAAC,WAAM,YAAN,mBAAe,UAAS;AACpC,aAAA,MAAM,OAAO,GAAG;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,MAAY;;AACX,UAAA,MAAMC,UAAK,IAAI;AACrB,QAAI,QAAQ,KAAK,MAAM,IAAI,GAAG;AAC9B,QAAI,SAAQ,+BAAO,UAAO,oCAAO,YAAP,mBAAgB;AAEtC,QAAA,CAAC,SAAS,CAAC,OAAO;AACZ,cAAA,KAAK,QAAQ,GAAG,IAAI;AACpB,cAAA;AAAA,QACN,GAAG,KAAK,IAAI;AAAA,QACZ,KAAK;AAAA,QACL,SAAS,IAAI,QAAQ,KAAK;AAAA,MAAA;AAGvB,WAAA,MAAM,IAAI,KAAK,KAAK;AAAA,IAAA,OACpB;AACC,YAAA,IAAI,KAAK;AACf,YAAM,QAAN,MAAM,MAAQ;AAAA,IAChB;AAEO,WAAA;AAAA,EACT;AAAA,EAEA,SAAS;AACA,WAAA,CAAC,GAAG,KAAK,MAAM,OAAQ,CAAA,EAC3B,IAAI,CAAC;;AAAU,mBAAM,SAAO,WAAM,YAAN,mBAAe;AAAA,KAAO,EAClD,OAAO,CAAC,UAAsB,CAAC,CAAC,KAAK;AAAA,EAC1C;AAAA,EAEA,OAAO;AACL,QAAI,KAAK,UAAU;AACjB,oBAAc,KAAK,QAAQ;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,QAAQ;AACC,WAAA;AAAA,MACL,OAAO,KAAK,MAAM;AAAA,MAClB,SAAS,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE;AAAA,MACzD,aAAa,CAAC,GAAG,KAAK,MAAM,OAAQ,CAAA,EAAE,OAAO,CAAC;;AAAM,gBAAC,GAAC,OAAE,YAAF,mBAAW;AAAA,OAAO,EAAE;AAAA,IAAA;AAAA,EAE9E;AAAA,EAEQ,MAAM;AACZ,WAAO,YAAY;EACrB;AACF;AC5CO,MAAM,cAAiBC,KAAAA,MAAkB;AAAA,EAW9C,YACE,QACgB,UAA2B,CAAA,GAC3B,kBAIhB;AACA,UAAM,QAAQ,OAAO;AANL,SAAA,UAAA;AACA,SAAA,mBAAA;AAblB,SAAS,QAAQC,iBAA2B;AAAA,MAC1C,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,IAAA,CACb;AAIS,SAAA,6BAAa;AAWrB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,IAAI,EAAE,SAAS,aAAa,mBAAmB,MAAM,IAAqB,IAAI;;AACtE,UAAA,WAAU,UAAK,WAAL,mBAAa;AAC7B,UAAM,eAAe,KAAK;AAGvB,QAAA,WAAW,iBAAiB,CAAC,WAAW,CAAC,gBACzC,WAAW,eAAe,CAAC,WAC5B,WAAW,SACX;AACA,WAAK,kBAAkB;AAEvB,UAAK,CAAC,WAAW,CAAC,gBAAiB,CAAC,kBAAkB;AACpD,eAAO,MAAM;MACf;AAAA,IACF;AAEI,QAAA,CAAC,WAAY,gBAAgB,kBAAmB;AAC3C,aAAA;AAAA,IACT;AAEO,WAAA;AAAA,EACT;AAAA,EAEA,WAAW,EAAE,yBAAyB,KAAK,IAA0C,CAAA,GAAI;;AACvF,QAAI,wBAAwB;AAC1B,WAAK,kBAAkB;IACzB;AAEA,UAAM,EAAE,QAAQ,SAAS,WAAe,IAAA,KAAK,MAAM;AACnD,QAAI,WAAW,aAAa,CAAC,WAAW,CAAC,YAAY;AAC9C,WAAA,gBAAe,UAAK,WAAL,mBAAa;AAAA,IACnC;AAEK,SAAA,MAAM,IAAI,CAAC,WAAW;AAAA,MACzB,GAAG;AAAA,MACH,SAAS;AAAA,MACT,YAAY;AAAA,IACZ,EAAA;AAEF,UAAM,MAAM;AAAA,EACd;AAAA,EAEA,MAAM,EAAE,yBAAyB,KAAK,IAA0C,CAAA,GAAU;AACxF,QAAI,wBAAwB;AAC1B,WAAK,kBAAkB;IACzB;AAEA,SAAK,MAAM,IAAI;AAAA,MACb,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,IAAA,CACb;AACD,WAAO,KAAK;AACZ,UAAM,MAAM;AAAA,EACd;AAAA,EAMA,SAAY,WAAiD;AACrD,UAAA,WAAWC,kBAAa,SAAS;AACvC,UAAM,mBAAmB;AAAA,MACvB,OAAO,KAAK,mBAAmB,KAAK,iBAAiB,QAAQ;AAAA,MAC7D,WAAW,KAAK,mBACZ,CAAC,GAAG,KAAK,iBAAiB,WAAW,SAAS,IAC9C,CAAC,SAAS;AAAA,IAAA;AAEhB,UAAM,OAAO;AAEb,WAAO,IAAI;AAAA,MACT,iBAAkB;AAChB,cAAM,QAAQ,MAAM,KAAK,IAAI,IAAI;AACjC,eAAO,SAAS,KAAK;AAAA,MACvB;AAAA,MACA,CAAC;AAAA,MACD;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEU,eAAe;AAClB,SAAA;AAAA,MACH,OAAO,YAAY;;AACZ,aAAA,MAAM,IAAI,CAAC,WAAW;AAAA,UACzB,GAAG;AAAA,UACH,YAAY;AAAA,QACZ,EAAA;AAEF,aAAK,UAAU;AAEX,YAAA;AACF,gBAAM,QAAQ,MAAM;AAEhB,cAAA,cAAY,UAAK,WAAL,mBAAa,IAAG;AAC9B;AAAA,UACF;AAEA,eAAK,MAAM,IAAI;AAAA,YACb,QAAQ;AAAA,YACR;AAAA,YACA,SAAS;AAAA,YACT,YAAY;AAAA,UAAA,CACb;AACD,iBAAO,KAAK;AACZ,eAAK,UAAU;AAAA,iBACR;AACH,cAAA,cAAY,UAAK,WAAL,mBAAa,IAAG;AAC9B;AAAA,UACF;AAEA,eAAK,MAAM,IAAI;AAAA,YACb,QAAQ;AAAA,YACR;AAAA,YACA,SAAS;AAAA,YACT,YAAY;AAAA,UAAA,CACb;AACD,iBAAO,KAAK;AACZ,eAAK,UAAU;AAAA,QACjB;AAAA,MACF;AAAA,MACA,EAAE,SAAS,KAAK;AAAA,IAAA;AAAA,EAEpB;AAAA,EAEU,YAAY;AACT,eAAA,SAAS,KAAK,QAAQ;AAC/B,mBAAa,KAAK;AAAA,IACpB;AACA,SAAK,OAAO;AAEN,UAAA,QAAQ,KAAK,MAAM,IAAI;AAC7B,QAAI,EAAE,iBAAiB,eAAe,KAAK;AACrC,UAAA,MAAM,IAAI,QAAQ,IAAI;AAExB,QAAA,MAAM,WAAW,WAAW;AAC9B;AAAA,IACF;AAEA,QAAI,2BAA2B,UAAU;AACvC,wBAAkB,gBAAgB,KAAK;AAAA,IACzC;AAEA,QAAI,iBAAiB;AACnB,WAAK,OAAO,IAAI,WAAW,MAAA;;AAAM,gDAAK,YAAL,mBAAc;AAAA,SAAcC,KAAAA,aAAa,eAAe,CAAC,CAAC;AAAA,IAC7F;AAEA,QAAI,sBAAsB,UAAU;AAClC,mBAAa,WAAW,KAAK;AAAA,IAC/B;AAEA,QAAI,YAAY;AACd,WAAK,OAAO,IAAI,WAAW,MAAA;;AAAM,gDAAK,YAAL,mBAAc;AAAA,SAASA,KAAAA,aAAa,UAAU,CAAC,CAAC;AAAA,IACnF;AAAA,EACF;AACF;AAEA,MAAM,iBAAwC,CAAA;AAE9C,SAAS,OAAU,eAAiC,SAAqC;AAChF,SAAA,SAAS,eAAe,OAAO;AACxC;AAEA,SAAS,SACP,eACA,SAKA;AACM,QAAA,EAAE,mBAAmB,eAAe,oBAAoB,GAAG,cAAc,IAAI,WAAW;AAE9F,QAAM,QAAQ,IAAI;AAAA,IAChB,IAAI,SACF,IAAI,MAAM,WAAY;AACb,aAAA,cAAc,MAAM,MAAM,IAAI;AAAA,OACpC,OAAO;AAAA,IACZA,KAAAA,aAAa,gBAAgB;AAAA,EAAA;AAGzB,QAAA,MAAM,IAAI,SAAe;AACtB,WAAA,MAAM,IAAI,GAAG,IAAI;AAAA,EAAA;AAG1B,QAAM,aAAa,MAAM;AACZ,eAAA,YAAY,MAAM,UAAU;AACrC,eAAS,WAAW;AAAA,IACtB;AAAA,EAAA;AAGF,QAAM,QAAQ,MAAM;AACP,eAAA,YAAY,MAAM,UAAU;AACrC,eAAS,MAAM;AAAA,IACjB;AAAA,EAAA;AAGI,QAAA,WAAW,EAAE,YAAY;AACzB,QAAA,SAAS,MAAM,QAAQ,aAAa,IACtC,gBACA,gBACA,CAAC,aAAa,IACd;AACJ,aAAW,SAAS,OAAO,OAAO,YAAY,GAAG;AAC/C,UAAM,IAAI,QAAQ;AAAA,EACpB;AAEO,SAAA,OAAO,OAAO,KAAK,QAAQ;AACpC;AAEa,MAAA,cAAc,OAAO,OAAO,QAAQ;AAAA,EAC/C;AAAA,EACA;AACF,CAAC;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const calcDuration = (t) => {
|
|
4
|
+
if (typeof t === "number")
|
|
5
|
+
return t;
|
|
6
|
+
return (t.milliseconds ?? 0) + (t.seconds ?? 0) * 1e3 + (t.minutes ?? 0) * 60 * 1e3 + (t.hours ?? 0) * 60 * 60 * 1e3 + (t.days ?? 0) * 24 * 60 * 60 * 1e3;
|
|
7
|
+
};
|
|
8
|
+
exports.calcDuration = calcDuration;
|
|
9
|
+
//# sourceMappingURL=calcDuration.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calcDuration.cjs","sources":["../../../src/lib/calcDuration.ts"],"sourcesContent":["import type { Duration } from '../core/commonTypes';\n\nexport const calcDuration = (t: Duration) => {\n if (typeof t === 'number') return t;\n return (\n (t.milliseconds ?? 0) +\n (t.seconds ?? 0) * 1000 +\n (t.minutes ?? 0) * 60 * 1000 +\n (t.hours ?? 0) * 60 * 60 * 1000 +\n (t.days ?? 0) * 24 * 60 * 60 * 1000\n );\n};\n"],"names":[],"mappings":";;AAEa,MAAA,eAAe,CAAC,MAAgB;AAC3C,MAAI,OAAO,MAAM;AAAiB,WAAA;AAE/B,UAAA,EAAE,gBAAgB,MAClB,EAAE,WAAW,KAAK,OAClB,EAAE,WAAW,KAAK,KAAK,OACvB,EAAE,SAAS,KAAK,KAAK,KAAK,OAC1B,EAAE,QAAQ,KAAK,KAAK,KAAK,KAAK;AAEnC;;"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const queue = require("./queue.cjs");
|
|
4
|
+
const trackingProxy = require("./trackingProxy.cjs");
|
|
5
|
+
class CalculationHelper {
|
|
6
|
+
constructor(options) {
|
|
7
|
+
this.options = options;
|
|
8
|
+
options.addEffect(() => {
|
|
9
|
+
if (this.current) {
|
|
10
|
+
this.current.check();
|
|
11
|
+
} else {
|
|
12
|
+
this.execute();
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
execute() {
|
|
17
|
+
this.stop();
|
|
18
|
+
const { calculate, addEffect, getValue, setValue, setError, onInvalidate } = this.options;
|
|
19
|
+
const checks = new Array();
|
|
20
|
+
const deps = /* @__PURE__ */ new Map();
|
|
21
|
+
const q = queue.queue();
|
|
22
|
+
let isActive = false;
|
|
23
|
+
let isCancled = false;
|
|
24
|
+
const cancelEffect = addEffect(() => {
|
|
25
|
+
isActive = true;
|
|
26
|
+
for (const dep of deps.values()) {
|
|
27
|
+
dep.on();
|
|
28
|
+
}
|
|
29
|
+
return () => {
|
|
30
|
+
isActive = false;
|
|
31
|
+
for (const dep of deps.values()) {
|
|
32
|
+
dep.off();
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
const cancel = () => {
|
|
37
|
+
isCancled = true;
|
|
38
|
+
cancelSubscription == null ? void 0 : cancelSubscription();
|
|
39
|
+
cancelEffect();
|
|
40
|
+
delete this.current;
|
|
41
|
+
};
|
|
42
|
+
const checkAll = () => {
|
|
43
|
+
if (!checks.every((check) => check())) {
|
|
44
|
+
cancel();
|
|
45
|
+
onInvalidate == null ? void 0 : onInvalidate();
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const invalidateDependencies = () => {
|
|
49
|
+
for (const dep of deps.values()) {
|
|
50
|
+
dep.invalidate();
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const use = (store, { disableProxy } = {}) => {
|
|
54
|
+
if (isCancled) {
|
|
55
|
+
return store.get();
|
|
56
|
+
}
|
|
57
|
+
let value = store.get();
|
|
58
|
+
let equals = (newValue) => {
|
|
59
|
+
return newValue === value;
|
|
60
|
+
};
|
|
61
|
+
if (!disableProxy) {
|
|
62
|
+
[value, equals] = trackingProxy.trackingProxy(value);
|
|
63
|
+
}
|
|
64
|
+
let sub;
|
|
65
|
+
const dep = {
|
|
66
|
+
on() {
|
|
67
|
+
this.off();
|
|
68
|
+
sub = store.sub(checkAll, { runNow: false });
|
|
69
|
+
},
|
|
70
|
+
off() {
|
|
71
|
+
sub == null ? void 0 : sub();
|
|
72
|
+
sub = void 0;
|
|
73
|
+
},
|
|
74
|
+
invalidate() {
|
|
75
|
+
if ("invalidate" in store && store.invalidate instanceof Function) {
|
|
76
|
+
store.invalidate();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
if (isActive) {
|
|
81
|
+
dep.on();
|
|
82
|
+
}
|
|
83
|
+
checks.push(() => equals(store.get()));
|
|
84
|
+
deps.set(store, dep);
|
|
85
|
+
return value;
|
|
86
|
+
};
|
|
87
|
+
const updateValue = (update) => q(async () => {
|
|
88
|
+
if (isCancled) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (update instanceof Function) {
|
|
92
|
+
try {
|
|
93
|
+
update = update(getValue == null ? void 0 : getValue());
|
|
94
|
+
} catch (error) {
|
|
95
|
+
setError == null ? void 0 : setError(error);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (update instanceof Promise) {
|
|
100
|
+
try {
|
|
101
|
+
update = await update;
|
|
102
|
+
} catch (error) {
|
|
103
|
+
if (!isCancled) {
|
|
104
|
+
setError == null ? void 0 : setError(error);
|
|
105
|
+
}
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (!isCancled) {
|
|
110
|
+
setValue == null ? void 0 : setValue(update);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
const updateError = (error) => q(() => {
|
|
114
|
+
if (!isCancled) {
|
|
115
|
+
setError == null ? void 0 : setError(error);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
let cancelSubscription;
|
|
119
|
+
try {
|
|
120
|
+
cancelSubscription = calculate({ use, updateValue, updateError });
|
|
121
|
+
} catch (error) {
|
|
122
|
+
setError == null ? void 0 : setError(error);
|
|
123
|
+
}
|
|
124
|
+
this.current = { cancel, check: checkAll, invalidateDependencies };
|
|
125
|
+
}
|
|
126
|
+
stop() {
|
|
127
|
+
var _a;
|
|
128
|
+
(_a = this.current) == null ? void 0 : _a.cancel();
|
|
129
|
+
}
|
|
130
|
+
check() {
|
|
131
|
+
var _a;
|
|
132
|
+
(_a = this.current) == null ? void 0 : _a.check();
|
|
133
|
+
}
|
|
134
|
+
invalidateDependencies() {
|
|
135
|
+
var _a;
|
|
136
|
+
(_a = this.current) == null ? void 0 : _a.invalidateDependencies();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
exports.CalculationHelper = CalculationHelper;
|
|
140
|
+
//# sourceMappingURL=calculationHelper.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calculationHelper.cjs","sources":["../../../src/lib/calculationHelper.ts"],"sourcesContent":["import type { MaybePromise } from './maybePromise';\nimport { queue } from './queue';\nimport { trackingProxy } from './trackingProxy';\nimport type { Store } from '@core/store';\nimport type { Cancel, UpdateFrom, Use } from '@core/commonTypes';\n\nexport class CalculationHelper<T> {\n private current?: {\n cancel: Cancel;\n check: () => void;\n invalidateDependencies: () => void;\n };\n\n constructor(\n private options: {\n calculate: (fns: {\n use: Use;\n updateValue: (update: UpdateFrom<MaybePromise<T>, [T | undefined]>) => void;\n updateError: (error: unknown) => void;\n }) => Cancel | void;\n addEffect: (effect: () => Cancel | void) => Cancel;\n getValue?: () => T | undefined;\n setValue?: (value: T) => void;\n setError?: (error: unknown) => void;\n onInvalidate?: () => void;\n },\n ) {\n options.addEffect(() => {\n if (this.current) {\n this.current.check();\n } else {\n this.execute();\n }\n });\n }\n\n execute() {\n this.stop();\n\n const { calculate, addEffect, getValue, setValue, setError, onInvalidate } = this.options;\n const checks = new Array<() => boolean>();\n const deps = new Map<Store<any>, { on: () => void; off: () => void; invalidate: () => void }>();\n const q = queue();\n let isActive = false;\n let isCancled = false;\n\n const cancelEffect = addEffect(() => {\n isActive = true;\n\n for (const dep of deps.values()) {\n dep.on();\n }\n\n return () => {\n isActive = false;\n\n for (const dep of deps.values()) {\n dep.off();\n }\n };\n });\n\n const cancel = () => {\n isCancled = true;\n cancelSubscription?.();\n cancelEffect();\n delete this.current;\n };\n\n const checkAll = () => {\n if (!checks.every((check) => check())) {\n cancel();\n onInvalidate?.();\n }\n };\n\n const invalidateDependencies = () => {\n for (const dep of deps.values()) {\n dep.invalidate();\n }\n };\n\n const use: Use = (store, { disableProxy } = {}) => {\n if (isCancled) {\n return store.get();\n }\n\n let value = store.get();\n let equals = (newValue: any) => {\n return newValue === value;\n };\n\n if (!disableProxy) {\n [value, equals] = trackingProxy(value);\n }\n\n let sub: Cancel | undefined;\n\n const dep = {\n on() {\n this.off();\n\n sub = store.sub(checkAll, { runNow: false });\n },\n off() {\n sub?.();\n sub = undefined;\n },\n invalidate() {\n if ('invalidate' in store && store.invalidate instanceof Function) {\n store.invalidate();\n }\n },\n };\n\n if (isActive) {\n dep.on();\n }\n\n checks.push(() => equals(store.get()));\n deps.set(store, dep);\n\n return value;\n };\n\n const updateValue = (update: UpdateFrom<MaybePromise<T>, [T | undefined]>) =>\n q(async () => {\n if (isCancled) {\n return;\n }\n\n if (update instanceof Function) {\n try {\n update = update(getValue?.());\n } catch (error) {\n setError?.(error);\n return;\n }\n }\n\n if (update instanceof Promise) {\n try {\n update = await update;\n } catch (error) {\n if (!isCancled) {\n setError?.(error);\n }\n return;\n }\n }\n\n if (!isCancled) {\n setValue?.(update);\n }\n });\n\n const updateError = (error: unknown) =>\n q(() => {\n if (!isCancled) {\n setError?.(error);\n }\n });\n\n let cancelSubscription: Cancel | void;\n try {\n cancelSubscription = calculate({ use, updateValue, updateError });\n } catch (error) {\n setError?.(error);\n }\n\n this.current = { cancel, check: checkAll, invalidateDependencies };\n }\n\n stop() {\n this.current?.cancel();\n }\n\n check() {\n this.current?.check();\n }\n\n invalidateDependencies() {\n this.current?.invalidateDependencies();\n }\n}\n"],"names":["queue","trackingProxy"],"mappings":";;;;AAMO,MAAM,kBAAqB;AAAA,EAOhC,YACU,SAYR;AAZQ,SAAA,UAAA;AAaR,YAAQ,UAAU,MAAM;AACtB,UAAI,KAAK,SAAS;AAChB,aAAK,QAAQ;MAAM,OACd;AACL,aAAK,QAAQ;AAAA,MACf;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEA,UAAU;AACR,SAAK,KAAK;AAEJ,UAAA,EAAE,WAAW,WAAW,UAAU,UAAU,UAAU,aAAA,IAAiB,KAAK;AAC5E,UAAA,SAAS,IAAI;AACb,UAAA,2BAAW;AACjB,UAAM,IAAIA,MAAAA;AACV,QAAI,WAAW;AACf,QAAI,YAAY;AAEV,UAAA,eAAe,UAAU,MAAM;AACxB,iBAAA;AAEA,iBAAA,OAAO,KAAK,UAAU;AAC/B,YAAI,GAAG;AAAA,MACT;AAEA,aAAO,MAAM;AACA,mBAAA;AAEA,mBAAA,OAAO,KAAK,UAAU;AAC/B,cAAI,IAAI;AAAA,QACV;AAAA,MAAA;AAAA,IACF,CACD;AAED,UAAM,SAAS,MAAM;AACP,kBAAA;AACS;AACR;AACb,aAAO,KAAK;AAAA,IAAA;AAGd,UAAM,WAAW,MAAM;AACrB,UAAI,CAAC,OAAO,MAAM,CAAC,UAAU,MAAO,CAAA,GAAG;AAC9B;AACQ;AAAA,MACjB;AAAA,IAAA;AAGF,UAAM,yBAAyB,MAAM;AACxB,iBAAA,OAAO,KAAK,UAAU;AAC/B,YAAI,WAAW;AAAA,MACjB;AAAA,IAAA;AAGF,UAAM,MAAW,CAAC,OAAO,EAAE,aAAa,IAAI,CAAA,MAAO;AACjD,UAAI,WAAW;AACb,eAAO,MAAM;MACf;AAEI,UAAA,QAAQ,MAAM;AACd,UAAA,SAAS,CAAC,aAAkB;AAC9B,eAAO,aAAa;AAAA,MAAA;AAGtB,UAAI,CAAC,cAAc;AACjB,SAAC,OAAO,MAAM,IAAIC,cAAA,cAAc,KAAK;AAAA,MACvC;AAEI,UAAA;AAEJ,YAAM,MAAM;AAAA,QACV,KAAK;AACH,eAAK,IAAI;AAET,gBAAM,MAAM,IAAI,UAAU,EAAE,QAAQ,OAAO;AAAA,QAC7C;AAAA,QACA,MAAM;AACE;AACA,gBAAA;AAAA,QACR;AAAA,QACA,aAAa;AACX,cAAI,gBAAgB,SAAS,MAAM,sBAAsB,UAAU;AACjE,kBAAM,WAAW;AAAA,UACnB;AAAA,QACF;AAAA,MAAA;AAGF,UAAI,UAAU;AACZ,YAAI,GAAG;AAAA,MACT;AAEA,aAAO,KAAK,MAAM,OAAO,MAAM,IAAK,CAAA,CAAC;AAChC,WAAA,IAAI,OAAO,GAAG;AAEZ,aAAA;AAAA,IAAA;AAGT,UAAM,cAAc,CAAC,WACnB,EAAE,YAAY;AACZ,UAAI,WAAW;AACb;AAAA,MACF;AAEA,UAAI,kBAAkB,UAAU;AAC1B,YAAA;AACO,mBAAA,OAAO,sCAAY;AAAA,iBACrB;AACP,+CAAW;AACX;AAAA,QACF;AAAA,MACF;AAEA,UAAI,kBAAkB,SAAS;AACzB,YAAA;AACF,mBAAS,MAAM;AAAA,iBACR;AACP,cAAI,CAAC,WAAW;AACd,iDAAW;AAAA,UACb;AACA;AAAA,QACF;AAAA,MACF;AAEA,UAAI,CAAC,WAAW;AACd,6CAAW;AAAA,MACb;AAAA,IAAA,CACD;AAEH,UAAM,cAAc,CAAC,UACnB,EAAE,MAAM;AACN,UAAI,CAAC,WAAW;AACd,6CAAW;AAAA,MACb;AAAA,IAAA,CACD;AAEC,QAAA;AACA,QAAA;AACF,2BAAqB,UAAU,EAAE,KAAK,aAAa,YAAa,CAAA;AAAA,aACzD;AACP,2CAAW;AAAA,IACb;AAEA,SAAK,UAAU,EAAE,QAAQ,OAAO,UAAU;EAC5C;AAAA,EAEA,OAAO;;AACL,eAAK,YAAL,mBAAc;AAAA,EAChB;AAAA,EAEA,QAAQ;;AACN,eAAK,YAAL,mBAAc;AAAA,EAChB;AAAA,EAEA,yBAAyB;;AACvB,eAAK,YAAL,mBAAc;AAAA,EAChB;AACF;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
class Callable extends Function {
|
|
4
|
+
constructor(_call) {
|
|
5
|
+
super("...args", "return this._call(...args)");
|
|
6
|
+
this._call = _call;
|
|
7
|
+
return this.bind(this);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.Callable = Callable;
|
|
11
|
+
//# sourceMappingURL=callable.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callable.cjs","sources":["../../../src/lib/callable.ts"],"sourcesContent":["export class Callable<Args extends any[], T> extends Function {\n constructor(protected _call: (...args: Args) => T) {\n super('...args', 'return this._call(...args)');\n\n // eslint-disable-next-line no-constructor-return\n return this.bind(this);\n }\n}\n"],"names":[],"mappings":";;AAAO,MAAM,iBAAwC,SAAS;AAAA,EAC5D,YAAsB,OAA6B;AACjD,UAAM,WAAW,4BAA4B;AADzB,SAAA,QAAA;AAIb,WAAA,KAAK,KAAK,IAAI;AAAA,EACvB;AACF;;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
function flatClone(object) {
|
|
4
|
+
if (object instanceof Map) {
|
|
5
|
+
return new Map(object);
|
|
6
|
+
}
|
|
7
|
+
if (object instanceof Set) {
|
|
8
|
+
return new Set(object);
|
|
9
|
+
}
|
|
10
|
+
if (Array.isArray(object)) {
|
|
11
|
+
return [...object];
|
|
12
|
+
}
|
|
13
|
+
if (object instanceof Object) {
|
|
14
|
+
return { ...object };
|
|
15
|
+
}
|
|
16
|
+
return object;
|
|
17
|
+
}
|
|
18
|
+
exports.flatClone = flatClone;
|
|
19
|
+
//# sourceMappingURL=clone.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone.cjs","sources":["../../../src/lib/clone.ts"],"sourcesContent":["export function flatClone<T>(object: T): T {\n if (object instanceof Map) {\n return new Map(object) as any;\n }\n\n if (object instanceof Set) {\n return new Set(object) as any;\n }\n\n if (Array.isArray(object)) {\n return [...object] as any;\n }\n\n if (object instanceof Object) {\n return { ...object };\n }\n\n return object;\n}\n"],"names":[],"mappings":";;AAAO,SAAS,UAAa,QAAc;AACzC,MAAI,kBAAkB,KAAK;AAClB,WAAA,IAAI,IAAI,MAAM;AAAA,EACvB;AAEA,MAAI,kBAAkB,KAAK;AAClB,WAAA,IAAI,IAAI,MAAM;AAAA,EACvB;AAEI,MAAA,MAAM,QAAQ,MAAM,GAAG;AAClB,WAAA,CAAC,GAAG,MAAM;AAAA,EACnB;AAEA,MAAI,kBAAkB,QAAQ;AACrB,WAAA,EAAE,GAAG;EACd;AAEO,SAAA;AACT;;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const calcDuration = require("./calcDuration.cjs");
|
|
4
|
+
function debounce(action, options) {
|
|
5
|
+
const wait = typeof options === "object" && "wait" in options ? calcDuration.calcDuration(options.wait) : calcDuration.calcDuration(options);
|
|
6
|
+
const maxWait = typeof options === "object" && "maxWait" in options && options.maxWait !== void 0 ? calcDuration.calcDuration(options.maxWait) : void 0;
|
|
7
|
+
let timeout;
|
|
8
|
+
let timeoutStarted;
|
|
9
|
+
return (...args) => {
|
|
10
|
+
const now = Date.now();
|
|
11
|
+
timeoutStarted ?? (timeoutStarted = now);
|
|
12
|
+
const deadline = Math.min(
|
|
13
|
+
//
|
|
14
|
+
now + wait,
|
|
15
|
+
timeoutStarted + (maxWait ?? Number.POSITIVE_INFINITY)
|
|
16
|
+
);
|
|
17
|
+
if (timeout !== void 0) {
|
|
18
|
+
clearTimeout(timeout);
|
|
19
|
+
}
|
|
20
|
+
timeout = setTimeout(() => {
|
|
21
|
+
timeout = void 0;
|
|
22
|
+
timeoutStarted = void 0;
|
|
23
|
+
action(...args);
|
|
24
|
+
}, deadline - now);
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
exports.debounce = debounce;
|
|
28
|
+
//# sourceMappingURL=debounce.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debounce.cjs","sources":["../../../src/lib/debounce.ts"],"sourcesContent":["import { calcDuration } from './calcDuration';\nimport type { Duration } from '@core';\n\nexport type DebounceOptions =\n | Duration\n | {\n wait: Duration;\n maxWait?: Duration;\n };\n\nexport function debounce<Args extends any[]>(\n action: (...args: Args) => void,\n options: Duration | DebounceOptions,\n): (...args: Args) => void {\n const wait =\n typeof options === 'object' && 'wait' in options\n ? calcDuration(options.wait)\n : calcDuration(options);\n\n const maxWait =\n typeof options === 'object' && 'maxWait' in options && options.maxWait !== undefined\n ? calcDuration(options.maxWait)\n : undefined;\n\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let timeoutStarted: number | undefined;\n\n return (...args: Args) => {\n const now = Date.now();\n timeoutStarted ??= now;\n\n const deadline = Math.min(\n //\n now + wait,\n timeoutStarted + (maxWait ?? Number.POSITIVE_INFINITY),\n );\n\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(() => {\n timeout = undefined;\n timeoutStarted = undefined;\n action(...args);\n }, deadline - now);\n };\n}\n"],"names":["calcDuration"],"mappings":";;;AAUgB,SAAA,SACd,QACA,SACyB;AACnB,QAAA,OACJ,OAAO,YAAY,YAAY,UAAU,UACrCA,aAAA,aAAa,QAAQ,IAAI,IACzBA,aAAA,aAAa,OAAO;AAE1B,QAAM,UACJ,OAAO,YAAY,YAAY,aAAa,WAAW,QAAQ,YAAY,SACvEA,aAAAA,aAAa,QAAQ,OAAO,IAC5B;AAEF,MAAA;AACA,MAAA;AAEJ,SAAO,IAAI,SAAe;AAClB,UAAA,MAAM,KAAK;AACE,wCAAA;AAEnB,UAAM,WAAW,KAAK;AAAA;AAAA,MAEpB,MAAM;AAAA,MACN,kBAAkB,WAAW,OAAO;AAAA,IAAA;AAGtC,QAAI,YAAY,QAAW;AACzB,mBAAa,OAAO;AAAA,IACtB;AAEA,cAAU,WAAW,MAAM;AACf,gBAAA;AACO,uBAAA;AACjB,aAAO,GAAG,IAAI;AAAA,IAAA,GACb,WAAW,GAAG;AAAA,EAAA;AAErB;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"equals.cjs","sources":["../../../src/lib/equals.ts"],"sourcesContent":["export const defaultEquals = (a: any, b: any) => a === b;\n\nexport const simpleShallowEquals = (a: any, b: any): boolean => {\n if (a === b) {\n return true;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((value, i) => value === b[i]);\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n if (a === null || b === null) {\n return false;\n }\n\n const entries1 = Object.entries(a);\n const entries2 = Object.entries(b);\n return (\n entries1.length === entries2.length && entries1.every(([key, value]) => value === b[key])\n );\n }\n\n return false;\n};\n\nexport const simpleDeepEquals = (a: any, b: any): boolean => {\n if (a === b) {\n return true;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((value, i) => simpleDeepEquals(value, b[i]));\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n if (a === null || b === null) {\n return false;\n }\n\n const entries1 = Object.entries(a);\n const entries2 = Object.entries(b);\n return (\n entries1.length === entries2.length &&\n entries1.every(([key, value]) => simpleDeepEquals(value, b[key]))\n );\n }\n\n return false;\n};\n"],"names":[],"mappings":";;AAAO,MAAM,gBAAgB,CAAC,GAAQ,MAAW,MAAM;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forwardError.cjs","sources":["../../../src/lib/forwardError.ts"],"sourcesContent":["export function forwardError(error: unknown) {\n setTimeout(() => {\n throw error;\n });\n}\n"],"names":[],"mappings":";;AAAO,SAAS,aAAa,OAAgB;AAC3C,aAAW,MAAM;AACT,UAAA;AAAA,EAAA,CACP;AACH;;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
function hash(value) {
|
|
4
|
+
if (value instanceof Set) {
|
|
5
|
+
return `s[${[...value].map(hash).sort().join(",")}]`;
|
|
6
|
+
}
|
|
7
|
+
if (value instanceof Map) {
|
|
8
|
+
return `m[${[...value.entries()].map(hash).sort().join(",")}]`;
|
|
9
|
+
}
|
|
10
|
+
if (Array.isArray(value)) {
|
|
11
|
+
return `[${value.map(hash).join(",")}]`;
|
|
12
|
+
}
|
|
13
|
+
if (value instanceof Object) {
|
|
14
|
+
return `o[${Object.entries(value).map(hash).sort().join(",")}]`;
|
|
15
|
+
}
|
|
16
|
+
return JSON.stringify(value);
|
|
17
|
+
}
|
|
18
|
+
exports.hash = hash;
|
|
19
|
+
//# sourceMappingURL=hash.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.cjs","sources":["../../../src/lib/hash.ts"],"sourcesContent":["export function hash(value: unknown): string {\n if (value instanceof Set) {\n return `s[${[...value].map(hash).sort().join(',')}]`;\n }\n\n if (value instanceof Map) {\n return `m[${[...value.entries()].map(hash).sort().join(',')}]`;\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(hash).join(',')}]`;\n }\n\n if (value instanceof Object) {\n return `o[${Object.entries(value).map(hash).sort().join(',')}]`;\n }\n\n return JSON.stringify(value);\n}\n"],"names":[],"mappings":";;AAAO,SAAS,KAAK,OAAwB;AAC3C,MAAI,iBAAiB,KAAK;AACjB,WAAA,KAAK,CAAC,GAAG,KAAK,EAAE,IAAI,IAAI,EAAE,KAAO,EAAA,KAAK,GAAG;AAAA,EAClD;AAEA,MAAI,iBAAiB,KAAK;AACxB,WAAO,KAAK,CAAC,GAAG,MAAM,QAAS,CAAA,EAAE,IAAI,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG;AAAA,EAC5D;AAEI,MAAA,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,IAAI,MAAM,IAAI,IAAI,EAAE,KAAK,GAAG;AAAA,EACrC;AAEA,MAAI,iBAAiB,QAAQ;AACpB,WAAA,KAAK,OAAO,QAAQ,KAAK,EAAE,IAAI,IAAI,EAAE,KAAA,EAAO,KAAK,GAAG;AAAA,EAC7D;AAEO,SAAA,KAAK,UAAU,KAAK;AAC7B;;"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const hash = require("./hash.cjs");
|
|
4
|
+
class InstanceCache {
|
|
5
|
+
constructor(factory, cacheTime) {
|
|
6
|
+
this.factory = factory;
|
|
7
|
+
this.cacheTime = cacheTime;
|
|
8
|
+
this.cache = /* @__PURE__ */ new Map();
|
|
9
|
+
this.interval = this.cacheTime ? setInterval(() => this.cleanup(), Math.max(this.cacheTime / 10, 1)) : void 0;
|
|
10
|
+
}
|
|
11
|
+
cleanup() {
|
|
12
|
+
var _a;
|
|
13
|
+
const cutoff = this.now() - (this.cacheTime ?? 0);
|
|
14
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
15
|
+
if (entry.ref && entry.t <= cutoff) {
|
|
16
|
+
delete entry.ref;
|
|
17
|
+
}
|
|
18
|
+
if (!entry.ref && !((_a = entry.weakRef) == null ? void 0 : _a.deref())) {
|
|
19
|
+
this.cache.delete(key);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
get(...args) {
|
|
24
|
+
var _a;
|
|
25
|
+
const key = hash.hash(args);
|
|
26
|
+
let entry = this.cache.get(key);
|
|
27
|
+
let value = (entry == null ? void 0 : entry.ref) ?? ((_a = entry == null ? void 0 : entry.weakRef) == null ? void 0 : _a.deref());
|
|
28
|
+
if (!entry || !value) {
|
|
29
|
+
value = this.factory(...args);
|
|
30
|
+
entry = {
|
|
31
|
+
t: this.now(),
|
|
32
|
+
ref: value,
|
|
33
|
+
weakRef: new WeakRef(value)
|
|
34
|
+
};
|
|
35
|
+
this.cache.set(key, entry);
|
|
36
|
+
} else {
|
|
37
|
+
entry.t = this.now();
|
|
38
|
+
entry.ref ?? (entry.ref = value);
|
|
39
|
+
}
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
values() {
|
|
43
|
+
return [...this.cache.values()].map((entry) => {
|
|
44
|
+
var _a;
|
|
45
|
+
return entry.ref ?? ((_a = entry.weakRef) == null ? void 0 : _a.deref());
|
|
46
|
+
}).filter((value) => !!value);
|
|
47
|
+
}
|
|
48
|
+
stop() {
|
|
49
|
+
if (this.interval) {
|
|
50
|
+
clearInterval(this.interval);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
stats() {
|
|
54
|
+
return {
|
|
55
|
+
count: this.cache.size,
|
|
56
|
+
withRef: [...this.cache.values()].filter((x) => !!x.ref).length,
|
|
57
|
+
withWeakRef: [...this.cache.values()].filter((x) => {
|
|
58
|
+
var _a;
|
|
59
|
+
return !!((_a = x.weakRef) == null ? void 0 : _a.deref());
|
|
60
|
+
}).length
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
now() {
|
|
64
|
+
return performance.now();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.InstanceCache = InstanceCache;
|
|
68
|
+
//# sourceMappingURL=instanceCache.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instanceCache.cjs","sources":["../../../src/lib/instanceCache.ts"],"sourcesContent":["import { hash } from './hash';\n\nexport class InstanceCache<Args extends any[], T extends object> {\n private cache = new Map<string, { t: number; ref?: T; weakRef: WeakRef<T> }>();\n\n private interval = this.cacheTime\n ? setInterval(() => this.cleanup(), Math.max(this.cacheTime / 10, 1))\n : undefined;\n\n constructor(public readonly factory: (...args: Args) => T, public readonly cacheTime?: number) {}\n\n cleanup() {\n const cutoff = this.now() - (this.cacheTime ?? 0);\n\n for (const [key, entry] of this.cache.entries()) {\n if (entry.ref && entry.t <= cutoff) {\n delete entry.ref;\n }\n\n if (!entry.ref && !entry.weakRef?.deref()) {\n this.cache.delete(key);\n }\n }\n }\n\n get(...args: Args) {\n const key = hash(args);\n let entry = this.cache.get(key);\n let value = entry?.ref ?? entry?.weakRef?.deref();\n\n if (!entry || !value) {\n value = this.factory(...args);\n entry = {\n t: this.now(),\n ref: value,\n weakRef: new WeakRef(value),\n };\n\n this.cache.set(key, entry);\n } else {\n entry.t = this.now();\n entry.ref ??= value;\n }\n\n return value;\n }\n\n values() {\n return [...this.cache.values()]\n .map((entry) => entry.ref ?? entry.weakRef?.deref())\n .filter((value): value is T => !!value);\n }\n\n stop() {\n if (this.interval) {\n clearInterval(this.interval);\n }\n }\n\n stats() {\n return {\n count: this.cache.size,\n withRef: [...this.cache.values()].filter((x) => !!x.ref).length,\n withWeakRef: [...this.cache.values()].filter((x) => !!x.weakRef?.deref()).length,\n };\n }\n\n private now() {\n return performance.now();\n }\n}\n"],"names":["hash"],"mappings":";;;AAEO,MAAM,cAAoD;AAAA,EAO/D,YAA4B,SAA+C,WAAoB;AAAnE,SAAA,UAAA;AAA+C,SAAA,YAAA;AANnE,SAAA,4BAAY;AAEpB,SAAQ,WAAW,KAAK,YACpB,YAAY,MAAM,KAAK,QAAW,GAAA,KAAK,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,IAClE;AAAA,EAE4F;AAAA,EAEhG,UAAU;;AACR,UAAM,SAAS,KAAK,IAAI,KAAK,KAAK,aAAa;AAE/C,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,MAAM,WAAW;AAC/C,UAAI,MAAM,OAAO,MAAM,KAAK,QAAQ;AAClC,eAAO,MAAM;AAAA,MACf;AAEA,UAAI,CAAC,MAAM,OAAO,GAAC,WAAM,YAAN,mBAAe,UAAS;AACpC,aAAA,MAAM,OAAO,GAAG;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,MAAY;;AACX,UAAA,MAAMA,UAAK,IAAI;AACrB,QAAI,QAAQ,KAAK,MAAM,IAAI,GAAG;AAC9B,QAAI,SAAQ,+BAAO,UAAO,oCAAO,YAAP,mBAAgB;AAEtC,QAAA,CAAC,SAAS,CAAC,OAAO;AACZ,cAAA,KAAK,QAAQ,GAAG,IAAI;AACpB,cAAA;AAAA,QACN,GAAG,KAAK,IAAI;AAAA,QACZ,KAAK;AAAA,QACL,SAAS,IAAI,QAAQ,KAAK;AAAA,MAAA;AAGvB,WAAA,MAAM,IAAI,KAAK,KAAK;AAAA,IAAA,OACpB;AACC,YAAA,IAAI,KAAK;AACf,YAAM,QAAN,MAAM,MAAQ;AAAA,IAChB;AAEO,WAAA;AAAA,EACT;AAAA,EAEA,SAAS;AACA,WAAA,CAAC,GAAG,KAAK,MAAM,OAAQ,CAAA,EAC3B,IAAI,CAAC;;AAAU,mBAAM,SAAO,WAAM,YAAN,mBAAe;AAAA,KAAO,EAClD,OAAO,CAAC,UAAsB,CAAC,CAAC,KAAK;AAAA,EAC1C;AAAA,EAEA,OAAO;AACL,QAAI,KAAK,UAAU;AACjB,oBAAc,KAAK,QAAQ;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,QAAQ;AACC,WAAA;AAAA,MACL,OAAO,KAAK,MAAM;AAAA,MAClB,SAAS,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE;AAAA,MACzD,aAAa,CAAC,GAAG,KAAK,MAAM,OAAQ,CAAA,EAAE,OAAO,CAAC;;AAAM,gBAAC,GAAC,OAAE,YAAF,mBAAW;AAAA,OAAO,EAAE;AAAA,IAAA;AAAA,EAE9E;AAAA,EAEQ,MAAM;AACZ,WAAO,YAAY;EACrB;AACF;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const propAccess = require("./propAccess.cjs");
|
|
4
|
+
function makeSelector(selector) {
|
|
5
|
+
if (!selector) {
|
|
6
|
+
return (x) => x;
|
|
7
|
+
}
|
|
8
|
+
if (selector instanceof Function) {
|
|
9
|
+
return selector;
|
|
10
|
+
}
|
|
11
|
+
return (x) => propAccess.get(x, selector);
|
|
12
|
+
}
|
|
13
|
+
exports.makeSelector = makeSelector;
|
|
14
|
+
//# sourceMappingURL=makeSelector.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"makeSelector.cjs","sources":["../../../src/lib/makeSelector.ts"],"sourcesContent":["import type { Path } from './path';\nimport { get } from './propAccess';\n\nexport function makeSelector<T, S>(selector?: ((value: T) => S) | Path<any>): (value: T) => S {\n if (!selector) {\n return (x) => x as any;\n }\n\n if (selector instanceof Function) {\n return selector;\n }\n\n return (x) => get(x, selector as any) as any;\n}\n"],"names":["get"],"mappings":";;;AAGO,SAAS,aAAmB,UAA2D;AAC5F,MAAI,CAAC,UAAU;AACb,WAAO,CAAC,MAAM;AAAA,EAChB;AAEA,MAAI,oBAAoB,UAAU;AACzB,WAAA;AAAA,EACT;AAEA,SAAO,CAAC,MAAMA,WAAAA,IAAI,GAAG,QAAe;AACtC;;"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const clone = require("./clone.cjs");
|
|
4
|
+
function castArrayPath(path) {
|
|
5
|
+
if (Array.isArray(path)) {
|
|
6
|
+
return path;
|
|
7
|
+
}
|
|
8
|
+
if (path === "") {
|
|
9
|
+
return [];
|
|
10
|
+
}
|
|
11
|
+
return path.split(".");
|
|
12
|
+
}
|
|
13
|
+
function get(object, path) {
|
|
14
|
+
const _path = castArrayPath(path);
|
|
15
|
+
const [first, ...rest] = _path;
|
|
16
|
+
if (first === void 0 || !object) {
|
|
17
|
+
return object;
|
|
18
|
+
}
|
|
19
|
+
if (object instanceof Map) {
|
|
20
|
+
return get(object.get(first), rest);
|
|
21
|
+
}
|
|
22
|
+
if (object instanceof Set) {
|
|
23
|
+
return get(Array.from(object)[Number(first)], rest);
|
|
24
|
+
}
|
|
25
|
+
if (object instanceof Object) {
|
|
26
|
+
return get(object[first], rest);
|
|
27
|
+
}
|
|
28
|
+
throw new Error(`Could not get ${path} of ${object}`);
|
|
29
|
+
}
|
|
30
|
+
function set(object, path, value, rootPath = path) {
|
|
31
|
+
const _path = castArrayPath(path);
|
|
32
|
+
const [first, ...rest] = _path;
|
|
33
|
+
if (first === void 0) {
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
const updateChild = (child) => {
|
|
37
|
+
if (!child && rest.length > 0) {
|
|
38
|
+
const _rootPath = castArrayPath(rootPath);
|
|
39
|
+
const prefix = _rootPath.slice(0, -rest.length);
|
|
40
|
+
throw new Error(`Cannot set ${rootPath} because ${prefix.join(".")} is ${child}`);
|
|
41
|
+
}
|
|
42
|
+
return set(child, rest, value, rootPath);
|
|
43
|
+
};
|
|
44
|
+
if (object instanceof Map) {
|
|
45
|
+
const copy = clone.flatClone(object);
|
|
46
|
+
const child = copy.get(first);
|
|
47
|
+
copy.set(first, updateChild(child));
|
|
48
|
+
return copy;
|
|
49
|
+
}
|
|
50
|
+
if (object instanceof Set) {
|
|
51
|
+
const copy = [...object];
|
|
52
|
+
const child = copy[Number(first)];
|
|
53
|
+
copy[Number(first)] = updateChild(child);
|
|
54
|
+
return new Set(copy);
|
|
55
|
+
}
|
|
56
|
+
if (object instanceof Object) {
|
|
57
|
+
const copy = clone.flatClone(object);
|
|
58
|
+
copy[first] = updateChild(copy[first]);
|
|
59
|
+
return copy;
|
|
60
|
+
}
|
|
61
|
+
throw new Error(`Could not set ${path} of ${object}`);
|
|
62
|
+
}
|
|
63
|
+
exports.castArrayPath = castArrayPath;
|
|
64
|
+
exports.get = get;
|
|
65
|
+
exports.set = set;
|
|
66
|
+
//# sourceMappingURL=propAccess.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propAccess.cjs","sources":["../../../src/lib/propAccess.ts"],"sourcesContent":["import type { Update } from '../core/commonTypes';\nimport { flatClone } from './clone';\nimport type { Path, Value } from './path';\n\nexport function castArrayPath(path: string | KeyType[]): KeyType[] {\n if (Array.isArray(path)) {\n return path as any;\n }\n\n if (path === '') {\n return [] as any;\n }\n\n return (path as string).split('.') as any;\n}\n\nexport function get<T, P extends Path<T>>(object: T, path: P): Value<T, P> {\n const _path = castArrayPath(path as any);\n const [first, ...rest] = _path;\n\n if (first === undefined || !object) {\n return object as Value<T, P>;\n }\n\n if (object instanceof Map) {\n return get(object.get(first), rest as any);\n }\n\n if (object instanceof Set) {\n return get(Array.from(object)[Number(first)], rest as any);\n }\n\n if (object instanceof Object) {\n return get(object[first as keyof T], rest as any) as Value<T, P>;\n }\n\n throw new Error(`Could not get ${path} of ${object}`);\n}\n\nexport function set<T, P extends Path<T>>(\n object: T,\n path: P,\n value: Update<Value<T, P>>,\n rootPath = path,\n): T {\n const _path = castArrayPath(path as any);\n const [first, ...rest] = _path;\n\n if (first === undefined) {\n return value as any;\n }\n\n const updateChild = (child: any) => {\n if (!child && rest.length > 0) {\n const _rootPath = castArrayPath(rootPath as any);\n\n const prefix = _rootPath.slice(0, -rest.length) as KeyType[];\n throw new Error(`Cannot set ${rootPath} because ${prefix.join('.')} is ${child}`);\n }\n\n return set(child, rest as any, value, rootPath);\n };\n\n if (object instanceof Map) {\n const copy = flatClone(object);\n const child = copy.get(first);\n copy.set(first, updateChild(child));\n return copy;\n }\n\n if (object instanceof Set) {\n const copy = [...object];\n const child = copy[Number(first)];\n copy[Number(first)] = updateChild(child);\n return new Set(copy) as any;\n }\n\n if (object instanceof Object) {\n const copy = flatClone(object);\n copy[first as keyof T] = updateChild(copy[first as keyof T]);\n return copy;\n }\n\n throw new Error(`Could not set ${path} of ${object}`);\n}\n\nexport function remove<T, P extends Path<T, true>>(object: T, path: P): T {\n const _path = castArrayPath(path as any);\n\n if (_path.length === 0) {\n return undefined as any;\n }\n\n const parentPath = _path.slice(0, -1);\n const key = _path[_path.length - 1];\n\n const parent = flatClone(get(object, parentPath as any));\n\n if (parent instanceof Map) {\n parent.delete(key);\n } else if (parent instanceof Set) {\n const value = Array.from(parent)[Number(key)];\n parent.delete(value);\n } else {\n delete parent[key as keyof typeof parent];\n }\n\n return set(object, parentPath as any, parent);\n}\n"],"names":["flatClone"],"mappings":";;;AAIO,SAAS,cAAc,MAAqC;AAC7D,MAAA,MAAM,QAAQ,IAAI,GAAG;AAChB,WAAA;AAAA,EACT;AAEA,MAAI,SAAS,IAAI;AACf,WAAO;EACT;AAEQ,SAAA,KAAgB,MAAM,GAAG;AACnC;AAEgB,SAAA,IAA0B,QAAW,MAAsB;AACnE,QAAA,QAAQ,cAAc,IAAW;AACvC,QAAM,CAAC,OAAO,GAAG,IAAI,IAAI;AAErB,MAAA,UAAU,UAAa,CAAC,QAAQ;AAC3B,WAAA;AAAA,EACT;AAEA,MAAI,kBAAkB,KAAK;AACzB,WAAO,IAAI,OAAO,IAAI,KAAK,GAAG,IAAW;AAAA,EAC3C;AAEA,MAAI,kBAAkB,KAAK;AAClB,WAAA,IAAI,MAAM,KAAK,MAAM,EAAE,OAAO,KAAK,CAAC,GAAG,IAAW;AAAA,EAC3D;AAEA,MAAI,kBAAkB,QAAQ;AAC5B,WAAO,IAAI,OAAO,KAAgB,GAAG,IAAW;AAAA,EAClD;AAEA,QAAM,IAAI,MAAM,iBAAiB,WAAW,QAAQ;AACtD;AAEO,SAAS,IACd,QACA,MACA,OACA,WAAW,MACR;AACG,QAAA,QAAQ,cAAc,IAAW;AACvC,QAAM,CAAC,OAAO,GAAG,IAAI,IAAI;AAEzB,MAAI,UAAU,QAAW;AAChB,WAAA;AAAA,EACT;AAEM,QAAA,cAAc,CAAC,UAAe;AAClC,QAAI,CAAC,SAAS,KAAK,SAAS,GAAG;AACvB,YAAA,YAAY,cAAc,QAAe;AAE/C,YAAM,SAAS,UAAU,MAAM,GAAG,CAAC,KAAK,MAAM;AACxC,YAAA,IAAI,MAAM,cAAc,oBAAoB,OAAO,KAAK,GAAG,QAAQ,OAAO;AAAA,IAClF;AAEA,WAAO,IAAI,OAAO,MAAa,OAAO,QAAQ;AAAA,EAAA;AAGhD,MAAI,kBAAkB,KAAK;AACnB,UAAA,OAAOA,gBAAU,MAAM;AACvB,UAAA,QAAQ,KAAK,IAAI,KAAK;AAC5B,SAAK,IAAI,OAAO,YAAY,KAAK,CAAC;AAC3B,WAAA;AAAA,EACT;AAEA,MAAI,kBAAkB,KAAK;AACnB,UAAA,OAAO,CAAC,GAAG,MAAM;AACvB,UAAM,QAAQ,KAAK,OAAO,KAAK,CAAC;AAChC,SAAK,OAAO,KAAK,CAAC,IAAI,YAAY,KAAK;AAChC,WAAA,IAAI,IAAI,IAAI;AAAA,EACrB;AAEA,MAAI,kBAAkB,QAAQ;AACtB,UAAA,OAAOA,gBAAU,MAAM;AAC7B,SAAK,KAAgB,IAAI,YAAY,KAAK,KAAgB,CAAC;AACpD,WAAA;AAAA,EACT;AAEA,QAAM,IAAI,MAAM,iBAAiB,WAAW,QAAQ;AACtD;;;;"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
function queue() {
|
|
4
|
+
const q = [];
|
|
5
|
+
const completionListeners = /* @__PURE__ */ new Set();
|
|
6
|
+
let active = false;
|
|
7
|
+
const notify = () => {
|
|
8
|
+
for (const listener of completionListeners) {
|
|
9
|
+
listener();
|
|
10
|
+
}
|
|
11
|
+
completionListeners.clear();
|
|
12
|
+
};
|
|
13
|
+
const run = async () => {
|
|
14
|
+
if (!active) {
|
|
15
|
+
active = true;
|
|
16
|
+
let next;
|
|
17
|
+
while (next = q.shift()) {
|
|
18
|
+
try {
|
|
19
|
+
let result = next.action();
|
|
20
|
+
if (result instanceof Promise) {
|
|
21
|
+
result = await result;
|
|
22
|
+
}
|
|
23
|
+
next.resolve(result);
|
|
24
|
+
} catch (error) {
|
|
25
|
+
next.reject(error);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
active = false;
|
|
29
|
+
notify();
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
return Object.assign(
|
|
33
|
+
(action, ref) => {
|
|
34
|
+
return new Promise((resolve, reject) => {
|
|
35
|
+
q.push({ action, resolve, reject, ref });
|
|
36
|
+
run();
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
clear() {
|
|
41
|
+
q.length = 0;
|
|
42
|
+
},
|
|
43
|
+
whenDone() {
|
|
44
|
+
if (!active) {
|
|
45
|
+
return Promise.resolve();
|
|
46
|
+
}
|
|
47
|
+
return new Promise((resolve) => {
|
|
48
|
+
completionListeners.add(resolve);
|
|
49
|
+
});
|
|
50
|
+
},
|
|
51
|
+
get size() {
|
|
52
|
+
return q.length;
|
|
53
|
+
},
|
|
54
|
+
getRefs() {
|
|
55
|
+
return q.map((item) => item.ref).filter((x) => x !== void 0);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
exports.queue = queue;
|
|
61
|
+
//# sourceMappingURL=queue.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.cjs","sources":["../../../src/lib/queue.ts"],"sourcesContent":["import type { MaybePromise } from './maybePromise';\nimport type { Listener } from '@core';\n\ntype Action<T> = () => MaybePromise<T>;\n\nexport interface Queue {\n <T>(action: Action<T>, ref?: any): Promise<T>;\n clear: () => void;\n whenDone: () => Promise<void>;\n size: number;\n getRefs: () => any[];\n}\n\nexport function queue(): Queue {\n const q: {\n action: Action<any>;\n resolve: (value: any) => void;\n reject: (error: unknown) => void;\n ref?: any;\n }[] = [];\n const completionListeners = new Set<Listener<void>>();\n let active = false;\n\n const notify = () => {\n for (const listener of completionListeners) {\n listener();\n }\n\n completionListeners.clear();\n };\n\n const run = async () => {\n if (!active) {\n active = true;\n\n let next;\n while ((next = q.shift())) {\n try {\n let result = next.action();\n if (result instanceof Promise) {\n result = await result;\n }\n\n next.resolve(result);\n } catch (error) {\n next.reject(error);\n }\n }\n\n active = false;\n notify();\n }\n };\n\n return Object.assign(\n <T>(action: Action<T>, ref?: any) => {\n return new Promise<T>((resolve, reject) => {\n q.push({ action, resolve, reject, ref });\n run();\n });\n },\n {\n clear() {\n q.length = 0;\n },\n\n whenDone() {\n if (!active) {\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve) => {\n completionListeners.add(resolve);\n });\n },\n\n get size() {\n return q.length;\n },\n\n getRefs() {\n return q.map((item) => item.ref).filter((x) => x !== undefined);\n },\n },\n );\n}\n"],"names":[],"mappings":";;AAaO,SAAS,QAAe;AAC7B,QAAM,IAKA,CAAA;AACA,QAAA,0CAA0B;AAChC,MAAI,SAAS;AAEb,QAAM,SAAS,MAAM;AACnB,eAAW,YAAY,qBAAqB;AACjC;IACX;AAEA,wBAAoB,MAAM;AAAA,EAAA;AAG5B,QAAM,MAAM,YAAY;AACtB,QAAI,CAAC,QAAQ;AACF,eAAA;AAEL,UAAA;AACI,aAAA,OAAO,EAAE,SAAU;AACrB,YAAA;AACE,cAAA,SAAS,KAAK;AAClB,cAAI,kBAAkB,SAAS;AAC7B,qBAAS,MAAM;AAAA,UACjB;AAEA,eAAK,QAAQ,MAAM;AAAA,iBACZ;AACP,eAAK,OAAO,KAAK;AAAA,QACnB;AAAA,MACF;AAES,eAAA;AACF;IACT;AAAA,EAAA;AAGF,SAAO,OAAO;AAAA,IACZ,CAAI,QAAmB,QAAc;AACnC,aAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AACzC,UAAE,KAAK,EAAE,QAAQ,SAAS,QAAQ,KAAK;AACnC;MAAA,CACL;AAAA,IACH;AAAA,IACA;AAAA,MACE,QAAQ;AACN,UAAE,SAAS;AAAA,MACb;AAAA,MAEA,WAAW;AACT,YAAI,CAAC,QAAQ;AACX,iBAAO,QAAQ;QACjB;AAEO,eAAA,IAAI,QAAc,CAAC,YAAY;AACpC,8BAAoB,IAAI,OAAO;AAAA,QAAA,CAChC;AAAA,MACH;AAAA,MAEA,IAAI,OAAO;AACT,eAAO,EAAE;AAAA,MACX;AAAA,MAEA,UAAU;AACD,eAAA,EAAE,IAAI,CAAC,SAAS,KAAK,GAAG,EAAE,OAAO,CAAC,MAAM,MAAM,MAAS;AAAA,MAChE;AAAA,IACF;AAAA,EAAA;AAEJ;;"}
|