@livestore/livestore 0.0.46-dev.4 → 0.0.46

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 (115) hide show
  1. package/README.md +10 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/react/fixture.d.ts +18 -2
  4. package/dist/__tests__/react/fixture.d.ts.map +1 -1
  5. package/dist/__tests__/react/fixture.js +27 -3
  6. package/dist/__tests__/react/fixture.js.map +1 -1
  7. package/dist/__tests__/react/utils/otel.d.ts +10 -0
  8. package/dist/__tests__/react/utils/otel.d.ts.map +1 -0
  9. package/dist/__tests__/react/utils/otel.js +42 -0
  10. package/dist/__tests__/react/utils/otel.js.map +1 -0
  11. package/dist/index.d.ts +1 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/react/LiveStoreProvider.js +39 -6
  15. package/dist/react/LiveStoreProvider.js.map +1 -1
  16. package/dist/react/LiveStoreProvider.test.d.ts +2 -0
  17. package/dist/react/LiveStoreProvider.test.d.ts.map +1 -0
  18. package/dist/react/LiveStoreProvider.test.js +51 -0
  19. package/dist/react/LiveStoreProvider.test.js.map +1 -0
  20. package/dist/react/components/DiffableList copy.d.ts +19 -0
  21. package/dist/react/components/DiffableList copy.d.ts.map +1 -0
  22. package/dist/react/components/DiffableList copy.js +62 -0
  23. package/dist/react/components/DiffableList copy.js.map +1 -0
  24. package/dist/react/components/DiffableList.d.ts +2 -9
  25. package/dist/react/components/DiffableList.d.ts.map +1 -1
  26. package/dist/react/components/DiffableList.js +10 -102
  27. package/dist/react/components/DiffableList.js.map +1 -1
  28. package/dist/react/components/DiffableList2.d.ts +20 -0
  29. package/dist/react/components/DiffableList2.d.ts.map +1 -0
  30. package/dist/react/components/DiffableList2.js +119 -0
  31. package/dist/react/components/DiffableList2.js.map +1 -0
  32. package/dist/react/components/DiffableList3.d.ts +19 -0
  33. package/dist/react/components/DiffableList3.d.ts.map +1 -0
  34. package/dist/react/components/DiffableList3.js +62 -0
  35. package/dist/react/components/DiffableList3.js.map +1 -0
  36. package/dist/react/components/LiveList.d.ts +21 -0
  37. package/dist/react/components/LiveList.d.ts.map +1 -0
  38. package/dist/react/components/LiveList.js +31 -0
  39. package/dist/react/components/LiveList.js.map +1 -0
  40. package/dist/react/index.d.ts +1 -1
  41. package/dist/react/index.d.ts.map +1 -1
  42. package/dist/react/index.js +1 -1
  43. package/dist/react/index.js.map +1 -1
  44. package/dist/react/useAtom.d.ts +1 -1
  45. package/dist/react/useAtom.d.ts.map +1 -1
  46. package/dist/react/useAtom.js.map +1 -1
  47. package/dist/react/useQuery.d.ts +4 -1
  48. package/dist/react/useQuery.d.ts.map +1 -1
  49. package/dist/react/useQuery.js +24 -19
  50. package/dist/react/useQuery.js.map +1 -1
  51. package/dist/react/useQuery.test.js +11 -11
  52. package/dist/react/useQuery.test.js.map +1 -1
  53. package/dist/react/useRow.d.ts.map +1 -1
  54. package/dist/react/useRow.js +14 -69
  55. package/dist/react/useRow.js.map +1 -1
  56. package/dist/react/useRow.test.js +440 -28
  57. package/dist/react/useRow.test.js.map +1 -1
  58. package/dist/react/useRowOld.d.ts +40 -0
  59. package/dist/react/useRowOld.d.ts.map +1 -0
  60. package/dist/react/useRowOld.js +134 -0
  61. package/dist/react/useRowOld.js.map +1 -0
  62. package/dist/react/useTemporaryQuery.d.ts +15 -3
  63. package/dist/react/useTemporaryQuery.d.ts.map +1 -1
  64. package/dist/react/useTemporaryQuery.js +60 -27
  65. package/dist/react/useTemporaryQuery.js.map +1 -1
  66. package/dist/react/useTemporaryQuery.test.js +10 -9
  67. package/dist/react/useTemporaryQuery.test.js.map +1 -1
  68. package/dist/reactive.d.ts +23 -5
  69. package/dist/reactive.d.ts.map +1 -1
  70. package/dist/reactive.js +44 -11
  71. package/dist/reactive.js.map +1 -1
  72. package/dist/reactive.test.js +1 -1
  73. package/dist/reactive.test.js.map +1 -1
  74. package/dist/reactiveQueries/base-class.d.ts +1 -1
  75. package/dist/reactiveQueries/base-class.d.ts.map +1 -1
  76. package/dist/reactiveQueries/base-class.js.map +1 -1
  77. package/dist/reactiveQueries/graphql.d.ts +2 -2
  78. package/dist/reactiveQueries/graphql.d.ts.map +1 -1
  79. package/dist/reactiveQueries/graphql.js +16 -10
  80. package/dist/reactiveQueries/graphql.js.map +1 -1
  81. package/dist/reactiveQueries/sql.d.ts +1 -1
  82. package/dist/reactiveQueries/sql.d.ts.map +1 -1
  83. package/dist/reactiveQueries/sql.js +15 -11
  84. package/dist/reactiveQueries/sql.js.map +1 -1
  85. package/dist/reactiveQueries/sql.test.js +1 -40
  86. package/dist/reactiveQueries/sql.test.js.map +1 -1
  87. package/dist/store.d.ts +2 -2
  88. package/dist/store.d.ts.map +1 -1
  89. package/dist/store.js +10 -7
  90. package/dist/store.js.map +1 -1
  91. package/package.json +6 -8
  92. package/src/__tests__/react/fixture.tsx +35 -2
  93. package/src/__tests__/react/utils/otel.ts +61 -0
  94. package/src/index.ts +12 -1
  95. package/src/react/LiveStoreProvider.test.tsx +82 -0
  96. package/src/react/LiveStoreProvider.tsx +42 -7
  97. package/src/react/components/LiveList.tsx +84 -0
  98. package/src/react/index.ts +1 -1
  99. package/src/react/useAtom.ts +1 -1
  100. package/src/react/useQuery.test.tsx +11 -11
  101. package/src/react/useQuery.ts +29 -22
  102. package/src/react/useRow.test.tsx +502 -30
  103. package/src/react/useRow.ts +19 -107
  104. package/src/react/useTemporaryQuery.test.tsx +17 -16
  105. package/src/react/useTemporaryQuery.ts +96 -28
  106. package/src/reactive.test.ts +1 -1
  107. package/src/reactive.ts +76 -15
  108. package/src/reactiveQueries/base-class.ts +2 -1
  109. package/src/reactiveQueries/graphql.ts +21 -15
  110. package/src/reactiveQueries/sql.test.ts +1 -54
  111. package/src/reactiveQueries/sql.ts +20 -14
  112. package/src/store.ts +12 -8
  113. package/tsconfig.json +0 -1
  114. package/src/react/components/DiffableList.tsx +0 -192
  115. package/src/react/utils/useCleanup.ts +0 -25
