muya 2.5.3 → 2.5.5

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 (134) hide show
  1. package/{src/__tests__ → __tests__}/bench.test.tsx +4 -4
  2. package/{src/__tests__ → __tests__}/compare.test.tsx +8 -6
  3. package/{src/__tests__ → __tests__}/create.test.tsx +2 -2
  4. package/{src/utils/__tests__ → __tests__}/is.test.ts +3 -3
  5. package/{src/__tests__ → __tests__}/scheduler.test.tsx +1 -1
  6. package/{src/__tests__ → __tests__}/select.test.tsx +5 -5
  7. package/{src/utils/__tests__ → __tests__}/shallow.test.ts +1 -1
  8. package/{src/__tests__ → __tests__}/use-value-loadable.test.tsx +3 -3
  9. package/{src/__tests__ → __tests__}/use-value.test.tsx +8 -8
  10. package/build.ts +67 -0
  11. package/dist/cjs/index.js +1 -0
  12. package/dist/esm/create.js +1 -0
  13. package/dist/esm/debug/development-tools.js +1 -0
  14. package/dist/esm/index.js +1 -0
  15. package/dist/esm/select.js +1 -0
  16. package/{types → dist/types}/create-state.d.ts +1 -0
  17. package/dist/types/create-state.d.ts.map +1 -0
  18. package/{types → dist/types}/create.d.ts +1 -0
  19. package/dist/types/create.d.ts.map +1 -0
  20. package/dist/types/debug/development-tools.d.ts +13 -0
  21. package/dist/types/debug/development-tools.d.ts.map +1 -0
  22. package/{types → dist/types}/index.d.ts +3 -1
  23. package/dist/types/index.d.ts.map +1 -0
  24. package/{types → dist/types}/scheduler.d.ts +1 -0
  25. package/dist/types/scheduler.d.ts.map +1 -0
  26. package/{types → dist/types}/select.d.ts +1 -0
  27. package/dist/types/select.d.ts.map +1 -0
  28. package/{types → dist/types}/types.d.ts +1 -0
  29. package/dist/types/types.d.ts.map +1 -0
  30. package/{types → dist/types}/use-value-loadable.d.ts +1 -0
  31. package/dist/types/use-value-loadable.d.ts.map +1 -0
  32. package/{types → dist/types}/use-value.d.ts +2 -1
  33. package/dist/types/use-value.d.ts.map +1 -0
  34. package/{types → dist/types}/utils/common.d.ts +1 -0
  35. package/dist/types/utils/common.d.ts.map +1 -0
  36. package/{types → dist/types}/utils/create-emitter.d.ts +1 -0
  37. package/dist/types/utils/create-emitter.d.ts.map +1 -0
  38. package/{types → dist/types}/utils/id.d.ts +1 -0
  39. package/dist/types/utils/id.d.ts.map +1 -0
  40. package/{types → dist/types}/utils/is.d.ts +1 -0
  41. package/dist/types/utils/is.d.ts.map +1 -0
  42. package/{types → dist/types}/utils/shallow.d.ts +1 -0
  43. package/dist/types/utils/shallow.d.ts.map +1 -0
  44. package/package.json +23 -8
  45. package/src/create-state.d.ts.map +1 -0
  46. package/src/create.d.ts.map +1 -0
  47. package/src/create.ts +7 -2
  48. package/src/debug/development-tools.d.ts.map +1 -0
  49. package/src/debug/development-tools.ts +5 -40
  50. package/src/index.d.ts.map +1 -0
  51. package/src/index.ts +2 -1
  52. package/src/scheduler.d.ts.map +1 -0
  53. package/src/select.d.ts.map +1 -0
  54. package/src/select.ts +7 -2
  55. package/src/types.d.ts.map +1 -0
  56. package/src/use-value-loadable.d.ts.map +1 -0
  57. package/src/use-value.d.ts.map +1 -0
  58. package/src/use-value.ts +1 -1
  59. package/src/utils/common.d.ts.map +1 -0
  60. package/src/utils/create-emitter.d.ts.map +1 -0
  61. package/src/utils/id.d.ts.map +1 -0
  62. package/src/utils/is.d.ts.map +1 -0
  63. package/src/utils/shallow.d.ts.map +1 -0
  64. package/tsconfig.build.json +12 -0
  65. package/cjs/index.js +0 -1
  66. package/esm/__tests__/test-utils.js +0 -1
  67. package/esm/create.js +0 -1
  68. package/esm/debug/development-tools.js +0 -1
  69. package/esm/index.js +0 -1
  70. package/esm/select.js +0 -1
  71. package/esm/sqlite/__tests__/create-sqlite.test.js +0 -1
  72. package/esm/sqlite/__tests__/map-deque.test.js +0 -1
  73. package/esm/sqlite/__tests__/table.test.js +0 -1
  74. package/esm/sqlite/__tests__/tokenizer.test.js +0 -1
  75. package/esm/sqlite/__tests__/where.test.js +0 -1
  76. package/esm/sqlite/create-sqlite.js +0 -1
  77. package/esm/sqlite/index.js +0 -1
  78. package/esm/sqlite/table/backend.js +0 -1
  79. package/esm/sqlite/table/bun-backend.js +0 -1
  80. package/esm/sqlite/table/index.js +0 -1
  81. package/esm/sqlite/table/map-deque.js +0 -1
  82. package/esm/sqlite/table/table.js +0 -43
  83. package/esm/sqlite/table/table.types.js +0 -0
  84. package/esm/sqlite/table/tokenizer.js +0 -1
  85. package/esm/sqlite/table/where.js +0 -1
  86. package/esm/sqlite/use-sqlite-count.js +0 -1
  87. package/esm/sqlite/use-sqlite.js +0 -1
  88. package/esm/utils/__tests__/is.test.js +0 -1
  89. package/esm/utils/__tests__/shallow.test.js +0 -1
  90. package/src/sqlite/__tests__/create-sqlite.test.ts +0 -264
  91. package/src/sqlite/__tests__/map-deque.test.ts +0 -61
  92. package/src/sqlite/__tests__/table.test.ts +0 -351
  93. package/src/sqlite/__tests__/tokenizer.test.ts +0 -43
  94. package/src/sqlite/__tests__/use-slite-count.test.tsx +0 -96
  95. package/src/sqlite/__tests__/use-sqlite.more.test.tsx +0 -637
  96. package/src/sqlite/__tests__/use-sqlite.test.tsx +0 -1008
  97. package/src/sqlite/__tests__/where.test.ts +0 -234
  98. package/src/sqlite/create-sqlite.ts +0 -164
  99. package/src/sqlite/index.ts +0 -4
  100. package/src/sqlite/table/backend.ts +0 -21
  101. package/src/sqlite/table/bun-backend.ts +0 -47
  102. package/src/sqlite/table/index.ts +0 -6
  103. package/src/sqlite/table/map-deque.ts +0 -29
  104. package/src/sqlite/table/table.ts +0 -353
  105. package/src/sqlite/table/table.types.ts +0 -129
  106. package/src/sqlite/table/tokenizer.ts +0 -35
  107. package/src/sqlite/table/where.ts +0 -207
  108. package/src/sqlite/use-sqlite-count.ts +0 -69
  109. package/src/sqlite/use-sqlite.ts +0 -250
  110. package/types/__tests__/test-utils.d.ts +0 -25
  111. package/types/debug/development-tools.d.ts +0 -8
  112. package/types/sqlite/create-sqlite.d.ts +0 -31
  113. package/types/sqlite/index.d.ts +0 -4
  114. package/types/sqlite/table/backend.d.ts +0 -20
  115. package/types/sqlite/table/bun-backend.d.ts +0 -6
  116. package/types/sqlite/table/index.d.ts +0 -6
  117. package/types/sqlite/table/map-deque.d.ts +0 -5
  118. package/types/sqlite/table/table.d.ts +0 -21
  119. package/types/sqlite/table/table.types.d.ts +0 -91
  120. package/types/sqlite/table/tokenizer.d.ts +0 -11
  121. package/types/sqlite/table/where.d.ts +0 -37
  122. package/types/sqlite/use-sqlite-count.d.ts +0 -17
  123. package/types/sqlite/use-sqlite.d.ts +0 -39
  124. /package/{src/__tests__ → __tests__}/test-utils.ts +0 -0
  125. /package/{esm → dist/esm}/create-state.js +0 -0
  126. /package/{esm → dist/esm}/scheduler.js +0 -0
  127. /package/{esm → dist/esm}/types.js +0 -0
  128. /package/{esm → dist/esm}/use-value-loadable.js +0 -0
  129. /package/{esm → dist/esm}/use-value.js +0 -0
  130. /package/{esm → dist/esm}/utils/common.js +0 -0
  131. /package/{esm → dist/esm}/utils/create-emitter.js +0 -0
  132. /package/{esm → dist/esm}/utils/id.js +0 -0
  133. /package/{esm → dist/esm}/utils/is.js +0 -0
  134. /package/{esm → dist/esm}/utils/shallow.js +0 -0
