@livestore/livestore 0.4.0-dev.1 → 0.4.0-dev.11

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 (61) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/effect/LiveStore.d.ts.map +1 -1
  3. package/dist/effect/LiveStore.js +2 -4
  4. package/dist/effect/LiveStore.js.map +1 -1
  5. package/dist/live-queries/base-class.d.ts.map +1 -1
  6. package/dist/live-queries/base-class.js.map +1 -1
  7. package/dist/live-queries/db-query.d.ts.map +1 -1
  8. package/dist/live-queries/db-query.js +7 -4
  9. package/dist/live-queries/db-query.js.map +1 -1
  10. package/dist/live-queries/db-query.test.js +53 -24
  11. package/dist/live-queries/db-query.test.js.map +1 -1
  12. package/dist/mod.d.ts +2 -2
  13. package/dist/mod.d.ts.map +1 -1
  14. package/dist/mod.js +1 -1
  15. package/dist/mod.js.map +1 -1
  16. package/dist/reactive.d.ts +10 -10
  17. package/dist/reactive.d.ts.map +1 -1
  18. package/dist/reactive.js +36 -27
  19. package/dist/reactive.js.map +1 -1
  20. package/dist/reactive.test.js +115 -0
  21. package/dist/reactive.test.js.map +1 -1
  22. package/dist/store/create-store.d.ts.map +1 -1
  23. package/dist/store/create-store.js +3 -3
  24. package/dist/store/create-store.js.map +1 -1
  25. package/dist/store/store-types.d.ts +13 -2
  26. package/dist/store/store-types.d.ts.map +1 -1
  27. package/dist/store/store-types.js.map +1 -1
  28. package/dist/store/store.d.ts +45 -29
  29. package/dist/store/store.d.ts.map +1 -1
  30. package/dist/store/store.js +165 -100
  31. package/dist/store/store.js.map +1 -1
  32. package/dist/utils/dev.d.ts +3 -0
  33. package/dist/utils/dev.d.ts.map +1 -1
  34. package/dist/utils/dev.js.map +1 -1
  35. package/dist/utils/tests/fixture.d.ts.map +1 -1
  36. package/dist/utils/tests/fixture.js +2 -1
  37. package/dist/utils/tests/fixture.js.map +1 -1
  38. package/dist/utils/tests/otel.d.ts +15 -14
  39. package/dist/utils/tests/otel.d.ts.map +1 -1
  40. package/dist/utils/tests/otel.js +20 -15
  41. package/dist/utils/tests/otel.js.map +1 -1
  42. package/package.json +7 -7
  43. package/src/ambient.d.ts +3 -3
  44. package/src/effect/LiveStore.ts +2 -4
  45. package/src/live-queries/__snapshots__/db-query.test.ts.snap +354 -130
  46. package/src/live-queries/base-class.ts +6 -3
  47. package/src/live-queries/db-query.test.ts +70 -24
  48. package/src/live-queries/db-query.ts +7 -4
  49. package/src/mod.ts +10 -1
  50. package/src/reactive.test.ts +150 -1
  51. package/src/reactive.ts +47 -39
  52. package/src/store/create-store.ts +12 -4
  53. package/src/store/store-types.ts +23 -2
  54. package/src/store/store.ts +262 -193
  55. package/src/utils/dev.ts +5 -0
  56. package/src/utils/tests/fixture.ts +2 -1
  57. package/src/utils/tests/otel.ts +31 -20
  58. package/dist/store/store-shutdown.test.d.ts +0 -2
  59. package/dist/store/store-shutdown.test.d.ts.map +0 -1
  60. package/dist/store/store-shutdown.test.js +0 -103
  61. package/dist/store/store-shutdown.test.js.map +0 -1
@@ -1,13 +1,17 @@
1
+ import { omitUndefineds } from '@livestore/utils'
1
2
  import { identity } from '@livestore/utils/effect'
2
3
  import type { Attributes } from '@opentelemetry/api'
