muya 1.1.0 → 2.0.0-beta.2
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/README.md +202 -139
- package/cjs/index.js +1 -1
- package/esm/__tests__/create-async.test.js +1 -0
- package/esm/__tests__/test-utils.js +1 -0
- package/esm/create.js +1 -1
- package/esm/debug/development-tools.js +1 -0
- package/esm/index.js +1 -1
- package/esm/subscriber.js +1 -0
- package/esm/types.js +1 -1
- package/esm/use.js +1 -0
- package/esm/utils/__tests__/context.test.js +1 -0
- package/esm/utils/__tests__/is.test.js +1 -0
- package/esm/utils/__tests__/shallow.test.js +1 -0
- package/esm/utils/__tests__/sub-memo.test.js +1 -0
- package/esm/utils/common.js +1 -0
- package/esm/utils/create-context.js +1 -0
- package/esm/utils/create-emitter.js +1 -0
- package/esm/utils/global-scheduler.js +1 -0
- package/esm/utils/is.js +1 -0
- package/esm/utils/scheduler.js +1 -0
- package/esm/utils/shallow.js +1 -0
- package/esm/utils/sub-memo.js +1 -0
- package/package.json +1 -1
- package/packages/core/__tests__/bench.test.tsx +266 -0
- package/packages/core/__tests__/create-async.test.ts +88 -0
- package/packages/core/__tests__/create.test.tsx +107 -0
- package/packages/core/__tests__/subscriber.test.tsx +89 -0
- package/packages/core/__tests__/test-utils.ts +40 -0
- package/packages/core/__tests__/use-async.test.tsx +45 -0
- package/packages/core/__tests__/use.test.tsx +125 -0
- package/packages/core/create.ts +98 -0
- package/packages/core/debug/development-tools.ts +37 -0
- package/packages/core/index.ts +4 -0
- package/packages/core/subscriber.ts +165 -0
- package/packages/core/types.ts +15 -0
- package/packages/core/use.ts +57 -0
- package/packages/core/utils/__tests__/context.test.ts +198 -0
- package/packages/core/utils/__tests__/is.test.ts +74 -0
- package/packages/core/utils/__tests__/shallow.test.ts +418 -0
- package/packages/core/utils/__tests__/sub-memo.test.ts +13 -0
- package/packages/core/utils/common.ts +48 -0
- package/packages/core/utils/create-context.ts +60 -0
- package/packages/core/utils/create-emitter.ts +55 -0
- package/packages/core/utils/global-scheduler.ts +75 -0
- package/packages/core/utils/is.ts +50 -0
- package/packages/core/utils/scheduler.ts +59 -0
- package/{src → packages/core/utils}/shallow.ts +3 -6
- package/packages/core/utils/sub-memo.ts +49 -0
- package/types/__tests__/test-utils.d.ts +20 -0
- package/types/create.d.ts +21 -21
- package/types/debug/development-tools.d.ts +10 -0
- package/types/index.d.ts +2 -4
- package/types/subscriber.d.ts +25 -0
- package/types/types.d.ts +9 -65
- package/types/use.d.ts +2 -0
- package/types/utils/common.d.ts +15 -0
- package/types/utils/create-context.d.ts +5 -0
- package/types/utils/create-emitter.d.ts +20 -0
- package/types/utils/global-scheduler.d.ts +5 -0
- package/types/utils/is.d.ts +13 -0
- package/types/utils/scheduler.d.ts +8 -0
- package/types/utils/sub-memo.d.ts +7 -0
- package/esm/common.js +0 -1
- package/esm/create-base-state.js +0 -1
- package/esm/create-emitter.js +0 -1
- package/esm/create-getter-state.js +0 -1
- package/esm/is.js +0 -1
- package/esm/merge.js +0 -1
- package/esm/select.js +0 -1
- package/esm/shallow.js +0 -1
- package/esm/use-state-value.js +0 -1
- package/src/common.ts +0 -28
- package/src/create-base-state.ts +0 -35
- package/src/create-emitter.ts +0 -24
- package/src/create-getter-state.ts +0 -19
- package/src/create.ts +0 -102
- package/src/index.ts +0 -6
- package/src/is.ts +0 -36
- package/src/merge.ts +0 -41
- package/src/select.ts +0 -33
- package/src/state.test.tsx +0 -647
- package/src/types.ts +0 -94
- package/src/use-state-value.ts +0 -29
- package/types/common.d.ts +0 -7
- package/types/create-base-state.d.ts +0 -10
- package/types/create-emitter.d.ts +0 -7
- package/types/create-getter-state.d.ts +0 -6
- package/types/is.d.ts +0 -10
- package/types/merge.d.ts +0 -2
- package/types/select.d.ts +0 -2
- package/types/use-state-value.d.ts +0 -10
- /package/types/{shallow.d.ts → utils/shallow.d.ts} +0 -0
package/src/create-emitter.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
export type EmitterSubscribe<P = undefined> = (listener: (...params: P[]) => void) => () => void
|
|
2
|
-
export interface Emitter<T, R = T, P = undefined> {
|
|
3
|
-
subscribe: EmitterSubscribe<P>
|
|
4
|
-
getSnapshot: () => R
|
|
5
|
-
emit: (...params: P[]) => void
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export function createEmitter<T, R = T, P = undefined>(getSnapshot: () => R): Emitter<T, R, P> {
|
|
9
|
-
const listeners = new Set<(...params: P[]) => void>()
|
|
10
|
-
return {
|
|
11
|
-
subscribe: (listener) => {
|
|
12
|
-
listeners.add(listener)
|
|
13
|
-
return () => {
|
|
14
|
-
listeners.delete(listener)
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
emit: (...params) => {
|
|
18
|
-
for (const listener of listeners) {
|
|
19
|
-
listener(...params)
|
|
20
|
-
}
|
|
21
|
-
},
|
|
22
|
-
getSnapshot,
|
|
23
|
-
}
|
|
24
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { BaseState, GetterState } from './types'
|
|
2
|
-
import { useStateValue } from './use-state-value'
|
|
3
|
-
|
|
4
|
-
interface Options<T> {
|
|
5
|
-
readonly baseState: BaseState<T>
|
|
6
|
-
}
|
|
7
|
-
export function createGetterState<T>(options: Options<T>): GetterState<T> {
|
|
8
|
-
const { baseState } = options
|
|
9
|
-
const useSliceState: GetterState<T> = (useSelector, isEqualHook) => {
|
|
10
|
-
return useStateValue(useSliceState, useSelector, isEqualHook)
|
|
11
|
-
}
|
|
12
|
-
useSliceState.__internal = baseState.__internal
|
|
13
|
-
useSliceState.getState = baseState.getState
|
|
14
|
-
useSliceState.reset = baseState.reset
|
|
15
|
-
useSliceState.select = baseState.select
|
|
16
|
-
useSliceState.merge = baseState.merge
|
|
17
|
-
useSliceState.subscribe = baseState.subscribe
|
|
18
|
-
return useSliceState
|
|
19
|
-
}
|
package/src/create.ts
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { createEmitter } from './create-emitter'
|
|
2
|
-
import type { SetValue, SetterState, StateDataInternal, DefaultValue, GetterState, IsEqual, UpdateValue } from './types'
|
|
3
|
-
import { getDefaultValue } from './types'
|
|
4
|
-
import { isEqualBase, isObject, isPromise, isSetValueFunction } from './is'
|
|
5
|
-
import { createBaseState } from './create-base-state'
|
|
6
|
-
import { createGetterState } from './create-getter-state'
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Creates a basic atom state.
|
|
10
|
-
* @param defaultValue - The initial state value.
|
|
11
|
-
* @param options - Optional settings for the state (e.g., isEqual, onSet).
|
|
12
|
-
* @returns A state object that can be used as a hook and provides state management methods.
|
|
13
|
-
* @example
|
|
14
|
-
* ```typescript
|
|
15
|
-
* // Global scope
|
|
16
|
-
* const counterState = state(0);
|
|
17
|
-
* const userState = state({ name: 'John', age: 20 });
|
|
18
|
-
*
|
|
19
|
-
* // React component
|
|
20
|
-
* const counter = counterState(); // Use as a hook
|
|
21
|
-
* const user = userState();
|
|
22
|
-
*
|
|
23
|
-
* // Access partial data from the state using slice
|
|
24
|
-
* const userAge = userState.slice((state) => state.age)();
|
|
25
|
-
* ```
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
export function create<T>(defaultValue: DefaultValue<T>, isEqual: IsEqual<T> = isEqualBase): SetterState<Awaited<T>> {
|
|
29
|
-
function resolveSetter(value: T, stateSetter: SetValue<T>): T {
|
|
30
|
-
if (isSetValueFunction(stateSetter)) {
|
|
31
|
-
return stateSetter(value)
|
|
32
|
-
}
|
|
33
|
-
return stateSetter
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const stateData: StateDataInternal<T> = {
|
|
37
|
-
updateVersion: 0,
|
|
38
|
-
value: undefined,
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function getValue(): T {
|
|
42
|
-
if (stateData.value === undefined) {
|
|
43
|
-
stateData.value = getDefaultValue(defaultValue)
|
|
44
|
-
}
|
|
45
|
-
return stateData.value
|
|
46
|
-
}
|
|
47
|
-
function get(): T {
|
|
48
|
-
const stateValue = getValue()
|
|
49
|
-
if (isPromise(stateValue)) {
|
|
50
|
-
stateValue.then((data) => {
|
|
51
|
-
stateData.value = data as Awaited<T>
|
|
52
|
-
emitter.emit()
|
|
53
|
-
})
|
|
54
|
-
}
|
|
55
|
-
return stateValue
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function set(stateValue: SetValue<T>) {
|
|
59
|
-
const stateValueData = getValue()
|
|
60
|
-
const newState = resolveSetter(stateValueData, stateValue)
|
|
61
|
-
const isEqualResult = isEqual?.(stateValueData, newState)
|
|
62
|
-
if (isEqualResult || newState === stateValueData) {
|
|
63
|
-
return
|
|
64
|
-
}
|
|
65
|
-
stateData.updateVersion++
|
|
66
|
-
stateData.value = newState
|
|
67
|
-
emitter.emit()
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function update(stateValue: UpdateValue<T>) {
|
|
71
|
-
if (isObject(stateValue)) {
|
|
72
|
-
return set((previousState) => {
|
|
73
|
-
return { ...previousState, ...stateValue }
|
|
74
|
-
})
|
|
75
|
-
}
|
|
76
|
-
set(stateValue as T)
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const emitter = createEmitter<T>(get)
|
|
80
|
-
|
|
81
|
-
const baseState = createBaseState({
|
|
82
|
-
emitter,
|
|
83
|
-
getGetterState: () => setterState,
|
|
84
|
-
getState: get,
|
|
85
|
-
reset() {
|
|
86
|
-
const value = getDefaultValue(defaultValue)
|
|
87
|
-
if (isPromise(value)) {
|
|
88
|
-
value.then((data) => {
|
|
89
|
-
set(data as T)
|
|
90
|
-
})
|
|
91
|
-
return
|
|
92
|
-
}
|
|
93
|
-
set(value)
|
|
94
|
-
},
|
|
95
|
-
})
|
|
96
|
-
|
|
97
|
-
const getterState: GetterState<T> = createGetterState<T>({ baseState })
|
|
98
|
-
const setterState: SetterState<T> = getterState as SetterState<T>
|
|
99
|
-
setterState.setState = set
|
|
100
|
-
setterState.updateState = update
|
|
101
|
-
return setterState as SetterState<Awaited<T>>
|
|
102
|
-
}
|
package/src/index.ts
DELETED
package/src/is.ts
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import type { Ref, Setter, SetValue } from './types'
|
|
2
|
-
|
|
3
|
-
export function isPromise(value: unknown): value is Promise<unknown> {
|
|
4
|
-
return value instanceof Promise
|
|
5
|
-
}
|
|
6
|
-
export function isFunction(value: unknown): value is (...args: unknown[]) => unknown {
|
|
7
|
-
return typeof value === 'function'
|
|
8
|
-
}
|
|
9
|
-
export function isSetValueFunction<T>(value: SetValue<T>): value is Setter<T> {
|
|
10
|
-
return typeof value === 'function'
|
|
11
|
-
}
|
|
12
|
-
export function isObject(value: unknown): value is Record<string, unknown> {
|
|
13
|
-
return typeof value === 'object' && value !== null
|
|
14
|
-
}
|
|
15
|
-
export function isRef<T>(value: unknown): value is Ref<T> {
|
|
16
|
-
return isObject(value) && value.isRef === true
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export function isMap(value: unknown): value is Map<unknown, unknown> {
|
|
20
|
-
return value instanceof Map
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export function isSet(value: unknown): value is Set<unknown> {
|
|
24
|
-
return value instanceof Set
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export function isArray(value: unknown): value is Array<unknown> {
|
|
28
|
-
return Array.isArray(value)
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export function isEqualBase<T>(valueA: T, valueB: T): boolean {
|
|
32
|
-
if (valueA === valueB) {
|
|
33
|
-
return true
|
|
34
|
-
}
|
|
35
|
-
return !!Object.is(valueA, valueB)
|
|
36
|
-
}
|
package/src/merge.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { createBaseState } from './create-base-state'
|
|
2
|
-
import { createEmitter } from './create-emitter'
|
|
3
|
-
import { createGetterState } from './create-getter-state'
|
|
4
|
-
import { isEqualBase } from './is'
|
|
5
|
-
import type { IsEqual, GetterState } from './types'
|
|
6
|
-
|
|
7
|
-
export function merge<T1, T2, S>(
|
|
8
|
-
state1: GetterState<T1>,
|
|
9
|
-
state2: GetterState<T2>,
|
|
10
|
-
selector: (value1: T1, value2: T2) => S,
|
|
11
|
-
isEqual: IsEqual<S> = isEqualBase,
|
|
12
|
-
): GetterState<S> {
|
|
13
|
-
let previousData: S | undefined
|
|
14
|
-
const emitter = createEmitter(() => {
|
|
15
|
-
const data = selector(state1.getState(), state2.getState())
|
|
16
|
-
if (previousData !== undefined && isEqual(previousData, data)) {
|
|
17
|
-
return previousData
|
|
18
|
-
}
|
|
19
|
-
previousData = data
|
|
20
|
-
return data
|
|
21
|
-
})
|
|
22
|
-
state1.__internal.emitter.subscribe(() => {
|
|
23
|
-
emitter.emit()
|
|
24
|
-
})
|
|
25
|
-
state2.__internal.emitter.subscribe(() => {
|
|
26
|
-
emitter.emit()
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
const baseState = createBaseState<S>({
|
|
30
|
-
emitter,
|
|
31
|
-
getGetterState: () => getterState,
|
|
32
|
-
getState: () => selector(state1.getState(), state2.getState()),
|
|
33
|
-
reset() {
|
|
34
|
-
state1.reset()
|
|
35
|
-
state2.reset()
|
|
36
|
-
},
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
const getterState: GetterState<S> = createGetterState<S>({ baseState })
|
|
40
|
-
return getterState
|
|
41
|
-
}
|
package/src/select.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { createBaseState } from './create-base-state'
|
|
2
|
-
import { createEmitter } from './create-emitter'
|
|
3
|
-
import { createGetterState } from './create-getter-state'
|
|
4
|
-
import { isEqualBase } from './is'
|
|
5
|
-
import type { IsEqual, GetterState } from './types'
|
|
6
|
-
|
|
7
|
-
export function select<T, S>(
|
|
8
|
-
state: GetterState<T>,
|
|
9
|
-
selector: (value: T) => S,
|
|
10
|
-
isEqual: IsEqual<S> = isEqualBase,
|
|
11
|
-
): GetterState<S> {
|
|
12
|
-
let previousData: S | undefined
|
|
13
|
-
const emitter = createEmitter(() => {
|
|
14
|
-
const data = selector(state.getState())
|
|
15
|
-
if (previousData !== undefined && isEqual(previousData, data)) {
|
|
16
|
-
return previousData
|
|
17
|
-
}
|
|
18
|
-
previousData = data
|
|
19
|
-
return data
|
|
20
|
-
})
|
|
21
|
-
state.__internal.emitter.subscribe(() => {
|
|
22
|
-
emitter.emit()
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
const baseState = createBaseState<S>({
|
|
26
|
-
emitter,
|
|
27
|
-
getGetterState: () => getterState,
|
|
28
|
-
getState: () => selector(state.getState()),
|
|
29
|
-
reset: state.reset,
|
|
30
|
-
})
|
|
31
|
-
const getterState: GetterState<S> = createGetterState<S>({ baseState })
|
|
32
|
-
return getterState
|
|
33
|
-
}
|