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.
Files changed (92) hide show
  1. package/README.md +202 -139
  2. package/cjs/index.js +1 -1
  3. package/esm/__tests__/create-async.test.js +1 -0
  4. package/esm/__tests__/test-utils.js +1 -0
  5. package/esm/create.js +1 -1
  6. package/esm/debug/development-tools.js +1 -0
  7. package/esm/index.js +1 -1
  8. package/esm/subscriber.js +1 -0
  9. package/esm/types.js +1 -1
  10. package/esm/use.js +1 -0
  11. package/esm/utils/__tests__/context.test.js +1 -0
  12. package/esm/utils/__tests__/is.test.js +1 -0
  13. package/esm/utils/__tests__/shallow.test.js +1 -0
  14. package/esm/utils/__tests__/sub-memo.test.js +1 -0
  15. package/esm/utils/common.js +1 -0
  16. package/esm/utils/create-context.js +1 -0
  17. package/esm/utils/create-emitter.js +1 -0
  18. package/esm/utils/global-scheduler.js +1 -0
  19. package/esm/utils/is.js +1 -0
  20. package/esm/utils/scheduler.js +1 -0
  21. package/esm/utils/shallow.js +1 -0
  22. package/esm/utils/sub-memo.js +1 -0
  23. package/package.json +1 -1
  24. package/packages/core/__tests__/bench.test.tsx +266 -0
  25. package/packages/core/__tests__/create-async.test.ts +88 -0
  26. package/packages/core/__tests__/create.test.tsx +107 -0
  27. package/packages/core/__tests__/subscriber.test.tsx +89 -0
  28. package/packages/core/__tests__/test-utils.ts +40 -0
  29. package/packages/core/__tests__/use-async.test.tsx +45 -0
  30. package/packages/core/__tests__/use.test.tsx +125 -0
  31. package/packages/core/create.ts +98 -0
  32. package/packages/core/debug/development-tools.ts +37 -0
  33. package/packages/core/index.ts +4 -0
  34. package/packages/core/subscriber.ts +165 -0
  35. package/packages/core/types.ts +15 -0
  36. package/packages/core/use.ts +57 -0
  37. package/packages/core/utils/__tests__/context.test.ts +198 -0
  38. package/packages/core/utils/__tests__/is.test.ts +74 -0
  39. package/packages/core/utils/__tests__/shallow.test.ts +418 -0
  40. package/packages/core/utils/__tests__/sub-memo.test.ts +13 -0
  41. package/packages/core/utils/common.ts +48 -0
  42. package/packages/core/utils/create-context.ts +60 -0
  43. package/packages/core/utils/create-emitter.ts +55 -0
  44. package/packages/core/utils/global-scheduler.ts +75 -0
  45. package/packages/core/utils/is.ts +50 -0
  46. package/packages/core/utils/scheduler.ts +59 -0
  47. package/{src → packages/core/utils}/shallow.ts +3 -6
  48. package/packages/core/utils/sub-memo.ts +49 -0
  49. package/types/__tests__/test-utils.d.ts +20 -0
  50. package/types/create.d.ts +21 -21
  51. package/types/debug/development-tools.d.ts +10 -0
  52. package/types/index.d.ts +2 -4
  53. package/types/subscriber.d.ts +25 -0
  54. package/types/types.d.ts +9 -65
  55. package/types/use.d.ts +2 -0
  56. package/types/utils/common.d.ts +15 -0
  57. package/types/utils/create-context.d.ts +5 -0
  58. package/types/utils/create-emitter.d.ts +20 -0
  59. package/types/utils/global-scheduler.d.ts +5 -0
  60. package/types/utils/is.d.ts +13 -0
  61. package/types/utils/scheduler.d.ts +8 -0
  62. package/types/utils/sub-memo.d.ts +7 -0
  63. package/esm/common.js +0 -1
  64. package/esm/create-base-state.js +0 -1
  65. package/esm/create-emitter.js +0 -1
  66. package/esm/create-getter-state.js +0 -1
  67. package/esm/is.js +0 -1
  68. package/esm/merge.js +0 -1
  69. package/esm/select.js +0 -1
  70. package/esm/shallow.js +0 -1
  71. package/esm/use-state-value.js +0 -1
  72. package/src/common.ts +0 -28
  73. package/src/create-base-state.ts +0 -35
  74. package/src/create-emitter.ts +0 -24
  75. package/src/create-getter-state.ts +0 -19
  76. package/src/create.ts +0 -102
  77. package/src/index.ts +0 -6
  78. package/src/is.ts +0 -36
  79. package/src/merge.ts +0 -41
  80. package/src/select.ts +0 -33
  81. package/src/state.test.tsx +0 -647
  82. package/src/types.ts +0 -94
  83. package/src/use-state-value.ts +0 -29
  84. package/types/common.d.ts +0 -7
  85. package/types/create-base-state.d.ts +0 -10
  86. package/types/create-emitter.d.ts +0 -7
  87. package/types/create-getter-state.d.ts +0 -6
  88. package/types/is.d.ts +0 -10
  89. package/types/merge.d.ts +0 -2
  90. package/types/select.d.ts +0 -2
  91. package/types/use-state-value.d.ts +0 -10
  92. /package/types/{shallow.d.ts → utils/shallow.d.ts} +0 -0
@@ -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
@@ -1,6 +0,0 @@
1
- export * from './types'
2
- export { create } from './create'
3
- export { select } from './select'
4
- export { merge } from './merge'
5
- export { useStateValue } from './use-state-value'
6
- export { shallow } from './shallow'
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
- }