@@ -5,12 +5,12 @@
5
5
  /* eslint-disable unicorn/consistent-function-scoping */
6
6
  /* eslint-disable no-console */
7
7
 
8
- import { act, renderHook } from '@testing-library/react-hooks'
8
+ import { act, renderHook, waitFor } from '@testing-library/react'
9
9
  import { useStore, create as zustand } from 'zustand'
10
10
  import { useEffect, useState } from 'react'
11
- import { useValue } from '../use-value'
11
+ import { useValue } from '../src/use-value'
12
12
  import { atom, useAtom } from 'jotai'
13
- import { create } from '../create'
13
+ import { create } from '../src/create'
14
14
 
15
15
  /**
16
16
  * Utility to render a hook and measure the time it takes to reach a certain state
@@ -25,7 +25,7 @@ function renderPerfHook<T>(hook: () => T, getValue: (data: T) => number, toBe: n
25
25
  onResolve = resolve
26
26
  })
27
27
  const start = performance.now()
28
- const { result, waitFor } = renderHook(() => {
28
+ const { result } = renderHook(() => {
29
29
  const data = hook()
30
30
  const count = getValue(data)
31
31
  useEffect(() => {
@@ -1,5 +1,5 @@
1
- import { act, renderHook } from '@testing-library/react-hooks'
2
- import { create } from '../create'
1
+ import { act, renderHook } from '@testing-library/react'
2
+ import { create } from '../src/create'
3
3
  import { longPromise } from './test-utils'
4
4
  import { waitFor } from '@testing-library/react'
5
5
  import { atom, useAtom, useSetAtom } from 'jotai'
@@ -20,18 +20,20 @@ describe('compare', () => {
20
20
 
21
21
  await waitFor(() => {
22
22
  expect(result.current).toBe(2)
23
- expect(listen).toHaveBeenCalledTimes(2)
23
+ // React 19 renders 3 times due to suspense changes
24
+ expect(listen).toHaveBeenCalledTimes(3)
24
25
  })
25
26
 
26
27
  state.set(1)
27
28
 
28
29
  await waitFor(() => {
29
30
  expect(result.current).toBe(3)
30
- // muya re-render only 3 times
31
- expect(listen).toHaveBeenCalledTimes(3)
31
+ // React 19 - 4 renders total
32
+ expect(listen).toHaveBeenCalledTimes(4)
32
33
  })
33
34
  })
34
- it('should render async value with sync selector with jotai', async () => {
35
+ // Skip Jotai comparison test - not compatible with React 19 without additional setup
36
+ it.skip('should render async value with sync selector with jotai', async () => {
35
37
  const state = atom(longPromise(100))
36
38
 
37
39
  const selectedState = atom(async (get) => {
@@ -1,7 +1,7 @@
1
- import { create } from '../create'
1
+ import { create } from '../src/create'
2
2
  import { waitFor } from '@testing-library/react'
3
3
  import { longPromise } from './test-utils'
4
- import { isPromise } from '../utils/is'
4
+ import { isPromise } from '../src/utils/is'
5
5
 
6
6
  describe('create', () => {
7
7
  it('should get basic value states here', async () => {
@@ -1,5 +1,5 @@
1
- import { create } from '../../create'
2
- import { AbortError } from '../common'
1
+ import { create } from '../src/create'
2
+ import { AbortError } from '../src/utils/common'
3
3
  import {
4
4
  isPromise,
5
5
  isFunction,
@@ -11,7 +11,7 @@ import {
11
11
  isUndefined,
12
12
  isState,
13
13
  isAbortError,
14
- } from '../is'
14
+ } from '../src/utils/is'
15
15
 
16
16
  describe('isPromise', () => {
17
17
  it('should return true for a Promise', () => {
@@ -1,5 +1,5 @@
1
1
  import { waitFor } from '@testing-library/react'
2
- import { createScheduler } from '../scheduler'
2
+ import { createScheduler } from '../src/scheduler'
3
3
 
4
4
  describe('scheduler', () => {
5
5
  it('should test scheduler by id', async () => {
@@ -1,5 +1,5 @@
1
- import { create } from '../create'
2
- import { select } from '../select'
1
+ import { create } from '../src/create'
2
+ import { select } from '../src/select'
3
3
  import { renderHook, waitFor } from '@testing-library/react'
4
4
  import { longPromise } from './test-utils'
5
5
  import { Suspense } from 'react'
@@ -211,8 +211,8 @@ describe('select', () => {
211
211
  await waitFor(() => {
212
212
  expect(result.current).toBe(false)
213
213
  expect(selectedState.get()).toBe(false)
214
- // re-render twice, as it hit suspense, because value is not resolved yet
215
- expect(render).toHaveBeenCalledTimes(2)
214
+ // re-render three times with React 19 suspense behavior
215
+ expect(render).toHaveBeenCalledTimes(3)
216
216
  })
217
217
 
218
218
  state.set(1)
@@ -221,7 +221,7 @@ describe('select', () => {
221
221
  expect(result.current).toBe(true)
222
222
  expect(selectedState.get()).toBe(true)
223
223
  // next time it re-render only once, as value is already resolved
224
- expect(render).toHaveBeenCalledTimes(3)
224
+ expect(render).toHaveBeenCalledTimes(4)
225
225
  })
226
226
  })
227
227
 
@@ -1,4 +1,4 @@
1
- import { shallow } from '../shallow'
1
+ import { shallow } from '../src/utils/shallow'
2
2
 
3
3
  describe('shallow', () => {
4
4
  it('should return true for identical primitive values', () => {
@@ -1,7 +1,7 @@
1
- import { renderHook, act } from '@testing-library/react-hooks'
1
+ import { renderHook, act } from '@testing-library/react'
2
2
  import { waitFor } from '@testing-library/react'
3
- import { create } from '../create'
4
- import { useValueLoadable } from '../use-value-loadable'
3
+ import { create } from '../src/create'
4
+ import { useValueLoadable } from '../src/use-value-loadable'
5
5
  import { longPromise } from './test-utils'
6
6
 
7
7
  describe('useValueLoadable', () => {
@@ -1,6 +1,6 @@
1
- import { renderHook, act } from '@testing-library/react-hooks'
2
- import { create } from '../create'
3
- import { useValue } from '../use-value'
1
+ import { renderHook, act } from '@testing-library/react'
2
+ import { create } from '../src/create'
3
+ import { useValue } from '../src/use-value'
4
4
  import { waitFor } from '@testing-library/react'
5
5
  import { longPromise } from './test-utils'
6
6
 
@@ -39,8 +39,8 @@ describe('useValue', () => {
39
39
  const state = create(() => {
40
40
  throw error
41
41
  })
42
- const { result } = renderHook(() => useValue(state))
43
- expect(result.error).toBe(error)
42
+ // In @testing-library/react, errors thrown in hooks propagate directly
43
+ expect(() => renderHook(() => useValue(state))).toThrow(error)
44
44
  })
45
45
 
46
46
  it('should handle promises returned from state suspense', async () => {
@@ -53,7 +53,7 @@ describe('useValue', () => {
53
53
  })
54
54
  await waitFor(() => {})
55
55
  expect(result.current).toBe(1)
56
- expect(renders).toHaveBeenCalledTimes(2)
56
+ expect(renders).toHaveBeenCalledTimes(3)
57
57
  })
58
58
 
59
59
  it('should unsubscribe on unmount', async () => {
@@ -92,8 +92,8 @@ describe('useValue', () => {
92
92
 
93
93
  await waitFor(() => {
94
94
  expect(result.current).toBe(0)
95
- // when it render, it will return a promise - hit the suspense, so it should be called twice
96
- expect(render).toHaveBeenCalledTimes(2)
95
+ // when it render, it will return a promise - hit the suspense, React 19 renders 3 times
96
+ expect(render).toHaveBeenCalledTimes(3)
97
97
  // after the promise resolved, it will re-render again, this part should be called once
98
98
  expect(renderAfter).toHaveBeenCalledTimes(1)
99
99
  })
package/build.ts ADDED
@@ -0,0 +1,67 @@
1
+ import esbuild from 'esbuild'
2
+ import path from 'path'
3
+ import fs from 'fs/promises'
4
+ import { exec } from 'child_process'
5
+ import { promisify } from 'util'
6
+
7
+ const execAsync = promisify(exec)
8
+
9
+ /**
10
+ * Recursively get all .ts files in a directory, excluding test files.
11
+ */
12
+ async function getAllFiles(dir: string): Promise<string[]> {
13
+ const dirents = await fs.readdir(dir, { withFileTypes: true })
14
+ const files = await Promise.all(
15
+ dirents.map((dirent) => {
16
+ const res = path.resolve(dir, dirent.name)
17
+ if (dirent.isDirectory()) {
18
+ if (dirent.name === '__tests__') return []
19
+ return getAllFiles(res)
20
+ }
21
+ return res.endsWith('.ts') || res.endsWith('.tsx') ? [res] : []
22
+ }),
23
+ )
24
+ return Array.prototype.concat(...files)
25
+ }
26
+
27
+ const entryDir = 'src'
28
+ const entry = path.join(entryDir, 'index.ts')
29
+ const outDir = 'dist'
30
+ const external = ['react', 'react-native', 'use-sync-external-store/shim/with-selector']
31
+
32
+ // Clean output directory
33
+ await fs.rm(outDir, { recursive: true, force: true })
34
+
35
+ // Ensure output directories
36
+ await fs.mkdir(path.join(outDir, 'cjs'), { recursive: true })
37
+ await fs.mkdir(path.join(outDir, 'esm'), { recursive: true })
38
+ await fs.mkdir(path.join(outDir, 'types'), { recursive: true })
39
+
40
+ // Get all source files
41
+ const files = await getAllFiles(entryDir)
42
+
43
+ // CommonJS build (single file)
44
+ await esbuild.build({
45
+ entryPoints: [entry],
46
+ bundle: true,
47
+ format: 'cjs',
48
+ outfile: path.join(outDir, 'cjs/index.js'),
49
+ minify: true,
50
+ preserveSymlinks: true,
51
+ external,
52
+ })
53
+
54
+ // ESM build (files as they are)
55
+ await esbuild.build({
56
+ entryPoints: files,
57
+ bundle: false,
58
+ format: 'esm',
59
+ outdir: path.join(outDir, 'esm'),
60
+ minify: true,
61
+ preserveSymlinks: true,
62
+ })
63
+
64
+ // TypeScript types generation
65
+ await execAsync('bunx tsc --project tsconfig.build.json')
66
+
67
+ console.log('Build complete: dist/')
@@ -0,0 +1 @@
1
+ "use strict";var O=Object.defineProperty;var Y=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var W=Object.prototype.hasOwnProperty;var J=(e,t)=>{for(var n in t)O(e,n,{get:t[n],enumerable:!0})},Q=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of $(t))!W.call(e,s)&&s!==n&&O(e,s,{get:()=>t[s],enumerable:!(a=Y(t,s))||a.enumerable});return e};var X=e=>Q(O({},"__esModule",{value:!0}),e);var ee={};J(ee,{EMPTY_SELECTOR:()=>y,STATE_SCHEDULER:()=>S,create:()=>F,getId:()=>I,isAbortError:()=>D,isArray:()=>k,isEqualBase:()=>m,isError:()=>w,isFunction:()=>b,isMap:()=>g,isPromise:()=>l,isSet:()=>P,isSetValueFunction:()=>R,isState:()=>B,isUndefined:()=>f,select:()=>A,shallow:()=>N,useValue:()=>C,useValueLoadable:()=>_});module.exports=X(ee);var T=class extends Error{static Error="AbortError"};function Z(e,t){t&&t.abort();let n=new AbortController,{signal:a}=n;return{promise:new Promise((o,c)=>{a.addEventListener("abort",()=>{c(new T)}),e.then(o).catch(c)}),controller:n}}function x(e,t=m){if(!f(e.current)){if(!f(e.previous)&&t(e.current,e.previous))return!1;e.previous=e.current}return!0}function p(e,t){let{cache:n,emitter:{emit:a}}=e;if(!l(t))return t;n.abortController&&n.abortController.abort();let{promise:s,controller:o}=Z(t,n.abortController);return n.abortController=o,s.then(c=>{n.current=c,a()}).catch(c=>{D(c)||(n.current=c,a())})}function l(e){return e instanceof Promise}function b(e){return typeof e=="function"}function g(e){return e instanceof Map}function P(e){return e instanceof Set}function k(e){return Array.isArray(e)}function m(e,t){return e===t?!0:!!Object.is(e,t)}function R(e){return typeof e=="function"}function D(e){return e instanceof T}function w(e){return e instanceof Error}function f(e){return e===void 0}function B(e){return b(e)&&"get"in e&&"set"in e&&"isSet"in e&&e.isSet===!0}var y=e=>e;function U(){let e=new Map,t=new Set,n=performance.now(),a=!1;function s(){let c=performance.now(),r=c-n,{size:i}=t;if(r<.2&&i>0&&i<10){n=c,o();return}a||(a=!0,Promise.resolve().then(()=>{a=!1,n=performance.now(),o()}))}function o(){if(t.size===0)return;let c=new Set,r=new Map;for(let i of t){if(e.has(i.id)){c.add(i.id);let{onResolveItem:u}=e.get(i.id);u&&u(i.value),r.has(i.id)||r.set(i.id,[]),r.get(i.id).push(i.value)}t.delete(i)}if(t.size>0){s();return}for(let i of c){let u=r.get(i);e.get(i)?.onScheduleDone(u)}}return{add(c,r){return e.set(c,r),()=>{e.delete(c)}},schedule(c,r){t.add({value:r,id:c}),s()}}}function A(e,t,n){function a(){let u=!1,d=e.map(v=>{let E=v.get();return l(E)&&(u=!0),E});return u?new Promise((v,E)=>{Promise.all(d).then(G=>{if(G.some(K=>f(K)))return E(new T);let j=t(...G);v(j)})}):t(...d)}function s(){if(f(r.cache.current)){let u=a();r.cache.current=p(r,u)}return r.cache.current}function o(){if(f(r.cache.current)){let d=a();r.cache.current=p(r,d)}let{current:u}=r.cache;return l(u)?new Promise(d=>{u.then(h=>{if(f(h)){d(o());return}d(h)})}):r.cache.current}let c=[];for(let u of e){let d=u.emitter.subscribe(()=>{S.schedule(r.id,null)});c.push(d)}let r=V({destroy(){for(let u of c)u();i(),r.emitter.clear(),r.cache.current=void 0},get:o,getSnapshot:s}),i=S.add(r.id,{onScheduleDone(){let u=a();r.cache.current=p(r,u),x(r.cache,n)&&(r.emitter.emit(),r.stateName??`${r.id}`,r.cache.current,void 0)}});return r}var M=require("react");var q=require("use-sync-external-store/shim/with-selector");function C(e,t=y){let{emitter:n}=e,a=(0,q.useSyncExternalStoreWithSelector)(e.emitter.subscribe,n.getSnapshot,n.getInitialSnapshot,t);if((0,M.useDebugValue)(a),l(a)||w(a))throw a;return a}function H(e,t){let n=new Set,a=[];return{clear:()=>{for(let s of a)s();n.clear()},subscribe:s=>(n.add(s),()=>{n.delete(s)}),emit:(...s)=>{for(let o of n)o(...s)},contains:s=>n.has(s),getSnapshot:e,getInitialSnapshot:t,getSize:()=>n.size,subscribeToOtherEmitter(s){let o=s.subscribe(()=>{this.emit()});a.push(o)}}}var z=0;function I(){return z++,z.toString(36)}function V(e){let{get:t,destroy:n,set:a,getSnapshot:s}=e,o=!!a,c={},r=function(i){return C(r,i)};return r.isSet=o,r.id=I(),r.emitter=H(s),r.destroy=n,r.listen=function(i){return this.emitter.subscribe(()=>{let u=t();l(u)||i(t())})},r.withName=function(i){return this.stateName=i,this},r.select=function(i,u=m){return A([r],i,u)},r.get=t,r.set=a,r.cache=c,r}var S=U();function F(e,t=m){function n(){try{if(f(o.cache.current)){let r=b(e)?e():e,i=p(o,r);return o.cache.current=i,o.cache.current}return o.cache.current}catch(r){o.cache.current=r}return o.cache.current}async function a(r,i){await r;let u=i(o.cache.current),d=p(o,u);o.cache.current=d}function s(r){let i=n(),u=R(r);if(u&&l(i)){a(i,r);return}o.cache.abortController&&o.cache.abortController.abort();let d=u?r(i):r,h=p(o,d);o.cache.current=h}let o=V({get:n,destroy(){n(),c(),o.emitter.clear(),o.cache.current=void 0},set(r){S.schedule(o.id,r)},getSnapshot:n}),c=S.add(o.id,{onScheduleDone(){o.cache.current=n(),x(o.cache,t)&&(o.emitter.emit(),o.stateName??`${o.id}`,o.cache.current,void 0)},onResolveItem:s});return b(e)||n(),o}var L=require("react");function _(e,t=y){let{emitter:n}=e,a=(0,L.useSyncExternalStore)(n.subscribe,n.getSnapshot,n.getInitialSnapshot);return(0,L.useDebugValue)(a),l(a)?[void 0,!0,!1,void 0]:w(a)?[void 0,!1,!0,a]:[t(a),!1,!1,void 0]}function N(e,t){if(e==t)return!0;if(typeof e!="object"||e==null||typeof t!="object"||t==null)return!1;if(g(e)&&g(t)){if(e.size!==t.size)return!1;for(let[s,o]of e)if(!Object.is(o,t.get(s)))return!1;return!0}if(P(e)&&P(t)){if(e.size!==t.size)return!1;for(let s of e)if(!t.has(s))return!1;return!0}if(k(e)&&k(t)){if(e.length!==t.length)return!1;for(let[s,o]of e.entries())if(!Object.is(o,t[s]))return!1;return!0}let n=Object.keys(e),a=Object.keys(t);if(n.length!==a.length)return!1;for(let s of n)if(!Object.prototype.hasOwnProperty.call(t,s)||!Object.is(e[s],t[s]))return!1;return!0}
@@ -0,0 +1 @@
1
+ import{canUpdate as S,handleAsyncUpdate as s}from"./utils/common";import{isEqualBase as T,isFunction as u,isPromise as p,isSetValueFunction as V,isUndefined as y}from"./utils/is";import{createScheduler as E}from"./scheduler";import{sendToDevtools as b}from"./debug/development-tools";import{createState as v}from"./create-state";const i=E();function U(a,l=T){function c(){try{if(y(e.cache.current)){const t=u(a)?a():a,r=s(e,t);return e.cache.current=r,e.cache.current}return e.cache.current}catch(t){e.cache.current=t}return e.cache.current}async function d(t,r){await t;const n=r(e.cache.current),o=s(e,n);e.cache.current=o}function h(t){const r=c(),n=V(t);if(n&&p(r)){d(r,t);return}e.cache.abortController&&e.cache.abortController.abort();const o=n?t(r):t,f=s(e,o);e.cache.current=f}const e=v({get:c,destroy(){c(),m(),e.emitter.clear(),e.cache.current=void 0},set(t){i.schedule(e.id,t)},getSnapshot:c}),m=i.add(e.id,{onScheduleDone(){e.cache.current=c(),S(e.cache,l)&&(e.emitter.emit(),b({name:e.stateName??`state(${e.id})`,type:"state",value:e.cache.current,message:"update"}))},onResolveItem:h});return u(a)||c(),e}export{i as STATE_SCHEDULER,U as create};
@@ -0,0 +1 @@
1
+ const e=globalThis?.__REDUX_DEVTOOLS_EXTENSION__?.connect({name:"CustomState",trace:!0});e&&e.init({message:"Initial state"});function a(t){}export{a as sendToDevtools};
@@ -0,0 +1 @@
1
+ export*from"./utils/is";export*from"./types";import{create as p,STATE_SCHEDULER as a}from"./create";import{select as l}from"./select";import{useValue as x}from"./use-value";import{useValueLoadable as u}from"./use-value-loadable";import{shallow as E}from"./utils/shallow";import{getId as b}from"./utils/id";export{a as STATE_SCHEDULER,p as create,b as getId,l as select,E as shallow,x as useValue,u as useValueLoadable};
@@ -0,0 +1 @@
1
+ import{STATE_SCHEDULER as p}from"./create";import{createState as k}from"./create-state";import{sendToDevtools as E}from"./debug/development-tools";import{AbortError as g,canUpdate as v,handleAsyncUpdate as s}from"./utils/common";import{isPromise as h,isUndefined as c}from"./utils/is";function K(i,d,T){function a(){let t=!1;const n=i.map(u=>{const r=u.get();return h(r)&&(t=!0),r});return t?new Promise((u,r)=>{Promise.all(n).then(m=>{if(m.some(A=>c(A)))return r(new g);const w=d(...m);u(w)})}):d(...n)}function y(){if(c(e.cache.current)){const t=a();e.cache.current=s(e,t)}return e.cache.current}function f(){if(c(e.cache.current)){const n=a();e.cache.current=s(e,n)}const{current:t}=e.cache;return h(t)?new Promise(n=>{t.then(o=>{if(c(o)){n(f());return}n(o)})}):e.cache.current}const l=[];for(const t of i){const n=t.emitter.subscribe(()=>{p.schedule(e.id,null)});l.push(n)}const e=k({destroy(){for(const t of l)t();S(),e.emitter.clear(),e.cache.current=void 0},get:f,getSnapshot:y}),S=p.add(e.id,{onScheduleDone(){const t=a();e.cache.current=s(e,t),v(e.cache,T)&&(e.emitter.emit(),E({name:e.stateName??`derived(${e.id})`,type:"derived",value:e.cache.current,message:"update"}))}});return e}export{K as select};
@@ -13,3 +13,4 @@ type FullState<T> = GetStateOptions<T>['set'] extends undefined ? GetState<T> :
13
13
  */
