cross-state 0.19.2 → 0.20.0
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/hash.cjs +18 -0
- package/dist/cjs/hash.cjs.map +1 -0
- package/dist/cjs/index.cjs +13 -12
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/react/index.cjs +249 -188
- package/dist/cjs/react/index.cjs.map +1 -1
- package/dist/cjs/react/register.cjs +12 -12
- package/dist/cjs/react/register.cjs.map +1 -1
- package/dist/cjs/scope.cjs +572 -19
- package/dist/cjs/scope.cjs.map +1 -1
- package/dist/cjs/{cache.cjs → scope2.cjs} +14 -3
- package/dist/cjs/scope2.cjs.map +1 -0
- package/dist/cjs/store.cjs +45 -10
- package/dist/cjs/store.cjs.map +1 -1
- package/dist/es/hash.mjs +19 -0
- package/dist/es/hash.mjs.map +1 -0
- package/dist/es/index.mjs +9 -8
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/react/index.mjs +245 -184
- package/dist/es/react/index.mjs.map +1 -1
- package/dist/es/react/register.mjs +4 -4
- package/dist/es/scope.mjs +573 -20
- package/dist/es/scope.mjs.map +1 -1
- package/dist/es/{cache.mjs → scope2.mjs} +14 -3
- package/dist/es/scope2.mjs.map +1 -0
- package/dist/es/store.mjs +45 -10
- package/dist/es/store.mjs.map +1 -1
- package/dist/types/core/commonTypes.d.ts +0 -1
- package/dist/types/core/store.d.ts +1 -1
- package/dist/types/lib/debounce.d.ts +5 -1
- package/dist/types/react/form/form.d.ts +47 -48
- package/dist/types/react/form/formField.d.ts +0 -1
- package/dist/types/react/form/useFormAutosave.d.ts +9 -0
- package/package.json +17 -17
- package/dist/cjs/cache.cjs.map +0 -1
- package/dist/cjs/useCache.cjs +0 -583
- package/dist/cjs/useCache.cjs.map +0 -1
- package/dist/es/cache.mjs.map +0 -1
- package/dist/es/useCache.mjs +0 -584
- package/dist/es/useCache.mjs.map +0 -1
|
@@ -1,15 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { type PathAsString, type Value, type WildcardPathAsString, type WildcardValue } from '../../lib/path';
|
|
1
|
+
import { type Store, type UrlStoreOptions } from '../../core';
|
|
2
|
+
import { type Path, type PathAsString, type Value, type WildcardPathAsString, type WildcardValue } from '../../lib/path';
|
|
3
3
|
import { type ComponentPropsWithoutRef, type HTMLProps, type ReactNode } from 'react';
|
|
4
4
|
import { type UseStoreOptions } from '../useStore';
|
|
5
5
|
import { type ArrayPath, type FormArrayProps } from './formArray';
|
|
6
6
|
import { type FormErrorProps } from './formError';
|
|
7
7
|
import { type FormFieldComponent, type FormFieldProps } from './formField';
|
|
8
|
+
import { type FormAutosaveOptions } from './useFormAutosave';
|
|
9
|
+
export type Transform<TDraft> = Path<TDraft> | '' extends infer TPath ? TPath extends TPath ? {
|
|
10
|
+
update: (value: Value<TDraft, TPath>, store: Store<TDraft>) => void | TDraft;
|
|
11
|
+
} & (TPath extends '' ? {
|
|
12
|
+
trigger?: '';
|
|
13
|
+
} : {
|
|
14
|
+
trigger: TPath;
|
|
15
|
+
}) : never : never;
|
|
8
16
|
export interface FormOptions<TDraft, TOriginal> {
|
|
9
17
|
defaultValue: TDraft;
|
|
10
18
|
validations?: Validations<TDraft, TOriginal>;
|
|
11
19
|
localizeError?: (error: string, field: string) => string | undefined;
|
|
12
20
|
urlState?: boolean | UrlStoreOptions<TDraft>;
|
|
21
|
+
autoSave?: FormAutosaveOptions<TDraft, TOriginal>;
|
|
22
|
+
transform?: Transform<TDraft>[];
|
|
13
23
|
}
|
|
14
24
|
export type Validations<TDraft, TOriginal> = {
|
|
15
25
|
[P in WildcardPathAsString<TDraft>]?: Record<string, Validation<WildcardValue<TDraft, P>, TDraft, TOriginal>>;
|
|
@@ -23,7 +33,7 @@ export type Field<TDraft, TOriginal, TPath extends PathAsString<TDraft>> = {
|
|
|
23
33
|
originalValue: Value<TOriginal, TPath> | undefined;
|
|
24
34
|
value: Value<TDraft, TPath>;
|
|
25
35
|
setValue: (value: Value<TDraft, TPath> | ((value: Value<TDraft, TPath>) => Value<TDraft, TPath>)) => void;
|
|
26
|
-
|
|
36
|
+
hasChange: boolean;
|
|
27
37
|
errors: string[];
|
|
28
38
|
} & (Value<TDraft, TPath> extends Array<any> ? ArrayFieldMethods<TDraft, TPath> : {});
|
|
29
39
|
export type ArrayFieldMethods<TPath, TValue> = {
|
|
@@ -31,62 +41,52 @@ export type ArrayFieldMethods<TPath, TValue> = {
|
|
|
31
41
|
append: (...elements: TValue[]) => void;
|
|
32
42
|
remove: (index: number) => void;
|
|
33
43
|
};
|
|
34
|
-
interface FormState<TDraft> {
|
|
35
|
-
draft
|
|
36
|
-
|
|
44
|
+
export interface FormState<TDraft> {
|
|
45
|
+
draft: TDraft | undefined;
|
|
46
|
+
hasTriggeredValidations: boolean;
|
|
47
|
+
saveScheduled: boolean;
|
|
48
|
+
saveInProgress: boolean;
|
|
49
|
+
}
|
|
50
|
+
export interface FormDerivedState<TDraft> {
|
|
51
|
+
draft: TDraft;
|
|
52
|
+
hasTriggeredValidations: boolean;
|
|
53
|
+
saveScheduled: boolean;
|
|
54
|
+
saveInProgress: boolean;
|
|
55
|
+
hasChanges: boolean;
|
|
37
56
|
errors: Map<string, string[]>;
|
|
38
|
-
|
|
57
|
+
isValid: boolean;
|
|
39
58
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
59
|
+
export interface FormContext<TDraft, TOriginal> {
|
|
60
|
+
formState: Store<FormState<TDraft>>;
|
|
61
|
+
derivedState: Store<FormDerivedState<TDraft>>;
|
|
43
62
|
options: FormOptions<TDraft, TOriginal>;
|
|
63
|
+
original: TOriginal | undefined;
|
|
44
64
|
getField: <TPath extends PathAsString<TDraft>>(path: TPath) => Field<TDraft, TOriginal, TPath>;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
readonly isValid: boolean;
|
|
65
|
+
getDraft: () => TDraft;
|
|
66
|
+
hasTriggeredValidations: () => boolean;
|
|
67
|
+
hasChanges: () => boolean;
|
|
68
|
+
getErrors: () => Map<string, string[]>;
|
|
69
|
+
isValid: () => boolean;
|
|
51
70
|
validate: () => boolean;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
71
|
+
reset: () => void;
|
|
72
|
+
}
|
|
73
|
+
export interface FormInstance<TDraft, TOriginal> extends FormDerivedState<TDraft>, Pick<FormContext<TDraft, TOriginal>, 'options' | 'original' | 'getField'> {
|
|
74
|
+
}
|
|
55
75
|
export declare class Form<TDraft, TOriginal extends TDraft = TDraft> {
|
|
56
76
|
readonly options: FormOptions<TDraft, TOriginal>;
|
|
57
|
-
context: import("react").Context<
|
|
58
|
-
original: TOriginal | undefined;
|
|
59
|
-
options: FormOptions<TDraft, TOriginal>;
|
|
60
|
-
}>;
|
|
61
|
-
state: Scope<FormState<TDraft>>;
|
|
77
|
+
context: import("react").Context<FormContext<TDraft, TOriginal> | null>;
|
|
62
78
|
constructor(options: FormOptions<TDraft, TOriginal>);
|
|
63
|
-
useForm():
|
|
64
|
-
|
|
65
|
-
draft: Store<TDraft>;
|
|
66
|
-
options: FormOptions<TDraft, TOriginal>;
|
|
67
|
-
getField: <TPath extends import("../../lib/typeHelpers").ArrayToStringPath<import("../../lib/path")._PathAsArray<TDraft, false, 5, []>>>(path: TPath) => Field<TDraft, TOriginal, TPath>;
|
|
68
|
-
readonly hasChanges: boolean;
|
|
69
|
-
readonly errors: {
|
|
70
|
-
field: string;
|
|
71
|
-
error: string;
|
|
72
|
-
}[];
|
|
73
|
-
readonly isValid: boolean;
|
|
74
|
-
validate: () => boolean;
|
|
75
|
-
readonly hasTriggeredValidations: boolean | undefined;
|
|
76
|
-
reset(): void;
|
|
77
|
-
};
|
|
78
|
-
useFormState<S>(selector: (state: ReturnType<typeof getFormInstance<TDraft, TOriginal>>) => S): S;
|
|
79
|
+
useForm(): FormContext<TDraft, TOriginal>;
|
|
80
|
+
useFormState<S>(selector: (state: FormInstance<TDraft, TOriginal>) => S, useStoreOptions?: UseStoreOptions): S;
|
|
79
81
|
useField<TPath extends PathAsString<TDraft>>(path: TPath, useStoreOptions?: UseStoreOptions): Field<TDraft, TOriginal, TPath>;
|
|
80
|
-
|
|
81
|
-
useIsValid(): boolean;
|
|
82
|
-
Form({ original, defaultValue, validations, localizeError, urlState, ...formProps }: {
|
|
82
|
+
Form({ original, defaultValue, validations, localizeError, urlState, autoSave, transform, ...formProps }: {
|
|
83
83
|
original?: TOriginal;
|
|
84
|
-
} & Partial<FormOptions<TDraft, TOriginal>> & Omit<HTMLProps<HTMLFormElement>, 'defaultValue'>): import("react/jsx-runtime").JSX.Element;
|
|
85
|
-
|
|
86
|
-
selector: (form:
|
|
84
|
+
} & Partial<FormOptions<TDraft, TOriginal>> & Omit<HTMLProps<HTMLFormElement>, 'defaultValue' | 'autoSave'>): import("react/jsx-runtime").JSX.Element;
|
|
85
|
+
FormState<S>({ selector, children, }: {
|
|
86
|
+
selector: (form: FormInstance<TDraft, TOriginal>) => S;
|
|
87
87
|
children: (selectedState: S) => ReactNode;
|
|
88
88
|
}): import("react/jsx-runtime").JSX.Element;
|
|
89
|
-
Field<TPath extends PathAsString<TDraft>, TComponent extends FormFieldComponent = (props: ComponentPropsWithoutRef<'input'> & {
|
|
89
|
+
Field<const TPath extends PathAsString<TDraft>, const TComponent extends FormFieldComponent = (props: ComponentPropsWithoutRef<'input'> & {
|
|
90
90
|
name: TPath;
|
|
91
91
|
}) => JSX.Element>(props: FormFieldProps<TDraft, TPath, TComponent>): JSX.Element;
|
|
92
92
|
Field<TPath extends PathAsString<TDraft>>(props: Omit<FormFieldProps<TDraft, TPath, () => ReactNode>, 'component'>): JSX.Element;
|
|
@@ -95,4 +95,3 @@ export declare class Form<TDraft, TOriginal extends TDraft = TDraft> {
|
|
|
95
95
|
Error<TPath extends PathAsString<TDraft>>({ name }: FormErrorProps<TDraft, TPath>): any;
|
|
96
96
|
}
|
|
97
97
|
export declare function createForm<TDraft, TOriginal extends TDraft = TDraft>(options: FormOptions<TDraft, TOriginal>): Form<TDraft, TOriginal>;
|
|
98
|
-
export {};
|
|
@@ -11,7 +11,6 @@ export interface FormFieldComponentProps<TValue, TPath> {
|
|
|
11
11
|
value: TValue;
|
|
12
12
|
};
|
|
13
13
|
} | TValue | undefined, ...args: any[]) => void;
|
|
14
|
-
onFocus: (...args: any[]) => void;
|
|
15
14
|
onBlur: (...args: any[]) => void;
|
|
16
15
|
}
|
|
17
16
|
type NativeInputType = 'input' | 'select' | 'textarea';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Duration } from '../../core';
|
|
2
|
+
import type { FormContext } from './form';
|
|
3
|
+
import type { MaybePromise } from '../../lib/maybePromise';
|
|
4
|
+
export interface FormAutosaveOptions<TDraft, TOriginal> {
|
|
5
|
+
save: (draft: TDraft, form: FormContext<TDraft, TOriginal>) => MaybePromise<void>;
|
|
6
|
+
debounce?: Duration;
|
|
7
|
+
resetAfterSave?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function useFormAutosave<TDraft, TOriginal extends TDraft>(form: FormContext<TDraft, TOriginal>): void;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cross-state",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.0",
|
|
4
4
|
"description": "(React) state library",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"repository": "schummar/cross-state",
|
|
@@ -107,43 +107,43 @@
|
|
|
107
107
|
},
|
|
108
108
|
"devDependencies": {
|
|
109
109
|
"@emotion/styled": "11.11.0",
|
|
110
|
-
"@mantine/core": "6.0.
|
|
111
|
-
"@mui/material": "5.14.
|
|
110
|
+
"@mantine/core": "6.0.20",
|
|
111
|
+
"@mui/material": "5.14.8",
|
|
112
112
|
"@schummar/eslint-config": "github:schummar/eslint-config",
|
|
113
113
|
"@schummar/prettier-config": "github:schummar/prettier-config",
|
|
114
114
|
"@schummar/runp": "1.13.2",
|
|
115
|
-
"@size-limit/preset-small-lib": "
|
|
115
|
+
"@size-limit/preset-small-lib": "9.0.0",
|
|
116
116
|
"@testing-library/react": "14.0.0",
|
|
117
|
-
"@types/react": "18.2.
|
|
117
|
+
"@types/react": "18.2.21",
|
|
118
118
|
"@types/react-dom": "18.2.7",
|
|
119
119
|
"@types/seedrandom": "3.0.5",
|
|
120
|
-
"@types/use-sync-external-store": "0.0.
|
|
120
|
+
"@types/use-sync-external-store": "0.0.4",
|
|
121
121
|
"@types/ws": "8.5.5",
|
|
122
122
|
"@vitejs/plugin-react": "4.0.4",
|
|
123
|
-
"@vitest/coverage-v8": "0.34.
|
|
123
|
+
"@vitest/coverage-v8": "0.34.4",
|
|
124
124
|
"esbuild": "0.19.2",
|
|
125
|
-
"eslint": "8.
|
|
126
|
-
"happy-dom": "
|
|
125
|
+
"eslint": "8.48.0",
|
|
126
|
+
"happy-dom": "11.0.2",
|
|
127
127
|
"immer": "10.0.2",
|
|
128
128
|
"jsdom": "22.1.0",
|
|
129
|
-
"prettier": "3.0.
|
|
130
|
-
"publint": "0.2.
|
|
129
|
+
"prettier": "3.0.3",
|
|
130
|
+
"publint": "0.2.2",
|
|
131
131
|
"react": "18.2.0",
|
|
132
132
|
"react-dom": "18.2.0",
|
|
133
133
|
"rimraf": "5.0.1",
|
|
134
134
|
"seedrandom": "3.0.5",
|
|
135
|
-
"semantic-release": "21.
|
|
136
|
-
"size-limit": "
|
|
135
|
+
"semantic-release": "21.1.1",
|
|
136
|
+
"size-limit": "9.0.0",
|
|
137
137
|
"tsc-alias": "1.8.7",
|
|
138
|
-
"typescript": "5.
|
|
138
|
+
"typescript": "5.2.2",
|
|
139
139
|
"use-sync-external-store": "1.2.0",
|
|
140
140
|
"vite": "4.4.9",
|
|
141
141
|
"vite-tsconfig-paths": "4.2.0",
|
|
142
|
-
"vitest": "0.34.
|
|
142
|
+
"vitest": "0.34.4"
|
|
143
143
|
},
|
|
144
144
|
"volta": {
|
|
145
|
-
"node": "18.
|
|
146
|
-
"pnpm": "8.
|
|
145
|
+
"node": "18.17.1",
|
|
146
|
+
"pnpm": "8.7.4"
|
|
147
147
|
},
|
|
148
148
|
"eslintConfig": {
|
|
149
149
|
"extends": [
|
package/dist/cjs/cache.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache.cjs","sources":["../../src/core/resourceGroup.ts","../../src/lib/instanceCache.ts","../../src/lib/promiseWithState.ts","../../src/core/cache.ts"],"sourcesContent":["import { autobind } from '@lib/autobind';\n\nexport interface Resource {\n invalidateAll(): void;\n clearAll(): 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 autobind(ResourceGroup);\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.invalidateAll();\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.clearAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n}\n\nexport const allResources = /* @__PURE__ */ 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(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","import { type ErrorState, type PendingState, type ValueState } from './cacheState';\nimport { type MaybePromise } from './maybePromise';\n\nexport class PromiseWithState<T> extends Promise<T> {\n static override resolve(): PromiseWithState<void>;\n\n static override resolve<T>(value: MaybePromise<T>): PromiseWithState<T>;\n\n static override resolve<T>(value?: MaybePromise<T>) {\n return new PromiseWithState<T>(Promise.resolve(value as MaybePromise<T>), {\n status: 'value',\n value: value as T,\n });\n }\n\n static override reject<T = never>(error: unknown) {\n return new PromiseWithState<T>(Promise.reject(error), { status: 'error', error });\n }\n\n constructor(\n value: Promise<T>,\n public state: ValueState<T> | ErrorState | PendingState = { status: 'pending' },\n ) {\n super((resolve) => resolve(value));\n\n value\n .then((value) => {\n this.state = { status: 'value', value };\n })\n .catch((error) => {\n this.state = { status: 'error', error };\n });\n }\n}\n","import type { Duration, Selector, Use } from './commonTypes';\nimport { allResources, type ResourceGroup } from './resourceGroup';\nimport { Store, createStore } from './store';\nimport { autobind } from '@lib/autobind';\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 MaybePromise } from '@lib/maybePromise';\nimport type { Path, Value } from '@lib/path';\nimport { PromiseWithState } from '@lib/promiseWithState';\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> | ((cache: { use: Use }) => Promise<T>);\n}\n\nexport interface CacheOptions<T> {\n invalidateAfter?: Duration | ((state: ValueState<T> | ErrorState) => Duration | null) | null;\n invalidateOnWindowFocus?: boolean;\n invalidateOnActivation?: boolean;\n clearOnInvalidate?: boolean;\n clearUnusedAfter?: Duration | null;\n resourceGroup?: ResourceGroup | ResourceGroup[];\n retain?: number;\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 invalidationTimer?: 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 _call?: (...args: any[]) => any,\n ) {\n super(\n function () {\n let result = getter.apply(this);\n\n if (result instanceof Function) {\n result = result(this);\n }\n\n return result;\n },\n options,\n undefined,\n _call,\n );\n autobind(Cache);\n\n this.calculationHelper.options.onInvalidate = () =>\n this.invalidate({ invalidateDependencies: false });\n this.watchPromise();\n this.watchFocus();\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 updateValue(value: MaybePromise<T>) {\n this.set(PromiseWithState.resolve(value));\n }\n\n updateError(error: unknown) {\n this.set(PromiseWithState.reject(error));\n }\n\n invalidate({ invalidateDependencies = true }: { invalidateDependencies?: boolean } = {}) {\n const { clearOnInvalidate = createCache.defaultOptions.clearOnInvalidate } = this.options;\n\n if (clearOnInvalidate) {\n return this.clear({ invalidateDependencies });\n }\n\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 this.calculationHelper.stop();\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\n this.calculationHelper.stop();\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.subscribe(\n async (promise) => {\n if (promise instanceof PromiseWithState) {\n this.state.set({\n ...promise.state,\n isStale: false,\n isUpdating: false,\n });\n\n delete this.stalePromise;\n this.setTimers();\n return;\n }\n\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 if (this.invalidationTimer) {\n clearTimeout(this.invalidationTimer);\n }\n this.invalidationTimer = undefined;\n\n const state = this.state.get();\n let { invalidateAfter = createCache.defaultOptions.invalidateAfter } = 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 !== null && invalidateAfter !== undefined) {\n this.invalidationTimer = setTimeout(\n () => ref?.deref()?.invalidate(),\n calcDuration(invalidateAfter),\n );\n }\n }\n\n protected watchFocus() {\n const { invalidateOnWindowFocus = createCache.defaultOptions.invalidateOnWindowFocus } =\n this.options;\n\n if (\n !invalidateOnWindowFocus ||\n typeof document === 'undefined' ||\n typeof document.addEventListener === 'undefined'\n ) {\n return;\n }\n\n const ref = new WeakRef(this);\n\n const onFocus = () => {\n const that = ref?.deref();\n if (!that) {\n document.removeEventListener('visibilitychange', onFocus);\n return;\n }\n\n if (!document.hidden) {\n that.invalidate();\n }\n };\n\n document.addEventListener('visibilitychange', onFocus);\n }\n}\n\ntype CreateReturnType<T, Args extends any[]> = {\n (...args: Args): Cache<T>;\n invalidateAll: () => void;\n clearAll: () => void;\n} & ([] extends Args ? Cache<T> : {});\n\nfunction create<T, Args extends any[]>(\n cacheFunction: CacheFunction<T, Args>,\n options?: CacheOptions<T>,\n): CreateReturnType<T, Args> {\n const { clearUnusedAfter = createCache.defaultOptions.clearUnusedAfter, resourceGroup } =\n options ?? {};\n\n let baseInstance: CreateReturnType<T, Args> & Cache<T>;\n\n const instanceCache = new InstanceCache<Args, Cache<T>>(\n (...args: Args): Cache<T> => {\n if (args.length === 0 && baseInstance) {\n return baseInstance;\n }\n\n return new Cache(function () {\n return cacheFunction.apply(this, args);\n }, options);\n },\n clearUnusedAfter ? calcDuration(clearUnusedAfter) : undefined,\n );\n\n const get = (...args: Args) => {\n return instanceCache.get(...args);\n };\n\n const invalidateAll = () => {\n for (const instance of instanceCache.values()) {\n instance.invalidate();\n }\n };\n\n const clearAll = () => {\n for (const instance of instanceCache.values()) {\n instance.clear();\n }\n };\n\n baseInstance = Object.assign(\n new Cache(\n function () {\n return cacheFunction.apply(this);\n },\n options,\n undefined,\n get,\n ),\n {\n invalidateAll,\n clearAll,\n },\n ) as CreateReturnType<T, Args> & Cache<T>;\n\n const groups = Array.isArray(resourceGroup)\n ? resourceGroup\n : resourceGroup\n ? [resourceGroup]\n : [];\n for (const group of groups.concat(allResources)) {\n group.add(baseInstance);\n }\n\n get(...([] as any));\n\n return baseInstance;\n}\n\nexport const createCache = /* @__PURE__ */ Object.assign(create, {\n defaultOptions: {\n invalidateOnWindowFocus: true,\n invalidateOnActivation: true,\n clearUnusedAfter: { days: 1 },\n } as CacheOptions<unknown>,\n});\n"],"names":["autobind","hash","value","Store","createStore","makeSelector","calcDuration"],"mappings":"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"}
|