@sunfall/arc-db 0.1.0-alpha.0
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/LICENSE +21 -0
- package/dist/change-feed-dispatcher.d.ts +21 -0
- package/dist/change-feed-dispatcher.d.ts.map +1 -0
- package/dist/change-feed-dispatcher.js +53 -0
- package/dist/change-feed-dispatcher.js.map +1 -0
- package/dist/collection-change-feed-runtime.d.ts +32 -0
- package/dist/collection-change-feed-runtime.d.ts.map +1 -0
- package/dist/collection-change-feed-runtime.js +50 -0
- package/dist/collection-change-feed-runtime.js.map +1 -0
- package/dist/collection-contract.d.ts +525 -0
- package/dist/collection-contract.d.ts.map +1 -0
- package/dist/collection-contract.js +4 -0
- package/dist/collection-contract.js.map +1 -0
- package/dist/collection-definition-snapshot.d.ts +64 -0
- package/dist/collection-definition-snapshot.d.ts.map +1 -0
- package/dist/collection-definition-snapshot.js +122 -0
- package/dist/collection-definition-snapshot.js.map +1 -0
- package/dist/collection-errors.d.ts +38 -0
- package/dist/collection-errors.d.ts.map +1 -0
- package/dist/collection-errors.js +17 -0
- package/dist/collection-errors.js.map +1 -0
- package/dist/collection-ids.d.ts +6 -0
- package/dist/collection-ids.d.ts.map +1 -0
- package/dist/collection-ids.js +6 -0
- package/dist/collection-ids.js.map +1 -0
- package/dist/collection-index-materialization.d.ts +29 -0
- package/dist/collection-index-materialization.d.ts.map +1 -0
- package/dist/collection-index-materialization.js +118 -0
- package/dist/collection-index-materialization.js.map +1 -0
- package/dist/collection-mutation-queue.d.ts +10 -0
- package/dist/collection-mutation-queue.d.ts.map +1 -0
- package/dist/collection-mutation-queue.js +46 -0
- package/dist/collection-mutation-queue.js.map +1 -0
- package/dist/collection-mutation-workflow.d.ts +18 -0
- package/dist/collection-mutation-workflow.d.ts.map +1 -0
- package/dist/collection-mutation-workflow.js +252 -0
- package/dist/collection-mutation-workflow.js.map +1 -0
- package/dist/collection-persistence.d.ts +48 -0
- package/dist/collection-persistence.d.ts.map +1 -0
- package/dist/collection-persistence.js +323 -0
- package/dist/collection-persistence.js.map +1 -0
- package/dist/collection-policy.d.ts +5 -0
- package/dist/collection-policy.d.ts.map +1 -0
- package/dist/collection-policy.js +7 -0
- package/dist/collection-policy.js.map +1 -0
- package/dist/collection-preload.d.ts +21 -0
- package/dist/collection-preload.d.ts.map +1 -0
- package/dist/collection-preload.js +4 -0
- package/dist/collection-preload.js.map +1 -0
- package/dist/collection-projection-callback-policy.d.ts +14 -0
- package/dist/collection-projection-callback-policy.d.ts.map +1 -0
- package/dist/collection-projection-callback-policy.js +25 -0
- package/dist/collection-projection-callback-policy.js.map +1 -0
- package/dist/collection-reactive-binding.d.ts +72 -0
- package/dist/collection-reactive-binding.d.ts.map +1 -0
- package/dist/collection-reactive-binding.js +95 -0
- package/dist/collection-reactive-binding.js.map +1 -0
- package/dist/collection-registry.d.ts +56 -0
- package/dist/collection-registry.d.ts.map +1 -0
- package/dist/collection-registry.js +123 -0
- package/dist/collection-registry.js.map +1 -0
- package/dist/collection-row-ingress.d.ts +16 -0
- package/dist/collection-row-ingress.d.ts.map +1 -0
- package/dist/collection-row-ingress.js +110 -0
- package/dist/collection-row-ingress.js.map +1 -0
- package/dist/collection-runtime.d.ts +20 -0
- package/dist/collection-runtime.d.ts.map +1 -0
- package/dist/collection-runtime.js +256 -0
- package/dist/collection-runtime.js.map +1 -0
- package/dist/collection-snapshot-codec.d.ts +62 -0
- package/dist/collection-snapshot-codec.d.ts.map +1 -0
- package/dist/collection-snapshot-codec.js +563 -0
- package/dist/collection-snapshot-codec.js.map +1 -0
- package/dist/collection-state.d.ts +72 -0
- package/dist/collection-state.d.ts.map +1 -0
- package/dist/collection-state.js +276 -0
- package/dist/collection-state.js.map +1 -0
- package/dist/collection-sync-load-policy.d.ts +17 -0
- package/dist/collection-sync-load-policy.d.ts.map +1 -0
- package/dist/collection-sync-load-policy.js +245 -0
- package/dist/collection-sync-load-policy.js.map +1 -0
- package/dist/collection-value-detachment.d.ts +34 -0
- package/dist/collection-value-detachment.d.ts.map +1 -0
- package/dist/collection-value-detachment.js +248 -0
- package/dist/collection-value-detachment.js.map +1 -0
- package/dist/collection-write-commit.d.ts +32 -0
- package/dist/collection-write-commit.d.ts.map +1 -0
- package/dist/collection-write-commit.js +51 -0
- package/dist/collection-write-commit.js.map +1 -0
- package/dist/flush-policy.d.ts +130 -0
- package/dist/flush-policy.d.ts.map +1 -0
- package/dist/flush-policy.js +96 -0
- package/dist/flush-policy.js.map +1 -0
- package/dist/index.d.ts +481 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +251 -0
- package/dist/index.js.map +1 -0
- package/dist/live-query-collection-materialization.d.ts +47 -0
- package/dist/live-query-collection-materialization.d.ts.map +1 -0
- package/dist/live-query-collection-materialization.js +231 -0
- package/dist/live-query-collection-materialization.js.map +1 -0
- package/dist/live-query-collection.d.ts +23 -0
- package/dist/live-query-collection.d.ts.map +1 -0
- package/dist/live-query-collection.js +94 -0
- package/dist/live-query-collection.js.map +1 -0
- package/dist/live-query-runtime.d.ts +8 -0
- package/dist/live-query-runtime.d.ts.map +1 -0
- package/dist/live-query-runtime.js +228 -0
- package/dist/live-query-runtime.js.map +1 -0
- package/dist/live-query-state.d.ts +11 -0
- package/dist/live-query-state.d.ts.map +1 -0
- package/dist/live-query-state.js +130 -0
- package/dist/live-query-state.js.map +1 -0
- package/dist/query-builder.d.ts +294 -0
- package/dist/query-builder.d.ts.map +1 -0
- package/dist/query-builder.js +373 -0
- package/dist/query-builder.js.map +1 -0
- package/dist/query-context-identity.d.ts +19 -0
- package/dist/query-context-identity.d.ts.map +1 -0
- package/dist/query-context-identity.js +41 -0
- package/dist/query-context-identity.js.map +1 -0
- package/dist/query-execution-plan.d.ts +27 -0
- package/dist/query-execution-plan.d.ts.map +1 -0
- package/dist/query-execution-plan.js +69 -0
- package/dist/query-execution-plan.js.map +1 -0
- package/dist/query-plan.d.ts +200 -0
- package/dist/query-plan.d.ts.map +1 -0
- package/dist/query-plan.js +524 -0
- package/dist/query-plan.js.map +1 -0
- package/dist/query-source-adapter.d.ts +25 -0
- package/dist/query-source-adapter.d.ts.map +1 -0
- package/dist/query-source-adapter.js +14 -0
- package/dist/query-source-adapter.js.map +1 -0
- package/dist/runtime-collection-store.d.ts +38 -0
- package/dist/runtime-collection-store.d.ts.map +1 -0
- package/dist/runtime-collection-store.js +149 -0
- package/dist/runtime-collection-store.js.map +1 -0
- package/dist/server-collection.d.ts +84 -0
- package/dist/server-collection.d.ts.map +1 -0
- package/dist/server-collection.js +84 -0
- package/dist/server-collection.js.map +1 -0
- package/dist/sqlite-persistence.d.ts +239 -0
- package/dist/sqlite-persistence.d.ts.map +1 -0
- package/dist/sqlite-persistence.js +345 -0
- package/dist/sqlite-persistence.js.map +1 -0
- package/dist/sync-adapter.d.ts +233 -0
- package/dist/sync-adapter.d.ts.map +1 -0
- package/dist/sync-adapter.js +226 -0
- package/dist/sync-adapter.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { currentOrDefaultRuntime, ResourceStore, } from "@sunfall/arc-core";
|
|
2
|
+
import { Effect, Option, PubSub, Scope } from "effect";
|
|
3
|
+
import { CollectionStoreTypeId } from "./collection-ids.js";
|
|
4
|
+
import { bumpCollectionState, makeCollectionState, } from "./collection-state.js";
|
|
5
|
+
import { ingestCollectionOutputRowsSync } from "./collection-row-ingress.js";
|
|
6
|
+
const initialDataPath = (definition) => `$.collections[${definition.name}].initialData`;
|
|
7
|
+
const stateForDefinition = (state) => state;
|
|
8
|
+
const initializeCollectionState = (definition, state) => {
|
|
9
|
+
if (state.initialized) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
state.initialized = true;
|
|
13
|
+
const initialData = definition.options.initialData ?? [];
|
|
14
|
+
if (initialData.length === 0) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const rows = ingestCollectionOutputRowsSync(definition, initialData, {
|
|
19
|
+
operation: "load",
|
|
20
|
+
path: initialDataPath(definition),
|
|
21
|
+
synced: true,
|
|
22
|
+
origin: "remote",
|
|
23
|
+
});
|
|
24
|
+
for (const row of rows) {
|
|
25
|
+
state.rows.set(row.key, row);
|
|
26
|
+
}
|
|
27
|
+
state.initialDataError = undefined;
|
|
28
|
+
state.loadState.set({ _tag: "Ready", waiting: false, updatedAt: Date.now() });
|
|
29
|
+
bumpCollectionState(state);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
state.rows.clear();
|
|
33
|
+
state.initialDataError = error;
|
|
34
|
+
state.loadState.set({
|
|
35
|
+
_tag: "Failure",
|
|
36
|
+
waiting: false,
|
|
37
|
+
error: state.initialDataError,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Runtime/request-local owner of collection state, diagnostics, and lifecycle
|
|
43
|
+
* events.
|
|
44
|
+
*
|
|
45
|
+
* The store is keyed through the active Resource Store's module registry, so
|
|
46
|
+
* SSR requests, client runtimes, and tests get isolated collection rows,
|
|
47
|
+
* pending mutation queues, and event streams.
|
|
48
|
+
*/
|
|
49
|
+
export class RuntimeCollectionStore {
|
|
50
|
+
[CollectionStoreTypeId] = CollectionStoreTypeId;
|
|
51
|
+
#states = new WeakMap();
|
|
52
|
+
#definitions = new Set();
|
|
53
|
+
#events = Effect.runSync(PubSub.sliding(1024));
|
|
54
|
+
disposeEffect = PubSub.shutdown(this.#events);
|
|
55
|
+
diagnostics = {
|
|
56
|
+
snapshot: () => this.diagnosticsSnapshot(),
|
|
57
|
+
snapshotEffect: Effect.sync(() => this.diagnosticsSnapshot()),
|
|
58
|
+
};
|
|
59
|
+
state(definition) {
|
|
60
|
+
const existing = this.#states.get(definition);
|
|
61
|
+
if (existing) {
|
|
62
|
+
return stateForDefinition(existing);
|
|
63
|
+
}
|
|
64
|
+
const state = makeCollectionState();
|
|
65
|
+
this.#definitions.add(definition);
|
|
66
|
+
this.#states.set(definition, state);
|
|
67
|
+
initializeCollectionState(definition, state);
|
|
68
|
+
return state;
|
|
69
|
+
}
|
|
70
|
+
diagnosticsSnapshot() {
|
|
71
|
+
let rowCount = 0;
|
|
72
|
+
let pendingMutationCount = 0;
|
|
73
|
+
let activeMutationCount = 0;
|
|
74
|
+
let optimisticRowCount = 0;
|
|
75
|
+
let loadingCount = 0;
|
|
76
|
+
let failureCount = 0;
|
|
77
|
+
for (const definition of this.#definitions) {
|
|
78
|
+
const state = this.#states.get(definition);
|
|
79
|
+
if (!state) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
rowCount += state.rows.size;
|
|
83
|
+
pendingMutationCount += state.pendingMutations.size;
|
|
84
|
+
optimisticRowCount += state.optimisticRows.size;
|
|
85
|
+
for (const pending of state.pendingMutations.values()) {
|
|
86
|
+
if (pending.activeAttempt !== undefined) {
|
|
87
|
+
activeMutationCount += 1;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const loadState = state.loadState.get();
|
|
91
|
+
if (loadState.waiting) {
|
|
92
|
+
loadingCount += 1;
|
|
93
|
+
}
|
|
94
|
+
if (loadState._tag === "Failure") {
|
|
95
|
+
failureCount += 1;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
collectionCount: this.#definitions.size,
|
|
100
|
+
rowCount,
|
|
101
|
+
pendingMutationCount,
|
|
102
|
+
activeMutationCount,
|
|
103
|
+
optimisticRowCount,
|
|
104
|
+
loadingCount,
|
|
105
|
+
failureCount,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
publish(event) {
|
|
109
|
+
return PubSub.publish(this.#events, event).pipe(Effect.asVoid);
|
|
110
|
+
}
|
|
111
|
+
subscribeEventsEffect() {
|
|
112
|
+
return PubSub.subscribe(this.#events);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const makeCollectionStore = () => new RuntimeCollectionStore();
|
|
116
|
+
const isRuntimeCollectionStore = (value) => value instanceof RuntimeCollectionStore;
|
|
117
|
+
/** Resolve the Runtime Collection Store attached to a Resource Store. */
|
|
118
|
+
export const storeFor = (resourceStore) => {
|
|
119
|
+
const existing = resourceStore.moduleRegistry.get(CollectionStoreTypeId);
|
|
120
|
+
if (isRuntimeCollectionStore(existing)) {
|
|
121
|
+
return existing;
|
|
122
|
+
}
|
|
123
|
+
const store = makeCollectionStore();
|
|
124
|
+
resourceStore.moduleRegistry.register(CollectionStoreTypeId, store);
|
|
125
|
+
return store;
|
|
126
|
+
};
|
|
127
|
+
export const defaultRuntimeCollectionStore = () => storeFor(currentOrDefaultRuntime().resourceStore);
|
|
128
|
+
const resourceStoreEffect = Effect.gen(function* () {
|
|
129
|
+
const store = yield* Effect.serviceOption(ResourceStore);
|
|
130
|
+
return Option.isSome(store) ? store.value : currentOrDefaultRuntime().resourceStore;
|
|
131
|
+
});
|
|
132
|
+
/** Access the active Runtime Collection Store from inside Effect. */
|
|
133
|
+
export const collectionStoreEffect = Effect.map(resourceStoreEffect, storeFor);
|
|
134
|
+
let currentCollectionStoreOverride;
|
|
135
|
+
/** Access the active Runtime Collection Store from synchronous render/read seams. */
|
|
136
|
+
export const currentCollectionStore = () => currentCollectionStoreOverride ?? defaultRuntimeCollectionStore();
|
|
137
|
+
export const runWithCollectionStore = (store, evaluate) => {
|
|
138
|
+
const previous = currentCollectionStoreOverride;
|
|
139
|
+
currentCollectionStoreOverride = store;
|
|
140
|
+
try {
|
|
141
|
+
return evaluate();
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
currentCollectionStoreOverride = previous;
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
/** Subscribe to active Runtime Collection Store events inside a Scope. */
|
|
148
|
+
export const subscribeCollectionEventsEffect = () => Effect.flatMap(collectionStoreEffect, (store) => store.subscribeEventsEffect());
|
|
149
|
+
//# sourceMappingURL=runtime-collection-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-collection-store.js","sourceRoot":"","sources":["../src/runtime-collection-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { EffectInputCallbackError, type EffectInput, type RejectPromiseLikeValue, type ServerClientError, type ServerFunction } from "@sunfall/arc-core";
|
|
2
|
+
import type { CollectionIndexRecord, CollectionKey, CollectionOptions, CollectionPolicy } from "./collection-contract.js";
|
|
3
|
+
import { type CollectionSyncAdapter, type CollectionSyncDeletePayload, type CollectionSyncInsertPayload, type CollectionSyncUpdatePayload } from "./sync-adapter.js";
|
|
4
|
+
/**
|
|
5
|
+
* Return type accepted from server collection operations.
|
|
6
|
+
*
|
|
7
|
+
* Use Effect-first callbacks or `ServerFunction`s so transport failures remain
|
|
8
|
+
* typed in the collection error channel.
|
|
9
|
+
*/
|
|
10
|
+
export type ServerCollectionResult<A, E = never, R = never> = EffectInput<A & RejectPromiseLikeValue<A>, E, R>;
|
|
11
|
+
/**
|
|
12
|
+
* Server-backed operation used by `serverCollectionSyncAdapter`.
|
|
13
|
+
*
|
|
14
|
+
* A `ServerFunction` is invoked through `.effect(input)`; a plain callback is
|
|
15
|
+
* converted with `toEffect`.
|
|
16
|
+
*/
|
|
17
|
+
export type ServerCollectionOperation<I, A, E = never, R = never> = ServerFunction<I, A, E, R> | ((input: I) => ServerCollectionResult<A, E, R>);
|
|
18
|
+
/** Insert payload accepted by a server-backed collection operation. */
|
|
19
|
+
export type ServerCollectionInsertPayload<A extends object, K extends CollectionKey> = CollectionSyncInsertPayload<A, K>;
|
|
20
|
+
/** Update payload accepted by a server-backed collection operation. */
|
|
21
|
+
export type ServerCollectionUpdatePayload<A extends object, K extends CollectionKey> = CollectionSyncUpdatePayload<A, K>;
|
|
22
|
+
/** Delete payload accepted by a server-backed collection operation. */
|
|
23
|
+
export type ServerCollectionDeletePayload<A extends object, K extends CollectionKey> = CollectionSyncDeletePayload<A, K>;
|
|
24
|
+
type ServerCollectionIdentity = {
|
|
25
|
+
readonly name: string;
|
|
26
|
+
readonly id?: string;
|
|
27
|
+
} | {
|
|
28
|
+
readonly id: string;
|
|
29
|
+
readonly name?: string;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Options for a collection backed by server functions.
|
|
33
|
+
*
|
|
34
|
+
* Provide a stable `name` or `id`; it is used for collection identity, sync
|
|
35
|
+
* diagnostics, and persistence keys. Server client failures are included in the
|
|
36
|
+
* resulting collection error channel.
|
|
37
|
+
*/
|
|
38
|
+
export type ServerCollectionOptions<A extends object, K extends CollectionKey = string, E = never, R = never> = ServerCollectionIdentity & {
|
|
39
|
+
readonly input?: unknown;
|
|
40
|
+
readonly output?: unknown;
|
|
41
|
+
readonly policy?: CollectionPolicy<E | EffectInputCallbackError | ServerClientError>;
|
|
42
|
+
readonly getKey: (value: A) => K;
|
|
43
|
+
readonly indexes?: CollectionIndexRecord<A>;
|
|
44
|
+
readonly initialData?: ReadonlyArray<A>;
|
|
45
|
+
readonly load?: ServerCollectionOperation<void, ReadonlyArray<A>, E, R>;
|
|
46
|
+
readonly refetch?: ServerCollectionOperation<void, ReadonlyArray<A>, E, R>;
|
|
47
|
+
readonly insert?: ServerCollectionOperation<ServerCollectionInsertPayload<A, K>, void, E, R>;
|
|
48
|
+
readonly update?: ServerCollectionOperation<ServerCollectionUpdatePayload<A, K>, void, E, R>;
|
|
49
|
+
readonly delete?: ServerCollectionOperation<ServerCollectionDeletePayload<A, K>, void, E, R>;
|
|
50
|
+
};
|
|
51
|
+
declare const ServerCollectionMissingIdentity_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
52
|
+
readonly _tag: "ServerCollectionMissingIdentity";
|
|
53
|
+
} & Readonly<A>;
|
|
54
|
+
/**
|
|
55
|
+
* Error thrown when server collection options omit both `name` and `id`.
|
|
56
|
+
*/
|
|
57
|
+
export declare class ServerCollectionMissingIdentity extends ServerCollectionMissingIdentity_base<{
|
|
58
|
+
readonly guidance: string;
|
|
59
|
+
}> {
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Build a sync adapter from server functions or Effect callbacks.
|
|
63
|
+
*
|
|
64
|
+
* Use this when you want to compose the adapter manually before passing it to
|
|
65
|
+
* `collectionSyncOptions` or `Collection.syncOptions`.
|
|
66
|
+
*/
|
|
67
|
+
export declare const serverCollectionSyncAdapter: <A extends object, K extends CollectionKey = string, E = never, R = never>(options: ServerCollectionOptions<A, K, E, R>) => CollectionSyncAdapter<A, K, E | EffectInputCallbackError | ServerClientError, R>;
|
|
68
|
+
/**
|
|
69
|
+
* Build `Collection.define` options for a server-backed collection.
|
|
70
|
+
*
|
|
71
|
+
* Load/refetch and mutation operations are converted to Effect, and
|
|
72
|
+
* `ServerClientError` is added to the collection error channel.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* const todos = Collection.define(serverCollectionOptions({
|
|
76
|
+
* name: "todos",
|
|
77
|
+
* getKey: (todo) => todo.id,
|
|
78
|
+
* load: listTodos,
|
|
79
|
+
* update: updateTodos
|
|
80
|
+
* }))
|
|
81
|
+
*/
|
|
82
|
+
export declare const serverCollectionOptions: <A extends object, K extends CollectionKey = string, E = never, R = never>(options: ServerCollectionOptions<A, K, E, R>) => CollectionOptions<A, K, E | EffectInputCallbackError | ServerClientError, R>;
|
|
83
|
+
export {};
|
|
84
|
+
//# sourceMappingURL=server-collection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-collection.d.ts","sourceRoot":"","sources":["../src/server-collection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { EffectInputCallbackError, isServerFunction, invokeEffectInput, } from "@sunfall/arc-core";
|
|
2
|
+
import { Data, Effect } from "effect";
|
|
3
|
+
import { collectionSyncOptions, } from "./sync-adapter.js";
|
|
4
|
+
/**
|
|
5
|
+
* Error thrown when server collection options omit both `name` and `id`.
|
|
6
|
+
*/
|
|
7
|
+
export class ServerCollectionMissingIdentity extends Data.TaggedError("ServerCollectionMissingIdentity") {
|
|
8
|
+
}
|
|
9
|
+
const isServerCollectionFunction = (operation) => isServerFunction(operation);
|
|
10
|
+
const runOperation = (operation, callback, input) => Effect.suspend(() => {
|
|
11
|
+
const current = operation();
|
|
12
|
+
if (isServerCollectionFunction(current)) {
|
|
13
|
+
return invokeEffectInput("Collection.server.operation", () => current.effect(input));
|
|
14
|
+
}
|
|
15
|
+
return invokeEffectInput("Collection.server.operation", callback);
|
|
16
|
+
});
|
|
17
|
+
const serverCollectionName = (options) => {
|
|
18
|
+
const name = options.name ?? options.id;
|
|
19
|
+
if (name === undefined) {
|
|
20
|
+
throw new ServerCollectionMissingIdentity({
|
|
21
|
+
guidance: "Pass a stable name or id so the collection can be keyed, synced, and traced.",
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return name;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Build a sync adapter from server functions or Effect callbacks.
|
|
28
|
+
*
|
|
29
|
+
* Use this when you want to compose the adapter manually before passing it to
|
|
30
|
+
* `collectionSyncOptions` or `Collection.syncOptions`.
|
|
31
|
+
*/
|
|
32
|
+
export const serverCollectionSyncAdapter = (options) => ({
|
|
33
|
+
name: serverCollectionName(options),
|
|
34
|
+
...(options.load === undefined
|
|
35
|
+
? {}
|
|
36
|
+
: {
|
|
37
|
+
load: () => runOperation(() => options.load, () => options.load(undefined), undefined),
|
|
38
|
+
}),
|
|
39
|
+
...(options.refetch === undefined
|
|
40
|
+
? {}
|
|
41
|
+
: {
|
|
42
|
+
refetch: () => runOperation(() => options.refetch, () => options.refetch(undefined), undefined),
|
|
43
|
+
}),
|
|
44
|
+
...(options.insert === undefined
|
|
45
|
+
? {}
|
|
46
|
+
: {
|
|
47
|
+
insert: (payload) => runOperation(() => options.insert, () => options.insert(payload), payload),
|
|
48
|
+
}),
|
|
49
|
+
...(options.update === undefined
|
|
50
|
+
? {}
|
|
51
|
+
: {
|
|
52
|
+
update: (payload) => runOperation(() => options.update, () => options.update(payload), payload),
|
|
53
|
+
}),
|
|
54
|
+
...(options.delete === undefined
|
|
55
|
+
? {}
|
|
56
|
+
: {
|
|
57
|
+
delete: (payload) => runOperation(() => options.delete, () => options.delete(payload), payload),
|
|
58
|
+
}),
|
|
59
|
+
});
|
|
60
|
+
/**
|
|
61
|
+
* Build `Collection.define` options for a server-backed collection.
|
|
62
|
+
*
|
|
63
|
+
* Load/refetch and mutation operations are converted to Effect, and
|
|
64
|
+
* `ServerClientError` is added to the collection error channel.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* const todos = Collection.define(serverCollectionOptions({
|
|
68
|
+
* name: "todos",
|
|
69
|
+
* getKey: (todo) => todo.id,
|
|
70
|
+
* load: listTodos,
|
|
71
|
+
* update: updateTodos
|
|
72
|
+
* }))
|
|
73
|
+
*/
|
|
74
|
+
export const serverCollectionOptions = (options) => collectionSyncOptions({
|
|
75
|
+
name: serverCollectionName(options),
|
|
76
|
+
getKey: options.getKey,
|
|
77
|
+
sync: serverCollectionSyncAdapter(options),
|
|
78
|
+
...(options.input === undefined ? {} : { input: options.input }),
|
|
79
|
+
...(options.output === undefined ? {} : { output: options.output }),
|
|
80
|
+
...(options.policy === undefined ? {} : { policy: options.policy }),
|
|
81
|
+
...(options.indexes === undefined ? {} : { indexes: options.indexes }),
|
|
82
|
+
...(options.initialData === undefined ? {} : { initialData: options.initialData }),
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=server-collection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-collection.js","sourceRoot":"","sources":["../src/server-collection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { EffectInputCallbackError } from "@sunfall/arc-core";
|
|
2
|
+
import type { EffectInput } from "@sunfall/arc-core";
|
|
3
|
+
import type { CollectionPersistenceStorage } from "./collection-contract.js";
|
|
4
|
+
/** Default SQLite table used by collection persistence helpers. */
|
|
5
|
+
export declare const SQLITE_PERSISTENCE_DEFAULT_TABLE = "sunfall_arc_collection_persistence";
|
|
6
|
+
/** Default namespace prefix for persisted collection snapshot rows. */
|
|
7
|
+
export declare const SQLITE_PERSISTENCE_DEFAULT_NAMESPACE = "sunfall-arc:collections";
|
|
8
|
+
/** Default schema version written to collection persistence rows. */
|
|
9
|
+
export declare const SQLITE_PERSISTENCE_DEFAULT_SCHEMA_VERSION = 1;
|
|
10
|
+
/**
|
|
11
|
+
* Namespaced key for one persisted collection snapshot.
|
|
12
|
+
*/
|
|
13
|
+
export interface SQLitePersistenceKey {
|
|
14
|
+
readonly namespace: string;
|
|
15
|
+
readonly key: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Row shape stored by the SQLite persistence driver.
|
|
19
|
+
*/
|
|
20
|
+
export interface SQLitePersistenceRow extends SQLitePersistenceKey {
|
|
21
|
+
readonly schemaVersion: number;
|
|
22
|
+
readonly value: string;
|
|
23
|
+
readonly updatedAt: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Effect-aware table adapter for persistence rows.
|
|
27
|
+
*
|
|
28
|
+
* Implement this directly for custom SQLite clients, or use
|
|
29
|
+
* `makeSQLiteStatementPersistenceDriver` for SQL statement based clients.
|
|
30
|
+
*/
|
|
31
|
+
export interface SQLitePersistenceTable<E = never, R = never> {
|
|
32
|
+
readonly ensure?: () => EffectInput<void, E, R>;
|
|
33
|
+
readonly get: (key: SQLitePersistenceKey) => EffectInput<SQLitePersistenceRow | null, E, R>;
|
|
34
|
+
readonly upsert: (row: SQLitePersistenceRow) => EffectInput<void, E, R>;
|
|
35
|
+
readonly delete?: (key: SQLitePersistenceKey) => EffectInput<void, E, R>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Driver that resolves named persistence tables.
|
|
39
|
+
*/
|
|
40
|
+
export interface SQLitePersistenceDriver<E = never, R = never> {
|
|
41
|
+
readonly table: (name: string) => SQLitePersistenceTable<E, R>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* SQLite parameter value supported by generated persistence SQL.
|
|
45
|
+
*/
|
|
46
|
+
export type SQLiteStatementValue = string | number | null;
|
|
47
|
+
/** Positional parameter list accepted by generated SQLite persistence SQL. */
|
|
48
|
+
export type SQLiteStatementParams = ReadonlyArray<SQLiteStatementValue>;
|
|
49
|
+
/**
|
|
50
|
+
* Row shape returned by generated SELECT statements.
|
|
51
|
+
*/
|
|
52
|
+
export interface SQLiteStatementRow {
|
|
53
|
+
readonly namespace?: unknown;
|
|
54
|
+
readonly key?: unknown;
|
|
55
|
+
readonly schema_version?: unknown;
|
|
56
|
+
readonly schemaVersion?: unknown;
|
|
57
|
+
readonly value?: unknown;
|
|
58
|
+
readonly updated_at?: unknown;
|
|
59
|
+
readonly updatedAt?: unknown;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Minimal SQL statement database used by the SQLite persistence driver.
|
|
63
|
+
*/
|
|
64
|
+
export interface SQLiteStatementDatabase<E = never, R = never> {
|
|
65
|
+
readonly execute: (sql: string, params?: SQLiteStatementParams) => EffectInput<void, E, R>;
|
|
66
|
+
readonly select: (sql: string, params?: SQLiteStatementParams) => EffectInput<ReadonlyArray<SQLiteStatementRow>, E, R>;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Prepared statement shape for clients with `run` and `all` methods.
|
|
70
|
+
*/
|
|
71
|
+
export interface SQLitePreparedStatement<Row extends SQLiteStatementRow = SQLiteStatementRow, E = never, R = never> {
|
|
72
|
+
readonly run: (...params: Array<SQLiteStatementValue>) => EffectInput<void, E, R>;
|
|
73
|
+
readonly all: (...params: Array<SQLiteStatementValue>) => EffectInput<ReadonlyArray<Row>, E, R>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* SQLite client shape for adapters that expose `prepare`.
|
|
77
|
+
*/
|
|
78
|
+
export interface SQLitePreparedStatementDatabase<Row extends SQLiteStatementRow = SQLiteStatementRow, E = never, R = never> {
|
|
79
|
+
readonly prepare: (sql: string) => EffectInput<SQLitePreparedStatement<Row, E, R>, E, R>;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Options for the prepared-statement adapter.
|
|
83
|
+
*/
|
|
84
|
+
export interface SQLitePreparedStatementDatabaseOptions {
|
|
85
|
+
readonly cache?: boolean;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* SQL statement recorded by the in-memory statement database.
|
|
89
|
+
*/
|
|
90
|
+
export interface SQLiteMemoryStatement {
|
|
91
|
+
readonly sql: string;
|
|
92
|
+
readonly params?: SQLiteStatementParams;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* In-memory implementation of the generated persistence SQL.
|
|
96
|
+
*
|
|
97
|
+
* Useful for tests and examples. It records statements and supports only the
|
|
98
|
+
* SQL generated by `makeSQLiteStatementPersistenceDriver`.
|
|
99
|
+
*/
|
|
100
|
+
export interface SQLiteMemoryStatementDatabase extends SQLiteStatementDatabase<never, never> {
|
|
101
|
+
readonly statements: ReadonlyArray<SQLiteMemoryStatement>;
|
|
102
|
+
row(table: string, namespace: string, key: string): SQLitePersistenceRow | undefined;
|
|
103
|
+
tableRows(table: string): ReadonlyArray<SQLitePersistenceRow>;
|
|
104
|
+
clear(): void;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Options for collection persistence stored in SQLite.
|
|
108
|
+
*/
|
|
109
|
+
export interface SQLitePersistenceOptions {
|
|
110
|
+
readonly namespace?: string;
|
|
111
|
+
readonly tableName?: string;
|
|
112
|
+
readonly schemaVersion?: number;
|
|
113
|
+
readonly now?: () => number;
|
|
114
|
+
}
|
|
115
|
+
declare const SQLitePersistenceInvalidTableName_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
116
|
+
readonly _tag: "SQLitePersistenceInvalidTableName";
|
|
117
|
+
} & Readonly<A>;
|
|
118
|
+
/**
|
|
119
|
+
* Error raised before generating SQL for an invalid table name.
|
|
120
|
+
*/
|
|
121
|
+
export declare class SQLitePersistenceInvalidTableName extends SQLitePersistenceInvalidTableName_base<{
|
|
122
|
+
readonly tableName: string;
|
|
123
|
+
readonly reason: "Empty" | "ContainsNul";
|
|
124
|
+
readonly guidance: string;
|
|
125
|
+
}> {
|
|
126
|
+
}
|
|
127
|
+
declare const SQLitePersistenceUnsupportedStatement_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
128
|
+
readonly _tag: "SQLitePersistenceUnsupportedStatement";
|
|
129
|
+
} & Readonly<A>;
|
|
130
|
+
/**
|
|
131
|
+
* Error raised by the in-memory adapter for SQL outside the generated subset.
|
|
132
|
+
*/
|
|
133
|
+
export declare class SQLitePersistenceUnsupportedStatement extends SQLitePersistenceUnsupportedStatement_base<{
|
|
134
|
+
readonly sql: string;
|
|
135
|
+
readonly operation: "tableName" | "execute" | "select";
|
|
136
|
+
readonly guidance: string;
|
|
137
|
+
}> {
|
|
138
|
+
}
|
|
139
|
+
declare const SQLitePersistenceInvalidRow_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
140
|
+
readonly _tag: "SQLitePersistenceInvalidRow";
|
|
141
|
+
} & Readonly<A>;
|
|
142
|
+
/** Error raised when a SQLite statement row does not match the persistence row contract. */
|
|
143
|
+
export declare class SQLitePersistenceInvalidRow extends SQLitePersistenceInvalidRow_base<{
|
|
144
|
+
readonly field: "namespace" | "key" | "schema_version" | "value" | "updated_at";
|
|
145
|
+
readonly value: unknown;
|
|
146
|
+
readonly expected: "string" | "finite-number";
|
|
147
|
+
readonly guidance: string;
|
|
148
|
+
}> {
|
|
149
|
+
}
|
|
150
|
+
declare const SQLitePersistenceInvalidStatementParams_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
151
|
+
readonly _tag: "SQLitePersistenceInvalidStatementParams";
|
|
152
|
+
} & Readonly<A>;
|
|
153
|
+
/** Error raised when generated in-memory SQLite statements receive malformed params. */
|
|
154
|
+
export declare class SQLitePersistenceInvalidStatementParams extends SQLitePersistenceInvalidStatementParams_base<{
|
|
155
|
+
readonly operation: "insert" | "select" | "delete";
|
|
156
|
+
readonly field: "params" | "namespace" | "key" | "schema_version" | "value" | "updated_at";
|
|
157
|
+
readonly value: unknown;
|
|
158
|
+
readonly expected: "exact-param-count" | "string" | "finite-number";
|
|
159
|
+
readonly expectedCount?: number;
|
|
160
|
+
readonly actualCount?: number;
|
|
161
|
+
readonly guidance: string;
|
|
162
|
+
}> {
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Create an in-memory statement database that understands generated SQL.
|
|
166
|
+
*
|
|
167
|
+
* Use for tests or demos that need SQLite persistence behavior without a real
|
|
168
|
+
* SQLite runtime.
|
|
169
|
+
*/
|
|
170
|
+
export declare const makeSQLiteMemoryStatementDatabase: () => SQLiteMemoryStatementDatabase;
|
|
171
|
+
/**
|
|
172
|
+
* Adapt a `prepare`/`run`/`all` SQLite client to the statement database shape.
|
|
173
|
+
*
|
|
174
|
+
* Enable `cache` to reuse prepared statements by SQL string.
|
|
175
|
+
*/
|
|
176
|
+
export declare const makeSQLitePreparedStatementDatabase: <Row extends SQLiteStatementRow = SQLiteStatementRow, E = never, R = never>(database: SQLitePreparedStatementDatabase<Row, E, R>, options?: SQLitePreparedStatementDatabaseOptions) => SQLiteStatementDatabase<E | EffectInputCallbackError, R>;
|
|
177
|
+
/**
|
|
178
|
+
* Build a persistence driver from a simple SQL statement database.
|
|
179
|
+
*
|
|
180
|
+
* The driver creates the table if needed, stores snapshots by namespace/key,
|
|
181
|
+
* and quotes table names defensively.
|
|
182
|
+
*/
|
|
183
|
+
export declare const makeSQLiteStatementPersistenceDriver: <E = never, R = never>(database: SQLiteStatementDatabase<E, R>) => SQLitePersistenceDriver<E | EffectInputCallbackError | SQLitePersistenceInvalidRow, R>;
|
|
184
|
+
/**
|
|
185
|
+
* Create `CollectionPersistenceStorage` backed by SQLite.
|
|
186
|
+
*
|
|
187
|
+
* Schema-version mismatches read as `null`, letting callers fall back to a
|
|
188
|
+
* fresh load. Database errors and services flow through the returned storage
|
|
189
|
+
* error and requirement channels.
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* const storage = makeSQLitePersistenceStorage(
|
|
193
|
+
* makeSQLiteStatementPersistenceDriver(database)
|
|
194
|
+
* )
|
|
195
|
+
*/
|
|
196
|
+
export declare const makeSQLitePersistenceStorage: <E = never, R = never>(driver: SQLitePersistenceDriver<E, R>, options?: SQLitePersistenceOptions) => CollectionPersistenceStorage<E | EffectInputCallbackError | SQLitePersistenceInvalidRow | SQLitePersistenceInvalidTableName, R>;
|
|
197
|
+
/**
|
|
198
|
+
* SQLite persistence namespace for collection snapshot storage helpers.
|
|
199
|
+
*/
|
|
200
|
+
export declare namespace SQLitePersistence {
|
|
201
|
+
/** Namespaced row key for one persisted collection snapshot. */
|
|
202
|
+
type Key = SQLitePersistenceKey;
|
|
203
|
+
/** Persisted SQLite row shape used by the collection persistence driver. */
|
|
204
|
+
type Row = SQLitePersistenceRow;
|
|
205
|
+
/** Effect-aware table Adapter for persistence rows. */
|
|
206
|
+
type Table<E = never, R = never> = SQLitePersistenceTable<E, R>;
|
|
207
|
+
/** Adapter that resolves named persistence tables. */
|
|
208
|
+
type Driver<E = never, R = never> = SQLitePersistenceDriver<E, R>;
|
|
209
|
+
/** SQL statement recorded by the in-memory statement database. */
|
|
210
|
+
type MemoryStatement = SQLiteMemoryStatement;
|
|
211
|
+
/** In-memory statement database for tests and demos. */
|
|
212
|
+
type MemoryStatementDatabase = SQLiteMemoryStatementDatabase;
|
|
213
|
+
/** Prepared statement shape for SQLite clients with `run` and `all`. */
|
|
214
|
+
type PreparedStatement<Row extends SQLiteStatementRow = SQLiteStatementRow, E = never, R = never> = SQLitePreparedStatement<Row, E, R>;
|
|
215
|
+
/** SQLite client shape for adapters that expose `prepare`. */
|
|
216
|
+
type PreparedStatementDatabase<Row extends SQLiteStatementRow = SQLiteStatementRow, E = never, R = never> = SQLitePreparedStatementDatabase<Row, E, R>;
|
|
217
|
+
/** Options for prepared-statement database adaptation. */
|
|
218
|
+
type PreparedStatementDatabaseOptions = SQLitePreparedStatementDatabaseOptions;
|
|
219
|
+
/** SQLite statement parameter value supported by generated SQL. */
|
|
220
|
+
type StatementValue = SQLiteStatementValue;
|
|
221
|
+
/** Positional SQLite statement parameter list. */
|
|
222
|
+
type StatementParams = SQLiteStatementParams;
|
|
223
|
+
/** Row shape returned by generated SELECT statements. */
|
|
224
|
+
type StatementRow = SQLiteStatementRow;
|
|
225
|
+
/** Minimal SQL statement database used by the persistence driver. */
|
|
226
|
+
type StatementDatabase<E = never, R = never> = SQLiteStatementDatabase<E, R>;
|
|
227
|
+
/** Options for collection persistence stored in SQLite. */
|
|
228
|
+
type Options = SQLitePersistenceOptions;
|
|
229
|
+
/** Create `CollectionPersistenceStorage` backed by SQLite. */
|
|
230
|
+
const storage: <E = never, R = never>(driver: SQLitePersistenceDriver<E, R>, options?: SQLitePersistenceOptions) => CollectionPersistenceStorage<E | EffectInputCallbackError | SQLitePersistenceInvalidRow | SQLitePersistenceInvalidTableName, R>;
|
|
231
|
+
/** Adapt a `prepare`/`run`/`all` SQLite client to a statement database. */
|
|
232
|
+
const preparedStatementDatabase: <Row extends SQLiteStatementRow = SQLiteStatementRow, E = never, R = never>(database: SQLitePreparedStatementDatabase<Row, E, R>, options?: SQLitePreparedStatementDatabaseOptions) => SQLiteStatementDatabase<E | EffectInputCallbackError, R>;
|
|
233
|
+
/** Build a persistence driver from a simple SQL statement database. */
|
|
234
|
+
const statementDriver: <E = never, R = never>(database: SQLiteStatementDatabase<E, R>) => SQLitePersistenceDriver<E | EffectInputCallbackError | SQLitePersistenceInvalidRow, R>;
|
|
235
|
+
/** Create an in-memory statement database for tests and demos. */
|
|
236
|
+
const memoryStatementDatabase: () => SQLiteMemoryStatementDatabase;
|
|
237
|
+
}
|
|
238
|
+
export {};
|
|
239
|
+
//# sourceMappingURL=sqlite-persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-persistence.d.ts","sourceRoot":"","sources":["../src/sqlite-persistence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAqB,MAAM,mBAAmB,CAAC;AAChF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AAE7E,mEAAmE;AACnE,eAAO,MAAM,gCAAgC,uCAAuC,CAAC;AACrF,uEAAuE;AACvE,eAAO,MAAM,oCAAoC,4BAA4B,CAAC;AAC9E,qEAAqE;AACrE,eAAO,MAAM,yCAAyC,IAAI,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB;IAChE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,WAAW,CAAC,oBAAoB,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5F,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CAC1E;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK;IAC3D,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAChE;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAE1D,8EAA8E;AAC9E,MAAM,MAAM,qBAAqB,GAAG,aAAa,CAAC,oBAAoB,CAAC,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK;IAC3D,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,qBAAqB,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3F,QAAQ,CAAC,MAAM,EAAE,CACf,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,qBAAqB,KAC3B,WAAW,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CAC3D;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB,CACtC,GAAG,SAAS,kBAAkB,GAAG,kBAAkB,EACnD,CAAC,GAAG,KAAK,EACT,CAAC,GAAG,KAAK;IAET,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,oBAAoB,CAAC,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAClF,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,oBAAoB,CAAC,KAAK,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CACjG;AAED;;GAEG;AACH,MAAM,WAAW,+BAA+B,CAC9C,GAAG,SAAS,kBAAkB,GAAG,kBAAkB,EACnD,CAAC,GAAG,KAAK,EACT,CAAC,GAAG,KAAK;IAET,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,WAAW,CAAC,uBAAuB,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CAC1F;AAED;;GAEG;AACH,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC;CACzC;AAED;;;;;GAKG;AACH,MAAM,WAAW,6BAA8B,SAAQ,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC;IAC1F,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,qBAAqB,CAAC,CAAC;IAC1D,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAAC;IACrF,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAC9D,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;;;;AAED;;GAEG;AACH,qBAAa,iCAAkC,SAAQ,uCAErD;IACA,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;CAAG;;;;AAEL;;GAEG;AACH,qBAAa,qCAAsC,SAAQ,2CAEzD;IACA,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IACvD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;CAAG;;;;AAEL,4FAA4F;AAC5F,qBAAa,2BAA4B,SAAQ,iCAAgD;IAC/F,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,GAAG,gBAAgB,GAAG,OAAO,GAAG,YAAY,CAAC;IAChF,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;CAAG;;;;AAEL,wFAAwF;AACxF,qBAAa,uCAAwC,SAAQ,6CAE3D;IACA,QAAQ,CAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACnD,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,WAAW,GAAG,KAAK,GAAG,gBAAgB,GAAG,OAAO,GAAG,YAAY,CAAC;IAC3F,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,GAAG,QAAQ,GAAG,eAAe,CAAC;IACpE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;CAAG;AA+IL;;;;;GAKG;AACH,eAAO,MAAM,iCAAiC,QAAO,6BA8FpD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mCAAmC,GAC9C,GAAG,SAAS,kBAAkB,GAAG,kBAAkB,EACnD,CAAC,GAAG,KAAK,EACT,CAAC,GAAG,KAAK,YAEC,+BAA+B,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,YAC3C,sCAAsC,KAC9C,uBAAuB,CAAC,CAAC,GAAG,wBAAwB,EAAE,CAAC,CA+BzD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oCAAoC,GAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,YAC7D,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,KACtC,uBAAuB,CAAC,CAAC,GAAG,wBAAwB,GAAG,2BAA2B,EAAE,CAAC,CA+DtF,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,4BAA4B,GAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,UACvD,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,YAC5B,wBAAwB,KAChC,4BAA4B,CAC7B,CAAC,GAAG,wBAAwB,GAAG,2BAA2B,GAAG,iCAAiC,EAC9F,CAAC,CA+FF,CAAC;AAEF;;GAEG;AACH,yBAAiB,iBAAiB,CAAC;IACjC,gEAAgE;IAChE,KAAY,GAAG,GAAG,oBAAoB,CAAC;IACvC,4EAA4E;IAC5E,KAAY,GAAG,GAAG,oBAAoB,CAAC;IACvC,uDAAuD;IACvD,KAAY,KAAK,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,IAAI,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvE,sDAAsD;IACtD,KAAY,MAAM,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,IAAI,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzE,kEAAkE;IAClE,KAAY,eAAe,GAAG,qBAAqB,CAAC;IACpD,wDAAwD;IACxD,KAAY,uBAAuB,GAAG,6BAA6B,CAAC;IACpE,wEAAwE;IACxE,KAAY,iBAAiB,CAC3B,GAAG,SAAS,kBAAkB,GAAG,kBAAkB,EACnD,CAAC,GAAG,KAAK,EACT,CAAC,GAAG,KAAK,IACP,uBAAuB,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACvC,8DAA8D;IAC9D,KAAY,yBAAyB,CACnC,GAAG,SAAS,kBAAkB,GAAG,kBAAkB,EACnD,CAAC,GAAG,KAAK,EACT,CAAC,GAAG,KAAK,IACP,+BAA+B,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,0DAA0D;IAC1D,KAAY,gCAAgC,GAAG,sCAAsC,CAAC;IACtF,mEAAmE;IACnE,KAAY,cAAc,GAAG,oBAAoB,CAAC;IAClD,kDAAkD;IAClD,KAAY,eAAe,GAAG,qBAAqB,CAAC;IACpD,yDAAyD;IACzD,KAAY,YAAY,GAAG,kBAAkB,CAAC;IAC9C,qEAAqE;IACrE,KAAY,iBAAiB,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,IAAI,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpF,2DAA2D;IAC3D,KAAY,OAAO,GAAG,wBAAwB,CAAC;IAE/C,8DAA8D;IACvD,MAAM,OAAO,GAhJuB,CAAC,UAAU,CAAC,kBAC/C,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,YAC5B,wBAAwB,KAChC,4BAA4B,CAC7B,CAAC,GAAG,wBAAwB,GAAG,2BAA2B,GAAG,iCAAiC,EAC9F,CAAC,CA2IkD,CAAC;IACpD,2EAA2E;IACpE,MAAM,yBAAyB,GA9QtC,GAAG,SAAS,kBAAkB,uBAC9B,CAAC,UACD,CAAC,oBAES,+BAA+B,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,YAC3C,sCAAsC,KAC9C,uBAAuB,CAAC,CAAC,GAAG,wBAAwB,EAAE,CAAC,CAwQoB,CAAC;IAC7E,uEAAuE;IAChE,MAAM,eAAe,GAnOuB,CAAC,UAAU,CAAC,oBACrD,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,KACtC,uBAAuB,CAAC,CAAC,GAAG,wBAAwB,GAAG,2BAA2B,EAAE,CAAC,CAiOnB,CAAC;IACpE,kEAAkE;IAC3D,MAAM,uBAAuB,QAxXe,6BAwXqB,CAAC;CAC1E"}
|