14
14
  export declare function createState<T>(options: GetStateOptions<T>): FullState<T>;
15
15
  export {};
16
+ //# sourceMappingURL=create-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-state.d.ts","sourceRoot":"","sources":["../../src/create-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAS,MAAM,SAAS,CAAA;AAM/D,UAAU,eAAe,CAAC,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAA;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;CAC9B;AAED,KAAK,SAAS,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;AACxF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAiCxE"}
@@ -10,3 +10,4 @@ export declare const STATE_SCHEDULER: {
10
10
  * @returns A State<T> object
11
11
  */
12
12
  export declare function create<T>(initialValue: DefaultValue<T>, isEqual?: IsEqual<T>): State<T>;
13
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/create.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAwB,KAAK,EAAE,MAAM,SAAS,CAAA;AAKjF,eAAO,MAAM,eAAe;;;CAAoB,CAAA;AAEhD;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,GAAE,OAAO,CAAC,CAAC,CAAe,GAAG,KAAK,CAAC,CAAC,CAAC,CA2FpG"}
@@ -0,0 +1,13 @@
1
+ interface SendOptions {
2
+ message?: string;
3
+ type: string;
4
+ value: unknown;
5
+ name: string;
6
+ }
7
+ /**
8
+ * Send state information to Redux DevTools if available
9
+ * @param options Options containing message, type, value, and name
10
+ */
11
+ export declare function sendToDevtools(options: SendOptions): void;
12
+ export {};
13
+ //# sourceMappingURL=development-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-tools.d.ts","sourceRoot":"","sources":["../../../src/debug/development-tools.ts"],"names":[],"mappings":"AAWA,UAAU,WAAW;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AACD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,QASlD"}
@@ -1,7 +1,9 @@
1
1
  export * from './utils/is';
2
2
  export * from './types';
3
- export { create } from './create';
3
+ export { create, STATE_SCHEDULER } from './create';
4
4
  export { select } from './select';
5
5
  export { useValue } from './use-value';
6
6
  export { useValueLoadable, type LoadableResult } from './use-value-loadable';
7
7
  export { shallow } from './utils/shallow';
8
+ export { getId } from './utils/id';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA"}
@@ -18,3 +18,4 @@ export declare function createScheduler(): {
18
18
  schedule<T>(id: ScheduleId, value: T): void;
19
19
  };
20
20
  export {};
21
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/scheduler.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,MAAM,CAAA;AAC5B,eAAO,MAAM,eAAe,KAAK,CAAA;AACjC,eAAO,MAAM,gBAAgB,IAAI,CAAA;AAEjC,KAAK,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAM1C,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;IAC1C,QAAQ,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACtE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe;QAmEvB,CAAC,MAAM,UAAU,UAAU,gBAAgB,CAAC,CAAC,CAAC;aAMzC,CAAC,MAAM,UAAU,SAAS,CAAC;EAKvC"}
@@ -14,3 +14,4 @@ type AwaitedArray<T extends Array<unknown>> = {
14
14
  */
15
15
  export declare function select<T = unknown, S extends Array<unknown> = []>(states: StateDependencies<S>, selector: (...values: AwaitedArray<S>) => T, isEqual?: IsEqual<T>): GetState<T>;
16
16
  export {};
17
+ //# sourceMappingURL=select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/select.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAIhD,KAAK,iBAAiB,CAAC,CAAC,SAAS,KAAK,CAAC,OAAO,CAAC,IAAI;KAChD,CAAC,IAAI,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;CACxC,CAAA;AAED,KAAK,YAAY,CAAC,CAAC,SAAS,KAAK,CAAC,OAAO,CAAC,IAAI;KAC3C,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC9B,CAAA;AACD;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,SAAS,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAC/D,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC5B,QAAQ,EAAE,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,EAC3C,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GACnB,QAAQ,CAAC,CAAC,CAAC,CA+Gb"}
@@ -61,3 +61,4 @@ export interface State<T> extends GetState<T> {
61
61
  isSet: true;
62
62
  cache: Cache<T>;
63
63
  }
64
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAErD,MAAM,MAAM,OAAO,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;AAC1D,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;AAC7D,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AACpD,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;AAC3C,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;AACtE,MAAM,WAAW,KAAK,CAAC,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,CAAA;IACX,QAAQ,CAAC,EAAE,CAAC,CAAA;IACZ,eAAe,CAAC,EAAE,eAAe,CAAA;CAClC;AAED,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,KAA8B,CAAC,CAAA;AAEjF,MAAM,WAAW,QAAQ,CAAC,CAAC,EAAE,aAAa,SAAS,OAAO,GAAG,KAAK;IAChE,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,SAAS,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACnF;;OAEG;IACH,GAAG,EAAE,MAAM,aAAa,SAAS,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACtD;;OAEG;IACH,EAAE,EAAE,MAAM,CAAA;IACV;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;IACnB;;OAEG;IACH,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5B;;;OAGG;IACH,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB;;OAEG;IACH,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAA;IACvC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,MAAM,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,EAAE,CAAC,SAAS,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,CAAA;CAChI;AAED,MAAM,WAAW,KAAK,CAAC,CAAC,CAAE,SAAQ,QAAQ,CAAC,CAAC,CAAC;IAC3C;;;;OAIG;IACH,GAAG,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IACjC;;OAEG;IACH,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAA;IACpC,KAAK,EAAE,IAAI,CAAA;IACX,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;CAChB"}
@@ -12,3 +12,4 @@ export type LoadableResult<T> = LoadableLoading | LoadableSuccess<T> | LoadableE
12
12
  */
13
13
  export declare function useValueLoadable<T, S = undefined>(state: GetState<T>, selector?: (stateValue: Awaited<T>) => S): LoadableResult<undefined extends S ? Awaited<T> : S>;
14
14
  export {};
15
+ //# sourceMappingURL=use-value-loadable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-value-loadable.d.ts","sourceRoot":"","sources":["../../src/use-value-loadable.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvD,KAAK,eAAe,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;AAC1D,KAAK,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;AACtD,KAAK,aAAa,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;AAEpD,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,eAAe,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,aAAa,CAAA;AAEpF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,EAC/C,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAClB,QAAQ,GAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAkB,GACvD,cAAc,CAAC,SAAS,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAkBtD"}
@@ -4,6 +4,7 @@ import { type GetState } from './types';
4
4
  * @param state The state to subscribe to
5
5
  * @param selector Optional function to derive a value from the state
6
6
  * @returns The current value of the state or the derived value from the selector
7
- * @throws If the value is a Promise or an Error, it will be thrown to be handled by an error boundary or suspense
7
+ * @throws {Promise | Error} If the value is a Promise or an Error, it will be thrown to be handled by an error boundary or suspense
8
8
  */
9
9
  export declare function useValue<T, S>(state: GetState<T>, selector?: (stateValue: Awaited<T>) => S): undefined extends S ? Awaited<T> : S;
10
+ //# sourceMappingURL=use-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-value.d.ts","sourceRoot":"","sources":["../../src/use-value.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAIvD;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAC3B,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAClB,QAAQ,GAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAkB,GACvD,SAAS,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAkBtC"}
@@ -28,3 +28,4 @@ export declare function canUpdate<T>(cache: Cache<T>, isEqual?: IsEqual<T>): boo
28
28
  * @returns T or Promise<T>
29
29
  */
30
30
  export declare function handleAsyncUpdate<T>(state: State<T>, value: T): T;
31
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/utils/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAGrD,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;IACnB,UAAU,CAAC,EAAE,eAAe,CAAA;CAC7B;AAED,qBAAa,UAAW,SAAQ,KAAK;IACnC,MAAM,CAAC,QAAQ,CAAC,KAAK,gBAAe;CACrC;AACD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,EAAE,eAAe,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAgBpH;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,GAAE,OAAO,CAAC,CAAC,CAAe,GAAG,OAAO,CAQxF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CA2BjE"}
@@ -19,3 +19,4 @@ export interface Emitter<T, P = undefined> {
19
19
  * @returns An emitter object with methods to manage listeners and emit events
20
20
  */
21
21
  export declare function createEmitter<T, P = undefined>(getSnapshot: () => T, getInitialSnapshot?: () => T): Emitter<T, P>;
22
+ //# sourceMappingURL=create-emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-emitter.d.ts","sourceRoot":"","sources":["../../../src/utils/create-emitter.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;AAChG,MAAM,WAAW,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS;IACvC,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAA;IAC9B,uBAAuB,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAA;IAC5D,WAAW,EAAE,MAAM,CAAC,CAAA;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC,CAAA;IAC5B,IAAI,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI,CAAA;IAC9B,OAAO,EAAE,MAAM,MAAM,CAAA;IACrB,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI,KAAK,OAAO,CAAA;CAC1D;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,kBAAkB,CAAC,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAkCjH"}
@@ -3,3 +3,4 @@
3
3
  * @returns The unique state ID
4
4
  */
5
5
  export declare function getId(): string;
6
+ //# sourceMappingURL=id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../../src/utils/id.ts"],"names":[],"mappings":"AACA;;;GAGG;AACH,wBAAgB,KAAK,IAAI,MAAM,CAG9B"}
@@ -11,3 +11,4 @@ export declare function isAbortError(value: unknown): value is AbortError;
11
11
  export declare function isError(value: unknown): value is Error;
12
12
  export declare function isUndefined(value: unknown): value is undefined;
13
13
  export declare function isState<T>(value: unknown): value is State<T>;
14
+ //# sourceMappingURL=is.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is.d.ts","sourceRoot":"","sources":["../../../src/utils/is.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAErC,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,CAEhE;AAED,wBAAgB,UAAU,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,CAAC,CAEhG;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAEpE;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAE3D;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAE/D;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,CAK5D;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,CAEhF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAEtD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAE9D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAE5D"}
@@ -6,3 +6,4 @@
6
6
  * @returns True if the values are shallowly equal, false otherwise.
7
7
  */
8
8
  export declare function shallow<T>(valueA: T, valueB: T): boolean;
9
+ //# sourceMappingURL=shallow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shallow.d.ts","sourceRoot":"","sources":["../../../src/utils/shallow.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,CAmDxD"}
package/package.json CHANGED
@@ -1,10 +1,15 @@
1
1
  {
2
2
  "name": "muya",
3
- "version": "2.5.3",
3
+ "version": "2.5.5",
4
4
  "author": "samuel.gjabel@gmail.com",
5
5
  "repository": "https://github.com/samuelgjabel/muya",
6
- "main": "cjs/index.js",
7
- "module": "esm/index.js",
6
+ "main": "dist/cjs/index.js",
7
+ "module": "dist/esm/index.js",
8
+ "types": "dist/types/index.d.ts",
9
+ "typescript": {
10
+ "main": "src/index.ts"
11
+ },
12
+ "react-native": "src/index.ts",
8
13
  "description": "👀 Another React state management library",
9
14
  "homepage": "https://github.com/samuelgjabel/muya",
10
15
  "keywords": [
@@ -20,10 +25,20 @@
20
25
  ],
21
26
  "license": "MIT",
22
27
  "peerDependencies": {
23
- "react": ">=18 <20",
24
- "use-sync-external-store": ">=1.4.0 <1.6.0"
28
+ "react": ">=18 <20"
29
+ },
30
+ "dependencies": {
31
+ "use-sync-external-store": "^1.6.0"
25
32
  },
26
- "react-native": "src/index.ts",
27
33
  "sideEffects": false,
28
- "types": "types/index.d.ts"
29
- }
34
+ "scripts": {
35
+ "build": "bun run build.ts"
36
+ },
37
+ "exports": {
38
+ ".": {
39
+ "types": "./dist/types/index.d.ts",
40
+ "import": "./dist/esm/index.js",
41
+ "require": "./dist/cjs/index.js"
42
+ }
43
+ }
44
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-state.d.ts","sourceRoot":"","sources":["create-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAS,MAAM,SAAS,CAAA;AAM/D,UAAU,eAAe,CAAC,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAA;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;CAC9B;AAED,KAAK,SAAS,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;AACxF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAiCxE"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["create.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAwB,KAAK,EAAE,MAAM,SAAS,CAAA;AAKjF,eAAO,MAAM,eAAe;;;CAAoB,CAAA;AAEhD;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,GAAE,OAAO,CAAC,CAAC,CAAe,GAAG,KAAK,CAAC,CAAC,CAAC,CA2FpG"}
package/src/create.ts CHANGED
@@ -2,7 +2,7 @@ import { canUpdate, handleAsyncUpdate } from './utils/common'
2
2
  import { isEqualBase, isFunction, isPromise, isSetValueFunction, isUndefined } from './utils/is'
3
3
  import type { DefaultValue, IsEqual, SetStateCb, SetValue, State } from './types'
4
4
  import { createScheduler } from './scheduler'
5
- import { subscribeToDevelopmentTools } from './debug/development-tools'
5
+ import { sendToDevtools } from './debug/development-tools'
6
6
  import { createState } from './create-state'
7
7
 
8
8
  export const STATE_SCHEDULER = createScheduler()
@@ -89,6 +89,12 @@ export function create<T>(initialValue: DefaultValue<T>, isEqual: IsEqual<T> = i
89
89
  return
90
90
  }
91
91
  state.emitter.emit()
92
+ sendToDevtools({
93
+ name: state.stateName ?? `state(${state.id})`,
94
+ type: 'state',
95
+ value: state.cache.current,
96
+ message: 'update',
97
+ })
92
98
  },
93
99
  onResolveItem: setValue,
94
100
  })
