@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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/effect/LiveStore.d.ts.map +1 -1
- package/dist/effect/LiveStore.js +2 -4
- package/dist/effect/LiveStore.js.map +1 -1
- package/dist/live-queries/base-class.d.ts.map +1 -1
- package/dist/live-queries/base-class.js.map +1 -1
- package/dist/live-queries/db-query.d.ts.map +1 -1
- package/dist/live-queries/db-query.js +7 -4
- package/dist/live-queries/db-query.js.map +1 -1
- package/dist/live-queries/db-query.test.js +53 -24
- package/dist/live-queries/db-query.test.js.map +1 -1
- package/dist/mod.d.ts +2 -2
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +1 -1
- package/dist/mod.js.map +1 -1
- package/dist/reactive.d.ts +10 -10
- package/dist/reactive.d.ts.map +1 -1
- package/dist/reactive.js +36 -27
- package/dist/reactive.js.map +1 -1
- package/dist/reactive.test.js +115 -0
- package/dist/reactive.test.js.map +1 -1
- package/dist/store/create-store.d.ts.map +1 -1
- package/dist/store/create-store.js +3 -3
- package/dist/store/create-store.js.map +1 -1
- package/dist/store/store-types.d.ts +13 -2
- package/dist/store/store-types.d.ts.map +1 -1
- package/dist/store/store-types.js.map +1 -1
- package/dist/store/store.d.ts +45 -29
- package/dist/store/store.d.ts.map +1 -1
- package/dist/store/store.js +165 -100
- package/dist/store/store.js.map +1 -1
- package/dist/utils/dev.d.ts +3 -0
- package/dist/utils/dev.d.ts.map +1 -1
- package/dist/utils/dev.js.map +1 -1
- package/dist/utils/tests/fixture.d.ts.map +1 -1
- package/dist/utils/tests/fixture.js +2 -1
- package/dist/utils/tests/fixture.js.map +1 -1
- package/dist/utils/tests/otel.d.ts +15 -14
- package/dist/utils/tests/otel.d.ts.map +1 -1
- package/dist/utils/tests/otel.js +20 -15
- package/dist/utils/tests/otel.js.map +1 -1
- package/package.json +7 -7
- package/src/ambient.d.ts +3 -3
- package/src/effect/LiveStore.ts +2 -4
- package/src/live-queries/__snapshots__/db-query.test.ts.snap +354 -130
- package/src/live-queries/base-class.ts +6 -3
- package/src/live-queries/db-query.test.ts +70 -24
- package/src/live-queries/db-query.ts +7 -4
- package/src/mod.ts +10 -1
- package/src/reactive.test.ts +150 -1
- package/src/reactive.ts +47 -39
- package/src/store/create-store.ts +12 -4
- package/src/store/store-types.ts +23 -2
- package/src/store/store.ts +262 -193
- package/src/utils/dev.ts +5 -0
- package/src/utils/tests/fixture.ts +2 -1
- package/src/utils/tests/otel.ts +31 -20
- package/dist/store/store-shutdown.test.d.ts +0 -2
- package/dist/store/store-shutdown.test.d.ts.map +0 -1
- package/dist/store/store-shutdown.test.js +0 -103
- package/dist/store/store-shutdown.test.js.map +0 -1
package/src/utils/tests/otel.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
25
|
-
|
|
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
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
...(
|
|
110
|
+
...omitUndefineds({ parentSpanId: span.parentSpanContext?.spanId }),
|
|
100
111
|
// traceState: span.spanContext().traceState ?? '',
|
|
101
112
|
name: span.name,
|
|
102
113
|
kind: 'SPAN_KIND_INTERNAL',
|
|
@@ -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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"}
|