@@ -7,6 +7,11 @@ import { useStore } from './LiveStoreContext.js'
7
7
  import { extractStackInfoFromStackTrace, originalStackLimit } from './utils/stack-info.js'
8
8
  import { useStateRefWithReactiveInput } from './utils/useStateRefWithReactiveInput.js'
9
9
 
10
+ /**
11
+ * NOTE Some folks have suggested to use `React.useSyncExternalStore`, however, it's not doing anything special
12
+ * for what's needed here, so we handle everything manually.
13
+ */
14
+
10
15
  /**
11
16
  * This is needed because the `React.useMemo` call below, can sometimes be called multiple times 🤷,
12
17
  * so we need to "cache" the fact that we've already started a span for this component.
@@ -16,13 +21,16 @@ const spanAlreadyStartedCache = new Map<LiveQueryAny, { span: otel.Span; otelCon
16
21
 
17
22
  export const useQuery = <TQuery extends LiveQueryAny>(query: TQuery): GetResult<TQuery> => useQueryRef(query).current
18
23
 
24
+ /**
25
+ *
26
+ */
19
27
  export const useQueryRef = <TQuery extends LiveQueryAny>(
20
- query: TQuery,
28
+ query$: TQuery,
21
29
  parentOtelContext?: otel.Context,
22
30
  ): React.MutableRefObject<GetResult<TQuery>> => {
23
31
  const { store } = useStore()
24
32
 
25
- React.useDebugValue(`LiveStore:useQuery:${query.id}:${query.label}`)
33
+ React.useDebugValue(`LiveStore:useQuery:${query$.id}:${query$.label}`)
26
34
 
27
35
  const stackInfo = React.useMemo(() => {
28
36
  Error.stackTraceLimit = 10
@@ -34,31 +42,31 @@ export const useQueryRef = <TQuery extends LiveQueryAny>(
34
42
 
35
43
  // The following `React.useMemo` and `React.useEffect` calls are used to start and end a span for the lifetime of this component.
36
44
  const { span, otelContext } = React.useMemo(() => {
37
- const existingSpan = spanAlreadyStartedCache.get(query)
45
+ const existingSpan = spanAlreadyStartedCache.get(query$)
38
46
  if (existingSpan !== undefined) return existingSpan
39
47
 
40
48
  const span = store.otel.tracer.startSpan(
41
- `LiveStore:useQuery:${query.label}`,
42
- { attributes: { label: query.label, stackInfo: JSON.stringify(stackInfo) } },
49
+ `LiveStore:useQuery:${query$.label}`,
50
+ { attributes: { label: query$.label, stackInfo: JSON.stringify(stackInfo) } },
43
51
  parentOtelContext ?? store.otel.queriesSpanContext,
44
52
  )
45
53
 
46
54
  const otelContext = otel.trace.setSpan(otel.context.active(), span)
47
55
 
48
- spanAlreadyStartedCache.set(query, { span, otelContext })
56
+ spanAlreadyStartedCache.set(query$, { span, otelContext })
49
57
 
50
58
  return { span, otelContext }
51
- }, [parentOtelContext, query, stackInfo, store.otel.queriesSpanContext, store.otel.tracer])
59
+ }, [parentOtelContext, query$, stackInfo, store.otel.queriesSpanContext, store.otel.tracer])
52
60
 
53
61
  const initialResult = React.useMemo(
54
62
  () =>
55
- query.run(otelContext, {
63
+ query$.run(otelContext, {
56
64
  _tag: 'react',
57
65
  api: 'useQuery',
58
- label: query.label,
66
+ label: query$.label,
59
67
  stackInfo,
60
68
  }),
61
- [otelContext, query, stackInfo],
69
+ [otelContext, query$, stackInfo],
62
70
  )
63
71
 
64
72
  // We know the query has a result by the time we use it; so we can synchronously populate a default state
@@ -66,17 +74,18 @@ export const useQueryRef = <TQuery extends LiveQueryAny>(
66
74
 
67
75
  React.useEffect(
68
76
  () => () => {
69
- spanAlreadyStartedCache.delete(query)
77
+ spanAlreadyStartedCache.delete(query$)
70
78
  span.end()
71
79
  },
72
- [query, span],
80
+ [query$, span],
73
81
  )
74
82
 
75
83
  // Subscribe to future updates for this query
76
84
  React.useEffect(() => {
77
- query.activeSubscriptions.add(stackInfo)
78
- const unsubFromStore = store.subscribe(
79
- query,
85
+ query$.activeSubscriptions.add(stackInfo)
86
+
87
+ return store.subscribe(
88
+ query$,
80
89
  (newValue) => {
81
90
  // NOTE: we return a reference to the result object within LiveStore;
82
91
  // this implies that app code must not mutate the results, or else
@@ -85,14 +94,12 @@ export const useQueryRef = <TQuery extends LiveQueryAny>(
85
94
  setValue(newValue)
86
95
  }
87
96
  },
88
- undefined,
89
- { label: query.label, otelContext },
97
+ () => {
98
+ query$.activeSubscriptions.delete(stackInfo)
99
+ },
100
+ { label: query$.label, otelContext },
90
101
  )
91
- return () => {
92
- query.activeSubscriptions.delete(stackInfo)
93
- unsubFromStore()
94
- }
95
- }, [stackInfo, query, setValue, store, valueRef, otelContext, span])
102
+ }, [stackInfo, query$, setValue, store, valueRef, otelContext, span])
96
103
 
97
104
  return valueRef
98
105
  }