3
4
  import type { InMemorySpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-base'
4
5
 
5
6
  type SimplifiedNestedSpan = { _name: string; attributes: any; children: SimplifiedNestedSpan[] }
6
7
 
7
- export const getSimplifiedRootSpan = (
8
+ type NestedSpan = { span: ReadableSpan; children: NestedSpan[] }
9
+
10
+ const buildSimplifiedRootSpans = (
8
11
  exporter: InMemorySpanExporter,
12
+ rootSpanName: string,
9
13
  mapAttributes?: (attributes: Attributes) => Attributes,
10
- ): SimplifiedNestedSpan => {
14
+ ): SimplifiedNestedSpan[] => {
11
15
  const spans = exporter.getFinishedSpans()
12
16
  const spansMap = new Map<string, NestedSpan>(spans.map((span) => [span.spanContext().spanId, { span, children: [] }]))
13
17
 
@@ -21,14 +25,12 @@ export const getSimplifiedRootSpan = (
21
25
  }
22
26
  })
23
27
 
24
- type NestedSpan = { span: ReadableSpan; children: NestedSpan[] }
25
- const createStoreSpanData = spans.find((_) => _.name === 'createStore')
26
- if (createStoreSpanData === undefined) {
28
+ const rootSpanDataList = spans.filter((_) => _.name === rootSpanName)
29
+ if (rootSpanDataList.length === 0) {
27
30
  throw new Error(
28
- `Could not find the root span named 'createStore'. Available spans: ${spans.map((s) => s.name).join(', ')}`,
31
+ `Could not find any root spans named '${rootSpanName}'. Available spans: ${spans.map((s) => s.name).join(', ')}`,
29
32
  )
30
33
  }
31
- const rootSpan = spansMap.get(createStoreSpanData.spanContext().spanId)!
32
34
 
33
35
  const simplifySpanRec = (span: NestedSpan): SimplifiedNestedSpan =>
34
36
  omitEmpty({
@@ -40,20 +42,29 @@ export const getSimplifiedRootSpan = (
40
42
  .map(simplifySpanRec),
41
43
  })
42
44
 
43
- // console.log('rootSpan', rootSpan.span)
44
-
45
- // console.dir(
46
- // spans.map((_) => [_.spanContext().spanId, _.name, _.attributes, _.parentSpanId]),
47
- // { depth: 10 },
48
- // )
49
-
50
- const simplifiedRootSpan = simplifySpanRec(rootSpan)
51
-
52
- // console.log('simplifiedRootSpan', simplifiedRootSpan)
45
+ return rootSpanDataList.map((rootSpanData) => {
46
+ const rootSpan = spansMap.get(rootSpanData.spanContext().spanId)!
47
+ return simplifySpanRec(rootSpan)
48
+ })
49
+ }
53
50
 
54
- // writeFileSync('tmp/trace.json', JSON.stringify(toTraceFile(spans), null, 2))
51
+ export const getSimplifiedRootSpan = (
52
+ exporter: InMemorySpanExporter,
53
+ rootSpanName: string,
54
+ mapAttributes?: (attributes: Attributes) => Attributes,
55
+ ): SimplifiedNestedSpan => {
56
+ const results = buildSimplifiedRootSpans(exporter, rootSpanName, mapAttributes)
57
+ const firstResult = results[0]
58
+ if (!firstResult) throw new Error(`Could not find the root span named '${rootSpanName}'.`)
59
+ return firstResult
60
+ }
55
61
 
56
- return simplifiedRootSpan
62
+ export const getAllSimplifiedRootSpans = (
63
+ exporter: InMemorySpanExporter,
64
+ rootSpanName: string,
65
+ mapAttributes?: (attributes: Attributes) => Attributes,
66
+ ): SimplifiedNestedSpan[] => {
67
+ return buildSimplifiedRootSpans(exporter, rootSpanName, mapAttributes)
57
68
  }
58
69
 
59
70
  // const compareHrTime = (a: [number, numndber], b: [number, number]) => {
@@ -96,7 +107,7 @@ export const toTraceFile = (spans: ReadableSpan[]) => {
96
107
  spans: spans.map((span) => ({
97
108
  traceId: span.spanContext().traceId,
98
109
  spanId: span.spanContext().spanId,
99
- ...(span.parentSpanContext?.spanId ? { parentSpanId: span.parentSpanContext.spanId } : {}),
110
+ ...omitUndefineds({ parentSpanId: span.parentSpanContext?.spanId }),
100
111
  // traceState: span.spanContext().traceState ?? '',
101
112
  name: span.name,
102
113
  kind: 'SPAN_KIND_INTERNAL',
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=store-shutdown.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store-shutdown.test.d.ts","sourceRoot":"","sources":["../../src/store/store-shutdown.test.ts"],"names":[],"mappings":""}
@@ -1,103 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { StoreAlreadyShutdownError } from '@livestore/common';
3
- // Mock a minimal store interface for testing
4
- class MockStore {
5
- isShutdown = false;
6
- storeId = 'test-store';
7
- checkShutdown = (operation) => {
8
- if (this.isShutdown) {
9
- throw new StoreAlreadyShutdownError({ operation, storeId: this.storeId });
10
- }
11
- };
12
- shutdown = () => {
13
- this.isShutdown = true;
14
- };
15
- // Mock public methods that should throw after shutdown
16
- subscribe = () => {
17
- this.checkShutdown('subscribe');
18
- return () => { }; // mock unsubscribe
19
- };
20
- query = () => {
21
- this.checkShutdown('query');
22
- return {};
23
- };
24
- commit = () => {
25
- this.checkShutdown('commit');
26
- };
27
- setSignal = () => {
28
- this.checkShutdown('setSignal');
29
- };
30
- manualRefresh = () => {
31
- this.checkShutdown('manualRefresh');
32
- };
33
- events = () => {
34
- this.checkShutdown('events');
35
- return [];
36
- };
37
- eventsStream = () => {
38
- this.checkShutdown('eventsStream');
39
- return [];
40
- };
41
- }
42
- describe('Store shutdown behavior', () => {
43
- it('should allow operations before shutdown', () => {
44
- const store = new MockStore();
45
- // All operations should work before shutdown
46
- expect(() => store.subscribe()).not.toThrow();
47
- expect(() => store.query()).not.toThrow();
48
- expect(() => store.commit()).not.toThrow();
49
- expect(() => store.setSignal()).not.toThrow();
50
- expect(() => store.manualRefresh()).not.toThrow();
51
- expect(() => store.events()).not.toThrow();
52
- expect(() => store.eventsStream()).not.toThrow();
53
- });
54
- it('should throw StoreAlreadyShutdownError for all operations after shutdown', () => {
55
- const store = new MockStore();
56
- store.shutdown();
57
- // All operations should throw after shutdown
58
- expect(() => store.subscribe()).toThrow(StoreAlreadyShutdownError);
59
- expect(() => store.query()).toThrow(StoreAlreadyShutdownError);
60
- expect(() => store.commit()).toThrow(StoreAlreadyShutdownError);
61
- expect(() => store.setSignal()).toThrow(StoreAlreadyShutdownError);
62
- expect(() => store.manualRefresh()).toThrow(StoreAlreadyShutdownError);
63
- expect(() => store.events()).toThrow(StoreAlreadyShutdownError);
64
- expect(() => store.eventsStream()).toThrow(StoreAlreadyShutdownError);
65
- });
66
- it('should include operation name and storeId in error', () => {
67
- const store = new MockStore();
68
- store.shutdown();
69
- try {
70
- store.subscribe();
71
- expect.fail('Should have thrown');
72
- }
73
- catch (error) {
74
- expect(error).toBeInstanceOf(StoreAlreadyShutdownError);
75
- expect(error.operation).toBe('subscribe');
76
- expect(error.storeId).toBe('test-store');
77
- }
78
- });
79
- it('should include correct operation name for different methods', () => {
80
- const store = new MockStore();
81
- store.shutdown();
82
- const operations = [
83
- ['subscribe', () => store.subscribe()],
84
- ['query', () => store.query()],
85
- ['commit', () => store.commit()],
86
- ['setSignal', () => store.setSignal()],
87
- ['manualRefresh', () => store.manualRefresh()],
88
- ['events', () => store.events()],
89
- ['eventsStream', () => store.eventsStream()],
90
- ];
91
- for (const [expectedOperation, fn] of operations) {
92
- try {
93
- fn();
94
- expect.fail(`Should have thrown for ${expectedOperation}`);
95
- }
96
- catch (error) {
97
- expect(error).toBeInstanceOf(StoreAlreadyShutdownError);
98
- expect(error.operation).toBe(expectedOperation);
99
- }
100
- }
101
- });
102
- });
103
- //# sourceMappingURL=store-shutdown.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store-shutdown.test.js","sourceRoot":"","sources":["../../src/store/store-shutdown.test.ts"],"names":[],"mappings":"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"}