@livestore/livestore 0.3.0-dev.4 → 0.3.0-dev.40
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/QueryCache.d.ts.map +1 -1
- package/dist/SqliteDbWrapper.d.ts +60 -0
- package/dist/SqliteDbWrapper.d.ts.map +1 -0
- package/dist/{SynchronousDatabaseWrapper.js → SqliteDbWrapper.js} +69 -34
- package/dist/SqliteDbWrapper.js.map +1 -0
- package/dist/effect/LiveStore.d.ts +6 -34
- package/dist/effect/LiveStore.d.ts.map +1 -1
- package/dist/effect/LiveStore.js +10 -12
- package/dist/effect/LiveStore.js.map +1 -1
- package/dist/effect/mod.d.ts +3 -0
- package/dist/effect/mod.d.ts.map +1 -0
- package/dist/effect/mod.js +3 -0
- package/dist/effect/mod.js.map +1 -0
- package/dist/internal/mod.d.ts +3 -0
- package/dist/internal/mod.d.ts.map +1 -0
- package/dist/internal/mod.js +3 -0
- package/dist/internal/mod.js.map +1 -0
- package/dist/live-queries/base-class.d.ts +65 -27
- package/dist/live-queries/base-class.d.ts.map +1 -1
- package/dist/live-queries/base-class.js +54 -13
- package/dist/live-queries/base-class.js.map +1 -1
- package/dist/live-queries/client-document-get-query.d.ts +12 -0
- package/dist/live-queries/client-document-get-query.d.ts.map +1 -0
- package/dist/live-queries/client-document-get-query.js +18 -0
- package/dist/live-queries/client-document-get-query.js.map +1 -0
- package/dist/live-queries/computed.d.ts +12 -14
- package/dist/live-queries/computed.d.ts.map +1 -1
- package/dist/live-queries/computed.js +37 -15
- package/dist/live-queries/computed.js.map +1 -1
- package/dist/live-queries/db-query.d.ts +64 -0
- package/dist/live-queries/db-query.d.ts.map +1 -0
- package/dist/live-queries/{db.js → db-query.js} +83 -41
- package/dist/live-queries/db-query.js.map +1 -0
- package/dist/live-queries/db-query.test.d.ts +2 -0
- package/dist/live-queries/db-query.test.d.ts.map +1 -0
- package/dist/live-queries/db-query.test.js +133 -0
- package/dist/live-queries/db-query.test.js.map +1 -0
- package/dist/live-queries/mod.d.ts +5 -0
- package/dist/live-queries/mod.d.ts.map +1 -0
- package/dist/live-queries/mod.js +5 -0
- package/dist/live-queries/mod.js.map +1 -0
- package/dist/live-queries/signal.d.ts +20 -0
- package/dist/live-queries/signal.d.ts.map +1 -0
- package/dist/live-queries/signal.js +33 -0
- package/dist/live-queries/signal.js.map +1 -0
- package/dist/live-queries/signal.test.d.ts +2 -0
- package/dist/live-queries/signal.test.d.ts.map +1 -0
- package/dist/live-queries/signal.test.js +17 -0
- package/dist/live-queries/signal.test.js.map +1 -0
- package/dist/mod.d.ts +14 -0
- package/dist/mod.d.ts.map +1 -0
- package/dist/mod.js +13 -0
- package/dist/mod.js.map +1 -0
- package/dist/reactive.d.ts +23 -17
- package/dist/reactive.d.ts.map +1 -1
- package/dist/reactive.js +23 -19
- package/dist/reactive.js.map +1 -1
- package/dist/reactive.test.js +1 -1
- package/dist/reactive.test.js.map +1 -1
- package/dist/store/create-store.d.ts +70 -12
- package/dist/store/create-store.d.ts.map +1 -1
- package/dist/store/create-store.js +69 -19
- package/dist/store/create-store.js.map +1 -1
- package/dist/store/devtools.d.ts +5 -4
- package/dist/store/devtools.d.ts.map +1 -1
- package/dist/store/devtools.js +103 -47
- package/dist/store/devtools.js.map +1 -1
- package/dist/store/store-types.d.ts +32 -42
- package/dist/store/store-types.d.ts.map +1 -1
- package/dist/store/store-types.js +2 -5
- package/dist/store/store-types.js.map +1 -1
- package/dist/store/store.d.ts +104 -39
- package/dist/store/store.d.ts.map +1 -1
- package/dist/store/store.js +261 -214
- package/dist/store/store.js.map +1 -1
- package/dist/utils/data-structures.d.ts.map +1 -1
- package/dist/utils/dev.d.ts.map +1 -1
- package/dist/utils/dev.js +6 -1
- package/dist/utils/dev.js.map +1 -1
- package/dist/utils/function-string.d.ts +7 -0
- package/dist/utils/function-string.d.ts.map +1 -0
- package/dist/utils/function-string.js +9 -0
- package/dist/utils/function-string.js.map +1 -0
- package/dist/utils/stack-info.d.ts.map +1 -1
- package/dist/utils/stack-info.js +6 -1
- package/dist/utils/stack-info.js.map +1 -1
- package/dist/utils/stack-info.test.js +54 -1
- package/dist/utils/stack-info.test.js.map +1 -1
- package/dist/utils/tests/fixture.d.ts +59 -216
- package/dist/utils/tests/fixture.d.ts.map +1 -1
- package/dist/utils/tests/fixture.js +23 -18
- package/dist/utils/tests/fixture.js.map +1 -1
- package/dist/utils/tests/mod.d.ts +1 -0
- package/dist/utils/tests/mod.d.ts.map +1 -1
- package/dist/utils/tests/mod.js +1 -0
- package/dist/utils/tests/mod.js.map +1 -1
- package/dist/utils/tests/otel.d.ts.map +1 -1
- package/dist/utils/tests/otel.js +8 -3
- package/dist/utils/tests/otel.js.map +1 -1
- package/package.json +29 -26
- package/src/{SynchronousDatabaseWrapper.ts → SqliteDbWrapper.ts} +92 -42
- package/src/effect/LiveStore.ts +27 -64
- package/src/effect/{index.ts → mod.ts} +2 -3
- package/src/internal/mod.ts +2 -0
- package/src/live-queries/__snapshots__/{db.test.ts.snap → db-query.test.ts.snap} +220 -45
- package/src/live-queries/base-class.ts +152 -50
- package/src/live-queries/client-document-get-query.ts +52 -0
- package/src/live-queries/computed.ts +51 -33
- package/src/live-queries/db-query.test.ts +192 -0
- package/src/live-queries/{db.ts → db-query.ts} +140 -82
- package/src/live-queries/mod.ts +4 -0
- package/src/live-queries/signal.test.ts +25 -0
- package/src/live-queries/signal.ts +47 -0
- package/src/mod.ts +42 -0
- package/src/reactive.test.ts +1 -1
- package/src/reactive.ts +66 -43
- package/src/store/create-store.ts +187 -59
- package/src/store/devtools.ts +136 -54
- package/src/store/store-types.ts +31 -43
- package/src/store/store.ts +385 -309
- package/src/utils/dev.ts +6 -1
- package/src/utils/function-string.ts +12 -0
- package/src/utils/stack-info.test.ts +58 -1
- package/src/utils/stack-info.ts +6 -1
- package/src/utils/tests/fixture.ts +22 -31
- package/src/utils/tests/mod.ts +1 -0
- package/src/utils/tests/otel.ts +10 -3
- package/dist/SynchronousDatabaseWrapper.d.ts +0 -41
- package/dist/SynchronousDatabaseWrapper.d.ts.map +0 -1
- package/dist/SynchronousDatabaseWrapper.js.map +0 -1
- package/dist/effect/index.d.ts +0 -2
- package/dist/effect/index.d.ts.map +0 -1
- package/dist/effect/index.js +0 -2
- package/dist/effect/index.js.map +0 -1
- package/dist/global-state.d.ts +0 -14
- package/dist/global-state.d.ts.map +0 -1
- package/dist/global-state.js +0 -16
- package/dist/global-state.js.map +0 -1
- package/dist/index.d.ts +0 -20
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -16
- package/dist/index.js.map +0 -1
- package/dist/live-queries/db.d.ts +0 -66
- package/dist/live-queries/db.d.ts.map +0 -1
- package/dist/live-queries/db.js.map +0 -1
- package/dist/live-queries/db.test.d.ts +0 -2
- package/dist/live-queries/db.test.d.ts.map +0 -1
- package/dist/live-queries/db.test.js +0 -118
- package/dist/live-queries/db.test.js.map +0 -1
- package/dist/live-queries/graphql.d.ts +0 -49
- package/dist/live-queries/graphql.d.ts.map +0 -1
- package/dist/live-queries/graphql.js +0 -122
- package/dist/live-queries/graphql.js.map +0 -1
- package/dist/row-query-utils.d.ts +0 -17
- package/dist/row-query-utils.d.ts.map +0 -1
- package/dist/row-query-utils.js +0 -31
- package/dist/row-query-utils.js.map +0 -1
- package/dist/utils/otel.d.ts +0 -4
- package/dist/utils/otel.d.ts.map +0 -1
- package/dist/utils/otel.js +0 -6
- package/dist/utils/otel.js.map +0 -1
- package/src/global-state.ts +0 -20
- package/src/index.ts +0 -66
- package/src/live-queries/db.test.ts +0 -154
- package/src/live-queries/graphql.ts +0 -219
- package/src/row-query-utils.ts +0 -66
- package/src/utils/otel.ts +0 -9
- package/tsconfig.json +0 -18
- package/vitest.config.js +0 -9
@@ -0,0 +1,133 @@
|
|
1
|
+
import { sql } from '@livestore/common';
|
2
|
+
import { rawSqlEvent } from '@livestore/common/schema';
|
3
|
+
import { Effect, ReadonlyRecord, Schema } from '@livestore/utils/effect';
|
4
|
+
import { Vitest } from '@livestore/utils-dev/node-vitest';
|
5
|
+
import * as otel from '@opentelemetry/api';
|
6
|
+
import { BasicTracerProvider, InMemorySpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';
|
7
|
+
import { expect } from 'vitest';
|
8
|
+
import * as RG from '../reactive.js';
|
9
|
+
import { makeTodoMvc, tables } from '../utils/tests/fixture.js';
|
10
|
+
import { getSimplifiedRootSpan } from '../utils/tests/otel.js';
|
11
|
+
import { computed } from './computed.js';
|
12
|
+
import { queryDb } from './db-query.js';
|
13
|
+
/*
|
14
|
+
TODO write tests for:
|
15
|
+
|
16
|
+
- sql queries without and with `map` (incl. callback and schemas)
|
17
|
+
- optional and explicit `queriedTables` argument
|
18
|
+
*/
|
19
|
+
Vitest.describe('otel', () => {
|
20
|
+
const mapAttributes = (attributes) => {
|
21
|
+
return ReadonlyRecord.map(attributes, (val, key) => {
|
22
|
+
if (key === 'code.stacktrace') {
|
23
|
+
return '<STACKTRACE>';
|
24
|
+
}
|
25
|
+
return val;
|
26
|
+
});
|
27
|
+
};
|
28
|
+
const makeQuery = Effect.gen(function* () {
|
29
|
+
const exporter = new InMemorySpanExporter();
|
30
|
+
RG.__resetIds();
|
31
|
+
const provider = new BasicTracerProvider({
|
32
|
+
spanProcessors: [new SimpleSpanProcessor(exporter)],
|
33
|
+
});
|
34
|
+
const otelTracer = provider.getTracer('test');
|
35
|
+
const span = otelTracer.startSpan('test-root');
|
36
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
37
|
+
const store = yield* makeTodoMvc({ otelTracer, otelContext });
|
38
|
+
return {
|
39
|
+
store,
|
40
|
+
otelTracer,
|
41
|
+
exporter,
|
42
|
+
span,
|
43
|
+
provider,
|
44
|
+
};
|
45
|
+
});
|
46
|
+
Vitest.scopedLive('otel', () => Effect.gen(function* () {
|
47
|
+
const { store, exporter, span, provider } = yield* makeQuery;
|
48
|
+
const query$ = queryDb({
|
49
|
+
query: `select * from todos`,
|
50
|
+
schema: Schema.Array(tables.todos.rowSchema),
|
51
|
+
queriedTables: new Set(['todos']),
|
52
|
+
});
|
53
|
+
expect(store.query(query$)).toMatchInlineSnapshot('[]');
|
54
|
+
store.commit(rawSqlEvent({ sql: sql `INSERT INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0)` }));
|
55
|
+
expect(store.query(query$)).toMatchInlineSnapshot(`
|
56
|
+
[
|
57
|
+
{
|
58
|
+
"completed": false,
|
59
|
+
"id": "t1",
|
60
|
+
"text": "buy milk",
|
61
|
+
},
|
62
|
+
]
|
63
|
+
`);
|
64
|
+
span.end();
|
65
|
+
return { exporter, provider };
|
66
|
+
}).pipe(Effect.scoped, Effect.tap(({ exporter, provider }) => Effect.promise(async () => {
|
67
|
+
await provider.forceFlush();
|
68
|
+
expect(getSimplifiedRootSpan(exporter, mapAttributes)).toMatchSnapshot();
|
69
|
+
await provider.shutdown();
|
70
|
+
}))));
|
71
|
+
Vitest.scopedLive('with thunks', () => Effect.gen(function* () {
|
72
|
+
const { store, exporter, span, provider } = yield* makeQuery;
|
73
|
+
const defaultTodo = { id: '', text: '', completed: false };
|
74
|
+
const filter = computed(() => `where completed = 0`, { label: 'where-filter' });
|
75
|
+
const query$ = queryDb((get) => ({
|
76
|
+
query: `select * from todos ${get(filter)}`,
|
77
|
+
schema: Schema.Array(tables.todos.rowSchema).pipe(Schema.headOrElse(() => defaultTodo)),
|
78
|
+
}), { label: 'all todos' });
|
79
|
+
expect(store.reactivityGraph.getSnapshot({ includeResults: true })).toMatchSnapshot();
|
80
|
+
expect(store.query(query$)).toMatchInlineSnapshot(`
|
81
|
+
{
|
82
|
+
"completed": false,
|
83
|
+
"id": "",
|
84
|
+
"text": "",
|
85
|
+
}
|
86
|
+
`);
|
87
|
+
expect(store.reactivityGraph.getSnapshot({ includeResults: true })).toMatchSnapshot();
|
88
|
+
store.commit(rawSqlEvent({ sql: sql `INSERT INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0)` }));
|
89
|
+
expect(store.reactivityGraph.getSnapshot({ includeResults: true })).toMatchSnapshot();
|
90
|
+
expect(store.query(query$)).toMatchInlineSnapshot(`
|
91
|
+
{
|
92
|
+
"completed": false,
|
93
|
+
"id": "t1",
|
94
|
+
"text": "buy milk",
|
95
|
+
}
|
96
|
+
`);
|
97
|
+
expect(store.reactivityGraph.getSnapshot({ includeResults: true })).toMatchSnapshot();
|
98
|
+
span.end();
|
99
|
+
return { exporter, provider };
|
100
|
+
}).pipe(Effect.scoped, Effect.tap(({ exporter, provider }) => Effect.promise(async () => {
|
101
|
+
await provider.forceFlush();
|
102
|
+
expect(getSimplifiedRootSpan(exporter, mapAttributes)).toMatchSnapshot();
|
103
|
+
await provider.shutdown();
|
104
|
+
}))));
|
105
|
+
Vitest.scopedLive('with thunks with query builder and without labels', () => Effect.gen(function* () {
|
106
|
+
const { store, exporter, span, provider } = yield* makeQuery;
|
107
|
+
const defaultTodo = { id: '', text: '', completed: false };
|
108
|
+
const filter = computed(() => ({ completed: false }));
|
109
|
+
const query$ = queryDb((get) => tables.todos.where(get(filter)).first({ fallback: () => defaultTodo }));
|
110
|
+
expect(store.query(query$)).toMatchInlineSnapshot(`
|
111
|
+
{
|
112
|
+
"completed": false,
|
113
|
+
"id": "",
|
114
|
+
"text": "",
|
115
|
+
}
|
116
|
+
`);
|
117
|
+
store.commit(rawSqlEvent({ sql: sql `INSERT INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0)` }));
|
118
|
+
expect(store.query(query$)).toMatchInlineSnapshot(`
|
119
|
+
{
|
120
|
+
"completed": false,
|
121
|
+
"id": "t1",
|
122
|
+
"text": "buy milk",
|
123
|
+
}
|
124
|
+
`);
|
125
|
+
span.end();
|
126
|
+
return { exporter, provider };
|
127
|
+
}).pipe(Effect.scoped, Effect.tap(({ exporter, provider }) => Effect.promise(async () => {
|
128
|
+
await provider.forceFlush();
|
129
|
+
expect(getSimplifiedRootSpan(exporter, mapAttributes)).toMatchSnapshot();
|
130
|
+
await provider.shutdown();
|
131
|
+
}))));
|
132
|
+
});
|
133
|
+
//# sourceMappingURL=db-query.test.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"db-query.test.js","sourceRoot":"","sources":["../../src/live-queries/db-query.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAA;AACzD,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AAC9G,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC;;;;;EAKE;AAEF,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IAC3B,MAAM,aAAa,GAAG,CAAC,UAA2B,EAAE,EAAE;QACpD,OAAO,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACjD,IAAI,GAAG,KAAK,iBAAiB,EAAE,CAAC;gBAC9B,OAAO,cAAc,CAAA;YACvB,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,oBAAoB,EAAE,CAAA;QAE3C,EAAE,CAAC,UAAU,EAAE,CAAA;QAEf,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC;YACvC,cAAc,EAAE,CAAC,IAAI,mBAAmB,CAAC,QAAQ,CAAC,CAAC;SACpD,CAAC,CAAA;QAEF,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QAE7C,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAA;QAEnE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAA;QAE7D,OAAO;YACL,KAAK;YACL,UAAU;YACV,QAAQ;YACR,IAAI;YACJ,QAAQ;SACT,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE,CAC7B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,SAAS,CAAA;QAE5D,MAAM,MAAM,GAAG,OAAO,CAAC;YACrB,KAAK,EAAE,qBAAqB;YAC5B,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;YAC5C,aAAa,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;SAClC,CAAC,CAAA;QACF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;QAEvD,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,GAAG,CAAA,sEAAsE,EAAE,CAAC,CAAC,CAAA;QAE7G,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;KAQnD,CAAC,CAAA;QAEA,IAAI,CAAC,GAAG,EAAE,CAAA;QAEV,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;IAC/B,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,CACpC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;QACxB,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAA;QAC3B,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,eAAe,EAAE,CAAA;QACxE,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAA;IAC3B,CAAC,CAAC,CACH,CACF,CACF,CAAA;IAED,MAAM,CAAC,UAAU,CAAC,aAAa,EAAE,GAAG,EAAE,CACpC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,SAAS,CAAA;QAE5D,MAAM,WAAW,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;QAE1D,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAA;QAC/E,MAAM,MAAM,GAAG,OAAO,CACpB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACR,KAAK,EAAE,uBAAuB,GAAG,CAAC,MAAM,CAAC,EAAE;YAC3C,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC;SACxF,CAAC,EACF,EAAE,KAAK,EAAE,WAAW,EAAE,CACvB,CAAA;QAED,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,CAAA;QAErF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;;;;KAMnD,CAAC,CAAA;QAEA,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,CAAA;QAErF,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,GAAG,CAAA,sEAAsE,EAAE,CAAC,CAAC,CAAA;QAE7G,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,CAAA;QAErF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;;;;KAMnD,CAAC,CAAA;QAEA,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,CAAA;QAErF,IAAI,CAAC,GAAG,EAAE,CAAA;QAEV,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;IAC/B,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,CACpC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;QACxB,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAA;QAC3B,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,eAAe,EAAE,CAAA;QACxE,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAA;IAC3B,CAAC,CAAC,CACH,CACF,CACF,CAAA;IAED,MAAM,CAAC,UAAU,CAAC,mDAAmD,EAAE,GAAG,EAAE,CAC1E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,SAAS,CAAA;QAE5D,MAAM,WAAW,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;QAE1D,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;QAEvG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;;;;KAMnD,CAAC,CAAA;QAEA,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,GAAG,CAAA,sEAAsE,EAAE,CAAC,CAAC,CAAA;QAE7G,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;;;;KAMnD,CAAC,CAAA;QAEA,IAAI,CAAC,GAAG,EAAE,CAAA;QAEV,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;IAC/B,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,CACpC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;QACxB,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAA;QAC3B,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,eAAe,EAAE,CAAA;QACxE,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAA;IAC3B,CAAC,CAAC,CACH,CACF,CACF,CAAA;AACH,CAAC,CAAC,CAAA"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/live-queries/mod.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/live-queries/mod.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA"}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import type * as RG from '../reactive.js';
|
2
|
+
import type { RefreshReason } from '../store/store-types.js';
|
3
|
+
import type { ISignal, ReactivityGraph, ReactivityGraphContext, SignalDef } from './base-class.js';
|
4
|
+
export declare const signal: <T>(defaultValue: T, options?: {
|
5
|
+
label?: string;
|
6
|
+
}) => SignalDef<T>;
|
7
|
+
export declare class Signal<T> implements ISignal<T> {
|
8
|
+
private defaultValue;
|
9
|
+
readonly reactivityGraph: ReactivityGraph;
|
10
|
+
private options?;
|
11
|
+
_tag: "signal";
|
12
|
+
readonly ref: RG.Ref<T, ReactivityGraphContext, RefreshReason>;
|
13
|
+
constructor(defaultValue: T, reactivityGraph: ReactivityGraph, options?: {
|
14
|
+
label?: string;
|
15
|
+
} | undefined);
|
16
|
+
set: (value: T) => void;
|
17
|
+
get: () => T;
|
18
|
+
destroy: () => void;
|
19
|
+
}
|
20
|
+
//# sourceMappingURL=signal.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../../src/live-queries/signal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAGlG,eAAO,MAAM,MAAM,GAAI,CAAC,EACtB,cAAc,CAAC,EACf,UAAU;IACR,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,KACA,SAAS,CAAC,CAAC,CAOb,CAAA;AAED,qBAAa,MAAM,CAAC,CAAC,CAAE,YAAW,OAAO,CAAC,CAAC,CAAC;IAKxC,OAAO,CAAC,YAAY;IACpB,QAAQ,CAAC,eAAe,EAAE,eAAe;IACzC,OAAO,CAAC,OAAO,CAAC;IANlB,IAAI,EAAG,QAAQ,CAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,sBAAsB,EAAE,aAAa,CAAC,CAAA;gBAGpD,YAAY,EAAE,CAAC,EACd,eAAe,EAAE,eAAe,EACjC,OAAO,CAAC,EAAE;QAChB,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,YAAA;IAKH,GAAG,GAAI,OAAO,CAAC,UAEd;IAED,GAAG,UAEF;IAED,OAAO,aAEN;CACF"}
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import { nanoid } from '@livestore/utils/nanoid';
|
2
|
+
import { withRCMap } from './base-class.js';
|
3
|
+
export const signal = (defaultValue, options) => {
|
4
|
+
const id = nanoid();
|
5
|
+
return {
|
6
|
+
_tag: 'signal-def',
|
7
|
+
defaultValue,
|
8
|
+
make: withRCMap(id, (ctx) => new Signal(defaultValue, ctx.reactivityGraph.deref(), options)),
|
9
|
+
};
|
10
|
+
};
|
11
|
+
export class Signal {
|
12
|
+
defaultValue;
|
13
|
+
reactivityGraph;
|
14
|
+
options;
|
15
|
+
_tag = 'signal';
|
16
|
+
ref;
|
17
|
+
constructor(defaultValue, reactivityGraph, options) {
|
18
|
+
this.defaultValue = defaultValue;
|
19
|
+
this.reactivityGraph = reactivityGraph;
|
20
|
+
this.options = options;
|
21
|
+
this.ref = reactivityGraph.makeRef(defaultValue, { label: options?.label });
|
22
|
+
}
|
23
|
+
set = (value) => {
|
24
|
+
this.reactivityGraph.setRef(this.ref, value);
|
25
|
+
};
|
26
|
+
get = () => {
|
27
|
+
return this.ref.computeResult();
|
28
|
+
};
|
29
|
+
destroy = () => {
|
30
|
+
this.reactivityGraph.destroyNode(this.ref);
|
31
|
+
};
|
32
|
+
}
|
33
|
+
//# sourceMappingURL=signal.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"signal.js","sourceRoot":"","sources":["../../src/live-queries/signal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAKhD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,YAAe,EACf,OAEC,EACa,EAAE;IAChB,MAAM,EAAE,GAAG,MAAM,EAAE,CAAA;IACnB,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,YAAY;QACZ,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,eAAe,CAAC,KAAK,EAAG,EAAE,OAAO,CAAC,CAAC;KAC9F,CAAA;AACH,CAAC,CAAA;AAED,MAAM,OAAO,MAAM;IAKP;IACC;IACD;IANV,IAAI,GAAG,QAAiB,CAAA;IACf,GAAG,CAAkD;IAE9D,YACU,YAAe,EACd,eAAgC,EACjC,OAEP;QAJO,iBAAY,GAAZ,YAAY,CAAG;QACd,oBAAe,GAAf,eAAe,CAAiB;QACjC,YAAO,GAAP,OAAO,CAEd;QAED,IAAI,CAAC,GAAG,GAAG,eAAe,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;IAC7E,CAAC;IAED,GAAG,GAAG,CAAC,KAAQ,EAAE,EAAE;QACjB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAC9C,CAAC,CAAA;IAED,GAAG,GAAG,GAAG,EAAE;QACT,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAA;IACjC,CAAC,CAAA;IAED,OAAO,GAAG,GAAG,EAAE;QACb,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5C,CAAC,CAAA;CACF"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"signal.test.d.ts","sourceRoot":"","sources":["../../src/live-queries/signal.test.ts"],"names":[],"mappings":""}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { Effect } from '@livestore/utils/effect';
|
2
|
+
import { Vitest } from '@livestore/utils-dev/node-vitest';
|
3
|
+
import { expect } from 'vitest';
|
4
|
+
import { makeTodoMvc } from '../utils/tests/fixture.js';
|
5
|
+
import { computed } from './computed.js';
|
6
|
+
import { signal } from './signal.js';
|
7
|
+
Vitest.describe('signal', () => {
|
8
|
+
Vitest.scopedLive('should be able to create a signal', () => Effect.gen(function* () {
|
9
|
+
const num$ = signal(0, { label: 'num$' });
|
10
|
+
const duplicated$ = computed((get) => get(num$) * 2, { label: 'duplicated$' });
|
11
|
+
const store = yield* makeTodoMvc({});
|
12
|
+
expect(store.query(duplicated$)).toBe(0);
|
13
|
+
store.setSignal(num$, 1);
|
14
|
+
expect(store.query(duplicated$)).toBe(2);
|
15
|
+
}));
|
16
|
+
});
|
17
|
+
//# sourceMappingURL=signal.test.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"signal.test.js","sourceRoot":"","sources":["../../src/live-queries/signal.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IAC7B,MAAM,CAAC,UAAU,CAAC,mCAAmC,EAAE,GAAG,EAAE,CAC1D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QAEzC,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAA;QAE9E,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;QAEpC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAExC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QAExB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC1C,CAAC,CAAC,CACH,CAAA;AACH,CAAC,CAAC,CAAA"}
|
package/dist/mod.d.ts
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
export { Store } from './store/store.js';
|
2
|
+
export { createStore, createStorePromise, type CreateStoreOptions } from './store/create-store.js';
|
3
|
+
export type { QueryDebugInfo, RefreshReason, OtelOptions } from './store/store-types.js';
|
4
|
+
export { Schema } from '@livestore/utils/effect';
|
5
|
+
export { type LiveStoreContext, type LiveStoreContextRunning, type ShutdownDeferred, makeShutdownDeferred, } from './store/store-types.js';
|
6
|
+
export { SqliteDbWrapper, emptyDebugInfo } from './SqliteDbWrapper.js';
|
7
|
+
export { queryDb, computed, signal, type LiveQuery, type LiveQueryDef } from './live-queries/mod.js';
|
8
|
+
export * from '@livestore/common/schema';
|
9
|
+
export { sql, SessionIdSymbol, type BootStatus, type SqliteDb, type DebugInfo, type MutableDebugInfo, prepareBindValues, type Bindable, type PreparedBindValues, type QueryBuilderAst, type QueryBuilder, type RowQuery, StoreInterrupted, IntentionalShutdownCause, provideOtel, } from '@livestore/common';
|
10
|
+
export { deepEqual } from '@livestore/utils';
|
11
|
+
export { nanoid } from '@livestore/utils/nanoid';
|
12
|
+
export * from './utils/stack-info.js';
|
13
|
+
export type { ClientSession, Adapter, PreparedStatement } from '@livestore/common';
|
14
|
+
//# sourceMappingURL=mod.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAClG,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAExF,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,oBAAoB,GACrB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAEtE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEpG,cAAc,0BAA0B,CAAA;AACxC,OAAO,EACL,GAAG,EACH,eAAe,EACf,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,iBAAiB,EACjB,KAAK,QAAQ,EACb,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,gBAAgB,EAChB,wBAAwB,EACxB,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,cAAc,uBAAuB,CAAA;AAErC,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA"}
|
package/dist/mod.js
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
export { Store } from './store/store.js';
|
2
|
+
export { createStore, createStorePromise } from './store/create-store.js';
|
3
|
+
// We're re-exporting `Schema` from `effect` for convenience
|
4
|
+
export { Schema } from '@livestore/utils/effect';
|
5
|
+
export { makeShutdownDeferred, } from './store/store-types.js';
|
6
|
+
export { SqliteDbWrapper, emptyDebugInfo } from './SqliteDbWrapper.js';
|
7
|
+
export { queryDb, computed, signal } from './live-queries/mod.js';
|
8
|
+
export * from '@livestore/common/schema';
|
9
|
+
export { sql, SessionIdSymbol, prepareBindValues, StoreInterrupted, IntentionalShutdownCause, provideOtel, } from '@livestore/common';
|
10
|
+
export { deepEqual } from '@livestore/utils';
|
11
|
+
export { nanoid } from '@livestore/utils/nanoid';
|
12
|
+
export * from './utils/stack-info.js';
|
13
|
+
//# sourceMappingURL=mod.js.map
|
package/dist/mod.js.map
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAA2B,MAAM,yBAAyB,CAAA;AAElG,4DAA4D;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,EAIL,oBAAoB,GACrB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAEtE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAqC,MAAM,uBAAuB,CAAA;AAEpG,cAAc,0BAA0B,CAAA;AACxC,OAAO,EACL,GAAG,EACH,eAAe,EAKf,iBAAiB,EAMjB,gBAAgB,EAChB,wBAAwB,EACxB,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,cAAc,uBAAuB,CAAA"}
|
package/dist/reactive.d.ts
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
import { BoundArray } from '@livestore/common';
|
2
|
-
import type {
|
2
|
+
import type { Types } from '@livestore/utils/effect';
|
3
3
|
import type * as otel from '@opentelemetry/api';
|
4
4
|
export declare const NOT_REFRESHED_YET: unique symbol;
|
5
5
|
export type NOT_REFRESHED_YET = typeof NOT_REFRESHED_YET;
|
6
|
-
export type GetAtom = <T>(atom: Atom<T, any, any>, otelContext?: otel.Context) => T;
|
6
|
+
export type GetAtom = <T>(atom: Atom<T, any, any>, otelContext?: otel.Context | undefined, debugRefreshReason?: TODO | undefined) => T;
|
7
7
|
export type Ref<T, TContext, TDebugRefreshReason extends DebugRefreshReason> = {
|
8
8
|
_tag: 'ref';
|
9
9
|
id: string;
|
@@ -12,7 +12,7 @@ export type Ref<T, TContext, TDebugRefreshReason extends DebugRefreshReason> = {
|
|
12
12
|
previousResult: T;
|
13
13
|
computeResult: () => T;
|
14
14
|
sub: Set<Atom<any, TContext, TDebugRefreshReason>>;
|
15
|
-
super: Set<Thunk<any, TContext, TDebugRefreshReason> | Effect
|
15
|
+
super: Set<Thunk<any, TContext, TDebugRefreshReason> | Effect<TDebugRefreshReason>>;
|
16
16
|
label?: string;
|
17
17
|
/** Container for meta information (e.g. the LiveStore Store) */
|
18
18
|
meta?: any;
|
@@ -27,7 +27,7 @@ export type Thunk<TResult, TContext, TDebugRefreshReason extends DebugRefreshRea
|
|
27
27
|
computeResult: (otelContext?: otel.Context, debugRefreshReason?: TDebugRefreshReason) => TResult;
|
28
28
|
previousResult: TResult | NOT_REFRESHED_YET;
|
29
29
|
sub: Set<Atom<any, TContext, TDebugRefreshReason>>;
|
30
|
-
super: Set<Thunk<any, TContext, TDebugRefreshReason> | Effect
|
30
|
+
super: Set<Thunk<any, TContext, TDebugRefreshReason> | Effect<TDebugRefreshReason>>;
|
31
31
|
label?: string;
|
32
32
|
/** Container for meta information (e.g. the LiveStore Store) */
|
33
33
|
meta?: any;
|
@@ -36,23 +36,23 @@ export type Thunk<TResult, TContext, TDebugRefreshReason extends DebugRefreshRea
|
|
36
36
|
__getResult: any;
|
37
37
|
};
|
38
38
|
export type Atom<T, TContext, TDebugRefreshReason extends DebugRefreshReason> = Ref<T, TContext, TDebugRefreshReason> | Thunk<T, TContext, TDebugRefreshReason>;
|
39
|
-
export type Effect = {
|
39
|
+
export type Effect<TDebugRefreshReason extends DebugRefreshReason> = {
|
40
40
|
_tag: 'effect';
|
41
41
|
id: string;
|
42
42
|
isDestroyed: boolean;
|
43
|
-
doEffect: (otelContext?: otel.Context) => void;
|
43
|
+
doEffect: (otelContext?: otel.Context | undefined, debugRefreshReason?: TDebugRefreshReason | undefined) => void;
|
44
44
|
sub: Set<Atom<any, TODO, TODO>>;
|
45
45
|
label?: string;
|
46
46
|
invocations: number;
|
47
47
|
};
|
48
|
-
export type Node<T, TContext, TDebugRefreshReason extends DebugRefreshReason> = Atom<T, TContext, TDebugRefreshReason> | Effect
|
48
|
+
export type Node<T, TContext, TDebugRefreshReason extends DebugRefreshReason> = Atom<T, TContext, TDebugRefreshReason> | Effect<TDebugRefreshReason>;
|
49
49
|
export declare const isThunk: <T, TContext, TDebugRefreshReason extends DebugRefreshReason>(obj: unknown) => obj is Thunk<T, TContext, TDebugRefreshReason>;
|
50
50
|
export type DebugThunkInfo<T extends string = string> = {
|
51
51
|
_tag: T;
|
52
52
|
durationMs: number;
|
53
53
|
};
|
54
54
|
export type DebugRefreshReasonBase =
|
55
|
-
/** Usually in response to some `
|
55
|
+
/** Usually in response to some `commit` calls with `skipRefresh: true` */
|
56
56
|
{
|
57
57
|
_tag: 'runDeferredEffects';
|
58
58
|
originalRefreshReasons?: ReadonlyArray<DebugRefreshReasonBase>;
|
@@ -89,19 +89,19 @@ export type EncodedOption<A> = {
|
|
89
89
|
_tag: 'None';
|
90
90
|
};
|
91
91
|
export type SerializedAtom = SerializedRef | SerializedThunk;
|
92
|
-
export type SerializedRef = Readonly<
|
92
|
+
export type SerializedRef = Readonly<Types.Simplify<Pick<Ref<unknown, unknown, any>, '_tag' | 'id' | 'label' | 'meta' | 'isDirty' | 'isDestroyed' | 'refreshes'> & {
|
93
93
|
/** Is `None` if `getSnapshot` was called with `includeResults: false` which is the default */
|
94
94
|
previousResult: EncodedOption<string>;
|
95
95
|
sub: ReadonlyArray<string>;
|
96
96
|
super: ReadonlyArray<string>;
|
97
97
|
}>>;
|
98
|
-
export type SerializedThunk = Readonly<
|
98
|
+
export type SerializedThunk = Readonly<Types.Simplify<Pick<Thunk<unknown, unknown, any>, '_tag' | 'id' | 'label' | 'meta' | 'isDirty' | 'isDestroyed' | 'recomputations'> & {
|
99
99
|
/** Is `None` if `getSnapshot` was called with `includeResults: false` which is the default */
|
100
100
|
previousResult: EncodedOption<string>;
|
101
101
|
sub: ReadonlyArray<string>;
|
102
102
|
super: ReadonlyArray<string>;
|
103
103
|
}>>;
|
104
|
-
export type SerializedEffect = Readonly<
|
104
|
+
export type SerializedEffect = Readonly<Types.Simplify<Pick<Effect<any>, '_tag' | 'id' | 'label' | 'invocations' | 'isDestroyed'> & {
|
105
105
|
sub: ReadonlyArray<string>;
|
106
106
|
}>>;
|
107
107
|
export type ReactiveGraphSnapshot = {
|
@@ -110,32 +110,38 @@ export type ReactiveGraphSnapshot = {
|
|
110
110
|
/** IDs of deferred effects */
|
111
111
|
readonly deferredEffects: ReadonlyArray<string>;
|
112
112
|
};
|
113
|
+
/** Used for testing */
|
114
|
+
export declare const __resetIds: () => void;
|
113
115
|
export declare class ReactiveGraph<TDebugRefreshReason extends DebugRefreshReason, TDebugThunkInfo extends DebugThunkInfo, TContext extends {
|
114
116
|
effectsWrapper?: (runEffects: () => void) => void;
|
115
117
|
} = {}> {
|
116
118
|
id: string;
|
117
119
|
readonly atoms: Set<Atom<any, TContext, TDebugRefreshReason>>;
|
118
|
-
readonly effects: Set<Effect
|
120
|
+
readonly effects: Set<Effect<TDebugRefreshReason>>;
|
119
121
|
context: TContext | undefined;
|
120
122
|
debugRefreshInfos: BoundArray<RefreshDebugInfo<TDebugRefreshReason, TDebugThunkInfo>>;
|
121
123
|
private currentDebugRefresh;
|
122
124
|
private deferredEffects;
|
123
125
|
private refreshCallbacks;
|
126
|
+
private nodeIdCounter;
|
127
|
+
private uniqueNodeId;
|
128
|
+
private refreshInfoIdCounter;
|
129
|
+
private uniqueRefreshInfoId;
|
124
130
|
makeRef<T>(val: T, options?: {
|
125
131
|
label?: string;
|
126
132
|
meta?: unknown;
|
127
133
|
equal?: (a: T, b: T) => boolean;
|
128
134
|
}): Ref<T, TContext, TDebugRefreshReason>;
|
129
|
-
makeThunk<T>(getResult: (get: GetAtom, setDebugInfo: (debugInfo: TDebugThunkInfo) => void, ctx: TContext, otelContext: otel.Context | undefined) => T, options?: {
|
135
|
+
makeThunk<T>(getResult: (get: GetAtom, setDebugInfo: (debugInfo: TDebugThunkInfo) => void, ctx: TContext, otelContext: otel.Context | undefined, debugRefreshReason: TDebugRefreshReason | undefined) => T, options?: {
|
130
136
|
label?: string;
|
131
137
|
meta?: any;
|
132
138
|
equal?: (a: T, b: T) => boolean;
|
133
139
|
} | undefined): Thunk<T, TContext, TDebugRefreshReason>;
|
134
140
|
destroyNode(node: Node<any, TContext, TDebugRefreshReason>): void;
|
135
141
|
destroy(): void;
|
136
|
-
makeEffect(doEffect: (get: GetAtom, otelContext
|
142
|
+
makeEffect(doEffect: (get: GetAtom, otelContext: otel.Context | undefined, debugRefreshReason: DebugRefreshReason | undefined) => void, options?: {
|
137
143
|
label?: string;
|
138
|
-
} | undefined): Effect
|
144
|
+
} | undefined): Effect<TDebugRefreshReason>;
|
139
145
|
setRef<T>(ref: Ref<T, TContext, TDebugRefreshReason>, val: T, options?: {
|
140
146
|
skipRefresh?: boolean;
|
141
147
|
debugRefreshReason?: TDebugRefreshReason;
|
@@ -152,8 +158,8 @@ export declare class ReactiveGraph<TDebugRefreshReason extends DebugRefreshReaso
|
|
152
158
|
otelContext?: otel.Context;
|
153
159
|
}) => void;
|
154
160
|
runRefreshCallbacks: () => void;
|
155
|
-
addEdge(superComp: Thunk<any, TContext, TDebugRefreshReason> | Effect
|
156
|
-
removeEdge(superComp: Thunk<any, TContext, TDebugRefreshReason> | Effect
|
161
|
+
addEdge(superComp: Thunk<any, TContext, TDebugRefreshReason> | Effect<TDebugRefreshReason>, subComp: Atom<any, TContext, TDebugRefreshReason>): void;
|
162
|
+
removeEdge(superComp: Thunk<any, TContext, TDebugRefreshReason> | Effect<TDebugRefreshReason>, subComp: Atom<any, TContext, TDebugRefreshReason>): void;
|
157
163
|
getSnapshot: (opts?: {
|
158
164
|
includeResults: boolean;
|
159
165
|
}) => ReactiveGraphSnapshot;
|
package/dist/reactive.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"reactive.d.ts","sourceRoot":"","sources":["../src/reactive.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;
|
1
|
+
{"version":3,"file":"reactive.d.ts","sourceRoot":"","sources":["../src/reactive.ts"],"names":[],"mappings":"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"}
|
package/dist/reactive.js
CHANGED
@@ -30,25 +30,29 @@ const unknownRefreshReason = () => {
|
|
30
30
|
};
|
31
31
|
const encodedOptionSome = (value) => ({ _tag: 'Some', value });
|
32
32
|
const encodedOptionNone = () => ({ _tag: 'None' });
|
33
|
-
let nodeIdCounter = 0;
|
34
|
-
const uniqueNodeId = () => `node-${++nodeIdCounter}`;
|
35
|
-
let refreshInfoIdCounter = 0;
|
36
|
-
const uniqueRefreshInfoId = () => `refresh-info-${++refreshInfoIdCounter}`;
|
37
33
|
let globalGraphIdCounter = 0;
|
38
34
|
const uniqueGraphId = () => `graph-${++globalGraphIdCounter}`;
|
35
|
+
/** Used for testing */
|
36
|
+
export const __resetIds = () => {
|
37
|
+
globalGraphIdCounter = 0;
|
38
|
+
};
|
39
39
|
export class ReactiveGraph {
|
40
40
|
id = uniqueGraphId();
|
41
41
|
atoms = new Set();
|
42
42
|
effects = new Set();
|
43
43
|
context;
|
44
|
-
debugRefreshInfos = new BoundArray(
|
44
|
+
debugRefreshInfos = new BoundArray(200);
|
45
45
|
currentDebugRefresh;
|
46
46
|
deferredEffects = new Map();
|
47
47
|
refreshCallbacks = new Set();
|
48
|
+
nodeIdCounter = 0;
|
49
|
+
uniqueNodeId = () => `node-${++this.nodeIdCounter}`;
|
50
|
+
refreshInfoIdCounter = 0;
|
51
|
+
uniqueRefreshInfoId = () => `refresh-info-${++this.refreshInfoIdCounter}`;
|
48
52
|
makeRef(val, options) {
|
49
53
|
const ref = {
|
50
54
|
_tag: 'ref',
|
51
|
-
id: uniqueNodeId(),
|
55
|
+
id: this.uniqueNodeId(),
|
52
56
|
isDirty: false,
|
53
57
|
isDestroyed: false,
|
54
58
|
previousResult: val,
|
@@ -66,7 +70,7 @@ export class ReactiveGraph {
|
|
66
70
|
makeThunk(getResult, options) {
|
67
71
|
const thunk = {
|
68
72
|
_tag: 'thunk',
|
69
|
-
id: uniqueNodeId(),
|
73
|
+
id: this.uniqueNodeId(),
|
70
74
|
previousResult: NOT_REFRESHED_YET,
|
71
75
|
isDirty: true,
|
72
76
|
isDestroyed: false,
|
@@ -80,13 +84,13 @@ export class ReactiveGraph {
|
|
80
84
|
thunk.sub = new Set();
|
81
85
|
const getAtom = (atom, otelContext) => {
|
82
86
|
this.addEdge(thunk, atom);
|
83
|
-
return compute(atom, otelContext);
|
87
|
+
return compute(atom, otelContext, debugRefreshReason);
|
84
88
|
};
|
85
89
|
let debugInfo = undefined;
|
86
90
|
const setDebugInfo = (debugInfo_) => {
|
87
91
|
debugInfo = debugInfo_;
|
88
92
|
};
|
89
|
-
const result = getResult(getAtom, setDebugInfo, this.context ?? throwContextNotSetError(this), otelContext);
|
93
|
+
const result = getResult(getAtom, setDebugInfo, this.context ?? throwContextNotSetError(this), otelContext, debugRefreshReason);
|
90
94
|
const resultChanged = thunk.equal(thunk.previousResult, result) === false;
|
91
95
|
const debugInfoForAtom = {
|
92
96
|
atom: serializeAtom(thunk, false),
|
@@ -102,7 +106,7 @@ export class ReactiveGraph {
|
|
102
106
|
const durationMs = performance.now() - this.currentDebugRefresh.startMs;
|
103
107
|
this.currentDebugRefresh = undefined;
|
104
108
|
this.debugRefreshInfos.push({
|
105
|
-
id: uniqueRefreshInfoId(),
|
109
|
+
id: this.uniqueRefreshInfoId(),
|
106
110
|
reason: debugRefreshReason ?? { _tag: 'makeThunk', label: options?.label },
|
107
111
|
skippedRefresh: false,
|
108
112
|
refreshedAtoms,
|
@@ -160,18 +164,18 @@ export class ReactiveGraph {
|
|
160
164
|
makeEffect(doEffect, options) {
|
161
165
|
const effect = {
|
162
166
|
_tag: 'effect',
|
163
|
-
id: uniqueNodeId(),
|
167
|
+
id: this.uniqueNodeId(),
|
164
168
|
isDestroyed: false,
|
165
|
-
doEffect: (otelContext) => {
|
169
|
+
doEffect: (otelContext, debugRefreshReason) => {
|
166
170
|
effect.invocations++;
|
167
171
|
// NOTE we're not tracking any debug refresh info for effects as they're tracked by the thunks they depend on
|
168
172
|
// Reset previous subcomputations as we're about to re-add them as part of the `doEffect` call below
|
169
173
|
effect.sub = new Set();
|
170
|
-
const getAtom = (atom, otelContext) => {
|
174
|
+
const getAtom = (atom, otelContext, debugRefreshReason) => {
|
171
175
|
this.addEdge(effect, atom);
|
172
|
-
return compute(atom, otelContext);
|
176
|
+
return compute(atom, otelContext, debugRefreshReason);
|
173
177
|
};
|
174
|
-
doEffect(getAtom, otelContext);
|
178
|
+
doEffect(getAtom, otelContext, debugRefreshReason);
|
175
179
|
},
|
176
180
|
sub: new Set(),
|
177
181
|
label: options?.label,
|
@@ -212,13 +216,13 @@ export class ReactiveGraph {
|
|
212
216
|
effectsWrapper(() => {
|
213
217
|
this.currentDebugRefresh = { refreshedAtoms: [], startMs: performance.now() };
|
214
218
|
for (const effect of effectsToRefresh) {
|
215
|
-
effect.doEffect(options?.otelContext);
|
219
|
+
effect.doEffect(options?.otelContext, options.debugRefreshReason);
|
216
220
|
}
|
217
221
|
const refreshedAtoms = this.currentDebugRefresh.refreshedAtoms;
|
218
222
|
const durationMs = performance.now() - this.currentDebugRefresh.startMs;
|
219
223
|
this.currentDebugRefresh = undefined;
|
220
224
|
const refreshDebugInfo = {
|
221
|
-
id: uniqueRefreshInfoId(),
|
225
|
+
id: this.uniqueRefreshInfoId(),
|
222
226
|
reason: options.debugRefreshReason,
|
223
227
|
skippedRefresh: false,
|
224
228
|
refreshedAtoms,
|
@@ -293,14 +297,14 @@ export class ReactiveGraph {
|
|
293
297
|
};
|
294
298
|
};
|
295
299
|
}
|
296
|
-
const compute = (atom, otelContext) => {
|
300
|
+
const compute = (atom, otelContext, debugRefreshReason) => {
|
297
301
|
// const __getResult = atom._tag === 'thunk' ? atom.__getResult.toString() : ''
|
298
302
|
if (atom.isDestroyed) {
|
299
303
|
shouldNeverHappen(`LiveStore Error: Attempted to compute destroyed ${atom._tag} (${atom.id}): ${atom.label ?? ''}`);
|
300
304
|
}
|
301
305
|
if (atom.isDirty) {
|
302
306
|
// console.log('atom is dirty', atom.id, atom.label ?? '', atom._tag, __getResult)
|
303
|
-
const result = atom.computeResult(otelContext);
|
307
|
+
const result = atom.computeResult(otelContext, debugRefreshReason);
|
304
308
|
atom.isDirty = false;
|
305
309
|
atom.previousResult = result;
|
306
310
|
return result;
|