@livestore/livestore 0.0.9 → 0.0.12

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 (152) hide show
  1. package/package.json +7 -7
  2. package/src/__tests__/react/fixture.tsx +1 -13
  3. package/src/__tests__/reactive.test.ts +39 -0
  4. package/src/inMemoryDatabase.ts +5 -5
  5. package/src/react/useGraphQL.ts +6 -7
  6. package/src/react/useLiveStoreComponent.ts +38 -48
  7. package/src/reactive.ts +12 -11
  8. package/src/reactiveQueries/graphql.ts +5 -3
  9. package/src/reactiveQueries/js.ts +1 -3
  10. package/src/reactiveQueries/sql.ts +6 -6
  11. package/src/store.ts +45 -31
  12. package/dist/.tsbuildinfo +0 -1
  13. package/dist/QueryCache.d.ts +0 -20
  14. package/dist/QueryCache.d.ts.map +0 -1
  15. package/dist/QueryCache.js +0 -71
  16. package/dist/QueryCache.js.map +0 -1
  17. package/dist/__tests__/react/fixture.d.ts +0 -141
  18. package/dist/__tests__/react/fixture.d.ts.map +0 -1
  19. package/dist/__tests__/react/fixture.js +0 -72
  20. package/dist/__tests__/react/fixture.js.map +0 -1
  21. package/dist/__tests__/react/useLiveStoreComponent.test.d.ts +0 -2
  22. package/dist/__tests__/react/useLiveStoreComponent.test.d.ts.map +0 -1
  23. package/dist/__tests__/react/useLiveStoreComponent.test.js +0 -78
  24. package/dist/__tests__/react/useLiveStoreComponent.test.js.map +0 -1
  25. package/dist/__tests__/reactive.test.d.ts +0 -2
  26. package/dist/__tests__/reactive.test.d.ts.map +0 -1
  27. package/dist/__tests__/reactive.test.js +0 -167
  28. package/dist/__tests__/reactive.test.js.map +0 -1
  29. package/dist/backends/base.d.ts +0 -13
  30. package/dist/backends/base.d.ts.map +0 -1
  31. package/dist/backends/base.js +0 -53
  32. package/dist/backends/base.js.map +0 -1
  33. package/dist/backends/index.d.ts +0 -45
  34. package/dist/backends/index.d.ts.map +0 -1
  35. package/dist/backends/index.js +0 -38
  36. package/dist/backends/index.js.map +0 -1
  37. package/dist/backends/noop.d.ts +0 -18
  38. package/dist/backends/noop.d.ts.map +0 -1
  39. package/dist/backends/noop.js +0 -21
  40. package/dist/backends/noop.js.map +0 -1
  41. package/dist/backends/tauri.d.ts +0 -22
  42. package/dist/backends/tauri.d.ts.map +0 -1
  43. package/dist/backends/tauri.js +0 -48
  44. package/dist/backends/tauri.js.map +0 -1
  45. package/dist/backends/utils/idb.d.ts +0 -10
  46. package/dist/backends/utils/idb.d.ts.map +0 -1
  47. package/dist/backends/utils/idb.js +0 -58
  48. package/dist/backends/utils/idb.js.map +0 -1
  49. package/dist/backends/web-in-memory.d.ts +0 -22
  50. package/dist/backends/web-in-memory.d.ts.map +0 -1
  51. package/dist/backends/web-in-memory.js +0 -45
  52. package/dist/backends/web-in-memory.js.map +0 -1
  53. package/dist/backends/web-worker.d.ts +0 -17
  54. package/dist/backends/web-worker.d.ts.map +0 -1
  55. package/dist/backends/web-worker.js +0 -139
  56. package/dist/backends/web-worker.js.map +0 -1
  57. package/dist/backends/web.d.ts +0 -27
  58. package/dist/backends/web.d.ts.map +0 -1
  59. package/dist/backends/web.js +0 -63
  60. package/dist/backends/web.js.map +0 -1
  61. package/dist/bounded-collections.d.ts +0 -34
  62. package/dist/bounded-collections.d.ts.map +0 -1
  63. package/dist/bounded-collections.js +0 -103
  64. package/dist/bounded-collections.js.map +0 -1
  65. package/dist/componentKey.d.ts +0 -20
  66. package/dist/componentKey.d.ts.map +0 -1
  67. package/dist/componentKey.js +0 -3
  68. package/dist/componentKey.js.map +0 -1
  69. package/dist/effect/LiveStore.d.ts +0 -42
  70. package/dist/effect/LiveStore.d.ts.map +0 -1
  71. package/dist/effect/LiveStore.js +0 -40
  72. package/dist/effect/LiveStore.js.map +0 -1
  73. package/dist/effect/index.d.ts +0 -2
  74. package/dist/effect/index.d.ts.map +0 -1
  75. package/dist/effect/index.js +0 -2
  76. package/dist/effect/index.js.map +0 -1
  77. package/dist/events.d.ts +0 -7
  78. package/dist/events.d.ts.map +0 -1
  79. package/dist/events.js +0 -2
  80. package/dist/events.js.map +0 -1
  81. package/dist/inMemoryDatabase.d.ts +0 -65
  82. package/dist/inMemoryDatabase.d.ts.map +0 -1
  83. package/dist/inMemoryDatabase.js +0 -241
  84. package/dist/inMemoryDatabase.js.map +0 -1
  85. package/dist/index.d.ts +0 -20
  86. package/dist/index.d.ts.map +0 -1
  87. package/dist/index.js +0 -10
  88. package/dist/index.js.map +0 -1
  89. package/dist/otel.d.ts +0 -5
  90. package/dist/otel.d.ts.map +0 -1
  91. package/dist/otel.js +0 -17
  92. package/dist/otel.js.map +0 -1
  93. package/dist/react/LiveStoreContext.d.ts +0 -11
  94. package/dist/react/LiveStoreContext.d.ts.map +0 -1
  95. package/dist/react/LiveStoreContext.js +0 -10
  96. package/dist/react/LiveStoreContext.js.map +0 -1
  97. package/dist/react/LiveStoreProvider.d.ts +0 -21
  98. package/dist/react/LiveStoreProvider.d.ts.map +0 -1
  99. package/dist/react/LiveStoreProvider.js +0 -48
  100. package/dist/react/LiveStoreProvider.js.map +0 -1
  101. package/dist/react/index.d.ts +0 -7
  102. package/dist/react/index.d.ts.map +0 -1
  103. package/dist/react/index.js +0 -6
  104. package/dist/react/index.js.map +0 -1
  105. package/dist/react/useGlobalQuery.d.ts +0 -3
  106. package/dist/react/useGlobalQuery.d.ts.map +0 -1
  107. package/dist/react/useGlobalQuery.js +0 -25
  108. package/dist/react/useGlobalQuery.js.map +0 -1
  109. package/dist/react/useGraphQL.d.ts +0 -11
  110. package/dist/react/useGraphQL.d.ts.map +0 -1
  111. package/dist/react/useGraphQL.js +0 -68
  112. package/dist/react/useGraphQL.js.map +0 -1
  113. package/dist/react/useLiveStoreComponent.d.ts +0 -70
  114. package/dist/react/useLiveStoreComponent.d.ts.map +0 -1
  115. package/dist/react/useLiveStoreComponent.js +0 -261
  116. package/dist/react/useLiveStoreComponent.js.map +0 -1
  117. package/dist/react/utils/useStateRefWithReactiveInput.d.ts +0 -13
  118. package/dist/react/utils/useStateRefWithReactiveInput.d.ts.map +0 -1
  119. package/dist/react/utils/useStateRefWithReactiveInput.js +0 -38
  120. package/dist/react/utils/useStateRefWithReactiveInput.js.map +0 -1
  121. package/dist/reactive.d.ts +0 -140
  122. package/dist/reactive.d.ts.map +0 -1
  123. package/dist/reactive.js +0 -301
  124. package/dist/reactive.js.map +0 -1
  125. package/dist/reactiveQueries/base-class.d.ts +0 -24
  126. package/dist/reactiveQueries/base-class.d.ts.map +0 -1
  127. package/dist/reactiveQueries/base-class.js +0 -22
  128. package/dist/reactiveQueries/base-class.js.map +0 -1
  129. package/dist/reactiveQueries/graphql.d.ts +0 -25
  130. package/dist/reactiveQueries/graphql.d.ts.map +0 -1
  131. package/dist/reactiveQueries/graphql.js +0 -14
  132. package/dist/reactiveQueries/graphql.js.map +0 -1
  133. package/dist/reactiveQueries/js.d.ts +0 -19
  134. package/dist/reactiveQueries/js.d.ts.map +0 -1
  135. package/dist/reactiveQueries/js.js +0 -13
  136. package/dist/reactiveQueries/js.js.map +0 -1
  137. package/dist/reactiveQueries/sql.d.ts +0 -31
  138. package/dist/reactiveQueries/sql.d.ts.map +0 -1
  139. package/dist/reactiveQueries/sql.js +0 -28
  140. package/dist/reactiveQueries/sql.js.map +0 -1
  141. package/dist/schema.d.ts +0 -163
  142. package/dist/schema.d.ts.map +0 -1
  143. package/dist/schema.js +0 -92
  144. package/dist/schema.js.map +0 -1
  145. package/dist/store.d.ts +0 -175
  146. package/dist/store.d.ts.map +0 -1
  147. package/dist/store.js +0 -549
  148. package/dist/store.js.map +0 -1
  149. package/dist/util.d.ts +0 -24
  150. package/dist/util.d.ts.map +0 -1
  151. package/dist/util.js +0 -51
  152. package/dist/util.js.map +0 -1