@@ -97,6 +103,5 @@ export function create<T>(initialValue: DefaultValue<T>, isEqual: IsEqual<T> = i
97
103
  getValue()
98
104
  }
99
105
 
100
- subscribeToDevelopmentTools(state)
101
106
  return state
102
107
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-tools.d.ts","sourceRoot":"","sources":["development-tools.ts"],"names":[],"mappings":"AAWA,UAAU,WAAW;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AACD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,QASlD"}
@@ -1,6 +1,3 @@
1
- import type { GetState, State } from '../types'
2
- import { isPromise, isState } from '../utils/is'
3
-
4
1
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
5
2
  // @ts-expect-error
6
3
  const reduxDevelopmentTools = globalThis?.__REDUX_DEVTOOLS_EXTENSION__?.connect({
@@ -12,11 +9,9 @@ if (reduxDevelopmentTools) {
12
9
  reduxDevelopmentTools.init({ message: 'Initial state' })
13
10
  }
14
11
 
15
- export type StateType = 'state' | 'derived'
16
-
17
12
  interface SendOptions {
18
13
  message?: string
19
- type: StateType
14
+ type: string
20
15
  value: unknown
21
16
  name: string
22
17
  }
@@ -24,43 +19,13 @@ interface SendOptions {
24
19
  * Send state information to Redux DevTools if available
25
20
  * @param options Options containing message, type, value, and name
26
21
  */
27
- function sendToDevelopmentTools(options: SendOptions) {
28
- if (!reduxDevelopmentTools) {
22
+ export function sendToDevtools(options: SendOptions) {
23
+ if (process.env.NODE_ENV === 'production') {
29
24
  return
30
25
  }
31
- const { message, type, value, name } = options
32
- if (isPromise(value)) {
26
+ if (!reduxDevelopmentTools) {
33
27
  return
34
28
  }
29
+ const { message, type, value, name } = options
35
30
  reduxDevelopmentTools.send(name, { value, type, message }, type)
36
31
  }
37
-
38
- /**
39
- * Create a listener function for development tools that sends state updates
40
- * @param name The name of the state
41
- * @param type The type of the state ('state' or 'derived')
42
- * @returns A listener function that sends updates to development tools
43
- */
44
- function developmentToolsListener(name: string, type: StateType) {
45
- return (value: unknown) => {
46
- sendToDevelopmentTools({ name, type, value, message: 'update' })
47
- }
48
- }
49
-
50
- /**
51
- * Subscribe a state to development tools if available
52
- * @param state The state to subscribe
53
- * @returns A function to unsubscribe from development tools
54
- */
55
- export function subscribeToDevelopmentTools<T>(state: State<T> | GetState<T>) {
56
- if (process.env.NODE_ENV === 'production') {
57
- return
58
- }
59
- let type: StateType = 'state'
60
-
61
- if (!isState(state)) {
62
- type = 'derived'
63
- }
64
- const name = state.stateName?.length ? state.stateName : `${type}(${state.id.toString()})`
65
- return state.listen(developmentToolsListener(name, type))
66
- }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA"}