package/src/store.ts CHANGED
@@ -32,7 +32,7 @@ export type LiveStoreQuery<TResult extends Record<string, any> = any> =
32
32
  export type BaseGraphQLContext = {
33
33
  queriedTables: Set<string>
34
34
  /** Needed by Pothos Otel plugin for resolver tracing to work */
35
- parentSpanContext?: otel.Context
35
+ otelContext?: otel.Context
36
36
  }
37
37
 
38
38
  export const RESET_DB_LOCAL_STORAGE_KEY = 'livestore-reset'
@@ -124,6 +124,7 @@ export class Store<TGraphQLContext extends BaseGraphQLContext> {
124
124
  }: StoreOptions<TGraphQLContext>) {
125
125
  this.inMemoryDB = db
126
126
  this.graph = new ReactiveGraph({
127
+ // TODO move this into React module
127
128
  // Do all our updates inside a single React setState batch to avoid multiple UI re-renders
128
129
  effectsWrapper: (run) => ReactDOM.unstable_batchedUpdates(() => run()),
129
130
  otelTracer,
@@ -186,21 +187,30 @@ export class Store<TGraphQLContext extends BaseGraphQLContext> {
186
187
  */
187
188
  querySQL = <TResult>(
188
189
  genQueryString: (get: GetAtom) => string,
189
- /**
190
- * List of tables that are queried in this query;
191
- * used to determine reactive dependencies.
192
- * In the future we want to auto-generate this via parsing the query
193
- */
194
- queriedTables: string[],
195
- bindValues: Bindable | undefined,
196
- componentKey: ComponentKey | undefined,
197
- label: string | undefined,
198
- parentSpanContext: otel.Context,
190
+ {
191
+ queriedTables,
192
+ bindValues,
193
+ componentKey,
194
+ label,
195
+ otelContext = otel.context.active(),
196
+ }: {
197
+ /**
198
+ * List of tables that are queried in this query;
199
+ * used to determine reactive dependencies.
200
+ *
201
+ * NOTE In the future we want to auto-generate this via parsing the query
202
+ */
203
+ queriedTables: string[]
204
+ bindValues?: Bindable | undefined
205
+ componentKey?: ComponentKey | undefined
206
+ label?: string | undefined
207
+ otelContext?: otel.Context
208
+ },
199
209
  ): LiveStoreSQLQuery<TResult> =>
200
210
  this.otel.tracer.startActiveSpan(
201
211
  'querySQL', // NOTE span name will be overridden further down
202
212
  { attributes: { label } },
203
- parentSpanContext,
213
+ otelContext,
204
214
  (span) => {
205
215
  const otelContext = otel.trace.setSpan(otel.context.active(), span)
206
216
 
@@ -240,11 +250,7 @@ export class Store<TGraphQLContext extends BaseGraphQLContext> {
240
250
  span.setAttribute('sql.query', sqlString)
241
251
  span.updateName(`sql:${sqlString.slice(0, 50)}`)
242
252
 
243
- const results = this.inMemoryDB.select(sqlString, {
244
- queriedTables,
245
- bindValues,
246
- parentSpanContext: otelContext,
247
- })
253
+ const results = this.inMemoryDB.select(sqlString, { queriedTables, bindValues, otelContext })
248
254
 
249
255
  span.setAttribute('sql.rowsCount', results.length)
250
256
  addDebugInfo({ _tag: 'sql', label: label ?? '', query: sqlString })
@@ -282,11 +288,13 @@ export class Store<TGraphQLContext extends BaseGraphQLContext> {
282
288
 
283
289
  queryJS = <TResult>(
284
290
  genResults: (get: GetAtom) => TResult,
285
- componentKey: ComponentKey,
286
- label = `js${uniqueId()}`,
287
- parentSpanContext: otel.Context,
291
+ {
292
+ componentKey = globalComponentKey,
293
+ label = `js${uniqueId()}`,
294
+ otelContext = otel.context.active(),
295
+ }: { componentKey?: ComponentKey; label?: string; otelContext?: otel.Context },
288
296
  ): LiveStoreJSQuery<TResult> =>
289
- this.otel.tracer.startActiveSpan(`queryJS:${label}`, { attributes: { label } }, parentSpanContext, (span) => {
297
+ this.otel.tracer.startActiveSpan(`queryJS:${label}`, { attributes: { label } }, otelContext, (span) => {
290
298
  const otelContext = otel.trace.setSpan(otel.context.active(), span)
291
299
  const queryLabel = `${label}:results` + (this.temporaryQueries ? ':temp' : '')
292
300
  const results$ = this.graph.makeThunk(
@@ -320,13 +328,20 @@ export class Store<TGraphQLContext extends BaseGraphQLContext> {
320
328
  queryGraphQL = <TResult extends Record<string, any>, TVariableValues extends Record<string, any>>(
321
329
  document: DocumentNode<TResult, TVariableValues>,
322
330
  genVariableValues: (get: GetAtom) => TVariableValues,
323
- { componentKey, label }: { componentKey: ComponentKey; label?: string },
324
- parentSpanContext: otel.Context,
331
+ {
332
+ componentKey,
333
+ label,
334
+ otelContext = otel.context.active(),
335
+ }: {
336
+ componentKey: ComponentKey
337
+ label?: string
338
+ otelContext?: otel.Context
339
+ },
325
340
  ): LiveStoreGraphQLQuery<TResult, TVariableValues, TGraphQLContext> =>
326
341
  this.otel.tracer.startActiveSpan(
327
- `queryGraphQL`, // NOTE span name will be overridden further down
342
+ `queryGraphQL:`, // NOTE span name will be overridden further down
328
343
  {},
329
- parentSpanContext,
344
+ otelContext,
330
345
  (span) => {
331
346
  const otelContext = otel.trace.setSpan(otel.context.active(), span)
332
347
 
@@ -390,25 +405,24 @@ export class Store<TGraphQLContext extends BaseGraphQLContext> {
390
405
  queryGraphQLOnce = <TResult extends Record<string, any>, TVariableValues extends Record<string, any>>(
391
406
  document: DocumentNode<TResult, TVariableValues>,
392
407
  variableValues: TVariableValues,
393
- parentSpanContext?: otel.Context,
408
+ otelContext: otel.Context = this.otel.queriesSpanContext,
394
409
  ): { result: TResult; queriedTables: string[] } => {
395
410
  const schema =
396
411
  this.graphQLSchema ?? shouldNeverHappen("Can't run a GraphQL query on a store without GraphQL schema")
397
412
  const context =
398
413
  this.graphQLContext ?? shouldNeverHappen("Can't run a GraphQL query on a store without GraphQL context")
399
414
  const tracer = this.otel.tracer
400
- const spanContext = parentSpanContext ?? this.otel.queriesSpanContext
401
415
 
402
416
  const operationName = graphql.getOperationAST(document)?.name?.value
403
417
 
404
- return tracer.startActiveSpan(`executeGraphQLQuery: ${operationName}`, {}, spanContext, (span) => {
418
+ return tracer.startActiveSpan(`executeGraphQLQuery: ${operationName}`, {}, otelContext, (span) => {
405
419
  try {
406
420
  span.setAttribute('graphql.variables', JSON.stringify(variableValues))
407
421
  span.setAttribute('graphql.query', graphql.print(document))
408
422
 
409
423
  context.queriedTables.clear()
410
424
 
411
- context.parentSpanContext = otel.trace.setSpan(otel.context.active(), span)
425
+ context.otelContext = otel.trace.setSpan(otel.context.active(), span)
412
426
 
413
427
  const res = graphql.executeSync({
414
428
  document,
@@ -713,7 +727,7 @@ export class Store<TGraphQLContext extends BaseGraphQLContext> {
713
727
  private applyEventWithoutRefresh = (
714
728
  eventType: string,
715
729
  args: any = {},
716
- parentSpanContext: otel.Context,
730
+ otelContext: otel.Context,
717
731
  ): { writeTables: string[]; durationMs: number } => {
718
732
  return this.otel.tracer.startActiveSpan(
719
733
  'LiveStore:applyEventWithoutRefresh',
@@ -723,7 +737,7 @@ export class Store<TGraphQLContext extends BaseGraphQLContext> {
723
737
  'livestore.args': JSON.stringify(args, null, 2),
724
738
  },
725
739
  },
726
- parentSpanContext,
740
+ otelContext,
727
741
  (span) => {
728
742
  const otelContext = otel.trace.setSpan(otel.context.active(), span)
729
743